@taskless-app/swarm 0.6.30 → 0.6.31

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 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.30",
3242
+ version: "0.6.31",
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: "3d2b558784c89fbbd1f8f70a944935653eeb3fb1"
3293
+ gitHead: "82950eae7a6ad09be4193708257798c811bb6fae"
3294
3294
  };
3295
3295
  }
3296
3296
  });
package/dist/overmind.js CHANGED
@@ -14237,7 +14237,7 @@ import { serve as serve2 } from "@hono/node-server";
14237
14237
  // package.json
14238
14238
  var package_default = {
14239
14239
  name: "@taskless-app/swarm",
14240
- version: "0.6.30",
14240
+ version: "0.6.31",
14241
14241
  type: "module",
14242
14242
  description: "Local control plane for a fleet of AI coding agents (drones), coordinating through Taskless. The overmind runs the swarm.",
14243
14243
  keywords: [
@@ -14288,7 +14288,7 @@ var package_default = {
14288
14288
  execa: "^10.0.0",
14289
14289
  zod: "3.25.76"
14290
14290
  },
14291
- gitHead: "3d2b558784c89fbbd1f8f70a944935653eeb3fb1"
14291
+ gitHead: "82950eae7a6ad09be4193708257798c811bb6fae"
14292
14292
  };
14293
14293
 
14294
14294
  // src/version.ts
@@ -16802,6 +16802,14 @@ function abortReason(abort) {
16802
16802
  return `${ABORT_TEXT[abort.kind]} (${abort.raw})`;
16803
16803
  }
16804
16804
  var ABORTED_CONTINUE_NUDGE = "\u0422\u0432\u043E\u044F \u043F\u0440\u043E\u0448\u043B\u0430\u044F \u0441\u0435\u0441\u0441\u0438\u044F \u041E\u0411\u041E\u0420\u0412\u0410\u041B\u0410\u0421\u042C \u043D\u0430 \u043F\u043E\u043B\u0443\u0441\u043B\u043E\u0432\u0435 (\u043D\u0435 \u0442\u044B \u0435\u0451 \u0437\u0430\u043A\u043E\u043D\u0447\u0438\u043B). \u0422\u044B headless-\u0434\u0440\u043E\u043D, \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0430\u0435\u0448\u044C \u0422\u0423 \u0416\u0415 \u0437\u0430\u0434\u0430\u0447\u0443. \u041F\u043E\u0441\u043C\u043E\u0442\u0440\u0438 `git status`/`git log`: \u0447\u0442\u043E \u0443\u0436\u0435 \u0441\u0434\u0435\u043B\u0430\u043D\u043E \u0438 \u0437\u0430\u043F\u0443\u0448\u0435\u043D\u043E \u2014 \u041D\u0415 \u043F\u0435\u0440\u0435\u0434\u0435\u043B\u044B\u0432\u0430\u0439. \u0412\u0410\u0416\u041D\u041E \u043F\u0440\u043E \u043E\u0431\u0440\u044B\u0432\u044B: \u0440\u0432\u0451\u0442\u0441\u044F \u0441\u0435\u0441\u0441\u0438\u044F \u043D\u0430 \u041E\u0422\u0412\u0415\u0422\u0415 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0430, \u0447\u0435\u0439 \u0432\u044B\u0432\u043E\u0434 \u043E\u0433\u0440\u043E\u043C\u0435\u043D (\u043F\u043E\u043B\u043D\u044B\u0439 \u0441\u044C\u044E\u0442 \u0442\u0435\u0441\u0442\u043E\u0432, `git log` \u0431\u0435\u0437 \u043B\u0438\u043C\u0438\u0442\u0430, \u0434\u0430\u043C\u043F \u0444\u0430\u0439\u043B\u0430 \u0446\u0435\u043B\u0438\u043A\u043E\u043C). \u0413\u043D\u0430\u0442\u044C \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u043D\u0430\u0434\u043E \u043F\u043E-\u043F\u0440\u0435\u0436\u043D\u0435\u043C\u0443 \u043F\u043E\u043B\u043D\u043E\u0441\u0442\u044C\u044E \u2014 \u043D\u043E \u0432\u044B\u0432\u043E\u0434 \u043F\u0438\u0448\u0438 \u0432 \u0441\u0432\u043E\u0439 \u0444\u0430\u0439\u043B (`LOG=$(mktemp -t suite)`) \u0438 \u0431\u0435\u0440\u0438 \u0438\u0437 \u043D\u0435\u0433\u043E \u0445\u0432\u043E\u0441\u0442 \u0438 \u0438\u0442\u043E\u0433\u043E\u0432\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443, \u0430 \u043D\u0435 \u043F\u0440\u043E\u0441\u0442\u044B\u043D\u044E. \u0414\u043E\u0432\u0435\u0434\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0434\u043E \u043A\u043E\u043D\u0446\u0430, \u043E\u0442\u043A\u0440\u043E\u0439 PR \u0438 \u041E\u0411\u042F\u0417\u0410\u0422\u0415\u041B\u042C\u041D\u041E \u0432\u044B\u0437\u043E\u0432\u0438 done(pr_url).";
16805
+ var SUBRUN_EXITED_TEXT = "\u0441\u0435\u0441\u0441\u0438\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043B\u0430\u0441\u044C \u0441\u0430\u043C\u0430, done() \u043D\u0435 \u0432\u044B\u0437\u0432\u0430\u043D \u2014 \u044D\u0442\u043E \u041D\u0415 \u0441\u043C\u0435\u0440\u0442\u044C (\u0438\u0442\u043E\u0433 \u0437\u0430\u043F\u0438\u0441\u0430\u043D, worktree \u0446\u0435\u043B)";
16806
+ function isSubrun(run) {
16807
+ return run.resolves_run_id != null || run.reviews_run_id != null || run.verifies_run_id != null;
16808
+ }
16809
+ function subrunWaitNudge(run) {
16810
+ const tail2 = run.resolves_run_id != null ? "\u0422\u044B \u0434\u0440\u043E\u043D-\u0420\u0415\u0417\u041E\u041B\u0412\u0415\u0420: \u0434\u043E\u0432\u0435\u0434\u0438 merge-\u043A\u043E\u043C\u043C\u0438\u0442, \u0437\u0430\u043F\u0443\u0448\u044C \u0432 \u0432\u0435\u0442\u043A\u0443 PR \u0438 \u0432\u044B\u0437\u043E\u0432\u0438 done(pr_url). \u041F\u0440\u043E\u0432\u0435\u0440\u044F\u0442\u044C \u0441\u043E\u0440\u0430\u0437\u043C\u0435\u0440\u043D\u043E \u043F\u0440\u0430\u0432\u043A\u0435 \u2014 \u0442\u0438\u043F\u044B/\u0442\u0435\u0441\u0442\u044B \u0417\u0410\u0422\u0420\u041E\u041D\u0423\u0422\u042B\u0425 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u043E\u043C \u043F\u0430\u043A\u0435\u0442\u043E\u0432, \u0430 \u043D\u0435 \u0432\u0435\u0441\u044C \u043C\u043E\u043D\u043E\u0440\u0435\u043F\u043E-\u0441\u044C\u044E\u0442: \u043F\u043E\u043B\u043D\u044B\u0439 \u043F\u0440\u043E\u0433\u043E\u043D \u043D\u0430 PR \u0432\u0441\u0451 \u0440\u0430\u0432\u043D\u043E \u0441\u0434\u0435\u043B\u0430\u0435\u0442 CI." : run.verifies_run_id != null ? "\u0422\u044B \u0434\u0440\u043E\u043D-\u0412\u0415\u0420\u0418\u0424\u0418\u041A\u0410\u0422\u041E\u0420: \u0434\u043E\u0432\u0435\u0434\u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0443 \u0438 \u0432\u044B\u043D\u0435\u0441\u0438 \u0432\u0435\u0440\u0434\u0438\u043A\u0442 (done \u0441 verdict, \u043B\u0438\u0431\u043E \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u043E\u043C \u0432 PR). \u041F\u0440\u043E\u0432\u0435\u0440\u044F\u0442\u044C \u0441\u043E\u0440\u0430\u0437\u043C\u0435\u0440\u043D\u043E \u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0435\u043C\u043E\u043C\u0443 \u0434\u0438\u0444\u0444\u0443 \u2014 \u043D\u0435 \u0433\u043E\u043D\u044F\u0439 \u0432\u0435\u0441\u044C \u0441\u044C\u044E\u0442 \u043C\u043E\u043D\u043E\u0440\u0435\u043F\u044B \u0440\u0430\u0434\u0438 \u043E\u0434\u043D\u043E\u0433\u043E PR." : "\u0422\u044B \u0434\u0440\u043E\u043D-\u0420\u0415\u0412\u042C\u042E\u0415\u0420: \u0434\u043E\u0432\u0435\u0434\u0438 \u0447\u0435\u043A-\u043B\u0438\u0441\u0442 \u0438 \u0432\u044B\u043D\u0435\u0441\u0438 \u0432\u0435\u0440\u0434\u0438\u043A\u0442 (APPROVE / REQUEST CHANGES) \u2014 done() \u043B\u0438\u0431\u043E \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u043E\u043C \u0432 PR.";
16811
+ return `\u0422\u0432\u043E\u044F \u043F\u0440\u043E\u0448\u043B\u0430\u044F \u0441\u0435\u0441\u0441\u0438\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043B\u0430\u0441\u044C \u0421\u0410\u041C\u0410, \u043D\u043E \u0442\u044B \u043D\u0435 \u0432\u044B\u0437\u0432\u0430\u043B done() \u2014 \u0440\u043E\u0439 \u043F\u043E\u0434\u043D\u044F\u043B \u0422\u0423 \u0416\u0415 \u0441\u0435\u0441\u0441\u0438\u044E (--continue), \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442 \u0446\u0435\u043B. \u0412\u0410\u0416\u041D\u041E: \u0435\u0441\u043B\u0438 \u0442\u044B \u043E\u0441\u0442\u0430\u0432\u0438\u043B \u0444\u043E\u043D\u043E\u0432\u0443\u044E \u0440\u0430\u0431\u043E\u0442\u0443 (\u0442\u0435\u0441\u0442\u044B/\u0441\u0431\u043E\u0440\u043A\u0443 \u0432 \u0444\u043E\u043D\u0435, Monitor, \xAB\u0436\u0434\u0443 \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F\xBB) \u2014 \u0416\u0414\u0410\u0422\u042C \u0415\u0401 \u0422\u0423\u0422 \u041D\u0415\u041A\u041E\u041C\u0423: \u0441\u0435\u0441\u0441\u0438\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044F, \u043A\u0430\u043A \u0442\u043E\u043B\u044C\u043A\u043E \u0442\u044B \u043F\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0448\u044C \u0437\u0432\u0430\u0442\u044C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B, \u0438 \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 \u043D\u0435\u0439 \u0443\u043C\u0438\u0440\u0430\u0435\u0442 \u0444\u043E\u043D\u043E\u0432\u044B\u0439 \u043F\u0440\u043E\u0446\u0435\u0441\u0441. \u041D\u0438\u043A\u0430\u043A\u043E\u0433\u043E \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u043D\u0435 \u043F\u0440\u0438\u0434\u0451\u0442. \u0414\u043E\u043B\u0433\u043E\u0435 \u0434\u0435\u0440\u0436\u0438 \u0411\u041B\u041E\u041A\u0418\u0420\u0423\u042E\u0429\u0418\u041C \u0432\u044B\u0437\u043E\u0432\u043E\u043C (\u0438\u043B\u0438 \u0434\u0440\u043E\u0431\u0438 \u043D\u0430 \u0447\u0430\u0441\u0442\u0438), \u0430 \u043E\u0431\u044A\u0451\u043C \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0431\u0435\u0440\u0438 \u043F\u043E \u043E\u0431\u044A\u0451\u043C\u0443 \u0441\u0432\u043E\u0435\u0439 \u043F\u0440\u0430\u0432\u043A\u0438. ${tail2}`;
16812
+ }
16805
16813
  var EXITED_CONTINUE_NUDGE = "\u0422\u0432\u043E\u044F \u043F\u0440\u043E\u0448\u043B\u0430\u044F \u0441\u0435\u0441\u0441\u0438\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043B\u0430\u0441\u044C \u0421\u0410\u041C\u0410, \u043D\u043E \u0442\u044B \u0442\u0430\u043A \u0438 \u043D\u0435 \u0432\u044B\u0437\u0432\u0430\u043B done(pr_url) \u2014 \u0440\u043E\u0439 \u043D\u0435 \u0443\u0432\u0438\u0434\u0435\u043B \u0441\u0434\u0430\u0447\u0438. \u0422\u044B headless-\u0434\u0440\u043E\u043D, \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0430\u0435\u0448\u044C \u0422\u0423 \u0416\u0415 \u0437\u0430\u0434\u0430\u0447\u0443. \u041F\u043E\u0441\u043C\u043E\u0442\u0440\u0438 `git status`/`git log`: \u0447\u0442\u043E \u0443\u0436\u0435 \u0441\u0434\u0435\u043B\u0430\u043D\u043E \u0438 \u0437\u0430\u043F\u0443\u0448\u0435\u043D\u043E \u2014 \u041D\u0415 \u043F\u0435\u0440\u0435\u0434\u0435\u043B\u044B\u0432\u0430\u0439. \u0414\u043E\u0432\u0435\u0434\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0434\u043E \u043A\u043E\u043D\u0446\u0430, \u043E\u0442\u043A\u0440\u043E\u0439 PR (\u0435\u0441\u043B\u0438 \u0435\u0449\u0451 \u043D\u0435\u0442) \u0438 \u041E\u0411\u042F\u0417\u0410\u0422\u0415\u041B\u042C\u041D\u041E \u0432\u044B\u0437\u043E\u0432\u0438 done(pr_url) \u2014 \u0431\u0435\u0437 \u044D\u0442\u043E\u0433\u043E \u0440\u0430\u0431\u043E\u0442\u0430 \u043D\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044F \u0441\u0434\u0430\u043D\u043D\u043E\u0439. \u0423\u0442\u043A\u043D\u0443\u043B\u0441\u044F \u0432 \u043B\u0438\u043C\u0438\u0442/\u043D\u0435 \u043C\u043E\u0436\u0435\u0448\u044C \u0437\u0430\u043A\u043E\u043D\u0447\u0438\u0442\u044C \u2014 \u043D\u0435 \u043C\u043E\u043B\u043E\u0442\u0438 \u0432\u0441\u043B\u0435\u043F\u0443\u044E, \u0437\u0430\u0434\u0430\u0439 \u0432\u043E\u043F\u0440\u043E\u0441 \u0447\u0435\u0440\u0435\u0437 MCP-\u0442\u0443\u043B ask. \u0412\u043E\u043F\u0440\u043E\u0441\u043E\u0432 \u0432 stdout \u043D\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u0439.";
16806
16814
  var STORM_DEAD_LIMIT = Number(process.env.SWARM_STORM_DEAD_LIMIT) || 3;
16807
16815
  var CONFLICT_RESOLVE_COOLDOWN_MS = Number(process.env.SWARM_CONFLICT_COOLDOWN_MS) || 3 * 60 * 1e3;
@@ -17533,11 +17541,11 @@ function buildResolverPrompt(reviewRun, resolver, conflicts, branch, mainRef) {
17533
17541
  "\u041F\u043E\u0440\u044F\u0434\u043E\u043A:",
17534
17542
  `1. \u0420\u0430\u0437\u0440\u0435\u0448\u0438 \u043C\u0430\u0440\u043A\u0435\u0440\u044B \u0432\u043E \u0432\u0441\u0435\u0445 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u0443\u044E\u0449\u0438\u0445 \u0444\u0430\u0439\u043B\u0430\u0445 (${files}); \`git status\` \u043F\u043E\u043A\u0430\u0436\u0435\u0442, \u0435\u0441\u043B\u0438 \u043E\u0441\u0442\u0430\u043B\u043E\u0441\u044C.`,
17535
17543
  "2. `git add -A && git commit --no-edit` \u2014 \u0437\u0430\u0432\u0435\u0440\u0448\u0438 merge-\u043A\u043E\u043C\u043C\u0438\u0442 (\u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u043E\u0441\u0442\u0430\u0432\u044C).",
17536
- "3. \u041F\u0440\u043E\u0433\u043E\u043D\u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u043F\u0440\u043E\u0435\u043A\u0442\u0430 \u043A\u0430\u043A \u0432 CI (\u0437\u0430\u0433\u043B\u044F\u043D\u0438 \u0432 .github/workflows \u0438 package.json \u0440\u0435\u043F\u043E \u2014 \u0442\u0435\u0441\u0442\u044B/\u0442\u0438\u043F\u044B/\u0441\u0431\u043E\u0440\u043A\u0430/\u043B\u0438\u043D\u0442) \u0438 \u0443\u0431\u0435\u0434\u0438\u0441\u044C, \u0447\u0442\u043E \u0437\u0435\u043B\u0435\u043D\u043E. \u041A\u0440\u0430\u0441\u043D\u043E\u0435 \u2014 \u043F\u043E\u0447\u0438\u043D\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435, \u043D\u0435 \u0441\u0430\u043C\u0443 \u0444\u0438\u0447\u0443.",
17544
+ "3. \u041F\u0440\u043E\u0432\u0435\u0440\u044C \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u0421\u041E\u0420\u0410\u0417\u041C\u0415\u0420\u041D\u041E \u043F\u0440\u0430\u0432\u043A\u0435: \u0442\u0438\u043F\u044B \u0438 \u0442\u0435\u0441\u0442\u044B \u0417\u0410\u0422\u0420\u041E\u041D\u0423\u0422\u042B\u0425 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u043E\u043C \u043F\u0430\u043A\u0435\u0442\u043E\u0432 (\u0434\u043B\u044F \u043F\u0440\u0430\u0432\u043A\u0438 \u0432 \u043F\u0430\u0440\u0443 \u0441\u0442\u0440\u043E\u043A \u044D\u0442\u043E \u0442\u0438\u043F\u0438\u0437\u0430\u0446\u0438\u044F \u043E\u0434\u043D\u043E\u0433\u043E \u043F\u0430\u043A\u0435\u0442\u0430, \u0430 \u043D\u0435 \u0441\u044C\u044E\u0442 \u043C\u043E\u043D\u043E\u0440\u0435\u043F\u044B). \u041F\u043E\u043B\u043D\u044B\u0439 \u043F\u0440\u043E\u0433\u043E\u043D \u043D\u0430 PR \u0432\u0441\u0451 \u0440\u0430\u0432\u043D\u043E \u0441\u0434\u0435\u043B\u0430\u0435\u0442 CI, \u0430 \u0442\u044B \u0441\u043B\u0438\u0432\u0430\u0435\u0448\u044C \u0447\u0443\u0436\u0438\u0435 \u0432\u0435\u0442\u043A\u0438, \u0430 \u043D\u0435 \u043F\u0438\u0448\u0435\u0448\u044C \u0444\u0438\u0447\u0443. \u041A\u0440\u0430\u0441\u043D\u043E\u0435 \u2014 \u043F\u043E\u0447\u0438\u043D\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435, \u043D\u0435 \u0441\u0430\u043C\u0443 \u0444\u0438\u0447\u0443.",
17537
17545
  `4. \`git push origin HEAD:refs/heads/${branch}\` \u2014 \u041E\u0411\u042B\u0427\u041D\u042B\u0419 push (\u044D\u0442\u043E fast-forward), \u043F\u043E\u043B\u043D\u044B\u0439 refspec (\u043D\u0435 \u0433\u043E\u043B\u043E\u0435 \`HEAD:${branch}\` \u2014 git \u043E\u0442\u043A\u0430\u0436\u0435\u0442\u0441\u044F \u0443\u0433\u0430\u0434\u044B\u0432\u0430\u0442\u044C, \u0435\u0441\u043B\u0438 \u0432\u0435\u0442\u043A\u0443 \u0442\u0435\u043C \u0432\u0440\u0435\u043C\u0435\u043D\u0435\u043C \u0443\u0434\u0430\u043B\u0438\u043B\u0438). \`--force\`/\`--force-with-lease\` \u041D\u0415 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439: \u0440\u0438\u0431\u0435\u0439\u0437/\u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u044C \u0438\u0441\u0442\u043E\u0440\u0438\u0438 \u0442\u0443\u0442 \u0437\u0430\u043F\u0440\u0435\u0449\u0435\u043D\u044B \u0438 \u0433\u0435\u0439\u0442\u044F\u0442\u0441\u044F.`,
17538
17546
  `5. \u0412\u044B\u0437\u043E\u0432\u0438 done(${prUrl}) \u2014 \u0440\u043E\u0439 \u043F\u043E\u0434\u0445\u0432\u0430\u0442\u0438\u0442, \u0447\u0442\u043E \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043D \u0438 PR \u043E\u0431\u043D\u043E\u0432\u043B\u0451\u043D.`,
17539
17547
  "",
17540
- `\u0412 \u043A\u0430\u0436\u0434\u044B\u0439 \u043A\u043E\u043C\u043C\u0438\u0442 \u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0439 \u0442\u0440\u0435\u0439\u043B\u0435\u0440-\u0441\u0442\u0440\u043E\u043A\u0443 \xABDrone: ${name} \xB7 resolver run #${resolver.id}\xBB. \u041A\u043E\u043C\u043C\u0438\u0442\u044C \u0438 \u043F\u0443\u0448\u044C \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442 \u2014 \u043D\u0435\u0437\u0430\u043F\u0443\u0448\u0435\u043D\u043D\u043E\u0435 \u0443\u043C\u0440\u0451\u0442 \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 \u0434\u0440\u043E\u043D\u043E\u043C. \u0414\u043E\u043B\u0433\u043E\u0435 (\u0442\u0435\u0441\u0442\u044B) \u0434\u0435\u0440\u0436\u0438 \u0431\u043B\u043E\u043A\u0438\u0440\u0443\u044E\u0449\u0438\u043C \u0432\u044B\u0437\u043E\u0432\u043E\u043C, \u043D\u0435 \u0432 \u0444\u043E\u043D\u0435.`
17548
+ `\u0412 \u043A\u0430\u0436\u0434\u044B\u0439 \u043A\u043E\u043C\u043C\u0438\u0442 \u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0439 \u0442\u0440\u0435\u0439\u043B\u0435\u0440-\u0441\u0442\u0440\u043E\u043A\u0443 \xABDrone: ${name} \xB7 resolver run #${resolver.id}\xBB. \u041A\u043E\u043C\u043C\u0438\u0442\u044C \u0438 \u043F\u0443\u0448\u044C \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442 \u2014 \u043D\u0435\u0437\u0430\u043F\u0443\u0448\u0435\u043D\u043D\u043E\u0435 \u0443\u043C\u0440\u0451\u0442 \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 \u0434\u0440\u043E\u043D\u043E\u043C. \u0414\u043E\u043B\u0433\u043E\u0435 (\u0442\u0435\u0441\u0442\u044B) \u0434\u0435\u0440\u0436\u0438 \u0411\u041B\u041E\u041A\u0418\u0420\u0423\u042E\u0429\u0418\u041C \u0432\u044B\u0437\u043E\u0432\u043E\u043C, \u043D\u0435 \u0432 \u0444\u043E\u043D\u0435: \u0441\u0435\u0441\u0441\u0438\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044F, \u043A\u0430\u043A \u0442\u043E\u043B\u044C\u043A\u043E \u0442\u044B \u043F\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0448\u044C \u0437\u0432\u0430\u0442\u044C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B, \u0438 \u0444\u043E\u043D\u043E\u0432\u044B\u0439 \u043F\u0440\u043E\u0446\u0435\u0441\u0441 \u0443\u043C\u0438\u0440\u0430\u0435\u0442 \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 \u043D\u0435\u0439 \u2014 \u0436\u0434\u0430\u0442\u044C \u0435\u0433\u043E \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u0442\u0443\u0442 \u043D\u0435\u043A\u043E\u043C\u0443 (TASWM-528).`
17541
17549
  ].join("\n");
17542
17550
  }
17543
17551
  function ciTrustLine(prUrl, verifyMode) {
@@ -19479,7 +19487,8 @@ async function tickOnce(deps) {
19479
19487
  continue;
19480
19488
  }
19481
19489
  }
19482
- if (!alive && (outcome === "graceful" || outcome === "aborted") && run.status === "running" && run.resolves_run_id == null && run.reviews_run_id == null && run.verifies_run_id == null && run.kind !== "hero") {
19490
+ if (!alive && (outcome === "graceful" || outcome === "aborted") && run.status === "running" && !isSubrun(run) && // суб-дроны (резолвер/ревьюер/верификатор) — своими ветками ниже, TASWM-528
19491
+ run.kind !== "hero") {
19483
19492
  if (!wasAborted(outcome) && run.pr_url) {
19484
19493
  deps.db.updateRun(run.id, { status: "review", stop_reason: null });
19485
19494
  deps.db.addEvent(run.id, "step", `${SUBMITTED_EXIT_TEXT}: ${run.pr_url}`);
@@ -19523,7 +19532,8 @@ async function tickOnce(deps) {
19523
19532
  );
19524
19533
  continue;
19525
19534
  }
19526
- if (!alive && run.status === "running" && run.resolves_run_id == null && run.reviews_run_id == null && run.verifies_run_id == null && deps.respawn && run.respawns < RESPAWN_LIMIT) {
19535
+ if (!alive && run.status === "running" && !isSubrun(run) && // те же три роли одним предикатом — TASWM-528
19536
+ deps.respawn && run.respawns < RESPAWN_LIMIT) {
19527
19537
  const wt = run.worktree_path;
19528
19538
  const wtAlive = !!wt && worktreeExists(wt);
19529
19539
  const canContinue = wtAlive && hasTranscript(wt);
@@ -19576,24 +19586,46 @@ async function tickOnce(deps) {
19576
19586
  continue;
19577
19587
  }
19578
19588
  }
19589
+ if (!alive && outcome === "graceful" && run.status === "running" && isSubrun(run)) {
19590
+ const wt = run.worktree_path;
19591
+ const canContinue = !!wt && worktreeExists(wt) && hasTranscript(wt);
19592
+ if (deps.respawn && canContinue && run.respawns < RESPAWN_LIMIT) {
19593
+ const n = deps.db.incRespawn(run.id);
19594
+ deps.db.addEvent(run.id, "respawned", `\u0430\u0432\u0442\u043E-\u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0435\u043D\u0438\u0435 #${n}: ${SUBRUN_EXITED_TEXT} \u2014 --continue \u0441 \u043D\u0430\u043A\u0430\u0437\u043E\u043C \u043D\u0435 \u0436\u0434\u0430\u0442\u044C \u0444\u043E\u043D\u043E\u0432\u0443\u044E \u0440\u0430\u0431\u043E\u0442\u0443 \u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0442\u044C \u0441\u043E\u0440\u0430\u0437\u043C\u0435\u0440\u043D\u043E \u043F\u0440\u0430\u0432\u043A\u0435 (TASWM-528)`);
19595
+ narrate(deps, `${droneLabel(run)} \u0437\u0430\u043A\u043E\u043D\u0447\u0438\u043B \u0445\u043E\u0434, \u043D\u0435 \u043F\u043E\u0437\u0432\u0430\u0432 done() \u2014 \u043D\u0435 \u0445\u043E\u0440\u043E\u043D\u044E, \u043F\u043E\u0434\u043D\u0438\u043C\u0430\u044E --continue \u0442\u043E\u0439 \u0436\u0435 \u0441\u0435\u0441\u0441\u0438\u0438.`);
19596
+ try {
19597
+ await deps.respawn(run, "continue", subrunWaitNudge(run));
19598
+ continue;
19599
+ } catch (e) {
19600
+ deps.db.addEvent(run.id, "step", `${SUBRUN_EXITED_TEXT}, \u043D\u043E --continue \u0441\u043E\u0440\u0432\u0430\u043B\u0441\u044F: ${String(e)} \u2014 \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u044E \u043F\u043E\u043F\u044B\u0442\u043A\u0443 \u043F\u043E \u043E\u0431\u0449\u0435\u0439 \u0432\u0435\u0442\u043A\u0435`);
19601
+ }
19602
+ } else {
19603
+ const why = !canContinue ? "worktree/\u0442\u0440\u0430\u043D\u0441\u043A\u0440\u0438\u043F\u0442 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B" : !deps.respawn ? "\u0440\u0430\u0437\u0432\u043E\u0434\u043A\u0430 \u0430\u0432\u0442\u043E-\u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0435\u043D\u0438\u044F \u043D\u0435 \u0437\u0430\u0434\u0430\u043D\u0430" : `\u0438\u0441\u0447\u0435\u0440\u043F\u0430\u043D \u043B\u0438\u043C\u0438\u0442 \u0430\u0432\u0442\u043E-\u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0435\u043D\u0438\u0439 (${RESPAWN_LIMIT})`;
19604
+ deps.db.addEvent(run.id, "step", `${SUBRUN_EXITED_TEXT}, \u043D\u043E \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C \u043D\u0435\u0447\u0435\u043C: ${why} \u2014 \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u044E \u043F\u043E\u043F\u044B\u0442\u043A\u0443 \u043F\u043E \u043E\u0431\u0449\u0435\u0439 \u0432\u0435\u0442\u043A\u0435 (TASWM-528)`);
19605
+ }
19606
+ }
19579
19607
  if (!alive && run.status === "running" && run.resolves_run_id != null) {
19580
19608
  const prUrl = await deliveredPrUrl(deps, run);
19581
19609
  if (run.worktree_path) await deps.removeWorktree(run.repo, run.worktree_path).catch(() => {
19582
19610
  });
19583
19611
  deps.db.updateRun(run.id, { status: "done" });
19612
+ const how = outcome === "graceful" ? "\u0440\u0435\u0437\u043E\u043B\u0432\u0435\u0440 \u0432\u044B\u0448\u0435\u043B \u0441\u0430\u043C, \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C \u0441\u0435\u0441\u0441\u0438\u044E \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C" : "\u0440\u0435\u0437\u043E\u043B\u0432\u0435\u0440 \u0443\u043C\u0435\u0440 \u0434\u043E done()";
19584
19613
  deps.db.addEvent(
19585
19614
  run.id,
19586
19615
  "done",
19587
- prUrl ? `\u0440\u0435\u0437\u043E\u043B\u0432\u0435\u0440 \u0443\u043C\u0435\u0440 \u0434\u043E done() \u2014 \u0440\u0430\u0431\u043E\u0442\u0430 \u043D\u0430 \u0432\u0435\u0442\u043A\u0435 PR (${prUrl}), \u043F\u043E\u043F\u044B\u0442\u043A\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430; \u0440\u0435\u043A\u043E\u043D\u0441\u0430\u0439\u043B \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0433\u043E PR \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442 merge/CI/\u043F\u043E\u0432\u0442\u043E\u0440 (TASWM-224)` : "\u0440\u0435\u0437\u043E\u043B\u0432\u0435\u0440 \u0443\u043C\u0435\u0440 \u0434\u043E done() \u2014 \u043F\u043E\u043F\u044B\u0442\u043A\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430; \u0440\u0435\u043A\u043E\u043D\u0441\u0430\u0439\u043B \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0433\u043E PR \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442 merge/CI/\u043F\u043E\u0432\u0442\u043E\u0440 (TASWM-224)"
19616
+ prUrl ? `${how} \u2014 \u0440\u0430\u0431\u043E\u0442\u0430 \u043D\u0430 \u0432\u0435\u0442\u043A\u0435 PR (${prUrl}), \u043F\u043E\u043F\u044B\u0442\u043A\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430; \u0440\u0435\u043A\u043E\u043D\u0441\u0430\u0439\u043B \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0433\u043E PR \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442 merge/CI/\u043F\u043E\u0432\u0442\u043E\u0440 (TASWM-224)` : `${how} \u2014 \u043F\u043E\u043F\u044B\u0442\u043A\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430; \u0440\u0435\u043A\u043E\u043D\u0441\u0430\u0439\u043B \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0433\u043E PR \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442 merge/CI/\u043F\u043E\u0432\u0442\u043E\u0440 (TASWM-224)`
19588
19617
  );
19589
19618
  narrate(deps, `${droneLabel(run)} (\u0440\u0435\u0437\u043E\u043B\u0432\u0435\u0440) \u0432\u044B\u0448\u0435\u043B \u0434\u043E done() \u2014 \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u044E \u0431\u0435\u0437 \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u0441\u043A\u043E\u0433\u043E \u0430\u043B\u0451\u0440\u0442\u0430, \u0434\u0430\u043B\u044C\u0448\u0435 \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0439 PR.`);
19590
19619
  continue;
19591
19620
  }
19592
19621
  let reason = null;
19593
19622
  if (!alive) {
19594
- const crashNote = outcome === "crash" ? "\u0443\u0431\u0438\u0442 \u043D\u0430 \u043F\u043E\u043B\u043F\u0443\u0442\u0438 (\u043D\u0435\u0442 result-\u0444\u0430\u0439\u043B\u0430 \u2014 \u043E\u0431\u043E\u0440\u0432\u0430\u043B\u0441\u044F \u0434\u043E \u0437\u0430\u043F\u0438\u0441\u0438 \u0438\u0442\u043E\u0433\u0430: OOM/\u043F\u0430\u043D\u0438\u043A\u0430/kill)" : "pid \u043D\u0435 \u043E\u0442\u0432\u0435\u0447\u0430\u0435\u0442";
19595
- reason = run.respawns >= RESPAWN_LIMIT ? `\u0434\u0440\u043E\u043D \u0443\u043C\u0435\u0440 (${crashNote}): \u0438\u0441\u0447\u0435\u0440\u043F\u0430\u043D \u043B\u0438\u043C\u0438\u0442 \u0430\u0432\u0442\u043E-\u043E\u0436\u0438\u0432\u043B\u0435\u043D\u0438\u0439 (${RESPAWN_LIMIT})` : `\u0434\u0440\u043E\u043D \u0443\u043C\u0435\u0440: ${crashNote}`;
19596
- narrate(deps, `${droneLabel(run)} \u043D\u0435 \u043F\u0440\u0438\u0445\u043E\u0434\u0438\u0442 \u0432 \u0441\u0435\u0431\u044F \u2014 \u0441\u0434\u0430\u044E\u0441\u044C, \u0434\u0430\u043B\u044C\u0448\u0435 \u043D\u0443\u0436\u0435\u043D \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440.`);
19623
+ const how = outcome === "graceful" ? "\u0434\u0440\u043E\u043D \u0432\u044B\u0448\u0435\u043B \u0441\u0430\u043C (\u0441\u0435\u0441\u0441\u0438\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430 \u0448\u0442\u0430\u0442\u043D\u043E), \u043D\u043E done() \u043D\u0435 \u043F\u043E\u0437\u0432\u0430\u043B, \u0430 \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C \u0441\u0435\u0441\u0441\u0438\u044E \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C" : `\u0434\u0440\u043E\u043D \u0443\u043C\u0435\u0440: ${outcome === "crash" ? "\u0443\u0431\u0438\u0442 \u043D\u0430 \u043F\u043E\u043B\u043F\u0443\u0442\u0438 (\u043D\u0435\u0442 result-\u0444\u0430\u0439\u043B\u0430 \u2014 \u043E\u0431\u043E\u0440\u0432\u0430\u043B\u0441\u044F \u0434\u043E \u0437\u0430\u043F\u0438\u0441\u0438 \u0438\u0442\u043E\u0433\u0430: OOM/\u043F\u0430\u043D\u0438\u043A\u0430/kill)" : "pid \u043D\u0435 \u043E\u0442\u0432\u0435\u0447\u0430\u0435\u0442"}`;
19624
+ reason = run.respawns >= RESPAWN_LIMIT ? `${how} \u2014 \u0438\u0441\u0447\u0435\u0440\u043F\u0430\u043D \u043B\u0438\u043C\u0438\u0442 \u0430\u0432\u0442\u043E-\u043E\u0436\u0438\u0432\u043B\u0435\u043D\u0438\u0439 (${RESPAWN_LIMIT})` : how;
19625
+ narrate(
19626
+ deps,
19627
+ outcome === "graceful" ? `${droneLabel(run)} \u0437\u0430\u043A\u043E\u043D\u0447\u0438\u043B \u0445\u043E\u0434 \u0441\u0430\u043C, \u043D\u043E \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C \u0435\u0433\u043E \u0441\u0435\u0441\u0441\u0438\u044E \u043D\u0435\u0447\u0435\u043C \u2014 \u0434\u0430\u043B\u044C\u0448\u0435 \u043D\u0443\u0436\u0435\u043D \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440.` : `${droneLabel(run)} \u043D\u0435 \u043F\u0440\u0438\u0445\u043E\u0434\u0438\u0442 \u0432 \u0441\u0435\u0431\u044F \u2014 \u0441\u0434\u0430\u044E\u0441\u044C, \u0434\u0430\u043B\u044C\u0448\u0435 \u043D\u0443\u0436\u0435\u043D \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440.`
19628
+ );
19597
19629
  } else if (run.status === "running" && now - await livenessMs(deps, run, now, liveChildPpids) > STALL_MS) {
19598
19630
  reason = `\u0434\u0440\u043E\u043D \u0437\u0430\u0432\u0438\u0441: \u043C\u043E\u043B\u0447\u0438\u0442 > ${Math.round(STALL_MS / 6e4)} \u043C\u0438\u043D`;
19599
19631
  narrate(deps, `${droneLabel(run)} \u0437\u0430\u0442\u0438\u0445 \u0434\u043E\u043B\u044C\u0448\u0435 ${Math.round(STALL_MS / 6e4)} \u043C\u0438\u043D \u2014 \u043F\u043E\u043C\u0435\u0447\u0430\u044E \u0437\u0430\u0432\u0438\u0441\u0448\u0438\u043C, \u0433\u043B\u044F\u043D\u0443, \u0447\u0442\u043E \u0442\u0430\u043C.`);
@@ -21482,6 +21514,7 @@ export {
21482
21514
  STALL_MS,
21483
21515
  STORM_DEAD_LIMIT,
21484
21516
  SUBMITTED_EXIT_TEXT,
21517
+ SUBRUN_EXITED_TEXT,
21485
21518
  VERIFY_ESCALATION_MARK,
21486
21519
  VERIFY_SPAWN_LIMIT,
21487
21520
  WATCHDOG_PARK_REASON,
@@ -21497,6 +21530,7 @@ export {
21497
21530
  buildVerifierPrompt,
21498
21531
  cancelRun,
21499
21532
  hasLiveDescendant,
21533
+ isSubrun,
21500
21534
  lastChangesSummary,
21501
21535
  listDroneProcesses,
21502
21536
  livePpids,
@@ -21511,6 +21545,7 @@ export {
21511
21545
  runDaemon,
21512
21546
  spawnReviewer,
21513
21547
  spawnVerifier,
21548
+ subrunWaitNudge,
21514
21549
  syncCrashedOnStartup,
21515
21550
  tickOnce,
21516
21551
  verdictCommentMark,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taskless-app/swarm",
3
- "version": "0.6.30",
3
+ "version": "0.6.31",
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": "3d2b558784c89fbbd1f8f70a944935653eeb3fb1",
42
+ "gitHead": "82950eae7a6ad09be4193708257798c811bb6fae",
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",