@nmakarov/cli-toolkit 0.49.0 → 0.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1081,6 +1081,8 @@ __export(src_exports, {
1081
1081
  FooterPresets: () => FooterPresets,
1082
1082
  GridCell: () => GridCell,
1083
1083
  InputField: () => InputField,
1084
+ LOGGER_RUNTIME_KEYS: () => LOGGER_RUNTIME_KEYS,
1085
+ LOOP_RUNTIME_KEYS: () => LOOP_RUNTIME_KEYS,
1084
1086
  ListComponent: () => ListComponent,
1085
1087
  ListItem: () => ListItem,
1086
1088
  MultiColumnListComponent: () => MultiColumnListComponent,
@@ -1099,6 +1101,7 @@ __export(src_exports, {
1099
1101
  TaskGetLogs: () => TaskGetLogs,
1100
1102
  TaskPing: () => TaskPing,
1101
1103
  TaskSampleProcess: () => TaskSampleProcess,
1104
+ TaskSetRuntimeParam: () => TaskSetRuntimeParam,
1102
1105
  TaskShellCommand: () => TaskShellCommand,
1103
1106
  TaskStopRunner: () => TaskStopRunner,
1104
1107
  TaskSumAB: () => TaskSumAB,
@@ -1110,12 +1113,16 @@ __export(src_exports, {
1110
1113
  activateRelease: () => activateRelease,
1111
1114
  appendDeployLog: () => appendDeployLog,
1112
1115
  appendTaskIpcLog: () => appendTaskIpcLog,
1116
+ applyRuntimeParam: () => applyRuntimeParam,
1117
+ applyRuntimePatch: () => applyRuntimePatch,
1113
1118
  bootstrapHost: () => bootstrapHost,
1114
1119
  buildBreadcrumb: () => buildBreadcrumb,
1115
1120
  buildDetailBreadcrumb: () => buildDetailBreadcrumb,
1116
1121
  buildFooter: () => buildFooter,
1117
1122
  bumpPatchVersion: () => bumpPatchVersion,
1118
1123
  cloneRepo: () => cloneRepo,
1124
+ coerceRuntimeValue: () => coerceRuntimeValue,
1125
+ controlLaneTaskNames: () => controlLaneTaskNames,
1119
1126
  convertPattern: () => convertPattern,
1120
1127
  createRelease: () => createRelease,
1121
1128
  defaultFileSynopsisFunction: () => defaultFileSynopsisFunction,
@@ -1137,6 +1144,7 @@ __export(src_exports, {
1137
1144
  ensureSchemaEverywhere: () => ensureSchemaEverywhere,
1138
1145
  ensureTable: () => ensureTable,
1139
1146
  ensureTaskTables: () => ensureTaskTables,
1147
+ ensureTasksRuntime: () => ensureTasksRuntime,
1140
1148
  flushTaskIpcLogs: () => flushTaskIpcLogs,
1141
1149
  getArgsInstance: () => getArgsInstance,
1142
1150
  h: () => import_react5.createElement,
@@ -1168,6 +1176,7 @@ __export(src_exports, {
1168
1176
  pullRepo: () => pullRepo,
1169
1177
  queueToTableNames: () => queueToTableNames,
1170
1178
  readCurrentRelease: () => readCurrentRelease,
1179
+ readLoopRuntime: () => readLoopRuntime,
1171
1180
  readReleaseBuildInfo: () => readReleaseBuildInfo,
1172
1181
  readTaskIpcLogsSnapshot: () => readTaskIpcLogsSnapshot,
1173
1182
  registerInServicesRegistry: () => registerInServicesRegistry,
@@ -7944,6 +7953,273 @@ var TaskGetLogs = class extends AbstractTask {
7944
7953
  }
7945
7954
  };
7946
7955
 
7956
+ // src/tasks/runtimeParams.js
7957
+ var LOOP_RUNTIME_KEYS = ["maxParallel", "pollMs", "claimJitterMs", "scanLimit"];
7958
+ var LOGGER_RUNTIME_KEYS = [
7959
+ "levels",
7960
+ "silent",
7961
+ "showLevel",
7962
+ "timestamp",
7963
+ "mode",
7964
+ "route",
7965
+ "prefix",
7966
+ "progressWithTimes",
7967
+ "progressThrottleMs"
7968
+ ];
7969
+ var CONTROL_LANE_TASK_NAMES = ["stopRunner", "stop", "setRuntimeParam", "setRunnerParam"];
7970
+ function controlLaneTaskNames() {
7971
+ return [...CONTROL_LANE_TASK_NAMES];
7972
+ }
7973
+ function asPositiveInt(value, key, { min = 1 } = {}) {
7974
+ const n = Number(value);
7975
+ if (!Number.isFinite(n) || n < min) {
7976
+ throw new ParamError(
7977
+ `setRuntimeParam: ${key} must be a number >= ${min} (got ${JSON.stringify(value)})`
7978
+ );
7979
+ }
7980
+ return Math.floor(n);
7981
+ }
7982
+ function coerceRuntimeValue(key, value) {
7983
+ switch (key) {
7984
+ case "maxParallel":
7985
+ return asPositiveInt(value, key, { min: 1 });
7986
+ case "pollMs":
7987
+ return asPositiveInt(value, key, { min: 50 });
7988
+ case "claimJitterMs":
7989
+ return asPositiveInt(value, key, { min: 0 });
7990
+ case "scanLimit":
7991
+ return asPositiveInt(value, key, { min: 1 });
7992
+ case "silent":
7993
+ case "showLevel":
7994
+ case "timestamp":
7995
+ case "progressWithTimes":
7996
+ if (typeof value === "boolean") return value;
7997
+ if (value === "true" || value === "1") return true;
7998
+ if (value === "false" || value === "0") return false;
7999
+ throw new ParamError(
8000
+ `setRuntimeParam: ${key} must be boolean (got ${JSON.stringify(value)})`
8001
+ );
8002
+ case "progressThrottleMs":
8003
+ return asPositiveInt(value, key, { min: 0 });
8004
+ case "levels":
8005
+ case "mode":
8006
+ case "route":
8007
+ case "prefix":
8008
+ return value;
8009
+ default:
8010
+ return value;
8011
+ }
8012
+ }
8013
+ function ensureTasksRuntime(context, seed = {}) {
8014
+ if (!context.tasksRuntime || typeof context.tasksRuntime !== "object") {
8015
+ context.tasksRuntime = {};
8016
+ }
8017
+ const rt = context.tasksRuntime;
8018
+ if (rt.maxParallel === void 0) rt.maxParallel = seed.maxParallel ?? 32;
8019
+ if (rt.pollMs === void 0) rt.pollMs = seed.pollMs ?? 1e3;
8020
+ if (rt.claimJitterMs === void 0) rt.claimJitterMs = seed.claimJitterMs ?? 0;
8021
+ if (rt.scanLimit === void 0) rt.scanLimit = seed.scanLimit ?? 100;
8022
+ return rt;
8023
+ }
8024
+ async function applyRuntimeParam(context, key, value) {
8025
+ const k = String(key ?? "").trim();
8026
+ if (!k) throw new ParamError("setRuntimeParam: key is required");
8027
+ const runtime = ensureTasksRuntime(context);
8028
+ const next = coerceRuntimeValue(k, value);
8029
+ const previous = runtime[k];
8030
+ const applied = [];
8031
+ runtime[k] = next;
8032
+ applied.push("tasksRuntime");
8033
+ if (LOGGER_RUNTIME_KEYS.includes(k) && context.logger?.configure) {
8034
+ context.logger.configure({ [k]: next });
8035
+ applied.push("logger");
8036
+ }
8037
+ const hook = context.tasksRuntimeOnParam;
8038
+ if (typeof hook === "function") {
8039
+ await hook(k, next, runtime, context);
8040
+ applied.push("onRuntimeParam");
8041
+ }
8042
+ const reg = context.servicesRegistry;
8043
+ if (reg?.rowId && reg?.registryTable) {
8044
+ try {
8045
+ const loopSnapshot = {};
8046
+ for (const lk of LOOP_RUNTIME_KEYS) {
8047
+ if (runtime[lk] !== void 0) loopSnapshot[lk] = runtime[lk];
8048
+ }
8049
+ await updateServicesRegistryMetadata(context, reg, {
8050
+ runtime: loopSnapshot,
8051
+ runtimeUpdatedAt: (/* @__PURE__ */ new Date()).toISOString()
8052
+ });
8053
+ applied.push("servicesRegistry");
8054
+ } catch (err) {
8055
+ context.logger?.warn?.(
8056
+ `[setRuntimeParam] registry metadata update failed: ${err?.message ?? String(err)}`
8057
+ );
8058
+ }
8059
+ }
8060
+ return { key: k, previous, next, applied };
8061
+ }
8062
+ async function applyRuntimePatch(context, patch) {
8063
+ if (!patch || typeof patch !== "object" || Array.isArray(patch)) {
8064
+ throw new ParamError("setRuntimeParam: patch must be a plain object");
8065
+ }
8066
+ const entries = Object.entries(patch);
8067
+ if (entries.length === 0) {
8068
+ throw new ParamError("setRuntimeParam: patch is empty");
8069
+ }
8070
+ const out = [];
8071
+ for (const [key, value] of entries) {
8072
+ out.push(await applyRuntimeParam(context, key, value));
8073
+ }
8074
+ return out;
8075
+ }
8076
+ function readLoopRuntime(context) {
8077
+ const rt = ensureTasksRuntime(context);
8078
+ return {
8079
+ maxParallel: Math.max(1, Number(rt.maxParallel) || 1),
8080
+ pollMs: Math.max(50, Number(rt.pollMs) || 1e3),
8081
+ claimJitterMs: Math.max(0, Number(rt.claimJitterMs) || 0),
8082
+ scanLimit: Math.max(1, Number(rt.scanLimit) || 100)
8083
+ };
8084
+ }
8085
+
8086
+ // src/tasks/coreTasks/TaskSetRuntimeParam.js
8087
+ var TaskSetRuntimeParam = class extends AbstractTask {
8088
+ static defaultWaitForResult = true;
8089
+ /**
8090
+ * @param {object} context
8091
+ * @param {Record<string, unknown>} [overrides]
8092
+ * @returns {Promise<object>}
8093
+ */
8094
+ static async resolveParams(context, overrides = {}) {
8095
+ const main = await super.resolveParams(context, overrides);
8096
+ if (!main.serviceName && !main.serviceGroup) {
8097
+ throw new ParamError(
8098
+ "setRuntimeParam requires --serviceName (one instance) or --serviceGroup (broadcast to alive instances)"
8099
+ );
8100
+ }
8101
+ return main;
8102
+ }
8103
+ /**
8104
+ * @param {object} context
8105
+ * @param {Record<string, unknown>} [overrides]
8106
+ * @returns {Promise<{ key?: string, value?: unknown, patch?: Record<string, unknown> }>}
8107
+ */
8108
+ static async resolveCustomParams(context, overrides = {}) {
8109
+ const merged = AbstractTask._mergeTypedParams(
8110
+ context,
8111
+ "task-set-runtime-param",
8112
+ {
8113
+ paramKey: "string",
8114
+ paramValue: "string",
8115
+ key: "string",
8116
+ value: "string"
8117
+ },
8118
+ overrides
8119
+ );
8120
+ if (merged.patch && typeof merged.patch === "object" && !Array.isArray(merged.patch)) {
8121
+ if (Object.keys(merged.patch).length === 0) {
8122
+ throw new ParamError("setRuntimeParam: patch is empty");
8123
+ }
8124
+ return { patch: { ...merged.patch } };
8125
+ }
8126
+ const key = merged.paramKey || merged.key;
8127
+ const value = merged.paramValue !== void 0 ? merged.paramValue : merged.value;
8128
+ if (!key) {
8129
+ throw new ParamError(
8130
+ `setRuntimeParam requires --paramKey/--paramValue, or --paramsJson '{"key":"maxParallel","value":16}' / '{"patch":{...}}'`
8131
+ );
8132
+ }
8133
+ let parsed = value;
8134
+ if (typeof value === "string") {
8135
+ const t = value.trim();
8136
+ if (t === "true") parsed = true;
8137
+ else if (t === "false") parsed = false;
8138
+ else if (t !== "" && !Number.isNaN(Number(t)) && /^-?\d+(\.\d+)?$/.test(t)) {
8139
+ parsed = Number(t);
8140
+ } else if (t.startsWith("{") && t.endsWith("}") || t.startsWith("[") && t.endsWith("]") || t.startsWith('"') && t.endsWith('"')) {
8141
+ try {
8142
+ parsed = JSON.parse(t);
8143
+ } catch {
8144
+ parsed = value;
8145
+ }
8146
+ }
8147
+ }
8148
+ return { key: String(key), value: parsed };
8149
+ }
8150
+ /**
8151
+ * Enqueue one or many setRuntimeParam tasks. Prefer this over a bare
8152
+ * `enqueueTask` when broadcasting to a service group.
8153
+ *
8154
+ * @param {object} context
8155
+ * @param {Record<string, unknown>} [overrides]
8156
+ * @returns {Promise<{ ids: string[], targets: string[] }>}
8157
+ */
8158
+ static async enqueue(context, overrides = {}) {
8159
+ const payload = await this.resolveParams(context, { ...overrides, name: "setRuntimeParam" });
8160
+ const queueName = payload.queueName ?? "tasks";
8161
+ if (payload.serviceName) {
8162
+ const id = await enqueueTask(context, payload);
8163
+ return { ids: [id], targets: [payload.serviceName] };
8164
+ }
8165
+ const group = String(payload.serviceGroup || "").trim();
8166
+ if (!group) {
8167
+ throw new ParamError("setRuntimeParam.enqueue: serviceGroup required for broadcast");
8168
+ }
8169
+ const alive = await listServicesRegistry(context, {
8170
+ queueName,
8171
+ serviceGroup: group,
8172
+ staleMs: overrides.staleMs ?? 45e3
8173
+ });
8174
+ if (!alive.length) {
8175
+ throw new ParamError(
8176
+ `setRuntimeParam: no alive services in group="${group}" queue="${queueName}"`
8177
+ );
8178
+ }
8179
+ const ids = [];
8180
+ const targets = [];
8181
+ for (const reg of alive) {
8182
+ const id = await enqueueTask(context, {
8183
+ ...payload,
8184
+ serviceGroup: group,
8185
+ serviceName: reg.service_name,
8186
+ serverName: reg.server_name ?? null,
8187
+ instanceNumber: reg.instance_number ?? null
8188
+ });
8189
+ ids.push(id);
8190
+ targets.push(reg.service_name);
8191
+ }
8192
+ context.logger?.info?.(
8193
+ `[setRuntimeParam] broadcast to ${targets.length} instance(s) in group=${group}: ${targets.join(", ")}`
8194
+ );
8195
+ return { ids, targets };
8196
+ }
8197
+ /**
8198
+ * @returns {Promise<{ success: true, results: object }>}
8199
+ */
8200
+ async run() {
8201
+ const params = this.task?.params ?? {};
8202
+ let changes;
8203
+ if (params.patch && typeof params.patch === "object") {
8204
+ changes = await applyRuntimePatch(this.context, params.patch);
8205
+ } else {
8206
+ changes = [await applyRuntimeParam(this.context, params.key, params.value)];
8207
+ }
8208
+ const summary = changes.map((c) => `${c.key}: ${JSON.stringify(c.previous)} \u2192 ${JSON.stringify(c.next)}`);
8209
+ this.context.logger.warn?.(
8210
+ `[TaskSetRuntimeParam] applied on ${this.context.servicesRegistry?.serviceName ?? "runner"}: ${summary.join("; ")}`
8211
+ );
8212
+ return {
8213
+ success: true,
8214
+ results: {
8215
+ runtimeParamApplied: true,
8216
+ changes,
8217
+ runtime: { ...this.context.tasksRuntime ?? {} }
8218
+ }
8219
+ };
8220
+ }
8221
+ };
8222
+
7947
8223
  // src/tasks/TasksRegistry.js
7948
8224
  var TasksRegistry = class _TasksRegistry {
7949
8225
  /**
@@ -7962,7 +8238,7 @@ var TasksRegistry = class _TasksRegistry {
7962
8238
  * @returns {TasksRegistry}
7963
8239
  */
7964
8240
  static withCoreTasks() {
7965
- return new _TasksRegistry().add("ping", TaskPing).add("sampleProcess", TaskSampleProcess).add("shellCommand", TaskShellCommand).add("systemInfo", TaskSystemInfo).add("info", TaskSystemInfo).add("taskSumAB", TaskSumAB).add("stopRunner", TaskStopRunner).add("stop", TaskStopRunner).add("getLogs", TaskGetLogs);
8241
+ return new _TasksRegistry().add("ping", TaskPing).add("sampleProcess", TaskSampleProcess).add("shellCommand", TaskShellCommand).add("systemInfo", TaskSystemInfo).add("info", TaskSystemInfo).add("taskSumAB", TaskSumAB).add("stopRunner", TaskStopRunner).add("stop", TaskStopRunner).add("getLogs", TaskGetLogs).add("setRuntimeParam", TaskSetRuntimeParam).add("setRunnerParam", TaskSetRuntimeParam);
7966
8242
  }
7967
8243
  /**
7968
8244
  * Register a single task class under a name. Overwrites any previous entry.
@@ -8068,7 +8344,9 @@ var SERVICE_TASK_NAMES = [
8068
8344
  "shellCommand",
8069
8345
  "systemInfo",
8070
8346
  "info",
8071
- "getLogs"
8347
+ "getLogs",
8348
+ "setRuntimeParam",
8349
+ "setRunnerParam"
8072
8350
  ];
8073
8351
  function normalizeAllowedTasks(value) {
8074
8352
  if (!value) return void 0;
@@ -8495,18 +8773,23 @@ async function claimNextRunnableTask(context, tasksTable, serviceGroup, registry
8495
8773
  async function runTasksLoop(context, options) {
8496
8774
  const queueName = options.queueName ?? "tasks";
8497
8775
  const target = options.target;
8498
- const pollMs = options.pollMs ?? 1e3;
8499
- const claimJitterMs = options.claimJitterMs ?? 0;
8500
- const maxParallel = options.maxParallel ?? 32;
8501
- const scanLimit = options.scanLimit ?? 100;
8502
8776
  const allowedTasks = normalizeAllowedTasks(options.allowedTasks);
8503
8777
  const registry = normalizeRegistry(options.registry);
8504
8778
  const { tasksTable, historyTable } = queueToTableNames(queueName);
8505
8779
  if (!target) throw new Error("runTasksLoop: target is required");
8506
8780
  context.tasksQueueName = queueName;
8781
+ ensureTasksRuntime(context, {
8782
+ maxParallel: options.maxParallel ?? 32,
8783
+ pollMs: options.pollMs ?? 1e3,
8784
+ claimJitterMs: options.claimJitterMs ?? 0,
8785
+ scanLimit: options.scanLimit ?? 100
8786
+ });
8787
+ if (typeof options.onRuntimeParam === "function") {
8788
+ context.tasksRuntimeOnParam = options.onRuntimeParam;
8789
+ }
8507
8790
  const runningPromises = /* @__PURE__ */ new Set();
8508
8791
  const runningTaskInstances = /* @__PURE__ */ new Map();
8509
- let runningStopControlPromise = null;
8792
+ let runningControlPromise = null;
8510
8793
  let stopRequested = false;
8511
8794
  let stopAllowanceMs = 5e3;
8512
8795
  context.tasksRunnerStop = false;
@@ -8517,9 +8800,16 @@ async function runTasksLoop(context, options) {
8517
8800
  if (hbGroup) {
8518
8801
  const hbIntervalMs = options.runnerHeartbeatIntervalMs ?? 1e4;
8519
8802
  const staleMs = options.runnerHeartbeatStaleMs ?? 45e3;
8803
+ const loop0 = readLoopRuntime(context);
8520
8804
  const defaultMeta = {
8521
8805
  component: "tasks-runner",
8522
- allowedTasks: allowedTasks?.length ? allowedTasks.join(",") : "all"
8806
+ allowedTasks: allowedTasks?.length ? allowedTasks.join(",") : "all",
8807
+ runtime: {
8808
+ maxParallel: loop0.maxParallel,
8809
+ pollMs: loop0.pollMs,
8810
+ claimJitterMs: loop0.claimJitterMs,
8811
+ scanLimit: loop0.scanLimit
8812
+ }
8523
8813
  };
8524
8814
  registryReg = await registerInServicesRegistry(context, {
8525
8815
  queueName,
@@ -8532,6 +8822,7 @@ async function runTasksLoop(context, options) {
8532
8822
  enforceMaxInstances: options.runnerEnforceMaxInstances ?? true,
8533
8823
  metadata: options.runnerMetadata ?? defaultMeta
8534
8824
  });
8825
+ context.servicesRegistry = registryReg;
8535
8826
  runnerIdentity = {
8536
8827
  service_name: registryReg.serviceName,
8537
8828
  server_name: import_node_os6.default.hostname(),
@@ -8545,22 +8836,23 @@ async function runTasksLoop(context, options) {
8545
8836
  }
8546
8837
  try {
8547
8838
  while (!context.isStop() && !stopRequested && context.tasksRunnerStop !== true) {
8548
- if (!runningStopControlPromise) {
8549
- const claimedStopTask = await claimNextRunnableTask(
8839
+ const { maxParallel, pollMs, claimJitterMs, scanLimit } = readLoopRuntime(context);
8840
+ if (!runningControlPromise) {
8841
+ const claimedControlTask = await claimNextRunnableTask(
8550
8842
  context,
8551
8843
  tasksTable,
8552
8844
  target,
8553
8845
  registry,
8554
8846
  10,
8555
- ["stopRunner", "stop"],
8847
+ controlLaneTaskNames(),
8556
8848
  runnerIdentity
8557
8849
  );
8558
- if (claimedStopTask) {
8559
- runningStopControlPromise = executeClaimedTask(
8850
+ if (claimedControlTask) {
8851
+ runningControlPromise = executeClaimedTask(
8560
8852
  context,
8561
8853
  tasksTable,
8562
8854
  historyTable,
8563
- claimedStopTask,
8855
+ claimedControlTask,
8564
8856
  registry,
8565
8857
  runningTaskInstances
8566
8858
  ).then(async (outcome) => {
@@ -8571,7 +8863,7 @@ async function runTasksLoop(context, options) {
8571
8863
  await signalRunningTasksStop(context, runningTaskInstances, stopAllowanceMs);
8572
8864
  }
8573
8865
  }).finally(() => {
8574
- runningStopControlPromise = null;
8866
+ runningControlPromise = null;
8575
8867
  });
8576
8868
  }
8577
8869
  }
@@ -8602,8 +8894,8 @@ async function runTasksLoop(context, options) {
8602
8894
  runningPromises.add(p);
8603
8895
  }
8604
8896
  const wakePromises = [...runningPromises];
8605
- if (runningStopControlPromise) {
8606
- wakePromises.push(runningStopControlPromise);
8897
+ if (runningControlPromise) {
8898
+ wakePromises.push(runningControlPromise);
8607
8899
  }
8608
8900
  if (wakePromises.length === 0) {
8609
8901
  await sleepMs(pollMs);
@@ -8832,6 +9124,8 @@ var TasksManager = class _TasksManager {
8832
9124
  FooterPresets,
8833
9125
  GridCell,
8834
9126
  InputField,
9127
+ LOGGER_RUNTIME_KEYS,
9128
+ LOOP_RUNTIME_KEYS,
8835
9129
  ListComponent,
8836
9130
  ListItem,
8837
9131
  MultiColumnListComponent,
@@ -8850,6 +9144,7 @@ var TasksManager = class _TasksManager {
8850
9144
  TaskGetLogs,
8851
9145
  TaskPing,
8852
9146
  TaskSampleProcess,
9147
+ TaskSetRuntimeParam,
8853
9148
  TaskShellCommand,
8854
9149
  TaskStopRunner,
8855
9150
  TaskSumAB,
@@ -8861,12 +9156,16 @@ var TasksManager = class _TasksManager {
8861
9156
  activateRelease,
8862
9157
  appendDeployLog,
8863
9158
  appendTaskIpcLog,
9159
+ applyRuntimeParam,
9160
+ applyRuntimePatch,
8864
9161
  bootstrapHost,
8865
9162
  buildBreadcrumb,
8866
9163
  buildDetailBreadcrumb,
8867
9164
  buildFooter,
8868
9165
  bumpPatchVersion,
8869
9166
  cloneRepo,
9167
+ coerceRuntimeValue,
9168
+ controlLaneTaskNames,
8870
9169
  convertPattern,
8871
9170
  createRelease,
8872
9171
  defaultFileSynopsisFunction,
@@ -8888,6 +9187,7 @@ var TasksManager = class _TasksManager {
8888
9187
  ensureSchemaEverywhere,
8889
9188
  ensureTable,
8890
9189
  ensureTaskTables,
9190
+ ensureTasksRuntime,
8891
9191
  flushTaskIpcLogs,
8892
9192
  getArgsInstance,
8893
9193
  h,
@@ -8919,6 +9219,7 @@ var TasksManager = class _TasksManager {
8919
9219
  pullRepo,
8920
9220
  queueToTableNames,
8921
9221
  readCurrentRelease,
9222
+ readLoopRuntime,
8922
9223
  readReleaseBuildInfo,
8923
9224
  readTaskIpcLogsSnapshot,
8924
9225
  registerInServicesRegistry,