@qwen-code/qwen-code 0.18.0-preview.2 → 0.18.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.
Files changed (117) hide show
  1. package/bundled/qc-helper/docs/_meta.ts +1 -0
  2. package/bundled/qc-helper/docs/configuration/settings.md +3 -5
  3. package/bundled/qc-helper/docs/features/approval-mode.md +10 -14
  4. package/bundled/qc-helper/docs/features/commands.md +33 -11
  5. package/bundled/qc-helper/docs/features/followup-suggestions.md +2 -2
  6. package/bundled/qc-helper/docs/features/sub-agents.md +32 -11
  7. package/bundled/qc-helper/docs/qwen-serve-deploy-local.md +221 -0
  8. package/bundled/qc-helper/docs/qwen-serve.md +234 -24
  9. package/chunks/{agent-QB7TZ4HW.js → agent-LOTJK6AH.js} +23 -23
  10. package/chunks/{agent-headless-APVHH7QM.js → agent-headless-TU3EPMYU.js} +23 -23
  11. package/chunks/{anthropicContentGenerator-M45EVVRM.js → anthropicContentGenerator-2HBRNQ3B.js} +7 -7
  12. package/chunks/{askUserQuestion-WM2KHM3K.js → askUserQuestion-OGCMIBQM.js} +45 -3
  13. package/chunks/{chunk-MVIVIPCU.js → chunk-2Y5SYSD3.js} +361 -583
  14. package/chunks/chunk-3DHXZ6EV.js +241 -0
  15. package/chunks/{chunk-JVQOQ3OU.js → chunk-3HTIVKZE.js} +1 -1
  16. package/chunks/{chunk-BNESGOSJ.js → chunk-55ZMG67I.js} +1 -1
  17. package/chunks/{chunk-ZK4AMNIU.js → chunk-6YIUGZTC.js} +1041 -210
  18. package/chunks/{chunk-C6WMLUNB.js → chunk-72LDN5PP.js} +1 -1
  19. package/chunks/{chunk-AVW55ZCO.js → chunk-7BCMOPIM.js} +11 -9
  20. package/chunks/{chunk-JUGRPQAB.js → chunk-A7B4ISQP.js} +1 -1
  21. package/chunks/{chunk-UAMOBVVW.js → chunk-B7HXHOHU.js} +1 -1
  22. package/chunks/{chunk-CNSMKPK6.js → chunk-BIVG75CP.js} +1 -1
  23. package/chunks/{chunk-LR62TEET.js → chunk-EYENRK4D.js} +1 -1
  24. package/chunks/{chunk-SZOEIL6S.js → chunk-H6BD2ELD.js} +1 -0
  25. package/chunks/{chunk-PAEBHDIO.js → chunk-HLPLOD42.js} +1 -1
  26. package/chunks/{chunk-JXAZUMDW.js → chunk-HR7SV7AY.js} +1 -2
  27. package/chunks/{chunk-P4J26VDS.js → chunk-IDX6COTE.js} +2 -2
  28. package/chunks/{chunk-QCG6KPNM.js → chunk-IWAYOW5Q.js} +14760 -10735
  29. package/chunks/{chunk-HGJPQK33.js → chunk-J5MDQKJL.js} +518 -519
  30. package/chunks/{chunk-USE2VQ5P.js → chunk-JTQAQBTV.js} +21 -0
  31. package/chunks/{chunk-HXJE7VOG.js → chunk-LBP46COL.js} +1001 -139
  32. package/chunks/{chunk-NW5QBUYO.js → chunk-LEJ42GNY.js} +14 -14
  33. package/chunks/{chunk-Y7R6H6FT.js → chunk-M6VTDSVR.js} +1 -1
  34. package/chunks/{chunk-CNHFPN7T.js → chunk-MFBBBTNY.js} +1 -1
  35. package/chunks/{chunk-ICOI4E4S.js → chunk-OHEGWO4L.js} +101 -23
  36. package/chunks/{chunk-7YKXFA3D.js → chunk-PL3MVCWD.js} +5 -5
  37. package/chunks/chunk-QQDPRDVW.js +25 -0
  38. package/chunks/{chunk-HV3ZZ7G4.js → chunk-R7ODSGTK.js} +2 -2
  39. package/chunks/{chunk-GX7VH5JQ.js → chunk-SEGYWKIH.js} +1 -1
  40. package/chunks/{chunk-KC6ZMJ5X.js → chunk-SNGELLWX.js} +1 -1
  41. package/chunks/chunk-XBY7E2FX.js +605 -0
  42. package/chunks/{chunk-2ZTWI7KH.js → chunk-XV4HCEVI.js} +22 -1
  43. package/chunks/{chunk-WFVXF3OM.js → chunk-Z2Z3GUXZ.js} +1 -0
  44. package/chunks/{chunk-CWV3SJZS.js → chunk-ZTZ4DDQE.js} +2 -2
  45. package/chunks/{computer-use-B7VIUI7F.js → computer-use-3RH2DOM6.js} +23 -23
  46. package/chunks/contextCommand-K347QT6O.js +52 -0
  47. package/chunks/{cron-create-FI5LJVUS.js → cron-create-YJL3KFWI.js} +3 -3
  48. package/chunks/{cron-delete-ZGUXWBTG.js → cron-delete-WKWSJZQA.js} +3 -3
  49. package/chunks/{cron-list-QNNZGMN3.js → cron-list-B52XEXAZ.js} +3 -3
  50. package/chunks/{devtools-IXE4UP72.js → devtools-FM6GJPYG.js} +1 -1
  51. package/chunks/{dist-R2SXPG74.js → dist-4LXD6L6X.js} +2 -2
  52. package/chunks/{dist-TE5QKMGR.js → dist-H6ONXVLG.js} +1 -1
  53. package/chunks/{dist-ZMQ4TXD5.js → dist-KAZ3SEBX.js} +2 -2
  54. package/chunks/{dist-BXDUQ2QY.js → dist-PK7DFCAW.js} +1 -1
  55. package/chunks/{edit-6UBTS2J5.js → edit-KU4PJGEX.js} +24 -24
  56. package/chunks/{en-HSQQNQUB.js → en-DHGYHIHX.js} +4 -0
  57. package/chunks/{enter-worktree-NN7LIXCM.js → enter-worktree-PPYIDCWI.js} +23 -23
  58. package/chunks/enterPlanMode-5CZDMCB4.js +158 -0
  59. package/chunks/{exit-worktree-GGSS5KIE.js → exit-worktree-UY3CGHKC.js} +23 -23
  60. package/chunks/exitPlanMode-3DN4QNSG.js +703 -0
  61. package/chunks/{geminiContentGenerator-I4H2NLJG.js → geminiContentGenerator-7A6I2RWB.js} +7 -7
  62. package/chunks/{getMachineId-bsd-F7GNPTER.js → getMachineId-bsd-4CASPIU4.js} +1 -1
  63. package/chunks/{getMachineId-darwin-T73DJL27.js → getMachineId-darwin-HPQPEMZR.js} +1 -1
  64. package/chunks/{getMachineId-linux-MKQTFPQM.js → getMachineId-linux-AUARKYHL.js} +1 -1
  65. package/chunks/{getMachineId-unsupported-MUR5KOQE.js → getMachineId-unsupported-S32ZDA2T.js} +1 -1
  66. package/chunks/{getMachineId-win-CDYFC6ZM.js → getMachineId-win-4EFLHYIJ.js} +1 -1
  67. package/chunks/{glob-OLCX57MD.js → glob-OFNQSS52.js} +23 -23
  68. package/chunks/{grep-7HXIMDOW.js → grep-6J2MSUM5.js} +26 -23
  69. package/chunks/{keychain-token-storage-LB46DAEK.js → keychain-token-storage-6IU6ORQN.js} +3 -3
  70. package/chunks/{ls-6PEZUK6O.js → ls-V3O6A5PT.js} +4 -4
  71. package/chunks/{lsp-JZSJOVT7.js → lsp-G2OCIFUA.js} +3 -3
  72. package/chunks/{monitor-SQO7MVAV.js → monitor-FKLHV423.js} +23 -23
  73. package/chunks/{notebook-edit-72L3EBAL.js → notebook-edit-KTBYFKWG.js} +24 -24
  74. package/chunks/{openaiContentGenerator-FTR7CDWF.js → openaiContentGenerator-L5KSWQY7.js} +15 -15
  75. package/chunks/{qwenContentGenerator-U5UFQ566.js → qwenContentGenerator-PYOXLMBW.js} +25 -25
  76. package/chunks/{qwenOAuth2-EFSECGHF.js → qwenOAuth2-2KCKWDCF.js} +6 -5
  77. package/chunks/{read-file-UA64EEQC.js → read-file-JQVRK4NU.js} +11 -11
  78. package/chunks/{ripGrep-WSYCWZVK.js → ripGrep-2L4LPNAJ.js} +23 -23
  79. package/chunks/{scheduler-VBASHOCA.js → scheduler-FGNXY4JQ.js} +23 -23
  80. package/chunks/{send-message-OYJZ5TPG.js → send-message-SZFWNOCL.js} +3 -3
  81. package/chunks/{serve-A7E2OJDR.js → serve-N2IBLA3G.js} +13581 -4977
  82. package/chunks/{shell-3NFOT6F5.js → shell-PTEG6UX4.js} +23 -23
  83. package/chunks/{skill-RA5YUREY.js → skill-X4NTK4NH.js} +64 -113
  84. package/chunks/{src-NFCMARMT.js → src-GLLQ3R5W.js} +154 -38
  85. package/chunks/{syntheticOutput-DETQ2YM6.js → syntheticOutput-IKAY5F6X.js} +4 -4
  86. package/chunks/{task-create-Y3ZKTJIG.js → task-create-MQICOJFV.js} +7 -7
  87. package/chunks/{task-list-ONXJ3I3A.js → task-list-RIHJCH32.js} +6 -6
  88. package/chunks/{task-stop-UHDC4N5B.js → task-stop-FWZRFANS.js} +3 -3
  89. package/chunks/{task-update-TCNOU3P5.js → task-update-2LHPXOYM.js} +20 -9
  90. package/chunks/{team-create-6SR4OVRG.js → team-create-2E4PF4KN.js} +26 -25
  91. package/chunks/{team-delete-EJ4U4DDP.js → team-delete-DAUDQS4J.js} +8 -6
  92. package/chunks/{todoWrite-TEYDRS5L.js → todoWrite-HTUACZES.js} +5 -5
  93. package/chunks/{tool-search-OD435A3X.js → tool-search-KTVULRES.js} +11 -11
  94. package/chunks/{web-fetch-6W67H5PO.js → web-fetch-CZ7LLKPE.js} +5 -5
  95. package/chunks/{workflow-62DHH4EO.js → workflow-L2ZUUDT2.js} +268 -16
  96. package/chunks/{write-file-475L5OPP.js → write-file-ZEB2JDYH.js} +24 -24
  97. package/chunks/{zh-VCLWO26Y.js → zh-7H5OQC4I.js} +5 -1
  98. package/chunks/{zh-TW-G3HFHVVT.js → zh-TW-P4IDHD3M.js} +5 -1
  99. package/cli.js +5955 -3128
  100. package/examples/starter/QWEN.md +30 -0
  101. package/examples/starter/README.md +59 -0
  102. package/examples/starter/agents/diary.md +86 -0
  103. package/examples/starter/commands/writing/polish.md +13 -0
  104. package/examples/starter/example.ts +64 -0
  105. package/examples/starter/package.json +18 -0
  106. package/examples/starter/qwen-extension.json +12 -0
  107. package/examples/starter/skills/synonyms/SKILL.md +48 -0
  108. package/examples/starter/tsconfig.json +13 -0
  109. package/fzfWorker.js +1083 -0
  110. package/locales/en.js +6 -0
  111. package/locales/zh-TW.js +5 -0
  112. package/locales/zh.js +5 -0
  113. package/package.json +3 -2
  114. package/chunks/chunk-AJIR24J2.js +0 -59
  115. package/chunks/chunk-XBFVXFB2.js +0 -216
  116. package/chunks/contextCommand-63RZ3O5R.js +0 -52
  117. package/chunks/exitPlanMode-H323NHB2.js +0 -235
@@ -1,23 +1,27 @@
1
1
  // Force strict mode and setup for ESM
2
2
  "use strict";
3
3
  import {
4
- getTasksDir
5
- } from "./chunk-XBFVXFB2.js";
4
+ INBOXES_DIR,
5
+ LEADER_NAME,
6
+ TASKS_DIR,
7
+ TEAMMATE_COLORS,
8
+ TEAMS_DIR,
9
+ TEAM_CONFIG_FILENAME
10
+ } from "./chunk-LD2XBG6Z.js";
6
11
  import {
7
12
  atomicWriteJSON
8
- } from "./chunk-UAMOBVVW.js";
13
+ } from "./chunk-B7HXHOHU.js";
9
14
  import {
10
- createDebugLogger,
15
+ Storage,
11
16
  isNodeError
12
- } from "./chunk-JXAZUMDW.js";
17
+ } from "./chunk-HR7SV7AY.js";
13
18
  import {
14
19
  init_esbuild_shims
15
20
  } from "./chunk-A4BMJM77.js";
16
21
  import {
17
22
  __commonJS,
18
23
  __name,
19
- __require,
20
- __toESM
24
+ __require
21
25
  } from "./chunk-J2S4EL5Y.js";
22
26
 
23
27
  // node_modules/graceful-fs/polyfills.js
@@ -88,7 +92,7 @@ var require_polyfills = __commonJS({
88
92
  }
89
93
  if (platform === "win32") {
90
94
  fs2.rename = typeof fs2.rename !== "function" ? fs2.rename : function(fs$rename) {
91
- function rename2(from, to, cb) {
95
+ function rename(from, to, cb) {
92
96
  var start = Date.now();
93
97
  var backoff = 0;
94
98
  fs$rename(from, to, /* @__PURE__ */ __name(function CB(er) {
@@ -108,9 +112,9 @@ var require_polyfills = __commonJS({
108
112
  if (cb) cb(er);
109
113
  }, "CB"));
110
114
  }
111
- __name(rename2, "rename");
112
- if (Object.setPrototypeOf) Object.setPrototypeOf(rename2, fs$rename);
113
- return rename2;
115
+ __name(rename, "rename");
116
+ if (Object.setPrototypeOf) Object.setPrototypeOf(rename, fs$rename);
117
+ return rename;
114
118
  }(fs2.rename);
115
119
  }
116
120
  fs2.read = typeof fs2.read !== "function" ? fs2.read : function(fs$read) {
@@ -476,11 +480,11 @@ var require_graceful_fs = __commonJS({
476
480
  });
477
481
  }
478
482
  __name(publishQueue, "publishQueue");
479
- var debug2 = noop;
483
+ var debug = noop;
480
484
  if (util.debuglog)
481
- debug2 = util.debuglog("gfs4");
485
+ debug = util.debuglog("gfs4");
482
486
  else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || ""))
483
- debug2 = /* @__PURE__ */ __name(function() {
487
+ debug = /* @__PURE__ */ __name(function() {
484
488
  var m = util.format.apply(util, arguments);
485
489
  m = "GFS4: " + m.split(/\n/).join("\nGFS4: ");
486
490
  console.error(m);
@@ -517,7 +521,7 @@ var require_graceful_fs = __commonJS({
517
521
  }(fs2.closeSync);
518
522
  if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || "")) {
519
523
  process.on("exit", function() {
520
- debug2(fs2[gracefulQueue]);
524
+ debug(fs2[gracefulQueue]);
521
525
  __require("assert").equal(fs2[gracefulQueue].length, 0);
522
526
  });
523
527
  }
@@ -556,8 +560,8 @@ var require_graceful_fs = __commonJS({
556
560
  }
557
561
  __name(readFile2, "readFile");
558
562
  var fs$writeFile = fs3.writeFile;
559
- fs3.writeFile = writeFile;
560
- function writeFile(path2, data, options, cb) {
563
+ fs3.writeFile = writeFile2;
564
+ function writeFile2(path2, data, options, cb) {
561
565
  if (typeof options === "function")
562
566
  cb = options, options = null;
563
567
  return go$writeFile(path2, data, options, cb);
@@ -573,7 +577,7 @@ var require_graceful_fs = __commonJS({
573
577
  }
574
578
  __name(go$writeFile, "go$writeFile");
575
579
  }
576
- __name(writeFile, "writeFile");
580
+ __name(writeFile2, "writeFile");
577
581
  var fs$appendFile = fs3.appendFile;
578
582
  if (fs$appendFile)
579
583
  fs3.appendFile = appendFile;
@@ -725,7 +729,7 @@ var require_graceful_fs = __commonJS({
725
729
  __name(ReadStream, "ReadStream");
726
730
  function ReadStream$open() {
727
731
  var that = this;
728
- open2(that.path, that.flags, that.mode, function(err, fd) {
732
+ open(that.path, that.flags, that.mode, function(err, fd) {
729
733
  if (err) {
730
734
  if (that.autoClose)
731
735
  that.destroy();
@@ -747,7 +751,7 @@ var require_graceful_fs = __commonJS({
747
751
  __name(WriteStream, "WriteStream");
748
752
  function WriteStream$open() {
749
753
  var that = this;
750
- open2(that.path, that.flags, that.mode, function(err, fd) {
754
+ open(that.path, that.flags, that.mode, function(err, fd) {
751
755
  if (err) {
752
756
  that.destroy();
753
757
  that.emit("error", err);
@@ -767,8 +771,8 @@ var require_graceful_fs = __commonJS({
767
771
  }
768
772
  __name(createWriteStream, "createWriteStream");
769
773
  var fs$open = fs3.open;
770
- fs3.open = open2;
771
- function open2(path2, flags, mode, cb) {
774
+ fs3.open = open;
775
+ function open(path2, flags, mode, cb) {
772
776
  if (typeof mode === "function")
773
777
  cb = mode, mode = null;
774
778
  return go$open(path2, flags, mode, cb);
@@ -784,12 +788,12 @@ var require_graceful_fs = __commonJS({
784
788
  }
785
789
  __name(go$open, "go$open");
786
790
  }
787
- __name(open2, "open");
791
+ __name(open, "open");
788
792
  return fs3;
789
793
  }
790
794
  __name(patch, "patch");
791
795
  function enqueue(elem) {
792
- debug2("ENQUEUE", elem[0].name, elem[1]);
796
+ debug("ENQUEUE", elem[0].name, elem[1]);
793
797
  fs2[gracefulQueue].push(elem);
794
798
  retry();
795
799
  }
@@ -818,10 +822,10 @@ var require_graceful_fs = __commonJS({
818
822
  var startTime = elem[3];
819
823
  var lastTime = elem[4];
820
824
  if (startTime === void 0) {
821
- debug2("RETRY", fn.name, args);
825
+ debug("RETRY", fn.name, args);
822
826
  fn.apply(null, args);
823
827
  } else if (Date.now() - startTime >= 6e4) {
824
- debug2("TIMEOUT", fn.name, args);
828
+ debug("TIMEOUT", fn.name, args);
825
829
  var cb = args.pop();
826
830
  if (typeof cb === "function")
827
831
  cb.call(null, err);
@@ -830,7 +834,7 @@ var require_graceful_fs = __commonJS({
830
834
  var sinceStart = Math.max(lastTime - startTime, 1);
831
835
  var desiredDelay = Math.min(sinceStart * 1.2, 100);
832
836
  if (sinceAttempt >= desiredDelay) {
833
- debug2("RETRY", fn.name, args);
837
+ debug("RETRY", fn.name, args);
834
838
  fn.apply(null, args.concat([startTime]));
835
839
  } else {
836
840
  fs2[gracefulQueue].push(elem);
@@ -1193,8 +1197,8 @@ var require_signal_exit = __commonJS({
1193
1197
  if (!processOk(globalThis.process)) {
1194
1198
  return;
1195
1199
  }
1196
- var listeners2 = process2.listeners(sig);
1197
- if (listeners2.length === emitter.count) {
1200
+ var listeners = process2.listeners(sig);
1201
+ if (listeners.length === emitter.count) {
1198
1202
  unload();
1199
1203
  emit("exit", null, sig);
1200
1204
  emit("afterexit", null, sig);
@@ -1639,32 +1643,32 @@ var require_proper_lockfile = __commonJS({
1639
1643
  "node_modules/proper-lockfile/index.js"(exports, module) {
1640
1644
  "use strict";
1641
1645
  init_esbuild_shims();
1642
- var lockfile2 = require_lockfile();
1646
+ var lockfile = require_lockfile();
1643
1647
  var { toPromise, toSync, toSyncOptions } = require_adapter();
1644
1648
  async function lock(file, options) {
1645
- const release = await toPromise(lockfile2.lock)(file, options);
1649
+ const release = await toPromise(lockfile.lock)(file, options);
1646
1650
  return toPromise(release);
1647
1651
  }
1648
1652
  __name(lock, "lock");
1649
1653
  function lockSync(file, options) {
1650
- const release = toSync(lockfile2.lock)(file, toSyncOptions(options));
1654
+ const release = toSync(lockfile.lock)(file, toSyncOptions(options));
1651
1655
  return toSync(release);
1652
1656
  }
1653
1657
  __name(lockSync, "lockSync");
1654
1658
  function unlock(file, options) {
1655
- return toPromise(lockfile2.unlock)(file, options);
1659
+ return toPromise(lockfile.unlock)(file, options);
1656
1660
  }
1657
1661
  __name(unlock, "unlock");
1658
1662
  function unlockSync(file, options) {
1659
- return toSync(lockfile2.unlock)(file, toSyncOptions(options));
1663
+ return toSync(lockfile.unlock)(file, toSyncOptions(options));
1660
1664
  }
1661
1665
  __name(unlockSync, "unlockSync");
1662
1666
  function check(file, options) {
1663
- return toPromise(lockfile2.check)(file, options);
1667
+ return toPromise(lockfile.check)(file, options);
1664
1668
  }
1665
1669
  __name(check, "check");
1666
1670
  function checkSync(file, options) {
1667
- return toSync(lockfile2.check)(file, toSyncOptions(options));
1671
+ return toSync(lockfile.check)(file, toSyncOptions(options));
1668
1672
  }
1669
1673
  __name(checkSync, "checkSync");
1670
1674
  module.exports = lock;
@@ -1677,552 +1681,547 @@ var require_proper_lockfile = __commonJS({
1677
1681
  }
1678
1682
  });
1679
1683
 
1680
- // packages/core/src/agents/team/tasks.ts
1684
+ // packages/core/src/agents/team/teamHelpers.ts
1681
1685
  init_esbuild_shims();
1682
- var import_proper_lockfile = __toESM(require_proper_lockfile(), 1);
1683
1686
  import * as fs from "node:fs/promises";
1684
- import { constants as fsConstants } from "node:fs";
1685
1687
  import * as path from "node:path";
1686
- var debug = createDebugLogger("AGENTS_TEAM_TASKS");
1687
- var MAX_METADATA_BYTES = 32768;
1688
- var MAX_PARALLEL_TASK_READS = 16;
1689
- function assertMetadataWithinLimit(metadata) {
1690
- if (!metadata) return;
1691
- const size = Buffer.byteLength(JSON.stringify(metadata), "utf-8");
1692
- if (size > MAX_METADATA_BYTES) {
1688
+ function getTeamsRootDir() {
1689
+ return path.join(Storage.getGlobalQwenDir(), TEAMS_DIR);
1690
+ }
1691
+ __name(getTeamsRootDir, "getTeamsRootDir");
1692
+ function getTeamDir(teamName) {
1693
+ return path.join(getTeamsRootDir(), teamName);
1694
+ }
1695
+ __name(getTeamDir, "getTeamDir");
1696
+ function getTeamFilePath(teamName) {
1697
+ return path.join(getTeamDir(teamName), TEAM_CONFIG_FILENAME);
1698
+ }
1699
+ __name(getTeamFilePath, "getTeamFilePath");
1700
+ function getInboxesDir(teamName) {
1701
+ return path.join(getTeamDir(teamName), INBOXES_DIR);
1702
+ }
1703
+ __name(getInboxesDir, "getInboxesDir");
1704
+ function getTasksDir(teamName) {
1705
+ return path.join(Storage.getGlobalQwenDir(), TASKS_DIR, teamName);
1706
+ }
1707
+ __name(getTasksDir, "getTasksDir");
1708
+ function sanitizeName(name) {
1709
+ return name.toLowerCase().replace(/[^a-z0-9-]/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
1710
+ }
1711
+ __name(sanitizeName, "sanitizeName");
1712
+ function formatAgentId(name, teamName) {
1713
+ return `${sanitizeName(name)}@${sanitizeName(teamName)}`;
1714
+ }
1715
+ __name(formatAgentId, "formatAgentId");
1716
+ function generateUniqueTeammateName(baseName, existingMembers) {
1717
+ const sanitized = sanitizeName(baseName);
1718
+ if (!sanitized) {
1693
1719
  throw new Error(
1694
- `Task metadata is too large (${size} bytes; max ${MAX_METADATA_BYTES}). Trim the payload or store the bulk content elsewhere.`
1720
+ `Teammate name "${baseName}" sanitizes to an empty string. Choose a name with at least one alphanumeric character.`
1695
1721
  );
1696
1722
  }
1697
- }
1698
- __name(assertMetadataWithinLimit, "assertMetadataWithinLimit");
1699
- var LOCK_OPTIONS = {
1700
- retries: {
1701
- retries: 30,
1702
- minTimeout: 5,
1703
- maxTimeout: 100,
1704
- factor: 2
1705
- },
1706
- stale: 5e3,
1707
- onCompromised: /* @__PURE__ */ __name((err) => {
1708
- debug.warn("task lock compromised:", err?.message ?? err);
1709
- }, "onCompromised")
1710
- };
1711
- function assertValidTaskId(taskId) {
1712
- if (!/^[1-9]\d*$/.test(taskId)) {
1723
+ if (sanitized === LEADER_NAME) {
1713
1724
  throw new Error(
1714
- `Invalid task ID "${taskId}". Task IDs must be positive integers.`
1725
+ `"${LEADER_NAME}" is reserved for the team leader. Choose a different teammate name.`
1715
1726
  );
1716
1727
  }
1717
- }
1718
- __name(assertValidTaskId, "assertValidTaskId");
1719
- function getTaskPath(teamName, taskId) {
1720
- assertValidTaskId(taskId);
1721
- return path.join(getTasksDir(teamName), `${taskId}.json`);
1722
- }
1723
- __name(getTaskPath, "getTaskPath");
1724
- var listeners = /* @__PURE__ */ new Set();
1725
- function onTasksUpdated(listener) {
1726
- listeners.add(listener);
1727
- return () => {
1728
- listeners.delete(listener);
1729
- };
1730
- }
1731
- __name(onTasksUpdated, "onTasksUpdated");
1732
- function notifyTasksUpdated(teamName) {
1733
- for (const listener of listeners) {
1734
- try {
1735
- listener(teamName);
1736
- } catch (err) {
1737
- debug.warn(`task update listener failed: ${err}`);
1738
- }
1728
+ const existingNames = new Set(existingMembers.map((m) => m.name));
1729
+ if (existingNames.has(sanitized)) {
1730
+ const existingList = [...existingNames].join(", ") || "<none>";
1731
+ throw new Error(
1732
+ `A teammate named "${sanitized}" already exists in this team (existing: ${existingList}). Choose a different name.`
1733
+ );
1739
1734
  }
1735
+ return sanitized;
1740
1736
  }
1741
- __name(notifyTasksUpdated, "notifyTasksUpdated");
1742
- async function createTask(teamName, opts) {
1743
- assertMetadataWithinLimit(opts.metadata);
1744
- const dir = getTasksDir(teamName);
1745
- await fs.mkdir(dir, { recursive: true });
1746
- const MAX_RETRIES = 15;
1747
- for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
1748
- const nextId = await getNextTaskId(dir);
1749
- const task = {
1750
- id: nextId,
1751
- subject: opts.subject,
1752
- description: opts.description,
1753
- activeForm: opts.activeForm,
1754
- owner: opts.owner,
1755
- status: "pending",
1756
- blocks: [],
1757
- blockedBy: [],
1758
- metadata: opts.metadata
1759
- };
1760
- const taskPath = path.join(dir, `${nextId}.json`);
1761
- try {
1762
- const handle = await fs.open(
1763
- taskPath,
1764
- fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL
1765
- );
1766
- await handle.close();
1767
- } catch (err) {
1768
- if (isNodeError(err) && err.code === "EEXIST") {
1769
- continue;
1770
- }
1771
- throw err;
1772
- }
1773
- try {
1774
- await atomicWriteJSON(taskPath, task);
1775
- } catch (err) {
1776
- await fs.unlink(taskPath).catch(() => {
1777
- });
1778
- throw err;
1737
+ __name(generateUniqueTeammateName, "generateUniqueTeammateName");
1738
+ function assignTeammateColor(existingMembers) {
1739
+ const usedColors = new Set(
1740
+ existingMembers.map((m) => m.color).filter((c) => c !== void 0)
1741
+ );
1742
+ for (const color of TEAMMATE_COLORS) {
1743
+ if (!usedColors.has(color)) {
1744
+ return color;
1779
1745
  }
1780
- notifyTasksUpdated(teamName);
1781
- return task;
1782
1746
  }
1783
- throw new Error(
1784
- `Failed to create task after ${MAX_RETRIES} attempts (ID contention).`
1785
- );
1747
+ return TEAMMATE_COLORS[existingMembers.length % TEAMMATE_COLORS.length];
1786
1748
  }
1787
- __name(createTask, "createTask");
1788
- async function getTask(teamName, taskId) {
1789
- const taskPath = getTaskPath(teamName, taskId);
1749
+ __name(assignTeammateColor, "assignTeammateColor");
1750
+ function clearTeammateColors(members) {
1751
+ return members.map((m) => {
1752
+ const { color: _, ...rest } = m;
1753
+ return rest;
1754
+ });
1755
+ }
1756
+ __name(clearTeammateColors, "clearTeammateColors");
1757
+ function setMemberActive(members, agentId, isActive) {
1758
+ return members.map((m) => m.agentId === agentId ? { ...m, isActive } : m);
1759
+ }
1760
+ __name(setMemberActive, "setMemberActive");
1761
+ function findMemberById(members, agentId) {
1762
+ return members.find((m) => m.agentId === agentId);
1763
+ }
1764
+ __name(findMemberById, "findMemberById");
1765
+ function findMemberByName(members, name) {
1766
+ const sanitized = sanitizeName(name);
1767
+ return members.find((m) => m.name === sanitized);
1768
+ }
1769
+ __name(findMemberByName, "findMemberByName");
1770
+ function classifyShutdownResponse(message) {
1771
+ const trimmed = message.trimStart();
1772
+ if (/^shutdown_approved\b/i.test(trimmed)) return "shutdown_approved";
1773
+ if (/^shutdown_rejected\b/i.test(trimmed)) return "shutdown_rejected";
1774
+ return void 0;
1775
+ }
1776
+ __name(classifyShutdownResponse, "classifyShutdownResponse");
1777
+ async function readTeamFile(teamName) {
1778
+ const filePath = getTeamFilePath(teamName);
1790
1779
  try {
1791
- const raw = await fs.readFile(taskPath, "utf-8");
1780
+ const raw = await fs.readFile(filePath, "utf-8");
1792
1781
  return JSON.parse(raw);
1793
1782
  } catch (err) {
1794
- if (isNodeError(err) && err.code === "ENOENT") return void 0;
1783
+ if (isNodeError(err) && err.code === "ENOENT") {
1784
+ return void 0;
1785
+ }
1795
1786
  throw err;
1796
1787
  }
1797
1788
  }
1798
- __name(getTask, "getTask");
1799
- var TaskOwnershipError = class extends Error {
1800
- constructor(taskId, callerName, actualOwner) {
1801
- super(
1802
- `Task #${taskId} is owned by "${actualOwner}". Only the leader or the owner can change status / owner / subject / description / blocks.`
1803
- );
1804
- this.taskId = taskId;
1805
- this.callerName = callerName;
1806
- this.actualOwner = actualOwner;
1807
- this.name = "TaskOwnershipError";
1808
- }
1809
- static {
1810
- __name(this, "TaskOwnershipError");
1811
- }
1812
- };
1813
- async function updateTask(teamName, taskId, updates, opts) {
1814
- const taskPath = getTaskPath(teamName, taskId);
1815
- let release;
1789
+ __name(readTeamFile, "readTeamFile");
1790
+ async function writeTeamFile(teamName, teamFile) {
1791
+ const filePath = getTeamFilePath(teamName);
1792
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
1793
+ await atomicWriteJSON(filePath, teamFile);
1794
+ }
1795
+ __name(writeTeamFile, "writeTeamFile");
1796
+ async function createTeamFile(teamName, teamFile) {
1797
+ const filePath = getTeamFilePath(teamName);
1798
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
1799
+ await fs.writeFile(filePath, JSON.stringify(teamFile, null, 2) + "\n", {
1800
+ encoding: "utf-8",
1801
+ flag: "wx"
1802
+ });
1803
+ }
1804
+ __name(createTeamFile, "createTeamFile");
1805
+ function isPidAlive(pid) {
1816
1806
  try {
1817
- release = await import_proper_lockfile.default.lock(taskPath, LOCK_OPTIONS);
1807
+ process.kill(pid, 0);
1808
+ return true;
1818
1809
  } catch (err) {
1819
- if (isNodeError(err) && err.code === "ENOENT") return void 0;
1820
- throw err;
1821
- }
1822
- try {
1823
- let raw;
1824
- try {
1825
- raw = await fs.readFile(taskPath, "utf-8");
1826
- } catch (err) {
1827
- if (isNodeError(err) && err.code === "ENOENT") return void 0;
1828
- throw err;
1829
- }
1830
- const task = JSON.parse(raw);
1831
- if (opts?.callerName !== void 0) {
1832
- const restrictsOwnership = updates.status !== void 0 || updates.owner !== void 0 || updates.subject !== void 0 || updates.description !== void 0 || (updates.addBlocks?.length ?? 0) > 0 || (updates.addBlockedBy?.length ?? 0) > 0;
1833
- if (restrictsOwnership && task.owner && task.owner !== opts.callerName) {
1834
- throw new TaskOwnershipError(taskId, opts.callerName, task.owner);
1835
- }
1836
- }
1837
- if (updates.addBlocks?.length) {
1838
- const blockSet = new Set(task.blocks);
1839
- for (const id of updates.addBlocks) blockSet.add(id);
1840
- task.blocks = Array.from(blockSet);
1841
- }
1842
- if (updates.addBlockedBy?.length) {
1843
- const blockedBySet = new Set(task.blockedBy);
1844
- for (const id of updates.addBlockedBy) blockedBySet.add(id);
1845
- task.blockedBy = Array.from(blockedBySet);
1846
- }
1847
- if (updates.status !== void 0) {
1848
- task.status = updates.status;
1849
- if (updates.status === "completed" && task.blocks.length > 0) {
1850
- await unblockDependents(teamName, taskId, task.blocks);
1851
- }
1852
- }
1853
- if (updates.owner !== void 0) {
1854
- task.owner = updates.owner ? updates.owner : void 0;
1855
- }
1856
- if (updates.subject !== void 0) {
1857
- task.subject = updates.subject;
1858
- }
1859
- if (updates.description !== void 0) {
1860
- task.description = updates.description;
1861
- }
1862
- if (updates.activeForm !== void 0) {
1863
- task.activeForm = updates.activeForm ?? void 0;
1864
- }
1865
- if (updates.metadata !== void 0) {
1866
- task.metadata = task.metadata ?? {};
1867
- for (const [key, value] of Object.entries(updates.metadata)) {
1868
- if (key === "__proto__" || key === "constructor" || key === "prototype") {
1869
- continue;
1870
- }
1871
- if (value === null) {
1872
- delete task.metadata[key];
1873
- } else {
1874
- task.metadata[key] = value;
1875
- }
1876
- }
1877
- if (Object.keys(task.metadata).length === 0) {
1878
- task.metadata = void 0;
1879
- }
1880
- assertMetadataWithinLimit(task.metadata);
1881
- }
1882
- await atomicWriteJSON(taskPath, task);
1883
- notifyTasksUpdated(teamName);
1884
- return task;
1885
- } finally {
1886
- await release?.();
1810
+ return isNodeError(err) && err.code === "EPERM";
1887
1811
  }
1888
1812
  }
1889
- __name(updateTask, "updateTask");
1890
- async function deleteTask(teamName, taskId, opts) {
1891
- const taskPath = getTaskPath(teamName, taskId);
1892
- let release;
1813
+ __name(isPidAlive, "isPidAlive");
1814
+ async function tryReclaimStaleTeam(teamName) {
1815
+ let existing;
1893
1816
  try {
1894
- release = await import_proper_lockfile.default.lock(taskPath, LOCK_OPTIONS);
1895
- } catch (err) {
1896
- if (isNodeError(err) && err.code === "ENOENT") return false;
1897
- throw err;
1817
+ existing = await readTeamFile(teamName);
1818
+ } catch {
1819
+ return false;
1898
1820
  }
1899
- let dependentIds = /* @__PURE__ */ new Set();
1900
- try {
1901
- let task;
1902
- try {
1903
- const raw = await fs.readFile(taskPath, "utf-8");
1904
- task = JSON.parse(raw);
1905
- } catch (err) {
1906
- if (isNodeError(err) && err.code === "ENOENT") return false;
1907
- throw err;
1908
- }
1909
- if (opts?.callerName !== void 0 && task.owner && task.owner !== opts.callerName) {
1910
- throw new TaskOwnershipError(taskId, opts.callerName, task.owner);
1911
- }
1912
- dependentIds = /* @__PURE__ */ new Set([...task.blocks, ...task.blockedBy]);
1913
- dependentIds.delete(taskId);
1914
- try {
1915
- await fs.unlink(taskPath);
1916
- } catch (err) {
1917
- if (isNodeError(err) && err.code === "ENOENT") return false;
1918
- throw err;
1919
- }
1920
- } finally {
1921
- await release();
1821
+ if (!existing) {
1822
+ await deleteTeamDirs(teamName);
1823
+ return true;
1922
1824
  }
1923
- const results = await Promise.allSettled(
1924
- Array.from(dependentIds).map(
1925
- (depId) => removeEdgesReferencing(teamName, depId, taskId)
1926
- )
1927
- );
1928
- for (const r of results) {
1929
- if (r.status === "rejected") {
1930
- debug.warn(`deleteTask(${taskId}): edge cleanup failed: ${r.reason}`);
1931
- }
1825
+ if (typeof existing.leadPid !== "number" || existing.leadPid <= 0) {
1826
+ return false;
1827
+ }
1828
+ if (existing.leadPid !== process.pid && isPidAlive(existing.leadPid)) {
1829
+ return false;
1932
1830
  }
1933
- notifyTasksUpdated(teamName);
1831
+ await deleteTeamDirs(teamName);
1934
1832
  return true;
1935
1833
  }
1936
- __name(deleteTask, "deleteTask");
1937
- async function removeEdgesReferencing(teamName, targetId, referencedId) {
1938
- const depPath = getTaskPath(teamName, targetId);
1939
- let release;
1940
- try {
1941
- release = await import_proper_lockfile.default.lock(depPath, LOCK_OPTIONS);
1942
- } catch (err) {
1943
- if (isNodeError(err) && err.code === "ENOENT") return;
1944
- throw err;
1945
- }
1946
- try {
1947
- const raw = await fs.readFile(depPath, "utf-8");
1948
- const task = JSON.parse(raw);
1949
- const beforeBlocks = task.blocks.length;
1950
- const beforeBlockedBy = task.blockedBy.length;
1951
- task.blocks = task.blocks.filter((id) => id !== referencedId);
1952
- task.blockedBy = task.blockedBy.filter((id) => id !== referencedId);
1953
- if (task.blocks.length === beforeBlocks && task.blockedBy.length === beforeBlockedBy) {
1954
- return;
1955
- }
1956
- await atomicWriteJSON(depPath, task);
1957
- } catch (err) {
1958
- if (isNodeError(err) && err.code === "ENOENT") return;
1959
- throw err;
1960
- } finally {
1961
- await release?.();
1962
- }
1834
+ __name(tryReclaimStaleTeam, "tryReclaimStaleTeam");
1835
+ async function deleteTeamDirs(teamName) {
1836
+ const teamDir = getTeamDir(teamName);
1837
+ const tasksDir = getTasksDir(teamName);
1838
+ await Promise.allSettled([
1839
+ fs.rm(teamDir, { recursive: true, force: true }),
1840
+ fs.rm(tasksDir, { recursive: true, force: true })
1841
+ ]);
1963
1842
  }
1964
- __name(removeEdgesReferencing, "removeEdgesReferencing");
1965
- async function listTasks(teamName, filters) {
1966
- const dir = getTasksDir(teamName);
1967
- let entries;
1843
+ __name(deleteTeamDirs, "deleteTeamDirs");
1844
+ async function listTeamNames() {
1845
+ const teamsRoot = getTeamsRootDir();
1968
1846
  try {
1969
- entries = await fs.readdir(dir);
1970
- } catch (err) {
1971
- if (isNodeError(err) && err.code === "ENOENT") return [];
1972
- const errMsg = err instanceof Error ? err.message : String(err);
1973
- debug.warn(`Failed to list tasks dir ${dir}: ${errMsg}`);
1974
- throw err instanceof Error ? err : new Error(errMsg);
1847
+ const entries = await fs.readdir(teamsRoot, {
1848
+ withFileTypes: true
1849
+ });
1850
+ return entries.filter((e) => e.isDirectory()).map((e) => e.name);
1851
+ } catch {
1852
+ return [];
1975
1853
  }
1976
- const jsonEntries = entries.filter((e) => e.endsWith(".json"));
1977
- const reads = [];
1978
- for (let i = 0; i < jsonEntries.length; i += MAX_PARALLEL_TASK_READS) {
1979
- const batch = jsonEntries.slice(i, i + MAX_PARALLEL_TASK_READS);
1980
- const batchReads = await Promise.all(
1981
- batch.map(async (entry) => {
1982
- const filePath = path.join(dir, entry);
1983
- let raw;
1984
- try {
1985
- raw = await fs.readFile(filePath, "utf-8");
1986
- } catch (err) {
1987
- if (isNodeError(err) && err.code === "ENOENT") return void 0;
1988
- const errMsg = err instanceof Error ? err.message : String(err);
1989
- debug.warn(`Failed to read task file ${filePath}: ${errMsg}`);
1990
- return void 0;
1991
- }
1992
- if (raw.trim() === "") {
1993
- return void 0;
1994
- }
1995
- try {
1996
- return JSON.parse(raw);
1997
- } catch (err) {
1998
- const errMsg = err instanceof Error ? err.message : String(err);
1999
- debug.warn(`Quarantining corrupt task file ${filePath}: ${errMsg}`);
2000
- const quarantined = `${filePath}.corrupt-${Date.now()}`;
2001
- try {
2002
- await fs.rename(filePath, quarantined);
2003
- } catch (renameErr) {
2004
- const renameMsg = renameErr instanceof Error ? renameErr.message : String(renameErr);
2005
- debug.warn(`Failed to quarantine ${filePath}: ${renameMsg}`);
2006
- }
2007
- return void 0;
2008
- }
2009
- })
2010
- );
2011
- reads.push(...batchReads);
1854
+ }
1855
+ __name(listTeamNames, "listTeamNames");
1856
+
1857
+ // node_modules/async-mutex/index.mjs
1858
+ init_esbuild_shims();
1859
+ var E_TIMEOUT = new Error("timeout while waiting for mutex to become available");
1860
+ var E_ALREADY_LOCKED = new Error("mutex already locked");
1861
+ var E_CANCELED = new Error("request for lock canceled");
1862
+ var __awaiter$2 = function(thisArg, _arguments, P, generator) {
1863
+ function adopt(value) {
1864
+ return value instanceof P ? value : new P(function(resolve) {
1865
+ resolve(value);
1866
+ });
2012
1867
  }
2013
- const tasks = reads.filter((t) => t !== void 0);
2014
- tasks.sort((a, b) => Number(a.id) - Number(b.id));
2015
- if (!filters) return tasks;
2016
- return tasks.filter((t) => {
2017
- if (filters.status !== void 0 && t.status !== filters.status) {
2018
- return false;
1868
+ __name(adopt, "adopt");
1869
+ return new (P || (P = Promise))(function(resolve, reject) {
1870
+ function fulfilled(value) {
1871
+ try {
1872
+ step(generator.next(value));
1873
+ } catch (e) {
1874
+ reject(e);
1875
+ }
2019
1876
  }
2020
- if (filters.owner !== void 0 && t.owner !== filters.owner) {
2021
- return false;
1877
+ __name(fulfilled, "fulfilled");
1878
+ function rejected(value) {
1879
+ try {
1880
+ step(generator["throw"](value));
1881
+ } catch (e) {
1882
+ reject(e);
1883
+ }
2022
1884
  }
2023
- if (filters.blockedBy !== void 0 && !t.blockedBy.includes(filters.blockedBy)) {
2024
- return false;
1885
+ __name(rejected, "rejected");
1886
+ function step(result) {
1887
+ result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
2025
1888
  }
2026
- return true;
1889
+ __name(step, "step");
1890
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
2027
1891
  });
2028
- }
2029
- __name(listTasks, "listTasks");
2030
- async function resetTaskList(teamName) {
2031
- const dir = getTasksDir(teamName);
2032
- await fs.rm(dir, { recursive: true, force: true });
2033
- notifyTasksUpdated(teamName);
2034
- }
2035
- __name(resetTaskList, "resetTaskList");
2036
- async function unblockDependents(teamName, completedId, dependentIds) {
2037
- const results = await Promise.allSettled(
2038
- dependentIds.map(async (depId) => {
2039
- const depPath = getTaskPath(teamName, depId);
2040
- let release;
2041
- try {
2042
- release = await import_proper_lockfile.default.lock(depPath, LOCK_OPTIONS);
2043
- } catch (err) {
2044
- if (isNodeError(err) && err.code === "ENOENT") return;
2045
- throw err;
1892
+ };
1893
+ var Semaphore = class {
1894
+ static {
1895
+ __name(this, "Semaphore");
1896
+ }
1897
+ constructor(_value, _cancelError = E_CANCELED) {
1898
+ this._value = _value;
1899
+ this._cancelError = _cancelError;
1900
+ this._queue = [];
1901
+ this._weightedWaiters = [];
1902
+ }
1903
+ acquire(weight = 1, priority = 0) {
1904
+ if (weight <= 0)
1905
+ throw new Error(`invalid weight ${weight}: must be positive`);
1906
+ return new Promise((resolve, reject) => {
1907
+ const task = { resolve, reject, weight, priority };
1908
+ const i = findIndexFromEnd(this._queue, (other) => priority <= other.priority);
1909
+ if (i === -1 && weight <= this._value) {
1910
+ this._dispatchItem(task);
1911
+ } else {
1912
+ this._queue.splice(i + 1, 0, task);
2046
1913
  }
1914
+ });
1915
+ }
1916
+ runExclusive(callback_1) {
1917
+ return __awaiter$2(this, arguments, void 0, function* (callback, weight = 1, priority = 0) {
1918
+ const [value, release] = yield this.acquire(weight, priority);
2047
1919
  try {
2048
- const raw = await fs.readFile(depPath, "utf-8");
2049
- const task = JSON.parse(raw);
2050
- const before = task.blockedBy.length;
2051
- task.blockedBy = task.blockedBy.filter((id) => id !== completedId);
2052
- if (task.blockedBy.length === before) return;
2053
- await atomicWriteJSON(depPath, task);
1920
+ return yield callback(value);
2054
1921
  } finally {
2055
- await release?.();
1922
+ release();
2056
1923
  }
2057
- })
2058
- );
2059
- for (const r of results) {
2060
- if (r.status === "rejected") {
2061
- debug.warn(`unblockDependents(${completedId}): ${r.reason}`);
1924
+ });
1925
+ }
1926
+ waitForUnlock(weight = 1, priority = 0) {
1927
+ if (weight <= 0)
1928
+ throw new Error(`invalid weight ${weight}: must be positive`);
1929
+ if (this._couldLockImmediately(weight, priority)) {
1930
+ return Promise.resolve();
1931
+ } else {
1932
+ return new Promise((resolve) => {
1933
+ if (!this._weightedWaiters[weight - 1])
1934
+ this._weightedWaiters[weight - 1] = [];
1935
+ insertSorted(this._weightedWaiters[weight - 1], { resolve, priority });
1936
+ });
2062
1937
  }
2063
1938
  }
2064
- notifyTasksUpdated(teamName);
2065
- }
2066
- __name(unblockDependents, "unblockDependents");
2067
- async function blockTask(teamName, fromId, toId) {
2068
- await updateTask(teamName, fromId, { addBlocks: [toId] });
2069
- await updateTask(teamName, toId, { addBlockedBy: [fromId] });
2070
- }
2071
- __name(blockTask, "blockTask");
2072
- async function claimTask(teamName, taskId, agentId, opts) {
2073
- if (opts?.checkAgentBusy) {
2074
- const busy = await isAgentBusy(teamName, agentId);
2075
- if (busy) return void 0;
1939
+ isLocked() {
1940
+ return this._value <= 0;
2076
1941
  }
2077
- const taskPath = getTaskPath(teamName, taskId);
2078
- let release;
2079
- try {
2080
- release = await import_proper_lockfile.default.lock(taskPath, LOCK_OPTIONS);
2081
- } catch (err) {
2082
- if (isNodeError(err) && err.code === "ENOENT") return void 0;
2083
- throw err;
1942
+ getValue() {
1943
+ return this._value;
2084
1944
  }
2085
- try {
2086
- let raw;
2087
- try {
2088
- raw = await fs.readFile(taskPath, "utf-8");
2089
- } catch (err) {
2090
- if (isNodeError(err) && err.code === "ENOENT") return void 0;
2091
- throw err;
2092
- }
2093
- const task = JSON.parse(raw);
2094
- if (task.status !== "pending") return void 0;
2095
- if (task.owner) return void 0;
2096
- task.owner = opts?.ownerName ?? agentId;
2097
- task.status = "in_progress";
2098
- await atomicWriteJSON(taskPath, task);
2099
- notifyTasksUpdated(teamName);
2100
- return task;
2101
- } finally {
2102
- await release?.();
1945
+ setValue(value) {
1946
+ this._value = value;
1947
+ this._dispatchQueue();
2103
1948
  }
2104
- }
2105
- __name(claimTask, "claimTask");
2106
- async function isAgentBusy(teamName, agentId) {
2107
- const inProgress = await listTasks(teamName, {
2108
- status: "in_progress"
2109
- });
2110
- const bareName = agentId.split("@")[0];
2111
- return inProgress.some((t) => t.owner === agentId || t.owner === bareName);
2112
- }
2113
- __name(isAgentBusy, "isAgentBusy");
2114
- async function releaseOwnedTask(teamName, taskId, expectedOwner) {
2115
- const taskPath = getTaskPath(teamName, taskId);
2116
- let release;
2117
- try {
2118
- release = await import_proper_lockfile.default.lock(taskPath, LOCK_OPTIONS);
2119
- } catch (err) {
2120
- if (isNodeError(err) && err.code === "ENOENT") return false;
2121
- throw err;
1949
+ release(weight = 1) {
1950
+ if (weight <= 0)
1951
+ throw new Error(`invalid weight ${weight}: must be positive`);
1952
+ this._value += weight;
1953
+ this._dispatchQueue();
2122
1954
  }
2123
- try {
2124
- let raw;
2125
- try {
2126
- raw = await fs.readFile(taskPath, "utf-8");
2127
- } catch (err) {
2128
- if (isNodeError(err) && err.code === "ENOENT") return false;
2129
- throw err;
1955
+ cancel() {
1956
+ this._queue.forEach((entry) => entry.reject(this._cancelError));
1957
+ this._queue = [];
1958
+ }
1959
+ _dispatchQueue() {
1960
+ this._drainUnlockWaiters();
1961
+ while (this._queue.length > 0 && this._queue[0].weight <= this._value) {
1962
+ this._dispatchItem(this._queue.shift());
1963
+ this._drainUnlockWaiters();
2130
1964
  }
2131
- const task = JSON.parse(raw);
2132
- if (task.status !== "in_progress") return false;
2133
- if (task.owner !== expectedOwner) return false;
2134
- task.owner = void 0;
2135
- task.status = "pending";
2136
- await atomicWriteJSON(taskPath, task);
2137
- return true;
2138
- } finally {
2139
- await release?.();
2140
1965
  }
2141
- }
2142
- __name(releaseOwnedTask, "releaseOwnedTask");
2143
- async function unassignTeammateTasks(teamName, agentId) {
2144
- const bareName = agentId.split("@")[0];
2145
- const inProgress = await listTasks(teamName, {
2146
- status: "in_progress"
2147
- });
2148
- const owned = inProgress.filter(
2149
- (task) => task.owner === agentId || task.owner === bareName
2150
- );
2151
- const results = await Promise.allSettled(
2152
- owned.map((task) => releaseOwnedTask(teamName, task.id, task.owner))
2153
- );
2154
- const failed = results.filter((r) => r.status === "rejected");
2155
- if (failed.length > 0) {
2156
- debug.warn(
2157
- `unassignTeammateTasks: ${failed.length}/${owned.length} task(s) failed to unassign for ${agentId}`
2158
- );
1966
+ _dispatchItem(item) {
1967
+ const previousValue = this._value;
1968
+ this._value -= item.weight;
1969
+ item.resolve([previousValue, this._newReleaser(item.weight)]);
2159
1970
  }
2160
- const released = results.filter(
2161
- (r) => r.status === "fulfilled" && r.value === true
2162
- ).length;
2163
- if (released > 0) {
2164
- notifyTasksUpdated(teamName);
1971
+ _newReleaser(weight) {
1972
+ let called = false;
1973
+ return () => {
1974
+ if (called)
1975
+ return;
1976
+ called = true;
1977
+ this.release(weight);
1978
+ };
2165
1979
  }
2166
- return released;
1980
+ _drainUnlockWaiters() {
1981
+ if (this._queue.length === 0) {
1982
+ for (let weight = this._value; weight > 0; weight--) {
1983
+ const waiters = this._weightedWaiters[weight - 1];
1984
+ if (!waiters)
1985
+ continue;
1986
+ waiters.forEach((waiter) => waiter.resolve());
1987
+ this._weightedWaiters[weight - 1] = [];
1988
+ }
1989
+ } else {
1990
+ const queuedPriority = this._queue[0].priority;
1991
+ for (let weight = this._value; weight > 0; weight--) {
1992
+ const waiters = this._weightedWaiters[weight - 1];
1993
+ if (!waiters)
1994
+ continue;
1995
+ const i = waiters.findIndex((waiter) => waiter.priority <= queuedPriority);
1996
+ (i === -1 ? waiters : waiters.splice(0, i)).forEach((waiter) => waiter.resolve());
1997
+ }
1998
+ }
1999
+ }
2000
+ _couldLockImmediately(weight, priority) {
2001
+ return (this._queue.length === 0 || this._queue[0].priority < priority) && weight <= this._value;
2002
+ }
2003
+ };
2004
+ function insertSorted(a, v) {
2005
+ const i = findIndexFromEnd(a, (other) => v.priority <= other.priority);
2006
+ a.splice(i + 1, 0, v);
2167
2007
  }
2168
- __name(unassignTeammateTasks, "unassignTeammateTasks");
2169
- async function getAgentStatuses(teamName) {
2170
- const tasks = await listTasks(teamName);
2171
- const statuses = /* @__PURE__ */ new Map();
2172
- for (const task of tasks) {
2173
- if (!task.owner) continue;
2174
- const entry = statuses.get(task.owner) ?? {
2175
- inProgress: 0,
2176
- completed: 0
2177
- };
2178
- if (task.status === "in_progress") {
2179
- entry.inProgress++;
2180
- } else if (task.status === "completed") {
2181
- entry.completed++;
2008
+ __name(insertSorted, "insertSorted");
2009
+ function findIndexFromEnd(a, predicate) {
2010
+ for (let i = a.length - 1; i >= 0; i--) {
2011
+ if (predicate(a[i])) {
2012
+ return i;
2182
2013
  }
2183
- statuses.set(task.owner, entry);
2184
2014
  }
2185
- return statuses;
2015
+ return -1;
2186
2016
  }
2187
- __name(getAgentStatuses, "getAgentStatuses");
2188
- async function getNextTaskId(dir) {
2189
- let entries;
2190
- try {
2191
- entries = await fs.readdir(dir);
2192
- } catch {
2193
- return "1";
2017
+ __name(findIndexFromEnd, "findIndexFromEnd");
2018
+ var __awaiter$1 = function(thisArg, _arguments, P, generator) {
2019
+ function adopt(value) {
2020
+ return value instanceof P ? value : new P(function(resolve) {
2021
+ resolve(value);
2022
+ });
2194
2023
  }
2195
- let maxId = 0;
2196
- for (const entry of entries) {
2197
- if (!entry.endsWith(".json")) continue;
2198
- const num = parseInt(entry.replace(".json", ""), 10);
2199
- if (!isNaN(num) && num > maxId) {
2200
- maxId = num;
2024
+ __name(adopt, "adopt");
2025
+ return new (P || (P = Promise))(function(resolve, reject) {
2026
+ function fulfilled(value) {
2027
+ try {
2028
+ step(generator.next(value));
2029
+ } catch (e) {
2030
+ reject(e);
2031
+ }
2201
2032
  }
2033
+ __name(fulfilled, "fulfilled");
2034
+ function rejected(value) {
2035
+ try {
2036
+ step(generator["throw"](value));
2037
+ } catch (e) {
2038
+ reject(e);
2039
+ }
2040
+ }
2041
+ __name(rejected, "rejected");
2042
+ function step(result) {
2043
+ result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
2044
+ }
2045
+ __name(step, "step");
2046
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
2047
+ });
2048
+ };
2049
+ var Mutex = class {
2050
+ static {
2051
+ __name(this, "Mutex");
2052
+ }
2053
+ constructor(cancelError) {
2054
+ this._semaphore = new Semaphore(1, cancelError);
2202
2055
  }
2203
- return String(maxId + 1);
2056
+ acquire() {
2057
+ return __awaiter$1(this, arguments, void 0, function* (priority = 0) {
2058
+ const [, releaser] = yield this._semaphore.acquire(1, priority);
2059
+ return releaser;
2060
+ });
2061
+ }
2062
+ runExclusive(callback, priority = 0) {
2063
+ return this._semaphore.runExclusive(() => callback(), 1, priority);
2064
+ }
2065
+ isLocked() {
2066
+ return this._semaphore.isLocked();
2067
+ }
2068
+ waitForUnlock(priority = 0) {
2069
+ return this._semaphore.waitForUnlock(1, priority);
2070
+ }
2071
+ release() {
2072
+ if (this._semaphore.isLocked())
2073
+ this._semaphore.release();
2074
+ }
2075
+ cancel() {
2076
+ return this._semaphore.cancel();
2077
+ }
2078
+ };
2079
+ var __awaiter = function(thisArg, _arguments, P, generator) {
2080
+ function adopt(value) {
2081
+ return value instanceof P ? value : new P(function(resolve) {
2082
+ resolve(value);
2083
+ });
2084
+ }
2085
+ __name(adopt, "adopt");
2086
+ return new (P || (P = Promise))(function(resolve, reject) {
2087
+ function fulfilled(value) {
2088
+ try {
2089
+ step(generator.next(value));
2090
+ } catch (e) {
2091
+ reject(e);
2092
+ }
2093
+ }
2094
+ __name(fulfilled, "fulfilled");
2095
+ function rejected(value) {
2096
+ try {
2097
+ step(generator["throw"](value));
2098
+ } catch (e) {
2099
+ reject(e);
2100
+ }
2101
+ }
2102
+ __name(rejected, "rejected");
2103
+ function step(result) {
2104
+ result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
2105
+ }
2106
+ __name(step, "step");
2107
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
2108
+ });
2109
+ };
2110
+ function withTimeout(sync, timeout, timeoutError = E_TIMEOUT) {
2111
+ return {
2112
+ acquire: /* @__PURE__ */ __name((weightOrPriority, priority) => {
2113
+ let weight;
2114
+ if (isSemaphore(sync)) {
2115
+ weight = weightOrPriority;
2116
+ } else {
2117
+ weight = void 0;
2118
+ priority = weightOrPriority;
2119
+ }
2120
+ if (weight !== void 0 && weight <= 0) {
2121
+ throw new Error(`invalid weight ${weight}: must be positive`);
2122
+ }
2123
+ return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
2124
+ let isTimeout = false;
2125
+ const handle = setTimeout(() => {
2126
+ isTimeout = true;
2127
+ reject(timeoutError);
2128
+ }, timeout);
2129
+ try {
2130
+ const ticket = yield isSemaphore(sync) ? sync.acquire(weight, priority) : sync.acquire(priority);
2131
+ if (isTimeout) {
2132
+ const release = Array.isArray(ticket) ? ticket[1] : ticket;
2133
+ release();
2134
+ } else {
2135
+ clearTimeout(handle);
2136
+ resolve(ticket);
2137
+ }
2138
+ } catch (e) {
2139
+ if (!isTimeout) {
2140
+ clearTimeout(handle);
2141
+ reject(e);
2142
+ }
2143
+ }
2144
+ }));
2145
+ }, "acquire"),
2146
+ runExclusive(callback, weight, priority) {
2147
+ return __awaiter(this, void 0, void 0, function* () {
2148
+ let release = /* @__PURE__ */ __name(() => void 0, "release");
2149
+ try {
2150
+ const ticket = yield this.acquire(weight, priority);
2151
+ if (Array.isArray(ticket)) {
2152
+ release = ticket[1];
2153
+ return yield callback(ticket[0]);
2154
+ } else {
2155
+ release = ticket;
2156
+ return yield callback();
2157
+ }
2158
+ } finally {
2159
+ release();
2160
+ }
2161
+ });
2162
+ },
2163
+ release(weight) {
2164
+ sync.release(weight);
2165
+ },
2166
+ cancel() {
2167
+ return sync.cancel();
2168
+ },
2169
+ waitForUnlock: /* @__PURE__ */ __name((weightOrPriority, priority) => {
2170
+ let weight;
2171
+ if (isSemaphore(sync)) {
2172
+ weight = weightOrPriority;
2173
+ } else {
2174
+ weight = void 0;
2175
+ priority = weightOrPriority;
2176
+ }
2177
+ if (weight !== void 0 && weight <= 0) {
2178
+ throw new Error(`invalid weight ${weight}: must be positive`);
2179
+ }
2180
+ return new Promise((resolve, reject) => {
2181
+ const handle = setTimeout(() => reject(timeoutError), timeout);
2182
+ (isSemaphore(sync) ? sync.waitForUnlock(weight, priority) : sync.waitForUnlock(priority)).then(() => {
2183
+ clearTimeout(handle);
2184
+ resolve();
2185
+ });
2186
+ });
2187
+ }, "waitForUnlock"),
2188
+ isLocked: /* @__PURE__ */ __name(() => sync.isLocked(), "isLocked"),
2189
+ getValue: /* @__PURE__ */ __name(() => sync.getValue(), "getValue"),
2190
+ setValue: /* @__PURE__ */ __name((value) => sync.setValue(value), "setValue")
2191
+ };
2192
+ }
2193
+ __name(withTimeout, "withTimeout");
2194
+ function isSemaphore(sync) {
2195
+ return sync.getValue !== void 0;
2204
2196
  }
2205
- __name(getNextTaskId, "getNextTaskId");
2197
+ __name(isSemaphore, "isSemaphore");
2206
2198
 
2207
2199
  export {
2200
+ E_TIMEOUT,
2201
+ Mutex,
2202
+ withTimeout,
2203
+ getTeamsRootDir,
2204
+ getTeamDir,
2205
+ getTeamFilePath,
2206
+ getInboxesDir,
2207
+ getTasksDir,
2208
+ sanitizeName,
2209
+ formatAgentId,
2210
+ generateUniqueTeammateName,
2211
+ assignTeammateColor,
2212
+ clearTeammateColors,
2213
+ setMemberActive,
2214
+ findMemberById,
2215
+ findMemberByName,
2216
+ classifyShutdownResponse,
2217
+ readTeamFile,
2218
+ writeTeamFile,
2219
+ createTeamFile,
2220
+ tryReclaimStaleTeam,
2221
+ deleteTeamDirs,
2222
+ listTeamNames,
2208
2223
  require_graceful_fs,
2209
- require_proper_lockfile,
2210
- assertValidTaskId,
2211
- getTaskPath,
2212
- onTasksUpdated,
2213
- notifyTasksUpdated,
2214
- createTask,
2215
- getTask,
2216
- TaskOwnershipError,
2217
- updateTask,
2218
- deleteTask,
2219
- listTasks,
2220
- resetTaskList,
2221
- blockTask,
2222
- claimTask,
2223
- releaseOwnedTask,
2224
- unassignTeammateTasks,
2225
- getAgentStatuses
2224
+ require_proper_lockfile
2226
2225
  };
2227
2226
  /**
2228
2227
  * @license