@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.
- package/bundled/qc-helper/docs/_meta.ts +1 -0
- package/bundled/qc-helper/docs/configuration/settings.md +3 -5
- package/bundled/qc-helper/docs/features/approval-mode.md +10 -14
- package/bundled/qc-helper/docs/features/commands.md +33 -11
- package/bundled/qc-helper/docs/features/followup-suggestions.md +2 -2
- package/bundled/qc-helper/docs/features/sub-agents.md +32 -11
- package/bundled/qc-helper/docs/qwen-serve-deploy-local.md +221 -0
- package/bundled/qc-helper/docs/qwen-serve.md +234 -24
- package/chunks/{agent-QB7TZ4HW.js → agent-LOTJK6AH.js} +23 -23
- package/chunks/{agent-headless-APVHH7QM.js → agent-headless-TU3EPMYU.js} +23 -23
- package/chunks/{anthropicContentGenerator-M45EVVRM.js → anthropicContentGenerator-2HBRNQ3B.js} +7 -7
- package/chunks/{askUserQuestion-WM2KHM3K.js → askUserQuestion-OGCMIBQM.js} +45 -3
- package/chunks/{chunk-MVIVIPCU.js → chunk-2Y5SYSD3.js} +361 -583
- package/chunks/chunk-3DHXZ6EV.js +241 -0
- package/chunks/{chunk-JVQOQ3OU.js → chunk-3HTIVKZE.js} +1 -1
- package/chunks/{chunk-BNESGOSJ.js → chunk-55ZMG67I.js} +1 -1
- package/chunks/{chunk-ZK4AMNIU.js → chunk-6YIUGZTC.js} +1041 -210
- package/chunks/{chunk-C6WMLUNB.js → chunk-72LDN5PP.js} +1 -1
- package/chunks/{chunk-AVW55ZCO.js → chunk-7BCMOPIM.js} +11 -9
- package/chunks/{chunk-JUGRPQAB.js → chunk-A7B4ISQP.js} +1 -1
- package/chunks/{chunk-UAMOBVVW.js → chunk-B7HXHOHU.js} +1 -1
- package/chunks/{chunk-CNSMKPK6.js → chunk-BIVG75CP.js} +1 -1
- package/chunks/{chunk-LR62TEET.js → chunk-EYENRK4D.js} +1 -1
- package/chunks/{chunk-SZOEIL6S.js → chunk-H6BD2ELD.js} +1 -0
- package/chunks/{chunk-PAEBHDIO.js → chunk-HLPLOD42.js} +1 -1
- package/chunks/{chunk-JXAZUMDW.js → chunk-HR7SV7AY.js} +1 -2
- package/chunks/{chunk-P4J26VDS.js → chunk-IDX6COTE.js} +2 -2
- package/chunks/{chunk-QCG6KPNM.js → chunk-IWAYOW5Q.js} +14760 -10735
- package/chunks/{chunk-HGJPQK33.js → chunk-J5MDQKJL.js} +518 -519
- package/chunks/{chunk-USE2VQ5P.js → chunk-JTQAQBTV.js} +21 -0
- package/chunks/{chunk-HXJE7VOG.js → chunk-LBP46COL.js} +1001 -139
- package/chunks/{chunk-NW5QBUYO.js → chunk-LEJ42GNY.js} +14 -14
- package/chunks/{chunk-Y7R6H6FT.js → chunk-M6VTDSVR.js} +1 -1
- package/chunks/{chunk-CNHFPN7T.js → chunk-MFBBBTNY.js} +1 -1
- package/chunks/{chunk-ICOI4E4S.js → chunk-OHEGWO4L.js} +101 -23
- package/chunks/{chunk-7YKXFA3D.js → chunk-PL3MVCWD.js} +5 -5
- package/chunks/chunk-QQDPRDVW.js +25 -0
- package/chunks/{chunk-HV3ZZ7G4.js → chunk-R7ODSGTK.js} +2 -2
- package/chunks/{chunk-GX7VH5JQ.js → chunk-SEGYWKIH.js} +1 -1
- package/chunks/{chunk-KC6ZMJ5X.js → chunk-SNGELLWX.js} +1 -1
- package/chunks/chunk-XBY7E2FX.js +605 -0
- package/chunks/{chunk-2ZTWI7KH.js → chunk-XV4HCEVI.js} +22 -1
- package/chunks/{chunk-WFVXF3OM.js → chunk-Z2Z3GUXZ.js} +1 -0
- package/chunks/{chunk-CWV3SJZS.js → chunk-ZTZ4DDQE.js} +2 -2
- package/chunks/{computer-use-B7VIUI7F.js → computer-use-3RH2DOM6.js} +23 -23
- package/chunks/contextCommand-K347QT6O.js +52 -0
- package/chunks/{cron-create-FI5LJVUS.js → cron-create-YJL3KFWI.js} +3 -3
- package/chunks/{cron-delete-ZGUXWBTG.js → cron-delete-WKWSJZQA.js} +3 -3
- package/chunks/{cron-list-QNNZGMN3.js → cron-list-B52XEXAZ.js} +3 -3
- package/chunks/{devtools-IXE4UP72.js → devtools-FM6GJPYG.js} +1 -1
- package/chunks/{dist-R2SXPG74.js → dist-4LXD6L6X.js} +2 -2
- package/chunks/{dist-TE5QKMGR.js → dist-H6ONXVLG.js} +1 -1
- package/chunks/{dist-ZMQ4TXD5.js → dist-KAZ3SEBX.js} +2 -2
- package/chunks/{dist-BXDUQ2QY.js → dist-PK7DFCAW.js} +1 -1
- package/chunks/{edit-6UBTS2J5.js → edit-KU4PJGEX.js} +24 -24
- package/chunks/{en-HSQQNQUB.js → en-DHGYHIHX.js} +4 -0
- package/chunks/{enter-worktree-NN7LIXCM.js → enter-worktree-PPYIDCWI.js} +23 -23
- package/chunks/enterPlanMode-5CZDMCB4.js +158 -0
- package/chunks/{exit-worktree-GGSS5KIE.js → exit-worktree-UY3CGHKC.js} +23 -23
- package/chunks/exitPlanMode-3DN4QNSG.js +703 -0
- package/chunks/{geminiContentGenerator-I4H2NLJG.js → geminiContentGenerator-7A6I2RWB.js} +7 -7
- package/chunks/{getMachineId-bsd-F7GNPTER.js → getMachineId-bsd-4CASPIU4.js} +1 -1
- package/chunks/{getMachineId-darwin-T73DJL27.js → getMachineId-darwin-HPQPEMZR.js} +1 -1
- package/chunks/{getMachineId-linux-MKQTFPQM.js → getMachineId-linux-AUARKYHL.js} +1 -1
- package/chunks/{getMachineId-unsupported-MUR5KOQE.js → getMachineId-unsupported-S32ZDA2T.js} +1 -1
- package/chunks/{getMachineId-win-CDYFC6ZM.js → getMachineId-win-4EFLHYIJ.js} +1 -1
- package/chunks/{glob-OLCX57MD.js → glob-OFNQSS52.js} +23 -23
- package/chunks/{grep-7HXIMDOW.js → grep-6J2MSUM5.js} +26 -23
- package/chunks/{keychain-token-storage-LB46DAEK.js → keychain-token-storage-6IU6ORQN.js} +3 -3
- package/chunks/{ls-6PEZUK6O.js → ls-V3O6A5PT.js} +4 -4
- package/chunks/{lsp-JZSJOVT7.js → lsp-G2OCIFUA.js} +3 -3
- package/chunks/{monitor-SQO7MVAV.js → monitor-FKLHV423.js} +23 -23
- package/chunks/{notebook-edit-72L3EBAL.js → notebook-edit-KTBYFKWG.js} +24 -24
- package/chunks/{openaiContentGenerator-FTR7CDWF.js → openaiContentGenerator-L5KSWQY7.js} +15 -15
- package/chunks/{qwenContentGenerator-U5UFQ566.js → qwenContentGenerator-PYOXLMBW.js} +25 -25
- package/chunks/{qwenOAuth2-EFSECGHF.js → qwenOAuth2-2KCKWDCF.js} +6 -5
- package/chunks/{read-file-UA64EEQC.js → read-file-JQVRK4NU.js} +11 -11
- package/chunks/{ripGrep-WSYCWZVK.js → ripGrep-2L4LPNAJ.js} +23 -23
- package/chunks/{scheduler-VBASHOCA.js → scheduler-FGNXY4JQ.js} +23 -23
- package/chunks/{send-message-OYJZ5TPG.js → send-message-SZFWNOCL.js} +3 -3
- package/chunks/{serve-A7E2OJDR.js → serve-N2IBLA3G.js} +13581 -4977
- package/chunks/{shell-3NFOT6F5.js → shell-PTEG6UX4.js} +23 -23
- package/chunks/{skill-RA5YUREY.js → skill-X4NTK4NH.js} +64 -113
- package/chunks/{src-NFCMARMT.js → src-GLLQ3R5W.js} +154 -38
- package/chunks/{syntheticOutput-DETQ2YM6.js → syntheticOutput-IKAY5F6X.js} +4 -4
- package/chunks/{task-create-Y3ZKTJIG.js → task-create-MQICOJFV.js} +7 -7
- package/chunks/{task-list-ONXJ3I3A.js → task-list-RIHJCH32.js} +6 -6
- package/chunks/{task-stop-UHDC4N5B.js → task-stop-FWZRFANS.js} +3 -3
- package/chunks/{task-update-TCNOU3P5.js → task-update-2LHPXOYM.js} +20 -9
- package/chunks/{team-create-6SR4OVRG.js → team-create-2E4PF4KN.js} +26 -25
- package/chunks/{team-delete-EJ4U4DDP.js → team-delete-DAUDQS4J.js} +8 -6
- package/chunks/{todoWrite-TEYDRS5L.js → todoWrite-HTUACZES.js} +5 -5
- package/chunks/{tool-search-OD435A3X.js → tool-search-KTVULRES.js} +11 -11
- package/chunks/{web-fetch-6W67H5PO.js → web-fetch-CZ7LLKPE.js} +5 -5
- package/chunks/{workflow-62DHH4EO.js → workflow-L2ZUUDT2.js} +268 -16
- package/chunks/{write-file-475L5OPP.js → write-file-ZEB2JDYH.js} +24 -24
- package/chunks/{zh-VCLWO26Y.js → zh-7H5OQC4I.js} +5 -1
- package/chunks/{zh-TW-G3HFHVVT.js → zh-TW-P4IDHD3M.js} +5 -1
- package/cli.js +5955 -3128
- package/examples/starter/QWEN.md +30 -0
- package/examples/starter/README.md +59 -0
- package/examples/starter/agents/diary.md +86 -0
- package/examples/starter/commands/writing/polish.md +13 -0
- package/examples/starter/example.ts +64 -0
- package/examples/starter/package.json +18 -0
- package/examples/starter/qwen-extension.json +12 -0
- package/examples/starter/skills/synonyms/SKILL.md +48 -0
- package/examples/starter/tsconfig.json +13 -0
- package/fzfWorker.js +1083 -0
- package/locales/en.js +6 -0
- package/locales/zh-TW.js +5 -0
- package/locales/zh.js +5 -0
- package/package.json +3 -2
- package/chunks/chunk-AJIR24J2.js +0 -59
- package/chunks/chunk-XBFVXFB2.js +0 -216
- package/chunks/contextCommand-63RZ3O5R.js +0 -52
- 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
|
-
|
|
5
|
-
|
|
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-
|
|
13
|
+
} from "./chunk-B7HXHOHU.js";
|
|
9
14
|
import {
|
|
10
|
-
|
|
15
|
+
Storage,
|
|
11
16
|
isNodeError
|
|
12
|
-
} from "./chunk-
|
|
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
|
|
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(
|
|
112
|
-
if (Object.setPrototypeOf) Object.setPrototypeOf(
|
|
113
|
-
return
|
|
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
|
|
483
|
+
var debug = noop;
|
|
480
484
|
if (util.debuglog)
|
|
481
|
-
|
|
485
|
+
debug = util.debuglog("gfs4");
|
|
482
486
|
else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || ""))
|
|
483
|
-
|
|
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
|
-
|
|
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 =
|
|
560
|
-
function
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
771
|
-
function
|
|
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(
|
|
791
|
+
__name(open, "open");
|
|
788
792
|
return fs3;
|
|
789
793
|
}
|
|
790
794
|
__name(patch, "patch");
|
|
791
795
|
function enqueue(elem) {
|
|
792
|
-
|
|
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
|
-
|
|
825
|
+
debug("RETRY", fn.name, args);
|
|
822
826
|
fn.apply(null, args);
|
|
823
827
|
} else if (Date.now() - startTime >= 6e4) {
|
|
824
|
-
|
|
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
|
-
|
|
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
|
|
1197
|
-
if (
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
1659
|
+
return toPromise(lockfile.unlock)(file, options);
|
|
1656
1660
|
}
|
|
1657
1661
|
__name(unlock, "unlock");
|
|
1658
1662
|
function unlockSync(file, options) {
|
|
1659
|
-
return toSync(
|
|
1663
|
+
return toSync(lockfile.unlock)(file, toSyncOptions(options));
|
|
1660
1664
|
}
|
|
1661
1665
|
__name(unlockSync, "unlockSync");
|
|
1662
1666
|
function check(file, options) {
|
|
1663
|
-
return toPromise(
|
|
1667
|
+
return toPromise(lockfile.check)(file, options);
|
|
1664
1668
|
}
|
|
1665
1669
|
__name(check, "check");
|
|
1666
1670
|
function checkSync(file, options) {
|
|
1667
|
-
return toSync(
|
|
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/
|
|
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
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
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
|
-
`
|
|
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
|
-
`
|
|
1725
|
+
`"${LEADER_NAME}" is reserved for the team leader. Choose a different teammate name.`
|
|
1715
1726
|
);
|
|
1716
1727
|
}
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
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(
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
const
|
|
1747
|
-
|
|
1748
|
-
|
|
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
|
-
|
|
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(
|
|
1788
|
-
|
|
1789
|
-
|
|
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(
|
|
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")
|
|
1783
|
+
if (isNodeError(err) && err.code === "ENOENT") {
|
|
1784
|
+
return void 0;
|
|
1785
|
+
}
|
|
1795
1786
|
throw err;
|
|
1796
1787
|
}
|
|
1797
1788
|
}
|
|
1798
|
-
__name(
|
|
1799
|
-
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
}
|
|
1812
|
-
}
|
|
1813
|
-
|
|
1814
|
-
|
|
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
|
-
|
|
1807
|
+
process.kill(pid, 0);
|
|
1808
|
+
return true;
|
|
1818
1809
|
} catch (err) {
|
|
1819
|
-
|
|
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(
|
|
1890
|
-
async function
|
|
1891
|
-
|
|
1892
|
-
let release;
|
|
1813
|
+
__name(isPidAlive, "isPidAlive");
|
|
1814
|
+
async function tryReclaimStaleTeam(teamName) {
|
|
1815
|
+
let existing;
|
|
1893
1816
|
try {
|
|
1894
|
-
|
|
1895
|
-
} catch
|
|
1896
|
-
|
|
1897
|
-
throw err;
|
|
1817
|
+
existing = await readTeamFile(teamName);
|
|
1818
|
+
} catch {
|
|
1819
|
+
return false;
|
|
1898
1820
|
}
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
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
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
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
|
-
|
|
1831
|
+
await deleteTeamDirs(teamName);
|
|
1934
1832
|
return true;
|
|
1935
1833
|
}
|
|
1936
|
-
__name(
|
|
1937
|
-
async function
|
|
1938
|
-
const
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
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(
|
|
1965
|
-
async function
|
|
1966
|
-
const
|
|
1967
|
-
let entries;
|
|
1843
|
+
__name(deleteTeamDirs, "deleteTeamDirs");
|
|
1844
|
+
async function listTeamNames() {
|
|
1845
|
+
const teamsRoot = getTeamsRootDir();
|
|
1968
1846
|
try {
|
|
1969
|
-
entries = await fs.readdir(
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
|
|
1973
|
-
|
|
1974
|
-
|
|
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
|
-
|
|
1977
|
-
|
|
1978
|
-
|
|
1979
|
-
|
|
1980
|
-
|
|
1981
|
-
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
|
|
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
|
-
|
|
2014
|
-
|
|
2015
|
-
|
|
2016
|
-
|
|
2017
|
-
|
|
2018
|
-
|
|
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
|
-
|
|
2021
|
-
|
|
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
|
-
|
|
2024
|
-
|
|
1885
|
+
__name(rejected, "rejected");
|
|
1886
|
+
function step(result) {
|
|
1887
|
+
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
|
|
2025
1888
|
}
|
|
2026
|
-
|
|
1889
|
+
__name(step, "step");
|
|
1890
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
2027
1891
|
});
|
|
2028
|
-
}
|
|
2029
|
-
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
|
|
2042
|
-
|
|
2043
|
-
|
|
2044
|
-
|
|
2045
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1922
|
+
release();
|
|
2056
1923
|
}
|
|
2057
|
-
})
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
if (
|
|
2061
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2078
|
-
|
|
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
|
-
|
|
2086
|
-
|
|
2087
|
-
|
|
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
|
-
|
|
2106
|
-
|
|
2107
|
-
|
|
2108
|
-
|
|
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
|
-
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
|
|
2127
|
-
|
|
2128
|
-
|
|
2129
|
-
|
|
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
|
-
|
|
2143
|
-
|
|
2144
|
-
|
|
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
|
-
|
|
2161
|
-
|
|
2162
|
-
|
|
2163
|
-
|
|
2164
|
-
|
|
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
|
-
|
|
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(
|
|
2169
|
-
|
|
2170
|
-
|
|
2171
|
-
|
|
2172
|
-
|
|
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
|
|
2015
|
+
return -1;
|
|
2186
2016
|
}
|
|
2187
|
-
__name(
|
|
2188
|
-
|
|
2189
|
-
|
|
2190
|
-
|
|
2191
|
-
|
|
2192
|
-
|
|
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
|
-
|
|
2196
|
-
|
|
2197
|
-
|
|
2198
|
-
|
|
2199
|
-
|
|
2200
|
-
|
|
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
|
-
|
|
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(
|
|
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
|