@happyvertical/smrt-jobs 0.40.28 → 0.40.30

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/AGENTS.md CHANGED
@@ -81,6 +81,28 @@ const handle = await doc.background('analyze', { detailed: true })
81
81
  await handle.wait({ timeout: 60000, pollInterval: 100 }); // polling-based
82
82
  ```
83
83
 
84
+ ## Durable forge projections
85
+
86
+ `ForgeDeliveryCollection` owns the provider-neutral delivery inbox in
87
+ `_smrt_forge_deliveries`; `ForgeProjectionRuntime` owns lease/retry/dead-letter
88
+ transitions and monotonic checkpoints in
89
+ `_smrt_forge_projection_checkpoints`.
90
+
91
+ - Inbox identity is `(tenant_id, provider, delivery_id)`.
92
+ - Tenant-facing accept/replay requires ambient tenant context. Worker claim is
93
+ cross-tenant, then runtime restores the captured context before observation.
94
+ - Projection callbacks must write through `ForgeProjectionContext.db`; the
95
+ application projection, checkpoint, and inbox completion share one
96
+ transaction.
97
+ - Observation identity is tracker-independent
98
+ `(projection, subjectKey, version)`. Equal or older versions are acknowledged
99
+ without reapplying.
100
+ - Lease-token conditions guard every terminal/failure write. Expired final
101
+ attempts become replayable `dead_letter` rows, and persisted errors are
102
+ redacted.
103
+ - Generated API, CLI, and MCP surfaces stay disabled; replay is an explicit
104
+ tenant-scoped operator action.
105
+
84
106
  `bg()` is shorthand: `await doc.bg('analyze', args)` → enqueues immediately, returns JobHandle.
85
107
 
86
108
  ## withBackgroundJobs(Class)
@@ -92,6 +114,9 @@ Mixin that adds `bg()` and `background()` to any SmrtObject. Uses WeakMap for co
92
114
  - **Cron not timezone-aware**: cron fields match the server's **local** time, not UTC (set `TZ` for UTC); no missed-run catch-up (fire-once-forward)
93
115
  - **At-least-once execution**: a timeout cannot preempt a running handler; timed-out jobs fail without retry but the handler keeps running — make handlers idempotent (see "Timeouts & at-least-once")
94
116
  - **No dead letter queue**: failed jobs stay in DB with `status='failed'` — manual intervention
117
+ - **Forge deliveries are not SmrtJobs**: they use their own replayable
118
+ dead-letter inbox and projection checkpoint contract. Do not enqueue provider
119
+ deliveries as generic background jobs.
95
120
  - **Result storage**: `resultPointer` is just a string — app must implement result backend
96
121
  - **Lazy builder**: `background()` returns builder — nothing happens until `enqueue()`
97
122
  - **wait() is polling**: JobHandle.wait() polls DB every 100ms (configurable)
package/README.md CHANGED
@@ -1,5 +1,64 @@
1
1
  # @happyvertical/smrt-jobs
2
2
 
3
+ ## Durable forge projections
4
+
5
+ `ForgeDeliveryCollection` and `ForgeProjectionRuntime` provide a
6
+ provider-neutral inbox for durable forge webhook projection. The inbox identity
7
+ is `(tenantId, provider, deliveryId)`, so provider retries are atomically
8
+ deduplicated. A worker lease owns each attempt; failures use bounded exponential
9
+ retry, then remain in `dead_letter` until an operator calls `replay()` from the
10
+ owning tenant context.
11
+
12
+ `leaseMs` must be a finite positive duration. `retryBaseMs` and `retryMaxMs`
13
+ must be finite, non-negative durations no greater than 2,147,483,647 ms;
14
+ invalid timing configuration is rejected before a lease can be claimed. A lease
15
+ that would exceed the JavaScript `Date` range is rejected before any lease
16
+ write; a retry that would exceed that range is durably dead-lettered instead of
17
+ being left leased.
18
+
19
+ ```ts
20
+ const inbox = await ForgeDeliveryCollection.create({ db });
21
+
22
+ await withTenant({ tenantId }, () =>
23
+ inbox.accept({
24
+ provider: 'github',
25
+ deliveryId: request.headers.get('x-github-delivery')!,
26
+ eventName: 'pull_request',
27
+ repositoryKey: 'example/forge-repository',
28
+ payload,
29
+ }),
30
+ );
31
+
32
+ const runtime = new ForgeProjectionRuntime({ db, workerId: workerKey });
33
+ await runtime.processNext({
34
+ async observe(delivery) {
35
+ return {
36
+ projection: 'pull-request-revision',
37
+ subjectKey: `${delivery.repositoryKey}:pr:${delivery.payload.number}`,
38
+ version: Number(delivery.payload.revision),
39
+ value: delivery.payload,
40
+ };
41
+ },
42
+ async project(observation, context) {
43
+ // Always use context.db: it is the transaction shared by the application
44
+ // projection, monotonic checkpoint, and inbox completion.
45
+ await writeProjection(context.db, observation);
46
+ },
47
+ });
48
+ ```
49
+
50
+ `projection` and `subjectKey` are application-defined. A pull request is not
51
+ treated as a tracker issue. `version` must be a non-negative monotonic signed
52
+ 32-bit integer (`0` through `2,147,483,647`); observations at or below the
53
+ durable checkpoint are acknowledged without reapplying side effects. Provider
54
+ normalization runs with the delivery's tenant context restored. Generated
55
+ REST/MCP/CLI surfaces are disabled for both system tables; operator replay
56
+ requires an explicit in-process tenant context.
57
+
58
+ The manifest-driven migration adds `_smrt_forge_deliveries` and
59
+ `_smrt_forge_projection_checkpoints`. Run `smrt db:migrate` before starting a
60
+ forge projection worker.
61
+
3
62
  Background job execution for s-m-r-t objects. Provides persistent queue storage, retry strategies, cron-based scheduling, and a fluent `JobBuilder` API via the `withBackgroundJobs()` mixin.
4
63
 
5
64
  ## Installation
@@ -58,26 +117,19 @@ runner.on('job:failed', (job, error) => { /* ... */ });
58
117
  process.on('SIGTERM', () => runner.stop());
59
118
  ```
60
119
 
61
- ### Heartbeat-safe job execution
62
-
63
- `TaskRunner` keeps jobs alive with a heartbeat timer. If your job blocks the
64
- Node.js event loop for longer than the effective stale-job threshold, the runner
65
- will recover that work as stale and mark it failed.
66
-
67
- Common causes:
68
-
69
- - `execSync`, `spawnSync`, or other synchronous subprocess APIs
70
- - long CPU-bound loops in the job method itself
71
- - large synchronous filesystem work
120
+ ### Liveness-safe job execution
72
121
 
73
- Prefer async subprocess APIs (`spawn`, `execFile`, streamed stdio) for long
74
- exports/builds/uploads, or move CPU-heavy work into a separate process or
75
- worker thread. If a job is intentionally long-running, tune
76
- `heartbeatInterval` and `staleJobThresholdMs` together so the stale threshold
77
- comfortably exceeds the longest gap between heartbeats.
122
+ `TaskRunner` records heartbeat telemetry, but recovery keys on a worker
123
+ incarnation's live lease rather than a per-job heartbeat threshold. A blocked
124
+ event loop must not make a still-running handler appear dead and cause a
125
+ concurrent duplicate execution. See the live-set and off-loop lease-renewal
126
+ details in
127
+ [Worker liveness & recovery](AGENTS.md#worker-liveness--recovery-1474).
78
128
 
79
- `ScheduleRunner` uses the same stale-heartbeat recovery rules when reconciling
80
- scheduled jobs.
129
+ Job handlers remain at-least-once. Avoid synchronous, CPU-bound, or otherwise
130
+ long-running work when possible; make external effects idempotent because a
131
+ process crash after an effect but before its terminal write still permits a
132
+ later retry.
81
133
 
82
134
  ### Schedule recurring jobs with ScheduleRunner
83
135
 
@@ -119,7 +171,7 @@ taskRunner.on('job:failed', (job, error) => {
119
171
  | `JobBuilder` | Fluent API: `.delay()`, `.priority()`, `.retries()`, `.queue()`, `.timeout()`, `.enqueue()` |
120
172
  | `JobHandle` | Track, wait, cancel, or retry an enqueued job |
121
173
  | `JobContextLogger` | Logger that auto-injects job context (jobId, attempt, queue) |
122
- | `TaskRunner` | Polling-based execution engine with concurrency control and heartbeats |
174
+ | `TaskRunner` | Polling-based execution engine with concurrency control and liveness leases |
123
175
  | `ScheduleRunner` | Polls for due cron schedules and creates SmrtJob entries |
124
176
 
125
177
  `TaskRunner` uses `SmrtJobCollection.claimReady()` so multiple workers can poll
@@ -1,13 +1,13 @@
1
1
  import { a as resolveEngine, c as unregisterLiveWorker, i as registerLiveWorker, n as isWorkerAlive, o as resolveUrl, r as offLoopEligible, s as tuneSqliteForConcurrency, t as createWorkerKey } from "./worker-liveness-C1Gjnhax.js";
2
2
  import { ObjectRegistry, SmrtCollection, SmrtObject, detectEngine, ensureJobEventsSystemTableCompatibility, ensureJobsSystemTableCompatibility, field, foreignKey, getClassConfigResolvers, resolveLazyConfig, smrt } from "@happyvertical/smrt-core";
3
- import { fromConfig } from "@happyvertical/jobs";
4
3
  import { TenantContext, TenantScoped, getTenantId, tenantId } from "@happyvertical/smrt-tenancy";
4
+ import { fromConfig } from "@happyvertical/jobs";
5
5
  import { EventEmitter } from "node:events";
6
6
  import { Worker } from "node:worker_threads";
7
7
  import { createLogger } from "@happyvertical/logger";
8
8
  import { createId } from "@happyvertical/utils";
9
9
  //#region src/__smrt-register__.ts
10
- ObjectRegistry.registerPackageManifest(JSON.parse("{\"version\":\"1.0.0\",\"timestamp\":1785095301151,\"packageName\":\"@happyvertical/smrt-jobs\",\"packageVersion\":\"0.40.28\",\"objects\":{\"@happyvertical/smrt-jobs:SmrtJobEvent\":{\"name\":\"smrtjobevent\",\"className\":\"SmrtJobEvent\",\"qualifiedName\":\"@happyvertical/smrt-jobs:SmrtJobEvent\",\"collection\":\"smrtjobevents\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/jobs/src/smrt-job-event.ts\",\"packageName\":\"@happyvertical/smrt-jobs\",\"fields\":{\"tenantId\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"sqlType\":\"UUID\",\"nullable\":true,\"__tenancy\":{\"isTenantIdField\":true,\"autoFilter\":true,\"required\":false,\"autoPopulate\":true,\"nullable\":true,\"mode\":\"optional\",\"field\":\"tenantId\",\"allowSuperAdminBypass\":false}}},\"jobId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"SmrtJob\",\"_meta\":{\"required\":true}},\"type\":{\"type\":\"text\",\"required\":true,\"default\":\"log\",\"_meta\":{\"required\":true,\"default\":\"log\"}},\"level\":{\"type\":\"text\",\"required\":true,\"default\":\"info\",\"_meta\":{\"required\":true,\"default\":\"info\"}},\"stage\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"progress\":{\"type\":\"integer\",\"required\":false,\"_meta\":{\"nullable\":true}},\"message\":{\"type\":\"text\",\"required\":true,\"default\":\"\",\"_meta\":{\"required\":true,\"default\":\"\"}},\"data\":{\"type\":\"json\",\"required\":false,\"_meta\":{}},\"createdAt\":{\"type\":\"datetime\",\"required\":true,\"_meta\":{\"required\":true}}},\"methods\":{\"toCursor\":{\"name\":\"toCursor\",\"async\":false,\"parameters\":[],\"returnType\":\"string\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"_smrt_job_events\",\"api\":false,\"cli\":{\"include\":[\"list\",\"get\"],\"http\":false,\"skipApiCheck\":true},\"mcp\":false,\"tenantScoped\":{\"mode\":\"optional\"}},\"extends\":\"SmrtObject\",\"exportName\":\"SmrtJobEvent\",\"collectionExportName\":\"SmrtJobEventCollection\",\"validationRules\":[{\"field\":\"jobId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"},{\"field\":\"type\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"level\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"message\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"createdAt\",\"rule\":\"required\",\"fieldType\":\"datetime\"}],\"schema\":{\"tableName\":\"_smrt_job_events\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"_smrt_job_events\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"tenant_id\\\" UUID,\\n \\\"job_id\\\" UUID NOT NULL,\\n \\\"type\\\" TEXT NOT NULL DEFAULT 'log',\\n \\\"level\\\" TEXT NOT NULL DEFAULT 'info',\\n \\\"stage\\\" TEXT,\\n \\\"progress\\\" INTEGER,\\n \\\"message\\\" TEXT NOT NULL DEFAULT '',\\n \\\"data\\\" JSON\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"tenantId\",\"notNull\":false,\"unique\":false},\"job_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false},\"type\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"log\"},\"level\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"info\"},\"stage\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"progress\":{\"type\":\"INTEGER\",\"notNull\":false,\"unique\":false},\"message\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"\"},\"data\":{\"type\":\"JSON\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"_smrt_job_events_id_idx\",\"columns\":[\"id\"]},{\"name\":\"_smrt_job_events_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"8a9faeec\"}},\"@happyvertical/smrt-jobs:SmrtJobEventCollection\":{\"name\":\"smrtjobeventcollection\",\"className\":\"SmrtJobEventCollection\",\"qualifiedName\":\"@happyvertical/smrt-jobs:SmrtJobEventCollection\",\"collection\":\"smrtjobevents\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/jobs/src/smrt-job-event.ts\",\"packageName\":\"@happyvertical/smrt-jobs\",\"fields\":{},\"methods\":{\"initialize\":{\"name\":\"initialize\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise\",\"isStatic\":false,\"isPublic\":true},\"append\":{\"name\":\"append\",\"async\":true,\"parameters\":[{\"name\":\"input\",\"type\":\"SmrtJobEventData\",\"optional\":false}],\"returnType\":\"Promise<SmrtJobEvent>\",\"isStatic\":false,\"isPublic\":true},\"listByJob\":{\"name\":\"listByJob\",\"async\":true,\"parameters\":[{\"name\":\"jobId\",\"type\":\"string\",\"optional\":false},{\"name\":\"options\",\"type\":\"ListJobEventsOptions\",\"optional\":true}],\"returnType\":\"Promise<SmrtJobEvent[]>\",\"isStatic\":false,\"isPublic\":true},\"listSinceCursor\":{\"name\":\"listSinceCursor\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"any\",\"optional\":true}],\"returnType\":\"Promise<SmrtJobEvent[]>\",\"isStatic\":false,\"isPublic\":true},\"latestProgressByJobIds\":{\"name\":\"latestProgressByJobIds\",\"async\":true,\"parameters\":[{\"name\":\"jobIds\",\"type\":\"string[]\",\"optional\":false},{\"name\":\"options\",\"type\":\"object\",\"optional\":true}],\"returnType\":\"Promise<Map<string, SmrtJobEvent>>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"_smrt_job_events\"},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"SmrtJobEvent\",\"exportName\":\"SmrtJobEventCollection\",\"collectionExportName\":\"SmrtJobEventCollectionCollection\",\"schema\":{\"tableName\":\"_smrt_job_events\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"_smrt_job_events\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"_smrt_job_events_id_idx\",\"columns\":[\"id\"]},{\"name\":\"_smrt_job_events_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"bcf5b3bc\"}},\"@happyvertical/smrt-jobs:SmrtJob\":{\"name\":\"smrtjob\",\"className\":\"SmrtJob\",\"qualifiedName\":\"@happyvertical/smrt-jobs:SmrtJob\",\"collection\":\"smrtjobs\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/jobs/src/smrt-job.ts\",\"packageName\":\"@happyvertical/smrt-jobs\",\"fields\":{\"tenantId\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"sqlType\":\"UUID\",\"nullable\":true,\"__tenancy\":{\"isTenantIdField\":true,\"autoFilter\":true,\"required\":false,\"autoPopulate\":true,\"nullable\":true,\"mode\":\"optional\",\"field\":\"tenantId\",\"allowSuperAdminBypass\":false}}},\"queue\":{\"type\":\"text\",\"required\":true,\"default\":\"default\",\"_meta\":{\"required\":true,\"default\":\"default\"}},\"objectType\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true}},\"objectId\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"method\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true}},\"args\":{\"type\":\"json\",\"required\":false,\"_meta\":{}},\"runAt\":{\"type\":\"datetime\",\"required\":true,\"_meta\":{\"required\":true}},\"priority\":{\"type\":\"integer\",\"required\":true,\"default\":50,\"_meta\":{\"required\":true,\"default\":50}},\"status\":{\"type\":\"text\",\"required\":true,\"default\":\"pending\",\"_meta\":{\"required\":true,\"default\":\"pending\"}},\"attempts\":{\"type\":\"integer\",\"required\":true,\"default\":0,\"_meta\":{\"required\":true,\"default\":0}},\"maxAttempts\":{\"type\":\"integer\",\"required\":true,\"default\":3,\"_meta\":{\"required\":true,\"default\":3}},\"timeout\":{\"type\":\"integer\",\"required\":true,\"default\":300000,\"_meta\":{\"required\":true,\"default\":300000}},\"timeoutBehavior\":{\"type\":\"text\",\"required\":true,\"default\":\"fail\",\"_meta\":{\"required\":true,\"default\":\"fail\"}},\"startedAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}},\"completedAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}},\"lastError\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"resultPointer\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"retryStrategy\":{\"type\":\"json\",\"required\":false,\"_meta\":{}},\"workerId\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"workerHeartbeat\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}}},\"methods\":{\"save\":{\"name\":\"save\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise\",\"isStatic\":false,\"isPublic\":true},\"retry\":{\"name\":\"retry\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"cancel\":{\"name\":\"cancel\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"getDescription\":{\"name\":\"getDescription\",\"async\":false,\"parameters\":[],\"returnType\":\"string\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"_smrt_jobs\",\"api\":false,\"cli\":{\"include\":[\"list\",\"get\",\"retry\",\"cancel\"],\"skipApiCheck\":true,\"http\":false},\"mcp\":false,\"tenantScoped\":{\"mode\":\"optional\"}},\"extends\":\"SmrtObject\",\"exportName\":\"SmrtJob\",\"collectionExportName\":\"SmrtJobCollection\",\"validationRules\":[{\"field\":\"queue\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"objectType\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"method\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"runAt\",\"rule\":\"required\",\"fieldType\":\"datetime\"},{\"field\":\"priority\",\"rule\":\"required\",\"fieldType\":\"integer\"},{\"field\":\"status\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"attempts\",\"rule\":\"required\",\"fieldType\":\"integer\"},{\"field\":\"maxAttempts\",\"rule\":\"required\",\"fieldType\":\"integer\"},{\"field\":\"timeout\",\"rule\":\"required\",\"fieldType\":\"integer\"},{\"field\":\"timeoutBehavior\",\"rule\":\"required\",\"fieldType\":\"text\"}],\"schema\":{\"tableName\":\"_smrt_jobs\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"_smrt_jobs\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"tenant_id\\\" UUID,\\n \\\"queue\\\" TEXT NOT NULL DEFAULT 'default',\\n \\\"object_type\\\" TEXT NOT NULL,\\n \\\"object_id\\\" TEXT,\\n \\\"method\\\" TEXT NOT NULL,\\n \\\"args\\\" JSON,\\n \\\"run_at\\\" TIMESTAMP NOT NULL,\\n \\\"priority\\\" INTEGER NOT NULL DEFAULT 50,\\n \\\"status\\\" TEXT NOT NULL DEFAULT 'pending',\\n \\\"attempts\\\" INTEGER NOT NULL DEFAULT 0,\\n \\\"max_attempts\\\" INTEGER NOT NULL DEFAULT 3,\\n \\\"timeout\\\" INTEGER NOT NULL DEFAULT 300000,\\n \\\"timeout_behavior\\\" TEXT NOT NULL DEFAULT 'fail',\\n \\\"started_at\\\" TIMESTAMP,\\n \\\"completed_at\\\" TIMESTAMP,\\n \\\"last_error\\\" TEXT,\\n \\\"result_pointer\\\" TEXT,\\n \\\"retry_strategy\\\" JSON,\\n \\\"worker_id\\\" TEXT,\\n \\\"worker_heartbeat\\\" TIMESTAMP\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"tenantId\",\"notNull\":false,\"unique\":false},\"queue\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"default\"},\"object_type\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"object_id\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"method\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"args\":{\"type\":\"JSON\",\"notNull\":false,\"unique\":false},\"run_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"unique\":false},\"priority\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":50},\"status\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"pending\"},\"attempts\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":0},\"max_attempts\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":3},\"timeout\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":300000},\"timeout_behavior\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"fail\"},\"started_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"completed_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"last_error\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"result_pointer\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"retry_strategy\":{\"type\":\"JSON\",\"notNull\":false,\"unique\":false},\"worker_id\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"worker_heartbeat\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"_smrt_jobs_id_idx\",\"columns\":[\"id\"]},{\"name\":\"_smrt_jobs_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"0e543f33\"}},\"@happyvertical/smrt-jobs:SmrtJobCollection\":{\"name\":\"smrtjobcollection\",\"className\":\"SmrtJobCollection\",\"qualifiedName\":\"@happyvertical/smrt-jobs:SmrtJobCollection\",\"collection\":\"smrtjobs\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/jobs/src/smrt-job.ts\",\"packageName\":\"@happyvertical/smrt-jobs\",\"fields\":{},\"methods\":{\"initialize\":{\"name\":\"initialize\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise\",\"isStatic\":false,\"isPublic\":true},\"listByStatus\":{\"name\":\"listByStatus\",\"async\":true,\"parameters\":[{\"name\":\"status\",\"type\":\"JobStatus | JobStatus[]\",\"optional\":false},{\"name\":\"options\",\"type\":\"object\",\"optional\":true}],\"returnType\":\"Promise<SmrtJob[]>\",\"isStatic\":false,\"isPublic\":true},\"listReady\":{\"name\":\"listReady\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"object\",\"optional\":true}],\"returnType\":\"Promise<SmrtJob[]>\",\"isStatic\":false,\"isPublic\":true},\"claimReady\":{\"name\":\"claimReady\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"ClaimReadyOptions\",\"optional\":false}],\"returnType\":\"Promise<SmrtJob[]>\",\"isStatic\":false,\"isPublic\":true},\"countInFlightForTenant\":{\"name\":\"countInFlightForTenant\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string | null\",\"optional\":false}],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true},\"enqueueJob\":{\"name\":\"enqueueJob\",\"async\":true,\"parameters\":[{\"name\":\"data\",\"type\":\"SmrtJobData\",\"optional\":false},{\"name\":\"options\",\"type\":\"EnqueueJobOptions\",\"optional\":true}],\"returnType\":\"Promise<SmrtJob>\",\"isStatic\":false,\"isPublic\":true},\"stats\":{\"name\":\"stats\",\"async\":true,\"parameters\":[{\"name\":\"queue\",\"type\":\"string\",\"optional\":true}],\"returnType\":\"Promise<object>\",\"isStatic\":false,\"isPublic\":true},\"cleanup\":{\"name\":\"cleanup\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"object\",\"optional\":false}],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"_smrt_jobs\"},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"SmrtJob\",\"exportName\":\"SmrtJobCollection\",\"collectionExportName\":\"SmrtJobCollectionCollection\",\"schema\":{\"tableName\":\"_smrt_jobs\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"_smrt_jobs\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"_smrt_jobs_id_idx\",\"columns\":[\"id\"]},{\"name\":\"_smrt_jobs_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"d99c04d1\"}},\"@happyvertical/smrt-jobs:SmrtWorker\":{\"name\":\"smrtworker\",\"className\":\"SmrtWorker\",\"qualifiedName\":\"@happyvertical/smrt-jobs:SmrtWorker\",\"collection\":\"smrtworkers\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/jobs/src/smrt-worker.ts\",\"packageName\":\"@happyvertical/smrt-jobs\",\"fields\":{\"workerId\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true}},\"pid\":{\"type\":\"integer\",\"required\":false,\"_meta\":{\"nullable\":true}},\"hostname\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"startedAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}},\"heartbeatAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}},\"leaseExpiresAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}},\"status\":{\"type\":\"text\",\"required\":true,\"default\":\"running\",\"_meta\":{\"required\":true,\"default\":\"running\"}}},\"methods\":{},\"decoratorConfig\":{\"tableName\":\"_smrt_workers\",\"conflictColumns\":[\"worker_id\"],\"api\":false,\"cli\":false,\"mcp\":false},\"extends\":\"SmrtObject\",\"exportName\":\"SmrtWorker\",\"collectionExportName\":\"SmrtWorkerCollection\",\"validationRules\":[{\"field\":\"workerId\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"status\",\"rule\":\"required\",\"fieldType\":\"text\"}],\"schema\":{\"tableName\":\"_smrt_workers\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"_smrt_workers\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"worker_id\\\" TEXT NOT NULL,\\n \\\"pid\\\" INTEGER,\\n \\\"hostname\\\" TEXT,\\n \\\"started_at\\\" TIMESTAMP,\\n \\\"heartbeat_at\\\" TIMESTAMP,\\n \\\"lease_expires_at\\\" TIMESTAMP,\\n \\\"status\\\" TEXT NOT NULL DEFAULT 'running'\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"worker_id\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"pid\":{\"type\":\"INTEGER\",\"notNull\":false,\"unique\":false},\"hostname\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"started_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"heartbeat_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"lease_expires_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"status\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"running\"}},\"indexes\":[{\"name\":\"_smrt_workers_id_idx\",\"columns\":[\"id\"]},{\"name\":\"_smrt_workers_worker_id_idx\",\"columns\":[\"worker_id\"],\"unique\":true}],\"version\":\"bfaad669\"}},\"@happyvertical/smrt-jobs:SmrtWorkerCollection\":{\"name\":\"smrtworkercollection\",\"className\":\"SmrtWorkerCollection\",\"qualifiedName\":\"@happyvertical/smrt-jobs:SmrtWorkerCollection\",\"collection\":\"smrtworkers\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/jobs/src/smrt-worker.ts\",\"packageName\":\"@happyvertical/smrt-jobs\",\"fields\":{},\"methods\":{\"assertReady\":{\"name\":\"assertReady\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"tableReady\":{\"name\":\"tableReady\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"registerWorker\":{\"name\":\"registerWorker\",\"async\":true,\"parameters\":[{\"name\":\"input\",\"type\":\"RegisterWorkerInput\",\"optional\":false}],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"renewLease\":{\"name\":\"renewLease\",\"async\":true,\"parameters\":[{\"name\":\"workerKey\",\"type\":\"string\",\"optional\":false},{\"name\":\"leaseTtlMs\",\"type\":\"number\",\"optional\":false}],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"expireWorker\":{\"name\":\"expireWorker\",\"async\":true,\"parameters\":[{\"name\":\"workerKey\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"freshLeaseWorkerKeys\":{\"name\":\"freshLeaseWorkerKeys\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<Set<string>>\",\"isStatic\":false,\"isPublic\":true},\"pruneExpired\":{\"name\":\"pruneExpired\",\"async\":true,\"parameters\":[{\"name\":\"graceMs\",\"type\":\"number\",\"optional\":false}],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"_smrt_workers\"},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"SmrtWorker\",\"exportName\":\"SmrtWorkerCollection\",\"collectionExportName\":\"SmrtWorkerCollectionCollection\",\"schema\":{\"tableName\":\"_smrt_workers\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"_smrt_workers\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"_smrt_workers_id_idx\",\"columns\":[\"id\"]},{\"name\":\"_smrt_workers_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"d3a7edbd\"}}},\"moduleType\":\"smrt\",\"smrtDependencies\":[\"@happyvertical/smrt-core\",\"@happyvertical/smrt-tenancy\"]}"));
10
+ ObjectRegistry.registerPackageManifest(JSON.parse("{\"version\":\"1.0.0\",\"timestamp\":1785184304401,\"packageName\":\"@happyvertical/smrt-jobs\",\"packageVersion\":\"0.40.30\",\"objects\":{\"@happyvertical/smrt-jobs:ForgeDelivery\":{\"name\":\"forgedelivery\",\"className\":\"ForgeDelivery\",\"qualifiedName\":\"@happyvertical/smrt-jobs:ForgeDelivery\",\"collection\":\"forgedeliveries\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/jobs/src/forge-projection.ts\",\"packageName\":\"@happyvertical/smrt-jobs\",\"fields\":{\"tenantId\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"sqlType\":\"UUID\",\"__tenancy\":{\"isTenantIdField\":true,\"autoFilter\":true,\"required\":true,\"autoPopulate\":true,\"nullable\":false,\"mode\":\"required\",\"field\":\"tenantId\",\"allowSuperAdminBypass\":false}}},\"provider\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true}},\"deliveryId\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true}},\"installationKey\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"repositoryKey\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"eventName\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true}},\"payload\":{\"type\":\"json\",\"required\":false,\"_meta\":{}},\"status\":{\"type\":\"text\",\"required\":true,\"default\":\"pending\",\"_meta\":{\"required\":true,\"default\":\"pending\"}},\"attempts\":{\"type\":\"integer\",\"required\":true,\"default\":0,\"_meta\":{\"required\":true,\"default\":0}},\"maxAttempts\":{\"type\":\"integer\",\"required\":true,\"default\":5,\"_meta\":{\"required\":true,\"default\":5}},\"receivedAt\":{\"type\":\"datetime\",\"required\":true,\"_meta\":{\"required\":true}},\"nextAttemptAt\":{\"type\":\"datetime\",\"required\":true,\"_meta\":{\"required\":true}},\"leaseOwner\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"leaseToken\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"leaseExpiresAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}},\"lastError\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"completedAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}},\"replayCount\":{\"type\":\"integer\",\"required\":true,\"default\":0,\"_meta\":{\"required\":true,\"default\":0}}},\"methods\":{},\"decoratorConfig\":{\"tableName\":\"_smrt_forge_deliveries\",\"conflictColumns\":[\"tenant_id\",\"provider\",\"delivery_id\"],\"api\":false,\"cli\":false,\"mcp\":false,\"tenantScoped\":{\"mode\":\"required\"}},\"extends\":\"SmrtObject\",\"exportName\":\"ForgeDelivery\",\"collectionExportName\":\"ForgeDeliveryCollection\",\"validationRules\":[{\"field\":\"tenantId\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"provider\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"deliveryId\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"eventName\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"status\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"attempts\",\"rule\":\"required\",\"fieldType\":\"integer\"},{\"field\":\"maxAttempts\",\"rule\":\"required\",\"fieldType\":\"integer\"},{\"field\":\"receivedAt\",\"rule\":\"required\",\"fieldType\":\"datetime\"},{\"field\":\"nextAttemptAt\",\"rule\":\"required\",\"fieldType\":\"datetime\"},{\"field\":\"replayCount\",\"rule\":\"required\",\"fieldType\":\"integer\"}],\"schema\":{\"tableName\":\"_smrt_forge_deliveries\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"_smrt_forge_deliveries\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"tenant_id\\\" UUID NOT NULL,\\n \\\"provider\\\" TEXT NOT NULL,\\n \\\"delivery_id\\\" TEXT NOT NULL,\\n \\\"installation_key\\\" TEXT,\\n \\\"repository_key\\\" TEXT,\\n \\\"event_name\\\" TEXT NOT NULL,\\n \\\"payload\\\" JSON,\\n \\\"status\\\" TEXT NOT NULL DEFAULT 'pending',\\n \\\"attempts\\\" INTEGER NOT NULL DEFAULT 0,\\n \\\"max_attempts\\\" INTEGER NOT NULL DEFAULT 5,\\n \\\"received_at\\\" TIMESTAMP NOT NULL,\\n \\\"next_attempt_at\\\" TIMESTAMP NOT NULL,\\n \\\"lease_owner\\\" TEXT,\\n \\\"lease_token\\\" TEXT,\\n \\\"lease_expires_at\\\" TIMESTAMP,\\n \\\"last_error\\\" TEXT,\\n \\\"completed_at\\\" TIMESTAMP,\\n \\\"replay_count\\\" INTEGER NOT NULL DEFAULT 0\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"tenantId\",\"notNull\":true,\"unique\":false},\"provider\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"delivery_id\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"installation_key\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"repository_key\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"event_name\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"payload\":{\"type\":\"JSON\",\"notNull\":false,\"unique\":false},\"status\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"pending\"},\"attempts\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":0},\"max_attempts\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":5},\"received_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"unique\":false},\"next_attempt_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"unique\":false},\"lease_owner\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"lease_token\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"lease_expires_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"last_error\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"completed_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"replay_count\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":0}},\"indexes\":[{\"name\":\"_smrt_forge_deliveries_id_idx\",\"columns\":[\"id\"]},{\"name\":\"_smrt_forge_deliveries_tenant_id_provider_idx\",\"columns\":[\"tenant_id\",\"provider\",\"delivery_id\"],\"unique\":true}],\"version\":\"38d3f476\"}},\"@happyvertical/smrt-jobs:ForgeProjectionCheckpoint\":{\"name\":\"forgeprojectioncheckpoint\",\"className\":\"ForgeProjectionCheckpoint\",\"qualifiedName\":\"@happyvertical/smrt-jobs:ForgeProjectionCheckpoint\",\"collection\":\"forgeprojectioncheckpoints\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/jobs/src/forge-projection.ts\",\"packageName\":\"@happyvertical/smrt-jobs\",\"fields\":{\"tenantId\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"sqlType\":\"UUID\",\"__tenancy\":{\"isTenantIdField\":true,\"autoFilter\":true,\"required\":true,\"autoPopulate\":true,\"nullable\":false,\"mode\":\"required\",\"field\":\"tenantId\",\"allowSuperAdminBypass\":false}}},\"projection\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true}},\"subjectKey\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true}},\"observationVersion\":{\"type\":\"integer\",\"required\":true,\"_meta\":{\"required\":true}},\"deliveryId\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true}},\"observedAt\":{\"type\":\"datetime\",\"required\":true,\"_meta\":{\"required\":true}}},\"methods\":{},\"decoratorConfig\":{\"tableName\":\"_smrt_forge_projection_checkpoints\",\"conflictColumns\":[\"tenant_id\",\"projection\",\"subject_key\"],\"api\":false,\"cli\":false,\"mcp\":false,\"tenantScoped\":{\"mode\":\"required\"}},\"extends\":\"SmrtObject\",\"exportName\":\"ForgeProjectionCheckpoint\",\"collectionExportName\":\"ForgeProjectionCheckpointCollection\",\"validationRules\":[{\"field\":\"tenantId\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"projection\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"subjectKey\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"observationVersion\",\"rule\":\"required\",\"fieldType\":\"integer\"},{\"field\":\"deliveryId\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"observedAt\",\"rule\":\"required\",\"fieldType\":\"datetime\"}],\"schema\":{\"tableName\":\"_smrt_forge_projection_checkpoints\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"_smrt_forge_projection_checkpoints\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"tenant_id\\\" UUID NOT NULL,\\n \\\"projection\\\" TEXT NOT NULL,\\n \\\"subject_key\\\" TEXT NOT NULL,\\n \\\"observation_version\\\" INTEGER NOT NULL,\\n \\\"delivery_id\\\" TEXT NOT NULL,\\n \\\"observed_at\\\" TIMESTAMP NOT NULL\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"tenantId\",\"notNull\":true,\"unique\":false},\"projection\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"subject_key\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"observation_version\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false},\"delivery_id\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"observed_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"unique\":false}},\"indexes\":[{\"name\":\"_smrt_forge_projection_checkpoints_id_idx\",\"columns\":[\"id\"]},{\"name\":\"_smrt_forge_projection_checkpoints_tenant_id_projection_idx\",\"columns\":[\"tenant_id\",\"projection\",\"subject_key\"],\"unique\":true}],\"version\":\"39c12493\"}},\"@happyvertical/smrt-jobs:ForgeDeliveryCollection\":{\"name\":\"forgedeliverycollection\",\"className\":\"ForgeDeliveryCollection\",\"qualifiedName\":\"@happyvertical/smrt-jobs:ForgeDeliveryCollection\",\"collection\":\"forgedeliveries\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/jobs/src/forge-projection.ts\",\"packageName\":\"@happyvertical/smrt-jobs\",\"fields\":{},\"methods\":{\"accept\":{\"name\":\"accept\",\"async\":true,\"parameters\":[{\"name\":\"input\",\"type\":\"AcceptForgeDeliveryInput\",\"optional\":false},{\"name\":\"audit\",\"type\":\"ForgeProjectionAuditHook\",\"optional\":true}],\"returnType\":\"Promise<AcceptedForgeDelivery>\",\"isStatic\":false,\"isPublic\":true},\"claimReady\":{\"name\":\"claimReady\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"ClaimForgeDeliveryOptions\",\"optional\":false},{\"name\":\"audit\",\"type\":\"ForgeProjectionAuditHook\",\"optional\":true}],\"returnType\":\"Promise<ForgeDelivery | null>\",\"isStatic\":false,\"isPublic\":true},\"replay\":{\"name\":\"replay\",\"async\":true,\"parameters\":[{\"name\":\"id\",\"type\":\"string\",\"optional\":false},{\"name\":\"audit\",\"type\":\"ForgeProjectionAuditHook\",\"optional\":true}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"_smrt_forge_deliveries\"},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"ForgeDelivery\",\"exportName\":\"ForgeDeliveryCollection\",\"collectionExportName\":\"ForgeDeliveryCollectionCollection\",\"schema\":{\"tableName\":\"_smrt_forge_deliveries\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"_smrt_forge_deliveries\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"_smrt_forge_deliveries_id_idx\",\"columns\":[\"id\"]},{\"name\":\"_smrt_forge_deliveries_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"0a680146\"}},\"@happyvertical/smrt-jobs:SmrtJobEvent\":{\"name\":\"smrtjobevent\",\"className\":\"SmrtJobEvent\",\"qualifiedName\":\"@happyvertical/smrt-jobs:SmrtJobEvent\",\"collection\":\"smrtjobevents\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/jobs/src/smrt-job-event.ts\",\"packageName\":\"@happyvertical/smrt-jobs\",\"fields\":{\"tenantId\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"sqlType\":\"UUID\",\"nullable\":true,\"__tenancy\":{\"isTenantIdField\":true,\"autoFilter\":true,\"required\":false,\"autoPopulate\":true,\"nullable\":true,\"mode\":\"optional\",\"field\":\"tenantId\",\"allowSuperAdminBypass\":false}}},\"jobId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"SmrtJob\",\"_meta\":{\"required\":true}},\"type\":{\"type\":\"text\",\"required\":true,\"default\":\"log\",\"_meta\":{\"required\":true,\"default\":\"log\"}},\"level\":{\"type\":\"text\",\"required\":true,\"default\":\"info\",\"_meta\":{\"required\":true,\"default\":\"info\"}},\"stage\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"progress\":{\"type\":\"integer\",\"required\":false,\"_meta\":{\"nullable\":true}},\"message\":{\"type\":\"text\",\"required\":true,\"default\":\"\",\"_meta\":{\"required\":true,\"default\":\"\"}},\"data\":{\"type\":\"json\",\"required\":false,\"_meta\":{}},\"createdAt\":{\"type\":\"datetime\",\"required\":true,\"_meta\":{\"required\":true}}},\"methods\":{\"toCursor\":{\"name\":\"toCursor\",\"async\":false,\"parameters\":[],\"returnType\":\"string\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"_smrt_job_events\",\"api\":false,\"cli\":{\"include\":[\"list\",\"get\"],\"http\":false,\"skipApiCheck\":true},\"mcp\":false,\"tenantScoped\":{\"mode\":\"optional\"}},\"extends\":\"SmrtObject\",\"exportName\":\"SmrtJobEvent\",\"collectionExportName\":\"SmrtJobEventCollection\",\"validationRules\":[{\"field\":\"jobId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"},{\"field\":\"type\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"level\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"message\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"createdAt\",\"rule\":\"required\",\"fieldType\":\"datetime\"}],\"schema\":{\"tableName\":\"_smrt_job_events\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"_smrt_job_events\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"tenant_id\\\" UUID,\\n \\\"job_id\\\" UUID NOT NULL,\\n \\\"type\\\" TEXT NOT NULL DEFAULT 'log',\\n \\\"level\\\" TEXT NOT NULL DEFAULT 'info',\\n \\\"stage\\\" TEXT,\\n \\\"progress\\\" INTEGER,\\n \\\"message\\\" TEXT NOT NULL DEFAULT '',\\n \\\"data\\\" JSON\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"tenantId\",\"notNull\":false,\"unique\":false},\"job_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false},\"type\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"log\"},\"level\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"info\"},\"stage\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"progress\":{\"type\":\"INTEGER\",\"notNull\":false,\"unique\":false},\"message\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"\"},\"data\":{\"type\":\"JSON\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"_smrt_job_events_id_idx\",\"columns\":[\"id\"]},{\"name\":\"_smrt_job_events_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"8a9faeec\"}},\"@happyvertical/smrt-jobs:SmrtJobEventCollection\":{\"name\":\"smrtjobeventcollection\",\"className\":\"SmrtJobEventCollection\",\"qualifiedName\":\"@happyvertical/smrt-jobs:SmrtJobEventCollection\",\"collection\":\"smrtjobevents\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/jobs/src/smrt-job-event.ts\",\"packageName\":\"@happyvertical/smrt-jobs\",\"fields\":{},\"methods\":{\"initialize\":{\"name\":\"initialize\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise\",\"isStatic\":false,\"isPublic\":true},\"append\":{\"name\":\"append\",\"async\":true,\"parameters\":[{\"name\":\"input\",\"type\":\"SmrtJobEventData\",\"optional\":false}],\"returnType\":\"Promise<SmrtJobEvent>\",\"isStatic\":false,\"isPublic\":true},\"listByJob\":{\"name\":\"listByJob\",\"async\":true,\"parameters\":[{\"name\":\"jobId\",\"type\":\"string\",\"optional\":false},{\"name\":\"options\",\"type\":\"ListJobEventsOptions\",\"optional\":true}],\"returnType\":\"Promise<SmrtJobEvent[]>\",\"isStatic\":false,\"isPublic\":true},\"listSinceCursor\":{\"name\":\"listSinceCursor\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"any\",\"optional\":true}],\"returnType\":\"Promise<SmrtJobEvent[]>\",\"isStatic\":false,\"isPublic\":true},\"latestProgressByJobIds\":{\"name\":\"latestProgressByJobIds\",\"async\":true,\"parameters\":[{\"name\":\"jobIds\",\"type\":\"string[]\",\"optional\":false},{\"name\":\"options\",\"type\":\"object\",\"optional\":true}],\"returnType\":\"Promise<Map<string, SmrtJobEvent>>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"_smrt_job_events\"},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"SmrtJobEvent\",\"exportName\":\"SmrtJobEventCollection\",\"collectionExportName\":\"SmrtJobEventCollectionCollection\",\"schema\":{\"tableName\":\"_smrt_job_events\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"_smrt_job_events\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"_smrt_job_events_id_idx\",\"columns\":[\"id\"]},{\"name\":\"_smrt_job_events_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"bcf5b3bc\"}},\"@happyvertical/smrt-jobs:SmrtJob\":{\"name\":\"smrtjob\",\"className\":\"SmrtJob\",\"qualifiedName\":\"@happyvertical/smrt-jobs:SmrtJob\",\"collection\":\"smrtjobs\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/jobs/src/smrt-job.ts\",\"packageName\":\"@happyvertical/smrt-jobs\",\"fields\":{\"tenantId\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"sqlType\":\"UUID\",\"nullable\":true,\"__tenancy\":{\"isTenantIdField\":true,\"autoFilter\":true,\"required\":false,\"autoPopulate\":true,\"nullable\":true,\"mode\":\"optional\",\"field\":\"tenantId\",\"allowSuperAdminBypass\":false}}},\"queue\":{\"type\":\"text\",\"required\":true,\"default\":\"default\",\"_meta\":{\"required\":true,\"default\":\"default\"}},\"objectType\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true}},\"objectId\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"method\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true}},\"args\":{\"type\":\"json\",\"required\":false,\"_meta\":{}},\"runAt\":{\"type\":\"datetime\",\"required\":true,\"_meta\":{\"required\":true}},\"priority\":{\"type\":\"integer\",\"required\":true,\"default\":50,\"_meta\":{\"required\":true,\"default\":50}},\"status\":{\"type\":\"text\",\"required\":true,\"default\":\"pending\",\"_meta\":{\"required\":true,\"default\":\"pending\"}},\"attempts\":{\"type\":\"integer\",\"required\":true,\"default\":0,\"_meta\":{\"required\":true,\"default\":0}},\"maxAttempts\":{\"type\":\"integer\",\"required\":true,\"default\":3,\"_meta\":{\"required\":true,\"default\":3}},\"timeout\":{\"type\":\"integer\",\"required\":true,\"default\":300000,\"_meta\":{\"required\":true,\"default\":300000}},\"timeoutBehavior\":{\"type\":\"text\",\"required\":true,\"default\":\"fail\",\"_meta\":{\"required\":true,\"default\":\"fail\"}},\"startedAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}},\"completedAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}},\"lastError\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"resultPointer\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"retryStrategy\":{\"type\":\"json\",\"required\":false,\"_meta\":{}},\"workerId\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"workerHeartbeat\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}}},\"methods\":{\"save\":{\"name\":\"save\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise\",\"isStatic\":false,\"isPublic\":true},\"retry\":{\"name\":\"retry\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"cancel\":{\"name\":\"cancel\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"getDescription\":{\"name\":\"getDescription\",\"async\":false,\"parameters\":[],\"returnType\":\"string\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"_smrt_jobs\",\"api\":false,\"cli\":{\"include\":[\"list\",\"get\",\"retry\",\"cancel\"],\"skipApiCheck\":true,\"http\":false},\"mcp\":false,\"tenantScoped\":{\"mode\":\"optional\"}},\"extends\":\"SmrtObject\",\"exportName\":\"SmrtJob\",\"collectionExportName\":\"SmrtJobCollection\",\"validationRules\":[{\"field\":\"queue\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"objectType\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"method\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"runAt\",\"rule\":\"required\",\"fieldType\":\"datetime\"},{\"field\":\"priority\",\"rule\":\"required\",\"fieldType\":\"integer\"},{\"field\":\"status\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"attempts\",\"rule\":\"required\",\"fieldType\":\"integer\"},{\"field\":\"maxAttempts\",\"rule\":\"required\",\"fieldType\":\"integer\"},{\"field\":\"timeout\",\"rule\":\"required\",\"fieldType\":\"integer\"},{\"field\":\"timeoutBehavior\",\"rule\":\"required\",\"fieldType\":\"text\"}],\"schema\":{\"tableName\":\"_smrt_jobs\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"_smrt_jobs\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"tenant_id\\\" UUID,\\n \\\"queue\\\" TEXT NOT NULL DEFAULT 'default',\\n \\\"object_type\\\" TEXT NOT NULL,\\n \\\"object_id\\\" TEXT,\\n \\\"method\\\" TEXT NOT NULL,\\n \\\"args\\\" JSON,\\n \\\"run_at\\\" TIMESTAMP NOT NULL,\\n \\\"priority\\\" INTEGER NOT NULL DEFAULT 50,\\n \\\"status\\\" TEXT NOT NULL DEFAULT 'pending',\\n \\\"attempts\\\" INTEGER NOT NULL DEFAULT 0,\\n \\\"max_attempts\\\" INTEGER NOT NULL DEFAULT 3,\\n \\\"timeout\\\" INTEGER NOT NULL DEFAULT 300000,\\n \\\"timeout_behavior\\\" TEXT NOT NULL DEFAULT 'fail',\\n \\\"started_at\\\" TIMESTAMP,\\n \\\"completed_at\\\" TIMESTAMP,\\n \\\"last_error\\\" TEXT,\\n \\\"result_pointer\\\" TEXT,\\n \\\"retry_strategy\\\" JSON,\\n \\\"worker_id\\\" TEXT,\\n \\\"worker_heartbeat\\\" TIMESTAMP\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"tenantId\",\"notNull\":false,\"unique\":false},\"queue\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"default\"},\"object_type\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"object_id\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"method\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"args\":{\"type\":\"JSON\",\"notNull\":false,\"unique\":false},\"run_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"unique\":false},\"priority\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":50},\"status\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"pending\"},\"attempts\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":0},\"max_attempts\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":3},\"timeout\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":300000},\"timeout_behavior\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"fail\"},\"started_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"completed_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"last_error\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"result_pointer\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"retry_strategy\":{\"type\":\"JSON\",\"notNull\":false,\"unique\":false},\"worker_id\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"worker_heartbeat\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"_smrt_jobs_id_idx\",\"columns\":[\"id\"]},{\"name\":\"_smrt_jobs_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"0e543f33\"}},\"@happyvertical/smrt-jobs:SmrtJobCollection\":{\"name\":\"smrtjobcollection\",\"className\":\"SmrtJobCollection\",\"qualifiedName\":\"@happyvertical/smrt-jobs:SmrtJobCollection\",\"collection\":\"smrtjobs\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/jobs/src/smrt-job.ts\",\"packageName\":\"@happyvertical/smrt-jobs\",\"fields\":{},\"methods\":{\"initialize\":{\"name\":\"initialize\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise\",\"isStatic\":false,\"isPublic\":true},\"listByStatus\":{\"name\":\"listByStatus\",\"async\":true,\"parameters\":[{\"name\":\"status\",\"type\":\"JobStatus | JobStatus[]\",\"optional\":false},{\"name\":\"options\",\"type\":\"object\",\"optional\":true}],\"returnType\":\"Promise<SmrtJob[]>\",\"isStatic\":false,\"isPublic\":true},\"listReady\":{\"name\":\"listReady\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"object\",\"optional\":true}],\"returnType\":\"Promise<SmrtJob[]>\",\"isStatic\":false,\"isPublic\":true},\"claimReady\":{\"name\":\"claimReady\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"ClaimReadyOptions\",\"optional\":false}],\"returnType\":\"Promise<SmrtJob[]>\",\"isStatic\":false,\"isPublic\":true},\"countInFlightForTenant\":{\"name\":\"countInFlightForTenant\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string | null\",\"optional\":false}],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true},\"enqueueJob\":{\"name\":\"enqueueJob\",\"async\":true,\"parameters\":[{\"name\":\"data\",\"type\":\"SmrtJobData\",\"optional\":false},{\"name\":\"options\",\"type\":\"EnqueueJobOptions\",\"optional\":true}],\"returnType\":\"Promise<SmrtJob>\",\"isStatic\":false,\"isPublic\":true},\"stats\":{\"name\":\"stats\",\"async\":true,\"parameters\":[{\"name\":\"queue\",\"type\":\"string\",\"optional\":true}],\"returnType\":\"Promise<object>\",\"isStatic\":false,\"isPublic\":true},\"cleanup\":{\"name\":\"cleanup\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"object\",\"optional\":false}],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"_smrt_jobs\"},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"SmrtJob\",\"exportName\":\"SmrtJobCollection\",\"collectionExportName\":\"SmrtJobCollectionCollection\",\"schema\":{\"tableName\":\"_smrt_jobs\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"_smrt_jobs\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"_smrt_jobs_id_idx\",\"columns\":[\"id\"]},{\"name\":\"_smrt_jobs_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"d99c04d1\"}},\"@happyvertical/smrt-jobs:SmrtWorker\":{\"name\":\"smrtworker\",\"className\":\"SmrtWorker\",\"qualifiedName\":\"@happyvertical/smrt-jobs:SmrtWorker\",\"collection\":\"smrtworkers\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/jobs/src/smrt-worker.ts\",\"packageName\":\"@happyvertical/smrt-jobs\",\"fields\":{\"workerId\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true}},\"pid\":{\"type\":\"integer\",\"required\":false,\"_meta\":{\"nullable\":true}},\"hostname\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"startedAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}},\"heartbeatAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}},\"leaseExpiresAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}},\"status\":{\"type\":\"text\",\"required\":true,\"default\":\"running\",\"_meta\":{\"required\":true,\"default\":\"running\"}}},\"methods\":{},\"decoratorConfig\":{\"tableName\":\"_smrt_workers\",\"conflictColumns\":[\"worker_id\"],\"api\":false,\"cli\":false,\"mcp\":false},\"extends\":\"SmrtObject\",\"exportName\":\"SmrtWorker\",\"collectionExportName\":\"SmrtWorkerCollection\",\"validationRules\":[{\"field\":\"workerId\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"status\",\"rule\":\"required\",\"fieldType\":\"text\"}],\"schema\":{\"tableName\":\"_smrt_workers\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"_smrt_workers\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"worker_id\\\" TEXT NOT NULL,\\n \\\"pid\\\" INTEGER,\\n \\\"hostname\\\" TEXT,\\n \\\"started_at\\\" TIMESTAMP,\\n \\\"heartbeat_at\\\" TIMESTAMP,\\n \\\"lease_expires_at\\\" TIMESTAMP,\\n \\\"status\\\" TEXT NOT NULL DEFAULT 'running'\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"worker_id\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"pid\":{\"type\":\"INTEGER\",\"notNull\":false,\"unique\":false},\"hostname\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"started_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"heartbeat_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"lease_expires_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"status\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"running\"}},\"indexes\":[{\"name\":\"_smrt_workers_id_idx\",\"columns\":[\"id\"]},{\"name\":\"_smrt_workers_worker_id_idx\",\"columns\":[\"worker_id\"],\"unique\":true}],\"version\":\"bfaad669\"}},\"@happyvertical/smrt-jobs:SmrtWorkerCollection\":{\"name\":\"smrtworkercollection\",\"className\":\"SmrtWorkerCollection\",\"qualifiedName\":\"@happyvertical/smrt-jobs:SmrtWorkerCollection\",\"collection\":\"smrtworkers\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/jobs/src/smrt-worker.ts\",\"packageName\":\"@happyvertical/smrt-jobs\",\"fields\":{},\"methods\":{\"assertReady\":{\"name\":\"assertReady\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"tableReady\":{\"name\":\"tableReady\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"registerWorker\":{\"name\":\"registerWorker\",\"async\":true,\"parameters\":[{\"name\":\"input\",\"type\":\"RegisterWorkerInput\",\"optional\":false}],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"renewLease\":{\"name\":\"renewLease\",\"async\":true,\"parameters\":[{\"name\":\"workerKey\",\"type\":\"string\",\"optional\":false},{\"name\":\"leaseTtlMs\",\"type\":\"number\",\"optional\":false}],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"expireWorker\":{\"name\":\"expireWorker\",\"async\":true,\"parameters\":[{\"name\":\"workerKey\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"freshLeaseWorkerKeys\":{\"name\":\"freshLeaseWorkerKeys\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<Set<string>>\",\"isStatic\":false,\"isPublic\":true},\"pruneExpired\":{\"name\":\"pruneExpired\",\"async\":true,\"parameters\":[{\"name\":\"graceMs\",\"type\":\"number\",\"optional\":false}],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"_smrt_workers\"},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"SmrtWorker\",\"exportName\":\"SmrtWorkerCollection\",\"collectionExportName\":\"SmrtWorkerCollectionCollection\",\"schema\":{\"tableName\":\"_smrt_workers\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"_smrt_workers\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"_smrt_workers_id_idx\",\"columns\":[\"id\"]},{\"name\":\"_smrt_workers_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"d3a7edbd\"}}},\"moduleType\":\"smrt\",\"smrtDependencies\":[\"@happyvertical/smrt-core\",\"@happyvertical/smrt-tenancy\"]}"));
11
11
  //#endregion
12
12
  //#region src/background-policy.ts
13
13
  var MAX_JOB_RETRIES = 25;
@@ -1538,4 +1538,4 @@ function createTaskRunner(config) {
1538
1538
  //#endregion
1539
1539
  export { markBackgroundEligible as S, assertWithinTenantCreationCap as _, SmrtWorker as a, getBackgroundEligibleMethods as b, SmrtJobEventCollection as c, JobContextLogger as d, redactErrorForPersistence as f, TenantJobCapExceededError as g, MAX_JOB_RETRIES as h, DEFAULT_TASK_HEARTBEAT_INTERVAL_MS as i, SmrtJob as l, DEFAULT_TENANT_JOB_CAP as m, TaskRunner as n, SmrtWorkerCollection as o, redactErrorMessage as p, createTaskRunner as r, SmrtJobEvent as s, JobTimeoutError as t, SmrtJobCollection as u, backgroundEligible as v, isBackgroundEligibleMethod as x, clampRetries as y };
1540
1540
 
1541
- //# sourceMappingURL=runner-CbGCiepJ.js.map
1541
+ //# sourceMappingURL=runner-gUEmy0vg.js.map