@wildo-ai/saas-models 1.1.8 → 1.1.9
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/dist/esm/companion/provider-discovery.shared.schemas.d.ts +13 -0
- package/dist/esm/companion/provider-discovery.shared.schemas.d.ts.map +1 -1
- package/dist/esm/companion/provider-discovery.shared.schemas.js +13 -0
- package/dist/esm/companion/provider-discovery.shared.schemas.js.map +1 -1
- package/dist/esm/compliance/privacy/operator-compliance-identity.shared.schemas.d.ts +32 -1
- package/dist/esm/compliance/privacy/operator-compliance-identity.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/privacy/operator-compliance-identity.shared.schemas.js +32 -0
- package/dist/esm/compliance/privacy/operator-compliance-identity.shared.schemas.js.map +1 -1
- package/dist/esm/compliance/risk-posture.shared.schemas.d.ts +15 -3
- package/dist/esm/compliance/risk-posture.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/risk-posture.shared.schemas.js +14 -2
- package/dist/esm/compliance/risk-posture.shared.schemas.js.map +1 -1
- package/dist/esm/meta-workflows/elicitation-depth.meta-workflows.shared.schemas.d.ts +128 -0
- package/dist/esm/meta-workflows/elicitation-depth.meta-workflows.shared.schemas.d.ts.map +1 -0
- package/dist/esm/meta-workflows/elicitation-depth.meta-workflows.shared.schemas.js +136 -0
- package/dist/esm/meta-workflows/elicitation-depth.meta-workflows.shared.schemas.js.map +1 -0
- package/dist/esm/meta-workflows/orchestration.meta-workflows.shared.schemas.d.ts +32 -0
- package/dist/esm/meta-workflows/orchestration.meta-workflows.shared.schemas.d.ts.map +1 -1
- package/dist/esm/meta-workflows/orchestration.meta-workflows.shared.schemas.js +66 -1
- package/dist/esm/meta-workflows/orchestration.meta-workflows.shared.schemas.js.map +1 -1
- package/dist/esm/meta-workflows.exports.d.ts +1 -0
- package/dist/esm/meta-workflows.exports.d.ts.map +1 -1
- package/dist/esm/meta-workflows.exports.js +1 -0
- package/dist/esm/meta-workflows.exports.js.map +1 -1
- package/dist/esm/queue/jobs.shared.schemas.d.ts +70 -1
- package/dist/esm/queue/jobs.shared.schemas.d.ts.map +1 -1
- package/dist/esm/queue/jobs.shared.schemas.js +85 -2
- package/dist/esm/queue/jobs.shared.schemas.js.map +1 -1
- package/dist/esm/resources/utils/resources-config-operations.dtos-builder.utils.d.ts +25 -0
- package/dist/esm/resources/utils/resources-config-operations.dtos-builder.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/resources-config-operations.dtos-builder.utils.js +47 -19
- package/dist/esm/resources/utils/resources-config-operations.dtos-builder.utils.js.map +1 -1
- package/package.json +4 -4
- package/dist/esm/__tests__/setup.d.ts +0 -2
- package/dist/esm/__tests__/setup.d.ts.map +0 -1
- package/dist/esm/__tests__/setup.js +0 -19
- package/dist/esm/__tests__/setup.js.map +0 -1
- package/dist/tsconfig.build.tsbuildinfo +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobs.shared.schemas.js","sourceRoot":"","sources":["../../../../src/queue/jobs.shared.schemas.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Jobs Shared Schemas\n *\n * All job-related enums, schemas, and types consolidated in a single file.\n * Includes: job types, statuses, payloads, results, execution tracking, and storage.\n *\n * Resource Design Notes:\n * - JobExecution and JobPayloadStorage are internal system resources\n * - Many fields are marked .isBackendOnly() as they contain sensitive internal data\n * - TTL indexes ensure automatic cleanup\n * - Proper indexes for common query patterns\n */\n\nimport { z } from 'zod';\nimport { ModelCallAttributionInputSchema } from '../flows-actors/work-attribution.shared.schemas';\nimport { DataMode } from '../resources/resources-config.shared.schemas';\nimport { initZodDecorators } from '@wildo-ai/zod-decorators';\nimport { WildoError_BackendSchema, RetryPolicy_BackoffType } from '../errors/errors.shared.schemas';\n\n// Ensure Zod decorators are loaded\ninitZodDecorators(z);\n\n// ============================================================================\n// ENUMS\n// ============================================================================\n\n/**\n * Type of job being processed.\n */\nexport enum JobType {\n /** Standard resource operation (CREATE, READ, UPDATE, DELETE, etc.) */\n RESOURCE_OPERATION = 'resource_operation',\n /** Custom batch job defined in customBatchesFactory */\n CUSTOM_BATCH = 'custom_batch',\n /** Scheduled cron job triggered by crontabs-manager */\n SCHEDULED_CRON = 'scheduled_cron',\n /**\n * Cron-driven minion tick (KD-12 of\n * `.claude/plans/minions-and-workers-implementation.md`).\n *\n * Published by `platform-crontabs-batches-manager` to the application's\n * scheduled queue when a minion's cron schedule fires. The consumer\n * (`MinionTickConsumerBackendService` in `saas-minions-lib`) filters\n * messages by matching the token's `minionName` against the minion's OWN\n * identity — which each minion sources from its compiled-in\n * `defineMinionInit({ minionName })` config (the minion package is\n * domain-specific by construction), cross-validated at boot against the\n * fetched `appConfig.minions[minionName]`. Matched ticks route to the\n * minion's locally-hosted actor system. Identity is NOT read from env:\n * `APP_OWNED_SERVICE_NAME` is deploy-time metadata (and the read-from-env\n * path of the language-pluggable *worker* runtime), never the Node\n * minion's runtime identity source.\n *\n * Dispatch is a pure switch on `jobType` — see `PublishScheduledJobInput`\n * / `ScheduledJobTokenInput` xor that pairs `MINION_TICK` with the\n * `minionName` discriminator.\n */\n MINION_TICK = 'minion_tick',\n}\n\n/**\n * Status of a job through its lifecycle.\n */\nexport enum JobStatus {\n /** Created but not yet queued */\n PENDING = 'pending',\n /** Published to queue */\n QUEUED = 'queued',\n /** Worker started processing */\n PROCESSING = 'processing',\n /** Successfully finished */\n COMPLETED = 'completed',\n /** Failed, retries exhausted */\n FAILED = 'failed',\n /** Failed but will retry */\n RETRYING = 'retrying',\n /** Moved to dead letter queue */\n DEAD_LETTER = 'dead_letter',\n /** Manually cancelled */\n CANCELLED = 'cancelled',\n}\n\n/**\n * Which queue substrate a runtime uses.\n *\n * Read by `bindQueueAdapter()` in `saas-backend-lib`, which is the only place a member is mapped to\n * an implementation — as a total `Record`, so adding a member here is a compile error until somebody\n * says which class serves it.\n *\n * `REDIS` was declared and removed (#502). It had no implementation, no reader and no selection\n * path, and the decision was to build ONE of the two missing adapters rather than both: a vocabulary\n * member offering a choice nothing can make is worse than an absent one, because it reads as a\n * supported deployment. Reinstate it when something needs it, alongside the adapter.\n */\nexport enum QueueAdapterType {\n /** A real broker. The default, and what a deployed application wants: durability across a restart, visibility across processes, permissions per runtime. */\n RABBITMQ = 'rabbitmq',\n /**\n * In-process, no broker. For a test lane that needs real background-work BEHAVIOUR — retry,\n * dead-lettering, delayed redelivery, unacknowledged messages staying unacknowledged — and for a\n * single-process runtime that has declared it wants none of what a broker is bought for.\n */\n MEMORY = 'memory',\n}\n\n/**\n * Who initiated the job.\n */\nexport enum JobInitiator {\n /** Triggered via API call */\n API = 'api',\n /** Triggered by crontabs-batches-manager */\n CRONTAB = 'crontab',\n /** Triggered internally by service */\n INTERNAL = 'internal',\n}\n\n/**\n * Status of a job execution record (for tracking).\n * Similar to JobStatus but specific to the tracking record.\n */\nexport enum JobExecutionStatus {\n /** Created but not yet queued */\n PENDING = 'pending',\n /** Published to queue */\n QUEUED = 'queued',\n /** Worker started processing */\n PROCESSING = 'processing',\n /** Successfully finished */\n COMPLETED = 'completed',\n /** Failed, retries exhausted */\n FAILED = 'failed',\n /** Failed but will retry */\n RETRYING = 'retrying',\n /** Moved to dead letter queue */\n DEAD_LETTER = 'dead_letter',\n /** Manually cancelled */\n CANCELLED = 'cancelled',\n}\n\n/**\n * Compression type for stored payloads.\n */\nexport enum PayloadCompressionType {\n NONE = 'none',\n GZIP = 'gzip',\n}\n\n/**\n * Job priority levels.\n * HIGH and CRITICAL are routed to priority queues.\n */\nexport enum JobPriority {\n LOW = 'low',\n NORMAL = 'normal',\n HIGH = 'high',\n CRITICAL = 'critical',\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/**\n * Threshold for storing payloads externally vs inline.\n * Payloads >= 100KB are stored in MongoDB, referenced by storageId.\n * This prevents RabbitMQ performance issues with large messages.\n */\nexport const PAYLOAD_SIZE_THRESHOLD_BYTES = 100 * 1024; // 100KB\n\n// ============================================================================\n// ZOD ENUM VALUE EXTRACTION (for Zod 4)\n// ============================================================================\n\nconst JobTypeValues = Object.values(JobType) as [string, ...string[]];\nconst JobStatusValues = Object.values(JobStatus) as [string, ...string[]];\nconst JobPriorityValues = Object.values(JobPriority) as [string, ...string[]];\nconst JobInitiatorValues = Object.values(JobInitiator) as [string, ...string[]];\nconst JobExecutionStatusValues = Object.values(JobExecutionStatus) as [string, ...string[]];\nconst PayloadCompressionTypeValues = Object.values(PayloadCompressionType) as [string, ...string[]];\n\n// ============================================================================\n// RETRY BACKOFF CONFIG (shared: operation queueConfig + job transport)\n// ============================================================================\n\n/**\n * App-authorable backoff shape controlling the *timing* of job retries.\n *\n * This is the subset of retry parameters an application developer sets on an\n * operation's `queueConfig.retryConfig` to shape how long a failed job waits\n * before each re-attempt. It is intentionally a partial: the `maxRetries` and\n * `timeoutMs` axes already live at the top of `ResourceConfiguration_QueueConfig`,\n * so they are NOT repeated here (single source of truth per axis).\n *\n * Runtime semantics — when a job fails and is still eligible to retry, the queue\n * worker computes `delay = baseDelayMs × 2^attempt` (for `EXPONENTIAL`; see\n * `JobRetryUtils.calculateDelay` for `FIXED`/`LINEAR`), clamps it to `maxDelayMs`,\n * and holds the message that long in a **durable broker-side delay queue**\n * (RabbitMQ per-queue TTL + dead-letter back to the source queue) before\n * redelivery. The delay is broker-timed, not an in-process sleep, so it survives\n * a worker crash during the wait.\n *\n * All fields are optional; unset fields fall back to `QUEUE_RETRY_DEFAULTS`.\n * Both the authoring surface (`queueConfig.retryConfig`) and the wire payload\n * (`JobPayload.retryConfig`) reuse this exact schema — the enqueue side resolves\n * defaults so the transported object carries fully-resolved values.\n *\n * NOTE: This schema lives in the jobs module (not queues) because\n * `queues.shared.schemas.ts` already imports from here (`JobPriority`); putting\n * it in queues would create an import cycle. It is queue-facing by name.\n *\n * @example\n * // Exponential backoff starting at 2s, capped at 30s:\n * queueConfig: { maxRetries: 5, retryConfig: { baseDelayMs: 2000, maxDelayMs: 30000 } }\n */\nexport const QueueRetryBackoffConfigSchema = z.object({\n /** Base delay in ms — first retry / base of the exponential (or linear) curve. */\n baseDelayMs: z.number().int().min(100).optional(),\n /** Maximum delay cap in ms — prevents unbounded backoff on late attempts. */\n maxDelayMs: z.number().int().min(1000).optional(),\n /** Backoff curve: `fixed` | `linear` | `exponential`. Defaults to `exponential`. */\n retryPolicy: z.enum(RetryPolicy_BackoffType).optional(),\n});\n\nexport type QueueRetryBackoffConfig = z.infer<typeof QueueRetryBackoffConfigSchema>;\n\n/** @wildo_source:part:start saas.models.queue.scheduled-recovery facet:layer:shared facet:audience:app-developer */\n\n/** First receipt is short-lived; persisted recovery has its own policy deadline. */\nexport const SCHEDULED_INITIAL_ADMISSION_MAX_AGE_MS = 5 * 60 * 1000;\nexport const SCHEDULED_INITIAL_ADMISSION_FUTURE_SKEW_MS = 30 * 1000;\n\n/** How the handler's complete effects tolerate execution after an uncertain outcome. */\nexport enum ScheduledReplaySafety {\n /** No automatic repetition; a failed call can already have committed effects. */\n MANUAL = 'manual',\n /** All effects use stable business keys or equivalent idempotency mechanisms. */\n IDEMPOTENT = 'idempotent',\n /** A backend reconciler must establish completion or safety before repetition. */\n RECONCILE = 'reconcile',\n}\n\n/** Durable admission phase, independent from the presentation status of a job. */\nexport enum ScheduledExecutionPhase {\n READY = 'ready',\n RUNNING = 'running',\n RECONCILING = 'reconciling',\n WAITING = 'waiting',\n REVIEW = 'review',\n FINISHED = 'finished',\n}\n\nexport enum ScheduledReconciliationOutcome {\n COMPLETED = 'completed',\n SAFE_TO_RETRY = 'safe_to_retry',\n INCONCLUSIVE = 'inconclusive',\n}\n\n/** Operator decisions are distinct from evidence returned by a handler's reconciler. */\nexport enum ScheduledReviewOutcome {\n CONFIRM_COMPLETED = 'confirm_completed',\n RETRY = 'retry',\n ABANDON = 'abandon',\n}\n\n/** A declaration is a contract, not a mechanism that makes side effects idempotent. */\nexport const ScheduledRecoveryPolicySchema = z.object({\n contractVersion: z.string().min(1).default('1'),\n replaySafety: z.enum(ScheduledReplaySafety).default(ScheduledReplaySafety.MANUAL),\n retryReportedFailures: z.boolean().default(false),\n /** Total admissions, including reconciliation; initial execution consumes one. */\n maxAttempts: z.number().int().min(1).max(100).default(1),\n /** Elapsed horizon from first authenticated receipt, never extended by recovery. */\n maxRecoveryMs: z.number().int().min(1000).max(30 * 24 * 60 * 60 * 1000).default(24 * 60 * 60 * 1000),\n /** Heartbeat lease: expiry means contact was lost, not that the old worker stopped. */\n leaseMs: z.number().int().min(3000).max(60 * 60 * 1000).default(60000),\n backoff: QueueRetryBackoffConfigSchema.optional(),\n jitterRatio: z.number().min(0).max(1).default(0.2),\n}).superRefine((policy, ctx) => {\n if (policy.retryReportedFailures && policy.replaySafety === ScheduledReplaySafety.MANUAL) {\n ctx.addIssue({ code: 'custom', path: ['retryReportedFailures'], message: 'Automatic retry requires idempotent effects or reconciliation.' });\n }\n});\nexport type ScheduledRecoveryPolicy = z.infer<typeof ScheduledRecoveryPolicySchema>;\nexport function normalizeScheduledRecoveryPolicy(policy?: Partial<ScheduledRecoveryPolicy>): ScheduledRecoveryPolicy {\n return ScheduledRecoveryPolicySchema.parse(policy ?? {});\n}\n\n/** Finite, application-owned evidence policy. No policy means no long-term projection. */\nexport const ScheduledEvidencePolicySchema = z.object({\n policyRef: z.string().trim().min(1).max(160),\n /** Absolute expiry is completion plus this duration, never the date an archive retry succeeds. */\n retainForMs: z.number().int().min(86400000).max(3650 * 86400000),\n /** Only these top-level scalar result fields may enter retained evidence. */\n resultFields: z.array(z.string().regex(/^[A-Za-z][A-Za-z0-9_]*$/).max(80)).max(32),\n /** Selected boolean flag identifying deferred business work independently from invocation success. */\n deferredField: z.string().min(1).optional(),\n}).superRefine((policy, ctx) => {\n if (new Set(policy.resultFields).size !== policy.resultFields.length) ctx.addIssue({ code: 'custom', message: 'Evidence result fields must be unique' });\n if (policy.deferredField && !policy.resultFields.includes(policy.deferredField)) {\n ctx.addIssue({ code: 'custom', path: ['deferredField'], message: 'Deferred flag must be a selected result field' });\n }\n});\nexport type ScheduledEvidencePolicy = z.infer<typeof ScheduledEvidencePolicySchema>;\n\nexport enum ScheduledEvidenceSource {\n EXECUTION = 'execution',\n RECONCILIATION = 'reconciliation',\n OPERATOR_CONFIRMATION = 'operator_confirmation',\n ABANDONMENT = 'abandonment',\n}\nexport enum ScheduledEvidenceResultStatus {\n CAPTURED = 'captured',\n UNAVAILABLE = 'unavailable',\n}\n\n/**\n * Bounded projection, not arbitrary job input, output or exception text.\n *\n * `applicationId` is the application RECORD id (`applications._id`), projected from the job row it\n * describes — never the platform id the wire payload carried. The coverage report refuses a record\n * whose value differs from its scope, so a copy of this field retained under the wrong id is not\n * merely stale: it makes every window that reaches it fail (the follow-up migration of #1296).\n */\nconst ScheduledRunEvidenceFieldsSchema = z.object({\n jobId: z.uuid(), applicationId: z.string().min(1), queueName: z.string().min(1),\n jobType: z.enum(JobType), batchRef: z.string().optional(), operationPathKey: z.string().optional(), minionName: z.string().optional(),\n scheduledAt: z.date().optional(), publishedAt: z.date(), startedAt: z.date().optional(), completedAt: z.date(), expiresAt: z.date(),\n invocationStatus: z.enum(JobExecutionStatus), source: z.enum(ScheduledEvidenceSource),\n attemptCount: z.number().int().nonnegative(), policy: ScheduledEvidencePolicySchema,\n resultStatus: z.enum(ScheduledEvidenceResultStatus), deferred: z.boolean().optional(),\n results: z.record(z.string(), z.union([z.string().max(512), z.number().finite(), z.boolean(), z.null()])),\n});\nexport const ScheduledRunEvidenceSchema = ScheduledRunEvidenceFieldsSchema.superRefine((evidence, ctx) => {\n const targetCount = [evidence.batchRef, evidence.operationPathKey, evidence.minionName].filter(value => value !== undefined).length;\n if (targetCount !== 1 || (evidence.jobType === JobType.MINION_TICK ? !evidence.minionName\n : evidence.jobType !== JobType.SCHEDULED_CRON || !(evidence.batchRef || evidence.operationPathKey))) {\n ctx.addIssue({ code: 'custom', message: 'Evidence requires exactly one scheduled batch, operation or minion target' });\n }\n const expectedStatus = evidence.source === ScheduledEvidenceSource.ABANDONMENT ? JobExecutionStatus.FAILED : JobExecutionStatus.COMPLETED;\n if (evidence.invocationStatus !== expectedStatus) {\n ctx.addIssue({ code: 'custom', path: ['invocationStatus'], message: 'Terminal outcome must agree with evidence source' });\n }\n\n if (evidence.expiresAt.getTime() !== evidence.completedAt.getTime() + evidence.policy.retainForMs) {\n ctx.addIssue({ code: 'custom', path: ['expiresAt'], message: 'Evidence expiry must follow the captured policy and original completion' });\n }\n const fields = Object.keys(evidence.results);\n if (fields.some(field => !evidence.policy.resultFields.includes(field))) {\n ctx.addIssue({ code: 'custom', path: ['results'], message: 'Only policy-selected result fields may be retained' });\n }\n if (evidence.resultStatus === ScheduledEvidenceResultStatus.CAPTURED && evidence.policy.resultFields.some(field => !Object.hasOwn(evidence.results, field))) {\n ctx.addIssue({ code: 'custom', path: ['resultStatus'], message: 'Captured evidence requires every selected field' });\n }\n const selectedDeferred = evidence.policy.deferredField ? evidence.results[evidence.policy.deferredField] : undefined;\n if (evidence.deferred !== (typeof selectedDeferred === 'boolean' ? selectedDeferred : undefined)\n || (evidence.resultStatus === ScheduledEvidenceResultStatus.CAPTURED && evidence.policy.deferredField && typeof selectedDeferred !== 'boolean')) {\n ctx.addIssue({ code: 'custom', path: ['deferred'], message: 'Deferral must agree with the selected boolean result' });\n }\n});\nexport type ScheduledRunEvidence = z.infer<typeof ScheduledRunEvidenceSchema>;\n\n/** Stable occurrence identity and distinct attempt identity made available to handler code. */\nexport interface ScheduledAttemptContext {\n occurrenceId: string;\n attemptId: string;\n attemptNumber: number;\n}\nexport interface ScheduledReconciliationResult {\n outcome: ScheduledReconciliationOutcome;\n resultJson?: string;\n}\n\n/** @wildo_source:part:end saas.models.queue.scheduled-recovery */\n\n/** Persisted inside JobExecution; trusted only after authenticated receipt and local policy resolution. */\nexport const ScheduledExecutionStateSchema = z.object({\n phase: z.enum(ScheduledExecutionPhase),\n revision: z.number().int().nonnegative(),\n payloadJson: z.string(),\n policy: ScheduledRecoveryPolicySchema,\n /** Selected once from local application policy, independent from replay safety. */\n evidencePolicy: ScheduledEvidencePolicySchema.optional(),\n /** Terminal-CAS projection retried by the bounded operational archive outbox. */\n evidence: ScheduledRunEvidenceSchema.optional(),\n evidenceArchived: z.boolean().optional(),\n evidenceArchiveAfter: z.date().optional(),\n deadline: z.date(),\n nextAttemptAt: z.date(),\n owner: z.uuid().optional(),\n attemptCount: z.number().int().min(0).max(100),\n /** A successful reconciliation authorizes exactly the next execution admission. */\n reconciledSafe: z.boolean().default(false),\n reason: z.string().optional(),\n attempts: z.array(z.object({\n attemptId: z.uuid(),\n phase: z.enum(ScheduledExecutionPhase),\n startedAt: z.date(),\n endedAt: z.date().optional(),\n outcome: z.string().optional(),\n })).max(100),\n /** Explicit operator decisions preserve the occurrence, attribution and reason. */\n resolutions: z.array(z.object({ actor: z.string(), reason: z.string(), at: z.date(), outcome: z.enum(ScheduledReviewOutcome) })).max(100).default([]),\n});\nexport type ScheduledExecutionState = z.infer<typeof ScheduledExecutionStateSchema>;\n\n// ============================================================================\n// JOB PAYLOAD SCHEMA (Transport - not a resource)\n// ============================================================================\n\n/**\n * Caller-selected response semantics that must survive resource-operation worker replay.\n * This is deliberately not RepositoryOptions: transactions, authorization overrides and\n * server-owned mutation fields are not presentation policy and must never enter this object.\n * Unknown keys are stripped at enqueue and replay, even for structurally wider service options.\n * Variant identity is already carried by operationPathJson; page/filter/sort remain input data.\n */\nexport const JobResourceResponseOptionsSchema = z.object({\n /** Preserve the repository's real pagination envelope rather than returning a raw array. */\n paginated: z.boolean().optional(),\n /** Preserve the caller's requested population/data shape. */\n dataMode: z.enum(DataMode).optional(),\n /** Preserve an explicit request to omit signed file URL population. */\n populateFiles: z.boolean().optional(),\n});\n\nexport type JobResourceResponseOptions = z.infer<typeof JobResourceResponseOptionsSchema>;\n\n/**\n * Accepted mutation preconditions travel independently from response presentation.\n * Dropping either value makes worker execution accept writes the inline request rejects.\n * This whitelist intentionally excludes transactions and authorization overrides; unknown\n * keys are stripped at publication and replay. Zero is a valid expected version.\n */\nexport const JobResourceMutationPreconditionsSchema = z.object({\n ifMatchVersion: z.number().int().nonnegative().optional(),\n fieldTimestamps: z.record(z.string(), z.number().positive()).optional(),\n});\n\nexport type JobResourceMutationPreconditions = z.infer<typeof JobResourceMutationPreconditionsSchema>;\n\n\n/**\n * Job payload for queue transport.\n *\n * Design notes:\n * - This is NOT a resource schema (used for RabbitMQ message transport)\n * - applicationId is needed for queue routing (not duplicated from context)\n * - operationPathKey is primary identifier, operationPathJson for execution\n * - executionContextJson carries full context for reconstruction\n * - org/user IDs are NOT duplicated - extract from executionContextJson if needed\n */\nexport const JobPayloadSchema = z.object({\n /** Unique job identifier */\n jobId: z.uuid(),\n\n /** Type of job being executed */\n jobType: z.enum(JobTypeValues),\n\n // === Application Routing ===\n /**\n * The PLATFORM's id for the application — the value queue names are built from, the value the\n * crontabs-manager signs into a scheduled message, and the value a consumer verifies a message\n * against before accepting it. It is an ADDRESS on the wire.\n *\n * It is NOT the application record id (`applications._id`) and must never be copied into a row:\n * `JobExecution.applicationId` and `JobPayloadStorage.applicationId` are stamped by the backend's\n * tracker and payload store from the canonical identity. Copying this wire value into those rows is\n * what anchored 13,532 Wonder Todos rows to an id no scope predicate matches (fixed 2026-09-18).\n */\n applicationId: z.string(),\n\n // === Operation Identification ===\n /** Primary key for lookup/matching (required for RESOURCE_OPERATION) */\n operationPathKey: z.string().optional(),\n /** Serialized ResourceConfiguration_OperationPath (required for RESOURCE_OPERATION) */\n operationPathJson: z.string().optional(),\n /** Custom batch reference (required for CUSTOM_BATCH) */\n batchRef: z.string().optional(),\n /** Local minion target; checked before receipt is admitted. */\n minionName: z.string().optional(),\n\n /** Response policy only; absent retains ordinary internal-service defaults. */\n resourceResponseOptions: JobResourceResponseOptionsSchema.optional(),\n /** Optimistic-locking and CRDT guards accepted by the initiating request. */\n resourceMutationPreconditions: JobResourceMutationPreconditionsSchema.optional(),\n\n // === Execution Data ===\n // EITHER inline OR storage reference (mutually exclusive)\n /** JSON-stringified input data for small payloads (<100KB) */\n inputDataJson: z.string().optional(),\n /** Reference to JobPayloadStorage for large payloads */\n inputPayloadStorageId: z.uuid().optional(),\n /** Resource ID for READ/UPDATE/DELETE operations */\n inputId: z.string().optional(),\n /**\n * The rows a BULK operation targets, resolved before the job was enqueued.\n *\n * `inputId` cannot carry them — it is one id — so a bulk operation sent to the background lane\n * used to arrive at the worker with NO target at all: the selector is stripped from `inputData`\n * once the service has read it, and a single-id field has nowhere to put an array. The worker\n * then replayed a targetless write (#1461).\n *\n * Mutually exclusive with `inputId` by construction: the enqueue splits one target into whichever\n * field can hold it. The worker runs the bulk PER ROW from this list, so each row gets the\n * single-row operation's own semantics — pre-image, `enabledCondition`, one audit record, one\n * resource-room sync event — and the job's result reports what happened to each.\n */\n inputIds: z.array(z.string().min(1)).min(1).optional(),\n\n // === Execution Context ===\n /**\n * Serialized execution context (reconstructed on worker side).\n * Optional for CUSTOM_BATCH and SCHEDULED_CRON (they create their own internal context).\n */\n executionContextJson: z.string().optional(),\n\n // === Job Source ===\n /** How the job was initiated */\n initiatedBy: z.enum(JobInitiatorValues).default(JobInitiator.API),\n\n // === Job Configuration ===\n /** Queue priority level */\n priority: z.enum(JobPriorityValues).default(JobPriority.NORMAL),\n /** Current retry attempt (0-indexed) */\n retryCount: z.number().int().min(0).default(0),\n /** Maximum retry attempts */\n maxRetries: z.number().int().min(0).default(3),\n /**\n * Backoff timing for retries (base delay, cap, curve). Resolved from the\n * operation's `queueConfig.retryConfig` at enqueue time (defaults applied), so\n * the worker can honor per-operation backoff without re-reading config. The\n * worker computes the delay from these values and holds the message in a\n * durable broker delay queue before redelivery — see `QueueRetryBackoffConfig`.\n */\n retryConfig: QueueRetryBackoffConfigSchema.optional(),\n /** Reply-wait policy carried with the job. The executor does not enforce this as an execution deadline;\n * fire-and-forget jobs have no waiting caller to time out. */\n timeoutMs: z.number().int().min(1000).default(300000),\n\n // === Timing ===\n /** When the job was created */\n createdAt: z.date(),\n /**\n * Intended execution instant for delayed jobs or the authenticated scheduled instant of a cron occurrence.\n * Distinct from publication/receipt time. New manual cron invocations omit it; historical absence\n * can also mean the occurrence time was not retained and must not be treated as proof of a manual run.\n */\n scheduledAt: z.date().optional(),\n\n // === RPC Support ===\n /**\n * RPC reply-matching id (QUEUED awaitable mode). A fresh uuid minted at enqueue time to correlate a\n * published job with its reply on the RPC reply queue — it is NOT a request trace id. Renamed from\n * `correlationId` when request→job traceability landed (Phase 6): the job now ALSO carries\n * `originCorrelationId` (the enqueuing request's trace id), and the two must never be conflated —\n * one matches a reply, the other joins the job to a distributed trace.\n */\n rpcReplyCorrelationId: z.uuid().optional(),\n /** Reply queue name for RPC pattern */\n replyTo: z.string().optional(),\n\n // === Traceability ===\n /**\n * The correlation id of the REQUEST that enqueued this job, carried onto the payload so the worker\n * that later executes it adopts the same id (see `adoptCorrelationIdIntoCurrentFrame`). This joins\n * the asynchronous job execution — its worker-side logs and audit rows — to the originating\n * request's distributed trace. Distinct from `rpcReplyCorrelationId` (reply matching) and from the\n * AMQP message `correlationId` property (wire-level reply routing). Absent for jobs with no\n * originating request (e.g. some system-enqueued work), in which case the worker mints a fresh id.\n */\n originCorrelationId: z.string().optional(),\n /**\n * The WORK FRAME the job was enqueued inside (#1598 review F14): tenant, case, execution and task, so a\n * model call the worker makes is attributed to the same unit of work as the request that enqueued it. The\n * worker reopens the frame from this field in the same step that adopts `originCorrelationId`, at both\n * consumers (the operations lane and the domain lane).\n *\n * ENGINE-WRITTEN, never client-supplied: the enqueue path copies it from the ambient frame, and no request\n * DTO carries it. Re-deriving attribution in the worker from the job's own arguments was rejected, because\n * every job type would have to know how.\n */\n attribution: ModelCallAttributionInputSchema.optional(),\n\n // === Domain Routing ===\n /** Domain category for domain-specific routing (e.g., 'email', 'agents') */\n domainCategory: z.string().optional(),\n});\n\nexport type JobPayload = z.infer<typeof JobPayloadSchema>;\n\n// ============================================================================\n// JOB PAYLOAD STORAGE SCHEMA (Resource)\n// ============================================================================\n\n/**\n * Default TTL for job payload storage in seconds (24 hours).\n * Large payloads are automatically deleted after this period.\n */\nexport const JOB_PAYLOAD_STORAGE_TTL_SECONDS = 24 * 60 * 60; // 24 hours\n\n/**\n * Schema for stored job payloads.\n * Used when payload exceeds PAYLOAD_SIZE_THRESHOLD_BYTES.\n *\n * Resource Design:\n * - Internal system resource, no frontend exposure\n * - All fields except storageId are backendOnly\n * - TTL: Documents are automatically deleted when expiresAt is reached\n */\nexport const JobPayloadStorageSchema = z.object({\n /** Document ID — auto-generated. `.isPrimaryKey()` is what makes the PostgreSQL planner emit the\n * PRIMARY KEY constraint (MongoDB enforces `_id` uniqueness implicitly); without it this table\n * shipped constraint-less on PostgreSQL. */\n _id: z.string().isPrimaryKey(),\n\n // === Reference (exposed for lookup) ===\n /** Storage ID (used in JobPayload.inputPayloadStorageId) */\n storageId: z.uuid().isUnique({ scope: 'global', sparse: false }),\n\n // === Application Context ===\n /**\n * The application RECORD id (`applications._id`) — the APPLICATION resource scope's key, stamped by\n * the backend's payload store from the canonical identity and the only id it reads a payload back\n * under. Never `JobPayload.applicationId`, which is the platform's wire address.\n */\n applicationId: z.string().isDBIndexed().isBackendOnly(),\n\n // === Content (sensitive, backend-only) ===\n /** JSON-stringified payload - contains actual job data */\n payloadJson: z.string().isBackendOnly(),\n /** Query metadata for an opt-in run projection; selected results live only in payloadJson. */\n scheduledEvidence: ScheduledRunEvidenceFieldsSchema.omit({ results: true }).isBackendOnly().optional(),\n /** Size of the payload in bytes */\n payloadSizeBytes: z.number().int().positive().isBackendOnly(),\n\n // === Compression (internal implementation detail) ===\n /** Whether the payload is compressed */\n isCompressed: z.boolean().default(false).isBackendOnly(),\n /** Compression algorithm used */\n compressionType: z.enum(PayloadCompressionTypeValues).default(PayloadCompressionType.NONE).isBackendOnly(),\n\n // === Lifecycle ===\n /** When the payload was stored */\n createdAt: z.date().isDBIndexed(),\n /**\n * When the payload expires and can be cleaned up.\n * MongoDB TTL index will automatically delete documents at this time.\n */\n expiresAt: z.date().ttl({ expireAfterSeconds: 0 }),\n\n // === Reference Tracking (internal) ===\n /** Number of references to this payload (for cleanup) */\n referenceCount: z.number().int().min(0).default(1).isBackendOnly(),\n});\n\nexport type JobPayloadStorage = z.infer<typeof JobPayloadStorageSchema>;\n\n// ============================================================================\n// JOB RESULT SCHEMA (Transport - not a resource)\n// ============================================================================\n\n/**\n * Job execution result.\n * Returned to callers via RPC reply queue or callback dispatch.\n *\n * This is NOT a resource schema (used for RabbitMQ message transport)\n */\n/**\n * What a caller is told when a resource operation was ACCEPTED rather than performed.\n *\n * A background or fire-and-forget runtime answers the request before the write happens, so the\n * response is an acknowledgement — and a surface that reads it as a result would report success for\n * work that has not run. The two members are not interchangeable: `QUEUED` means the job is on the\n * queue, `PROCESSING` means a worker has it, and a caller polling or explaining the state to a\n * person needs the difference.\n */\nexport enum ResourceOperation_BackgroundAcceptanceStatus {\n QUEUED = 'queued',\n PROCESSING = 'processing',\n}\n\n/**\n * The acknowledgement a non-awaited runtime answers with.\n *\n * Deliberately carries NO message: a response that reaches a person's screen must be worded from\n * the label tree, in their language, by the surface that shows it. This used to include the English\n * sentence \"Job has been queued for background processing\", which the action bar surfaced verbatim\n * as a success toast — display text invented on the server\n * (`.claude/rules/display-text-comes-from-i18n.md`), and a claim of success for a write that had\n * not happened.\n */\nexport const ResourceOperationBackgroundAcceptanceSchema = z.object({\n jobId: z.string().min(1),\n status: z.enum(ResourceOperation_BackgroundAcceptanceStatus),\n});\nexport type ResourceOperationBackgroundAcceptance = z.infer<typeof ResourceOperationBackgroundAcceptanceSchema>;\n\n/**\n * Read a background acceptance out of an operation result, or `undefined` when the result is an\n * ordinary answer.\n *\n * One reader, so the frontend and any other consumer cannot disagree about what \"this has not run\n * yet\" looks like on the wire.\n */\nexport function readBackgroundAcceptance(result: unknown): ResourceOperationBackgroundAcceptance | undefined {\n const parsed = ResourceOperationBackgroundAcceptanceSchema.safeParse(result);\n return parsed.success ? parsed.data : undefined;\n}\n\n/**\n * What a background BULK job did to each row it was given.\n *\n * An asynchronous batch may PARTIALLY succeed, and when it does it must say which items failed\n * (spec-cite: Google AIP-234, \"Batch update\" — a synchronous batch update must be atomic, while a\n * long-running one reports per-item errors; https://google.aip.dev/234). A row count cannot answer\n * that: one refused row and one row that matched nothing look identical.\n *\n * A failure carries the error's REFERENCE rather than its message. The reference is what a client\n * branches on and what a locale turns into words; a message would be the server guessing at the\n * reader's language.\n */\nexport const BulkJobItemFailureSchema = z.object({\n /** The row that was refused. */\n resourceId: z.string().min(1),\n /** The refusal's client-branchable reference. */\n customMessageReference: z.string().optional(),\n /** The refusal's category, so a caller can tell an authorization refusal from a validation one. */\n errorType: z.string().optional(),\n});\nexport type BulkJobItemFailure = z.infer<typeof BulkJobItemFailureSchema>;\n\n/**\n * The result a background BULK job answers with.\n *\n * `attemptedCount` is what the job was GIVEN, not what the selection matched when the person chose:\n * rows can leave the population between the two, and this number is the one the run can vouch for.\n */\nexport const BulkJobPerRowResultSchema = z.object({\n attemptedCount: z.number().int().min(0),\n succeededCount: z.number().int().min(0),\n failedCount: z.number().int().min(0),\n failures: z.array(BulkJobItemFailureSchema),\n});\nexport type BulkJobPerRowResult = z.infer<typeof BulkJobPerRowResultSchema>;\n\nexport const JobResultSchema = z.object({\n /** Job identifier */\n jobId: z.uuid(),\n\n /** Final status of the job */\n status: z.enum(JobStatusValues),\n\n // === Success Result ===\n // EITHER inline OR storage reference (mutually exclusive)\n /** JSON-stringified result data for small results */\n resultJson: z.string().optional(),\n /** Reference to JobPayloadStorage for large results */\n resultPayloadStorageId: z.uuid().optional(),\n\n // === Error Info ===\n /** Error information if job failed (uses backend error schema with full error details) */\n error: WildoError_BackendSchema.optional(),\n\n // === Timing ===\n /** When job execution started */\n startedAt: z.date(),\n /** When job execution completed */\n completedAt: z.date().optional(),\n /** Execution duration in milliseconds */\n durationMs: z.number().int().optional(),\n});\n\nexport type JobResult = z.infer<typeof JobResultSchema>;\n\n// ============================================================================\n// JOB EXECUTION TRACKING SCHEMA (Resource)\n// ============================================================================\n\n/**\n * Default TTL for job execution records in seconds (30 days).\n * Completed/failed jobs are automatically deleted after this period.\n */\nexport const JOB_EXECUTION_TTL_SECONDS = 30 * 24 * 60 * 60; // 30 days\n\n/**\n * Job execution tracking record.\n *\n * Resource Design:\n * - Internal system resource for job lifecycle tracking\n * - Queryable fields (jobId, status, organizationId, userId) are exposed\n * - Sensitive/internal fields are marked .isBackendOnly()\n * - TTL: ordinary history expires after 30 days; scheduled claims only after a terminal outcome\n * - Proper indexes for dashboard/monitoring queries\n */\nexport const JobExecutionSchema = z.object({\n /** Document ID — auto-generated. `.isPrimaryKey()` is what makes the PostgreSQL planner emit the\n * PRIMARY KEY constraint (MongoDB enforces `_id` uniqueness implicitly); without it this table\n * shipped constraint-less on PostgreSQL. */\n _id: z.string().isPrimaryKey(),\n\n // === Job Identity (exposed for queries) ===\n /** Unique job identifier */\n jobId: z.uuid().isUnique({ scope: 'global', sparse: false }),\n /**\n * The application RECORD id (`applications._id`) — the APPLICATION resource scope's key. Stamped by\n * the backend's job tracker from the canonical identity at the moment the wire payload becomes a\n * row, and the only id its recovery and evidence scans filter on. Never copied from\n * `JobPayload.applicationId`, which is the platform's wire address and a different value.\n */\n applicationId: z.string().isDBIndexed(),\n\n // === What Was Executed (exposed for filtering) ===\n /** Type of job */\n jobType: z.enum(JobTypeValues).isDBIndexed(),\n /** Operation path key for resource operations */\n operationPathKey: z.string().optional(),\n /** Batch reference for custom batches */\n batchRef: z.string().optional(),\n /** Domain category for domain jobs (email, agents, etc.) */\n domainCategory: z.string().isDBIndexed().optional(),\n\n // === Context (exposed for org/user filtering) ===\n /** Organization ID from execution context */\n organizationId: z.string().isDBIndexed().optional(),\n /** User ID from execution context */\n userId: z.string().isDBIndexed().optional(),\n /** How the job was initiated */\n initiatedBy: z.enum(JobInitiatorValues),\n\n // === Execution State (exposed for monitoring) ===\n /** Current status */\n status: z.enum(JobExecutionStatusValues).isDBIndexed(),\n /** Queue name where job was published */\n queueName: z.string().isDBIndexed(),\n /** Queue priority */\n priority: z.enum(JobPriorityValues),\n\n // === Retry Tracking (exposed for retry monitoring) ===\n /** Current retry attempt (0-indexed) */\n retryCount: z.number().int().min(0).default(0),\n /** Maximum retry attempts */\n maxRetries: z.number().int().min(0),\n /** When the last retry was attempted */\n lastRetryAt: z.date().optional(),\n\n // === Timing (exposed for performance monitoring) ===\n /**\n * When the job record was created. Cleanup is governed separately by expiresAt.\n *\n * `.default(() => new Date())` is REQUIRED, not decorative: this is a\n * system-managed timestamp that the create pipeline strips from the input\n * before validation (like every other `createdAt`). Without a default, the\n * create-DTO date-coercion (`z.date()` → `z.coerce.date()`) then coerces the\n * now-`undefined` value → `new Date(undefined)` = Invalid Date → the create\n * FATALs with `createdAt: expected date, received Date`. The default supplies\n * a valid Date when the field is absent, matching the canonical timestamp\n * pattern (`z.date().default(() => new Date())` on todos/tasks/etc.). The separate expiresAt field carries the cleanup deadline.\n */\n createdAt: z.date().default(() => new Date()),\n /** Ordinary history expires after 30 days; unfinished scheduled claims have no expiry. */\n expiresAt: z.date().ttl({ expireAfterSeconds: 0 }).optional(),\n /** Durable scheduled ownership and recovery contract. Legacy queue writers must not mutate these rows. */\n scheduledState: ScheduledExecutionStateSchema.isBackendOnly().optional(),\n minionName: z.string().optional(),\n /** When the job was published to queue */\n queuedAt: z.date().optional(),\n /** When worker started processing */\n startedAt: z.date().optional(),\n /** When execution completed (success or failure) */\n completedAt: z.date().isDBIndexed().optional(),\n /** Execution duration in milliseconds */\n durationMs: z.number().int().optional(),\n\n // === Payload References (backend-only, internal implementation) ===\n /** Reference to input payload storage */\n inputPayloadStorageId: z.uuid().isBackendOnly().optional(),\n /** Reference to output payload storage */\n outputPayloadStorageId: z.uuid().isBackendOnly().optional(),\n\n // === Error Info (exposed for error analysis) ===\n /** Error information if job failed (uses backend error schema with full error details) */\n error: WildoError_BackendSchema.optional(),\n\n // === Worker Info (backend-only, debugging only) ===\n /** Pod/worker ID that processed this job */\n workerId: z.string().isBackendOnly().optional(),\n /** Hostname of the worker (for debugging) */\n workerHostname: z.string().isBackendOnly().optional(),\n});\n\nexport type JobExecution = z.infer<typeof JobExecutionSchema>;\n"]}
|
|
1
|
+
{"version":3,"file":"jobs.shared.schemas.js","sourceRoot":"","sources":["../../../../src/queue/jobs.shared.schemas.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Jobs Shared Schemas\n *\n * All job-related enums, schemas, and types consolidated in a single file.\n * Includes: job types, statuses, payloads, results, execution tracking, and storage.\n *\n * Resource Design Notes:\n * - JobExecution and JobPayloadStorage are internal system resources\n * - Many fields are marked .isBackendOnly() as they contain sensitive internal data\n * - TTL indexes ensure automatic cleanup\n * - Proper indexes for common query patterns\n */\n\nimport { z } from 'zod';\nimport { ModelCallAttributionInputSchema } from '../flows-actors/work-attribution.shared.schemas';\nimport { DataMode } from '../resources/resources-config.shared.schemas';\nimport { initZodDecorators } from '@wildo-ai/zod-decorators';\nimport { WildoError_BackendSchema, RetryPolicy_BackoffType } from '../errors/errors.shared.schemas';\n\n// Ensure Zod decorators are loaded\ninitZodDecorators(z);\n\n// ============================================================================\n// ENUMS\n// ============================================================================\n\n/**\n * Type of job being processed.\n */\nexport enum JobType {\n /** Standard resource operation (CREATE, READ, UPDATE, DELETE, etc.) */\n RESOURCE_OPERATION = 'resource_operation',\n /** Custom batch job defined in customBatchesFactory */\n CUSTOM_BATCH = 'custom_batch',\n /** Scheduled cron job triggered by crontabs-manager */\n SCHEDULED_CRON = 'scheduled_cron',\n /**\n * Cron-driven minion tick (KD-12 of\n * `.claude/plans/minions-and-workers-implementation.md`).\n *\n * Published by `platform-crontabs-batches-manager` to the application's\n * scheduled queue when a minion's cron schedule fires. The consumer\n * (`MinionTickConsumerBackendService` in `saas-minions-lib`) filters\n * messages by matching the token's `minionName` against the minion's OWN\n * identity — which each minion sources from its compiled-in\n * `defineMinionInit({ minionName })` config (the minion package is\n * domain-specific by construction), cross-validated at boot against the\n * fetched `appConfig.minions[minionName]`. Matched ticks route to the\n * minion's locally-hosted actor system. Identity is NOT read from env:\n * `APP_OWNED_SERVICE_NAME` is deploy-time metadata (and the read-from-env\n * path of the language-pluggable *worker* runtime), never the Node\n * minion's runtime identity source.\n *\n * Dispatch is a pure switch on `jobType` — see `PublishScheduledJobInput`\n * / `ScheduledJobTokenInput` xor that pairs `MINION_TICK` with the\n * `minionName` discriminator.\n */\n MINION_TICK = 'minion_tick',\n}\n\n/**\n * Status of a job through its lifecycle.\n */\nexport enum JobStatus {\n /** Created but not yet queued */\n PENDING = 'pending',\n /** Published to queue */\n QUEUED = 'queued',\n /** Worker started processing */\n PROCESSING = 'processing',\n /** Successfully finished */\n COMPLETED = 'completed',\n /** Failed, retries exhausted */\n FAILED = 'failed',\n /** Failed but will retry */\n RETRYING = 'retrying',\n /** Moved to dead letter queue */\n DEAD_LETTER = 'dead_letter',\n /** Manually cancelled */\n CANCELLED = 'cancelled',\n}\n\n/**\n * Which queue substrate a runtime uses.\n *\n * Read by `bindQueueAdapter()` in `saas-backend-lib`, which is the only place a member is mapped to\n * an implementation — as a total `Record`, so adding a member here is a compile error until somebody\n * says which class serves it.\n *\n * `REDIS` was declared and removed (#502). It had no implementation, no reader and no selection\n * path, and the decision was to build ONE of the two missing adapters rather than both: a vocabulary\n * member offering a choice nothing can make is worse than an absent one, because it reads as a\n * supported deployment. Reinstate it when something needs it, alongside the adapter.\n */\nexport enum QueueAdapterType {\n /** A real broker. The default, and what a deployed application wants: durability across a restart, visibility across processes, permissions per runtime. */\n RABBITMQ = 'rabbitmq',\n /**\n * In-process, no broker. For a test lane that needs real background-work BEHAVIOUR — retry,\n * dead-lettering, delayed redelivery, unacknowledged messages staying unacknowledged — and for a\n * single-process runtime that has declared it wants none of what a broker is bought for.\n */\n MEMORY = 'memory',\n}\n\n/**\n * Who initiated the job.\n */\nexport enum JobInitiator {\n /** Triggered via API call */\n API = 'api',\n /** Triggered by crontabs-batches-manager */\n CRONTAB = 'crontab',\n /** Triggered internally by service */\n INTERNAL = 'internal',\n}\n\n/**\n * Status of a job execution record (for tracking).\n * Similar to JobStatus but specific to the tracking record.\n */\nexport enum JobExecutionStatus {\n /** Created but not yet queued */\n PENDING = 'pending',\n /** Published to queue */\n QUEUED = 'queued',\n /** Worker started processing */\n PROCESSING = 'processing',\n /** Successfully finished */\n COMPLETED = 'completed',\n /** Failed, retries exhausted */\n FAILED = 'failed',\n /** Failed but will retry */\n RETRYING = 'retrying',\n /** Moved to dead letter queue */\n DEAD_LETTER = 'dead_letter',\n /** Manually cancelled */\n CANCELLED = 'cancelled',\n}\n\n/**\n * Compression type for stored payloads.\n */\nexport enum PayloadCompressionType {\n NONE = 'none',\n GZIP = 'gzip',\n}\n\n/**\n * Job priority levels.\n * HIGH and CRITICAL are routed to priority queues.\n */\nexport enum JobPriority {\n LOW = 'low',\n NORMAL = 'normal',\n HIGH = 'high',\n CRITICAL = 'critical',\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/**\n * Threshold for storing payloads externally vs inline.\n * Payloads >= 100KB are stored in MongoDB, referenced by storageId.\n * This prevents RabbitMQ performance issues with large messages.\n */\nexport const PAYLOAD_SIZE_THRESHOLD_BYTES = 100 * 1024; // 100KB\n\n// ============================================================================\n// ZOD ENUM VALUE EXTRACTION (for Zod 4)\n// ============================================================================\n\nconst JobTypeValues = Object.values(JobType) as [string, ...string[]];\nconst JobStatusValues = Object.values(JobStatus) as [string, ...string[]];\nconst JobPriorityValues = Object.values(JobPriority) as [string, ...string[]];\nconst JobInitiatorValues = Object.values(JobInitiator) as [string, ...string[]];\nconst JobExecutionStatusValues = Object.values(JobExecutionStatus) as [string, ...string[]];\nconst PayloadCompressionTypeValues = Object.values(PayloadCompressionType) as [string, ...string[]];\n\n// ============================================================================\n// RETRY BACKOFF CONFIG (shared: operation queueConfig + job transport)\n// ============================================================================\n\n/**\n * App-authorable backoff shape controlling the *timing* of job retries.\n *\n * This is the subset of retry parameters an application developer sets on an\n * operation's `queueConfig.retryConfig` to shape how long a failed job waits\n * before each re-attempt. It is intentionally a partial: the `maxRetries` and\n * `timeoutMs` axes already live at the top of `ResourceConfiguration_QueueConfig`,\n * so they are NOT repeated here (single source of truth per axis).\n *\n * Runtime semantics — when a job fails and is still eligible to retry, the queue\n * worker computes `delay = baseDelayMs × 2^attempt` (for `EXPONENTIAL`; see\n * `JobRetryUtils.calculateDelay` for `FIXED`/`LINEAR`), clamps it to `maxDelayMs`,\n * and holds the message that long in a **durable broker-side delay queue**\n * (RabbitMQ per-queue TTL + dead-letter back to the source queue) before\n * redelivery. The delay is broker-timed, not an in-process sleep, so it survives\n * a worker crash during the wait.\n *\n * All fields are optional; unset fields fall back to `QUEUE_RETRY_DEFAULTS`.\n * Both the authoring surface (`queueConfig.retryConfig`) and the wire payload\n * (`JobPayload.retryConfig`) reuse this exact schema — the enqueue side resolves\n * defaults so the transported object carries fully-resolved values.\n *\n * NOTE: This schema lives in the jobs module (not queues) because\n * `queues.shared.schemas.ts` already imports from here (`JobPriority`); putting\n * it in queues would create an import cycle. It is queue-facing by name.\n *\n * @example\n * // Exponential backoff starting at 2s, capped at 30s:\n * queueConfig: { maxRetries: 5, retryConfig: { baseDelayMs: 2000, maxDelayMs: 30000 } }\n */\nexport const QueueRetryBackoffConfigSchema = z.object({\n /** Base delay in ms — first retry / base of the exponential (or linear) curve. */\n baseDelayMs: z.number().int().min(100).optional(),\n /** Maximum delay cap in ms — prevents unbounded backoff on late attempts. */\n maxDelayMs: z.number().int().min(1000).optional(),\n /** Backoff curve: `fixed` | `linear` | `exponential`. Defaults to `exponential`. */\n retryPolicy: z.enum(RetryPolicy_BackoffType).optional(),\n});\n\nexport type QueueRetryBackoffConfig = z.infer<typeof QueueRetryBackoffConfigSchema>;\n\n/** @wildo_source:part:start saas.models.queue.scheduled-recovery facet:layer:shared facet:audience:app-developer */\n\n/** First receipt is short-lived; persisted recovery has its own policy deadline. */\nexport const SCHEDULED_INITIAL_ADMISSION_MAX_AGE_MS = 5 * 60 * 1000;\nexport const SCHEDULED_INITIAL_ADMISSION_FUTURE_SKEW_MS = 30 * 1000;\n\n/**\n * How long after its token expired a delivery may still be RECORDED as a missed occurrence (#2212).\n *\n * An expired token stays cryptographically valid forever, so without a horizon anyone able to\n * publish onto the application's queue could replay a captured token of any age and plant a\n * \"missed while absent\" record. The horizon is APPROXIMATELY the job-row retention: within it, a\n * replayed token almost always meets the occurrence's existing row and is recognised as already\n * held; beyond it, no genuine backlog is plausible and the delivery is rejected as a trust failure.\n * \"Approximately\" because a row that ran on time expires measured from its completion while the\n * horizon is measured from the token's expiry, which leaves a window of a few minutes in which a\n * replay is recorded as a fresh miss. It never runs anything, and archived run evidence still wins\n * the occurrence in coverage.\n *\n * Equal to `JOB_EXECUTION_TTL_SECONDS` (declared further down, outside this shared block, so it\n * cannot be referenced here without a temporal-dead-zone hazard); a test pins the two together, so\n * changing one without the other fails.\n */\nexport const SCHEDULED_LATE_DELIVERY_HORIZON_MS = 30 * 24 * 60 * 60 * 1000;\n\n/**\n * Why an AUTHENTIC scheduled delivery reached the application too late to be admitted (#2212).\n *\n * Either way the occurrence was MISSED: it is recorded as such and not run, and the schedule\n * continues with its next occurrence. The two gates differ in WHO was late, which is why they are\n * kept apart:\n *\n * - `TOKEN_EXPIRED` — the delivery sat in the queue for longer than its token lives, so nothing\n * consumed the application's scheduled queue for that long: the backend (or minion) was stopped,\n * restarting or crash-looping. This is the common case after a restart.\n * - `OUTSIDE_ADMISSION_WINDOW` — the token is still current, but the occurrence it names is older\n * than the window. The scheduler may sign up to the window's length AFTER the occurrence, so the\n * delay is shared between the scheduler's publication and the application's consumption, and\n * cannot be attributed to the application alone.\n *\n * A late delivery is never an authentication failure: its signature, issuer and audience were\n * proven before it was classified late. A token that cannot be proven authentic, that names an\n * occurrence in the future, or that expired longer ago than `SCHEDULED_LATE_DELIVERY_HORIZON_MS`\n * is a trust failure instead and is reported loudly.\n *\n * Missed occurrences are SKIPPED, never caught up: that is the established cron behaviour (a\n * Kubernetes `CronJob` past its `startingDeadlineSeconds`, a Quartz trigger with the do-nothing\n * misfire instruction), and it keeps the short signed window a replay bound rather than a credential.\n */\nexport enum ScheduledDeliveryLateness {\n /** The signed delivery token's `exp` passed before the delivery was consumed. */\n TOKEN_EXPIRED = 'token_expired',\n /** The token is current, but the occurrence it names is older than `SCHEDULED_INITIAL_ADMISSION_MAX_AGE_MS`; scheduler and consumer share the delay. */\n OUTSIDE_ADMISSION_WINDOW = 'outside_admission_window',\n}\n\n/** How the handler's complete effects tolerate execution after an uncertain outcome. */\nexport enum ScheduledReplaySafety {\n /** No automatic repetition; a failed call can already have committed effects. */\n MANUAL = 'manual',\n /** All effects use stable business keys or equivalent idempotency mechanisms. */\n IDEMPOTENT = 'idempotent',\n /** A backend reconciler must establish completion or safety before repetition. */\n RECONCILE = 'reconcile',\n}\n\n/** Durable admission phase, independent from the presentation status of a job. */\nexport enum ScheduledExecutionPhase {\n READY = 'ready',\n RUNNING = 'running',\n RECONCILING = 'reconciling',\n WAITING = 'waiting',\n REVIEW = 'review',\n FINISHED = 'finished',\n}\n\nexport enum ScheduledReconciliationOutcome {\n COMPLETED = 'completed',\n SAFE_TO_RETRY = 'safe_to_retry',\n INCONCLUSIVE = 'inconclusive',\n}\n\n/** Operator decisions are distinct from evidence returned by a handler's reconciler. */\nexport enum ScheduledReviewOutcome {\n CONFIRM_COMPLETED = 'confirm_completed',\n RETRY = 'retry',\n ABANDON = 'abandon',\n}\n\n/** A declaration is a contract, not a mechanism that makes side effects idempotent. */\nexport const ScheduledRecoveryPolicySchema = z.object({\n contractVersion: z.string().min(1).default('1'),\n replaySafety: z.enum(ScheduledReplaySafety).default(ScheduledReplaySafety.MANUAL),\n retryReportedFailures: z.boolean().default(false),\n /** Total admissions, including reconciliation; initial execution consumes one. */\n maxAttempts: z.number().int().min(1).max(100).default(1),\n /** Elapsed horizon from first authenticated receipt, never extended by recovery. */\n maxRecoveryMs: z.number().int().min(1000).max(30 * 24 * 60 * 60 * 1000).default(24 * 60 * 60 * 1000),\n /** Heartbeat lease: expiry means contact was lost, not that the old worker stopped. */\n leaseMs: z.number().int().min(3000).max(60 * 60 * 1000).default(60000),\n backoff: QueueRetryBackoffConfigSchema.optional(),\n jitterRatio: z.number().min(0).max(1).default(0.2),\n}).superRefine((policy, ctx) => {\n if (policy.retryReportedFailures && policy.replaySafety === ScheduledReplaySafety.MANUAL) {\n ctx.addIssue({ code: 'custom', path: ['retryReportedFailures'], message: 'Automatic retry requires idempotent effects or reconciliation.' });\n }\n});\nexport type ScheduledRecoveryPolicy = z.infer<typeof ScheduledRecoveryPolicySchema>;\nexport function normalizeScheduledRecoveryPolicy(policy?: Partial<ScheduledRecoveryPolicy>): ScheduledRecoveryPolicy {\n return ScheduledRecoveryPolicySchema.parse(policy ?? {});\n}\n\n/** Finite, application-owned evidence policy. No policy means no long-term projection. */\nexport const ScheduledEvidencePolicySchema = z.object({\n policyRef: z.string().trim().min(1).max(160),\n /** Absolute expiry is completion plus this duration, never the date an archive retry succeeds. */\n retainForMs: z.number().int().min(86400000).max(3650 * 86400000),\n /** Only these top-level scalar result fields may enter retained evidence. */\n resultFields: z.array(z.string().regex(/^[A-Za-z][A-Za-z0-9_]*$/).max(80)).max(32),\n /** Selected boolean flag identifying deferred business work independently from invocation success. */\n deferredField: z.string().min(1).optional(),\n}).superRefine((policy, ctx) => {\n if (new Set(policy.resultFields).size !== policy.resultFields.length) ctx.addIssue({ code: 'custom', message: 'Evidence result fields must be unique' });\n if (policy.deferredField && !policy.resultFields.includes(policy.deferredField)) {\n ctx.addIssue({ code: 'custom', path: ['deferredField'], message: 'Deferred flag must be a selected result field' });\n }\n});\nexport type ScheduledEvidencePolicy = z.infer<typeof ScheduledEvidencePolicySchema>;\n\n/** How a scheduled occurrence's archived evidence came to exist. */\nexport enum ScheduledEvidenceSource {\n /** The handler ran and reported completion. */\n EXECUTION = 'execution',\n /** The handler's reconciler established that an interrupted run completed. */\n RECONCILIATION = 'reconciliation',\n /** An operator confirmed completion of an occurrence held for review. */\n OPERATOR_CONFIRMATION = 'operator_confirmation',\n /** An operator decided an occurrence held for review will not run. */\n ABANDONMENT = 'abandonment',\n /**\n * The occurrence was never run: its authentic delivery reached the application after the\n * admission deadline (see `ScheduledDeliveryLateness` for who was late). Coverage reads it as an\n * EXPLAINED gap: the slot stays missing, because the occurrence did not run, and the record says\n * why — rather than an unexplained one.\n */\n LATE_DELIVERY = 'late_delivery',\n}\n\n/**\n * The terminal invocation status each evidence source records — the one place that pairing is stated.\n *\n * A source whose occurrence never reached a successful invocation records `FAILED`; this follows the\n * precedent `ABANDONMENT` set, and the SOURCE (never the status) is what says why it did not run.\n */\nexport function scheduledEvidenceInvocationStatus(source: ScheduledEvidenceSource): JobExecutionStatus {\n switch (source) {\n case ScheduledEvidenceSource.EXECUTION:\n case ScheduledEvidenceSource.RECONCILIATION:\n case ScheduledEvidenceSource.OPERATOR_CONFIRMATION:\n return JobExecutionStatus.COMPLETED;\n case ScheduledEvidenceSource.ABANDONMENT:\n case ScheduledEvidenceSource.LATE_DELIVERY:\n return JobExecutionStatus.FAILED;\n }\n}\nexport enum ScheduledEvidenceResultStatus {\n CAPTURED = 'captured',\n UNAVAILABLE = 'unavailable',\n}\n\n/**\n * Bounded projection, not arbitrary job input, output or exception text.\n *\n * `applicationId` is the application RECORD id (`applications._id`), projected from the job row it\n * describes — never the platform id the wire payload carried. The coverage report refuses a record\n * whose value differs from its scope, so a copy of this field retained under the wrong id is not\n * merely stale: it makes every window that reaches it fail (the follow-up migration of #1296).\n */\nconst ScheduledRunEvidenceFieldsSchema = z.object({\n jobId: z.uuid(), applicationId: z.string().min(1), queueName: z.string().min(1),\n jobType: z.enum(JobType), batchRef: z.string().optional(), operationPathKey: z.string().optional(), minionName: z.string().optional(),\n scheduledAt: z.date().optional(), publishedAt: z.date(), startedAt: z.date().optional(), completedAt: z.date(), expiresAt: z.date(),\n invocationStatus: z.enum(JobExecutionStatus), source: z.enum(ScheduledEvidenceSource),\n attemptCount: z.number().int().nonnegative(), policy: ScheduledEvidencePolicySchema,\n resultStatus: z.enum(ScheduledEvidenceResultStatus), deferred: z.boolean().optional(),\n results: z.record(z.string(), z.union([z.string().max(512), z.number().finite(), z.boolean(), z.null()])),\n});\nexport const ScheduledRunEvidenceSchema = ScheduledRunEvidenceFieldsSchema.superRefine((evidence, ctx) => {\n const targetCount = [evidence.batchRef, evidence.operationPathKey, evidence.minionName].filter(value => value !== undefined).length;\n if (targetCount !== 1 || (evidence.jobType === JobType.MINION_TICK ? !evidence.minionName\n : evidence.jobType !== JobType.SCHEDULED_CRON || !(evidence.batchRef || evidence.operationPathKey))) {\n ctx.addIssue({ code: 'custom', message: 'Evidence requires exactly one scheduled batch, operation or minion target' });\n }\n if (evidence.invocationStatus !== scheduledEvidenceInvocationStatus(evidence.source)) {\n ctx.addIssue({ code: 'custom', path: ['invocationStatus'], message: 'Terminal outcome must agree with evidence source' });\n }\n\n if (evidence.expiresAt.getTime() !== evidence.completedAt.getTime() + evidence.policy.retainForMs) {\n ctx.addIssue({ code: 'custom', path: ['expiresAt'], message: 'Evidence expiry must follow the captured policy and original completion' });\n }\n const fields = Object.keys(evidence.results);\n if (fields.some(field => !evidence.policy.resultFields.includes(field))) {\n ctx.addIssue({ code: 'custom', path: ['results'], message: 'Only policy-selected result fields may be retained' });\n }\n if (evidence.resultStatus === ScheduledEvidenceResultStatus.CAPTURED && evidence.policy.resultFields.some(field => !Object.hasOwn(evidence.results, field))) {\n ctx.addIssue({ code: 'custom', path: ['resultStatus'], message: 'Captured evidence requires every selected field' });\n }\n const selectedDeferred = evidence.policy.deferredField ? evidence.results[evidence.policy.deferredField] : undefined;\n if (evidence.deferred !== (typeof selectedDeferred === 'boolean' ? selectedDeferred : undefined)\n || (evidence.resultStatus === ScheduledEvidenceResultStatus.CAPTURED && evidence.policy.deferredField && typeof selectedDeferred !== 'boolean')) {\n ctx.addIssue({ code: 'custom', path: ['deferred'], message: 'Deferral must agree with the selected boolean result' });\n }\n});\nexport type ScheduledRunEvidence = z.infer<typeof ScheduledRunEvidenceSchema>;\n\n/** Stable occurrence identity and distinct attempt identity made available to handler code. */\nexport interface ScheduledAttemptContext {\n occurrenceId: string;\n attemptId: string;\n attemptNumber: number;\n}\nexport interface ScheduledReconciliationResult {\n outcome: ScheduledReconciliationOutcome;\n resultJson?: string;\n}\n\n/** @wildo_source:part:end saas.models.queue.scheduled-recovery */\n\n/** Persisted inside JobExecution; trusted only after authenticated receipt and local policy resolution. */\nexport const ScheduledExecutionStateSchema = z.object({\n phase: z.enum(ScheduledExecutionPhase),\n revision: z.number().int().nonnegative(),\n payloadJson: z.string(),\n policy: ScheduledRecoveryPolicySchema,\n /** Selected once from local application policy, independent from replay safety. */\n evidencePolicy: ScheduledEvidencePolicySchema.optional(),\n /** Terminal-CAS projection retried by the bounded operational archive outbox. */\n evidence: ScheduledRunEvidenceSchema.optional(),\n evidenceArchived: z.boolean().optional(),\n evidenceArchiveAfter: z.date().optional(),\n deadline: z.date(),\n nextAttemptAt: z.date(),\n owner: z.uuid().optional(),\n attemptCount: z.number().int().min(0).max(100),\n /** A successful reconciliation authorizes exactly the next execution admission. */\n reconciledSafe: z.boolean().default(false),\n reason: z.string().optional(),\n /**\n * Present only on an occurrence recorded from a LATE delivery (#2212): it was never admitted and\n * never runs. Structured rather than folded into `reason`, so the coverage report and a repeated\n * late receipt recognise the row without parsing prose.\n */\n lateness: z.enum(ScheduledDeliveryLateness).optional(),\n attempts: z.array(z.object({\n attemptId: z.uuid(),\n phase: z.enum(ScheduledExecutionPhase),\n startedAt: z.date(),\n endedAt: z.date().optional(),\n outcome: z.string().optional(),\n })).max(100),\n /** Explicit operator decisions preserve the occurrence, attribution and reason. */\n resolutions: z.array(z.object({ actor: z.string(), reason: z.string(), at: z.date(), outcome: z.enum(ScheduledReviewOutcome) })).max(100).default([]),\n});\nexport type ScheduledExecutionState = z.infer<typeof ScheduledExecutionStateSchema>;\n\n// ============================================================================\n// JOB PAYLOAD SCHEMA (Transport - not a resource)\n// ============================================================================\n\n/**\n * Caller-selected response semantics that must survive resource-operation worker replay.\n * This is deliberately not RepositoryOptions: transactions, authorization overrides and\n * server-owned mutation fields are not presentation policy and must never enter this object.\n * Unknown keys are stripped at enqueue and replay, even for structurally wider service options.\n * Variant identity is already carried by operationPathJson; page/filter/sort remain input data.\n */\nexport const JobResourceResponseOptionsSchema = z.object({\n /** Preserve the repository's real pagination envelope rather than returning a raw array. */\n paginated: z.boolean().optional(),\n /** Preserve the caller's requested population/data shape. */\n dataMode: z.enum(DataMode).optional(),\n /** Preserve an explicit request to omit signed file URL population. */\n populateFiles: z.boolean().optional(),\n});\n\nexport type JobResourceResponseOptions = z.infer<typeof JobResourceResponseOptionsSchema>;\n\n/**\n * Accepted mutation preconditions travel independently from response presentation.\n * Dropping either value makes worker execution accept writes the inline request rejects.\n * This whitelist intentionally excludes transactions and authorization overrides; unknown\n * keys are stripped at publication and replay. Zero is a valid expected version.\n */\nexport const JobResourceMutationPreconditionsSchema = z.object({\n ifMatchVersion: z.number().int().nonnegative().optional(),\n fieldTimestamps: z.record(z.string(), z.number().positive()).optional(),\n});\n\nexport type JobResourceMutationPreconditions = z.infer<typeof JobResourceMutationPreconditionsSchema>;\n\n\n/**\n * Job payload for queue transport.\n *\n * Design notes:\n * - This is NOT a resource schema (used for RabbitMQ message transport)\n * - applicationId is needed for queue routing (not duplicated from context)\n * - operationPathKey is primary identifier, operationPathJson for execution\n * - executionContextJson carries full context for reconstruction\n * - org/user IDs are NOT duplicated - extract from executionContextJson if needed\n */\nexport const JobPayloadSchema = z.object({\n /** Unique job identifier */\n jobId: z.uuid(),\n\n /** Type of job being executed */\n jobType: z.enum(JobTypeValues),\n\n // === Application Routing ===\n /**\n * The PLATFORM's id for the application — the value queue names are built from, the value the\n * crontabs-manager signs into a scheduled message, and the value a consumer verifies a message\n * against before accepting it. It is an ADDRESS on the wire.\n *\n * It is NOT the application record id (`applications._id`) and must never be copied into a row:\n * `JobExecution.applicationId` and `JobPayloadStorage.applicationId` are stamped by the backend's\n * tracker and payload store from the canonical identity. Copying this wire value into those rows is\n * what anchored 13,532 Wonder Todos rows to an id no scope predicate matches (fixed 2026-09-18).\n */\n applicationId: z.string(),\n\n // === Operation Identification ===\n /** Primary key for lookup/matching (required for RESOURCE_OPERATION) */\n operationPathKey: z.string().optional(),\n /** Serialized ResourceConfiguration_OperationPath (required for RESOURCE_OPERATION) */\n operationPathJson: z.string().optional(),\n /** Custom batch reference (required for CUSTOM_BATCH) */\n batchRef: z.string().optional(),\n /** Local minion target; checked before receipt is admitted. */\n minionName: z.string().optional(),\n\n /** Response policy only; absent retains ordinary internal-service defaults. */\n resourceResponseOptions: JobResourceResponseOptionsSchema.optional(),\n /** Optimistic-locking and CRDT guards accepted by the initiating request. */\n resourceMutationPreconditions: JobResourceMutationPreconditionsSchema.optional(),\n\n // === Execution Data ===\n // EITHER inline OR storage reference (mutually exclusive)\n /** JSON-stringified input data for small payloads (<100KB) */\n inputDataJson: z.string().optional(),\n /** Reference to JobPayloadStorage for large payloads */\n inputPayloadStorageId: z.uuid().optional(),\n /** Resource ID for READ/UPDATE/DELETE operations */\n inputId: z.string().optional(),\n /**\n * The rows a BULK operation targets, resolved before the job was enqueued.\n *\n * `inputId` cannot carry them — it is one id — so a bulk operation sent to the background lane\n * used to arrive at the worker with NO target at all: the selector is stripped from `inputData`\n * once the service has read it, and a single-id field has nowhere to put an array. The worker\n * then replayed a targetless write (#1461).\n *\n * Mutually exclusive with `inputId` by construction: the enqueue splits one target into whichever\n * field can hold it. The worker runs the bulk PER ROW from this list, so each row gets the\n * single-row operation's own semantics — pre-image, `enabledCondition`, one audit record, one\n * resource-room sync event — and the job's result reports what happened to each.\n */\n inputIds: z.array(z.string().min(1)).min(1).optional(),\n\n // === Execution Context ===\n /**\n * Serialized execution context (reconstructed on worker side).\n * Optional for CUSTOM_BATCH and SCHEDULED_CRON (they create their own internal context).\n */\n executionContextJson: z.string().optional(),\n\n // === Job Source ===\n /** How the job was initiated */\n initiatedBy: z.enum(JobInitiatorValues).default(JobInitiator.API),\n\n // === Job Configuration ===\n /** Queue priority level */\n priority: z.enum(JobPriorityValues).default(JobPriority.NORMAL),\n /** Current retry attempt (0-indexed) */\n retryCount: z.number().int().min(0).default(0),\n /** Maximum retry attempts */\n maxRetries: z.number().int().min(0).default(3),\n /**\n * Backoff timing for retries (base delay, cap, curve). Resolved from the\n * operation's `queueConfig.retryConfig` at enqueue time (defaults applied), so\n * the worker can honor per-operation backoff without re-reading config. The\n * worker computes the delay from these values and holds the message in a\n * durable broker delay queue before redelivery — see `QueueRetryBackoffConfig`.\n */\n retryConfig: QueueRetryBackoffConfigSchema.optional(),\n /** Reply-wait policy carried with the job. The executor does not enforce this as an execution deadline;\n * fire-and-forget jobs have no waiting caller to time out. */\n timeoutMs: z.number().int().min(1000).default(300000),\n\n // === Timing ===\n /** When the job was created */\n createdAt: z.date(),\n /**\n * Intended execution instant for delayed jobs or the authenticated scheduled instant of a cron occurrence.\n * Distinct from publication/receipt time. New manual cron invocations omit it; historical absence\n * can also mean the occurrence time was not retained and must not be treated as proof of a manual run.\n */\n scheduledAt: z.date().optional(),\n\n // === RPC Support ===\n /**\n * RPC reply-matching id (QUEUED awaitable mode). A fresh uuid minted at enqueue time to correlate a\n * published job with its reply on the RPC reply queue — it is NOT a request trace id. Renamed from\n * `correlationId` when request→job traceability landed (Phase 6): the job now ALSO carries\n * `originCorrelationId` (the enqueuing request's trace id), and the two must never be conflated —\n * one matches a reply, the other joins the job to a distributed trace.\n */\n rpcReplyCorrelationId: z.uuid().optional(),\n /** Reply queue name for RPC pattern */\n replyTo: z.string().optional(),\n\n // === Traceability ===\n /**\n * The correlation id of the REQUEST that enqueued this job, carried onto the payload so the worker\n * that later executes it adopts the same id (see `adoptCorrelationIdIntoCurrentFrame`). This joins\n * the asynchronous job execution — its worker-side logs and audit rows — to the originating\n * request's distributed trace. Distinct from `rpcReplyCorrelationId` (reply matching) and from the\n * AMQP message `correlationId` property (wire-level reply routing). Absent for jobs with no\n * originating request (e.g. some system-enqueued work), in which case the worker mints a fresh id.\n */\n originCorrelationId: z.string().optional(),\n /**\n * The WORK FRAME the job was enqueued inside (#1598 review F14): tenant, case, execution and task, so a\n * model call the worker makes is attributed to the same unit of work as the request that enqueued it. The\n * worker reopens the frame from this field in the same step that adopts `originCorrelationId`, at both\n * consumers (the operations lane and the domain lane).\n *\n * ENGINE-WRITTEN, never client-supplied: the enqueue path copies it from the ambient frame, and no request\n * DTO carries it. Re-deriving attribution in the worker from the job's own arguments was rejected, because\n * every job type would have to know how.\n */\n attribution: ModelCallAttributionInputSchema.optional(),\n\n // === Domain Routing ===\n /** Domain category for domain-specific routing (e.g., 'email', 'agents') */\n domainCategory: z.string().optional(),\n});\n\nexport type JobPayload = z.infer<typeof JobPayloadSchema>;\n\n// ============================================================================\n// JOB PAYLOAD STORAGE SCHEMA (Resource)\n// ============================================================================\n\n/**\n * Default TTL for job payload storage in seconds (24 hours).\n * Large payloads are automatically deleted after this period.\n */\nexport const JOB_PAYLOAD_STORAGE_TTL_SECONDS = 24 * 60 * 60; // 24 hours\n\n/**\n * Schema for stored job payloads.\n * Used when payload exceeds PAYLOAD_SIZE_THRESHOLD_BYTES.\n *\n * Resource Design:\n * - Internal system resource, no frontend exposure\n * - All fields except storageId are backendOnly\n * - TTL: Documents are automatically deleted when expiresAt is reached\n */\nexport const JobPayloadStorageSchema = z.object({\n /** Document ID — auto-generated. `.isPrimaryKey()` is what makes the PostgreSQL planner emit the\n * PRIMARY KEY constraint (MongoDB enforces `_id` uniqueness implicitly); without it this table\n * shipped constraint-less on PostgreSQL. */\n _id: z.string().isPrimaryKey(),\n\n // === Reference (exposed for lookup) ===\n /** Storage ID (used in JobPayload.inputPayloadStorageId) */\n storageId: z.uuid().isUnique({ scope: 'global', sparse: false }),\n\n // === Application Context ===\n /**\n * The application RECORD id (`applications._id`) — the APPLICATION resource scope's key, stamped by\n * the backend's payload store from the canonical identity and the only id it reads a payload back\n * under. Never `JobPayload.applicationId`, which is the platform's wire address.\n */\n applicationId: z.string().isDBIndexed().isBackendOnly(),\n\n // === Content (sensitive, backend-only) ===\n /** JSON-stringified payload - contains actual job data */\n payloadJson: z.string().isBackendOnly(),\n /** Query metadata for an opt-in run projection; selected results live only in payloadJson. */\n scheduledEvidence: ScheduledRunEvidenceFieldsSchema.omit({ results: true }).isBackendOnly().optional(),\n /** Size of the payload in bytes */\n payloadSizeBytes: z.number().int().positive().isBackendOnly(),\n\n // === Compression (internal implementation detail) ===\n /** Whether the payload is compressed */\n isCompressed: z.boolean().default(false).isBackendOnly(),\n /** Compression algorithm used */\n compressionType: z.enum(PayloadCompressionTypeValues).default(PayloadCompressionType.NONE).isBackendOnly(),\n\n // === Lifecycle ===\n /** When the payload was stored */\n createdAt: z.date().isDBIndexed(),\n /**\n * When the payload expires and can be cleaned up.\n * MongoDB TTL index will automatically delete documents at this time.\n */\n expiresAt: z.date().ttl({ expireAfterSeconds: 0 }),\n\n // === Reference Tracking (internal) ===\n /** Number of references to this payload (for cleanup) */\n referenceCount: z.number().int().min(0).default(1).isBackendOnly(),\n});\n\nexport type JobPayloadStorage = z.infer<typeof JobPayloadStorageSchema>;\n\n// ============================================================================\n// JOB RESULT SCHEMA (Transport - not a resource)\n// ============================================================================\n\n/**\n * Job execution result.\n * Returned to callers via RPC reply queue or callback dispatch.\n *\n * This is NOT a resource schema (used for RabbitMQ message transport)\n */\n/**\n * What a caller is told when a resource operation was ACCEPTED rather than performed.\n *\n * A background or fire-and-forget runtime answers the request before the write happens, so the\n * response is an acknowledgement — and a surface that reads it as a result would report success for\n * work that has not run. The two members are not interchangeable: `QUEUED` means the job is on the\n * queue, `PROCESSING` means a worker has it, and a caller polling or explaining the state to a\n * person needs the difference.\n */\nexport enum ResourceOperation_BackgroundAcceptanceStatus {\n QUEUED = 'queued',\n PROCESSING = 'processing',\n}\n\n/**\n * The acknowledgement a non-awaited runtime answers with.\n *\n * Deliberately carries NO message: a response that reaches a person's screen must be worded from\n * the label tree, in their language, by the surface that shows it. This used to include the English\n * sentence \"Job has been queued for background processing\", which the action bar surfaced verbatim\n * as a success toast — display text invented on the server\n * (`.claude/rules/display-text-comes-from-i18n.md`), and a claim of success for a write that had\n * not happened.\n */\nexport const ResourceOperationBackgroundAcceptanceSchema = z.object({\n jobId: z.string().min(1),\n status: z.enum(ResourceOperation_BackgroundAcceptanceStatus),\n});\nexport type ResourceOperationBackgroundAcceptance = z.infer<typeof ResourceOperationBackgroundAcceptanceSchema>;\n\n/**\n * Read a background acceptance out of an operation result, or `undefined` when the result is an\n * ordinary answer.\n *\n * One reader, so the frontend and any other consumer cannot disagree about what \"this has not run\n * yet\" looks like on the wire.\n */\nexport function readBackgroundAcceptance(result: unknown): ResourceOperationBackgroundAcceptance | undefined {\n const parsed = ResourceOperationBackgroundAcceptanceSchema.safeParse(result);\n return parsed.success ? parsed.data : undefined;\n}\n\n/**\n * What a background BULK job did to each row it was given.\n *\n * An asynchronous batch may PARTIALLY succeed, and when it does it must say which items failed\n * (spec-cite: Google AIP-234, \"Batch update\" — a synchronous batch update must be atomic, while a\n * long-running one reports per-item errors; https://google.aip.dev/234). A row count cannot answer\n * that: one refused row and one row that matched nothing look identical.\n *\n * A failure carries the error's REFERENCE rather than its message. The reference is what a client\n * branches on and what a locale turns into words; a message would be the server guessing at the\n * reader's language.\n */\nexport const BulkJobItemFailureSchema = z.object({\n /** The row that was refused. */\n resourceId: z.string().min(1),\n /** The refusal's client-branchable reference. */\n customMessageReference: z.string().optional(),\n /** The refusal's category, so a caller can tell an authorization refusal from a validation one. */\n errorType: z.string().optional(),\n});\nexport type BulkJobItemFailure = z.infer<typeof BulkJobItemFailureSchema>;\n\n/**\n * The result a background BULK job answers with.\n *\n * `attemptedCount` is what the job was GIVEN, not what the selection matched when the person chose:\n * rows can leave the population between the two, and this number is the one the run can vouch for.\n */\nexport const BulkJobPerRowResultSchema = z.object({\n attemptedCount: z.number().int().min(0),\n succeededCount: z.number().int().min(0),\n failedCount: z.number().int().min(0),\n failures: z.array(BulkJobItemFailureSchema),\n});\nexport type BulkJobPerRowResult = z.infer<typeof BulkJobPerRowResultSchema>;\n\nexport const JobResultSchema = z.object({\n /** Job identifier */\n jobId: z.uuid(),\n\n /** Final status of the job */\n status: z.enum(JobStatusValues),\n\n // === Success Result ===\n // EITHER inline OR storage reference (mutually exclusive)\n /** JSON-stringified result data for small results */\n resultJson: z.string().optional(),\n /** Reference to JobPayloadStorage for large results */\n resultPayloadStorageId: z.uuid().optional(),\n\n // === Error Info ===\n /** Error information if job failed (uses backend error schema with full error details) */\n error: WildoError_BackendSchema.optional(),\n\n // === Timing ===\n /** When job execution started */\n startedAt: z.date(),\n /** When job execution completed */\n completedAt: z.date().optional(),\n /** Execution duration in milliseconds */\n durationMs: z.number().int().optional(),\n});\n\nexport type JobResult = z.infer<typeof JobResultSchema>;\n\n// ============================================================================\n// JOB EXECUTION TRACKING SCHEMA (Resource)\n// ============================================================================\n\n/**\n * Default TTL for job execution records in seconds (30 days).\n * Completed/failed jobs are automatically deleted after this period.\n */\nexport const JOB_EXECUTION_TTL_SECONDS = 30 * 24 * 60 * 60; // 30 days\n\n/**\n * Job execution tracking record.\n *\n * Resource Design:\n * - Internal system resource for job lifecycle tracking\n * - Queryable fields (jobId, status, organizationId, userId) are exposed\n * - Sensitive/internal fields are marked .isBackendOnly()\n * - TTL: ordinary history expires after 30 days; scheduled claims only after a terminal outcome\n * - Proper indexes for dashboard/monitoring queries\n */\nexport const JobExecutionSchema = z.object({\n /** Document ID — auto-generated. `.isPrimaryKey()` is what makes the PostgreSQL planner emit the\n * PRIMARY KEY constraint (MongoDB enforces `_id` uniqueness implicitly); without it this table\n * shipped constraint-less on PostgreSQL. */\n _id: z.string().isPrimaryKey(),\n\n // === Job Identity (exposed for queries) ===\n /** Unique job identifier */\n jobId: z.uuid().isUnique({ scope: 'global', sparse: false }),\n /**\n * The application RECORD id (`applications._id`) — the APPLICATION resource scope's key. Stamped by\n * the backend's job tracker from the canonical identity at the moment the wire payload becomes a\n * row, and the only id its recovery and evidence scans filter on. Never copied from\n * `JobPayload.applicationId`, which is the platform's wire address and a different value.\n */\n applicationId: z.string().isDBIndexed(),\n\n // === What Was Executed (exposed for filtering) ===\n /** Type of job */\n jobType: z.enum(JobTypeValues).isDBIndexed(),\n /** Operation path key for resource operations */\n operationPathKey: z.string().optional(),\n /** Batch reference for custom batches */\n batchRef: z.string().optional(),\n /** Domain category for domain jobs (email, agents, etc.) */\n domainCategory: z.string().isDBIndexed().optional(),\n\n // === Context (exposed for org/user filtering) ===\n /** Organization ID from execution context */\n organizationId: z.string().isDBIndexed().optional(),\n /** User ID from execution context */\n userId: z.string().isDBIndexed().optional(),\n /** How the job was initiated */\n initiatedBy: z.enum(JobInitiatorValues),\n\n // === Execution State (exposed for monitoring) ===\n /** Current status */\n status: z.enum(JobExecutionStatusValues).isDBIndexed(),\n /** Queue name where job was published */\n queueName: z.string().isDBIndexed(),\n /** Queue priority */\n priority: z.enum(JobPriorityValues),\n\n // === Retry Tracking (exposed for retry monitoring) ===\n /** Current retry attempt (0-indexed) */\n retryCount: z.number().int().min(0).default(0),\n /** Maximum retry attempts */\n maxRetries: z.number().int().min(0),\n /** When the last retry was attempted */\n lastRetryAt: z.date().optional(),\n\n // === Timing (exposed for performance monitoring) ===\n /**\n * When the job record was created. Cleanup is governed separately by expiresAt.\n *\n * `.default(() => new Date())` is REQUIRED, not decorative: this is a\n * system-managed timestamp that the create pipeline strips from the input\n * before validation (like every other `createdAt`). Without a default, the\n * create-DTO date-coercion (`z.date()` → `z.coerce.date()`) then coerces the\n * now-`undefined` value → `new Date(undefined)` = Invalid Date → the create\n * FATALs with `createdAt: expected date, received Date`. The default supplies\n * a valid Date when the field is absent, matching the canonical timestamp\n * pattern (`z.date().default(() => new Date())` on todos/tasks/etc.). The separate expiresAt field carries the cleanup deadline.\n */\n createdAt: z.date().default(() => new Date()),\n /** Ordinary history expires after 30 days; unfinished scheduled claims have no expiry. */\n expiresAt: z.date().ttl({ expireAfterSeconds: 0 }).optional(),\n /** Durable scheduled ownership and recovery contract. Legacy queue writers must not mutate these rows. */\n scheduledState: ScheduledExecutionStateSchema.isBackendOnly().optional(),\n minionName: z.string().optional(),\n /** When the job was published to queue */\n queuedAt: z.date().optional(),\n /** When worker started processing */\n startedAt: z.date().optional(),\n /** When execution completed (success or failure) */\n completedAt: z.date().isDBIndexed().optional(),\n /** Execution duration in milliseconds */\n durationMs: z.number().int().optional(),\n\n // === Payload References (backend-only, internal implementation) ===\n /** Reference to input payload storage */\n inputPayloadStorageId: z.uuid().isBackendOnly().optional(),\n /** Reference to output payload storage */\n outputPayloadStorageId: z.uuid().isBackendOnly().optional(),\n\n // === Error Info (exposed for error analysis) ===\n /** Error information if job failed (uses backend error schema with full error details) */\n error: WildoError_BackendSchema.optional(),\n\n // === Worker Info (backend-only, debugging only) ===\n /** Pod/worker ID that processed this job */\n workerId: z.string().isBackendOnly().optional(),\n /** Hostname of the worker (for debugging) */\n workerHostname: z.string().isBackendOnly().optional(),\n});\n\nexport type JobExecution = z.infer<typeof JobExecutionSchema>;\n"]}
|
|
@@ -247,6 +247,31 @@ export declare class ResourcesConfigOperationsDtosBuilderUtils {
|
|
|
247
247
|
* Get field count and names from a Zod object schema (Zod-compliant)
|
|
248
248
|
*/
|
|
249
249
|
private static getZodObjectFields;
|
|
250
|
+
/**
|
|
251
|
+
* Exactly `analyzeDtoSchema(schema) === EMPTY_OBJECT_DTO_SUMMARY`, without rendering the summary.
|
|
252
|
+
*
|
|
253
|
+
* The DTO builder asks this of EVERY operation, in both of its passes (the factory's and the
|
|
254
|
+
* registry's authoritative rebuild), and used to answer it by rendering the whole field-by-field
|
|
255
|
+
* description string — a recursive walk of every field to depth 3 — only to compare the result
|
|
256
|
+
* with one constant. Measured on the core registry (135 resources, 1,274 operations, every one built
|
|
257
|
+
* twice): that rendering was about 14% of `ResourcesRegistry.initialize()`'s CPU (#2153).
|
|
258
|
+
*
|
|
259
|
+
* Equivalent by construction, not by approximation: `analyzeDtoSchema` returns the empty-object
|
|
260
|
+
* summary from exactly one branch, reached when the schema is present, is not `z.any()`, is a Zod
|
|
261
|
+
* object, and `getZodObjectFields` counts no field. This tests the same three conditions, in the same
|
|
262
|
+
* order, through the same helpers. Keep the two in step if either changes.
|
|
263
|
+
*/
|
|
264
|
+
private static isEmptyObjectDto;
|
|
265
|
+
/**
|
|
266
|
+
* The LEGACY custom-DTO heuristic, for an operation that carries no `hasCustomRequestDto` /
|
|
267
|
+
* `hasCustomResponseDto` flag: the original DTO is custom when its structural summary differs from
|
|
268
|
+
* the rebuilt one and it is neither empty nor `z.any()`.
|
|
269
|
+
*
|
|
270
|
+
* Evaluated only on that branch. It used to be computed for every operation before the flag was
|
|
271
|
+
* consulted, rendering two full summaries per DTO that the flag then made irrelevant — the factory
|
|
272
|
+
* stamps the flag on every operation it builds, so for those the strings were never read (#2153).
|
|
273
|
+
*/
|
|
274
|
+
private static isStructurallyDistinctCustomDto;
|
|
250
275
|
/**
|
|
251
276
|
* Analyze a DTO schema and return a detailed human-readable summary (Zod-compliant)
|
|
252
277
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resources-config-operations.dtos-builder.utils.d.ts","sourceRoot":"","sources":["../../../../../src/resources/utils/resources-config-operations.dtos-builder.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC3F,OAAO,EAAkG,+BAA+B,EAAE,qBAAqB,EAA0D,QAAQ,EAAsO,wBAAwB,EAAkC,MAAM,oCAAoC,CAAC;AAC5iB,OAAO,EAQL,oBAAoB,EAGrB,MAAM,6BAA6B,CAAC;AAQrC,OAAO,EAIL,YAAY,EA8Bb,MAAM,0BAA0B,CAAC;AAelC;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,qDAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"resources-config-operations.dtos-builder.utils.d.ts","sourceRoot":"","sources":["../../../../../src/resources/utils/resources-config-operations.dtos-builder.utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,8 @@ function createDtoDerivationMemoScope() {
|
|
|
29
29
|
clientContextRelative: new WeakMap(),
|
|
30
30
|
};
|
|
31
31
|
}
|
|
32
|
+
/** The summary `analyzeDtoSchema` renders for a Zod object with no field; see `isEmptyObjectDto`. */
|
|
33
|
+
const EMPTY_OBJECT_DTO_SUMMARY = '📄 {} (empty object)';
|
|
32
34
|
/** One memo scope per resource configuration object; see {@link DtoDerivationMemoScope}. */
|
|
33
35
|
const DTO_DERIVATION_MEMO_SCOPE_BY_RESOURCE = new WeakMap();
|
|
34
36
|
/**
|
|
@@ -312,8 +314,6 @@ export class ResourcesConfigOperationsDtosBuilderUtils {
|
|
|
312
314
|
// - Backend-only fields already excluded in buildEnhancedRequestDto
|
|
313
315
|
let requestDto = this.buildEnhancedRequestDto(operationWithEnhancedSchema, effectiveOperation);
|
|
314
316
|
// Check if original DTO was explicitly provided (custom DTO from variantParams.requestDto).
|
|
315
|
-
const rebuiltRequestInfo = this.analyzeDtoSchema(requestDto);
|
|
316
|
-
const originalRequestInfo = originalRequestDto ? this.analyzeDtoSchema(originalRequestDto) : null;
|
|
317
317
|
// Custom-DTO classification is driven by the explicit `hasCustomRequestDto`
|
|
318
318
|
// flag that the resource factory stamps on EVERY operation it builds:
|
|
319
319
|
// • `true` → the variant supplied an explicit `requestDto`; preserve it
|
|
@@ -340,10 +340,7 @@ export class ResourcesConfigOperationsDtosBuilderUtils {
|
|
|
340
340
|
? (originalRequestDto && !isZodAny(originalRequestDto))
|
|
341
341
|
: isExplicitlyAutoDerivedRequestDto
|
|
342
342
|
? false
|
|
343
|
-
: (originalRequestDto
|
|
344
|
-
originalRequestInfo !== rebuiltRequestInfo &&
|
|
345
|
-
originalRequestInfo !== '📄 {} (empty object)' &&
|
|
346
|
-
!isZodAny(originalRequestDto));
|
|
343
|
+
: this.isStructurallyDistinctCustomDto(originalRequestDto, requestDto);
|
|
347
344
|
if (isCustomRequestDto && originalRequestDto) {
|
|
348
345
|
// Custom DTO: preserve structure but apply network-boundary coercion (dates + money bigints)
|
|
349
346
|
requestDto = this.applyNetworkBoundaryCoercion(this.stripTemplatableFileFieldsRecursively(originalRequestDto));
|
|
@@ -372,8 +369,6 @@ export class ResourcesConfigOperationsDtosBuilderUtils {
|
|
|
372
369
|
// Custom DTOs are complete schemas that should be preserved as-is, but still need
|
|
373
370
|
// transformations (backend-only stripping, date + money-bigint coercion).
|
|
374
371
|
const hasExplicitCustomResponseDto = operation.hasCustomResponseDto === true;
|
|
375
|
-
const rebuiltResponseInfo = this.analyzeDtoSchema(responseDtoInternal);
|
|
376
|
-
const originalResponseInfo = originalResponseDto ? this.analyzeDtoSchema(originalResponseDto) : null;
|
|
377
372
|
// Custom-DTO classification is driven by the explicit `hasCustomResponseDto`
|
|
378
373
|
// flag that the resource factory stamps on EVERY operation it builds:
|
|
379
374
|
// • `true` → the app supplied a `customResponseDto`; preserve it verbatim.
|
|
@@ -395,10 +390,7 @@ export class ResourcesConfigOperationsDtosBuilderUtils {
|
|
|
395
390
|
? (originalResponseDto && !isZodAny(originalResponseDto))
|
|
396
391
|
: isExplicitlyAutoDerivedResponseDto
|
|
397
392
|
? false
|
|
398
|
-
: (originalResponseDto
|
|
399
|
-
originalResponseInfo !== rebuiltResponseInfo &&
|
|
400
|
-
originalResponseInfo !== '📄 {} (empty object)' &&
|
|
401
|
-
!isZodAny(originalResponseDto));
|
|
393
|
+
: this.isStructurallyDistinctCustomDto(originalResponseDto, responseDtoInternal);
|
|
402
394
|
if (isCustomResponseDto && originalResponseDto) {
|
|
403
395
|
// Strip while decorator metadata is still on the source nodes, then apply
|
|
404
396
|
// network coercion to each trust-boundary shape independently. Reversing
|
|
@@ -676,8 +668,7 @@ export class ResourcesConfigOperationsDtosBuilderUtils {
|
|
|
676
668
|
static buildEnhancedRequestDto(operation, effectiveOperation) {
|
|
677
669
|
// Check if operation already has a meaningful requestDto (not z.any() and not empty)
|
|
678
670
|
const isZAny = operation.requestDto && isZodAny(operation.requestDto);
|
|
679
|
-
|
|
680
|
-
if (operation.requestDto && !isZAny && currentRequestInfo !== '📄 {} (empty object)') {
|
|
671
|
+
if (operation.requestDto && !isZAny && !this.isEmptyObjectDto(operation.requestDto)) {
|
|
681
672
|
return this.stripTemplatableFileFieldsRecursively(operation.requestDto);
|
|
682
673
|
}
|
|
683
674
|
const searchQueryRequestSchema = operation.searchQueryRequestSchema;
|
|
@@ -707,7 +698,7 @@ export class ResourcesConfigOperationsDtosBuilderUtils {
|
|
|
707
698
|
// Wrap as the bulk request, WITH this operation's batch limit (`wrapRequestDtoAsBulk`).
|
|
708
699
|
const hasRowInput = !!underlyingRequestDto
|
|
709
700
|
&& !isZodAny(underlyingRequestDto)
|
|
710
|
-
&& this.
|
|
701
|
+
&& !this.isEmptyObjectDto(underlyingRequestDto);
|
|
711
702
|
return wrapRequestDtoAsBulk({
|
|
712
703
|
rowRequestDto: hasRowInput ? underlyingRequestDto : undefined,
|
|
713
704
|
maxSelection: resolveBulkOperationMaxSelection(operation),
|
|
@@ -748,8 +739,7 @@ export class ResourcesConfigOperationsDtosBuilderUtils {
|
|
|
748
739
|
static buildEnhancedResponseDto(operation, effectiveOperation) {
|
|
749
740
|
// Check if operation already has a meaningful responseDto (not z.any() and not empty)
|
|
750
741
|
const isZAny = operation.responseDto && isZodAny(operation.responseDto);
|
|
751
|
-
|
|
752
|
-
if (operation.responseDto && !isZAny && currentResponseInfo !== '📄 {} (empty object)') {
|
|
742
|
+
if (operation.responseDto && !isZAny && !this.isEmptyObjectDto(operation.responseDto)) {
|
|
753
743
|
return operation.responseDto;
|
|
754
744
|
}
|
|
755
745
|
// Apply bulk operation decorator for URL-bearing bulk companion operations.
|
|
@@ -1346,6 +1336,44 @@ export class ResourcesConfigOperationsDtosBuilderUtils {
|
|
|
1346
1336
|
return { fieldCount: 0, fieldNames: [] };
|
|
1347
1337
|
}
|
|
1348
1338
|
}
|
|
1339
|
+
/**
|
|
1340
|
+
* Exactly `analyzeDtoSchema(schema) === EMPTY_OBJECT_DTO_SUMMARY`, without rendering the summary.
|
|
1341
|
+
*
|
|
1342
|
+
* The DTO builder asks this of EVERY operation, in both of its passes (the factory's and the
|
|
1343
|
+
* registry's authoritative rebuild), and used to answer it by rendering the whole field-by-field
|
|
1344
|
+
* description string — a recursive walk of every field to depth 3 — only to compare the result
|
|
1345
|
+
* with one constant. Measured on the core registry (135 resources, 1,274 operations, every one built
|
|
1346
|
+
* twice): that rendering was about 14% of `ResourcesRegistry.initialize()`'s CPU (#2153).
|
|
1347
|
+
*
|
|
1348
|
+
* Equivalent by construction, not by approximation: `analyzeDtoSchema` returns the empty-object
|
|
1349
|
+
* summary from exactly one branch, reached when the schema is present, is not `z.any()`, is a Zod
|
|
1350
|
+
* object, and `getZodObjectFields` counts no field. This tests the same three conditions, in the same
|
|
1351
|
+
* order, through the same helpers. Keep the two in step if either changes.
|
|
1352
|
+
*/
|
|
1353
|
+
static isEmptyObjectDto(schema) {
|
|
1354
|
+
if (!schema)
|
|
1355
|
+
return false;
|
|
1356
|
+
if (isZodAny(schema))
|
|
1357
|
+
return false;
|
|
1358
|
+
return isZodObject(schema) && this.getZodObjectFields(schema).fieldCount === 0;
|
|
1359
|
+
}
|
|
1360
|
+
/**
|
|
1361
|
+
* The LEGACY custom-DTO heuristic, for an operation that carries no `hasCustomRequestDto` /
|
|
1362
|
+
* `hasCustomResponseDto` flag: the original DTO is custom when its structural summary differs from
|
|
1363
|
+
* the rebuilt one and it is neither empty nor `z.any()`.
|
|
1364
|
+
*
|
|
1365
|
+
* Evaluated only on that branch. It used to be computed for every operation before the flag was
|
|
1366
|
+
* consulted, rendering two full summaries per DTO that the flag then made irrelevant — the factory
|
|
1367
|
+
* stamps the flag on every operation it builds, so for those the strings were never read (#2153).
|
|
1368
|
+
*/
|
|
1369
|
+
static isStructurallyDistinctCustomDto(original, rebuilt) {
|
|
1370
|
+
if (!original)
|
|
1371
|
+
return false;
|
|
1372
|
+
const originalSummary = this.analyzeDtoSchema(original);
|
|
1373
|
+
return originalSummary !== this.analyzeDtoSchema(rebuilt)
|
|
1374
|
+
&& originalSummary !== EMPTY_OBJECT_DTO_SUMMARY
|
|
1375
|
+
&& !isZodAny(original);
|
|
1376
|
+
}
|
|
1349
1377
|
/**
|
|
1350
1378
|
* Analyze a DTO schema and return a detailed human-readable summary (Zod-compliant)
|
|
1351
1379
|
*/
|
|
@@ -1361,7 +1389,7 @@ export class ResourcesConfigOperationsDtosBuilderUtils {
|
|
|
1361
1389
|
if (isZodObject(schema)) {
|
|
1362
1390
|
const { fieldCount, fieldNames } = this.getZodObjectFields(schema);
|
|
1363
1391
|
if (fieldCount === 0) {
|
|
1364
|
-
return
|
|
1392
|
+
return EMPTY_OBJECT_DTO_SUMMARY;
|
|
1365
1393
|
}
|
|
1366
1394
|
// Check if this is a decorated schema
|
|
1367
1395
|
let decorationInfo = '';
|
|
@@ -1485,7 +1513,7 @@ export class ResourcesConfigOperationsDtosBuilderUtils {
|
|
|
1485
1513
|
const { fieldCount, fieldNames } = this.getZodObjectFields(schema);
|
|
1486
1514
|
if (fieldCount === 0) {
|
|
1487
1515
|
visitedSchemas.delete(schema);
|
|
1488
|
-
return
|
|
1516
|
+
return EMPTY_OBJECT_DTO_SUMMARY;
|
|
1489
1517
|
}
|
|
1490
1518
|
// Check if this is a decorated schema
|
|
1491
1519
|
let decorationInfo = '';
|