@happyvertical/smrt-jobs 0.40.61 → 0.40.62
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 +19 -0
- package/dist/chunks/{runner-CBmjeCLX.js → runner-DwSN-ZHr.js} +268 -8
- package/dist/chunks/runner-DwSN-ZHr.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/logger-extension.d.ts +8 -0
- package/dist/logger-extension.d.ts.map +1 -1
- package/dist/manifest.json +64 -3
- package/dist/mcp-task.d.ts +97 -0
- package/dist/mcp-task.d.ts.map +1 -0
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +1 -1
- package/dist/smrt-job.d.ts +26 -0
- package/dist/smrt-job.d.ts.map +1 -1
- package/dist/smrt-knowledge.json +33 -3
- package/package.json +7 -7
- package/dist/chunks/runner-CBmjeCLX.js.map +0 -1
package/README.md
CHANGED
|
@@ -117,6 +117,25 @@ runner.on('job:failed', (job, error) => { /* ... */ });
|
|
|
117
117
|
process.on('SIGTERM', () => runner.stop());
|
|
118
118
|
```
|
|
119
119
|
|
|
120
|
+
### Back MCP task operations with durable jobs
|
|
121
|
+
|
|
122
|
+
`McpTaskStore` persists the MCP `io.modelcontextprotocol/tasks` lifecycle on
|
|
123
|
+
the same `_smrt_jobs` row that executes the operation. `createTask()` creates a
|
|
124
|
+
correlated job, `getTask()` maps its queue state, and `cancelTask()` cancels
|
|
125
|
+
that exact job without leaving a second record behind. Long-running task
|
|
126
|
+
actions can request client input through `JobExecutionContext.task`:
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
async generate(options: Record<string, never>, context: JobExecutionContext) {
|
|
130
|
+
const { tone } = await context.task!.requestInput({ tone: { type: 'string' } });
|
|
131
|
+
return this.render(tone);
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Run a `TaskRunner` for the `mcp-tasks` queue in application deployments. Task
|
|
136
|
+
cancellation is cooperative: the job row becomes cancelled immediately and a
|
|
137
|
+
running handler must observe its context before doing further side effects.
|
|
138
|
+
|
|
120
139
|
### Liveness-safe job execution
|
|
121
140
|
|
|
122
141
|
`TaskRunner` records heartbeat telemetry, but recovery keys on a worker
|
|
@@ -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
|
-
import { ObjectRegistry, SmrtCollection, SmrtObject, detectEngine, ensureJobEventsSystemTableCompatibility, ensureJobsSystemTableCompatibility, field, foreignKey, getClassConfigResolvers, resolveLazyConfig, smrt } from "@happyvertical/smrt-core";
|
|
2
|
+
import { ObjectRegistry, SmrtCollection, SmrtObject, detectEngine, ensureJobEventsSystemTableCompatibility, ensureJobsSystemTableCompatibility, field, foreignKey, getClassConfigResolvers, normalizeCustomActionFailure, resolveLazyConfig, smrt } from "@happyvertical/smrt-core";
|
|
3
3
|
import { TenantContext, TenantScoped, getTenantId, tenantId } from "@happyvertical/smrt-tenancy";
|
|
4
4
|
import { fromConfig } from "@happyvertical/jobs";
|
|
5
|
+
import { createId } from "@happyvertical/utils";
|
|
5
6
|
import { EventEmitter } from "node:events";
|
|
6
7
|
import { Worker } from "node:worker_threads";
|
|
7
8
|
import { createLogger } from "@happyvertical/logger";
|
|
8
|
-
import { createId } from "@happyvertical/utils";
|
|
9
9
|
//#region src/__smrt-register__.ts
|
|
10
|
-
ObjectRegistry.registerPackageManifest(JSON.parse("{\"version\":\"1.0.0\",\"timestamp\":0,\"packageName\":\"@happyvertical/smrt-jobs\",\"packageVersion\":\"0.40.61\",\"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\":{\"api\":false,\"cli\":false,\"mcp\":false,\"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\"]}"));
|
|
10
|
+
ObjectRegistry.registerPackageManifest(JSON.parse("{\"version\":\"1.0.0\",\"timestamp\":0,\"packageName\":\"@happyvertical/smrt-jobs\",\"packageVersion\":\"0.40.62\",\"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\":{\"api\":false,\"cli\":false,\"mcp\":false,\"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}},\"taskId\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true,\"unique\":true}},\"taskOwnerId\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"taskResult\":{\"type\":\"json\",\"required\":false,\"_meta\":{\"nullable\":true}},\"taskInputRequests\":{\"type\":\"json\",\"required\":false,\"_meta\":{\"nullable\":true}},\"taskInputResponses\":{\"type\":\"json\",\"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 \\\"task_id\\\" TEXT UNIQUE,\\n \\\"task_owner_id\\\" TEXT,\\n \\\"task_result\\\" JSON,\\n \\\"task_input_requests\\\" JSON,\\n \\\"task_input_responses\\\" JSON,\\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},\"task_id\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":true},\"task_owner_id\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"task_result\":{\"type\":\"JSON\",\"notNull\":false,\"unique\":false},\"task_input_requests\":{\"type\":\"JSON\",\"notNull\":false,\"unique\":false},\"task_input_responses\":{\"type\":\"JSON\",\"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\":\"43e1324f\"}},\"@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;
|
|
@@ -136,6 +136,11 @@ var SmrtJob = class extends SmrtObject {
|
|
|
136
136
|
completedAt = null;
|
|
137
137
|
lastError = null;
|
|
138
138
|
resultPointer = null;
|
|
139
|
+
taskId = null;
|
|
140
|
+
taskOwnerId = null;
|
|
141
|
+
taskResult = null;
|
|
142
|
+
taskInputRequests = null;
|
|
143
|
+
taskInputResponses = null;
|
|
139
144
|
retryStrategy = {
|
|
140
145
|
type: "exponential",
|
|
141
146
|
config: {
|
|
@@ -257,6 +262,27 @@ __decorateClass$2([field({
|
|
|
257
262
|
type: "text",
|
|
258
263
|
nullable: true
|
|
259
264
|
})], SmrtJob.prototype, "resultPointer", 2);
|
|
265
|
+
__decorateClass$2([field({
|
|
266
|
+
type: "text",
|
|
267
|
+
nullable: true,
|
|
268
|
+
unique: true
|
|
269
|
+
})], SmrtJob.prototype, "taskId", 2);
|
|
270
|
+
__decorateClass$2([field({
|
|
271
|
+
type: "text",
|
|
272
|
+
nullable: true
|
|
273
|
+
})], SmrtJob.prototype, "taskOwnerId", 2);
|
|
274
|
+
__decorateClass$2([field({
|
|
275
|
+
type: "json",
|
|
276
|
+
nullable: true
|
|
277
|
+
})], SmrtJob.prototype, "taskResult", 2);
|
|
278
|
+
__decorateClass$2([field({
|
|
279
|
+
type: "json",
|
|
280
|
+
nullable: true
|
|
281
|
+
})], SmrtJob.prototype, "taskInputRequests", 2);
|
|
282
|
+
__decorateClass$2([field({
|
|
283
|
+
type: "json",
|
|
284
|
+
nullable: true
|
|
285
|
+
})], SmrtJob.prototype, "taskInputResponses", 2);
|
|
260
286
|
__decorateClass$2([field({ type: "json" })], SmrtJob.prototype, "retryStrategy", 2);
|
|
261
287
|
__decorateClass$2([field({
|
|
262
288
|
type: "text",
|
|
@@ -489,6 +515,228 @@ function timestamp(value) {
|
|
|
489
515
|
return value?.getTime() ?? 0;
|
|
490
516
|
}
|
|
491
517
|
//#endregion
|
|
518
|
+
//#region src/mcp-task.ts
|
|
519
|
+
var MCP_TASKS_EXTENSION = "io.modelcontextprotocol/tasks";
|
|
520
|
+
function createMcpTaskResult(result) {
|
|
521
|
+
const publicResult = toPublicTaskData(result) ?? null;
|
|
522
|
+
return {
|
|
523
|
+
content: [{
|
|
524
|
+
type: "text",
|
|
525
|
+
text: JSON.stringify(publicResult)
|
|
526
|
+
}],
|
|
527
|
+
structuredContent: { data: publicResult }
|
|
528
|
+
};
|
|
529
|
+
}
|
|
530
|
+
var McpTaskNotFoundError = class extends Error {
|
|
531
|
+
constructor(taskId) {
|
|
532
|
+
super(`MCP task not found: ${taskId}`);
|
|
533
|
+
this.name = "McpTaskNotFoundError";
|
|
534
|
+
}
|
|
535
|
+
};
|
|
536
|
+
var McpTaskCancelledError = class extends Error {
|
|
537
|
+
constructor(taskId) {
|
|
538
|
+
super(`MCP task was cancelled: ${taskId}`);
|
|
539
|
+
this.name = "McpTaskCancelledError";
|
|
540
|
+
}
|
|
541
|
+
};
|
|
542
|
+
var McpTaskStore = class McpTaskStore {
|
|
543
|
+
constructor(collection, options) {
|
|
544
|
+
this.collection = collection;
|
|
545
|
+
this.ownerId = options.ownerId ?? null;
|
|
546
|
+
this.pollIntervalMs = options.pollIntervalMs ?? 250;
|
|
547
|
+
this.ttlMs = options.ttlMs ?? 864e5;
|
|
548
|
+
}
|
|
549
|
+
collection;
|
|
550
|
+
ownerId;
|
|
551
|
+
pollIntervalMs;
|
|
552
|
+
ttlMs;
|
|
553
|
+
static async create(db, options = {}) {
|
|
554
|
+
const collection = await SmrtJobCollection.create({ db });
|
|
555
|
+
return new McpTaskStore(collection, options);
|
|
556
|
+
}
|
|
557
|
+
/** Create one pending job and return its immediately-pollable task projection. */
|
|
558
|
+
async createTask(input) {
|
|
559
|
+
const taskId = createId();
|
|
560
|
+
const pollIntervalMs = input.pollIntervalMs ?? this.pollIntervalMs;
|
|
561
|
+
const ttlMs = input.ttlMs ?? this.ttlMs;
|
|
562
|
+
const args = {
|
|
563
|
+
_mcpTask: {
|
|
564
|
+
invocationArgs: input.invocationArgs,
|
|
565
|
+
pollIntervalMs,
|
|
566
|
+
ttlMs
|
|
567
|
+
},
|
|
568
|
+
...input.agentConfig ? { _agentConfig: input.agentConfig } : {}
|
|
569
|
+
};
|
|
570
|
+
return taskFromJob(await this.collection.enqueueJob({
|
|
571
|
+
tenantId: input.tenantId ?? null,
|
|
572
|
+
queue: "mcp-tasks",
|
|
573
|
+
objectType: input.objectType,
|
|
574
|
+
objectId: input.objectId,
|
|
575
|
+
method: input.method,
|
|
576
|
+
args,
|
|
577
|
+
timeout: input.timeout,
|
|
578
|
+
taskId,
|
|
579
|
+
taskOwnerId: this.ownerId,
|
|
580
|
+
taskInputRequests: null,
|
|
581
|
+
taskInputResponses: null
|
|
582
|
+
}), {
|
|
583
|
+
pollIntervalMs,
|
|
584
|
+
ttlMs
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
/** Get a task only when it belongs to this store's principal. */
|
|
588
|
+
async getTask(taskId) {
|
|
589
|
+
const job = await this.findTaskJob(taskId);
|
|
590
|
+
return taskFromJob(job, getMcpTaskMarker(job) ?? {
|
|
591
|
+
pollIntervalMs: this.pollIntervalMs,
|
|
592
|
+
ttlMs: this.ttlMs
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
/**
|
|
596
|
+
* Persist only values requested by an outstanding `requestInput()` call.
|
|
597
|
+
* Unknown and already-consumed keys are intentionally ignored per SEP-2663.
|
|
598
|
+
*/
|
|
599
|
+
async updateTask(taskId, inputResponses) {
|
|
600
|
+
const job = await this.findTaskJob(taskId);
|
|
601
|
+
const requested = asRecord(job.taskInputRequests);
|
|
602
|
+
if (Object.keys(requested).length === 0) return;
|
|
603
|
+
const accepted = { ...asRecord(job.taskInputResponses) };
|
|
604
|
+
for (const key of Object.keys(requested)) if (Object.hasOwn(inputResponses, key)) accepted[key] = inputResponses[key];
|
|
605
|
+
await this.collection.query(`UPDATE _smrt_jobs
|
|
606
|
+
SET task_input_responses = ?, updated_at = ?
|
|
607
|
+
WHERE id = ? AND task_id = ?`, [
|
|
608
|
+
JSON.stringify(accepted),
|
|
609
|
+
(/* @__PURE__ */ new Date()).toISOString(),
|
|
610
|
+
job.id,
|
|
611
|
+
taskId
|
|
612
|
+
], { allowRawOnTenantScoped: true });
|
|
613
|
+
}
|
|
614
|
+
/**
|
|
615
|
+
* Cooperatively cancel the backing job. A completion race cannot resurrect
|
|
616
|
+
* it because TaskRunner terminal writes require `status = 'running'`.
|
|
617
|
+
*/
|
|
618
|
+
async cancelTask(taskId) {
|
|
619
|
+
const job = await this.findTaskJob(taskId);
|
|
620
|
+
if (job.status === "completed" || job.status === "failed" || job.status === "cancelled") return;
|
|
621
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
622
|
+
await this.collection.query(`UPDATE _smrt_jobs
|
|
623
|
+
SET status = 'cancelled', completed_at = ?, updated_at = ?
|
|
624
|
+
WHERE id = ? AND task_id = ? AND status IN ('pending', 'running')`, [
|
|
625
|
+
now,
|
|
626
|
+
now,
|
|
627
|
+
job.id,
|
|
628
|
+
taskId
|
|
629
|
+
], { allowRawOnTenantScoped: true });
|
|
630
|
+
}
|
|
631
|
+
async findTaskJob(taskId) {
|
|
632
|
+
const ownerPredicate = this.ownerId === null ? "task_owner_id IS NULL" : "task_owner_id = ?";
|
|
633
|
+
const params = this.ownerId === null ? [taskId] : [taskId, this.ownerId];
|
|
634
|
+
const job = (await this.collection.query(`SELECT * FROM _smrt_jobs WHERE task_id = ? AND ${ownerPredicate} LIMIT 1`, params, { allowRawOnTenantScoped: true }))[0];
|
|
635
|
+
if (!job) throw new McpTaskNotFoundError(taskId);
|
|
636
|
+
return job;
|
|
637
|
+
}
|
|
638
|
+
};
|
|
639
|
+
function getMcpTaskMarker(job) {
|
|
640
|
+
const marker = asRecord(asRecord(job.args)._mcpTask);
|
|
641
|
+
if (!Array.isArray(marker.invocationArgs)) return null;
|
|
642
|
+
return {
|
|
643
|
+
invocationArgs: marker.invocationArgs,
|
|
644
|
+
pollIntervalMs: asPositiveInt(marker.pollIntervalMs, 250),
|
|
645
|
+
ttlMs: asPositiveInt(marker.ttlMs, 864e5)
|
|
646
|
+
};
|
|
647
|
+
}
|
|
648
|
+
async function requestMcpTaskInput(db, job, inputRequests) {
|
|
649
|
+
const jobId = job.id;
|
|
650
|
+
const taskId = job.taskId;
|
|
651
|
+
if (!jobId || !taskId || !job.workerId) throw new Error("Task input is only available while an MCP task job is running");
|
|
652
|
+
if (Object.keys(inputRequests).length === 0) return {};
|
|
653
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
654
|
+
await db.query(`UPDATE _smrt_jobs
|
|
655
|
+
SET task_input_requests = ?, task_input_responses = NULL, updated_at = ?
|
|
656
|
+
WHERE id = ? AND task_id = ? AND worker_id = ? AND status = 'running'`, JSON.stringify(inputRequests), now, jobId, taskId, job.workerId);
|
|
657
|
+
while (true) {
|
|
658
|
+
const row = (await db.query(`SELECT status, task_input_responses FROM _smrt_jobs WHERE id = ? AND task_id = ?`, jobId, taskId)).rows[0];
|
|
659
|
+
if (!row || row.status === "cancelled") throw new McpTaskCancelledError(taskId);
|
|
660
|
+
if (row.status !== "running") throw new Error(`MCP task is no longer running: ${taskId}`);
|
|
661
|
+
const responses = asRecord(parseJson(row.task_input_responses));
|
|
662
|
+
if (Object.keys(inputRequests).every((key) => Object.hasOwn(responses, key))) {
|
|
663
|
+
const selected = Object.fromEntries(Object.keys(inputRequests).map((key) => [key, responses[key]]));
|
|
664
|
+
await db.query(`UPDATE _smrt_jobs
|
|
665
|
+
SET task_input_requests = NULL, updated_at = ?
|
|
666
|
+
WHERE id = ? AND task_id = ? AND worker_id = ? AND status = 'running'`, (/* @__PURE__ */ new Date()).toISOString(), jobId, taskId, job.workerId);
|
|
667
|
+
return selected;
|
|
668
|
+
}
|
|
669
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
function taskFromJob(job, marker) {
|
|
673
|
+
const status = taskStatusFromJob(job);
|
|
674
|
+
const createdAt = toIso(job.created_at) ?? (/* @__PURE__ */ new Date()).toISOString();
|
|
675
|
+
const lastUpdatedAt = toIso(job.updated_at) ?? createdAt;
|
|
676
|
+
const task = {
|
|
677
|
+
taskId: job.taskId ?? "",
|
|
678
|
+
status,
|
|
679
|
+
createdAt,
|
|
680
|
+
lastUpdatedAt,
|
|
681
|
+
ttlMs: marker.ttlMs,
|
|
682
|
+
pollIntervalMs: marker.pollIntervalMs
|
|
683
|
+
};
|
|
684
|
+
if (status === "input_required") task.statusMessage = "Waiting for required input";
|
|
685
|
+
if (status === "cancelled") task.statusMessage = "Task cancelled";
|
|
686
|
+
if (status === "failed") {
|
|
687
|
+
task.statusMessage = job.lastError ?? "Task failed";
|
|
688
|
+
task.error = {
|
|
689
|
+
code: -32603,
|
|
690
|
+
message: task.statusMessage
|
|
691
|
+
};
|
|
692
|
+
}
|
|
693
|
+
if (status === "completed" && job.taskResult) task.result = job.taskResult;
|
|
694
|
+
return task;
|
|
695
|
+
}
|
|
696
|
+
function taskStatusFromJob(job) {
|
|
697
|
+
if (job.status === "completed") return "completed";
|
|
698
|
+
if (job.status === "cancelled") return "cancelled";
|
|
699
|
+
if (job.status === "failed") return "failed";
|
|
700
|
+
if (Object.keys(asRecord(job.taskInputRequests)).length > 0) return "input_required";
|
|
701
|
+
return "working";
|
|
702
|
+
}
|
|
703
|
+
function asRecord(value) {
|
|
704
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) return {};
|
|
705
|
+
return value;
|
|
706
|
+
}
|
|
707
|
+
function parseJson(value) {
|
|
708
|
+
if (typeof value !== "string") return value;
|
|
709
|
+
try {
|
|
710
|
+
return JSON.parse(value);
|
|
711
|
+
} catch {
|
|
712
|
+
return {};
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
function asPositiveInt(value, fallback) {
|
|
716
|
+
return typeof value === "number" && Number.isInteger(value) && value > 0 ? value : fallback;
|
|
717
|
+
}
|
|
718
|
+
function toIso(value) {
|
|
719
|
+
if (value instanceof Date) return value.toISOString();
|
|
720
|
+
if (typeof value === "string") return value;
|
|
721
|
+
}
|
|
722
|
+
function toPublicTaskData(value, seen = /* @__PURE__ */ new WeakSet()) {
|
|
723
|
+
if (value === null || typeof value !== "object") return value;
|
|
724
|
+
const publicSource = value;
|
|
725
|
+
if (typeof publicSource.toPublicJSON === "function") return publicSource.toPublicJSON({});
|
|
726
|
+
if (Array.isArray(value)) {
|
|
727
|
+
if (seen.has(value)) return "[Circular]";
|
|
728
|
+
seen.add(value);
|
|
729
|
+
return value.map((entry) => toPublicTaskData(entry, seen));
|
|
730
|
+
}
|
|
731
|
+
const prototype = Object.getPrototypeOf(value);
|
|
732
|
+
if (prototype !== Object.prototype && prototype !== null) return value;
|
|
733
|
+
if (seen.has(value)) return "[Circular]";
|
|
734
|
+
seen.add(value);
|
|
735
|
+
const out = {};
|
|
736
|
+
for (const [key, nested] of Object.entries(value)) out[key] = toPublicTaskData(nested, seen);
|
|
737
|
+
return out;
|
|
738
|
+
}
|
|
739
|
+
//#endregion
|
|
492
740
|
//#region src/smrt-job-event.ts
|
|
493
741
|
var __defProp$1 = Object.defineProperty;
|
|
494
742
|
var __getOwnPropDesc$1 = Object.getOwnPropertyDescriptor;
|
|
@@ -1053,11 +1301,13 @@ var TaskRunner = class extends EventEmitter {
|
|
|
1053
1301
|
status: "completed",
|
|
1054
1302
|
completed_at: completedAt.toISOString(),
|
|
1055
1303
|
result_pointer: result?.resultPointer ?? null,
|
|
1304
|
+
task_result: result?.taskResult ? JSON.stringify(result.taskResult) : null,
|
|
1056
1305
|
updated_at: completedAt.toISOString()
|
|
1057
1306
|
})) {
|
|
1058
1307
|
job.status = "completed";
|
|
1059
1308
|
job.completedAt = completedAt;
|
|
1060
1309
|
job.resultPointer = result?.resultPointer ?? null;
|
|
1310
|
+
job.taskResult = result?.taskResult ?? null;
|
|
1061
1311
|
await this.appendJobEvent(job, {
|
|
1062
1312
|
type: "progress",
|
|
1063
1313
|
level: "info",
|
|
@@ -1143,7 +1393,7 @@ var TaskRunner = class extends EventEmitter {
|
|
|
1143
1393
|
const ObjectClass = registeredClass.constructor;
|
|
1144
1394
|
const rawArgs = job.args ?? {};
|
|
1145
1395
|
const persistedAgentConfig = rawArgs._agentConfig ?? {};
|
|
1146
|
-
const { _agentConfig: _, _scheduleId: __, ...methodArgs } = rawArgs;
|
|
1396
|
+
const { _agentConfig: _, _scheduleId: __, _mcpTask: ___, ...methodArgs } = rawArgs;
|
|
1147
1397
|
const agentConfig = await resolveLazyConfig(persistedAgentConfig, {
|
|
1148
1398
|
classResolvers: getClassConfigResolvers(ObjectClass),
|
|
1149
1399
|
onError: "throw"
|
|
@@ -1182,7 +1432,16 @@ var TaskRunner = class extends EventEmitter {
|
|
|
1182
1432
|
const method = instance[job.method];
|
|
1183
1433
|
if (typeof method !== "function") throw new Error(`Method not found: ${job.objectType}.${job.method}`);
|
|
1184
1434
|
if (!isBackgroundEligibleMethod(ObjectClass, job.method)) throw new Error(`Method not background-eligible: ${job.objectType}.${job.method}`);
|
|
1185
|
-
|
|
1435
|
+
const taskMarker = getMcpTaskMarker(job);
|
|
1436
|
+
const result = taskMarker ? await method.call(instance, ...taskMarker.invocationArgs, executionContext) : await method.call(instance, methodArgs, executionContext);
|
|
1437
|
+
if (taskMarker) {
|
|
1438
|
+
const failure = normalizeCustomActionFailure(result);
|
|
1439
|
+
if (failure) throw new Error(failure.message);
|
|
1440
|
+
}
|
|
1441
|
+
return {
|
|
1442
|
+
result,
|
|
1443
|
+
...taskMarker ? { taskResult: createMcpTaskResult(result) } : {}
|
|
1444
|
+
};
|
|
1186
1445
|
};
|
|
1187
1446
|
if (job.tenantId) return TenantContext.runWithJobContext({ tenantId: job.tenantId }, runJob);
|
|
1188
1447
|
return runJob();
|
|
@@ -1280,7 +1539,8 @@ var TaskRunner = class extends EventEmitter {
|
|
|
1280
1539
|
message,
|
|
1281
1540
|
data
|
|
1282
1541
|
});
|
|
1283
|
-
}
|
|
1542
|
+
},
|
|
1543
|
+
...job.taskId && this.db ? { task: { requestInput: (inputRequests) => requestMcpTaskInput(this.db, job, inputRequests) } } : {}
|
|
1284
1544
|
};
|
|
1285
1545
|
}
|
|
1286
1546
|
async appendJobEvent(job, input) {
|
|
@@ -1536,6 +1796,6 @@ function createTaskRunner(config) {
|
|
|
1536
1796
|
return new TaskRunner(config);
|
|
1537
1797
|
}
|
|
1538
1798
|
//#endregion
|
|
1539
|
-
export { markBackgroundEligible as S, assertWithinTenantCreationCap as _, SmrtWorker as a,
|
|
1799
|
+
export { markBackgroundEligible as A, MAX_JOB_RETRIES as C, clampRetries as D, backgroundEligible as E, getBackgroundEligibleMethods as O, DEFAULT_TENANT_JOB_CAP as S, assertWithinTenantCreationCap as T, SmrtJob as _, SmrtWorker as a, redactErrorForPersistence as b, SmrtJobEventCollection as c, McpTaskNotFoundError as d, McpTaskStore as f, taskFromJob as g, requestMcpTaskInput as h, DEFAULT_TASK_HEARTBEAT_INTERVAL_MS as i, isBackgroundEligibleMethod as k, MCP_TASKS_EXTENSION as l, getMcpTaskMarker as m, TaskRunner as n, SmrtWorkerCollection as o, createMcpTaskResult as p, createTaskRunner as r, SmrtJobEvent as s, JobTimeoutError as t, McpTaskCancelledError as u, SmrtJobCollection as v, TenantJobCapExceededError as w, redactErrorMessage as x, JobContextLogger as y };
|
|
1540
1800
|
|
|
1541
|
-
//# sourceMappingURL=runner-
|
|
1801
|
+
//# sourceMappingURL=runner-DwSN-ZHr.js.map
|