@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/cli-runner.cjs +377 -16
- package/dist/cli-runner.cjs.map +1 -1
- package/dist/cli-runner.js +377 -16
- package/dist/cli-runner.js.map +1 -1
- package/dist/index.cjs +318 -17
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +309 -17
- package/dist/index.js.map +1 -1
- package/dist/tasks.cjs +318 -17
- package/dist/tasks.cjs.map +1 -1
- package/dist/tasks.js +309 -17
- package/dist/tasks.js.map +1 -1
- package/package.json +2 -2
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
|
|
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
|
-
|
|
8549
|
-
|
|
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
|
-
|
|
8847
|
+
controlLaneTaskNames(),
|
|
8556
8848
|
runnerIdentity
|
|
8557
8849
|
);
|
|
8558
|
-
if (
|
|
8559
|
-
|
|
8850
|
+
if (claimedControlTask) {
|
|
8851
|
+
runningControlPromise = executeClaimedTask(
|
|
8560
8852
|
context,
|
|
8561
8853
|
tasksTable,
|
|
8562
8854
|
historyTable,
|
|
8563
|
-
|
|
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
|
-
|
|
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 (
|
|
8606
|
-
wakePromises.push(
|
|
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,
|