@supergrowthai/tq 1.0.13 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +149 -8
- package/dist/{AsyncActions-CZYO8ShR.js → AsyncActions-B8ImDgTo.js} +39 -3
- package/dist/AsyncActions-B8ImDgTo.js.map +1 -0
- package/dist/{AsyncActions-BOO1ikWz.cjs → AsyncActions-BsxMX_Ib.cjs} +39 -3
- package/dist/AsyncActions-BsxMX_Ib.cjs.map +1 -0
- package/dist/core/Actions.cjs +23 -1
- package/dist/core/Actions.cjs.map +1 -1
- package/dist/core/Actions.mjs +23 -1
- package/dist/core/Actions.mjs.map +1 -1
- package/dist/core/async/AsyncActions.cjs +1 -1
- package/dist/core/async/AsyncActions.mjs +1 -1
- package/dist/index.cjs +459 -226
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +459 -226
- package/dist/index.mjs.map +1 -1
- package/dist/src/core/Actions.d.cts +5 -1
- package/dist/src/core/Actions.d.ts +5 -1
- package/dist/src/core/TaskHandler.d.cts +6 -0
- package/dist/src/core/TaskHandler.d.ts +6 -0
- package/dist/src/core/TaskRunner.d.cts +22 -5
- package/dist/src/core/TaskRunner.d.ts +22 -5
- package/dist/src/core/async/AsyncActions.d.cts +1 -0
- package/dist/src/core/async/AsyncActions.d.ts +1 -0
- package/dist/src/core/flow/FlowMiddleware.d.cts +6 -1
- package/dist/src/core/flow/FlowMiddleware.d.ts +6 -1
- package/dist/src/core/flow/IFlowBarrierProvider.d.cts +4 -0
- package/dist/src/core/flow/IFlowBarrierProvider.d.ts +4 -0
- package/dist/src/core/flow/InMemoryFlowBarrierProvider.d.cts +1 -0
- package/dist/src/core/flow/InMemoryFlowBarrierProvider.d.ts +1 -0
- package/dist/src/core/lifecycle.d.cts +98 -3
- package/dist/src/core/lifecycle.d.ts +98 -3
- package/dist/src/providers/ConsoleHealthProvider.d.cts +42 -2
- package/dist/src/providers/ConsoleHealthProvider.d.ts +42 -2
- package/dist/src/test/lifecycle-events.test.d.cts +31 -0
- package/dist/src/test/lifecycle-events.test.d.ts +31 -0
- package/package.json +2 -2
- package/dist/AsyncActions-BOO1ikWz.cjs.map +0 -1
- package/dist/AsyncActions-CZYO8ShR.js.map +0 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../packages/utils/dist/server.mjs","../src/core/TaskStore.ts","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseSlice.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/eq.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_freeGlobal.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_root.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_Symbol.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_getRawTag.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_objectToString.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseGetTag.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/isObject.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/isFunction.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/isLength.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/isArrayLike.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_isIndex.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_isIterateeCall.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_trimmedEndIndex.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseTrim.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/isObjectLike.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/isSymbol.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/toNumber.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/toFinite.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/toInteger.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/chunk.js","../src/utils/disposable-lock.ts","../src/core/log-context.ts","../src/core/TaskRunner.ts","../src/core/environment.ts","../src/core/TaskHandler.ts","../src/core/TaskQueuesManager.ts","../src/core/flow/InMemoryFlowBarrierProvider.ts","../src/core/flow/FlowMiddleware.ts","../src/providers/ConsoleHealthProvider.ts"],"sourcesContent":["import { Logger, LogLevel } from \"./client.mjs\";\nclass LockManager {\n constructor(cacheProvider, options) {\n this.cacheProvider = cacheProvider;\n this.acquireLocks = /* @__PURE__ */ new Map();\n this.logger = new Logger(\"MetricsCollector\", LogLevel.INFO);\n this.cacheProvider = cacheProvider;\n this.prefix = options?.prefix || \"lock:\";\n this.defaultTimeout = options?.defaultTimeout || 30 * 60;\n if (options?.debugLogs)\n this.logger.setLogLevel(LogLevel.INFO);\n }\n /**\n * Check if a resource is locked\n */\n async isLocked(resourceId) {\n this.logger.debug(\"isLocked\" + resourceId);\n const exists = await this.cacheProvider.get(this.getKey(resourceId));\n return !!exists;\n }\n /**\n * Filter out locked resources from an array\n */\n async filterLocked(resources, getResourceId) {\n if (!resources.length) return [];\n const lockChecks = resources.map((resource) => this.isLocked(getResourceId(resource)));\n const lockResults = await Promise.all(lockChecks);\n return resources.filter((_, index) => !lockResults[index]);\n }\n /**\n * Acquire a lock\n * @returns true if lock was acquired, false if already locked\n */\n async acquire(resourceId, timeout = this.defaultTimeout) {\n this.logger.debug(\"Acquire\" + resourceId);\n const existingLock = this.acquireLocks.get(resourceId);\n if (existingLock) {\n await existingLock;\n return false;\n }\n const lockPromise = this.acquireInternal(resourceId, timeout);\n this.acquireLocks.set(resourceId, lockPromise);\n try {\n return await lockPromise;\n } finally {\n this.acquireLocks.delete(resourceId);\n }\n }\n /**\n * Release a lock\n */\n async release(resourceId) {\n this.logger.debug(\"Release\" + resourceId);\n const key = this.getKey(resourceId);\n await this.cacheProvider.del(key);\n }\n async acquireInternal(resourceId, timeout) {\n if (await this.isLocked(resourceId)) return false;\n const key = this.getKey(resourceId);\n const result = await this.cacheProvider.set(key, \"1\", timeout);\n return result === \"OK\" || result === \"1\" || result === 1;\n }\n getKey(resourceId) {\n return `${this.prefix}${resourceId}`;\n }\n}\nclass ShutdownManager {\n constructor() {\n this.sigintListeners = [];\n this.sigint = {\n register: (listener) => this.sigintListeners.push(listener)\n };\n this.sigtermListeners = [];\n this.sigterm = {\n register: (listener) => this.sigtermListeners.push(listener)\n };\n this.sigquitListeners = [];\n this.sigquit = {\n register: (listener) => this.sigquitListeners.push(listener)\n };\n this.shuttingDown = false;\n this._runListeners = async (listeners) => {\n for (const listener of listeners) {\n try {\n await listener();\n } catch (err) {\n console.error(\"Error during shutdown task:\", err);\n }\n }\n };\n process.on(\"SIGINT\", () => {\n if (this.shuttingDown) return;\n this.shuttingDown = true;\n console.log(\"\\nSIGINT received. Running shutdown tasks...\");\n this._runListeners(this.sigintListeners).then(() => {\n console.log(\"Shutdown tasks completed.\");\n process.exit(0);\n }).catch((err) => {\n console.error(\"Error during shutdown:\", err);\n process.exit(1);\n });\n });\n process.on(\"SIGTERM\", () => {\n if (this.shuttingDown) return;\n this.shuttingDown = true;\n console.log(\"\\nSIGTERM received. Running shutdown tasks...\");\n this._runListeners(this.sigtermListeners).then(() => {\n console.log(\"Shutdown tasks completed.\");\n process.exit(0);\n }).catch((err) => {\n console.error(\"Error during shutdown:\", err);\n process.exit(1);\n });\n });\n process.on(\"SIGQUIT\", () => {\n if (this.shuttingDown) return;\n this.shuttingDown = true;\n console.log(\"\\nSIGQUIT received. Running shutdown tasks...\");\n this._runListeners(this.sigquitListeners).then(() => {\n console.log(\"Shutdown tasks completed.\");\n process.exit(0);\n }).catch((err) => {\n console.error(\"Error during shutdown:\", err);\n process.exit(1);\n });\n });\n }\n}\nexport {\n LockManager,\n LogLevel,\n Logger,\n ShutdownManager\n};\n//# sourceMappingURL=server.mjs.map\n","import type {CronTask, ITaskStorageAdapter} from \"../adapters\";\nimport {getEnvironmentQueueName} from \"@supergrowthai/mq\";\n\nclass TaskStore<ID> {\n\n constructor(private databaseAdapter: ITaskStorageAdapter<ID>) {\n }\n\n /**\n * Adds multiple tasks to the scheduled queue\n */\n async addTasksToScheduled(tasks: CronTask<ID>[]): Promise<CronTask<ID>[]> {\n if (!tasks.length) return [];\n\n const transformedTasks = tasks.map((task) => ({\n id: task.id,\n type: task.type,\n queue_id: getEnvironmentQueueName(task.queue_id),\n payload: task.payload,\n execute_at: task.execute_at,\n expires_at: task.expires_at,\n status: task.status || 'scheduled' as const,\n task_group: task.task_group,\n task_hash: task.task_hash,\n retries: task.retries || 0,\n retry_after: task.retry_after,\n execution_stats: task.execution_stats,\n created_at: task.created_at || new Date(),\n updated_at: task.updated_at || new Date(),\n processing_started_at: task.processing_started_at || new Date(),\n force_store: task.force_store,\n metadata: task.metadata,\n partition_key: task.partition_key,\n entity: task.entity\n })) as CronTask<ID>[];\n\n return await this.databaseAdapter.addTasksToScheduled(transformedTasks);\n }\n\n /**\n * Gets mature tasks that are ready to be processed\n * Implements a two-phase approach:\n * 1. Reset stale processing tasks\n * 2. Fetch and mark new mature tasks\n */\n async getMatureTasks(timestamp: number): Promise<CronTask<ID>[]> {\n return await this.databaseAdapter.getMatureTasks(timestamp);\n }\n\n /**\n * Marks tasks as processing with current timestamp\n */\n async markTasksAsProcessing(tasks: CronTask<ID>[]): Promise<void> {\n await this.databaseAdapter.markTasksAsProcessing(tasks, new Date());\n }\n\n /**\n * Marks tasks as executed/completed\n */\n async markTasksAsExecuted(tasks: CronTask<ID>[]): Promise<void> {\n await this.databaseAdapter.markTasksAsExecuted(tasks);\n }\n\n /**\n * Marks tasks as failed — uses upsert to handle store_on_failure tasks\n * that were never persisted to DB\n */\n async markTasksAsFailed(tasks: CronTask<ID>[]): Promise<void> {\n const tasksWithStatus = tasks.map(task => ({\n ...task,\n status: 'failed' as const,\n execution_stats: {\n ...(task.execution_stats || {}),\n failed_at: new Date()\n }\n }));\n await this.databaseAdapter.upsertTasks(tasksWithStatus);\n }\n\n /**\n * Marks tasks as successful/completed\n */\n async markTasksAsSuccess(tasks: CronTask<ID>[]): Promise<void> {\n await this.databaseAdapter.markTasksAsExecuted(tasks);\n }\n\n /**\n * Marks tasks as ignored with proper task context\n */\n async markTasksAsIgnored(tasks: CronTask<ID>[]): Promise<void> {\n const tasksWithStatus = tasks.map(task => ({\n ...task,\n status: 'ignored' as const,\n execution_stats: {\n ...(task.execution_stats || {}),\n error: 'No executor found for task type',\n ignored_reason: 'unknown_executor',\n ignored_at: new Date()\n }\n }));\n\n await this.databaseAdapter.upsertTasks(tasksWithStatus);\n }\n\n /**\n * Updates multiple tasks with specific updates\n */\n async updateTasks(updates: Array<{ id: ID; updates: Partial<CronTask<ID>> }>): Promise<void> {\n await this.databaseAdapter.updateTasks(updates);\n }\n\n /**\n * Gets tasks by their IDs\n */\n async getTasksByIds(taskIds: ID[]): Promise<CronTask<ID>[]> {\n return await this.databaseAdapter.getTasksByIds(taskIds);\n }\n\n /**\n * Gets cleanup statistics\n */\n async getCleanupStats(): Promise<{ orphanedTasks: number; expiredTasks: number }> {\n return await this.databaseAdapter.getCleanupStats();\n }\n\n /**\n * Cleans up orphaned and expired tasks\n */\n async cleanupTasks(): Promise<void> {\n const twoDaysAgo = new Date(Date.now() - 2 * 24 * 60 * 60 * 1000);\n const now = new Date();\n\n await this.databaseAdapter.cleanupTasks(twoDaysAgo, now);\n }\n\n /**\n * Updates tasks for retry — uses upsert to handle store_on_failure tasks\n * that were never persisted to DB\n */\n async updateTasksForRetry(tasks: CronTask<ID>[]): Promise<void> {\n await this.databaseAdapter.upsertTasks(tasks);\n }\n\n}\n\nexport {TaskStore};","/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\nmodule.exports = baseSlice;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","var eq = require('./eq'),\n isArrayLike = require('./isArrayLike'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject');\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nmodule.exports = isIterateeCall;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","var toNumber = require('./toNumber');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nmodule.exports = toFinite;\n","var toFinite = require('./toFinite');\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nmodule.exports = toInteger;\n","var baseSlice = require('./_baseSlice'),\n isIterateeCall = require('./_isIterateeCall'),\n toInteger = require('./toInteger');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeCeil = Math.ceil,\n nativeMax = Math.max;\n\n/**\n * Creates an array of elements split into groups the length of `size`.\n * If `array` can't be split evenly, the final chunk will be the remaining\n * elements.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to process.\n * @param {number} [size=1] The length of each chunk\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the new array of chunks.\n * @example\n *\n * _.chunk(['a', 'b', 'c', 'd'], 2);\n * // => [['a', 'b'], ['c', 'd']]\n *\n * _.chunk(['a', 'b', 'c', 'd'], 3);\n * // => [['a', 'b', 'c'], ['d']]\n */\nfunction chunk(array, size, guard) {\n if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n size = 1;\n } else {\n size = nativeMax(toInteger(size), 0);\n }\n var length = array == null ? 0 : array.length;\n if (!length || size < 1) {\n return [];\n }\n var index = 0,\n resIndex = 0,\n result = Array(nativeCeil(length / size));\n\n while (index < length) {\n result[resIndex++] = baseSlice(array, index, (index += size));\n }\n return result;\n}\n\nmodule.exports = chunk;\n","import {LockManager} from \"@supergrowthai/utils\";\n\n/**\n * A batch of locks that implements AsyncDisposable for use with `await using`.\n * Automatically releases all acquired locks when the scope exits, even on error.\n *\n * @example\n * ```typescript\n * await using locks = new DisposableLockBatch(lockManager);\n * await locks.acquire('task-1');\n * await locks.acquire('task-2');\n * // ... do work ...\n * // locks automatically released here, even if an error is thrown\n * ```\n *\n * @since Node.js 22+ (Explicit Resource Management)\n */\nexport class DisposableLockBatch implements AsyncDisposable {\n private readonly lockIds: string[] = [];\n private disposed = false;\n\n constructor(\n private readonly lockManager: LockManager,\n private readonly onError?: (lockId: string, error: unknown) => void\n ) {\n }\n\n /**\n * Get the list of currently held lock IDs\n */\n get heldLocks(): readonly string[] {\n return this.lockIds;\n }\n\n /**\n * Number of locks currently held\n */\n get size(): number {\n return this.lockIds.length;\n }\n\n /**\n * Acquire a lock and track it for automatic release\n */\n async acquire(lockId: string, timeout?: number): Promise<boolean> {\n if (this.disposed) {\n throw new Error('Cannot acquire lock on disposed DisposableLockBatch');\n }\n\n const acquired = await this.lockManager.acquire(lockId, timeout);\n if (acquired) {\n this.lockIds.push(lockId);\n }\n return acquired;\n }\n\n /**\n * AsyncDisposable implementation - releases all locks\n */\n async [Symbol.asyncDispose](): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n\n await Promise.all(\n this.lockIds.map(lockId =>\n this.lockManager.release(lockId).catch(err => {\n if (this.onError) {\n this.onError(lockId, err);\n }\n })\n )\n );\n }\n}\n","import {AsyncLocalStorage} from \"node:async_hooks\";\nimport {Logger} from \"@supergrowthai/utils/server\";\n\nexport type LogStore = Record<string, string>;\n\nconst als = new AsyncLocalStorage<LogStore>();\n\n// Wire ALS into Logger's context provider — single registration at module load\nLogger.setContextProvider(() => als.getStore());\n\n/**\n * Run a function within an ALS scope carrying the given log context store.\n * The store is available via getLogContext() inside the callback and cleared after.\n */\nexport function runWithLogContext<T>(store: LogStore, fn: () => T): T {\n return als.run(store, fn);\n}\n\n/**\n * Read the current ALS log context store (undefined outside a runWithLogContext scope).\n */\nexport function getLogContext(): LogStore | undefined {\n return als.getStore();\n}\n","import chunk from \"lodash/chunk\";\nimport {Logger, LogLevel} from \"@supergrowthai/utils/server\";\nimport {tId} from \"../utils/task-id-gen.js\";\nimport {DisposableLockBatch} from \"../utils/disposable-lock.js\";\nimport {TaskType} from \"../types.js\";\nimport {ActionResults, Actions} from \"./Actions.js\";\nimport {AsyncActions} from \"./async/AsyncActions.js\";\nimport {CronTask} from \"../adapters\";\nimport {IMessageQueue} from \"@supergrowthai/mq\";\nimport {CacheProvider} from \"memoose-js\";\nimport {LockManager} from \"@supergrowthai/utils\";\nimport {TaskQueuesManager} from \"./TaskQueuesManager\";\nimport {TaskStore} from \"./TaskStore\";\nimport {IAsyncTaskManager} from \"./async/async-task-manager\";\nimport type {ITaskLifecycleProvider, TaskContext, TaskHandlerLifecycleConfig, TaskTiming} from \"./lifecycle.js\";\nimport {runWithLogContext} from \"./log-context.js\";\nimport type {LogStore} from \"./log-context.js\";\nimport type {IEntityProjectionProvider, EntityProjectionConfig, EntityTaskProjection} from \"./entity/IEntityProjectionProvider.js\";\nimport {buildProjection, syncProjections} from \"./entity/IEntityProjectionProvider.js\";\nimport type {FlowMiddleware} from \"./flow/FlowMiddleware.js\";\n\nexport interface AsyncTask<ID> {\n task: CronTask<ID>;\n promise: Promise<void>;\n startTime: number;\n actions: AsyncActions<ID>;\n}\n\nexport class TaskRunner<ID> {\n private readonly logger: Logger;\n private lockManager: LockManager;\n private readonly taskStartTimes = new Map<string, number>();\n\n constructor(\n private messageQueue: IMessageQueue<ID>,\n private taskQueue: TaskQueuesManager<ID>,\n private taskStore: TaskStore<ID>,\n cacheProvider: CacheProvider<any>,\n private generateId: () => ID,\n private lifecycleProvider?: ITaskLifecycleProvider,\n private lifecycleConfig?: TaskHandlerLifecycleConfig,\n private entityProjection?: IEntityProjectionProvider<ID>,\n private entityProjectionConfig?: EntityProjectionConfig,\n private flowMiddleware?: FlowMiddleware<ID>\n ) {\n this.logger = new Logger('TaskRunner', LogLevel.INFO);\n this.lockManager = new LockManager(cacheProvider, {\n prefix: \"task_lock_\",\n defaultTimeout: 30 * 60\n });\n }\n\n // ============ Log Context Helpers (RFC-005) ============\n\n /**\n * Build ALS log store for a single task execution.\n * Runtime keys (task_id, task_type, worker_id) override user-supplied log_context.\n */\n private buildLogStore(task: CronTask<ID>, workerId: string): LogStore {\n return {\n ...(task.metadata?.log_context || {}),\n task_id: task.id?.toString() || tId(task),\n task_type: task.type,\n worker_id: workerId,\n };\n }\n\n /**\n * Build ALS log store for a multi-task (batch) execution.\n * Only runtime keys — no user log_context (ambiguous across tasks).\n */\n private buildBatchLogStore(tasks: CronTask<ID>[], workerId: string): LogStore {\n return {\n worker_id: workerId,\n batch_size: String(tasks.length),\n };\n }\n\n // ============ Lifecycle Helpers ============\n\n async run(\n taskRunnerId: string,\n tasksRaw: Array<CronTask<ID>>,\n asyncTaskManager?: IAsyncTaskManager,\n abortSignal?: AbortSignal\n ): Promise<ActionResults<ID> & { asyncTasks: AsyncTask<ID>[] }> {\n this.logger.info(`[${taskRunnerId}] Starting task runner`);\n this.logger.info(`[${taskRunnerId}] Processing ${tasksRaw.length} provided tasks`);\n\n if (abortSignal?.aborted) {\n this.logger.info(`[${taskRunnerId}] AbortSignal already aborted, returning empty results`);\n return {successTasks: [], failedTasks: [], newTasks: [], ignoredTasks: [], asyncTasks: [], flowProjections: []};\n }\n\n const tasks = await this.lockManager.filterLocked(tasksRaw, tId);\n\n this.logger.info(`[${taskRunnerId}] Found ${tasks.length} not locked tasks to process`);\n\n // Use DisposableLockBatch with await using for automatic lock cleanup\n // This ensures locks are ALWAYS released, even on exceptions or early returns\n await using locks = new DisposableLockBatch(\n this.lockManager,\n (lockId, err) => this.logger.error(`[${taskRunnerId}] Failed to release lock ${lockId}:`, err)\n );\n\n for (const task of tasks) {\n await locks.acquire(tId(task));\n }\n\n const groupedTasksObject = tasks\n .reduce((acc: Record<TaskType, CronTask<ID>[]>, task) => {\n acc[task.type] = acc[task.type] || [];\n acc[task.type].push(task);\n return acc;\n }, {} as Record<TaskType, CronTask<ID>[]>);\n\n const groupedTasksArray = (Object.keys(groupedTasksObject) as unknown as TaskType[]).reduce((acc: {\n type: TaskType,\n tasks: CronTask<ID>[]\n }[], type: TaskType) => {\n acc.push({type, tasks: groupedTasksObject[type]})\n return acc;\n }, [] as { type: TaskType, tasks: CronTask<ID>[] }[]);\n\n this.logger.info(`[${taskRunnerId}] Task groups: ${groupedTasksArray.map(g => `${g.type}: ${g.tasks.length}`).join(', ')}`);\n\n // RFC-003: Emit 'processing' projection for first-attempt entity tasks\n if (this.entityProjection) {\n try {\n const processingProjections = tasks\n .filter(t => t.entity && !t.execution_stats?.retry_count)\n .map(t => buildProjection(t, 'processing', {includePayload: this.entityProjectionConfig?.includePayload}))\n .filter((p): p is EntityTaskProjection<ID> => p !== null);\n await syncProjections(processingProjections, this.entityProjection, this.logger);\n } catch (err) {\n this.logger.error(`[TQ] Entity projection failed (non-fatal): ${err}`);\n }\n }\n\n const actions = new Actions<ID>(taskRunnerId);\n const asyncTasks: AsyncTask<ID>[] = [];\n const processedTaskIds = new Set<string>();\n\n for (let i = 0; i < groupedTasksArray.length; i++) {\n if (abortSignal?.aborted) {\n this.logger.info(`[${taskRunnerId}] AbortSignal detected, stopping task group processing`);\n break;\n }\n\n const taskGroup = groupedTasksArray[i];\n const firstTask = taskGroup.tasks[0];\n if (!firstTask) {\n this.logger.warn(`[${taskRunnerId}] No tasks found for type: ${taskGroup.type}`);\n continue;\n }\n const executor = this.taskQueue.getExecutor(firstTask.queue_id, taskGroup.type);\n if (!executor) {\n this.logger.warn(`[${taskRunnerId}] No executor found for type: ${taskGroup.type} in queue ${firstTask.queue_id}`);\n for (const task of taskGroup.tasks) {\n const taskWithId: CronTask<ID> = task.id\n ? task\n : {...task, id: this.generateId()};\n actions.addIgnoredTask(taskWithId);\n }\n continue;\n }\n\n if (executor.asyncConfig?.handoffTimeout && asyncTaskManager && !asyncTaskManager.canAcceptTask()) {\n this.logger.warn(`[${taskRunnerId}] Async queue full, rescheduling ${taskGroup.tasks.length} ${taskGroup.type} tasks for 3 min later`);\n\n const rescheduledTasks = taskGroup.tasks.map(task => ({\n ...task,\n execute_at: new Date(Date.now() + 180000),\n status: 'scheduled' as const\n }));\n\n await this.taskStore.updateTasksForRetry(rescheduledTasks);\n continue;\n }\n\n // Track that we're processing this task group\n taskGroup.tasks.forEach(task => processedTaskIds.add(tId(task)));\n\n this.logger.info(`[${taskRunnerId}] Processing ${taskGroup.tasks.length} tasks of type: ${taskGroup.type}`);\n\n if (executor.multiple) {\n const batchStore = this.buildBatchLogStore(taskGroup.tasks, taskRunnerId);\n await runWithLogContext(batchStore, () =>\n executor.onTasks(taskGroup.tasks as any[], actions).catch(err => {\n this.logger.error(`[${taskRunnerId}] executor.onTasks failed: ${err}`);\n for (const task of taskGroup.tasks) {\n if (actions.getTaskResultStatus(tId(task)) === 'pending') {\n actions.fail(task, err instanceof Error ? err : new Error(String(err)));\n }\n }\n })\n );\n } else {\n if (executor.parallel) {\n const chunks = chunk(taskGroup.tasks, executor.chunkSize) as CronTask<ID>[][];\n this.logger.info(`[${taskRunnerId}] Processing in parallel chunks of ${executor.chunkSize}`);\n for (const taskChunk of chunks) {\n // Emit onTaskStarted for all tasks in chunk\n for (const task of taskChunk) {\n this.emitTaskStarted(task, taskRunnerId);\n }\n\n const chunkPromises: Promise<void>[] = [];\n for (let j = 0; j < taskChunk.length; j++) {\n const task = taskChunk[j];\n const taskActions = actions.forkForTask(task);\n const logStore = this.buildLogStore(task, taskRunnerId);\n chunkPromises.push(runWithLogContext(logStore, () =>\n executor.onTask(task, taskActions).catch(err => {\n this.logger.error(`[${taskRunnerId}] executor.onTask failed: ${err}`);\n if (actions.getTaskResultStatus(tId(task)) === 'pending') {\n actions.fail(task, err instanceof Error ? err : new Error(String(err)));\n }\n })\n ));\n }\n await Promise.all(chunkPromises);\n\n // Emit completion events for all tasks in chunk\n for (const task of taskChunk) {\n const resultStatus = actions.getTaskResultStatus(tId(task));\n if (resultStatus === 'success') {\n this.emitTaskCompleted(task, taskRunnerId, actions.getTaskResult(tId(task)));\n } else if (resultStatus === 'fail') {\n const retryCount = (task.execution_stats?.retry_count as number) || 0;\n const maxRetries = task.retries ?? executor.default_retries ?? 0;\n const willRetry = retryCount < maxRetries;\n this.emitTaskFailed(task, taskRunnerId, new Error('Task failed'), willRetry);\n }\n }\n }\n } else {\n const timeoutMs = executor.asyncConfig?.handoffTimeout;\n\n for (let j = 0; j < taskGroup.tasks.length; j++) {\n const task = taskGroup.tasks[j];\n\n if (!timeoutMs) {\n // Emit onTaskStarted\n this.emitTaskStarted(task, taskRunnerId);\n\n const taskActions = actions.forkForTask(task);\n const logStore = this.buildLogStore(task, taskRunnerId);\n await runWithLogContext(logStore, () =>\n executor.onTask(task, taskActions).catch(err => {\n this.logger.error(`[${taskRunnerId}] executor.onTask failed: ${err}`);\n if (actions.getTaskResultStatus(tId(task)) === 'pending') {\n actions.fail(task, err instanceof Error ? err : new Error(String(err)));\n }\n })\n );\n\n // Emit completion event based on result\n const resultStatus = actions.getTaskResultStatus(tId(task));\n if (resultStatus === 'success') {\n this.emitTaskCompleted(task, taskRunnerId, actions.getTaskResult(tId(task)));\n } else if (resultStatus === 'fail') {\n const retryCount = (task.execution_stats?.retry_count as number) || 0;\n const maxRetries = task.retries ?? executor.default_retries ?? 0;\n const willRetry = retryCount < maxRetries;\n this.emitTaskFailed(task, taskRunnerId, new Error('Task failed'), willRetry);\n }\n } else {\n // Emit onTaskStarted for async-capable tasks\n this.emitTaskStarted(task, taskRunnerId);\n\n const startTime = Date.now();\n let isTimedOut = false;\n\n const taskActions = actions.forkForTask(task);\n const logStore = this.buildLogStore(task, taskRunnerId);\n\n const taskPromise = runWithLogContext(logStore, () =>\n executor.onTask(task, taskActions).catch(err => {\n this.logger.error(`[${taskRunnerId}] executor.onTask failed: ${err}`);\n if (actions.getTaskResultStatus(tId(task)) === 'pending') {\n actions.fail(task, err instanceof Error ? err : new Error(String(err)));\n }\n })\n );\n\n let timeoutId: NodeJS.Timeout | undefined;\n const timeoutPromise = new Promise<'~~~timeout'>(resolve => {\n timeoutId = setTimeout(() => {\n isTimedOut = true;\n resolve('~~~timeout');\n }, timeoutMs);\n\n // Support early cancellation via AbortSignal\n // Note: In real usage, this would come from the task execution context\n // For now, this is a foundation for future AbortSignal integration\n });\n\n const result = await Promise.race([taskPromise, timeoutPromise]);\n\n // Clear the timeout to prevent memory leak\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n if (result !== '~~~timeout') {\n // Task completed before timeout - emit lifecycle event\n const resultStatus = actions.getTaskResultStatus(tId(task));\n if (resultStatus === 'success') {\n this.emitTaskCompleted(task, taskRunnerId, actions.getTaskResult(tId(task)));\n } else if (resultStatus === 'fail') {\n const retryCount = (task.execution_stats?.retry_count as number) || 0;\n const maxRetries = task.retries ?? executor.default_retries ?? 0;\n const willRetry = retryCount < maxRetries;\n this.emitTaskFailed(task, taskRunnerId, new Error('Task failed'), willRetry);\n }\n }\n\n if (result === '~~~timeout') {\n this.logger.info(`[${taskRunnerId}] Task ${tId(task)} (${task.type}) exceeded ${timeoutMs}ms, marking for async handoff`);\n\n if (!asyncTaskManager) {\n throw new Error(`Task ${task.type} exceeded timeout but AsyncTaskManager not initialized!`);\n }\n\n if (!task.id) {\n this.logger.error(`[${taskRunnerId}] Cannot hand off task without id (type: ${task.type}). Task will continue but won't be tracked.`);\n } else {\n const asyncLifecycleEmitter = this.lifecycleProvider ? {\n onCompleted: (t: CronTask<ID>, result?: unknown) => {\n this.emitTaskCompleted(t, taskRunnerId, result);\n },\n onFailed: (t: CronTask<ID>, error: Error, willRetry: boolean) => {\n this.emitTaskFailed(t, taskRunnerId, error, willRetry);\n }\n } : undefined;\n const asyncActions = new AsyncActions<ID>(this.messageQueue, this.taskStore, this.taskQueue, actions, task, this.generateId, asyncLifecycleEmitter, this.entityProjection, this.entityProjectionConfig, this.flowMiddleware);\n\n const asyncPromise = taskPromise\n .finally(async () => {\n try {\n await asyncActions.onPromiseFulfilled();\n } catch (err) {\n this.logger.error(`[${taskRunnerId}] Failed to execute async actions for task ${tId(task)}:`, err);\n }\n });\n\n asyncTasks.push({\n task,\n promise: asyncPromise,\n startTime,\n actions: asyncActions\n });\n }\n }\n }\n }\n }\n }\n }\n\n const asyncTaskIds = asyncTasks.map(at => tId(at.task));\n const results = actions.extractSyncResults(asyncTaskIds);\n\n this.logger.info(`[${taskRunnerId}] Completing run - Success: ${results.successTasks.length}, Failed: ${results.failedTasks.length}, New: ${results.newTasks.length}, Async: ${asyncTasks.length}, Ignored: ${results.ignoredTasks.length}`);\n\n // Locks are automatically released by DisposableLockBatch via await using\n return {...results, asyncTasks};\n }\n\n private emitLifecycleEvent<T>(\n callback: ((ctx: T) => void | Promise<void>) | undefined,\n ctx: T\n ): void {\n if (!callback) return;\n\n try {\n const result = callback(ctx);\n if (result instanceof Promise) {\n result.catch(err => {\n this.logger.error(`[TQ] Lifecycle callback error: ${err}`);\n });\n }\n } catch (err) {\n this.logger.error(`[TQ] Lifecycle callback error: ${err}`);\n }\n }\n\n private buildTaskContext(task: CronTask<ID>, workerId?: string): TaskContext {\n const retryCount = (task.execution_stats && typeof task.execution_stats.retry_count === 'number')\n ? task.execution_stats.retry_count\n : 0;\n const executor = this.taskQueue.getExecutor(task.queue_id, task.type);\n const maxRetries = task.retries ?? executor?.default_retries ?? 0;\n const payload = task.payload as Record<string, unknown>;\n\n return {\n task_id: task.id?.toString() || tId(task),\n task_hash: payload?.task_hash as string | undefined,\n task_type: task.type,\n queue_id: task.queue_id,\n payload: this.lifecycleConfig?.include_payload ? payload : {},\n attempt: retryCount + 1,\n max_retries: maxRetries,\n scheduled_at: task.created_at || new Date(),\n worker_id: workerId,\n log_context: task.metadata?.log_context,\n };\n }\n\n private emitTaskStarted(task: CronTask<ID>, workerId: string): void {\n const startedAt = Date.now();\n this.taskStartTimes.set(tId(task), startedAt);\n\n if (this.lifecycleProvider?.onTaskStarted) {\n const ctx = this.buildTaskContext(task, workerId);\n const queuedDuration = startedAt - (task.created_at?.getTime() || startedAt);\n this.emitLifecycleEvent(\n this.lifecycleProvider.onTaskStarted,\n {\n ...ctx,\n started_at: new Date(startedAt),\n queued_duration_ms: queuedDuration\n }\n );\n }\n }\n\n private emitTaskCompleted(task: CronTask<ID>, workerId: string, result?: unknown): void {\n const completedAt = Date.now();\n const startedAt = this.taskStartTimes.get(tId(task)) || completedAt;\n this.taskStartTimes.delete(tId(task));\n\n if (this.lifecycleProvider?.onTaskCompleted) {\n const ctx = this.buildTaskContext(task, workerId);\n const timing: TaskTiming = {\n queued_duration_ms: startedAt - (task.created_at?.getTime() || startedAt),\n processing_duration_ms: completedAt - startedAt,\n total_duration_ms: completedAt - (task.created_at?.getTime() || completedAt)\n };\n this.emitLifecycleEvent(\n this.lifecycleProvider.onTaskCompleted,\n {...ctx, timing, result}\n );\n }\n }\n\n private emitTaskFailed(task: CronTask<ID>, workerId: string, error: Error, willRetry: boolean, nextAttemptAt?: Date): void {\n const completedAt = Date.now();\n const startedAt = this.taskStartTimes.get(tId(task)) || completedAt;\n this.taskStartTimes.delete(tId(task));\n\n if (this.lifecycleProvider?.onTaskFailed) {\n const ctx = this.buildTaskContext(task, workerId);\n const timing: TaskTiming = {\n queued_duration_ms: startedAt - (task.created_at?.getTime() || startedAt),\n processing_duration_ms: completedAt - startedAt,\n total_duration_ms: completedAt - (task.created_at?.getTime() || completedAt)\n };\n this.emitLifecycleEvent(\n this.lifecycleProvider.onTaskFailed,\n {...ctx, timing, error, will_retry: willRetry, next_attempt_at: nextAttemptAt}\n );\n }\n }\n}","import {getEnvironmentQueueName, QueueName} from \"@supergrowthai/mq\";\n\n/**\n * Gets all queue names for the current environment\n * @returns Array of full queue names including environment suffix\n */\nexport function getEnabledQueues(): QueueName[] {\n let enabledQueues: QueueName[] = process.env.ENABLED_QUEUES ? JSON.parse(process.env.ENABLED_QUEUES!) : [];\n\n if (enabledQueues.length === 0) throw new Error('No queues enabled');\n\n return enabledQueues.map(getEnvironmentQueueName);\n}\n","import {TaskStore} from \"./TaskStore.js\";\nimport {LockManager, Logger, LogLevel} from \"@supergrowthai/utils\"\nimport {TaskRunner} from \"./TaskRunner.js\";\nimport {getEnabledQueues} from \"./environment.js\";\nimport moment from \"moment\";\nimport type {MessageConsumer} from \"@supergrowthai/mq\";\nimport {IMessageQueue, QueueName} from \"@supergrowthai/mq\";\nimport type {MessageMetadata} from \"@supergrowthai/mq\";\nimport {ProcessedTaskResult} from \"./task-processor-types.js\";\nimport {CronTask, ITaskStorageAdapter} from \"../adapters\";\nimport type {CacheProvider} from \"memoose-js\";\nimport {TaskQueuesManager} from \"./TaskQueuesManager\";\nimport {IAsyncTaskManager} from \"./async/async-task-manager\";\nimport type {AsyncTask} from \"./TaskRunner.js\";\nimport {\n DiscardedTaskInfo,\n ITaskNotificationProvider,\n TaskErrorInfo,\n TaskQueueStats\n} from \"./ITaskNotificationProvider.js\";\nimport type {\n ITaskLifecycleProvider,\n IWorkerLifecycleProvider,\n TaskContext,\n TaskHandlerConfig,\n WorkerInfo,\n WorkerStats\n} from \"./lifecycle.js\";\nimport type {IEntityProjectionProvider, EntityTaskProjection} from \"./entity/IEntityProjectionProvider.js\";\nimport {buildProjection, syncProjections} from \"./entity/IEntityProjectionProvider.js\";\nimport * as os from \"os\";\n\nconst METRICS_KEY_PREFIX = 'task_metrics:';\nconst DISCARDED_TASKS_KEY = `${METRICS_KEY_PREFIX}discarded_tasks`;\nconst STATS_THRESHOLD = parseInt(process.env.TQ_STATS_THRESHOLD || '1000');\nconst FAILURE_THRESHOLD = parseInt(process.env.TQ_STATS_FAILURE_THRESHOLD || '100');\nconst INSTANCE_ID = process.env.INSTANCE_ID || 'unknown';\n\n\nexport class TaskHandler<ID> {\n private readonly logger: Logger;\n private taskRunner: TaskRunner<ID>;\n private readonly taskStore: TaskStore<ID>;\n private matureTaskTimer: NodeJS.Timeout | null = null;\n private heartbeatTimer: NodeJS.Timeout | null = null;\n private readonly config: TaskHandlerConfig;\n\n // Worker info\n private readonly workerId: string;\n private readonly workerStartedAt: Date;\n private enabledQueues: string[] = [];\n private workerStarted = false;\n\n // Worker stats\n private workerStats: WorkerStats = {\n tasks_processed: 0,\n tasks_succeeded: 0,\n tasks_failed: 0,\n avg_processing_ms: 0,\n current_task: undefined\n };\n private totalProcessingMs = 0;\n\n private readonly queueStats = new Map<QueueName, {\n success: number;\n failed: number;\n async: number;\n ignored: number;\n }>();\n\n constructor(\n private messageQueue: IMessageQueue<ID>,\n private taskQueuesManager: TaskQueuesManager<ID>,\n private databaseAdapter: ITaskStorageAdapter<ID>,\n private cacheAdapter: CacheProvider<any>,\n private asyncTaskManager?: IAsyncTaskManager<ID>,\n private notificationProvider?: ITaskNotificationProvider,\n config?: TaskHandlerConfig\n ) {\n this.logger = new Logger('TaskHandler', LogLevel.INFO);\n this.config = config || {};\n\n // Initialize worker identity\n this.workerId = `${os.hostname()}-${process.pid}-${Date.now()}`;\n this.workerStartedAt = new Date();\n\n this.taskStore = new TaskStore<ID>(databaseAdapter);\n this.taskRunner = new TaskRunner<ID>(\n messageQueue,\n taskQueuesManager,\n this.taskStore,\n this.cacheAdapter,\n databaseAdapter.generateId.bind(databaseAdapter),\n this.config.lifecycleProvider,\n this.config.lifecycle,\n this.config.entityProjection,\n this.config.entityProjectionConfig,\n this.config.flowMiddleware\n );\n }\n\n // ============ Lifecycle Event Helpers ============\n\n private get lifecycleProvider(): ITaskLifecycleProvider | undefined {\n return this.config.lifecycleProvider;\n }\n\n private get workerProvider(): IWorkerLifecycleProvider | undefined {\n return this.config.workerProvider;\n }\n\n private get entityProjectionProvider(): IEntityProjectionProvider | undefined {\n return this.config.entityProjection;\n }\n\n /**\n * Validate and sanitize log_context on a task (RFC-005).\n * - >10 keys: truncate to first 10 alphabetically, warn\n * - >1024 bytes total: drop entire context, warn\n */\n private validateLogContext(task: CronTask<ID>): CronTask<ID> {\n const logCtx = task.metadata?.log_context;\n if (!logCtx) return task;\n\n let validatedCtx = logCtx;\n const keys = Object.keys(logCtx).sort();\n\n // Truncate to 10 keys\n if (keys.length > 10) {\n this.logger.warn(`[TQ] log_context has ${keys.length} keys (max 10), truncating for task type ${task.type}`);\n const truncated: Record<string, string> = {};\n for (let i = 0; i < 10; i++) truncated[keys[i]] = logCtx[keys[i]];\n validatedCtx = truncated;\n }\n\n // Check total size (1KB limit)\n const serialized = JSON.stringify(validatedCtx);\n if (serialized.length > 1024) {\n this.logger.warn(`[TQ] log_context exceeds 1KB (${serialized.length} chars), dropping for task type ${task.type}`);\n const {log_context: _, ...restMeta} = task.metadata!;\n return {...task, metadata: Object.keys(restMeta).length > 0 ? (restMeta as MessageMetadata) : undefined} as CronTask<ID>;\n }\n\n if (validatedCtx !== logCtx) {\n return {...task, metadata: {...task.metadata, log_context: validatedCtx}};\n }\n return task;\n }\n\n async addTasks(tasks: CronTask<ID>[]) {\n // Validate log_context on all tasks (RFC-005)\n tasks = tasks.map(t => this.validateLogContext(t));\n\n const diffedItems = tasks.reduce(\n (acc, {force_store, ...task}) => {\n const currentTime = new Date();\n const executeTime = task.execute_at;\n const timeDifference = (executeTime.getTime() - currentTime.getTime()) / 1000 / 60;\n\n const queue = task.queue_id;\n if (timeDifference > 2) {\n // Future task — persist to DB, mature processor will pick it up later\n acc.future[queue] = acc.future[queue] || [];\n acc.future[queue].push(task);\n } else if (force_store) {\n // Immediate but force_store — persist to DB AND send to MQ now\n acc.forceStoreImmediate[queue] = acc.forceStoreImmediate[queue] || [];\n acc.forceStoreImmediate[queue].push(task);\n } else {\n // Immediate — send to MQ only\n acc.immediate[queue] = acc.immediate[queue] || [];\n acc.immediate[queue].push(task);\n }\n\n return acc;\n },\n {\n future: {} as { [key in QueueName]: CronTask<ID>[] },\n immediate: {} as { [key in QueueName]: CronTask<ID>[] },\n forceStoreImmediate: {} as { [key in QueueName]: CronTask<ID>[] },\n }\n );\n\n const iQueues = Object.keys(diffedItems.immediate) as unknown as QueueName[];\n for (let i = 0; i < iQueues.length; i++) {\n const queue = iQueues[i];\n const queueTasks: CronTask<ID>[] = diffedItems.immediate[queue]\n .map((task) => {\n const executor = this.taskQueuesManager.getExecutor(task.queue_id, task.type);\n const shouldStoreOnFailure = executor?.store_on_failure ?? false;\n const id = shouldStoreOnFailure ? {id: this.databaseAdapter.generateId(),} : {}\n const partitionKey = executor?.getPartitionKey?.(task);\n return ({...id, ...task, ...(partitionKey ? {partition_key: partitionKey} : {})});\n });\n\n // RFC-003: Write 'scheduled' projections BEFORE addMessages to prevent\n // terminal projection overwrite in immediate/synchronous execution mode.\n if (this.entityProjectionProvider) {\n try {\n const includePayload = this.config.entityProjectionConfig?.includePayload;\n const entityProjections = queueTasks\n .filter(t => t.entity)\n .map(t => buildProjection(t, 'scheduled', {includePayload}))\n .filter((p): p is EntityTaskProjection => p !== null);\n await syncProjections(entityProjections, this.entityProjectionProvider, this.logger);\n } catch (err) {\n this.logger.error(`[TQ] Entity projection failed (non-fatal): ${err}`);\n }\n }\n\n await this.messageQueue.addMessages(queue, queueTasks as unknown as CronTask<ID>[]);\n\n // Emit onTaskScheduled for each task\n if (this.lifecycleProvider?.onTaskScheduled) {\n for (const task of queueTasks) {\n this.emitLifecycleEvent(\n this.lifecycleProvider.onTaskScheduled,\n this.buildTaskContext(task)\n );\n }\n }\n }\n\n // force_store + immediate: persist to Task DB as 'processing', then send to MQ.\n // DB status = 'processing': prevents the mature task poller from re-enqueuing.\n // MQ status = 'scheduled': DB-backed MQ adapters (MongoDB, Prisma) only consume\n // messages with status:'scheduled', so the MQ copy must use that status.\n // TODO(D1): Apply getPartitionKey here too (same as immediate path above).\n // Currently forceStoreImmediate tasks skip partition key enrichment.\n const fsQueues = Object.keys(diffedItems.forceStoreImmediate) as unknown as QueueName[];\n for (let i = 0; i < fsQueues.length; i++) {\n const queue = fsQueues[i];\n const queueTasks: CronTask<ID>[] = diffedItems.forceStoreImmediate[queue]\n .map((task) => {\n const id = task.id ? {} : {id: this.databaseAdapter.generateId()};\n return ({...id, ...task, status: 'processing', processing_started_at: new Date()});\n });\n\n await this.taskStore.addTasksToScheduled(queueTasks);\n\n // RFC-003: Write 'scheduled' projections BEFORE addMessages to prevent\n // terminal projection overwrite in immediate/synchronous execution mode.\n if (this.entityProjectionProvider) {\n try {\n const includePayload = this.config.entityProjectionConfig?.includePayload;\n const entityProjections = queueTasks\n .filter(t => t.entity)\n .map(t => buildProjection(t, 'scheduled', {includePayload}))\n .filter((p): p is EntityTaskProjection => p !== null);\n await syncProjections(entityProjections, this.entityProjectionProvider, this.logger);\n } catch (err) {\n this.logger.error(`[TQ] Entity projection failed (non-fatal): ${err}`);\n }\n }\n\n // Send to MQ with 'scheduled' status — DB-backed adapters (MongoDB, Prisma) filter\n // by status:'scheduled', so the message must use that status for consumption.\n // The Task DB retains status:'processing' to block the mature poller.\n const mqTasks = queueTasks.map(t => ({...t, status: 'scheduled' as const}));\n try {\n await this.messageQueue.addMessages(queue, mqTasks as unknown as CronTask<ID>[]);\n } catch (mqError) {\n // MQ failed after DB write - reset to 'scheduled' so mature poller can pick up\n this.logger.error(`MQ write failed for forceStoreImmediate tasks, resetting to scheduled: ${mqError}`);\n const taskIds = queueTasks.map(t => t.id).filter(Boolean) as ID[];\n if (taskIds.length > 0) {\n await this.databaseAdapter.updateTasks(\n taskIds.map(id => ({id, updates: {status: 'scheduled' as const}}))\n ).catch(resetErr => {\n this.logger.error(`Failed to reset tasks to scheduled after MQ failure: ${resetErr}`);\n });\n }\n throw mqError;\n }\n\n // Emit onTaskScheduled for each task\n if (this.lifecycleProvider?.onTaskScheduled) {\n for (const task of queueTasks) {\n this.emitLifecycleEvent(\n this.lifecycleProvider.onTaskScheduled,\n this.buildTaskContext(task)\n );\n }\n }\n }\n\n const fQueues = Object.keys(diffedItems.future) as unknown as QueueName[];\n for (let i = 0; i < fQueues.length; i++) {\n const queue = fQueues[i];\n const queueTasks: CronTask<ID>[] = diffedItems.future[queue]\n .map((task) => {\n const executor = this.taskQueuesManager.getExecutor(task.queue_id, task.type);\n const shouldStoreOnFailure = executor?.store_on_failure ?? false;\n const id = shouldStoreOnFailure ? {id: this.databaseAdapter.generateId(),} : {}\n return ({...id, ...task});\n });\n await this.taskStore.addTasksToScheduled(queueTasks);\n\n // RFC-003: Write 'scheduled' projections for future tasks after DB persistence.\n if (this.entityProjectionProvider) {\n try {\n const includePayload = this.config.entityProjectionConfig?.includePayload;\n const entityProjections = queueTasks\n .filter(t => t.entity)\n .map(t => buildProjection(t, 'scheduled', {includePayload}))\n .filter((p): p is EntityTaskProjection => p !== null);\n await syncProjections(entityProjections, this.entityProjectionProvider, this.logger);\n } catch (err) {\n this.logger.error(`[TQ] Entity projection failed (non-fatal): ${err}`);\n }\n }\n\n // Emit onTaskScheduled for each task\n if (this.lifecycleProvider?.onTaskScheduled) {\n for (const task of queueTasks) {\n this.emitLifecycleEvent(\n this.lifecycleProvider.onTaskScheduled,\n this.buildTaskContext(task)\n );\n }\n }\n }\n }\n\n // TODO(P2): Wrap retry upsert → new tasks → mark failed → mark success in a\n // transaction. If an intermediate step fails, tasks can be lost or re-executed\n // after 2-day stale recovery. Reorder to mark success first as a quick win.\n async postProcessTasks({\n failedTasks: failedTasksRaw,\n newTasks,\n successTasks\n }: ProcessedTaskResult<ID>) {\n const tasksToRetry: CronTask<ID>[] = [];\n const finalFailedTasks: CronTask<ID>[] = [];\n const discardedTasks: CronTask<ID>[] = [];\n\n // Maximum retry delay cap to prevent unbounded delays\n const MAX_RETRY_DELAY_MS = 5 * 60 * 1000; // 5 minutes\n\n for (const task of failedTasksRaw) {\n const taskRetryCount = (task.execution_stats && typeof task.execution_stats.retry_count === 'number') ? task.execution_stats.retry_count : 0;\n const taskRetryAfter = Math.max(task.retry_after || 2000, 0);\n const calculatedDelay = taskRetryAfter * Math.pow(taskRetryCount + 1, 2);\n const retryAfter = Math.min(calculatedDelay, MAX_RETRY_DELAY_MS);\n const executeAt = Date.now() + retryAfter;\n const maxRetries = this.getRetryCount(task);\n\n if (task.id && taskRetryCount < maxRetries) {\n tasksToRetry.push({\n ...task,\n status: 'scheduled',\n execute_at: new Date(executeAt),\n execution_stats: {\n ...(task.execution_stats || {}),\n retry_count: taskRetryCount + 1\n }\n });\n } else if (task.id) {\n finalFailedTasks.push(task);\n } else if (taskRetryCount < maxRetries) {\n const shouldStoreOnFailure = this.taskQueuesManager.getExecutor(task.queue_id, task.type)?.store_on_failure;\n if (shouldStoreOnFailure) {\n tasksToRetry.push({\n ...task,\n id: this.databaseAdapter.generateId(),\n status: 'scheduled',\n execute_at: new Date(executeAt),\n execution_stats: {\n ...(task.execution_stats || {}),\n retry_count: taskRetryCount + 1\n }\n });\n } else {\n await this.addTasks([{\n ...task,\n status: 'scheduled',\n execute_at: new Date(executeAt),\n execution_stats: {\n ...(task.execution_stats || {}),\n retry_count: taskRetryCount + 1\n }\n }]);\n }\n } else {\n discardedTasks.push(task);\n this.logger.info(`Discarding task of type ${task.type} after ${taskRetryCount} retries`);\n\n // Emit onTaskExhausted for discarded tasks\n if (this.lifecycleProvider?.onTaskExhausted) {\n const ctx = this.buildTaskContext(task);\n const errorMessage = task.execution_stats?.last_error as string || 'Task exhausted all retries';\n this.emitLifecycleEvent(\n this.lifecycleProvider.onTaskExhausted,\n {\n ...ctx,\n timing: {\n queued_duration_ms: 0,\n processing_duration_ms: 0,\n total_duration_ms: Date.now() - (task.created_at?.getTime() || Date.now())\n },\n error: new Error(errorMessage),\n total_attempts: taskRetryCount + 1\n }\n );\n }\n }\n }\n\n if (discardedTasks.length > 0) {\n await this.trackDiscardedTasks(discardedTasks.length);\n }\n\n if (tasksToRetry.length > 0) {\n // Persist to DB with 'processing' status to block processMatureTasks from\n // double-picking. Follows the same pattern as forceStoreImmediate (line ~236).\n const dbRetryTasks = tasksToRetry.map(t => ({\n ...t,\n status: 'processing' as const,\n processing_started_at: new Date()\n }));\n await this.taskStore.updateTasksForRetry(dbRetryTasks);\n\n // Re-enqueue to MQ so consumers can pick them up without waiting for\n // the processMatureTasks polling loop. DB-backed MQ adapters (MongoDB,\n // Prisma) gate on execute_at, so future-timed retries wait until ready.\n // ImmediateQueue and Kinesis execute immediately (backoff not enforced\n // at MQ layer — acceptable for test/stream modes).\n const retryByQueue = new Map<QueueName, CronTask<ID>[]>();\n for (const task of tasksToRetry) {\n const queue = task.queue_id as QueueName;\n if (!retryByQueue.has(queue)) retryByQueue.set(queue, []);\n retryByQueue.get(queue)!.push(task);\n }\n for (const [queue, retryQueueTasks] of retryByQueue) {\n try {\n await this.messageQueue.addMessages(queue, retryQueueTasks as unknown as CronTask<ID>[]);\n } catch (mqErr) {\n // MQ failed — DB still has status:'processing'. Stale recovery\n // (2-day timeout) will reset to 'scheduled' as a last resort.\n this.logger.error(`[TQ] Failed to re-enqueue retry tasks to MQ (stale recovery will handle): ${mqErr}`);\n }\n }\n }\n\n if (finalFailedTasks.length > 0) {\n await this.taskStore.markTasksAsFailed(finalFailedTasks);\n }\n\n if (successTasks.length > 0) {\n await this.taskStore.markTasksAsSuccess(successTasks);\n }\n\n // RFC-003: Emit terminal entity projections\n if (this.entityProjectionProvider) {\n try {\n const includePayload = this.config.entityProjectionConfig?.includePayload;\n const terminalProjections: EntityTaskProjection[] = [];\n\n // Success tasks → 'executed'\n for (const task of successTasks) {\n const p = buildProjection(task, 'executed', {\n includePayload,\n result: task.execution_result,\n });\n if (p) terminalProjections.push(p);\n }\n\n // Final failed tasks (with id, exhausted retries) → 'failed'\n for (const task of finalFailedTasks) {\n const p = buildProjection(task, 'failed', {\n includePayload,\n error: task.execution_stats?.last_error as string || 'Task failed',\n });\n if (p) terminalProjections.push(p);\n }\n\n // Discarded tasks (no id, exhausted retries) → 'failed'\n for (const task of discardedTasks) {\n try {\n const p = buildProjection(task, 'failed', {\n includePayload,\n error: task.execution_stats?.last_error as string || 'Task exhausted all retries',\n });\n if (p) terminalProjections.push(p);\n } catch (projErr) {\n this.logger.error(`[TQ] Entity projection build failed (non-fatal): ${projErr}`);\n }\n }\n\n await syncProjections(terminalProjections, this.entityProjectionProvider, this.logger);\n } catch (err) {\n this.logger.error(`[TQ] Entity projection failed (non-fatal): ${err}`);\n }\n }\n\n // RFC-002: Flow middleware — process completed tasks for barrier tracking and join dispatch\n if (this.config.flowMiddleware) {\n try {\n const flowResult = await this.config.flowMiddleware.onPostProcess({successTasks, failedTasks: finalFailedTasks});\n\n // Sync flow entity projections\n if (flowResult.projections.length > 0 && this.entityProjectionProvider) {\n await syncProjections(flowResult.projections, this.entityProjectionProvider, this.logger);\n }\n\n // Dispatch join tasks\n if (flowResult.joinTasks.length > 0) {\n await this.addTasks(flowResult.joinTasks);\n }\n } catch (err) {\n this.logger.error(`[TQ] Flow middleware failed (non-fatal): ${err}`);\n }\n }\n\n // Dispatch new tasks (executor-spawned child tasks)\n if (newTasks.length > 0) {\n await this.addTasks(newTasks);\n }\n }\n\n startConsumingTasks(streamName: QueueName, abortSignal?: AbortSignal) {\n return this.messageQueue.consumeMessagesStream(streamName, async (id, tasks) => {\n if (abortSignal?.aborted) {\n this.logger.info(`AbortSignal detected, skipping processing of ${tasks.length} tasks for stream ${streamName}`);\n return {failedTasks: [], newTasks: [], successTasks: [], asyncTasks: [], ignoredTasks: []};\n }\n\n const batchStartTime = Date.now();\n const taskTypes = [...new Set(tasks.map(t => t.type))];\n\n // Emit batch started\n if (this.workerProvider?.onBatchStarted) {\n this.emitLifecycleEvent(\n this.workerProvider.onBatchStarted,\n {\n ...this.buildWorkerInfo(),\n batch_size: tasks.length,\n task_types: taskTypes\n }\n );\n }\n\n this.logger.debug(`Processing ${tasks.length} tasks for stream ${streamName}`);\n const {\n failedTasks,\n newTasks,\n successTasks,\n asyncTasks,\n ignoredTasks,\n flowProjections\n } = await this.taskRunner.run(id, tasks, this.asyncTaskManager, abortSignal)\n .catch(err => {\n this.logger.error(\"Failed to execute tasks, returning all as failed for retry:\", err);\n return {\n failedTasks: tasks as CronTask<ID>[],\n newTasks: [] as CronTask<ID>[],\n successTasks: [] as CronTask<ID>[],\n asyncTasks: [] as AsyncTask<ID>[],\n ignoredTasks: [] as CronTask<ID>[],\n flowProjections: [] as EntityTaskProjection[]\n }\n });\n\n if (asyncTasks.length > 0 && !this.asyncTaskManager) {\n throw new Error(\"Async tasks detected but AsyncTaskManager not initialized!\");\n }\n if (asyncTasks.length > 0) {\n this.logger.info(`Handling ${asyncTasks.length} async tasks for stream ${streamName}`);\n for (const asyncTask of asyncTasks) {\n // Get per-task timeout from executor's asyncConfig\n const executor = this.taskQueuesManager.getExecutor(asyncTask.task.queue_id, asyncTask.task.type);\n const taskTimeout = executor?.asyncConfig?.handoffTimeout\n ? executor.asyncConfig.handoffTimeout * 2\n : undefined;\n\n const accepted = this.asyncTaskManager!.handoffTask(asyncTask.task, asyncTask.promise, taskTimeout);\n if (!accepted) {\n this.logger.warn(`Async queue full, requeueing task ${asyncTask.task.id} with 30s delay`);\n await this.addTasks([{\n ...asyncTask.task,\n execute_at: new Date(Date.now() + 30000)\n }]);\n }\n }\n }\n\n if (ignoredTasks.length > 0) {\n this.logger.warn(`Storing ${ignoredTasks.length} ignored tasks with no executor for stream ${streamName}`);\n await this.taskStore.markTasksAsIgnored(ignoredTasks)\n .catch(err => {\n this.logger.error(\"Failed to mark tasks as ignored\", err)\n });\n }\n\n // RFC-002: Sync flow projections from startFlow calls (processing status, task_id = flow_id)\n if (this.entityProjectionProvider && flowProjections?.length > 0) {\n await syncProjections(flowProjections, this.entityProjectionProvider, this.logger);\n }\n\n await this.postProcessTasks({failedTasks, newTasks, successTasks})\n .catch(err => {\n this.logger.error(\"Failed to postProcessTasks\", err)\n throw err;\n })\n\n if (!this.queueStats.has(streamName)) {\n this.queueStats.set(streamName, {\n success: 0,\n failed: 0,\n async: 0,\n ignored: 0\n });\n }\n const stats = this.queueStats.get(streamName)!;\n stats.success += successTasks.length;\n stats.failed += failedTasks.length;\n stats.async += asyncTasks.length;\n stats.ignored += ignoredTasks.length;\n\n await this.reportQueueStats(streamName);\n\n // Update worker stats\n const batchDuration = Date.now() - batchStartTime;\n this.updateWorkerStats(successTasks.length, failedTasks.length, batchDuration);\n\n // Emit batch completed\n if (this.workerProvider?.onBatchCompleted) {\n this.emitLifecycleEvent(\n this.workerProvider.onBatchCompleted,\n {\n ...this.buildWorkerInfo(),\n batch_size: tasks.length,\n succeeded: successTasks.length,\n failed: failedTasks.length,\n duration_ms: batchDuration\n }\n );\n }\n\n this.logger.debug(`Completed processing for stream ${streamName}: ${successTasks.length} succeeded, ${failedTasks.length} failed, ${newTasks.length} new tasks, ${ignoredTasks.length} ignored`);\n return {failedTasks, newTasks, successTasks, asyncTasks, ignoredTasks};\n }, abortSignal);\n }\n\n taskProcessServer(abortSignal?: AbortSignal) {\n const queues = getEnabledQueues();\n this.enabledQueues = queues;\n\n // Emit worker started event\n if (!this.workerStarted) {\n this.workerStarted = true;\n this.emitWorkerStarted();\n this.startHeartbeat();\n }\n\n for (let i = 0; i < queues.length; i++) {\n this.logger.info(`Starting consumer for queue: ${queues[i]}`);\n this.startConsumingTasks(queues[i], abortSignal);\n }\n this.logger.info('Starting mature tasks processor');\n this.processMatureTasks(abortSignal);\n\n // Handle worker shutdown\n abortSignal?.addEventListener('abort', () => {\n this.stopHeartbeat();\n this.emitWorkerStopped('shutdown');\n });\n }\n\n private buildWorkerInfo(): WorkerInfo {\n return {\n worker_id: this.workerId,\n hostname: os.hostname(),\n pid: process.pid,\n started_at: this.workerStartedAt,\n enabled_queues: this.enabledQueues\n };\n }\n\n private emitWorkerStarted(): void {\n if (!this.workerProvider?.onWorkerStarted) return;\n this.emitLifecycleEvent(this.workerProvider.onWorkerStarted, this.buildWorkerInfo());\n }\n\n private emitWorkerStopped(reason: 'shutdown' | 'error' | 'idle_timeout'): void {\n if (!this.workerProvider?.onWorkerStopped) return;\n this.emitLifecycleEvent(\n this.workerProvider.onWorkerStopped,\n {\n ...this.buildWorkerInfo(),\n reason,\n final_stats: {...this.workerStats}\n }\n );\n }\n\n private emitWorkerHeartbeat(): void {\n if (!this.workerProvider?.onWorkerHeartbeat) return;\n\n const memUsage = process.memoryUsage();\n this.emitLifecycleEvent(\n this.workerProvider.onWorkerHeartbeat,\n {\n ...this.buildWorkerInfo(),\n stats: {...this.workerStats},\n memory_usage_mb: memUsage.heapUsed / 1024 / 1024\n }\n );\n }\n\n private startHeartbeat(): void {\n if (this.heartbeatTimer) return;\n\n const intervalMs = this.config.lifecycle?.heartbeat_interval_ms || 5000;\n this.heartbeatTimer = setInterval(() => {\n this.emitWorkerHeartbeat();\n }, intervalMs);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n private updateWorkerStats(succeeded: number, failed: number, processingMs: number): void {\n this.workerStats.tasks_processed += succeeded + failed;\n this.workerStats.tasks_succeeded += succeeded;\n this.workerStats.tasks_failed += failed;\n this.totalProcessingMs += processingMs;\n\n if (this.workerStats.tasks_processed > 0) {\n this.workerStats.avg_processing_ms = this.totalProcessingMs / this.workerStats.tasks_processed;\n }\n }\n\n private emitLifecycleEvent<T>(\n callback: ((ctx: T) => void | Promise<void>) | undefined,\n ctx: T\n ): void {\n if (!callback) return;\n\n try {\n const result = callback(ctx);\n if (this.config.lifecycle?.mode === 'sync' && result instanceof Promise) {\n result.catch(err => {\n this.logger.error(`[TQ] Lifecycle callback error: ${err}`);\n });\n } else if (result instanceof Promise) {\n result.catch(err => {\n this.logger.error(`[TQ] Lifecycle callback error: ${err}`);\n });\n }\n } catch (err) {\n this.logger.error(`[TQ] Lifecycle callback error: ${err}`);\n }\n }\n\n processMatureTasks(abortSignal?: AbortSignal) {\n const LOCK_ID = 'mature_task_lock_:task_processor';\n\n if (this.matureTaskTimer) clearInterval(this.matureTaskTimer);\n\n if (abortSignal?.aborted) {\n this.logger.info('AbortSignal already aborted, not starting mature task processing');\n return;\n }\n\n this.matureTaskTimer = setInterval(async () => {\n if (abortSignal?.aborted) {\n this.logger.info('AbortSignal detected, stopping mature task processing');\n if (this.matureTaskTimer) clearInterval(this.matureTaskTimer);\n return;\n }\n const lockManager = new LockManager(this.cacheAdapter, {prefix: 'mature_task_lock_:'});\n\n if (await lockManager.isLocked('task_processor')) {\n this.logger.info('Mature task runner locked');\n return;\n }\n\n try {\n const acquired = await lockManager.acquire('task_processor', 20);\n if (!acquired) {\n this.logger.info('Could not acquire lock for mature task processing');\n return;\n }\n\n const matureTasks = await this.taskStore.getMatureTasks(Date.now());\n this.logger.debug(`Found ${matureTasks.length} mature tasks to process`);\n\n // Duplicate pick detection — batch check via mget, batch write via pipeline\n if (matureTasks.length > 0) {\n try {\n const tasksWithIds = matureTasks.filter(t => t.id);\n const dedupKeys = tasksWithIds.map(t => `mature_dedup:${t.id}`);\n\n if (dedupKeys.length > 0) {\n const previousPickers = await this.cacheAdapter.mget(...dedupKeys);\n for (let i = 0; i < dedupKeys.length; i++) {\n if (previousPickers[i]) {\n const task = tasksWithIds[i];\n this.logger.warn(`DUPLICATE_MATURE_PICK: task ${task.id} (${task.type}) already picked by ${previousPickers[i]}`);\n }\n }\n\n const pipeline = this.cacheAdapter.pipeline();\n for (const key of dedupKeys) {\n pipeline.set(key, INSTANCE_ID, 120);\n }\n await pipeline.exec();\n }\n } catch (err) {\n this.logger.warn(`Duplicate pick detection failed (best-effort): ${err}`);\n }\n }\n\n await this.addTasks(matureTasks);\n } catch (error) {\n this.logger.error(`Error processing tasks: ${error}`);\n } finally {\n await lockManager.release('task_processor');\n }\n\n }, 5000);\n\n // Clean up interval when aborted\n abortSignal?.addEventListener('abort', () => {\n this.logger.info('AbortSignal received, cleaning up mature task timer and sending final stats');\n if (this.matureTaskTimer) {\n clearInterval(this.matureTaskTimer);\n this.matureTaskTimer = null;\n }\n this.sendFinalStats()\n .catch(err => {\n this.logger.error(`Failed to send final stats during shutdown: ${err}`);\n });\n });\n }\n\n private buildTaskContext(task: CronTask<ID>): TaskContext {\n const maxRetries = this.getRetryCount(task);\n const retryCount = (task.execution_stats && typeof task.execution_stats.retry_count === 'number')\n ? task.execution_stats.retry_count\n : 0;\n const payload = task.payload as Record<string, unknown>;\n\n return {\n task_id: task.id?.toString() || '',\n task_hash: payload?.task_hash as string | undefined,\n task_type: task.type,\n queue_id: task.queue_id,\n payload: this.config.lifecycle?.include_payload ? payload : {},\n attempt: retryCount + 1,\n max_retries: maxRetries,\n scheduled_at: task.created_at || new Date(),\n log_context: task.metadata?.log_context,\n };\n }\n\n processBatch(queueId: QueueName, processor: MessageConsumer<ID>, limit?: number, abortSignal?: AbortSignal): Promise<void> {\n if (abortSignal?.aborted) {\n this.logger.info(`AbortSignal already aborted, skipping batch processing for queue ${queueId}`);\n return Promise.resolve();\n }\n return this.messageQueue.consumeMessagesBatch(queueId, processor, limit);\n }\n\n private async trackDiscardedTasks(count: number) {\n try {\n const now = moment.utc();\n const hourKey = `${DISCARDED_TASKS_KEY}:${now.format('YYYY-MM-DD-HH')}`;\n\n if (!this.cacheAdapter) throw new Error('Cache adapter not initialized');\n const currentHourCountStr = await this.cacheAdapter.get(hourKey) || '0';\n const currentHourCount = parseInt(currentHourCountStr, 10);\n const newCount = currentHourCount + count;\n\n await this.cacheAdapter.set(hourKey, newCount.toString(), 25 * 3600);\n\n let total = 0;\n try {\n if (Math.random() < 0.1) {\n for (let i = 0; i < 24; i++) {\n const hourOffset = moment.utc().subtract(i, 'hours');\n const pastHourKey = `${DISCARDED_TASKS_KEY}:${hourOffset.format('YYYY-MM-DD-HH')}`;\n const pastHourCountStr = await this.cacheAdapter.get(pastHourKey) || '0';\n total += parseInt(pastHourCountStr, 10);\n }\n this.logger.info(`Added ${count} discarded tasks to metrics. Last 24h total: ${total}`);\n } else {\n this.logger.info(`Added ${count} discarded tasks to current hour metrics.`);\n }\n\n // Notify provider if available\n if (this.notificationProvider?.onTasksDiscarded) {\n const discardedInfo: DiscardedTaskInfo = {count, last24HourTotal: total > 0 ? total : undefined};\n try {\n await this.notificationProvider.onTasksDiscarded(discardedInfo);\n } catch (err) {\n this.logger.error(`Notification provider error for discarded tasks: ${err}`);\n }\n }\n } catch (error) {\n this.logger.info(`Added ${count} discarded tasks to current hour metrics.`);\n\n // Still notify provider about the count even if metrics failed\n if (this.notificationProvider?.onTasksDiscarded) {\n const discardedInfo: DiscardedTaskInfo = {count};\n try {\n await this.notificationProvider.onTasksDiscarded(discardedInfo);\n } catch (err) {\n this.logger.error(`Notification provider error for discarded tasks: ${err}`);\n }\n }\n }\n } catch (error) {\n this.logger.error(`Failed to track discarded tasks: ${error}`);\n\n // Try to notify provider about the error\n if (this.notificationProvider?.onTaskError) {\n const errorInfo: TaskErrorInfo = {\n error: `Failed to track discarded tasks: ${error}`,\n context: 'trackDiscardedTasks'\n };\n this.notificationProvider.onTaskError(errorInfo).catch(() => {\n // Ignore notification errors to prevent infinite loops\n });\n }\n }\n }\n\n private getRetryCount(task: CronTask<ID>): number {\n if (typeof task.retries === 'number') return task.retries;\n const executor = this.taskQueuesManager.getExecutor(task.queue_id, task.type);\n return executor?.default_retries ?? 0;\n }\n\n private async reportQueueStats(queueName: QueueName, forceSend: boolean = false): Promise<void> {\n const stats = this.queueStats.get(queueName);\n if (!stats) return;\n\n const total = stats.success + stats.failed + stats.async + stats.ignored;\n if (total === 0) return;\n\n if (!forceSend && total < STATS_THRESHOLD && stats.failed < FAILURE_THRESHOLD) return;\n\n try {\n if (this.notificationProvider?.onQueueStats) {\n const queueStats: TaskQueueStats = {\n queueName,\n success: stats.success,\n failed: stats.failed,\n async: stats.async,\n ignored: stats.ignored,\n instanceId: INSTANCE_ID\n };\n await this.notificationProvider.onQueueStats(queueStats);\n }\n this.logger.info(`Sent stats for ${queueName}`);\n } catch (err) {\n this.logger.error(`Failed to send stats: ${err}`);\n }\n\n if (!forceSend) {\n stats.success = 0;\n stats.failed = 0;\n stats.async = 0;\n stats.ignored = 0;\n }\n }\n\n private async sendFinalStats(): Promise<void> {\n for (const queueName of this.queueStats.keys()) {\n await this.reportQueueStats(queueName, true);\n }\n\n if (this.queueStats.size === 0) {\n try {\n if (this.notificationProvider?.onFinalStats) {\n await this.notificationProvider.onFinalStats([]);\n }\n this.logger.info('Sent final TQ stats (no tasks)');\n } catch (err) {\n this.logger.error(`Failed to send final stats: ${err}`);\n }\n }\n }\n}","import {getEnvironmentQueueName, IMessageQueue, MessageType, QueueName} from \"@supergrowthai/mq\";\nimport {TaskExecutor} from \"./base/interfaces\";\nimport {Logger, LogLevel} from \"@supergrowthai/utils\";\n\nconst logger = new Logger('TaskQueuesManager', LogLevel.INFO);\n\nclass TaskQueuesManager<ID> {\n queueTaskExecutorMap: Map<QueueName, Map<MessageType, TaskExecutor<ID>>> = new Map();\n\n constructor(private messageQueue: IMessageQueue<ID>) {\n }\n\n /**\n * Registers a task executor with a message queue and queue name\n * @param queueName The name of the queue\n * @param taskType The type of task\n * @param executor The executor for the task\n */\n register<T extends MessageType>(queueName: QueueName, taskType: T, executor: TaskExecutor<ID, T>): void {\n queueName = getEnvironmentQueueName(queueName)\n // Ensure the queue is registered with the message queue\n this.messageQueue.register(queueName);\n\n // Initialize the map for this queue if it doesn't exist\n if (!this.queueTaskExecutorMap.has(queueName)) {\n this.queueTaskExecutorMap.set(queueName, new Map());\n }\n\n // Register the executor for this task type\n const queueMap = this.queueTaskExecutorMap.get(queueName)!;\n queueMap.set(taskType, executor);\n\n logger.info(`Registered task executor for ${taskType} on queue ${queueName}`);\n }\n\n /**\n * Gets the task executor for a specific queue and task type\n * @param queueName The name of the queue\n * @param taskType The type of task\n * @returns The executor for the task\n */\n getExecutor<T extends MessageType>(queueName: QueueName, taskType: T): TaskExecutor<ID, T> | undefined {\n queueName = getEnvironmentQueueName(queueName)\n const queueMap = this.queueTaskExecutorMap.get(queueName);\n if (!queueMap) {\n return undefined;\n }\n return queueMap.get(taskType);\n }\n\n /**\n * Gets all registered queues\n * @returns Array of queue names\n */\n getQueues(): QueueName[] {\n return Array.from(this.queueTaskExecutorMap.keys());\n }\n\n /**\n * Gets all task types for a specific queue\n * @param queueName The name of the queue\n * @returns Array of task types\n */\n getTaskTypesForQueue(queueName: QueueName): MessageType[] {\n queueName = getEnvironmentQueueName(queueName)\n const queueMap = this.queueTaskExecutorMap.get(queueName);\n if (!queueMap) {\n return [];\n }\n return Array.from(queueMap.keys());\n }\n}\n\nexport {TaskQueuesManager}","/**\n * RFC-002: In-Memory Flow Barrier Provider\n *\n * Map-based implementation matching Redis Lua HSETNX dedup semantics.\n * Used for testing; production uses RedisFlowBarrierProvider.\n */\n\nimport type {FlowStepResult} from \"./types.js\";\nimport type {BarrierDecrementResult, IFlowBarrierProvider} from \"./IFlowBarrierProvider.js\";\n\ninterface FlowBarrierState {\n remaining: number;\n status: 'active' | 'aborted' | 'complete';\n results: Map<number, FlowStepResult>;\n}\n\nexport class InMemoryFlowBarrierProvider implements IFlowBarrierProvider {\n private readonly barriers = new Map<string, FlowBarrierState>();\n\n async initBarrier(flowId: string, totalSteps: number): Promise<void> {\n // Idempotent: no-op if barrier already exists (matches Redis SETNX semantics)\n if (this.barriers.has(flowId)) return;\n this.barriers.set(flowId, {\n remaining: totalSteps,\n status: 'active',\n results: new Map(),\n });\n }\n\n async batchDecrementAndCheck(flowId: string, results: FlowStepResult[]): Promise<BarrierDecrementResult> {\n const state = this.barriers.get(flowId);\n if (!state) {\n return {remaining: -1};\n }\n\n // If already aborted or complete, late arrivals get -1\n if (state.status === 'aborted' || state.status === 'complete') {\n return {remaining: -1};\n }\n\n // HSETNX semantics: only count genuinely new step indices\n let actualNew = 0;\n for (const result of results) {\n if (!state.results.has(result.step_index)) {\n state.results.set(result.step_index, result);\n actualNew++;\n }\n }\n\n state.remaining -= actualNew;\n\n if (state.remaining <= 0) {\n state.remaining = 0;\n state.status = 'complete';\n }\n\n return {remaining: state.remaining};\n }\n\n async getStepResults(flowId: string): Promise<FlowStepResult[]> {\n const state = this.barriers.get(flowId);\n if (!state) return [];\n return Array.from(state.results.values()).sort((a, b) => a.step_index - b.step_index);\n }\n\n async markAborted(flowId: string): Promise<boolean> {\n const state = this.barriers.get(flowId);\n if (!state) return false;\n\n if (state.status === 'aborted') {\n return false; // Already aborted\n }\n\n state.status = 'aborted';\n return true;\n }\n\n async isComplete(flowId: string): Promise<boolean> {\n const state = this.barriers.get(flowId);\n if (!state) return false;\n return state.status === 'complete';\n }\n}\n","/**\n * RFC-002: Flow Middleware\n *\n * Post-processing hook that tracks flow step completion via the barrier provider\n * and dispatches join tasks when all steps are done (or on abort/timeout).\n */\n\nimport type {CronTask} from \"../../adapters/types.js\";\nimport type {FlowMeta, FlowResults, FlowStepResult} from \"./types.js\";\nimport type {IFlowBarrierProvider} from \"./IFlowBarrierProvider.js\";\nimport type {EntityTaskProjection} from \"../entity/IEntityProjectionProvider.js\";\nimport {buildProjection} from \"../entity/IEntityProjectionProvider.js\";\nimport type {QueueName} from \"@supergrowthai/mq\";\n\nexport interface FlowPostProcessInput<ID> {\n successTasks: CronTask<ID>[];\n failedTasks: CronTask<ID>[];\n}\n\nexport interface FlowPostProcessResult<ID> {\n joinTasks: CronTask<ID>[];\n projections: EntityTaskProjection<ID>[];\n}\n\n/** Extract FlowMeta from task metadata, cast through unknown for type safety */\nfunction getFlowMeta(task: CronTask<any>): FlowMeta | undefined {\n return task.metadata?.flow_meta as unknown as FlowMeta | undefined;\n}\n\n/** Extract FlowMeta from task metadata (non-null assertion — caller has already checked) */\nfunction getFlowMetaRequired(task: CronTask<any>): FlowMeta {\n return task.metadata!.flow_meta as unknown as FlowMeta;\n}\n\nexport class FlowMiddleware<ID> {\n constructor(\n private readonly barrierProvider: IFlowBarrierProvider,\n private readonly generateId: () => ID,\n ) {}\n\n /**\n * Process completed tasks for flow orchestration.\n * Called from TaskHandler.postProcessTasks after markFailed/markSuccess.\n *\n * @param input Categorized terminal tasks — success and final-failed (no retries left)\n * @returns Join tasks to dispatch and entity projections to sync\n */\n async onPostProcess(input: FlowPostProcessInput<ID>): Promise<FlowPostProcessResult<ID>> {\n const joinTasks: CronTask<ID>[] = [];\n const projections: EntityTaskProjection<ID>[] = [];\n\n // Use object identity for O(1) success/fail classification\n // (tasks may not have IDs at this point in the pipeline)\n const successTaskSet = new Set<CronTask<ID>>(input.successTasks);\n\n const allTasks = [...input.successTasks, ...input.failedTasks];\n\n // Separate flow tasks by role\n const joinCompletions: CronTask<ID>[] = [];\n const timeoutTasks: CronTask<ID>[] = [];\n const stepTasks: { task: CronTask<ID>; isSuccess: boolean }[] = [];\n\n for (const task of allTasks) {\n const flowMeta = getFlowMeta(task);\n if (!flowMeta) continue;\n\n const isSuccess = successTaskSet.has(task);\n\n if (flowMeta.is_join) {\n joinCompletions.push(task);\n } else if (flowMeta.is_timeout) {\n timeoutTasks.push(task);\n } else {\n stepTasks.push({task, isSuccess});\n }\n }\n\n // 1. Handle completed join tasks — emit entity projections\n for (const task of joinCompletions) {\n const flowMeta = getFlowMetaRequired(task);\n const isSuccess = successTaskSet.has(task);\n if (flowMeta.entity) {\n try {\n const status = isSuccess ? 'executed' : 'failed';\n const error = !isSuccess\n ? (task.execution_stats?.last_error as string || 'Join task failed')\n : undefined;\n const p = buildProjection(\n {\n ...task,\n id: flowMeta.flow_id as unknown as ID,\n entity: flowMeta.entity,\n },\n status,\n {result: task.execution_result, error}\n );\n if (p) projections.push(p);\n } catch {\n // Non-fatal: projection build can fail if no ID\n }\n }\n }\n\n // 2. Handle timeout sentinel tasks\n for (const task of timeoutTasks) {\n const flowMeta = getFlowMetaRequired(task);\n const flowId = flowMeta.flow_id;\n\n // Auto-init barrier if not yet created (timeout can fire before any step completes)\n await this.barrierProvider.initBarrier(flowId, flowMeta.total_steps);\n\n // Check if flow already completed\n const isComplete = await this.barrierProvider.isComplete(flowId);\n if (isComplete) continue; // No-op: flow already done\n\n // Flow not complete — abort and dispatch join with partial results\n const isFirstAbort = await this.barrierProvider.markAborted(flowId);\n if (!isFirstAbort) continue; // Already aborted by step failure — no duplicate join\n const partialResults = await this.barrierProvider.getStepResults(flowId);\n\n const flowResults: FlowResults = {\n flow_id: flowId,\n steps: partialResults,\n timed_out: true,\n };\n\n const joinTask = this.buildJoinTask(flowMeta, flowResults);\n joinTasks.push(joinTask);\n\n // Entity projection for timeout\n if (flowMeta.entity) {\n try {\n const p = buildProjection(\n {\n ...joinTask,\n id: flowId as unknown as ID,\n entity: flowMeta.entity,\n },\n 'failed',\n {error: 'flow_timeout'}\n );\n if (p) projections.push(p);\n } catch {\n // Non-fatal\n }\n }\n }\n\n // 3. Handle step tasks — group by flow_id, batchDecrementAndCheck once per group\n const stepsByFlow = new Map<string, { task: CronTask<ID>; isSuccess: boolean }[]>();\n for (const entry of stepTasks) {\n const flowMeta = getFlowMetaRequired(entry.task);\n const group = stepsByFlow.get(flowMeta.flow_id) || [];\n group.push(entry);\n stepsByFlow.set(flowMeta.flow_id, group);\n }\n\n for (const [flowId, entries] of stepsByFlow) {\n const firstFlowMeta = getFlowMetaRequired(entries[0].task);\n\n // Auto-init barrier if not yet created (idempotent — no-op if exists)\n await this.barrierProvider.initBarrier(flowId, firstFlowMeta.total_steps);\n\n // Check for abort policy: if any step failed and policy is 'abort'\n if (firstFlowMeta.failure_policy === 'abort') {\n const hasFailure = entries.some(e => !e.isSuccess);\n\n if (hasFailure) {\n const isFirstAbort = await this.barrierProvider.markAborted(flowId);\n if (isFirstAbort) {\n // Record results for the steps we have, then dispatch join\n const stepResults = this.buildStepResults(entries);\n await this.barrierProvider.batchDecrementAndCheck(flowId, stepResults);\n const allResults = await this.barrierProvider.getStepResults(flowId);\n\n const flowResults: FlowResults = {\n flow_id: flowId,\n steps: allResults,\n aborted: true,\n };\n\n const joinTask = this.buildJoinTask(firstFlowMeta, flowResults);\n joinTasks.push(joinTask);\n\n // Entity projection for abort\n if (firstFlowMeta.entity) {\n try {\n const p = buildProjection(\n {\n ...joinTask,\n id: flowId as unknown as ID,\n entity: firstFlowMeta.entity,\n },\n 'failed',\n {error: 'flow_aborted'}\n );\n if (p) projections.push(p);\n } catch {\n // Non-fatal\n }\n }\n }\n // Else: already aborted, skip (no second join)\n continue;\n }\n }\n\n // Normal path: record results and check barrier\n const stepResults = this.buildStepResults(entries);\n const {remaining} = await this.barrierProvider.batchDecrementAndCheck(flowId, stepResults);\n\n if (remaining === 0) {\n // Barrier met — dispatch join task\n const allResults = await this.barrierProvider.getStepResults(flowId);\n\n const flowResults: FlowResults = {\n flow_id: flowId,\n steps: allResults,\n };\n\n const joinTask = this.buildJoinTask(firstFlowMeta, flowResults);\n joinTasks.push(joinTask);\n }\n // remaining > 0: not yet complete, wait for more steps\n // remaining === -1: late arrival (already aborted/completed), ignore\n }\n\n return {joinTasks, projections};\n }\n\n private buildStepResults(entries: { task: CronTask<ID>; isSuccess: boolean }[]): FlowStepResult[] {\n return entries.map(({task, isSuccess}) => {\n const flowMeta = getFlowMetaRequired(task);\n return {\n step_index: flowMeta.step_index,\n status: isSuccess ? 'success' as const : 'fail' as const,\n result: task.execution_result,\n error: !isSuccess\n ? (task.execution_stats?.last_error as string || 'Step failed')\n : undefined,\n };\n });\n }\n\n private buildJoinTask(flowMeta: FlowMeta, flowResults: FlowResults): CronTask<ID> {\n const now = new Date();\n const joinFlowMeta: FlowMeta = {\n ...flowMeta,\n is_join: true,\n is_timeout: undefined,\n step_index: -1,\n };\n\n return {\n id: this.generateId(),\n type: flowMeta.join.type,\n queue_id: flowMeta.join.queue_id as QueueName,\n payload: {flow_results: flowResults},\n execute_at: now,\n status: 'scheduled',\n created_at: now,\n updated_at: now,\n force_store: true,\n metadata: {\n flow_meta: joinFlowMeta as unknown as Record<string, unknown>,\n },\n ...(flowMeta.entity ? {entity: flowMeta.entity} : {}),\n } as unknown as CronTask<ID>;\n }\n}","/**\n * Console Health Provider - Reference Implementation\n *\n * A simple health provider that logs all lifecycle events to console.\n * This can be used as a starting point for custom health providers.\n *\n * Usage:\n * ```typescript\n * import { ConsoleHealthProvider } from '@supergrowthai/tq/providers';\n *\n * const healthProvider = new ConsoleHealthProvider();\n *\n * const taskHandler = new TaskHandler(\n * messageQueue,\n * taskQueuesManager,\n * databaseAdapter,\n * cacheProvider,\n * asyncTaskManager,\n * notificationProvider,\n * {\n * lifecycleProvider: healthProvider,\n * workerProvider: healthProvider,\n * lifecycle: {\n * mode: 'async',\n * heartbeat_interval_ms: 5000\n * }\n * }\n * );\n * ```\n */\n\nimport type {\n ITaskLifecycleProvider,\n IWorkerLifecycleProvider,\n TaskContext,\n TaskTiming,\n WorkerInfo,\n WorkerStats\n} from \"../core/lifecycle.js\";\n\nexport class ConsoleHealthProvider implements ITaskLifecycleProvider, IWorkerLifecycleProvider {\n private readonly prefix: string;\n\n constructor(prefix: string = '[Health]') {\n this.prefix = prefix;\n }\n\n // ============ Task Lifecycle ============\n\n onTaskScheduled(ctx: TaskContext): void {\n console.log(`${this.prefix} Task scheduled: ${ctx.task_type} (${ctx.task_id}) in queue ${ctx.queue_id}`);\n }\n\n onTaskStarted(ctx: TaskContext & { started_at: Date; queued_duration_ms: number }): void {\n console.log(`${this.prefix} Task started: ${ctx.task_type} (${ctx.task_id}) - queued for ${ctx.queued_duration_ms}ms`);\n }\n\n onTaskCompleted(ctx: TaskContext & { timing: TaskTiming; result?: unknown }): void {\n console.log(\n `${this.prefix} Task completed: ${ctx.task_type} (${ctx.task_id}) - ` +\n `processing: ${ctx.timing.processing_duration_ms}ms, total: ${ctx.timing.total_duration_ms}ms`\n );\n }\n\n onTaskFailed(ctx: TaskContext & {\n timing: TaskTiming;\n error: Error;\n will_retry: boolean;\n next_attempt_at?: Date\n }): void {\n console.log(\n `${this.prefix} Task failed: ${ctx.task_type} (${ctx.task_id}) - ` +\n `error: ${ctx.error.message}, will_retry: ${ctx.will_retry}`\n );\n }\n\n onTaskExhausted(ctx: TaskContext & { timing: TaskTiming; error: Error; total_attempts: number }): void {\n console.log(\n `${this.prefix} Task exhausted: ${ctx.task_type} (${ctx.task_id}) - ` +\n `total attempts: ${ctx.total_attempts}, error: ${ctx.error.message}`\n );\n }\n\n onTaskCancelled(ctx: TaskContext & { reason: string }): void {\n console.log(`${this.prefix} Task cancelled: ${ctx.task_type} (${ctx.task_id}) - reason: ${ctx.reason}`);\n }\n\n // ============ Worker Lifecycle ============\n\n onWorkerStarted(info: WorkerInfo): void {\n console.log(\n `${this.prefix} Worker started: ${info.worker_id} on ${info.hostname} (PID: ${info.pid}) - ` +\n `queues: [${info.enabled_queues.join(', ')}]`\n );\n }\n\n onWorkerHeartbeat(info: WorkerInfo & { stats: WorkerStats; memory_usage_mb: number }): void {\n console.log(\n `${this.prefix} Worker heartbeat: ${info.worker_id} - ` +\n `processed: ${info.stats.tasks_processed}, success: ${info.stats.tasks_succeeded}, ` +\n `failed: ${info.stats.tasks_failed}, avg: ${info.stats.avg_processing_ms.toFixed(2)}ms, ` +\n `memory: ${info.memory_usage_mb.toFixed(2)}MB`\n );\n }\n\n onWorkerStopped(info: WorkerInfo & {\n reason: 'shutdown' | 'error' | 'idle_timeout';\n final_stats: WorkerStats\n }): void {\n console.log(\n `${this.prefix} Worker stopped: ${info.worker_id} - reason: ${info.reason} - ` +\n `final stats: ${info.final_stats.tasks_processed} processed, ` +\n `${info.final_stats.tasks_succeeded} succeeded, ${info.final_stats.tasks_failed} failed`\n );\n }\n\n onBatchStarted(info: WorkerInfo & { batch_size: number; task_types: string[] }): void {\n console.log(\n `${this.prefix} Batch started: ${info.batch_size} tasks - types: [${info.task_types.join(', ')}]`\n );\n }\n\n onBatchCompleted(info: WorkerInfo & {\n batch_size: number;\n succeeded: number;\n failed: number;\n duration_ms: number\n }): void {\n console.log(\n `${this.prefix} Batch completed: ${info.batch_size} tasks in ${info.duration_ms}ms - ` +\n `succeeded: ${info.succeeded}, failed: ${info.failed}`\n );\n }\n}\n"],"names":["global","require$$0","Symbol","require$$1","require$$2","require$$3","chunk","result","stepResults"],"mappings":"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","x_google_ignoreList":[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../packages/utils/dist/server.mjs","../src/core/TaskStore.ts","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseSlice.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/eq.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_freeGlobal.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_root.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_Symbol.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_getRawTag.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_objectToString.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseGetTag.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/isObject.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/isFunction.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/isLength.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/isArrayLike.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_isIndex.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_isIterateeCall.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_trimmedEndIndex.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseTrim.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/isObjectLike.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/isSymbol.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/toNumber.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/toFinite.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/toInteger.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/chunk.js","../src/utils/disposable-lock.ts","../src/core/log-context.ts","../src/core/TaskRunner.ts","../src/core/environment.ts","../src/core/flow/FlowMiddleware.ts","../src/core/TaskHandler.ts","../src/core/TaskQueuesManager.ts","../src/core/flow/InMemoryFlowBarrierProvider.ts","../src/providers/ConsoleHealthProvider.ts"],"sourcesContent":["import { Logger, LogLevel } from \"./client.mjs\";\nclass LockManager {\n constructor(cacheProvider, options) {\n this.cacheProvider = cacheProvider;\n this.acquireLocks = /* @__PURE__ */ new Map();\n this.logger = new Logger(\"MetricsCollector\", LogLevel.INFO);\n this.cacheProvider = cacheProvider;\n this.prefix = options?.prefix || \"lock:\";\n this.defaultTimeout = options?.defaultTimeout || 30 * 60;\n if (options?.debugLogs)\n this.logger.setLogLevel(LogLevel.INFO);\n }\n /**\n * Check if a resource is locked\n */\n async isLocked(resourceId) {\n this.logger.debug(\"isLocked\" + resourceId);\n const exists = await this.cacheProvider.get(this.getKey(resourceId));\n return !!exists;\n }\n /**\n * Filter out locked resources from an array\n */\n async filterLocked(resources, getResourceId) {\n if (!resources.length) return [];\n const lockChecks = resources.map((resource) => this.isLocked(getResourceId(resource)));\n const lockResults = await Promise.all(lockChecks);\n return resources.filter((_, index) => !lockResults[index]);\n }\n /**\n * Acquire a lock\n * @returns true if lock was acquired, false if already locked\n */\n async acquire(resourceId, timeout = this.defaultTimeout) {\n this.logger.debug(\"Acquire\" + resourceId);\n const existingLock = this.acquireLocks.get(resourceId);\n if (existingLock) {\n await existingLock;\n return false;\n }\n const lockPromise = this.acquireInternal(resourceId, timeout);\n this.acquireLocks.set(resourceId, lockPromise);\n try {\n return await lockPromise;\n } finally {\n this.acquireLocks.delete(resourceId);\n }\n }\n /**\n * Release a lock\n */\n async release(resourceId) {\n this.logger.debug(\"Release\" + resourceId);\n const key = this.getKey(resourceId);\n await this.cacheProvider.del(key);\n }\n async acquireInternal(resourceId, timeout) {\n if (await this.isLocked(resourceId)) return false;\n const key = this.getKey(resourceId);\n const result = await this.cacheProvider.set(key, \"1\", timeout);\n return result === \"OK\" || result === \"1\" || result === 1;\n }\n getKey(resourceId) {\n return `${this.prefix}${resourceId}`;\n }\n}\nclass ShutdownManager {\n constructor() {\n this.sigintListeners = [];\n this.sigint = {\n register: (listener) => this.sigintListeners.push(listener)\n };\n this.sigtermListeners = [];\n this.sigterm = {\n register: (listener) => this.sigtermListeners.push(listener)\n };\n this.sigquitListeners = [];\n this.sigquit = {\n register: (listener) => this.sigquitListeners.push(listener)\n };\n this.shuttingDown = false;\n this._runListeners = async (listeners) => {\n for (const listener of listeners) {\n try {\n await listener();\n } catch (err) {\n console.error(\"Error during shutdown task:\", err);\n }\n }\n };\n process.on(\"SIGINT\", () => {\n if (this.shuttingDown) return;\n this.shuttingDown = true;\n console.log(\"\\nSIGINT received. Running shutdown tasks...\");\n this._runListeners(this.sigintListeners).then(() => {\n console.log(\"Shutdown tasks completed.\");\n process.exit(0);\n }).catch((err) => {\n console.error(\"Error during shutdown:\", err);\n process.exit(1);\n });\n });\n process.on(\"SIGTERM\", () => {\n if (this.shuttingDown) return;\n this.shuttingDown = true;\n console.log(\"\\nSIGTERM received. Running shutdown tasks...\");\n this._runListeners(this.sigtermListeners).then(() => {\n console.log(\"Shutdown tasks completed.\");\n process.exit(0);\n }).catch((err) => {\n console.error(\"Error during shutdown:\", err);\n process.exit(1);\n });\n });\n process.on(\"SIGQUIT\", () => {\n if (this.shuttingDown) return;\n this.shuttingDown = true;\n console.log(\"\\nSIGQUIT received. Running shutdown tasks...\");\n this._runListeners(this.sigquitListeners).then(() => {\n console.log(\"Shutdown tasks completed.\");\n process.exit(0);\n }).catch((err) => {\n console.error(\"Error during shutdown:\", err);\n process.exit(1);\n });\n });\n }\n}\nexport {\n LockManager,\n LogLevel,\n Logger,\n ShutdownManager\n};\n//# sourceMappingURL=server.mjs.map\n","import type {CronTask, ITaskStorageAdapter} from \"../adapters\";\nimport {getEnvironmentQueueName} from \"@supergrowthai/mq\";\n\nclass TaskStore<ID> {\n\n constructor(private databaseAdapter: ITaskStorageAdapter<ID>) {\n }\n\n /**\n * Adds multiple tasks to the scheduled queue\n */\n async addTasksToScheduled(tasks: CronTask<ID>[]): Promise<CronTask<ID>[]> {\n if (!tasks.length) return [];\n\n const transformedTasks = tasks.map((task) => ({\n id: task.id,\n type: task.type,\n queue_id: getEnvironmentQueueName(task.queue_id),\n payload: task.payload,\n execute_at: task.execute_at,\n expires_at: task.expires_at,\n status: task.status || 'scheduled' as const,\n task_group: task.task_group,\n task_hash: task.task_hash,\n retries: task.retries || 0,\n retry_after: task.retry_after,\n execution_stats: task.execution_stats,\n created_at: task.created_at || new Date(),\n updated_at: task.updated_at || new Date(),\n processing_started_at: task.processing_started_at || new Date(),\n force_store: task.force_store,\n metadata: task.metadata,\n partition_key: task.partition_key,\n entity: task.entity\n })) as CronTask<ID>[];\n\n return await this.databaseAdapter.addTasksToScheduled(transformedTasks);\n }\n\n /**\n * Gets mature tasks that are ready to be processed\n * Implements a two-phase approach:\n * 1. Reset stale processing tasks\n * 2. Fetch and mark new mature tasks\n */\n async getMatureTasks(timestamp: number): Promise<CronTask<ID>[]> {\n return await this.databaseAdapter.getMatureTasks(timestamp);\n }\n\n /**\n * Marks tasks as processing with current timestamp\n */\n async markTasksAsProcessing(tasks: CronTask<ID>[]): Promise<void> {\n await this.databaseAdapter.markTasksAsProcessing(tasks, new Date());\n }\n\n /**\n * Marks tasks as executed/completed\n */\n async markTasksAsExecuted(tasks: CronTask<ID>[]): Promise<void> {\n await this.databaseAdapter.markTasksAsExecuted(tasks);\n }\n\n /**\n * Marks tasks as failed — uses upsert to handle store_on_failure tasks\n * that were never persisted to DB\n */\n async markTasksAsFailed(tasks: CronTask<ID>[]): Promise<void> {\n const tasksWithStatus = tasks.map(task => ({\n ...task,\n status: 'failed' as const,\n execution_stats: {\n ...(task.execution_stats || {}),\n failed_at: new Date()\n }\n }));\n await this.databaseAdapter.upsertTasks(tasksWithStatus);\n }\n\n /**\n * Marks tasks as successful/completed\n */\n async markTasksAsSuccess(tasks: CronTask<ID>[]): Promise<void> {\n await this.databaseAdapter.markTasksAsExecuted(tasks);\n }\n\n /**\n * Marks tasks as ignored with proper task context\n */\n async markTasksAsIgnored(tasks: CronTask<ID>[]): Promise<void> {\n const tasksWithStatus = tasks.map(task => ({\n ...task,\n status: 'ignored' as const,\n execution_stats: {\n ...(task.execution_stats || {}),\n error: 'No executor found for task type',\n ignored_reason: 'unknown_executor',\n ignored_at: new Date()\n }\n }));\n\n await this.databaseAdapter.upsertTasks(tasksWithStatus);\n }\n\n /**\n * Updates multiple tasks with specific updates\n */\n async updateTasks(updates: Array<{ id: ID; updates: Partial<CronTask<ID>> }>): Promise<void> {\n await this.databaseAdapter.updateTasks(updates);\n }\n\n /**\n * Gets tasks by their IDs\n */\n async getTasksByIds(taskIds: ID[]): Promise<CronTask<ID>[]> {\n return await this.databaseAdapter.getTasksByIds(taskIds);\n }\n\n /**\n * Gets cleanup statistics\n */\n async getCleanupStats(): Promise<{ orphanedTasks: number; expiredTasks: number }> {\n return await this.databaseAdapter.getCleanupStats();\n }\n\n /**\n * Cleans up orphaned and expired tasks\n */\n async cleanupTasks(): Promise<void> {\n const twoDaysAgo = new Date(Date.now() - 2 * 24 * 60 * 60 * 1000);\n const now = new Date();\n\n await this.databaseAdapter.cleanupTasks(twoDaysAgo, now);\n }\n\n /**\n * Updates tasks for retry — uses upsert to handle store_on_failure tasks\n * that were never persisted to DB\n */\n async updateTasksForRetry(tasks: CronTask<ID>[]): Promise<void> {\n await this.databaseAdapter.upsertTasks(tasks);\n }\n\n}\n\nexport {TaskStore};","/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\nmodule.exports = baseSlice;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","var eq = require('./eq'),\n isArrayLike = require('./isArrayLike'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject');\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nmodule.exports = isIterateeCall;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","var toNumber = require('./toNumber');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nmodule.exports = toFinite;\n","var toFinite = require('./toFinite');\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nmodule.exports = toInteger;\n","var baseSlice = require('./_baseSlice'),\n isIterateeCall = require('./_isIterateeCall'),\n toInteger = require('./toInteger');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeCeil = Math.ceil,\n nativeMax = Math.max;\n\n/**\n * Creates an array of elements split into groups the length of `size`.\n * If `array` can't be split evenly, the final chunk will be the remaining\n * elements.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to process.\n * @param {number} [size=1] The length of each chunk\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the new array of chunks.\n * @example\n *\n * _.chunk(['a', 'b', 'c', 'd'], 2);\n * // => [['a', 'b'], ['c', 'd']]\n *\n * _.chunk(['a', 'b', 'c', 'd'], 3);\n * // => [['a', 'b', 'c'], ['d']]\n */\nfunction chunk(array, size, guard) {\n if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n size = 1;\n } else {\n size = nativeMax(toInteger(size), 0);\n }\n var length = array == null ? 0 : array.length;\n if (!length || size < 1) {\n return [];\n }\n var index = 0,\n resIndex = 0,\n result = Array(nativeCeil(length / size));\n\n while (index < length) {\n result[resIndex++] = baseSlice(array, index, (index += size));\n }\n return result;\n}\n\nmodule.exports = chunk;\n","import {LockManager} from \"@supergrowthai/utils\";\n\n/**\n * A batch of locks that implements AsyncDisposable for use with `await using`.\n * Automatically releases all acquired locks when the scope exits, even on error.\n *\n * @example\n * ```typescript\n * await using locks = new DisposableLockBatch(lockManager);\n * await locks.acquire('task-1');\n * await locks.acquire('task-2');\n * // ... do work ...\n * // locks automatically released here, even if an error is thrown\n * ```\n *\n * @since Node.js 22+ (Explicit Resource Management)\n */\nexport class DisposableLockBatch implements AsyncDisposable {\n private readonly lockIds: string[] = [];\n private disposed = false;\n\n constructor(\n private readonly lockManager: LockManager,\n private readonly onError?: (lockId: string, error: unknown) => void\n ) {\n }\n\n /**\n * Get the list of currently held lock IDs\n */\n get heldLocks(): readonly string[] {\n return this.lockIds;\n }\n\n /**\n * Number of locks currently held\n */\n get size(): number {\n return this.lockIds.length;\n }\n\n /**\n * Acquire a lock and track it for automatic release\n */\n async acquire(lockId: string, timeout?: number): Promise<boolean> {\n if (this.disposed) {\n throw new Error('Cannot acquire lock on disposed DisposableLockBatch');\n }\n\n const acquired = await this.lockManager.acquire(lockId, timeout);\n if (acquired) {\n this.lockIds.push(lockId);\n }\n return acquired;\n }\n\n /**\n * AsyncDisposable implementation - releases all locks\n */\n async [Symbol.asyncDispose](): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n\n await Promise.all(\n this.lockIds.map(lockId =>\n this.lockManager.release(lockId).catch(err => {\n if (this.onError) {\n this.onError(lockId, err);\n }\n })\n )\n );\n }\n}\n","import {AsyncLocalStorage} from \"node:async_hooks\";\nimport {Logger} from \"@supergrowthai/utils/server\";\n\nexport type LogStore = Record<string, string>;\n\nconst als = new AsyncLocalStorage<LogStore>();\n\n// Wire ALS into Logger's context provider — single registration at module load\nLogger.setContextProvider(() => als.getStore());\n\n/**\n * Run a function within an ALS scope carrying the given log context store.\n * The store is available via getLogContext() inside the callback and cleared after.\n */\nexport function runWithLogContext<T>(store: LogStore, fn: () => T): T {\n return als.run(store, fn);\n}\n\n/**\n * Read the current ALS log context store (undefined outside a runWithLogContext scope).\n */\nexport function getLogContext(): LogStore | undefined {\n return als.getStore();\n}\n","import chunk from \"lodash/chunk\";\nimport {Logger, LogLevel} from \"@supergrowthai/utils/server\";\nimport {tId} from \"../utils/task-id-gen.js\";\nimport {DisposableLockBatch} from \"../utils/disposable-lock.js\";\nimport {TaskType} from \"../types.js\";\nimport {ActionResults, Actions} from \"./Actions.js\";\nimport {AsyncActions} from \"./async/AsyncActions.js\";\nimport {CronTask} from \"../adapters\";\nimport {IMessageQueue} from \"@supergrowthai/mq\";\nimport {CacheProvider} from \"memoose-js\";\nimport {LockManager} from \"@supergrowthai/utils\";\nimport {TaskQueuesManager} from \"./TaskQueuesManager\";\nimport {TaskStore} from \"./TaskStore\";\nimport {IAsyncTaskManager} from \"./async/async-task-manager\";\nimport type {ITaskLifecycleProvider, IFlowLifecycleProvider, TaskContext, TaskHandlerLifecycleConfig, TaskTiming} from \"./lifecycle.js\";\nimport {runWithLogContext} from \"./log-context.js\";\nimport type {LogStore} from \"./log-context.js\";\nimport type {IEntityProjectionProvider, EntityProjectionConfig, EntityTaskProjection} from \"./entity/IEntityProjectionProvider.js\";\nimport {buildProjection, syncProjections} from \"./entity/IEntityProjectionProvider.js\";\nimport type {FlowMiddleware} from \"./flow/FlowMiddleware.js\";\n\nexport interface AsyncTask<ID> {\n task: CronTask<ID>;\n promise: Promise<void>;\n startTime: number;\n actions: AsyncActions<ID>;\n}\n\nexport interface TaskRunnerOptions<ID> {\n messageQueue: IMessageQueue<ID>;\n taskQueue: TaskQueuesManager<ID>;\n taskStore: TaskStore<ID>;\n cacheProvider: CacheProvider<any>;\n generateId: () => ID;\n lifecycleProvider?: ITaskLifecycleProvider;\n lifecycleConfig?: TaskHandlerLifecycleConfig;\n entityProjection?: IEntityProjectionProvider<ID>;\n entityProjectionConfig?: EntityProjectionConfig;\n flowMiddleware?: FlowMiddleware<ID>;\n flowLifecycleProvider?: IFlowLifecycleProvider;\n /** Process identity (hostname-pid-timestamp) for lifecycle events */\n workerId?: string;\n}\n\nexport class TaskRunner<ID> {\n private readonly logger: Logger;\n private lockManager: LockManager;\n private readonly taskStartTimes = new Map<string, number>();\n\n private messageQueue: IMessageQueue<ID>;\n private taskQueue: TaskQueuesManager<ID>;\n private taskStore: TaskStore<ID>;\n private generateId: () => ID;\n private lifecycleProvider?: ITaskLifecycleProvider;\n private lifecycleConfig?: TaskHandlerLifecycleConfig;\n private entityProjection?: IEntityProjectionProvider<ID>;\n private entityProjectionConfig?: EntityProjectionConfig;\n private flowMiddleware?: FlowMiddleware<ID>;\n private flowLifecycleProvider?: IFlowLifecycleProvider;\n private readonly workerId: string;\n\n constructor(opts: TaskRunnerOptions<ID>) {\n const {\n messageQueue,\n taskQueue,\n taskStore,\n cacheProvider,\n generateId,\n lifecycleProvider,\n lifecycleConfig,\n entityProjection,\n entityProjectionConfig,\n flowMiddleware,\n flowLifecycleProvider,\n workerId = '',\n } = opts;\n\n this.messageQueue = messageQueue;\n this.taskQueue = taskQueue;\n this.taskStore = taskStore;\n this.generateId = generateId;\n this.lifecycleProvider = lifecycleProvider;\n this.lifecycleConfig = lifecycleConfig;\n this.entityProjection = entityProjection;\n this.entityProjectionConfig = entityProjectionConfig;\n this.flowMiddleware = flowMiddleware;\n this.flowLifecycleProvider = flowLifecycleProvider;\n this.workerId = workerId;\n\n this.logger = new Logger('TaskRunner', LogLevel.INFO);\n this.lockManager = new LockManager(cacheProvider, {\n prefix: \"task_lock_\",\n defaultTimeout: 30 * 60\n });\n }\n\n // ============ Log Context Helpers (RFC-005) ============\n\n /**\n * Build ALS log store for a single task execution.\n * Runtime keys (task_id, task_type, worker_id) override user-supplied log_context.\n */\n private buildLogStore(task: CronTask<ID>, workerId: string): LogStore {\n return {\n ...(task.metadata?.log_context || {}),\n task_id: task.id?.toString() || tId(task),\n task_type: task.type,\n worker_id: workerId,\n };\n }\n\n /**\n * Build ALS log store for a multi-task (batch) execution.\n * Only runtime keys — no user log_context (ambiguous across tasks).\n */\n private buildBatchLogStore(tasks: CronTask<ID>[], workerId: string): LogStore {\n return {\n worker_id: workerId,\n batch_size: String(tasks.length),\n };\n }\n\n // ============ Lifecycle Helpers ============\n\n async run(\n taskRunnerId: string,\n tasksRaw: Array<CronTask<ID>>,\n asyncTaskManager?: IAsyncTaskManager,\n abortSignal?: AbortSignal\n ): Promise<ActionResults<ID> & { asyncTasks: AsyncTask<ID>[] }> {\n this.logger.info(`[${taskRunnerId}] Starting task runner`);\n this.logger.info(`[${taskRunnerId}] Processing ${tasksRaw.length} provided tasks`);\n\n if (abortSignal?.aborted) {\n this.logger.info(`[${taskRunnerId}] AbortSignal already aborted, returning empty results`);\n return {successTasks: [], failedTasks: [], newTasks: [], ignoredTasks: [], asyncTasks: [], flowProjections: []};\n }\n\n const tasks = await this.lockManager.filterLocked(tasksRaw, tId);\n\n this.logger.info(`[${taskRunnerId}] Found ${tasks.length} not locked tasks to process`);\n\n // Use DisposableLockBatch with await using for automatic lock cleanup\n // This ensures locks are ALWAYS released, even on exceptions or early returns\n await using locks = new DisposableLockBatch(\n this.lockManager,\n (lockId, err) => this.logger.error(`[${taskRunnerId}] Failed to release lock ${lockId}:`, err)\n );\n\n for (const task of tasks) {\n await locks.acquire(tId(task));\n }\n\n const groupedTasksObject = tasks\n .reduce((acc: Record<TaskType, CronTask<ID>[]>, task) => {\n acc[task.type] = acc[task.type] || [];\n acc[task.type].push(task);\n return acc;\n }, {} as Record<TaskType, CronTask<ID>[]>);\n\n const groupedTasksArray = (Object.keys(groupedTasksObject) as unknown as TaskType[]).reduce((acc: {\n type: TaskType,\n tasks: CronTask<ID>[]\n }[], type: TaskType) => {\n acc.push({type, tasks: groupedTasksObject[type]})\n return acc;\n }, [] as { type: TaskType, tasks: CronTask<ID>[] }[]);\n\n this.logger.info(`[${taskRunnerId}] Task groups: ${groupedTasksArray.map(g => `${g.type}: ${g.tasks.length}`).join(', ')}`);\n\n // RFC-003: Emit 'processing' projection for first-attempt entity tasks\n if (this.entityProjection) {\n try {\n const processingProjections = tasks\n .filter(t => t.entity && !t.execution_stats?.retry_count)\n .map(t => buildProjection(t, 'processing', {includePayload: this.entityProjectionConfig?.includePayload}))\n .filter((p): p is EntityTaskProjection<ID> => p !== null);\n await syncProjections(processingProjections, this.entityProjection, this.logger);\n } catch (err) {\n this.logger.error(`[TQ] Entity projection failed (non-fatal): ${err}`);\n }\n }\n\n const actions = new Actions<ID>(taskRunnerId, this.flowLifecycleProvider, this.workerId);\n const asyncTasks: AsyncTask<ID>[] = [];\n const processedTaskIds = new Set<string>();\n\n for (let i = 0; i < groupedTasksArray.length; i++) {\n if (abortSignal?.aborted) {\n this.logger.info(`[${taskRunnerId}] AbortSignal detected, stopping task group processing`);\n break;\n }\n\n const taskGroup = groupedTasksArray[i];\n const firstTask = taskGroup.tasks[0];\n if (!firstTask) {\n this.logger.warn(`[${taskRunnerId}] No tasks found for type: ${taskGroup.type}`);\n continue;\n }\n const executor = this.taskQueue.getExecutor(firstTask.queue_id, taskGroup.type);\n if (!executor) {\n this.logger.warn(`[${taskRunnerId}] No executor found for type: ${taskGroup.type} in queue ${firstTask.queue_id}`);\n for (const task of taskGroup.tasks) {\n const taskWithId: CronTask<ID> = task.id\n ? task\n : {...task, id: this.generateId()};\n actions.addIgnoredTask(taskWithId);\n }\n continue;\n }\n\n if (executor.asyncConfig?.handoffTimeout && asyncTaskManager && !asyncTaskManager.canAcceptTask()) {\n this.logger.warn(`[${taskRunnerId}] Async queue full, rescheduling ${taskGroup.tasks.length} ${taskGroup.type} tasks for 3 min later`);\n\n const rescheduledTasks = taskGroup.tasks.map(task => ({\n ...task,\n execute_at: new Date(Date.now() + 180000),\n status: 'scheduled' as const\n }));\n\n await this.taskStore.updateTasksForRetry(rescheduledTasks);\n continue;\n }\n\n // Track that we're processing this task group\n taskGroup.tasks.forEach(task => processedTaskIds.add(tId(task)));\n\n this.logger.info(`[${taskRunnerId}] Processing ${taskGroup.tasks.length} tasks of type: ${taskGroup.type}`);\n\n if (executor.multiple) {\n const batchStore = this.buildBatchLogStore(taskGroup.tasks, this.workerId);\n const batchTaskContexts = taskGroup.tasks.map(t => this.buildTaskContext(t, this.workerId, taskRunnerId));\n const batchStartedAt = Date.now();\n\n // Emit onTaskBatchStarted\n this.emitLifecycleEvent(\n this.lifecycleProvider?.onTaskBatchStarted,\n {\n task_type: taskGroup.type as string,\n queue_id: firstTask.queue_id,\n tasks: batchTaskContexts,\n worker_id: this.workerId,\n consumer_id: taskRunnerId,\n started_at: new Date(batchStartedAt),\n }\n );\n\n await runWithLogContext(batchStore, () =>\n executor.onTasks(taskGroup.tasks as any[], actions).catch(err => {\n this.logger.error(`[${taskRunnerId}] executor.onTasks failed: ${err}`);\n for (const task of taskGroup.tasks) {\n if (actions.getTaskResultStatus(tId(task)) === 'pending') {\n actions.fail(task, err instanceof Error ? err : new Error(String(err)));\n }\n }\n })\n );\n\n // Emit onTaskBatchCompleted\n const succeeded: string[] = [];\n const failed: string[] = [];\n for (const task of taskGroup.tasks) {\n const status = actions.getTaskResultStatus(tId(task));\n if (status === 'success') succeeded.push(tId(task));\n else if (status === 'fail') failed.push(tId(task));\n else failed.push(tId(task)); // pending = no explicit call = treat as failed\n }\n\n this.emitLifecycleEvent(\n this.lifecycleProvider?.onTaskBatchCompleted,\n {\n task_type: taskGroup.type as string,\n queue_id: firstTask.queue_id,\n tasks: batchTaskContexts,\n worker_id: this.workerId,\n consumer_id: taskRunnerId,\n succeeded,\n failed,\n duration_ms: Date.now() - batchStartedAt,\n }\n );\n } else {\n if (executor.parallel) {\n const chunks = chunk(taskGroup.tasks, executor.chunkSize) as CronTask<ID>[][];\n this.logger.info(`[${taskRunnerId}] Processing in parallel chunks of ${executor.chunkSize}`);\n for (const taskChunk of chunks) {\n // Emit onTaskStarted for all tasks in chunk\n for (const task of taskChunk) {\n this.emitTaskStarted(task, this.workerId, taskRunnerId);\n }\n\n const chunkPromises: Promise<void>[] = [];\n for (let j = 0; j < taskChunk.length; j++) {\n const task = taskChunk[j];\n const taskActions = actions.forkForTask(task);\n const logStore = this.buildLogStore(task, this.workerId);\n chunkPromises.push(runWithLogContext(logStore, () =>\n executor.onTask(task, taskActions).catch(err => {\n this.logger.error(`[${taskRunnerId}] executor.onTask failed: ${err}`);\n if (actions.getTaskResultStatus(tId(task)) === 'pending') {\n actions.fail(task, err instanceof Error ? err : new Error(String(err)));\n }\n })\n ));\n }\n await Promise.all(chunkPromises);\n\n // Emit completion events for all tasks in chunk\n for (const task of taskChunk) {\n const resultStatus = actions.getTaskResultStatus(tId(task));\n if (resultStatus === 'success') {\n this.emitTaskCompleted(task, this.workerId, actions.getTaskResult(tId(task)), taskRunnerId);\n } else if (resultStatus === 'fail') {\n const retryCount = (task.execution_stats?.retry_count as number) || 0;\n const maxRetries = task.retries ?? executor.default_retries ?? 0;\n const willRetry = retryCount < maxRetries;\n this.emitTaskFailed(task, this.workerId, new Error('Task failed'), willRetry, undefined, taskRunnerId);\n }\n }\n }\n } else {\n const timeoutMs = executor.asyncConfig?.handoffTimeout;\n\n for (let j = 0; j < taskGroup.tasks.length; j++) {\n const task = taskGroup.tasks[j];\n\n if (!timeoutMs) {\n // Emit onTaskStarted\n this.emitTaskStarted(task, this.workerId, taskRunnerId);\n\n const taskActions = actions.forkForTask(task);\n const logStore = this.buildLogStore(task, this.workerId);\n await runWithLogContext(logStore, () =>\n executor.onTask(task, taskActions).catch(err => {\n this.logger.error(`[${taskRunnerId}] executor.onTask failed: ${err}`);\n if (actions.getTaskResultStatus(tId(task)) === 'pending') {\n actions.fail(task, err instanceof Error ? err : new Error(String(err)));\n }\n })\n );\n\n // Emit completion event based on result\n const resultStatus = actions.getTaskResultStatus(tId(task));\n if (resultStatus === 'success') {\n this.emitTaskCompleted(task, this.workerId, actions.getTaskResult(tId(task)), taskRunnerId);\n } else if (resultStatus === 'fail') {\n const retryCount = (task.execution_stats?.retry_count as number) || 0;\n const maxRetries = task.retries ?? executor.default_retries ?? 0;\n const willRetry = retryCount < maxRetries;\n this.emitTaskFailed(task, this.workerId, new Error('Task failed'), willRetry, undefined, taskRunnerId);\n }\n } else {\n // Emit onTaskStarted for async-capable tasks\n this.emitTaskStarted(task, this.workerId, taskRunnerId);\n\n const startTime = Date.now();\n let isTimedOut = false;\n\n const taskActions = actions.forkForTask(task);\n const logStore = this.buildLogStore(task, this.workerId);\n\n const taskPromise = runWithLogContext(logStore, () =>\n executor.onTask(task, taskActions).catch(err => {\n this.logger.error(`[${taskRunnerId}] executor.onTask failed: ${err}`);\n if (actions.getTaskResultStatus(tId(task)) === 'pending') {\n actions.fail(task, err instanceof Error ? err : new Error(String(err)));\n }\n })\n );\n\n let timeoutId: NodeJS.Timeout | undefined;\n const timeoutPromise = new Promise<'~~~timeout'>(resolve => {\n timeoutId = setTimeout(() => {\n isTimedOut = true;\n resolve('~~~timeout');\n }, timeoutMs);\n\n // Support early cancellation via AbortSignal\n // Note: In real usage, this would come from the task execution context\n // For now, this is a foundation for future AbortSignal integration\n });\n\n const result = await Promise.race([taskPromise, timeoutPromise]);\n\n // Clear the timeout to prevent memory leak\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n if (result !== '~~~timeout') {\n // Task completed before timeout - emit lifecycle event\n const resultStatus = actions.getTaskResultStatus(tId(task));\n if (resultStatus === 'success') {\n this.emitTaskCompleted(task, this.workerId, actions.getTaskResult(tId(task)), taskRunnerId);\n } else if (resultStatus === 'fail') {\n const retryCount = (task.execution_stats?.retry_count as number) || 0;\n const maxRetries = task.retries ?? executor.default_retries ?? 0;\n const willRetry = retryCount < maxRetries;\n this.emitTaskFailed(task, this.workerId, new Error('Task failed'), willRetry, undefined, taskRunnerId);\n }\n }\n\n if (result === '~~~timeout') {\n this.logger.info(`[${taskRunnerId}] Task ${tId(task)} (${task.type}) exceeded ${timeoutMs}ms, marking for async handoff`);\n\n if (!asyncTaskManager) {\n throw new Error(`Task ${task.type} exceeded timeout but AsyncTaskManager not initialized!`);\n }\n\n if (!task.id) {\n this.logger.error(`[${taskRunnerId}] Cannot hand off task without id (type: ${task.type}). Task will continue but won't be tracked.`);\n } else {\n const asyncLifecycleEmitter = this.lifecycleProvider ? {\n onCompleted: (t: CronTask<ID>, result?: unknown) => {\n this.emitTaskCompleted(t, this.workerId, result, taskRunnerId);\n },\n onFailed: (t: CronTask<ID>, error: Error, willRetry: boolean) => {\n this.emitTaskFailed(t, this.workerId, error, willRetry, undefined, taskRunnerId);\n },\n onScheduled: (t: CronTask<ID>) => {\n if (this.lifecycleProvider?.onTaskScheduled) {\n this.emitLifecycleEvent(\n this.lifecycleProvider.onTaskScheduled,\n this.buildTaskContext(t, this.workerId, taskRunnerId)\n );\n }\n }\n } : undefined;\n const asyncActions = new AsyncActions<ID>(this.messageQueue, this.taskStore, this.taskQueue, actions, task, this.generateId, asyncLifecycleEmitter, this.entityProjection, this.entityProjectionConfig, this.flowMiddleware);\n\n const asyncPromise = taskPromise\n .finally(async () => {\n try {\n await asyncActions.onPromiseFulfilled();\n } catch (err) {\n this.logger.error(`[${taskRunnerId}] Failed to execute async actions for task ${tId(task)}:`, err);\n }\n });\n\n asyncTasks.push({\n task,\n promise: asyncPromise,\n startTime,\n actions: asyncActions\n });\n }\n }\n }\n }\n }\n }\n }\n\n const asyncTaskIds = asyncTasks.map(at => tId(at.task));\n const results = actions.extractSyncResults(asyncTaskIds);\n\n this.logger.info(`[${taskRunnerId}] Completing run - Success: ${results.successTasks.length}, Failed: ${results.failedTasks.length}, New: ${results.newTasks.length}, Async: ${asyncTasks.length}, Ignored: ${results.ignoredTasks.length}`);\n\n // Locks are automatically released by DisposableLockBatch via await using\n return {...results, asyncTasks};\n }\n\n private emitLifecycleEvent<T>(\n callback: ((ctx: T) => void | Promise<void>) | undefined,\n ctx: T\n ): void {\n if (!callback) return;\n\n try {\n const result = callback(ctx);\n if (result instanceof Promise) {\n result.catch(err => {\n this.logger.error(`[TQ] Lifecycle callback error: ${err}`);\n });\n }\n } catch (err) {\n this.logger.error(`[TQ] Lifecycle callback error: ${err}`);\n }\n }\n\n private buildTaskContext(task: CronTask<ID>, workerId?: string, consumerId?: string): TaskContext {\n const retryCount = (task.execution_stats && typeof task.execution_stats.retry_count === 'number')\n ? task.execution_stats.retry_count\n : 0;\n const executor = this.taskQueue.getExecutor(task.queue_id, task.type);\n const maxRetries = task.retries ?? executor?.default_retries ?? 0;\n const payload = task.payload as Record<string, unknown>;\n\n return {\n task_id: task.id?.toString() || tId(task),\n task_hash: payload?.task_hash as string | undefined,\n task_type: task.type,\n queue_id: task.queue_id,\n payload: this.lifecycleConfig?.include_payload ? payload : {},\n attempt: retryCount + 1,\n max_retries: maxRetries,\n scheduled_at: task.created_at || new Date(),\n worker_id: workerId,\n consumer_id: consumerId,\n log_context: task.metadata?.log_context,\n };\n }\n\n private emitTaskStarted(task: CronTask<ID>, workerId: string, consumerId?: string): void {\n const startedAt = Date.now();\n this.taskStartTimes.set(tId(task), startedAt);\n\n if (this.lifecycleProvider?.onTaskStarted) {\n const ctx = this.buildTaskContext(task, workerId, consumerId);\n const queuedDuration = startedAt - (task.created_at?.getTime() || startedAt);\n this.emitLifecycleEvent(\n this.lifecycleProvider.onTaskStarted,\n {\n ...ctx,\n started_at: new Date(startedAt),\n queued_duration_ms: queuedDuration\n }\n );\n }\n }\n\n private emitTaskCompleted(task: CronTask<ID>, workerId: string, result?: unknown, consumerId?: string): void {\n const completedAt = Date.now();\n const startedAt = this.taskStartTimes.get(tId(task)) || completedAt;\n this.taskStartTimes.delete(tId(task));\n\n if (this.lifecycleProvider?.onTaskCompleted) {\n const ctx = this.buildTaskContext(task, workerId, consumerId);\n const timing: TaskTiming = {\n queued_duration_ms: startedAt - (task.created_at?.getTime() || startedAt),\n processing_duration_ms: completedAt - startedAt,\n total_duration_ms: completedAt - (task.created_at?.getTime() || completedAt)\n };\n this.emitLifecycleEvent(\n this.lifecycleProvider.onTaskCompleted,\n {...ctx, timing, result}\n );\n }\n }\n\n private emitTaskFailed(task: CronTask<ID>, workerId: string, error: Error, willRetry: boolean, nextAttemptAt?: Date, consumerId?: string): void {\n const completedAt = Date.now();\n const startedAt = this.taskStartTimes.get(tId(task)) || completedAt;\n this.taskStartTimes.delete(tId(task));\n\n if (this.lifecycleProvider?.onTaskFailed) {\n const ctx = this.buildTaskContext(task, workerId, consumerId);\n const timing: TaskTiming = {\n queued_duration_ms: startedAt - (task.created_at?.getTime() || startedAt),\n processing_duration_ms: completedAt - startedAt,\n total_duration_ms: completedAt - (task.created_at?.getTime() || completedAt)\n };\n this.emitLifecycleEvent(\n this.lifecycleProvider.onTaskFailed,\n {...ctx, timing, error, will_retry: willRetry, next_attempt_at: nextAttemptAt}\n );\n }\n }\n}","import {getEnvironmentQueueName, QueueName} from \"@supergrowthai/mq\";\n\n/**\n * Gets all queue names for the current environment\n * @returns Array of full queue names including environment suffix\n */\nexport function getEnabledQueues(): QueueName[] {\n let enabledQueues: QueueName[] = process.env.ENABLED_QUEUES ? JSON.parse(process.env.ENABLED_QUEUES!) : [];\n\n if (enabledQueues.length === 0) throw new Error('No queues enabled');\n\n return enabledQueues.map(getEnvironmentQueueName);\n}\n","/**\n * RFC-002: Flow Middleware\n *\n * Post-processing hook that tracks flow step completion via the barrier provider\n * and dispatches join tasks when all steps are done (or on abort/timeout).\n */\n\nimport type {CronTask} from \"../../adapters/types.js\";\nimport type {FlowMeta, FlowResults, FlowStepResult} from \"./types.js\";\nimport type {IFlowBarrierProvider} from \"./IFlowBarrierProvider.js\";\nimport type {EntityTaskProjection} from \"../entity/IEntityProjectionProvider.js\";\nimport {buildProjection} from \"../entity/IEntityProjectionProvider.js\";\nimport type {IFlowLifecycleProvider, FlowContext} from \"../lifecycle.js\";\nimport type {QueueName} from \"@supergrowthai/mq\";\n\nexport interface FlowPostProcessInput<ID> {\n successTasks: CronTask<ID>[];\n failedTasks: CronTask<ID>[];\n}\n\nexport interface FlowPostProcessResult<ID> {\n joinTasks: CronTask<ID>[];\n projections: EntityTaskProjection<ID>[];\n}\n\n/** Extract FlowMeta from task metadata, cast through unknown for type safety */\nfunction getFlowMeta(task: CronTask<any>): FlowMeta | undefined {\n return task.metadata?.flow_meta as unknown as FlowMeta | undefined;\n}\n\n/** Extract FlowMeta from task metadata (non-null assertion — caller has already checked) */\nfunction getFlowMetaRequired(task: CronTask<any>): FlowMeta {\n return task.metadata!.flow_meta as unknown as FlowMeta;\n}\n\nexport class FlowMiddleware<ID> {\n constructor(\n private readonly barrierProvider: IFlowBarrierProvider,\n private readonly generateId: () => ID,\n private readonly flowLifecycleProvider?: IFlowLifecycleProvider,\n private readonly workerId: string = '',\n ) {}\n\n private emitFlowEvent<T>(\n callback: ((ctx: T) => void | Promise<void>) | undefined,\n ctx: T\n ): void {\n if (!callback) return;\n try {\n const result = callback(ctx);\n if (result instanceof Promise) {\n result.catch(() => { /* non-fatal */ });\n }\n } catch {\n // non-fatal\n }\n }\n\n private buildFlowContext(flowMeta: FlowMeta): FlowContext {\n return {\n flow_id: flowMeta.flow_id,\n total_steps: flowMeta.total_steps,\n join: flowMeta.join,\n failure_policy: flowMeta.failure_policy,\n entity: flowMeta.entity,\n worker_id: this.workerId,\n };\n }\n\n /**\n * Process completed tasks for flow orchestration.\n * Called from TaskHandler.postProcessTasks after markFailed/markSuccess.\n *\n * @param input Categorized terminal tasks — success and final-failed (no retries left)\n * @returns Join tasks to dispatch and entity projections to sync\n */\n async onPostProcess(input: FlowPostProcessInput<ID>): Promise<FlowPostProcessResult<ID>> {\n const joinTasks: CronTask<ID>[] = [];\n const projections: EntityTaskProjection<ID>[] = [];\n\n // Use object identity for O(1) success/fail classification\n // (tasks may not have IDs at this point in the pipeline)\n const successTaskSet = new Set<CronTask<ID>>(input.successTasks);\n\n const allTasks = [...input.successTasks, ...input.failedTasks];\n\n // Separate flow tasks by role\n const joinCompletions: CronTask<ID>[] = [];\n const timeoutTasks: CronTask<ID>[] = [];\n const stepTasks: { task: CronTask<ID>; isSuccess: boolean }[] = [];\n\n for (const task of allTasks) {\n const flowMeta = getFlowMeta(task);\n if (!flowMeta) continue;\n\n const isSuccess = successTaskSet.has(task);\n\n if (flowMeta.is_join) {\n joinCompletions.push(task);\n } else if (flowMeta.is_timeout) {\n timeoutTasks.push(task);\n } else {\n stepTasks.push({task, isSuccess});\n }\n }\n\n // 1. Handle completed join tasks — emit entity projections\n for (const task of joinCompletions) {\n const flowMeta = getFlowMetaRequired(task);\n const isSuccess = successTaskSet.has(task);\n if (flowMeta.entity) {\n try {\n const status = isSuccess ? 'executed' : 'failed';\n const error = !isSuccess\n ? (task.execution_stats?.last_error as string || 'Join task failed')\n : undefined;\n const p = buildProjection(\n {\n ...task,\n id: flowMeta.flow_id as unknown as ID,\n entity: flowMeta.entity,\n },\n status,\n {result: task.execution_result, error}\n );\n if (p) projections.push(p);\n } catch {\n // Non-fatal: projection build can fail if no ID\n }\n }\n }\n\n // 2. Handle timeout sentinel tasks\n for (const task of timeoutTasks) {\n const flowMeta = getFlowMetaRequired(task);\n const flowId = flowMeta.flow_id;\n\n // Auto-init barrier if not yet created (timeout can fire before any step completes)\n await this.barrierProvider.initBarrier(flowId, flowMeta.total_steps);\n\n // Check if flow already completed\n const isComplete = await this.barrierProvider.isComplete(flowId);\n if (isComplete) continue; // No-op: flow already done\n\n // Flow not complete — abort and dispatch join with partial results\n const isFirstAbort = await this.barrierProvider.markAborted(flowId);\n if (!isFirstAbort) continue; // Already aborted by step failure — no duplicate join\n const partialResults = await this.barrierProvider.getStepResults(flowId);\n\n const flowResults: FlowResults = {\n flow_id: flowId,\n steps: partialResults,\n timed_out: true,\n };\n\n const joinTask = this.buildJoinTask(flowMeta, flowResults);\n joinTasks.push(joinTask);\n\n // Emit onFlowTimedOut\n if (this.flowLifecycleProvider?.onFlowTimedOut) {\n const startedAt = await this.barrierProvider.getStartedAt(flowId);\n const durationMs = startedAt ? Date.now() - startedAt.getTime() : 0;\n this.emitFlowEvent(this.flowLifecycleProvider.onFlowTimedOut, {\n ...this.buildFlowContext(flowMeta),\n duration_ms: durationMs,\n steps_completed: partialResults.length,\n });\n }\n\n // Entity projection for timeout\n if (flowMeta.entity) {\n try {\n const p = buildProjection(\n {\n ...joinTask,\n id: flowId as unknown as ID,\n entity: flowMeta.entity,\n },\n 'failed',\n {error: 'flow_timeout'}\n );\n if (p) projections.push(p);\n } catch {\n // Non-fatal\n }\n }\n }\n\n // 3. Handle step tasks — group by flow_id, batchDecrementAndCheck once per group\n const stepsByFlow = new Map<string, { task: CronTask<ID>; isSuccess: boolean }[]>();\n for (const entry of stepTasks) {\n const flowMeta = getFlowMetaRequired(entry.task);\n const group = stepsByFlow.get(flowMeta.flow_id) || [];\n group.push(entry);\n stepsByFlow.set(flowMeta.flow_id, group);\n }\n\n for (const [flowId, entries] of stepsByFlow) {\n const firstFlowMeta = getFlowMetaRequired(entries[0].task);\n\n // Auto-init barrier if not yet created (idempotent — no-op if exists)\n await this.barrierProvider.initBarrier(flowId, firstFlowMeta.total_steps);\n\n // Check for abort policy: if any step failed and policy is 'abort'\n if (firstFlowMeta.failure_policy === 'abort') {\n const hasFailure = entries.some(e => !e.isSuccess);\n\n if (hasFailure) {\n const isFirstAbort = await this.barrierProvider.markAborted(flowId);\n if (isFirstAbort) {\n // Record results for the steps we have, then dispatch join\n const stepResults = this.buildStepResults(entries);\n await this.barrierProvider.batchDecrementAndCheck(flowId, stepResults);\n const allResults = await this.barrierProvider.getStepResults(flowId);\n\n const flowResults: FlowResults = {\n flow_id: flowId,\n steps: allResults,\n aborted: true,\n };\n\n const joinTask = this.buildJoinTask(firstFlowMeta, flowResults);\n joinTasks.push(joinTask);\n\n // Emit onFlowAborted\n if (this.flowLifecycleProvider?.onFlowAborted) {\n const startedAt = await this.barrierProvider.getStartedAt(flowId);\n const durationMs = startedAt ? Date.now() - startedAt.getTime() : 0;\n const failedEntry = entries.find(e => !e.isSuccess);\n const triggerIndex = failedEntry\n ? (failedEntry.task.metadata?.flow_meta as unknown as FlowMeta)?.step_index ?? -1\n : -1;\n this.emitFlowEvent(this.flowLifecycleProvider.onFlowAborted, {\n ...this.buildFlowContext(firstFlowMeta),\n duration_ms: durationMs,\n steps_completed: allResults.length,\n trigger_step_index: triggerIndex,\n });\n }\n\n // Entity projection for abort\n if (firstFlowMeta.entity) {\n try {\n const p = buildProjection(\n {\n ...joinTask,\n id: flowId as unknown as ID,\n entity: firstFlowMeta.entity,\n },\n 'failed',\n {error: 'flow_aborted'}\n );\n if (p) projections.push(p);\n } catch {\n // Non-fatal\n }\n }\n }\n // Else: already aborted, skip (no second join)\n continue;\n }\n }\n\n // Normal path: record results and check barrier\n const stepResults = this.buildStepResults(entries);\n const {remaining} = await this.barrierProvider.batchDecrementAndCheck(flowId, stepResults);\n\n if (remaining === 0) {\n // Barrier met — dispatch join task\n const allResults = await this.barrierProvider.getStepResults(flowId);\n\n const flowResults: FlowResults = {\n flow_id: flowId,\n steps: allResults,\n };\n\n const joinTask = this.buildJoinTask(firstFlowMeta, flowResults);\n joinTasks.push(joinTask);\n\n // Emit onFlowCompleted\n if (this.flowLifecycleProvider?.onFlowCompleted) {\n const startedAt = await this.barrierProvider.getStartedAt(flowId);\n const durationMs = startedAt ? Date.now() - startedAt.getTime() : 0;\n const stepsSucceeded = allResults.filter(r => r.status === 'success').length;\n const stepsFailed = allResults.filter(r => r.status === 'fail').length;\n this.emitFlowEvent(this.flowLifecycleProvider.onFlowCompleted, {\n ...this.buildFlowContext(firstFlowMeta),\n duration_ms: durationMs,\n steps_succeeded: stepsSucceeded,\n steps_failed: stepsFailed,\n });\n }\n }\n // remaining > 0: not yet complete, wait for more steps\n // remaining === -1: late arrival (already aborted/completed), ignore\n }\n\n return {joinTasks, projections};\n }\n\n private buildStepResults(entries: { task: CronTask<ID>; isSuccess: boolean }[]): FlowStepResult[] {\n return entries.map(({task, isSuccess}) => {\n const flowMeta = getFlowMetaRequired(task);\n return {\n step_index: flowMeta.step_index,\n status: isSuccess ? 'success' as const : 'fail' as const,\n result: task.execution_result,\n error: !isSuccess\n ? (task.execution_stats?.last_error as string || 'Step failed')\n : undefined,\n };\n });\n }\n\n private buildJoinTask(flowMeta: FlowMeta, flowResults: FlowResults): CronTask<ID> {\n const now = new Date();\n const joinFlowMeta: FlowMeta = {\n ...flowMeta,\n is_join: true,\n is_timeout: undefined,\n step_index: -1,\n };\n\n return {\n id: this.generateId(),\n type: flowMeta.join.type,\n queue_id: flowMeta.join.queue_id as QueueName,\n payload: {flow_results: flowResults},\n execute_at: now,\n status: 'scheduled',\n created_at: now,\n updated_at: now,\n force_store: true,\n metadata: {\n flow_meta: joinFlowMeta as unknown as Record<string, unknown>,\n },\n ...(flowMeta.entity ? {entity: flowMeta.entity} : {}),\n } as unknown as CronTask<ID>;\n }\n}","import {TaskStore} from \"./TaskStore.js\";\nimport {LockManager, Logger, LogLevel} from \"@supergrowthai/utils\"\nimport {TaskRunner} from \"./TaskRunner.js\";\nimport {getEnabledQueues} from \"./environment.js\";\nimport moment from \"moment\";\nimport type {MessageConsumer} from \"@supergrowthai/mq\";\nimport {IMessageQueue, QueueName} from \"@supergrowthai/mq\";\nimport type {MessageMetadata} from \"@supergrowthai/mq\";\nimport {ProcessedTaskResult} from \"./task-processor-types.js\";\nimport {CronTask, ITaskStorageAdapter} from \"../adapters\";\nimport type {CacheProvider} from \"memoose-js\";\nimport {TaskQueuesManager} from \"./TaskQueuesManager\";\nimport {IAsyncTaskManager} from \"./async/async-task-manager\";\nimport type {AsyncTask} from \"./TaskRunner.js\";\nimport {\n DiscardedTaskInfo,\n ITaskNotificationProvider,\n TaskErrorInfo,\n TaskQueueStats\n} from \"./ITaskNotificationProvider.js\";\nimport type {\n ITaskLifecycleProvider,\n IWorkerLifecycleProvider,\n TaskContext,\n TaskHandlerConfig,\n WorkerInfo,\n WorkerStats,\n ConsumerInfo,\n ConsumerStats\n} from \"./lifecycle.js\";\nimport type {IEntityProjectionProvider, EntityTaskProjection} from \"./entity/IEntityProjectionProvider.js\";\nimport {buildProjection, syncProjections} from \"./entity/IEntityProjectionProvider.js\";\nimport {FlowMiddleware} from \"./flow/FlowMiddleware.js\";\nimport * as os from \"os\";\n\nconst METRICS_KEY_PREFIX = 'task_metrics:';\nconst DISCARDED_TASKS_KEY = `${METRICS_KEY_PREFIX}discarded_tasks`;\nconst STATS_THRESHOLD = parseInt(process.env.TQ_STATS_THRESHOLD || '1000');\nconst FAILURE_THRESHOLD = parseInt(process.env.TQ_STATS_FAILURE_THRESHOLD || '100');\nconst INSTANCE_ID = process.env.INSTANCE_ID || 'unknown';\n\n\nexport class TaskHandler<ID> {\n private readonly logger: Logger;\n private taskRunner: TaskRunner<ID>;\n private readonly taskStore: TaskStore<ID>;\n private matureTaskTimer: NodeJS.Timeout | null = null;\n private heartbeatTimer: NodeJS.Timeout | null = null;\n private readonly config: TaskHandlerConfig;\n private readonly flowMiddleware?: FlowMiddleware<ID>;\n\n // Worker info\n private readonly workerId: string;\n private readonly workerStartedAt: Date;\n private enabledQueues: string[] = [];\n private workerStarted = false;\n\n // Worker stats\n private workerStats: WorkerStats = {\n tasks_processed: 0,\n tasks_succeeded: 0,\n tasks_failed: 0,\n avg_processing_ms: 0,\n current_task: undefined\n };\n private totalProcessingMs = 0;\n\n private readonly queueStats = new Map<QueueName, {\n success: number;\n failed: number;\n async: number;\n ignored: number;\n }>();\n\n // Consumer tracking (per consumer_id)\n private readonly consumerStatsMap = new Map<string, ConsumerStats & { started_at: Date }>();\n\n constructor(\n private messageQueue: IMessageQueue<ID>,\n private taskQueuesManager: TaskQueuesManager<ID>,\n private databaseAdapter: ITaskStorageAdapter<ID>,\n private cacheAdapter: CacheProvider<any>,\n private asyncTaskManager?: IAsyncTaskManager<ID>,\n private notificationProvider?: ITaskNotificationProvider,\n config?: TaskHandlerConfig\n ) {\n this.logger = new Logger('TaskHandler', LogLevel.INFO);\n this.config = config || {};\n\n // Initialize worker identity\n this.workerId = `${os.hostname()}-${process.pid}-${Date.now()}`;\n this.workerStartedAt = new Date();\n\n this.taskStore = new TaskStore<ID>(databaseAdapter);\n\n if (this.config.flowLifecycleProvider && !this.config.flowBarrierProvider) {\n throw new Error('[TQ] flowLifecycleProvider requires flowBarrierProvider — flow lifecycle events need flow orchestration enabled');\n }\n\n // Assemble FlowMiddleware internally — all deps provided at construction, no mutable setter\n this.flowMiddleware = this.config.flowBarrierProvider\n ? new FlowMiddleware<ID>(\n this.config.flowBarrierProvider,\n databaseAdapter.generateId.bind(databaseAdapter),\n this.config.flowLifecycleProvider,\n this.workerId,\n )\n : undefined;\n\n this.taskRunner = new TaskRunner<ID>({\n messageQueue,\n taskQueue: taskQueuesManager,\n taskStore: this.taskStore,\n cacheProvider: this.cacheAdapter,\n generateId: databaseAdapter.generateId.bind(databaseAdapter),\n lifecycleProvider: this.config.lifecycleProvider,\n lifecycleConfig: this.config.lifecycle,\n entityProjection: this.config.entityProjection,\n entityProjectionConfig: this.config.entityProjectionConfig,\n flowMiddleware: this.flowMiddleware,\n flowLifecycleProvider: this.config.flowLifecycleProvider,\n workerId: this.workerId,\n });\n }\n\n // ============ Lifecycle Event Helpers ============\n\n private get lifecycleProvider(): ITaskLifecycleProvider | undefined {\n return this.config.lifecycleProvider;\n }\n\n private get workerProvider(): IWorkerLifecycleProvider | undefined {\n return this.config.workerProvider;\n }\n\n private get entityProjectionProvider(): IEntityProjectionProvider | undefined {\n return this.config.entityProjection;\n }\n\n /**\n * Validate and sanitize log_context on a task (RFC-005).\n * - >10 keys: truncate to first 10 alphabetically, warn\n * - >1024 bytes total: drop entire context, warn\n */\n private validateLogContext(task: CronTask<ID>): CronTask<ID> {\n const logCtx = task.metadata?.log_context;\n if (!logCtx) return task;\n\n let validatedCtx = logCtx;\n const keys = Object.keys(logCtx).sort();\n\n // Truncate to 10 keys\n if (keys.length > 10) {\n this.logger.warn(`[TQ] log_context has ${keys.length} keys (max 10), truncating for task type ${task.type}`);\n const truncated: Record<string, string> = {};\n for (let i = 0; i < 10; i++) truncated[keys[i]] = logCtx[keys[i]];\n validatedCtx = truncated;\n }\n\n // Check total size (1KB limit)\n const serialized = JSON.stringify(validatedCtx);\n if (serialized.length > 1024) {\n this.logger.warn(`[TQ] log_context exceeds 1KB (${serialized.length} chars), dropping for task type ${task.type}`);\n const {log_context: _, ...restMeta} = task.metadata!;\n return {...task, metadata: Object.keys(restMeta).length > 0 ? (restMeta as MessageMetadata) : undefined} as CronTask<ID>;\n }\n\n if (validatedCtx !== logCtx) {\n return {...task, metadata: {...task.metadata, log_context: validatedCtx}};\n }\n return task;\n }\n\n async addTasks(tasks: CronTask<ID>[]) {\n // Validate log_context on all tasks (RFC-005)\n tasks = tasks.map(t => this.validateLogContext(t));\n\n const diffedItems = tasks.reduce(\n (acc, {force_store, ...task}) => {\n const currentTime = new Date();\n const executeTime = task.execute_at;\n const timeDifference = (executeTime.getTime() - currentTime.getTime()) / 1000 / 60;\n\n const queue = task.queue_id;\n if (timeDifference > 2) {\n // Future task — persist to DB, mature processor will pick it up later\n acc.future[queue] = acc.future[queue] || [];\n acc.future[queue].push(task);\n } else if (force_store) {\n // Immediate but force_store — persist to DB AND send to MQ now\n acc.forceStoreImmediate[queue] = acc.forceStoreImmediate[queue] || [];\n acc.forceStoreImmediate[queue].push(task);\n } else {\n // Immediate — send to MQ only\n acc.immediate[queue] = acc.immediate[queue] || [];\n acc.immediate[queue].push(task);\n }\n\n return acc;\n },\n {\n future: {} as { [key in QueueName]: CronTask<ID>[] },\n immediate: {} as { [key in QueueName]: CronTask<ID>[] },\n forceStoreImmediate: {} as { [key in QueueName]: CronTask<ID>[] },\n }\n );\n\n const iQueues = Object.keys(diffedItems.immediate) as unknown as QueueName[];\n for (let i = 0; i < iQueues.length; i++) {\n const queue = iQueues[i];\n const queueTasks: CronTask<ID>[] = diffedItems.immediate[queue]\n .map((task) => {\n const executor = this.taskQueuesManager.getExecutor(task.queue_id, task.type);\n const shouldStoreOnFailure = executor?.store_on_failure ?? false;\n const id = shouldStoreOnFailure ? {id: this.databaseAdapter.generateId(),} : {}\n const partitionKey = executor?.getPartitionKey?.(task);\n return ({...id, ...task, ...(partitionKey ? {partition_key: partitionKey} : {})});\n });\n\n // RFC-003: Write 'scheduled' projections BEFORE addMessages to prevent\n // terminal projection overwrite in immediate/synchronous execution mode.\n if (this.entityProjectionProvider) {\n try {\n const includePayload = this.config.entityProjectionConfig?.includePayload;\n const entityProjections = queueTasks\n .filter(t => t.entity)\n .map(t => buildProjection(t, 'scheduled', {includePayload}))\n .filter((p): p is EntityTaskProjection => p !== null);\n await syncProjections(entityProjections, this.entityProjectionProvider, this.logger);\n } catch (err) {\n this.logger.error(`[TQ] Entity projection failed (non-fatal): ${err}`);\n }\n }\n\n await this.messageQueue.addMessages(queue, queueTasks as unknown as CronTask<ID>[]);\n\n // Emit onTaskScheduled for each task\n if (this.lifecycleProvider?.onTaskScheduled) {\n for (const task of queueTasks) {\n this.emitLifecycleEvent(\n this.lifecycleProvider.onTaskScheduled,\n this.buildTaskContext(task)\n );\n }\n }\n }\n\n // force_store + immediate: persist to Task DB as 'processing', then send to MQ.\n // DB status = 'processing': prevents the mature task poller from re-enqueuing.\n // MQ status = 'scheduled': DB-backed MQ adapters (MongoDB, Prisma) only consume\n // messages with status:'scheduled', so the MQ copy must use that status.\n // TODO(D1): Apply getPartitionKey here too (same as immediate path above).\n // Currently forceStoreImmediate tasks skip partition key enrichment.\n const fsQueues = Object.keys(diffedItems.forceStoreImmediate) as unknown as QueueName[];\n for (let i = 0; i < fsQueues.length; i++) {\n const queue = fsQueues[i];\n const queueTasks: CronTask<ID>[] = diffedItems.forceStoreImmediate[queue]\n .map((task) => {\n const id = task.id ? {} : {id: this.databaseAdapter.generateId()};\n return ({...id, ...task, status: 'processing', processing_started_at: new Date()});\n });\n\n await this.taskStore.addTasksToScheduled(queueTasks);\n\n // RFC-003: Write 'scheduled' projections BEFORE addMessages to prevent\n // terminal projection overwrite in immediate/synchronous execution mode.\n if (this.entityProjectionProvider) {\n try {\n const includePayload = this.config.entityProjectionConfig?.includePayload;\n const entityProjections = queueTasks\n .filter(t => t.entity)\n .map(t => buildProjection(t, 'scheduled', {includePayload}))\n .filter((p): p is EntityTaskProjection => p !== null);\n await syncProjections(entityProjections, this.entityProjectionProvider, this.logger);\n } catch (err) {\n this.logger.error(`[TQ] Entity projection failed (non-fatal): ${err}`);\n }\n }\n\n // Send to MQ with 'scheduled' status — DB-backed adapters (MongoDB, Prisma) filter\n // by status:'scheduled', so the message must use that status for consumption.\n // The Task DB retains status:'processing' to block the mature poller.\n const mqTasks = queueTasks.map(t => ({...t, status: 'scheduled' as const}));\n try {\n await this.messageQueue.addMessages(queue, mqTasks as unknown as CronTask<ID>[]);\n } catch (mqError) {\n // MQ failed after DB write - reset to 'scheduled' so mature poller can pick up\n this.logger.error(`MQ write failed for forceStoreImmediate tasks, resetting to scheduled: ${mqError}`);\n const taskIds = queueTasks.map(t => t.id).filter(Boolean) as ID[];\n if (taskIds.length > 0) {\n await this.databaseAdapter.updateTasks(\n taskIds.map(id => ({id, updates: {status: 'scheduled' as const}}))\n ).catch(resetErr => {\n this.logger.error(`Failed to reset tasks to scheduled after MQ failure: ${resetErr}`);\n });\n }\n throw mqError;\n }\n\n // Emit onTaskScheduled for each task\n if (this.lifecycleProvider?.onTaskScheduled) {\n for (const task of queueTasks) {\n this.emitLifecycleEvent(\n this.lifecycleProvider.onTaskScheduled,\n this.buildTaskContext(task)\n );\n }\n }\n }\n\n const fQueues = Object.keys(diffedItems.future) as unknown as QueueName[];\n for (let i = 0; i < fQueues.length; i++) {\n const queue = fQueues[i];\n const queueTasks: CronTask<ID>[] = diffedItems.future[queue]\n .map((task) => {\n const executor = this.taskQueuesManager.getExecutor(task.queue_id, task.type);\n const shouldStoreOnFailure = executor?.store_on_failure ?? false;\n const id = shouldStoreOnFailure ? {id: this.databaseAdapter.generateId(),} : {}\n return ({...id, ...task});\n });\n await this.taskStore.addTasksToScheduled(queueTasks);\n\n // RFC-003: Write 'scheduled' projections for future tasks after DB persistence.\n if (this.entityProjectionProvider) {\n try {\n const includePayload = this.config.entityProjectionConfig?.includePayload;\n const entityProjections = queueTasks\n .filter(t => t.entity)\n .map(t => buildProjection(t, 'scheduled', {includePayload}))\n .filter((p): p is EntityTaskProjection => p !== null);\n await syncProjections(entityProjections, this.entityProjectionProvider, this.logger);\n } catch (err) {\n this.logger.error(`[TQ] Entity projection failed (non-fatal): ${err}`);\n }\n }\n\n // Emit onTaskScheduled for each task\n if (this.lifecycleProvider?.onTaskScheduled) {\n for (const task of queueTasks) {\n this.emitLifecycleEvent(\n this.lifecycleProvider.onTaskScheduled,\n this.buildTaskContext(task)\n );\n }\n }\n }\n }\n\n // TODO(P2): Wrap retry upsert → new tasks → mark failed → mark success in a\n // transaction. If an intermediate step fails, tasks can be lost or re-executed\n // after 2-day stale recovery. Reorder to mark success first as a quick win.\n async postProcessTasks({\n failedTasks: failedTasksRaw,\n newTasks,\n successTasks\n }: ProcessedTaskResult<ID>) {\n const tasksToRetry: CronTask<ID>[] = [];\n const finalFailedTasks: CronTask<ID>[] = [];\n const discardedTasks: CronTask<ID>[] = [];\n\n // Maximum retry delay cap to prevent unbounded delays\n const MAX_RETRY_DELAY_MS = 5 * 60 * 1000; // 5 minutes\n\n for (const task of failedTasksRaw) {\n const taskRetryCount = (task.execution_stats && typeof task.execution_stats.retry_count === 'number') ? task.execution_stats.retry_count : 0;\n const taskRetryAfter = Math.max(task.retry_after || 2000, 0);\n const calculatedDelay = taskRetryAfter * Math.pow(taskRetryCount + 1, 2);\n const retryAfter = Math.min(calculatedDelay, MAX_RETRY_DELAY_MS);\n const executeAt = Date.now() + retryAfter;\n const maxRetries = this.getRetryCount(task);\n\n if (task.id && taskRetryCount < maxRetries) {\n tasksToRetry.push({\n ...task,\n status: 'scheduled',\n execute_at: new Date(executeAt),\n execution_stats: {\n ...(task.execution_stats || {}),\n retry_count: taskRetryCount + 1\n }\n });\n } else if (task.id) {\n finalFailedTasks.push(task);\n } else if (taskRetryCount < maxRetries) {\n const shouldStoreOnFailure = this.taskQueuesManager.getExecutor(task.queue_id, task.type)?.store_on_failure;\n if (shouldStoreOnFailure) {\n tasksToRetry.push({\n ...task,\n id: this.databaseAdapter.generateId(),\n status: 'scheduled',\n execute_at: new Date(executeAt),\n execution_stats: {\n ...(task.execution_stats || {}),\n retry_count: taskRetryCount + 1\n }\n });\n } else {\n await this.addTasks([{\n ...task,\n status: 'scheduled',\n execute_at: new Date(executeAt),\n execution_stats: {\n ...(task.execution_stats || {}),\n retry_count: taskRetryCount + 1\n }\n }]);\n }\n } else {\n discardedTasks.push(task);\n this.logger.info(`Discarding task of type ${task.type} after ${taskRetryCount} retries`);\n\n // Emit onTaskExhausted for discarded tasks\n if (this.lifecycleProvider?.onTaskExhausted) {\n const ctx = this.buildTaskContext(task);\n const errorMessage = task.execution_stats?.last_error as string || 'Task exhausted all retries';\n this.emitLifecycleEvent(\n this.lifecycleProvider.onTaskExhausted,\n {\n ...ctx,\n timing: {\n queued_duration_ms: 0,\n processing_duration_ms: 0,\n total_duration_ms: Date.now() - (task.created_at?.getTime() || Date.now())\n },\n error: new Error(errorMessage),\n total_attempts: taskRetryCount + 1\n }\n );\n }\n }\n }\n\n if (discardedTasks.length > 0) {\n await this.trackDiscardedTasks(discardedTasks.length);\n }\n\n if (tasksToRetry.length > 0) {\n // Persist to DB with 'processing' status to block processMatureTasks from\n // double-picking. Follows the same pattern as forceStoreImmediate (line ~236).\n const dbRetryTasks = tasksToRetry.map(t => ({\n ...t,\n status: 'processing' as const,\n processing_started_at: new Date()\n }));\n await this.taskStore.updateTasksForRetry(dbRetryTasks);\n\n // Re-enqueue to MQ so consumers can pick them up without waiting for\n // the processMatureTasks polling loop. DB-backed MQ adapters (MongoDB,\n // Prisma) gate on execute_at, so future-timed retries wait until ready.\n // ImmediateQueue and Kinesis execute immediately (backoff not enforced\n // at MQ layer — acceptable for test/stream modes).\n const retryByQueue = new Map<QueueName, CronTask<ID>[]>();\n for (const task of tasksToRetry) {\n const queue = task.queue_id as QueueName;\n if (!retryByQueue.has(queue)) retryByQueue.set(queue, []);\n retryByQueue.get(queue)!.push(task);\n }\n for (const [queue, retryQueueTasks] of retryByQueue) {\n try {\n await this.messageQueue.addMessages(queue, retryQueueTasks as unknown as CronTask<ID>[]);\n } catch (mqErr) {\n // MQ failed — DB still has status:'processing'. Stale recovery\n // (2-day timeout) will reset to 'scheduled' as a last resort.\n this.logger.error(`[TQ] Failed to re-enqueue retry tasks to MQ (stale recovery will handle): ${mqErr}`);\n }\n }\n }\n\n if (finalFailedTasks.length > 0) {\n await this.taskStore.markTasksAsFailed(finalFailedTasks);\n }\n\n if (successTasks.length > 0) {\n await this.taskStore.markTasksAsSuccess(successTasks);\n }\n\n // RFC-003: Emit terminal entity projections\n if (this.entityProjectionProvider) {\n try {\n const includePayload = this.config.entityProjectionConfig?.includePayload;\n const terminalProjections: EntityTaskProjection[] = [];\n\n // Success tasks → 'executed'\n for (const task of successTasks) {\n const p = buildProjection(task, 'executed', {\n includePayload,\n result: task.execution_result,\n });\n if (p) terminalProjections.push(p);\n }\n\n // Final failed tasks (with id, exhausted retries) → 'failed'\n for (const task of finalFailedTasks) {\n const p = buildProjection(task, 'failed', {\n includePayload,\n error: task.execution_stats?.last_error as string || 'Task failed',\n });\n if (p) terminalProjections.push(p);\n }\n\n // Discarded tasks (no id, exhausted retries) → 'failed'\n for (const task of discardedTasks) {\n try {\n const p = buildProjection(task, 'failed', {\n includePayload,\n error: task.execution_stats?.last_error as string || 'Task exhausted all retries',\n });\n if (p) terminalProjections.push(p);\n } catch (projErr) {\n this.logger.error(`[TQ] Entity projection build failed (non-fatal): ${projErr}`);\n }\n }\n\n await syncProjections(terminalProjections, this.entityProjectionProvider, this.logger);\n } catch (err) {\n this.logger.error(`[TQ] Entity projection failed (non-fatal): ${err}`);\n }\n }\n\n // RFC-002: Flow middleware — process completed tasks for barrier tracking and join dispatch\n if (this.flowMiddleware) {\n try {\n const flowResult = await this.flowMiddleware.onPostProcess({successTasks, failedTasks: finalFailedTasks});\n\n // Sync flow entity projections\n if (flowResult.projections.length > 0 && this.entityProjectionProvider) {\n await syncProjections(flowResult.projections, this.entityProjectionProvider, this.logger);\n }\n\n // Dispatch join tasks\n if (flowResult.joinTasks.length > 0) {\n await this.addTasks(flowResult.joinTasks);\n }\n } catch (err) {\n this.logger.error(`[TQ] Flow middleware failed (non-fatal): ${err}`);\n }\n }\n\n // Dispatch new tasks (executor-spawned child tasks)\n if (newTasks.length > 0) {\n await this.addTasks(newTasks);\n }\n }\n\n startConsumingTasks(streamName: QueueName, abortSignal?: AbortSignal) {\n return this.messageQueue.consumeMessagesStream(streamName, async (id, tasks) => {\n if (abortSignal?.aborted) {\n this.logger.info(`AbortSignal detected, skipping processing of ${tasks.length} tasks for stream ${streamName}`);\n return {failedTasks: [], newTasks: [], successTasks: [], asyncTasks: [], ignoredTasks: []};\n }\n\n const batchStartTime = Date.now();\n const taskTypes = [...new Set(tasks.map(t => t.type))];\n\n // Lazy consumer registration — emit onConsumerStarted on first batch\n this.registerConsumerIfNew(id, streamName);\n\n // Emit batch started\n if (this.workerProvider?.onBatchStarted) {\n this.emitLifecycleEvent(\n this.workerProvider.onBatchStarted,\n {\n ...this.buildWorkerInfo(),\n batch_size: tasks.length,\n task_types: taskTypes\n }\n );\n }\n\n this.logger.debug(`Processing ${tasks.length} tasks for stream ${streamName}`);\n const {\n failedTasks,\n newTasks,\n successTasks,\n asyncTasks,\n ignoredTasks,\n flowProjections\n } = await this.taskRunner.run(id, tasks, this.asyncTaskManager, abortSignal)\n .catch(err => {\n this.logger.error(\"Failed to execute tasks, returning all as failed for retry:\", err);\n return {\n failedTasks: tasks as CronTask<ID>[],\n newTasks: [] as CronTask<ID>[],\n successTasks: [] as CronTask<ID>[],\n asyncTasks: [] as AsyncTask<ID>[],\n ignoredTasks: [] as CronTask<ID>[],\n flowProjections: [] as EntityTaskProjection[]\n }\n });\n\n if (asyncTasks.length > 0 && !this.asyncTaskManager) {\n throw new Error(\"Async tasks detected but AsyncTaskManager not initialized!\");\n }\n if (asyncTasks.length > 0) {\n this.logger.info(`Handling ${asyncTasks.length} async tasks for stream ${streamName}`);\n for (const asyncTask of asyncTasks) {\n // Get per-task timeout from executor's asyncConfig\n const executor = this.taskQueuesManager.getExecutor(asyncTask.task.queue_id, asyncTask.task.type);\n const taskTimeout = executor?.asyncConfig?.handoffTimeout\n ? executor.asyncConfig.handoffTimeout * 2\n : undefined;\n\n const accepted = this.asyncTaskManager!.handoffTask(asyncTask.task, asyncTask.promise, taskTimeout);\n if (!accepted) {\n this.logger.warn(`Async queue full, requeueing task ${asyncTask.task.id} with 30s delay`);\n await this.addTasks([{\n ...asyncTask.task,\n execute_at: new Date(Date.now() + 30000)\n }]);\n }\n }\n }\n\n if (ignoredTasks.length > 0) {\n this.logger.warn(`Storing ${ignoredTasks.length} ignored tasks with no executor for stream ${streamName}`);\n await this.taskStore.markTasksAsIgnored(ignoredTasks)\n .catch(err => {\n this.logger.error(\"Failed to mark tasks as ignored\", err)\n });\n }\n\n // RFC-002: Sync flow projections from startFlow calls (processing status, task_id = flow_id)\n if (this.entityProjectionProvider && flowProjections?.length > 0) {\n await syncProjections(flowProjections, this.entityProjectionProvider, this.logger);\n }\n\n await this.postProcessTasks({failedTasks, newTasks, successTasks})\n .catch(err => {\n this.logger.error(\"Failed to postProcessTasks\", err)\n throw err;\n })\n\n if (!this.queueStats.has(streamName)) {\n this.queueStats.set(streamName, {\n success: 0,\n failed: 0,\n async: 0,\n ignored: 0\n });\n }\n const stats = this.queueStats.get(streamName)!;\n stats.success += successTasks.length;\n stats.failed += failedTasks.length;\n stats.async += asyncTasks.length;\n stats.ignored += ignoredTasks.length;\n\n await this.reportQueueStats(streamName);\n\n // Update worker stats\n const batchDuration = Date.now() - batchStartTime;\n this.updateWorkerStats(successTasks.length, failedTasks.length, batchDuration);\n\n // Update per-consumer stats\n this.updateConsumerStats(id, successTasks.length, failedTasks.length);\n\n // Emit batch completed\n if (this.workerProvider?.onBatchCompleted) {\n this.emitLifecycleEvent(\n this.workerProvider.onBatchCompleted,\n {\n ...this.buildWorkerInfo(),\n batch_size: tasks.length,\n succeeded: successTasks.length,\n failed: failedTasks.length,\n duration_ms: batchDuration\n }\n );\n }\n\n this.logger.debug(`Completed processing for stream ${streamName}: ${successTasks.length} succeeded, ${failedTasks.length} failed, ${newTasks.length} new tasks, ${ignoredTasks.length} ignored`);\n return {failedTasks, newTasks, successTasks, asyncTasks, ignoredTasks};\n }, abortSignal);\n }\n\n taskProcessServer(abortSignal?: AbortSignal) {\n const queues = getEnabledQueues();\n this.enabledQueues = queues;\n\n // Emit worker started event\n if (!this.workerStarted) {\n this.workerStarted = true;\n this.emitWorkerStarted();\n this.startHeartbeat();\n }\n\n for (let i = 0; i < queues.length; i++) {\n this.logger.info(`Starting consumer for queue: ${queues[i]}`);\n this.startConsumingTasks(queues[i], abortSignal);\n }\n this.logger.info('Starting mature tasks processor');\n this.processMatureTasks(abortSignal);\n\n // Handle worker shutdown\n abortSignal?.addEventListener('abort', () => {\n this.stopHeartbeat();\n this.emitAllConsumersStopped('shutdown');\n this.emitWorkerStopped('shutdown');\n });\n }\n\n private buildWorkerInfo(): WorkerInfo {\n return {\n worker_id: this.workerId,\n hostname: os.hostname(),\n pid: process.pid,\n started_at: this.workerStartedAt,\n enabled_queues: this.enabledQueues\n };\n }\n\n private emitWorkerStarted(): void {\n if (!this.workerProvider?.onWorkerStarted) return;\n this.emitLifecycleEvent(this.workerProvider.onWorkerStarted, this.buildWorkerInfo());\n }\n\n private emitWorkerStopped(reason: 'shutdown' | 'error' | 'idle_timeout'): void {\n if (!this.workerProvider?.onWorkerStopped) return;\n this.emitLifecycleEvent(\n this.workerProvider.onWorkerStopped,\n {\n ...this.buildWorkerInfo(),\n reason,\n final_stats: {...this.workerStats}\n }\n );\n }\n\n private emitWorkerHeartbeat(): void {\n if (!this.workerProvider?.onWorkerHeartbeat) return;\n\n const memUsage = process.memoryUsage();\n this.emitLifecycleEvent(\n this.workerProvider.onWorkerHeartbeat,\n {\n ...this.buildWorkerInfo(),\n stats: {...this.workerStats},\n memory_usage_mb: memUsage.heapUsed / 1024 / 1024,\n active_consumers: this.getActiveConsumerStats()\n }\n );\n }\n\n private startHeartbeat(): void {\n if (this.heartbeatTimer) return;\n\n const intervalMs = this.config.lifecycle?.heartbeat_interval_ms || 5000;\n this.heartbeatTimer = setInterval(() => {\n this.emitWorkerHeartbeat();\n }, intervalMs);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n private updateWorkerStats(succeeded: number, failed: number, processingMs: number): void {\n this.workerStats.tasks_processed += succeeded + failed;\n this.workerStats.tasks_succeeded += succeeded;\n this.workerStats.tasks_failed += failed;\n this.totalProcessingMs += processingMs;\n\n if (this.workerStats.tasks_processed > 0) {\n this.workerStats.avg_processing_ms = this.totalProcessingMs / this.workerStats.tasks_processed;\n }\n }\n\n // ============ Consumer Tracking ============\n\n private registerConsumerIfNew(consumerId: string, queueId: string): void {\n if (this.consumerStatsMap.has(consumerId)) return;\n\n const now = new Date();\n this.consumerStatsMap.set(consumerId, {\n consumer_id: consumerId,\n queue_id: queueId,\n tasks_processed: 0,\n tasks_succeeded: 0,\n tasks_failed: 0,\n started_at: now,\n });\n\n if (this.workerProvider?.onConsumerStarted) {\n this.emitLifecycleEvent(\n this.workerProvider.onConsumerStarted,\n {\n consumer_id: consumerId,\n queue_id: queueId,\n worker_id: this.workerId,\n started_at: now,\n }\n );\n }\n }\n\n private updateConsumerStats(consumerId: string, succeeded: number, failed: number): void {\n const stats = this.consumerStatsMap.get(consumerId);\n if (!stats) return;\n stats.tasks_processed += succeeded + failed;\n stats.tasks_succeeded += succeeded;\n stats.tasks_failed += failed;\n stats.last_task_at = new Date();\n }\n\n private getActiveConsumerStats(): ConsumerStats[] {\n return Array.from(this.consumerStatsMap.values()).map(({started_at, ...stats}) => stats);\n }\n\n private emitAllConsumersStopped(reason: 'shutdown' | 'error' | 'idle_timeout'): void {\n if (!this.workerProvider?.onConsumerStopped) return;\n\n for (const entry of this.consumerStatsMap.values()) {\n const {started_at, ...stats} = entry;\n this.emitLifecycleEvent(\n this.workerProvider.onConsumerStopped,\n {\n consumer_id: entry.consumer_id,\n queue_id: entry.queue_id,\n worker_id: this.workerId,\n started_at,\n reason,\n stats,\n }\n );\n }\n }\n\n private emitLifecycleEvent<T>(\n callback: ((ctx: T) => void | Promise<void>) | undefined,\n ctx: T\n ): void {\n if (!callback) return;\n\n try {\n const result = callback(ctx);\n if (this.config.lifecycle?.mode === 'sync' && result instanceof Promise) {\n result.catch(err => {\n this.logger.error(`[TQ] Lifecycle callback error: ${err}`);\n });\n } else if (result instanceof Promise) {\n result.catch(err => {\n this.logger.error(`[TQ] Lifecycle callback error: ${err}`);\n });\n }\n } catch (err) {\n this.logger.error(`[TQ] Lifecycle callback error: ${err}`);\n }\n }\n\n processMatureTasks(abortSignal?: AbortSignal) {\n const LOCK_ID = 'mature_task_lock_:task_processor';\n\n if (this.matureTaskTimer) clearInterval(this.matureTaskTimer);\n\n if (abortSignal?.aborted) {\n this.logger.info('AbortSignal already aborted, not starting mature task processing');\n return;\n }\n\n this.matureTaskTimer = setInterval(async () => {\n if (abortSignal?.aborted) {\n this.logger.info('AbortSignal detected, stopping mature task processing');\n if (this.matureTaskTimer) clearInterval(this.matureTaskTimer);\n return;\n }\n const lockManager = new LockManager(this.cacheAdapter, {prefix: 'mature_task_lock_:'});\n\n if (await lockManager.isLocked('task_processor')) {\n this.logger.info('Mature task runner locked');\n return;\n }\n\n try {\n const acquired = await lockManager.acquire('task_processor', 20);\n if (!acquired) {\n this.logger.info('Could not acquire lock for mature task processing');\n return;\n }\n\n const matureTasks = await this.taskStore.getMatureTasks(Date.now());\n this.logger.debug(`Found ${matureTasks.length} mature tasks to process`);\n\n // Duplicate pick detection — batch check via mget, batch write via pipeline\n if (matureTasks.length > 0) {\n try {\n const tasksWithIds = matureTasks.filter(t => t.id);\n const dedupKeys = tasksWithIds.map(t => `mature_dedup:${t.id}`);\n\n if (dedupKeys.length > 0) {\n const previousPickers = await this.cacheAdapter.mget(...dedupKeys);\n for (let i = 0; i < dedupKeys.length; i++) {\n if (previousPickers[i]) {\n const task = tasksWithIds[i];\n this.logger.warn(`DUPLICATE_MATURE_PICK: task ${task.id} (${task.type}) already picked by ${previousPickers[i]}`);\n }\n }\n\n const pipeline = this.cacheAdapter.pipeline();\n for (const key of dedupKeys) {\n pipeline.set(key, INSTANCE_ID, 120);\n }\n await pipeline.exec();\n }\n } catch (err) {\n this.logger.warn(`Duplicate pick detection failed (best-effort): ${err}`);\n }\n }\n\n await this.addTasks(matureTasks);\n } catch (error) {\n this.logger.error(`Error processing tasks: ${error}`);\n } finally {\n await lockManager.release('task_processor');\n }\n\n }, 5000);\n\n // Clean up interval when aborted\n abortSignal?.addEventListener('abort', () => {\n this.logger.info('AbortSignal received, cleaning up mature task timer and sending final stats');\n if (this.matureTaskTimer) {\n clearInterval(this.matureTaskTimer);\n this.matureTaskTimer = null;\n }\n this.sendFinalStats()\n .catch(err => {\n this.logger.error(`Failed to send final stats during shutdown: ${err}`);\n });\n });\n }\n\n private buildTaskContext(task: CronTask<ID>): TaskContext {\n const maxRetries = this.getRetryCount(task);\n const retryCount = (task.execution_stats && typeof task.execution_stats.retry_count === 'number')\n ? task.execution_stats.retry_count\n : 0;\n const payload = task.payload as Record<string, unknown>;\n\n return {\n task_id: task.id?.toString() || '',\n task_hash: payload?.task_hash as string | undefined,\n task_type: task.type,\n queue_id: task.queue_id,\n payload: this.config.lifecycle?.include_payload ? payload : {},\n attempt: retryCount + 1,\n max_retries: maxRetries,\n scheduled_at: task.created_at || new Date(),\n worker_id: this.workerId,\n log_context: task.metadata?.log_context,\n };\n }\n\n processBatch(queueId: QueueName, processor: MessageConsumer<ID>, limit?: number, abortSignal?: AbortSignal): Promise<void> {\n if (abortSignal?.aborted) {\n this.logger.info(`AbortSignal already aborted, skipping batch processing for queue ${queueId}`);\n return Promise.resolve();\n }\n return this.messageQueue.consumeMessagesBatch(queueId, processor, limit);\n }\n\n private async trackDiscardedTasks(count: number) {\n try {\n const now = moment.utc();\n const hourKey = `${DISCARDED_TASKS_KEY}:${now.format('YYYY-MM-DD-HH')}`;\n\n if (!this.cacheAdapter) throw new Error('Cache adapter not initialized');\n const currentHourCountStr = await this.cacheAdapter.get(hourKey) || '0';\n const currentHourCount = parseInt(currentHourCountStr, 10);\n const newCount = currentHourCount + count;\n\n await this.cacheAdapter.set(hourKey, newCount.toString(), 25 * 3600);\n\n let total = 0;\n try {\n if (Math.random() < 0.1) {\n for (let i = 0; i < 24; i++) {\n const hourOffset = moment.utc().subtract(i, 'hours');\n const pastHourKey = `${DISCARDED_TASKS_KEY}:${hourOffset.format('YYYY-MM-DD-HH')}`;\n const pastHourCountStr = await this.cacheAdapter.get(pastHourKey) || '0';\n total += parseInt(pastHourCountStr, 10);\n }\n this.logger.info(`Added ${count} discarded tasks to metrics. Last 24h total: ${total}`);\n } else {\n this.logger.info(`Added ${count} discarded tasks to current hour metrics.`);\n }\n\n // Notify provider if available\n if (this.notificationProvider?.onTasksDiscarded) {\n const discardedInfo: DiscardedTaskInfo = {count, last24HourTotal: total > 0 ? total : undefined};\n try {\n await this.notificationProvider.onTasksDiscarded(discardedInfo);\n } catch (err) {\n this.logger.error(`Notification provider error for discarded tasks: ${err}`);\n }\n }\n } catch (error) {\n this.logger.info(`Added ${count} discarded tasks to current hour metrics.`);\n\n // Still notify provider about the count even if metrics failed\n if (this.notificationProvider?.onTasksDiscarded) {\n const discardedInfo: DiscardedTaskInfo = {count};\n try {\n await this.notificationProvider.onTasksDiscarded(discardedInfo);\n } catch (err) {\n this.logger.error(`Notification provider error for discarded tasks: ${err}`);\n }\n }\n }\n } catch (error) {\n this.logger.error(`Failed to track discarded tasks: ${error}`);\n\n // Try to notify provider about the error\n if (this.notificationProvider?.onTaskError) {\n const errorInfo: TaskErrorInfo = {\n error: `Failed to track discarded tasks: ${error}`,\n context: 'trackDiscardedTasks'\n };\n this.notificationProvider.onTaskError(errorInfo).catch(() => {\n // Ignore notification errors to prevent infinite loops\n });\n }\n }\n }\n\n private getRetryCount(task: CronTask<ID>): number {\n if (typeof task.retries === 'number') return task.retries;\n const executor = this.taskQueuesManager.getExecutor(task.queue_id, task.type);\n return executor?.default_retries ?? 0;\n }\n\n private async reportQueueStats(queueName: QueueName, forceSend: boolean = false): Promise<void> {\n const stats = this.queueStats.get(queueName);\n if (!stats) return;\n\n const total = stats.success + stats.failed + stats.async + stats.ignored;\n if (total === 0) return;\n\n if (!forceSend && total < STATS_THRESHOLD && stats.failed < FAILURE_THRESHOLD) return;\n\n try {\n if (this.notificationProvider?.onQueueStats) {\n const queueStats: TaskQueueStats = {\n queueName,\n success: stats.success,\n failed: stats.failed,\n async: stats.async,\n ignored: stats.ignored,\n instanceId: INSTANCE_ID\n };\n await this.notificationProvider.onQueueStats(queueStats);\n }\n this.logger.info(`Sent stats for ${queueName}`);\n } catch (err) {\n this.logger.error(`Failed to send stats: ${err}`);\n }\n\n if (!forceSend) {\n stats.success = 0;\n stats.failed = 0;\n stats.async = 0;\n stats.ignored = 0;\n }\n }\n\n private async sendFinalStats(): Promise<void> {\n for (const queueName of this.queueStats.keys()) {\n await this.reportQueueStats(queueName, true);\n }\n\n if (this.queueStats.size === 0) {\n try {\n if (this.notificationProvider?.onFinalStats) {\n await this.notificationProvider.onFinalStats([]);\n }\n this.logger.info('Sent final TQ stats (no tasks)');\n } catch (err) {\n this.logger.error(`Failed to send final stats: ${err}`);\n }\n }\n }\n}","import {getEnvironmentQueueName, IMessageQueue, MessageType, QueueName} from \"@supergrowthai/mq\";\nimport {TaskExecutor} from \"./base/interfaces\";\nimport {Logger, LogLevel} from \"@supergrowthai/utils\";\n\nconst logger = new Logger('TaskQueuesManager', LogLevel.INFO);\n\nclass TaskQueuesManager<ID> {\n queueTaskExecutorMap: Map<QueueName, Map<MessageType, TaskExecutor<ID>>> = new Map();\n\n constructor(private messageQueue: IMessageQueue<ID>) {\n }\n\n /**\n * Registers a task executor with a message queue and queue name\n * @param queueName The name of the queue\n * @param taskType The type of task\n * @param executor The executor for the task\n */\n register<T extends MessageType>(queueName: QueueName, taskType: T, executor: TaskExecutor<ID, T>): void {\n queueName = getEnvironmentQueueName(queueName)\n // Ensure the queue is registered with the message queue\n this.messageQueue.register(queueName);\n\n // Initialize the map for this queue if it doesn't exist\n if (!this.queueTaskExecutorMap.has(queueName)) {\n this.queueTaskExecutorMap.set(queueName, new Map());\n }\n\n // Register the executor for this task type\n const queueMap = this.queueTaskExecutorMap.get(queueName)!;\n queueMap.set(taskType, executor);\n\n logger.info(`Registered task executor for ${taskType} on queue ${queueName}`);\n }\n\n /**\n * Gets the task executor for a specific queue and task type\n * @param queueName The name of the queue\n * @param taskType The type of task\n * @returns The executor for the task\n */\n getExecutor<T extends MessageType>(queueName: QueueName, taskType: T): TaskExecutor<ID, T> | undefined {\n queueName = getEnvironmentQueueName(queueName)\n const queueMap = this.queueTaskExecutorMap.get(queueName);\n if (!queueMap) {\n return undefined;\n }\n return queueMap.get(taskType);\n }\n\n /**\n * Gets all registered queues\n * @returns Array of queue names\n */\n getQueues(): QueueName[] {\n return Array.from(this.queueTaskExecutorMap.keys());\n }\n\n /**\n * Gets all task types for a specific queue\n * @param queueName The name of the queue\n * @returns Array of task types\n */\n getTaskTypesForQueue(queueName: QueueName): MessageType[] {\n queueName = getEnvironmentQueueName(queueName)\n const queueMap = this.queueTaskExecutorMap.get(queueName);\n if (!queueMap) {\n return [];\n }\n return Array.from(queueMap.keys());\n }\n}\n\nexport {TaskQueuesManager}","/**\n * RFC-002: In-Memory Flow Barrier Provider\n *\n * Map-based implementation matching Redis Lua HSETNX dedup semantics.\n * Used for testing; production uses RedisFlowBarrierProvider.\n */\n\nimport type {FlowStepResult} from \"./types.js\";\nimport type {BarrierDecrementResult, IFlowBarrierProvider} from \"./IFlowBarrierProvider.js\";\n\ninterface FlowBarrierState {\n remaining: number;\n status: 'active' | 'aborted' | 'complete';\n results: Map<number, FlowStepResult>;\n started_at: Date;\n}\n\nexport class InMemoryFlowBarrierProvider implements IFlowBarrierProvider {\n private readonly barriers = new Map<string, FlowBarrierState>();\n\n async initBarrier(flowId: string, totalSteps: number): Promise<void> {\n // Idempotent: no-op if barrier already exists (matches Redis SETNX semantics)\n if (this.barriers.has(flowId)) return;\n this.barriers.set(flowId, {\n remaining: totalSteps,\n status: 'active',\n results: new Map(),\n started_at: new Date(),\n });\n }\n\n async batchDecrementAndCheck(flowId: string, results: FlowStepResult[]): Promise<BarrierDecrementResult> {\n const state = this.barriers.get(flowId);\n if (!state) {\n return {remaining: -1};\n }\n\n // If already aborted or complete, late arrivals get -1\n if (state.status === 'aborted' || state.status === 'complete') {\n return {remaining: -1};\n }\n\n // HSETNX semantics: only count genuinely new step indices\n let actualNew = 0;\n for (const result of results) {\n if (!state.results.has(result.step_index)) {\n state.results.set(result.step_index, result);\n actualNew++;\n }\n }\n\n state.remaining -= actualNew;\n\n if (state.remaining <= 0) {\n state.remaining = 0;\n state.status = 'complete';\n }\n\n return {remaining: state.remaining};\n }\n\n async getStepResults(flowId: string): Promise<FlowStepResult[]> {\n const state = this.barriers.get(flowId);\n if (!state) return [];\n return Array.from(state.results.values()).sort((a, b) => a.step_index - b.step_index);\n }\n\n async markAborted(flowId: string): Promise<boolean> {\n const state = this.barriers.get(flowId);\n if (!state) return false;\n\n if (state.status === 'aborted') {\n return false; // Already aborted\n }\n\n state.status = 'aborted';\n return true;\n }\n\n async isComplete(flowId: string): Promise<boolean> {\n const state = this.barriers.get(flowId);\n if (!state) return false;\n return state.status === 'complete';\n }\n\n async getStartedAt(flowId: string): Promise<Date | null> {\n const state = this.barriers.get(flowId);\n if (!state) return null;\n return state.started_at;\n }\n}\n","/**\n * Console Health Provider - Reference Implementation\n *\n * A simple health provider that logs all lifecycle events to console.\n * This can be used as a starting point for custom health providers.\n *\n * Usage:\n * ```typescript\n * import { ConsoleHealthProvider } from '@supergrowthai/tq/providers';\n *\n * const healthProvider = new ConsoleHealthProvider();\n *\n * const taskHandler = new TaskHandler(\n * messageQueue,\n * taskQueuesManager,\n * databaseAdapter,\n * cacheProvider,\n * asyncTaskManager,\n * notificationProvider,\n * {\n * lifecycleProvider: healthProvider,\n * workerProvider: healthProvider,\n * lifecycle: {\n * mode: 'async',\n * heartbeat_interval_ms: 5000\n * }\n * }\n * );\n * ```\n */\n\nimport type {\n ITaskLifecycleProvider,\n IWorkerLifecycleProvider,\n IFlowLifecycleProvider,\n FlowContext,\n TaskContext,\n TaskTiming,\n WorkerInfo,\n WorkerStats,\n ConsumerInfo,\n ConsumerStats\n} from \"../core/lifecycle.js\";\n\nexport class ConsoleHealthProvider implements ITaskLifecycleProvider, IWorkerLifecycleProvider, IFlowLifecycleProvider {\n private readonly prefix: string;\n\n constructor(prefix: string = '[Health]') {\n this.prefix = prefix;\n }\n\n // ============ Task Lifecycle ============\n\n onTaskScheduled(ctx: TaskContext): void {\n console.log(`${this.prefix} Task scheduled: ${ctx.task_type} (${ctx.task_id}) in queue ${ctx.queue_id}`);\n }\n\n onTaskStarted(ctx: TaskContext & { started_at: Date; queued_duration_ms: number }): void {\n console.log(`${this.prefix} Task started: ${ctx.task_type} (${ctx.task_id}) - queued for ${ctx.queued_duration_ms}ms`);\n }\n\n onTaskCompleted(ctx: TaskContext & { timing: TaskTiming; result?: unknown }): void {\n console.log(\n `${this.prefix} Task completed: ${ctx.task_type} (${ctx.task_id}) - ` +\n `processing: ${ctx.timing.processing_duration_ms}ms, total: ${ctx.timing.total_duration_ms}ms`\n );\n }\n\n onTaskFailed(ctx: TaskContext & {\n timing: TaskTiming;\n error: Error;\n will_retry: boolean;\n next_attempt_at?: Date\n }): void {\n console.log(\n `${this.prefix} Task failed: ${ctx.task_type} (${ctx.task_id}) - ` +\n `error: ${ctx.error.message}, will_retry: ${ctx.will_retry}`\n );\n }\n\n onTaskExhausted(ctx: TaskContext & { timing: TaskTiming; error: Error; total_attempts: number }): void {\n console.log(\n `${this.prefix} Task exhausted: ${ctx.task_type} (${ctx.task_id}) - ` +\n `total attempts: ${ctx.total_attempts}, error: ${ctx.error.message}`\n );\n }\n\n onTaskCancelled(ctx: TaskContext & { reason: string }): void {\n console.log(`${this.prefix} Task cancelled: ${ctx.task_type} (${ctx.task_id}) - reason: ${ctx.reason}`);\n }\n\n // ============ Worker Lifecycle ============\n\n onWorkerStarted(info: WorkerInfo): void {\n console.log(\n `${this.prefix} Worker started: ${info.worker_id} on ${info.hostname} (PID: ${info.pid}) - ` +\n `queues: [${info.enabled_queues.join(', ')}]`\n );\n }\n\n onWorkerHeartbeat(info: WorkerInfo & { stats: WorkerStats; memory_usage_mb: number; active_consumers: ConsumerStats[] }): void {\n console.log(\n `${this.prefix} Worker heartbeat: ${info.worker_id} - ` +\n `processed: ${info.stats.tasks_processed}, success: ${info.stats.tasks_succeeded}, ` +\n `failed: ${info.stats.tasks_failed}, avg: ${info.stats.avg_processing_ms.toFixed(2)}ms, ` +\n `memory: ${info.memory_usage_mb.toFixed(2)}MB, consumers: ${info.active_consumers.length}`\n );\n }\n\n onWorkerStopped(info: WorkerInfo & {\n reason: 'shutdown' | 'error' | 'idle_timeout';\n final_stats: WorkerStats\n }): void {\n console.log(\n `${this.prefix} Worker stopped: ${info.worker_id} - reason: ${info.reason} - ` +\n `final stats: ${info.final_stats.tasks_processed} processed, ` +\n `${info.final_stats.tasks_succeeded} succeeded, ${info.final_stats.tasks_failed} failed`\n );\n }\n\n onBatchStarted(info: WorkerInfo & { batch_size: number; task_types: string[] }): void {\n console.log(\n `${this.prefix} Batch started: ${info.batch_size} tasks - types: [${info.task_types.join(', ')}]`\n );\n }\n\n onBatchCompleted(info: WorkerInfo & {\n batch_size: number;\n succeeded: number;\n failed: number;\n duration_ms: number\n }): void {\n console.log(\n `${this.prefix} Batch completed: ${info.batch_size} tasks in ${info.duration_ms}ms - ` +\n `succeeded: ${info.succeeded}, failed: ${info.failed}`\n );\n }\n\n // ============ Consumer Lifecycle ============\n\n onConsumerStarted(info: ConsumerInfo): void {\n console.log(\n `${this.prefix} Consumer started: ${info.consumer_id} on worker ${info.worker_id} - queue: ${info.queue_id}`\n );\n }\n\n onConsumerStopped(info: ConsumerInfo & { reason: string; stats: ConsumerStats }): void {\n console.log(\n `${this.prefix} Consumer stopped: ${info.consumer_id} on worker ${info.worker_id} - ` +\n `reason: ${info.reason}, processed: ${info.stats.tasks_processed}, ` +\n `succeeded: ${info.stats.tasks_succeeded}, failed: ${info.stats.tasks_failed}`\n );\n }\n\n // ============ Task Batch Lifecycle ============\n\n onTaskBatchStarted(ctx: {\n task_type: string;\n queue_id: string;\n tasks: TaskContext[];\n worker_id: string;\n started_at: Date;\n }): void {\n console.log(\n `${this.prefix} Task batch started: ${ctx.task_type} - ${ctx.tasks.length} tasks in queue ${ctx.queue_id}`\n );\n }\n\n onTaskBatchCompleted(ctx: {\n task_type: string;\n queue_id: string;\n tasks: TaskContext[];\n worker_id: string;\n succeeded: string[];\n failed: string[];\n duration_ms: number;\n }): void {\n console.log(\n `${this.prefix} Task batch completed: ${ctx.task_type} in ${ctx.duration_ms}ms - ` +\n `succeeded: ${ctx.succeeded.length}, failed: ${ctx.failed.length}`\n );\n }\n\n // ============ Flow Lifecycle ============\n\n onFlowStarted(ctx: FlowContext & { started_at: Date; step_types: string[] }): void {\n console.log(\n `${this.prefix} Flow started: ${ctx.flow_id} - ${ctx.total_steps} steps [${ctx.step_types.join(', ')}], ` +\n `join: ${ctx.join.type}, policy: ${ctx.failure_policy}`\n );\n }\n\n onFlowCompleted(ctx: FlowContext & { duration_ms: number; steps_succeeded: number; steps_failed: number }): void {\n console.log(\n `${this.prefix} Flow completed: ${ctx.flow_id} in ${ctx.duration_ms}ms - ` +\n `succeeded: ${ctx.steps_succeeded}, failed: ${ctx.steps_failed}`\n );\n }\n\n onFlowAborted(ctx: FlowContext & { duration_ms: number; steps_completed: number; trigger_step_index: number }): void {\n console.log(\n `${this.prefix} Flow aborted: ${ctx.flow_id} in ${ctx.duration_ms}ms - ` +\n `steps completed: ${ctx.steps_completed}, trigger: step ${ctx.trigger_step_index}`\n );\n }\n\n onFlowTimedOut(ctx: FlowContext & { duration_ms: number; steps_completed: number }): void {\n console.log(\n `${this.prefix} Flow timed out: ${ctx.flow_id} in ${ctx.duration_ms}ms - ` +\n `steps completed: ${ctx.steps_completed}`\n );\n }\n}\n"],"names":["global","require$$0","Symbol","require$$1","require$$2","require$$3","chunk","result","stepResults"],"mappings":"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","x_google_ignoreList":[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]}
|