yaxa-svelte 2.3.0 → 2.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.
package/README.md CHANGED
@@ -300,22 +300,67 @@ export const GET = createApiDocsHandler({
300
300
 
301
301
  ---
302
302
 
303
+ ## ⏱️ Embedded Background Workflows & Persistent Job Queue
304
+
305
+ Persistent, zero-infrastructure background task processing backed by your existing Drizzle database (Postgres or SQLite/Turso). Features atomic row leasing, exponential retry backoff with jitter, Dead-Letter Queue (DLQ), and dual execution models (Serverless Cron or long-running worker):
306
+
307
+ ```ts
308
+ import { enqueueJob, defineWorker, createJobRunner, eventBus } from 'yaxa-svelte/server';
309
+
310
+ // 1. Decoupled domain events
311
+ eventBus.on('user.created', async ({ userId, email }) => {
312
+ // 2. Enqueue background job (optionally pass active transaction { tx } for transactional outbox)
313
+ await enqueueJob(
314
+ 'send-welcome-email',
315
+ { userId, email },
316
+ {
317
+ delay: '5m', // '30s', '5m', '2h', or ms
318
+ priority: 10,
319
+ maxAttempts: 5
320
+ }
321
+ );
322
+ });
323
+
324
+ // 3. Define worker
325
+ const emailWorker = defineWorker({
326
+ name: 'send-welcome-email',
327
+ handler: async (payload, { attempt, log }) => {
328
+ log(`Sending welcome email (attempt ${attempt})`);
329
+ await sendEmail(payload.email);
330
+ }
331
+ });
332
+
333
+ // 4. Run in Serverless Cron (Vercel Cron) or background container
334
+ export const runner = createJobRunner({
335
+ workers: [emailWorker],
336
+ batchSize: 10
337
+ });
338
+
339
+ // In src/routes/api/cron/jobs/+server.ts:
340
+ export const GET = async () => {
341
+ const result = await runner.processNextBatch();
342
+ return Response.json(result);
343
+ };
344
+ ```
345
+
346
+ ---
347
+
303
348
  ## 📦 Subpath Exports Architecture
304
349
 
305
- | Subpath | Description |
306
- | :---------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- |
307
- | `yaxa-svelte` | Core UI Primitives, SEO Components, `<Gate />`, Theme System & Composables (`useGate`, `useUpload`, `useToast`, `useClipboard`, etc.) |
308
- | `yaxa-svelte/admin` | Drizzle ORM Schema Introspection, `<AdminDashboard />`, `createYaxaAdminHook`, `createDrizzleAdmin`, `<DevSandbox />`, `<RecordDrawer />` |
309
- | `yaxa-svelte/server` | `yaxaEndpoint` Pipeline, Declarative Guards, OpenAPI 3.1 & Scalar/Swagger Docs, RFC 7807, Universal Server Hooks, SEO endpoints, Drizzle DB, Storage & Email |
310
- | `yaxa-svelte/auth` | Better-Auth client & server integration (`useAuth`, `<AuthCard />`, `<PasskeyUI />`, `<TwoFactorModal />`, `createYaxaAuth`) |
311
- | `yaxa-svelte/db` | Multi-dialect Drizzle ORM clients & schemas for Neon (PostgreSQL) and Turso (SQLite/LibSQL) |
312
- | `yaxa-svelte/polar` | Polar.sh billing, customer portal sessions, and webhook synchronization |
313
- | `yaxa-svelte/email` | Resend transactional email templates with automatic development console fallback |
314
- | `yaxa-svelte/storage` | AWS S3 and Cloudflare R2 presigned upload URL generators |
315
- | `yaxa-svelte/testing` | Test mocks & utilities (`createMockSiteConfig`, `createMockUser`, `createTestWrapperProps`) |
316
- | `yaxa-svelte/vite` | Turnkey Vite plugin (`yaxa()`) |
317
- | `yaxa-svelte/yaxa.css` | Standalone turnkey Tailwind CSS v4 stylesheet with base styling, `@theme`, and scrollbars |
318
- | `yaxa-svelte/theme.css` | Pure Tailwind CSS v4 design tokens, `:root` variables, and harmonic radius scale without `@import 'tailwindcss'` |
350
+ | Subpath | Description |
351
+ | :---------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
352
+ | `yaxa-svelte` | Core UI Primitives, SEO Components, `<Gate />`, Theme System & Composables (`useGate`, `useUpload`, `useToast`, `useClipboard`, etc.) |
353
+ | `yaxa-svelte/admin` | Drizzle ORM Schema Introspection, `<AdminDashboard />`, `createYaxaAdminHook`, `createDrizzleAdmin`, `<DevSandbox />`, `<RecordDrawer />` |
354
+ | `yaxa-svelte/server` | `yaxaEndpoint` Pipeline, Declarative Guards, OpenAPI 3.1 & Scalar Docs, RFC 7807, Background Jobs (`enqueueJob`, `createJobRunner`), `eventBus`, Server Hooks, Drizzle DB, Storage & Email |
355
+ | `yaxa-svelte/auth` | Better-Auth client & server integration (`useAuth`, `<AuthCard />`, `<PasskeyUI />`, `<TwoFactorModal />`, `createYaxaAuth`) |
356
+ | `yaxa-svelte/db` | Multi-dialect Drizzle ORM clients & schemas for Neon (PostgreSQL) and Turso (SQLite/LibSQL) |
357
+ | `yaxa-svelte/polar` | Polar.sh billing, customer portal sessions, and webhook synchronization |
358
+ | `yaxa-svelte/email` | Resend transactional email templates with automatic development console fallback |
359
+ | `yaxa-svelte/storage` | AWS S3 and Cloudflare R2 presigned upload URL generators |
360
+ | `yaxa-svelte/testing` | Test mocks & utilities (`createMockSiteConfig`, `createMockUser`, `createTestWrapperProps`) |
361
+ | `yaxa-svelte/vite` | Turnkey Vite plugin (`yaxa()`) |
362
+ | `yaxa-svelte/yaxa.css` | Standalone turnkey Tailwind CSS v4 stylesheet with base styling, `@theme`, and scrollbars |
363
+ | `yaxa-svelte/theme.css` | Pure Tailwind CSS v4 design tokens, `:root` variables, and harmonic radius scale without `@import 'tailwindcss'` |
319
364
 
320
365
  ---
321
366
 
@@ -1639,3 +1639,265 @@ export declare const subscription: import("drizzle-orm/pg-core").PgTableWithColu
1639
1639
  };
1640
1640
  dialect: "pg";
1641
1641
  }>;
1642
+ export declare const job: import("drizzle-orm/pg-core").PgTableWithColumns<{
1643
+ name: "yaxa_job";
1644
+ schema: undefined;
1645
+ columns: {
1646
+ id: import("drizzle-orm/pg-core").PgColumn<{
1647
+ name: "id";
1648
+ tableName: "yaxa_job";
1649
+ dataType: "string";
1650
+ columnType: "PgText";
1651
+ data: string;
1652
+ driverParam: string;
1653
+ notNull: true;
1654
+ hasDefault: false;
1655
+ isPrimaryKey: true;
1656
+ isAutoincrement: false;
1657
+ hasRuntimeDefault: false;
1658
+ enumValues: [string, ...string[]];
1659
+ baseColumn: never;
1660
+ identity: undefined;
1661
+ generated: undefined;
1662
+ }, {}, {}>;
1663
+ queue: import("drizzle-orm/pg-core").PgColumn<{
1664
+ name: "queue";
1665
+ tableName: "yaxa_job";
1666
+ dataType: "string";
1667
+ columnType: "PgText";
1668
+ data: string;
1669
+ driverParam: string;
1670
+ notNull: true;
1671
+ hasDefault: true;
1672
+ isPrimaryKey: false;
1673
+ isAutoincrement: false;
1674
+ hasRuntimeDefault: false;
1675
+ enumValues: [string, ...string[]];
1676
+ baseColumn: never;
1677
+ identity: undefined;
1678
+ generated: undefined;
1679
+ }, {}, {}>;
1680
+ name: import("drizzle-orm/pg-core").PgColumn<{
1681
+ name: "name";
1682
+ tableName: "yaxa_job";
1683
+ dataType: "string";
1684
+ columnType: "PgText";
1685
+ data: string;
1686
+ driverParam: string;
1687
+ notNull: true;
1688
+ hasDefault: false;
1689
+ isPrimaryKey: false;
1690
+ isAutoincrement: false;
1691
+ hasRuntimeDefault: false;
1692
+ enumValues: [string, ...string[]];
1693
+ baseColumn: never;
1694
+ identity: undefined;
1695
+ generated: undefined;
1696
+ }, {}, {}>;
1697
+ payload: import("drizzle-orm/pg-core").PgColumn<{
1698
+ name: "payload";
1699
+ tableName: "yaxa_job";
1700
+ dataType: "string";
1701
+ columnType: "PgText";
1702
+ data: string;
1703
+ driverParam: string;
1704
+ notNull: true;
1705
+ hasDefault: false;
1706
+ isPrimaryKey: false;
1707
+ isAutoincrement: false;
1708
+ hasRuntimeDefault: false;
1709
+ enumValues: [string, ...string[]];
1710
+ baseColumn: never;
1711
+ identity: undefined;
1712
+ generated: undefined;
1713
+ }, {}, {}>;
1714
+ status: import("drizzle-orm/pg-core").PgColumn<{
1715
+ name: "status";
1716
+ tableName: "yaxa_job";
1717
+ dataType: "string";
1718
+ columnType: "PgText";
1719
+ data: string;
1720
+ driverParam: string;
1721
+ notNull: true;
1722
+ hasDefault: true;
1723
+ isPrimaryKey: false;
1724
+ isAutoincrement: false;
1725
+ hasRuntimeDefault: false;
1726
+ enumValues: [string, ...string[]];
1727
+ baseColumn: never;
1728
+ identity: undefined;
1729
+ generated: undefined;
1730
+ }, {}, {}>;
1731
+ priority: import("drizzle-orm/pg-core").PgColumn<{
1732
+ name: "priority";
1733
+ tableName: "yaxa_job";
1734
+ dataType: "number";
1735
+ columnType: "PgInteger";
1736
+ data: number;
1737
+ driverParam: string | number;
1738
+ notNull: true;
1739
+ hasDefault: true;
1740
+ isPrimaryKey: false;
1741
+ isAutoincrement: false;
1742
+ hasRuntimeDefault: false;
1743
+ enumValues: undefined;
1744
+ baseColumn: never;
1745
+ identity: undefined;
1746
+ generated: undefined;
1747
+ }, {}, {}>;
1748
+ attempts: import("drizzle-orm/pg-core").PgColumn<{
1749
+ name: "attempts";
1750
+ tableName: "yaxa_job";
1751
+ dataType: "number";
1752
+ columnType: "PgInteger";
1753
+ data: number;
1754
+ driverParam: string | number;
1755
+ notNull: true;
1756
+ hasDefault: true;
1757
+ isPrimaryKey: false;
1758
+ isAutoincrement: false;
1759
+ hasRuntimeDefault: false;
1760
+ enumValues: undefined;
1761
+ baseColumn: never;
1762
+ identity: undefined;
1763
+ generated: undefined;
1764
+ }, {}, {}>;
1765
+ maxAttempts: import("drizzle-orm/pg-core").PgColumn<{
1766
+ name: "max_attempts";
1767
+ tableName: "yaxa_job";
1768
+ dataType: "number";
1769
+ columnType: "PgInteger";
1770
+ data: number;
1771
+ driverParam: string | number;
1772
+ notNull: true;
1773
+ hasDefault: true;
1774
+ isPrimaryKey: false;
1775
+ isAutoincrement: false;
1776
+ hasRuntimeDefault: false;
1777
+ enumValues: undefined;
1778
+ baseColumn: never;
1779
+ identity: undefined;
1780
+ generated: undefined;
1781
+ }, {}, {}>;
1782
+ runAt: import("drizzle-orm/pg-core").PgColumn<{
1783
+ name: "run_at";
1784
+ tableName: "yaxa_job";
1785
+ dataType: "date";
1786
+ columnType: "PgTimestamp";
1787
+ data: Date;
1788
+ driverParam: string;
1789
+ notNull: true;
1790
+ hasDefault: false;
1791
+ isPrimaryKey: false;
1792
+ isAutoincrement: false;
1793
+ hasRuntimeDefault: false;
1794
+ enumValues: undefined;
1795
+ baseColumn: never;
1796
+ identity: undefined;
1797
+ generated: undefined;
1798
+ }, {}, {}>;
1799
+ lockedAt: import("drizzle-orm/pg-core").PgColumn<{
1800
+ name: "locked_at";
1801
+ tableName: "yaxa_job";
1802
+ dataType: "date";
1803
+ columnType: "PgTimestamp";
1804
+ data: Date;
1805
+ driverParam: string;
1806
+ notNull: false;
1807
+ hasDefault: false;
1808
+ isPrimaryKey: false;
1809
+ isAutoincrement: false;
1810
+ hasRuntimeDefault: false;
1811
+ enumValues: undefined;
1812
+ baseColumn: never;
1813
+ identity: undefined;
1814
+ generated: undefined;
1815
+ }, {}, {}>;
1816
+ lockedBy: import("drizzle-orm/pg-core").PgColumn<{
1817
+ name: "locked_by";
1818
+ tableName: "yaxa_job";
1819
+ dataType: "string";
1820
+ columnType: "PgText";
1821
+ data: string;
1822
+ driverParam: string;
1823
+ notNull: false;
1824
+ hasDefault: false;
1825
+ isPrimaryKey: false;
1826
+ isAutoincrement: false;
1827
+ hasRuntimeDefault: false;
1828
+ enumValues: [string, ...string[]];
1829
+ baseColumn: never;
1830
+ identity: undefined;
1831
+ generated: undefined;
1832
+ }, {}, {}>;
1833
+ failedReason: import("drizzle-orm/pg-core").PgColumn<{
1834
+ name: "failed_reason";
1835
+ tableName: "yaxa_job";
1836
+ dataType: "string";
1837
+ columnType: "PgText";
1838
+ data: string;
1839
+ driverParam: string;
1840
+ notNull: false;
1841
+ hasDefault: false;
1842
+ isPrimaryKey: false;
1843
+ isAutoincrement: false;
1844
+ hasRuntimeDefault: false;
1845
+ enumValues: [string, ...string[]];
1846
+ baseColumn: never;
1847
+ identity: undefined;
1848
+ generated: undefined;
1849
+ }, {}, {}>;
1850
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
1851
+ name: "created_at";
1852
+ tableName: "yaxa_job";
1853
+ dataType: "date";
1854
+ columnType: "PgTimestamp";
1855
+ data: Date;
1856
+ driverParam: string;
1857
+ notNull: true;
1858
+ hasDefault: false;
1859
+ isPrimaryKey: false;
1860
+ isAutoincrement: false;
1861
+ hasRuntimeDefault: false;
1862
+ enumValues: undefined;
1863
+ baseColumn: never;
1864
+ identity: undefined;
1865
+ generated: undefined;
1866
+ }, {}, {}>;
1867
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
1868
+ name: "updated_at";
1869
+ tableName: "yaxa_job";
1870
+ dataType: "date";
1871
+ columnType: "PgTimestamp";
1872
+ data: Date;
1873
+ driverParam: string;
1874
+ notNull: true;
1875
+ hasDefault: false;
1876
+ isPrimaryKey: false;
1877
+ isAutoincrement: false;
1878
+ hasRuntimeDefault: false;
1879
+ enumValues: undefined;
1880
+ baseColumn: never;
1881
+ identity: undefined;
1882
+ generated: undefined;
1883
+ }, {}, {}>;
1884
+ completedAt: import("drizzle-orm/pg-core").PgColumn<{
1885
+ name: "completed_at";
1886
+ tableName: "yaxa_job";
1887
+ dataType: "date";
1888
+ columnType: "PgTimestamp";
1889
+ data: Date;
1890
+ driverParam: string;
1891
+ notNull: false;
1892
+ hasDefault: false;
1893
+ isPrimaryKey: false;
1894
+ isAutoincrement: false;
1895
+ hasRuntimeDefault: false;
1896
+ enumValues: undefined;
1897
+ baseColumn: never;
1898
+ identity: undefined;
1899
+ generated: undefined;
1900
+ }, {}, {}>;
1901
+ };
1902
+ dialect: "pg";
1903
+ }>;
@@ -146,3 +146,23 @@ export const subscription = pgTable('subscription', {
146
146
  createdAt: timestamp('created_at', { mode: 'date' }).notNull(),
147
147
  updatedAt: timestamp('updated_at', { mode: 'date' }).notNull()
148
148
  });
149
+ // ---------------------------------------------------------------------------
150
+ // Background Jobs & Workflows Queue (PostgreSQL)
151
+ // ---------------------------------------------------------------------------
152
+ export const job = pgTable('yaxa_job', {
153
+ id: text('id').primaryKey(),
154
+ queue: text('queue').notNull().default('default'),
155
+ name: text('name').notNull(),
156
+ payload: text('payload').notNull(),
157
+ status: text('status').notNull().default('pending'), // 'pending' | 'processing' | 'completed' | 'failed'
158
+ priority: integer('priority').notNull().default(0),
159
+ attempts: integer('attempts').notNull().default(0),
160
+ maxAttempts: integer('max_attempts').notNull().default(3),
161
+ runAt: timestamp('run_at', { mode: 'date' }).notNull(),
162
+ lockedAt: timestamp('locked_at', { mode: 'date' }),
163
+ lockedBy: text('locked_by'),
164
+ failedReason: text('failed_reason'),
165
+ createdAt: timestamp('created_at', { mode: 'date' }).notNull(),
166
+ updatedAt: timestamp('updated_at', { mode: 'date' }).notNull(),
167
+ completedAt: timestamp('completed_at', { mode: 'date' })
168
+ });
@@ -1761,3 +1761,279 @@ export declare const subscription: import("drizzle-orm/sqlite-core").SQLiteTable
1761
1761
  };
1762
1762
  dialect: "sqlite";
1763
1763
  }>;
1764
+ export declare const job: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
1765
+ name: "yaxa_job";
1766
+ schema: undefined;
1767
+ columns: {
1768
+ id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1769
+ name: "id";
1770
+ tableName: "yaxa_job";
1771
+ dataType: "string";
1772
+ columnType: "SQLiteText";
1773
+ data: string;
1774
+ driverParam: string;
1775
+ notNull: true;
1776
+ hasDefault: false;
1777
+ isPrimaryKey: true;
1778
+ isAutoincrement: false;
1779
+ hasRuntimeDefault: false;
1780
+ enumValues: [string, ...string[]];
1781
+ baseColumn: never;
1782
+ identity: undefined;
1783
+ generated: undefined;
1784
+ }, {}, {
1785
+ length: number | undefined;
1786
+ }>;
1787
+ queue: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1788
+ name: "queue";
1789
+ tableName: "yaxa_job";
1790
+ dataType: "string";
1791
+ columnType: "SQLiteText";
1792
+ data: string;
1793
+ driverParam: string;
1794
+ notNull: true;
1795
+ hasDefault: true;
1796
+ isPrimaryKey: false;
1797
+ isAutoincrement: false;
1798
+ hasRuntimeDefault: false;
1799
+ enumValues: [string, ...string[]];
1800
+ baseColumn: never;
1801
+ identity: undefined;
1802
+ generated: undefined;
1803
+ }, {}, {
1804
+ length: number | undefined;
1805
+ }>;
1806
+ name: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1807
+ name: "name";
1808
+ tableName: "yaxa_job";
1809
+ dataType: "string";
1810
+ columnType: "SQLiteText";
1811
+ data: string;
1812
+ driverParam: string;
1813
+ notNull: true;
1814
+ hasDefault: false;
1815
+ isPrimaryKey: false;
1816
+ isAutoincrement: false;
1817
+ hasRuntimeDefault: false;
1818
+ enumValues: [string, ...string[]];
1819
+ baseColumn: never;
1820
+ identity: undefined;
1821
+ generated: undefined;
1822
+ }, {}, {
1823
+ length: number | undefined;
1824
+ }>;
1825
+ payload: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1826
+ name: "payload";
1827
+ tableName: "yaxa_job";
1828
+ dataType: "string";
1829
+ columnType: "SQLiteText";
1830
+ data: string;
1831
+ driverParam: string;
1832
+ notNull: true;
1833
+ hasDefault: false;
1834
+ isPrimaryKey: false;
1835
+ isAutoincrement: false;
1836
+ hasRuntimeDefault: false;
1837
+ enumValues: [string, ...string[]];
1838
+ baseColumn: never;
1839
+ identity: undefined;
1840
+ generated: undefined;
1841
+ }, {}, {
1842
+ length: number | undefined;
1843
+ }>;
1844
+ status: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1845
+ name: "status";
1846
+ tableName: "yaxa_job";
1847
+ dataType: "string";
1848
+ columnType: "SQLiteText";
1849
+ data: string;
1850
+ driverParam: string;
1851
+ notNull: true;
1852
+ hasDefault: true;
1853
+ isPrimaryKey: false;
1854
+ isAutoincrement: false;
1855
+ hasRuntimeDefault: false;
1856
+ enumValues: [string, ...string[]];
1857
+ baseColumn: never;
1858
+ identity: undefined;
1859
+ generated: undefined;
1860
+ }, {}, {
1861
+ length: number | undefined;
1862
+ }>;
1863
+ priority: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1864
+ name: "priority";
1865
+ tableName: "yaxa_job";
1866
+ dataType: "number";
1867
+ columnType: "SQLiteInteger";
1868
+ data: number;
1869
+ driverParam: number;
1870
+ notNull: true;
1871
+ hasDefault: true;
1872
+ isPrimaryKey: false;
1873
+ isAutoincrement: false;
1874
+ hasRuntimeDefault: false;
1875
+ enumValues: undefined;
1876
+ baseColumn: never;
1877
+ identity: undefined;
1878
+ generated: undefined;
1879
+ }, {}, {}>;
1880
+ attempts: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1881
+ name: "attempts";
1882
+ tableName: "yaxa_job";
1883
+ dataType: "number";
1884
+ columnType: "SQLiteInteger";
1885
+ data: number;
1886
+ driverParam: number;
1887
+ notNull: true;
1888
+ hasDefault: true;
1889
+ isPrimaryKey: false;
1890
+ isAutoincrement: false;
1891
+ hasRuntimeDefault: false;
1892
+ enumValues: undefined;
1893
+ baseColumn: never;
1894
+ identity: undefined;
1895
+ generated: undefined;
1896
+ }, {}, {}>;
1897
+ maxAttempts: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1898
+ name: "max_attempts";
1899
+ tableName: "yaxa_job";
1900
+ dataType: "number";
1901
+ columnType: "SQLiteInteger";
1902
+ data: number;
1903
+ driverParam: number;
1904
+ notNull: true;
1905
+ hasDefault: true;
1906
+ isPrimaryKey: false;
1907
+ isAutoincrement: false;
1908
+ hasRuntimeDefault: false;
1909
+ enumValues: undefined;
1910
+ baseColumn: never;
1911
+ identity: undefined;
1912
+ generated: undefined;
1913
+ }, {}, {}>;
1914
+ runAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1915
+ name: "run_at";
1916
+ tableName: "yaxa_job";
1917
+ dataType: "date";
1918
+ columnType: "SQLiteTimestamp";
1919
+ data: Date;
1920
+ driverParam: number;
1921
+ notNull: true;
1922
+ hasDefault: false;
1923
+ isPrimaryKey: false;
1924
+ isAutoincrement: false;
1925
+ hasRuntimeDefault: false;
1926
+ enumValues: undefined;
1927
+ baseColumn: never;
1928
+ identity: undefined;
1929
+ generated: undefined;
1930
+ }, {}, {}>;
1931
+ lockedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1932
+ name: "locked_at";
1933
+ tableName: "yaxa_job";
1934
+ dataType: "date";
1935
+ columnType: "SQLiteTimestamp";
1936
+ data: Date;
1937
+ driverParam: number;
1938
+ notNull: false;
1939
+ hasDefault: false;
1940
+ isPrimaryKey: false;
1941
+ isAutoincrement: false;
1942
+ hasRuntimeDefault: false;
1943
+ enumValues: undefined;
1944
+ baseColumn: never;
1945
+ identity: undefined;
1946
+ generated: undefined;
1947
+ }, {}, {}>;
1948
+ lockedBy: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1949
+ name: "locked_by";
1950
+ tableName: "yaxa_job";
1951
+ dataType: "string";
1952
+ columnType: "SQLiteText";
1953
+ data: string;
1954
+ driverParam: string;
1955
+ notNull: false;
1956
+ hasDefault: false;
1957
+ isPrimaryKey: false;
1958
+ isAutoincrement: false;
1959
+ hasRuntimeDefault: false;
1960
+ enumValues: [string, ...string[]];
1961
+ baseColumn: never;
1962
+ identity: undefined;
1963
+ generated: undefined;
1964
+ }, {}, {
1965
+ length: number | undefined;
1966
+ }>;
1967
+ failedReason: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1968
+ name: "failed_reason";
1969
+ tableName: "yaxa_job";
1970
+ dataType: "string";
1971
+ columnType: "SQLiteText";
1972
+ data: string;
1973
+ driverParam: string;
1974
+ notNull: false;
1975
+ hasDefault: false;
1976
+ isPrimaryKey: false;
1977
+ isAutoincrement: false;
1978
+ hasRuntimeDefault: false;
1979
+ enumValues: [string, ...string[]];
1980
+ baseColumn: never;
1981
+ identity: undefined;
1982
+ generated: undefined;
1983
+ }, {}, {
1984
+ length: number | undefined;
1985
+ }>;
1986
+ createdAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1987
+ name: "created_at";
1988
+ tableName: "yaxa_job";
1989
+ dataType: "date";
1990
+ columnType: "SQLiteTimestamp";
1991
+ data: Date;
1992
+ driverParam: number;
1993
+ notNull: true;
1994
+ hasDefault: false;
1995
+ isPrimaryKey: false;
1996
+ isAutoincrement: false;
1997
+ hasRuntimeDefault: false;
1998
+ enumValues: undefined;
1999
+ baseColumn: never;
2000
+ identity: undefined;
2001
+ generated: undefined;
2002
+ }, {}, {}>;
2003
+ updatedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
2004
+ name: "updated_at";
2005
+ tableName: "yaxa_job";
2006
+ dataType: "date";
2007
+ columnType: "SQLiteTimestamp";
2008
+ data: Date;
2009
+ driverParam: number;
2010
+ notNull: true;
2011
+ hasDefault: false;
2012
+ isPrimaryKey: false;
2013
+ isAutoincrement: false;
2014
+ hasRuntimeDefault: false;
2015
+ enumValues: undefined;
2016
+ baseColumn: never;
2017
+ identity: undefined;
2018
+ generated: undefined;
2019
+ }, {}, {}>;
2020
+ completedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
2021
+ name: "completed_at";
2022
+ tableName: "yaxa_job";
2023
+ dataType: "date";
2024
+ columnType: "SQLiteTimestamp";
2025
+ data: Date;
2026
+ driverParam: number;
2027
+ notNull: false;
2028
+ hasDefault: false;
2029
+ isPrimaryKey: false;
2030
+ isAutoincrement: false;
2031
+ hasRuntimeDefault: false;
2032
+ enumValues: undefined;
2033
+ baseColumn: never;
2034
+ identity: undefined;
2035
+ generated: undefined;
2036
+ }, {}, {}>;
2037
+ };
2038
+ dialect: "sqlite";
2039
+ }>;
@@ -146,3 +146,23 @@ export const subscription = sqliteTable('subscription', {
146
146
  createdAt: integer('created_at', { mode: 'timestamp' }).notNull(),
147
147
  updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull()
148
148
  });
149
+ // ---------------------------------------------------------------------------
150
+ // Background Jobs & Workflows Queue (SQLite / Turso)
151
+ // ---------------------------------------------------------------------------
152
+ export const job = sqliteTable('yaxa_job', {
153
+ id: text('id').primaryKey(),
154
+ queue: text('queue').notNull().default('default'),
155
+ name: text('name').notNull(),
156
+ payload: text('payload').notNull(),
157
+ status: text('status').notNull().default('pending'), // 'pending' | 'processing' | 'completed' | 'failed'
158
+ priority: integer('priority').notNull().default(0),
159
+ attempts: integer('attempts').notNull().default(0),
160
+ maxAttempts: integer('max_attempts').notNull().default(3),
161
+ runAt: integer('run_at', { mode: 'timestamp' }).notNull(),
162
+ lockedAt: integer('locked_at', { mode: 'timestamp' }),
163
+ lockedBy: text('locked_by'),
164
+ failedReason: text('failed_reason'),
165
+ createdAt: integer('created_at', { mode: 'timestamp' }).notNull(),
166
+ updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull(),
167
+ completedAt: integer('completed_at', { mode: 'timestamp' })
168
+ });