@taskless-app/swarm 0.6.28 → 0.6.30
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.js +14 -3
- package/dist/overmind.js +33 -4
- package/package.json +2 -2
package/dist/cli.js
CHANGED
|
@@ -3239,7 +3239,7 @@ var init_package = __esm({
|
|
|
3239
3239
|
"package.json"() {
|
|
3240
3240
|
package_default = {
|
|
3241
3241
|
name: "@taskless-app/swarm",
|
|
3242
|
-
version: "0.6.
|
|
3242
|
+
version: "0.6.30",
|
|
3243
3243
|
type: "module",
|
|
3244
3244
|
description: "Local control plane for a fleet of AI coding agents (drones), coordinating through Taskless. The overmind runs the swarm.",
|
|
3245
3245
|
keywords: [
|
|
@@ -3290,7 +3290,7 @@ var init_package = __esm({
|
|
|
3290
3290
|
execa: "^10.0.0",
|
|
3291
3291
|
zod: "3.25.76"
|
|
3292
3292
|
},
|
|
3293
|
-
gitHead: "
|
|
3293
|
+
gitHead: "3d2b558784c89fbbd1f8f70a944935653eeb3fb1"
|
|
3294
3294
|
};
|
|
3295
3295
|
}
|
|
3296
3296
|
});
|
|
@@ -7060,6 +7060,8 @@ var SwarmClient = class _SwarmClient {
|
|
|
7060
7060
|
// уходить «TASWM-392», а не «cmsqqpphd011y2xtbckkut6bj» — иначе оператору всё равно
|
|
7061
7061
|
// нечего искать. Резолв делает прод (см. resolveDepRefs), здесь только запоминаем.
|
|
7062
7062
|
depSlug = /* @__PURE__ */ new Map();
|
|
7063
|
+
// TASWM-526: публичный — гейт спавна судит по нему СВЕЖЕСТЬ вердикта слепоты (эпизоду
|
|
7064
|
+
// больше TTL → переспросить прежде, чем ронять прогон терминально; см. overmind).
|
|
7063
7065
|
static DEPS_TTL_MS = 6e4;
|
|
7064
7066
|
// TASWM-486: ссылки, по которым прод НЕ ОТВЕТИЛ (отверг вызов или не дозвонились) —
|
|
7065
7067
|
// с какого времени, сколько попыток и чем именно отказал. Отказ ≠ ответ: вердикта в
|
|
@@ -7669,10 +7671,19 @@ var SwarmClient = class _SwarmClient {
|
|
|
7669
7671
|
* до ручного `wake_run`. Теперь отказ помнится отдельно (`depsUnanswered`): переспрос идёт
|
|
7670
7672
|
* по короткому нарастающему backoff, а сам факт «прод молчит» становится видимым —
|
|
7671
7673
|
* причина отказа спавна называет его вслух, и на затянувшуюся слепоту звенит аномалия.
|
|
7674
|
+
*
|
|
7675
|
+
* TASWM-526: `force` — спросить МИМО каденции. Нужен ровно одному месту: гейту спавна,
|
|
7676
|
+
* когда он собирается применить ТЕРМИНАЛЬНЫЙ исход по старому вердикту слепоты. Штатная
|
|
7677
|
+
* пауза для исчерпанного бюджета — целый TTL, и всё это время свежезаведённый прогон
|
|
7678
|
+
* умирал бы по ответу, который прод дал минуту назад и с тех пор мог передумать (api
|
|
7679
|
+
* починили и выкатили). Решение «падать или нет» обязано опираться на СВЕЖИЙ ответ, а не
|
|
7680
|
+
* на кеш, — вот его и переспрашиваем. Монотонное `done` фильтруется и здесь: оно не
|
|
7681
|
+
* протухает по определению, спрашивать нечего.
|
|
7672
7682
|
*/
|
|
7673
|
-
async refreshDeps(refs, nowMs = Date.now()) {
|
|
7683
|
+
async refreshDeps(refs, nowMs = Date.now(), opts = {}) {
|
|
7674
7684
|
const ask = [...new Set(refs)].filter((ref) => {
|
|
7675
7685
|
if (!ref || this.depsProd.get(ref)?.outcome === "done") return false;
|
|
7686
|
+
if (opts.force) return true;
|
|
7676
7687
|
const asked = this.depsAskedAt.get(ref);
|
|
7677
7688
|
if (asked === void 0) return true;
|
|
7678
7689
|
return nowMs - asked >= this.depsRetryDelay(ref);
|
package/dist/overmind.js
CHANGED
|
@@ -7035,6 +7035,8 @@ var SwarmClient = class _SwarmClient {
|
|
|
7035
7035
|
// уходить «TASWM-392», а не «cmsqqpphd011y2xtbckkut6bj» — иначе оператору всё равно
|
|
7036
7036
|
// нечего искать. Резолв делает прод (см. resolveDepRefs), здесь только запоминаем.
|
|
7037
7037
|
depSlug = /* @__PURE__ */ new Map();
|
|
7038
|
+
// TASWM-526: публичный — гейт спавна судит по нему СВЕЖЕСТЬ вердикта слепоты (эпизоду
|
|
7039
|
+
// больше TTL → переспросить прежде, чем ронять прогон терминально; см. overmind).
|
|
7038
7040
|
static DEPS_TTL_MS = 6e4;
|
|
7039
7041
|
// TASWM-486: ссылки, по которым прод НЕ ОТВЕТИЛ (отверг вызов или не дозвонились) —
|
|
7040
7042
|
// с какого времени, сколько попыток и чем именно отказал. Отказ ≠ ответ: вердикта в
|
|
@@ -7644,10 +7646,19 @@ var SwarmClient = class _SwarmClient {
|
|
|
7644
7646
|
* до ручного `wake_run`. Теперь отказ помнится отдельно (`depsUnanswered`): переспрос идёт
|
|
7645
7647
|
* по короткому нарастающему backoff, а сам факт «прод молчит» становится видимым —
|
|
7646
7648
|
* причина отказа спавна называет его вслух, и на затянувшуюся слепоту звенит аномалия.
|
|
7649
|
+
*
|
|
7650
|
+
* TASWM-526: `force` — спросить МИМО каденции. Нужен ровно одному месту: гейту спавна,
|
|
7651
|
+
* когда он собирается применить ТЕРМИНАЛЬНЫЙ исход по старому вердикту слепоты. Штатная
|
|
7652
|
+
* пауза для исчерпанного бюджета — целый TTL, и всё это время свежезаведённый прогон
|
|
7653
|
+
* умирал бы по ответу, который прод дал минуту назад и с тех пор мог передумать (api
|
|
7654
|
+
* починили и выкатили). Решение «падать или нет» обязано опираться на СВЕЖИЙ ответ, а не
|
|
7655
|
+
* на кеш, — вот его и переспрашиваем. Монотонное `done` фильтруется и здесь: оно не
|
|
7656
|
+
* протухает по определению, спрашивать нечего.
|
|
7647
7657
|
*/
|
|
7648
|
-
async refreshDeps(refs, nowMs = Date.now()) {
|
|
7658
|
+
async refreshDeps(refs, nowMs = Date.now(), opts = {}) {
|
|
7649
7659
|
const ask = [...new Set(refs)].filter((ref) => {
|
|
7650
7660
|
if (!ref || this.depsProd.get(ref)?.outcome === "done") return false;
|
|
7661
|
+
if (opts.force) return true;
|
|
7651
7662
|
const asked = this.depsAskedAt.get(ref);
|
|
7652
7663
|
if (asked === void 0) return true;
|
|
7653
7664
|
return nowMs - asked >= this.depsRetryDelay(ref);
|
|
@@ -14226,7 +14237,7 @@ import { serve as serve2 } from "@hono/node-server";
|
|
|
14226
14237
|
// package.json
|
|
14227
14238
|
var package_default = {
|
|
14228
14239
|
name: "@taskless-app/swarm",
|
|
14229
|
-
version: "0.6.
|
|
14240
|
+
version: "0.6.30",
|
|
14230
14241
|
type: "module",
|
|
14231
14242
|
description: "Local control plane for a fleet of AI coding agents (drones), coordinating through Taskless. The overmind runs the swarm.",
|
|
14232
14243
|
keywords: [
|
|
@@ -14277,7 +14288,7 @@ var package_default = {
|
|
|
14277
14288
|
execa: "^10.0.0",
|
|
14278
14289
|
zod: "3.25.76"
|
|
14279
14290
|
},
|
|
14280
|
-
gitHead: "
|
|
14291
|
+
gitHead: "3d2b558784c89fbbd1f8f70a944935653eeb3fb1"
|
|
14281
14292
|
};
|
|
14282
14293
|
|
|
14283
14294
|
// src/version.ts
|
|
@@ -18433,7 +18444,25 @@ async function trySpawnQueuedRun(deps, run) {
|
|
|
18433
18444
|
if (unmet.length) {
|
|
18434
18445
|
const lost = unmet.filter((d) => d.outcome === "unknown");
|
|
18435
18446
|
const blind = deps.db.depsUnconfirmed?.(run.depends_on) ?? [];
|
|
18436
|
-
|
|
18447
|
+
let stuck = blind.find((d) => !d.retriable && d.attempts >= SwarmClient.DEPS_UNRETRIABLE_ATTEMPTS);
|
|
18448
|
+
if (stuck && Date.now() - stuck.since > SwarmClient.DEPS_TTL_MS && deps.db.refreshDeps) {
|
|
18449
|
+
const ref = stuck.ref;
|
|
18450
|
+
try {
|
|
18451
|
+
await deps.db.refreshDeps(run.depends_on, Date.now(), { force: true });
|
|
18452
|
+
} catch (e) {
|
|
18453
|
+
console.error("[overmind] \u043F\u0435\u0440\u0435\u0441\u043F\u0440\u043E\u0441 \u043F\u0440\u043E\u0442\u0443\u0445\u0448\u0435\u0433\u043E \u0432\u0435\u0440\u0434\u0438\u043A\u0442\u0430 \u0441\u043B\u0435\u043F\u043E\u0442\u044B \u0441\u043E\u0440\u0432\u0430\u043B\u0441\u044F:", e);
|
|
18454
|
+
}
|
|
18455
|
+
stuck = (deps.db.depsUnconfirmed?.(run.depends_on) ?? []).find(
|
|
18456
|
+
(d) => d.ref === ref && !d.retriable && d.attempts >= SwarmClient.DEPS_UNRETRIABLE_ATTEMPTS
|
|
18457
|
+
);
|
|
18458
|
+
if (!stuck) {
|
|
18459
|
+
return deferSpawn(
|
|
18460
|
+
deps,
|
|
18461
|
+
run,
|
|
18462
|
+
`\u0432\u0435\u0440\u0434\u0438\u043A\u0442 \xAB\u043F\u0440\u043E\u0434 \u043E\u0442\u0432\u0435\u0440\u0433\u0430\u0435\u0442 swarm_deps_status\xBB \u0431\u044B\u043B \u0441\u0442\u0430\u0440\u0448\u0435 TTL (${Math.round(SwarmClient.DEPS_TTL_MS / 1e3)}\u0441) \u2014 \u043F\u0435\u0440\u0435\u0441\u043F\u0440\u043E\u0441\u0438\u043B \u043F\u0440\u043E\u0434, \u0442\u0435\u0440\u043C\u0438\u043D\u0430\u043B\u044C\u043D\u044B\u0439 \u0438\u0441\u0445\u043E\u0434 \u043F\u043E \u043F\u0440\u043E\u0442\u0443\u0445\u0448\u0435\u043C\u0443 \u043E\u0442\u0432\u0435\u0442\u0443 \u043D\u0435 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u044E (TASWM-526)`
|
|
18463
|
+
);
|
|
18464
|
+
}
|
|
18465
|
+
}
|
|
18437
18466
|
if (stuck) {
|
|
18438
18467
|
return await failBeforeStart(
|
|
18439
18468
|
deps,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@taskless-app/swarm",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.30",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Local control plane for a fleet of AI coding agents (drones), coordinating through Taskless. The overmind runs the swarm.",
|
|
6
6
|
"keywords": [
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"execa": "^10.0.0",
|
|
40
40
|
"zod": "3.25.76"
|
|
41
41
|
},
|
|
42
|
-
"gitHead": "
|
|
42
|
+
"gitHead": "3d2b558784c89fbbd1f8f70a944935653eeb3fb1",
|
|
43
43
|
"scripts": {
|
|
44
44
|
"overmind": "NODE_OPTIONS=\"${NODE_OPTIONS:-} --conditions=development\" tsx src/overmind.ts",
|
|
45
45
|
"swarm": "NODE_OPTIONS=\"${NODE_OPTIONS:-} --conditions=development\" tsx src/cli.ts",
|