duclaw-cli 1.8.0 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle.js +1417 -862
- package/dist/main.js +1 -1
- package/dist/web/assets/{index-Dpx92V0g.js → index-irglpeKE.js} +20 -20
- package/dist/web/index.html +1 -1
- package/dist/worker-main.js +1 -1
- package/package.json +2 -2
package/dist/bundle.js
CHANGED
|
@@ -115,7 +115,7 @@ var require_package = __commonJS({
|
|
|
115
115
|
var require_main = __commonJS({
|
|
116
116
|
"node_modules/.pnpm/dotenv@17.3.1/node_modules/dotenv/lib/main.js"(exports2, module2) {
|
|
117
117
|
var fs3 = require("fs");
|
|
118
|
-
var
|
|
118
|
+
var path17 = require("path");
|
|
119
119
|
var os = require("os");
|
|
120
120
|
var crypto2 = require("crypto");
|
|
121
121
|
var packageJson = require_package();
|
|
@@ -261,7 +261,7 @@ var require_main = __commonJS({
|
|
|
261
261
|
possibleVaultPath = options.path.endsWith(".vault") ? options.path : `${options.path}.vault`;
|
|
262
262
|
}
|
|
263
263
|
} else {
|
|
264
|
-
possibleVaultPath =
|
|
264
|
+
possibleVaultPath = path17.resolve(process.cwd(), ".env.vault");
|
|
265
265
|
}
|
|
266
266
|
if (fs3.existsSync(possibleVaultPath)) {
|
|
267
267
|
return possibleVaultPath;
|
|
@@ -269,7 +269,7 @@ var require_main = __commonJS({
|
|
|
269
269
|
return null;
|
|
270
270
|
}
|
|
271
271
|
function _resolveHome(envPath) {
|
|
272
|
-
return envPath[0] === "~" ?
|
|
272
|
+
return envPath[0] === "~" ? path17.join(os.homedir(), envPath.slice(1)) : envPath;
|
|
273
273
|
}
|
|
274
274
|
function _configVault(options) {
|
|
275
275
|
const debug = parseBoolean(process.env.DOTENV_CONFIG_DEBUG || options && options.debug);
|
|
@@ -286,7 +286,7 @@ var require_main = __commonJS({
|
|
|
286
286
|
return { parsed };
|
|
287
287
|
}
|
|
288
288
|
function configDotenv(options) {
|
|
289
|
-
const dotenvPath =
|
|
289
|
+
const dotenvPath = path17.resolve(process.cwd(), ".env");
|
|
290
290
|
let encoding = "utf8";
|
|
291
291
|
let processEnv = process.env;
|
|
292
292
|
if (options && options.processEnv != null) {
|
|
@@ -314,13 +314,13 @@ var require_main = __commonJS({
|
|
|
314
314
|
}
|
|
315
315
|
let lastError;
|
|
316
316
|
const parsedAll = {};
|
|
317
|
-
for (const
|
|
317
|
+
for (const path18 of optionPaths) {
|
|
318
318
|
try {
|
|
319
|
-
const parsed = DotenvModule.parse(fs3.readFileSync(
|
|
319
|
+
const parsed = DotenvModule.parse(fs3.readFileSync(path18, { encoding }));
|
|
320
320
|
DotenvModule.populate(parsedAll, parsed, options);
|
|
321
321
|
} catch (e) {
|
|
322
322
|
if (debug) {
|
|
323
|
-
_debug(`Failed to load ${
|
|
323
|
+
_debug(`Failed to load ${path18} ${e.message}`);
|
|
324
324
|
}
|
|
325
325
|
lastError = e;
|
|
326
326
|
}
|
|
@@ -333,7 +333,7 @@ var require_main = __commonJS({
|
|
|
333
333
|
const shortPaths = [];
|
|
334
334
|
for (const filePath of optionPaths) {
|
|
335
335
|
try {
|
|
336
|
-
const relative4 =
|
|
336
|
+
const relative4 = path17.relative(process.cwd(), filePath);
|
|
337
337
|
shortPaths.push(relative4);
|
|
338
338
|
} catch (e) {
|
|
339
339
|
if (debug) {
|
|
@@ -8237,8 +8237,8 @@ var require_MODULE_LOAD = __commonJS({
|
|
|
8237
8237
|
* @param moduleArguments - Optional arguments to pass to the module
|
|
8238
8238
|
* @see https://redis.io/commands/module-load/
|
|
8239
8239
|
*/
|
|
8240
|
-
parseCommand(parser,
|
|
8241
|
-
parser.push("MODULE", "LOAD",
|
|
8240
|
+
parseCommand(parser, path17, moduleArguments) {
|
|
8241
|
+
parser.push("MODULE", "LOAD", path17);
|
|
8242
8242
|
if (moduleArguments) {
|
|
8243
8243
|
parser.push(...moduleArguments);
|
|
8244
8244
|
}
|
|
@@ -23539,10 +23539,10 @@ var require_ARRAPPEND = __commonJS({
|
|
|
23539
23539
|
* @param json - The first value to append
|
|
23540
23540
|
* @param jsons - Additional values to append
|
|
23541
23541
|
*/
|
|
23542
|
-
parseCommand(parser, key,
|
|
23542
|
+
parseCommand(parser, key, path17, json, ...jsons) {
|
|
23543
23543
|
parser.push("JSON.ARRAPPEND");
|
|
23544
23544
|
parser.pushKey(key);
|
|
23545
|
-
parser.push(
|
|
23545
|
+
parser.push(path17, (0, generic_transformers_1.transformRedisJsonArgument)(json));
|
|
23546
23546
|
for (let i = 0; i < jsons.length; i++) {
|
|
23547
23547
|
parser.push((0, generic_transformers_1.transformRedisJsonArgument)(jsons[i]));
|
|
23548
23548
|
}
|
|
@@ -23572,10 +23572,10 @@ var require_ARRINDEX = __commonJS({
|
|
|
23572
23572
|
* @param options.range.start - Starting index for the search
|
|
23573
23573
|
* @param options.range.stop - Optional ending index for the search
|
|
23574
23574
|
*/
|
|
23575
|
-
parseCommand(parser, key,
|
|
23575
|
+
parseCommand(parser, key, path17, json, options) {
|
|
23576
23576
|
parser.push("JSON.ARRINDEX");
|
|
23577
23577
|
parser.pushKey(key);
|
|
23578
|
-
parser.push(
|
|
23578
|
+
parser.push(path17, (0, generic_transformers_1.transformRedisJsonArgument)(json));
|
|
23579
23579
|
if (options?.range) {
|
|
23580
23580
|
parser.push(options.range.start.toString());
|
|
23581
23581
|
if (options.range.stop !== void 0) {
|
|
@@ -23607,10 +23607,10 @@ var require_ARRINSERT = __commonJS({
|
|
|
23607
23607
|
* @param json - The first value to insert
|
|
23608
23608
|
* @param jsons - Additional values to insert
|
|
23609
23609
|
*/
|
|
23610
|
-
parseCommand(parser, key,
|
|
23610
|
+
parseCommand(parser, key, path17, index, json, ...jsons) {
|
|
23611
23611
|
parser.push("JSON.ARRINSERT");
|
|
23612
23612
|
parser.pushKey(key);
|
|
23613
|
-
parser.push(
|
|
23613
|
+
parser.push(path17, index.toString(), (0, generic_transformers_1.transformRedisJsonArgument)(json));
|
|
23614
23614
|
for (let i = 0; i < jsons.length; i++) {
|
|
23615
23615
|
parser.push((0, generic_transformers_1.transformRedisJsonArgument)(jsons[i]));
|
|
23616
23616
|
}
|
|
@@ -23700,10 +23700,10 @@ var require_ARRTRIM = __commonJS({
|
|
|
23700
23700
|
* @param start - Starting index (inclusive)
|
|
23701
23701
|
* @param stop - Ending index (inclusive)
|
|
23702
23702
|
*/
|
|
23703
|
-
parseCommand(parser, key,
|
|
23703
|
+
parseCommand(parser, key, path17, start, stop) {
|
|
23704
23704
|
parser.push("JSON.ARRTRIM");
|
|
23705
23705
|
parser.pushKey(key);
|
|
23706
|
-
parser.push(
|
|
23706
|
+
parser.push(path17, start.toString(), stop.toString());
|
|
23707
23707
|
},
|
|
23708
23708
|
transformReply: void 0
|
|
23709
23709
|
};
|
|
@@ -23868,10 +23868,10 @@ var require_MERGE3 = __commonJS({
|
|
|
23868
23868
|
* @param path - Path to merge into
|
|
23869
23869
|
* @param value - JSON value to merge
|
|
23870
23870
|
*/
|
|
23871
|
-
parseCommand(parser, key,
|
|
23871
|
+
parseCommand(parser, key, path17, value) {
|
|
23872
23872
|
parser.push("JSON.MERGE");
|
|
23873
23873
|
parser.pushKey(key);
|
|
23874
|
-
parser.push(
|
|
23874
|
+
parser.push(path17, (0, generic_transformers_1.transformRedisJsonArgument)(value));
|
|
23875
23875
|
},
|
|
23876
23876
|
transformReply: void 0
|
|
23877
23877
|
};
|
|
@@ -23894,10 +23894,10 @@ var require_MGET2 = __commonJS({
|
|
|
23894
23894
|
* @param keys - Array of keys containing JSON documents
|
|
23895
23895
|
* @param path - Path to retrieve from each document
|
|
23896
23896
|
*/
|
|
23897
|
-
parseCommand(parser, keys,
|
|
23897
|
+
parseCommand(parser, keys, path17) {
|
|
23898
23898
|
parser.push("JSON.MGET");
|
|
23899
23899
|
parser.pushKeys(keys);
|
|
23900
|
-
parser.push(
|
|
23900
|
+
parser.push(path17);
|
|
23901
23901
|
},
|
|
23902
23902
|
transformReply(reply) {
|
|
23903
23903
|
return reply.map((json) => (0, generic_transformers_1.transformRedisJsonNullReply)(json));
|
|
@@ -23952,10 +23952,10 @@ var require_NUMINCRBY = __commonJS({
|
|
|
23952
23952
|
* @param path - Path to the numeric value
|
|
23953
23953
|
* @param by - Amount to increment by
|
|
23954
23954
|
*/
|
|
23955
|
-
parseCommand(parser, key,
|
|
23955
|
+
parseCommand(parser, key, path17, by) {
|
|
23956
23956
|
parser.push("JSON.NUMINCRBY");
|
|
23957
23957
|
parser.pushKey(key);
|
|
23958
|
-
parser.push(
|
|
23958
|
+
parser.push(path17, by.toString());
|
|
23959
23959
|
},
|
|
23960
23960
|
transformReply: {
|
|
23961
23961
|
2: (reply) => {
|
|
@@ -23987,10 +23987,10 @@ var require_NUMMULTBY = __commonJS({
|
|
|
23987
23987
|
* @param path - Path to the numeric value
|
|
23988
23988
|
* @param by - Amount to multiply by
|
|
23989
23989
|
*/
|
|
23990
|
-
parseCommand(parser, key,
|
|
23990
|
+
parseCommand(parser, key, path17, by) {
|
|
23991
23991
|
parser.push("JSON.NUMMULTBY");
|
|
23992
23992
|
parser.pushKey(key);
|
|
23993
|
-
parser.push(
|
|
23993
|
+
parser.push(path17, by.toString());
|
|
23994
23994
|
},
|
|
23995
23995
|
transformReply: NUMINCRBY_1.default.transformReply
|
|
23996
23996
|
};
|
|
@@ -24074,10 +24074,10 @@ var require_SET2 = __commonJS({
|
|
|
24074
24074
|
* @deprecated options.NX - Use options.condition instead
|
|
24075
24075
|
* @deprecated options.XX - Use options.condition instead
|
|
24076
24076
|
*/
|
|
24077
|
-
parseCommand(parser, key,
|
|
24077
|
+
parseCommand(parser, key, path17, json, options) {
|
|
24078
24078
|
parser.push("JSON.SET");
|
|
24079
24079
|
parser.pushKey(key);
|
|
24080
|
-
parser.push(
|
|
24080
|
+
parser.push(path17, (0, generic_transformers_1.transformRedisJsonArgument)(json));
|
|
24081
24081
|
if (options?.condition) {
|
|
24082
24082
|
parser.push(options?.condition);
|
|
24083
24083
|
} else if (options?.NX) {
|
|
@@ -24165,10 +24165,10 @@ var require_TOGGLE = __commonJS({
|
|
|
24165
24165
|
* @param key - The key containing the JSON document
|
|
24166
24166
|
* @param path - Path to the boolean value
|
|
24167
24167
|
*/
|
|
24168
|
-
parseCommand(parser, key,
|
|
24168
|
+
parseCommand(parser, key, path17) {
|
|
24169
24169
|
parser.push("JSON.TOGGLE");
|
|
24170
24170
|
parser.pushKey(key);
|
|
24171
|
-
parser.push(
|
|
24171
|
+
parser.push(path17);
|
|
24172
24172
|
},
|
|
24173
24173
|
transformReply: void 0
|
|
24174
24174
|
};
|
|
@@ -30242,7 +30242,7 @@ function printHelp() {
|
|
|
30242
30242
|
`);
|
|
30243
30243
|
}
|
|
30244
30244
|
function printVersion() {
|
|
30245
|
-
console.log(`duclaw-cli v${true ? "1.8.
|
|
30245
|
+
console.log(`duclaw-cli v${true ? "1.8.1" : "unknown"}`);
|
|
30246
30246
|
}
|
|
30247
30247
|
function getDuclawTemplate() {
|
|
30248
30248
|
return {
|
|
@@ -30970,7 +30970,7 @@ var ReaddirpStream = class extends import_node_stream.Readable {
|
|
|
30970
30970
|
this._directoryFilter = normalizeFilter(opts.directoryFilter);
|
|
30971
30971
|
const statMethod = opts.lstat ? import_promises2.lstat : import_promises2.stat;
|
|
30972
30972
|
if (wantBigintFsStats) {
|
|
30973
|
-
this._stat = (
|
|
30973
|
+
this._stat = (path17) => statMethod(path17, { bigint: true });
|
|
30974
30974
|
} else {
|
|
30975
30975
|
this._stat = statMethod;
|
|
30976
30976
|
}
|
|
@@ -30995,8 +30995,8 @@ var ReaddirpStream = class extends import_node_stream.Readable {
|
|
|
30995
30995
|
const par = this.parent;
|
|
30996
30996
|
const fil = par && par.files;
|
|
30997
30997
|
if (fil && fil.length > 0) {
|
|
30998
|
-
const { path:
|
|
30999
|
-
const slice = fil.splice(0, batch).map((dirent) => this._formatEntry(dirent,
|
|
30998
|
+
const { path: path17, depth } = par;
|
|
30999
|
+
const slice = fil.splice(0, batch).map((dirent) => this._formatEntry(dirent, path17));
|
|
31000
31000
|
const awaited = await Promise.all(slice);
|
|
31001
31001
|
for (const entry of awaited) {
|
|
31002
31002
|
if (!entry)
|
|
@@ -31036,20 +31036,20 @@ var ReaddirpStream = class extends import_node_stream.Readable {
|
|
|
31036
31036
|
this.reading = false;
|
|
31037
31037
|
}
|
|
31038
31038
|
}
|
|
31039
|
-
async _exploreDir(
|
|
31039
|
+
async _exploreDir(path17, depth) {
|
|
31040
31040
|
let files;
|
|
31041
31041
|
try {
|
|
31042
|
-
files = await (0, import_promises2.readdir)(
|
|
31042
|
+
files = await (0, import_promises2.readdir)(path17, this._rdOptions);
|
|
31043
31043
|
} catch (error) {
|
|
31044
31044
|
this._onError(error);
|
|
31045
31045
|
}
|
|
31046
|
-
return { files, depth, path:
|
|
31046
|
+
return { files, depth, path: path17 };
|
|
31047
31047
|
}
|
|
31048
|
-
async _formatEntry(dirent,
|
|
31048
|
+
async _formatEntry(dirent, path17) {
|
|
31049
31049
|
let entry;
|
|
31050
31050
|
const basename4 = this._isDirent ? dirent.name : dirent;
|
|
31051
31051
|
try {
|
|
31052
|
-
const fullPath = (0, import_node_path2.resolve)((0, import_node_path2.join)(
|
|
31052
|
+
const fullPath = (0, import_node_path2.resolve)((0, import_node_path2.join)(path17, basename4));
|
|
31053
31053
|
entry = { path: (0, import_node_path2.relative)(this._root, fullPath), fullPath, basename: basename4 };
|
|
31054
31054
|
entry[this._statsProp] = this._isDirent ? dirent : await this._stat(fullPath);
|
|
31055
31055
|
} catch (err) {
|
|
@@ -31449,16 +31449,16 @@ var delFromSet = (main2, prop, item) => {
|
|
|
31449
31449
|
};
|
|
31450
31450
|
var isEmptySet = (val) => val instanceof Set ? val.size === 0 : !val;
|
|
31451
31451
|
var FsWatchInstances = /* @__PURE__ */ new Map();
|
|
31452
|
-
function createFsWatchInstance(
|
|
31452
|
+
function createFsWatchInstance(path17, options, listener, errHandler, emitRaw) {
|
|
31453
31453
|
const handleEvent = (rawEvent, evPath) => {
|
|
31454
|
-
listener(
|
|
31455
|
-
emitRaw(rawEvent, evPath, { watchedPath:
|
|
31456
|
-
if (evPath &&
|
|
31457
|
-
fsWatchBroadcast(sp.resolve(
|
|
31454
|
+
listener(path17);
|
|
31455
|
+
emitRaw(rawEvent, evPath, { watchedPath: path17 });
|
|
31456
|
+
if (evPath && path17 !== evPath) {
|
|
31457
|
+
fsWatchBroadcast(sp.resolve(path17, evPath), KEY_LISTENERS, sp.join(path17, evPath));
|
|
31458
31458
|
}
|
|
31459
31459
|
};
|
|
31460
31460
|
try {
|
|
31461
|
-
return (0, import_node_fs.watch)(
|
|
31461
|
+
return (0, import_node_fs.watch)(path17, {
|
|
31462
31462
|
persistent: options.persistent
|
|
31463
31463
|
}, handleEvent);
|
|
31464
31464
|
} catch (error) {
|
|
@@ -31474,12 +31474,12 @@ var fsWatchBroadcast = (fullPath, listenerType, val1, val2, val3) => {
|
|
|
31474
31474
|
listener(val1, val2, val3);
|
|
31475
31475
|
});
|
|
31476
31476
|
};
|
|
31477
|
-
var setFsWatchListener = (
|
|
31477
|
+
var setFsWatchListener = (path17, fullPath, options, handlers) => {
|
|
31478
31478
|
const { listener, errHandler, rawEmitter } = handlers;
|
|
31479
31479
|
let cont = FsWatchInstances.get(fullPath);
|
|
31480
31480
|
let watcher;
|
|
31481
31481
|
if (!options.persistent) {
|
|
31482
|
-
watcher = createFsWatchInstance(
|
|
31482
|
+
watcher = createFsWatchInstance(path17, options, listener, errHandler, rawEmitter);
|
|
31483
31483
|
if (!watcher)
|
|
31484
31484
|
return;
|
|
31485
31485
|
return watcher.close.bind(watcher);
|
|
@@ -31490,7 +31490,7 @@ var setFsWatchListener = (path16, fullPath, options, handlers) => {
|
|
|
31490
31490
|
addAndConvert(cont, KEY_RAW, rawEmitter);
|
|
31491
31491
|
} else {
|
|
31492
31492
|
watcher = createFsWatchInstance(
|
|
31493
|
-
|
|
31493
|
+
path17,
|
|
31494
31494
|
options,
|
|
31495
31495
|
fsWatchBroadcast.bind(null, fullPath, KEY_LISTENERS),
|
|
31496
31496
|
errHandler,
|
|
@@ -31505,7 +31505,7 @@ var setFsWatchListener = (path16, fullPath, options, handlers) => {
|
|
|
31505
31505
|
cont.watcherUnusable = true;
|
|
31506
31506
|
if (isWindows && error.code === "EPERM") {
|
|
31507
31507
|
try {
|
|
31508
|
-
const fd = await (0, import_promises3.open)(
|
|
31508
|
+
const fd = await (0, import_promises3.open)(path17, "r");
|
|
31509
31509
|
await fd.close();
|
|
31510
31510
|
broadcastErr(error);
|
|
31511
31511
|
} catch (err) {
|
|
@@ -31536,7 +31536,7 @@ var setFsWatchListener = (path16, fullPath, options, handlers) => {
|
|
|
31536
31536
|
};
|
|
31537
31537
|
};
|
|
31538
31538
|
var FsWatchFileInstances = /* @__PURE__ */ new Map();
|
|
31539
|
-
var setFsWatchFileListener = (
|
|
31539
|
+
var setFsWatchFileListener = (path17, fullPath, options, handlers) => {
|
|
31540
31540
|
const { listener, rawEmitter } = handlers;
|
|
31541
31541
|
let cont = FsWatchFileInstances.get(fullPath);
|
|
31542
31542
|
const copts = cont && cont.options;
|
|
@@ -31558,7 +31558,7 @@ var setFsWatchFileListener = (path16, fullPath, options, handlers) => {
|
|
|
31558
31558
|
});
|
|
31559
31559
|
const currmtime = curr.mtimeMs;
|
|
31560
31560
|
if (curr.size !== prev.size || currmtime > prev.mtimeMs || currmtime === 0) {
|
|
31561
|
-
foreach(cont.listeners, (listener2) => listener2(
|
|
31561
|
+
foreach(cont.listeners, (listener2) => listener2(path17, curr));
|
|
31562
31562
|
}
|
|
31563
31563
|
})
|
|
31564
31564
|
};
|
|
@@ -31588,13 +31588,13 @@ var NodeFsHandler = class {
|
|
|
31588
31588
|
* @param listener on fs change
|
|
31589
31589
|
* @returns closer for the watcher instance
|
|
31590
31590
|
*/
|
|
31591
|
-
_watchWithNodeFs(
|
|
31591
|
+
_watchWithNodeFs(path17, listener) {
|
|
31592
31592
|
const opts = this.fsw.options;
|
|
31593
|
-
const directory = sp.dirname(
|
|
31594
|
-
const basename4 = sp.basename(
|
|
31593
|
+
const directory = sp.dirname(path17);
|
|
31594
|
+
const basename4 = sp.basename(path17);
|
|
31595
31595
|
const parent = this.fsw._getWatchedDir(directory);
|
|
31596
31596
|
parent.add(basename4);
|
|
31597
|
-
const absolutePath = sp.resolve(
|
|
31597
|
+
const absolutePath = sp.resolve(path17);
|
|
31598
31598
|
const options = {
|
|
31599
31599
|
persistent: opts.persistent
|
|
31600
31600
|
};
|
|
@@ -31604,12 +31604,12 @@ var NodeFsHandler = class {
|
|
|
31604
31604
|
if (opts.usePolling) {
|
|
31605
31605
|
const enableBin = opts.interval !== opts.binaryInterval;
|
|
31606
31606
|
options.interval = enableBin && isBinaryPath(basename4) ? opts.binaryInterval : opts.interval;
|
|
31607
|
-
closer = setFsWatchFileListener(
|
|
31607
|
+
closer = setFsWatchFileListener(path17, absolutePath, options, {
|
|
31608
31608
|
listener,
|
|
31609
31609
|
rawEmitter: this.fsw._emitRaw
|
|
31610
31610
|
});
|
|
31611
31611
|
} else {
|
|
31612
|
-
closer = setFsWatchListener(
|
|
31612
|
+
closer = setFsWatchListener(path17, absolutePath, options, {
|
|
31613
31613
|
listener,
|
|
31614
31614
|
errHandler: this._boundHandleError,
|
|
31615
31615
|
rawEmitter: this.fsw._emitRaw
|
|
@@ -31631,7 +31631,7 @@ var NodeFsHandler = class {
|
|
|
31631
31631
|
let prevStats = stats;
|
|
31632
31632
|
if (parent.has(basename4))
|
|
31633
31633
|
return;
|
|
31634
|
-
const listener = async (
|
|
31634
|
+
const listener = async (path17, newStats) => {
|
|
31635
31635
|
if (!this.fsw._throttle(THROTTLE_MODE_WATCH, file, 5))
|
|
31636
31636
|
return;
|
|
31637
31637
|
if (!newStats || newStats.mtimeMs === 0) {
|
|
@@ -31645,11 +31645,11 @@ var NodeFsHandler = class {
|
|
|
31645
31645
|
this.fsw._emit(EV.CHANGE, file, newStats2);
|
|
31646
31646
|
}
|
|
31647
31647
|
if ((isMacos || isLinux || isFreeBSD) && prevStats.ino !== newStats2.ino) {
|
|
31648
|
-
this.fsw._closeFile(
|
|
31648
|
+
this.fsw._closeFile(path17);
|
|
31649
31649
|
prevStats = newStats2;
|
|
31650
31650
|
const closer2 = this._watchWithNodeFs(file, listener);
|
|
31651
31651
|
if (closer2)
|
|
31652
|
-
this.fsw._addPathCloser(
|
|
31652
|
+
this.fsw._addPathCloser(path17, closer2);
|
|
31653
31653
|
} else {
|
|
31654
31654
|
prevStats = newStats2;
|
|
31655
31655
|
}
|
|
@@ -31681,7 +31681,7 @@ var NodeFsHandler = class {
|
|
|
31681
31681
|
* @param item basename of this item
|
|
31682
31682
|
* @returns true if no more processing is needed for this entry.
|
|
31683
31683
|
*/
|
|
31684
|
-
async _handleSymlink(entry, directory,
|
|
31684
|
+
async _handleSymlink(entry, directory, path17, item) {
|
|
31685
31685
|
if (this.fsw.closed) {
|
|
31686
31686
|
return;
|
|
31687
31687
|
}
|
|
@@ -31691,7 +31691,7 @@ var NodeFsHandler = class {
|
|
|
31691
31691
|
this.fsw._incrReadyCount();
|
|
31692
31692
|
let linkPath;
|
|
31693
31693
|
try {
|
|
31694
|
-
linkPath = await (0, import_promises3.realpath)(
|
|
31694
|
+
linkPath = await (0, import_promises3.realpath)(path17);
|
|
31695
31695
|
} catch (e) {
|
|
31696
31696
|
this.fsw._emitReady();
|
|
31697
31697
|
return true;
|
|
@@ -31701,12 +31701,12 @@ var NodeFsHandler = class {
|
|
|
31701
31701
|
if (dir.has(item)) {
|
|
31702
31702
|
if (this.fsw._symlinkPaths.get(full) !== linkPath) {
|
|
31703
31703
|
this.fsw._symlinkPaths.set(full, linkPath);
|
|
31704
|
-
this.fsw._emit(EV.CHANGE,
|
|
31704
|
+
this.fsw._emit(EV.CHANGE, path17, entry.stats);
|
|
31705
31705
|
}
|
|
31706
31706
|
} else {
|
|
31707
31707
|
dir.add(item);
|
|
31708
31708
|
this.fsw._symlinkPaths.set(full, linkPath);
|
|
31709
|
-
this.fsw._emit(EV.ADD,
|
|
31709
|
+
this.fsw._emit(EV.ADD, path17, entry.stats);
|
|
31710
31710
|
}
|
|
31711
31711
|
this.fsw._emitReady();
|
|
31712
31712
|
return true;
|
|
@@ -31736,9 +31736,9 @@ var NodeFsHandler = class {
|
|
|
31736
31736
|
return;
|
|
31737
31737
|
}
|
|
31738
31738
|
const item = entry.path;
|
|
31739
|
-
let
|
|
31739
|
+
let path17 = sp.join(directory, item);
|
|
31740
31740
|
current.add(item);
|
|
31741
|
-
if (entry.stats.isSymbolicLink() && await this._handleSymlink(entry, directory,
|
|
31741
|
+
if (entry.stats.isSymbolicLink() && await this._handleSymlink(entry, directory, path17, item)) {
|
|
31742
31742
|
return;
|
|
31743
31743
|
}
|
|
31744
31744
|
if (this.fsw.closed) {
|
|
@@ -31747,8 +31747,8 @@ var NodeFsHandler = class {
|
|
|
31747
31747
|
}
|
|
31748
31748
|
if (item === target || !target && !previous.has(item)) {
|
|
31749
31749
|
this.fsw._incrReadyCount();
|
|
31750
|
-
|
|
31751
|
-
this._addToNodeFs(
|
|
31750
|
+
path17 = sp.join(dir, sp.relative(dir, path17));
|
|
31751
|
+
this._addToNodeFs(path17, initialAdd, wh, depth + 1);
|
|
31752
31752
|
}
|
|
31753
31753
|
}).on(EV.ERROR, this._boundHandleError);
|
|
31754
31754
|
return new Promise((resolve11, reject) => {
|
|
@@ -31817,13 +31817,13 @@ var NodeFsHandler = class {
|
|
|
31817
31817
|
* @param depth Child path actually targeted for watch
|
|
31818
31818
|
* @param target Child path actually targeted for watch
|
|
31819
31819
|
*/
|
|
31820
|
-
async _addToNodeFs(
|
|
31820
|
+
async _addToNodeFs(path17, initialAdd, priorWh, depth, target) {
|
|
31821
31821
|
const ready = this.fsw._emitReady;
|
|
31822
|
-
if (this.fsw._isIgnored(
|
|
31822
|
+
if (this.fsw._isIgnored(path17) || this.fsw.closed) {
|
|
31823
31823
|
ready();
|
|
31824
31824
|
return false;
|
|
31825
31825
|
}
|
|
31826
|
-
const wh = this.fsw._getWatchHelpers(
|
|
31826
|
+
const wh = this.fsw._getWatchHelpers(path17);
|
|
31827
31827
|
if (priorWh) {
|
|
31828
31828
|
wh.filterPath = (entry) => priorWh.filterPath(entry);
|
|
31829
31829
|
wh.filterDir = (entry) => priorWh.filterDir(entry);
|
|
@@ -31839,8 +31839,8 @@ var NodeFsHandler = class {
|
|
|
31839
31839
|
const follow = this.fsw.options.followSymlinks;
|
|
31840
31840
|
let closer;
|
|
31841
31841
|
if (stats.isDirectory()) {
|
|
31842
|
-
const absPath = sp.resolve(
|
|
31843
|
-
const targetPath = follow ? await (0, import_promises3.realpath)(
|
|
31842
|
+
const absPath = sp.resolve(path17);
|
|
31843
|
+
const targetPath = follow ? await (0, import_promises3.realpath)(path17) : path17;
|
|
31844
31844
|
if (this.fsw.closed)
|
|
31845
31845
|
return;
|
|
31846
31846
|
closer = await this._handleDir(wh.watchPath, stats, initialAdd, depth, target, wh, targetPath);
|
|
@@ -31850,29 +31850,29 @@ var NodeFsHandler = class {
|
|
|
31850
31850
|
this.fsw._symlinkPaths.set(absPath, targetPath);
|
|
31851
31851
|
}
|
|
31852
31852
|
} else if (stats.isSymbolicLink()) {
|
|
31853
|
-
const targetPath = follow ? await (0, import_promises3.realpath)(
|
|
31853
|
+
const targetPath = follow ? await (0, import_promises3.realpath)(path17) : path17;
|
|
31854
31854
|
if (this.fsw.closed)
|
|
31855
31855
|
return;
|
|
31856
31856
|
const parent = sp.dirname(wh.watchPath);
|
|
31857
31857
|
this.fsw._getWatchedDir(parent).add(wh.watchPath);
|
|
31858
31858
|
this.fsw._emit(EV.ADD, wh.watchPath, stats);
|
|
31859
|
-
closer = await this._handleDir(parent, stats, initialAdd, depth,
|
|
31859
|
+
closer = await this._handleDir(parent, stats, initialAdd, depth, path17, wh, targetPath);
|
|
31860
31860
|
if (this.fsw.closed)
|
|
31861
31861
|
return;
|
|
31862
31862
|
if (targetPath !== void 0) {
|
|
31863
|
-
this.fsw._symlinkPaths.set(sp.resolve(
|
|
31863
|
+
this.fsw._symlinkPaths.set(sp.resolve(path17), targetPath);
|
|
31864
31864
|
}
|
|
31865
31865
|
} else {
|
|
31866
31866
|
closer = this._handleFile(wh.watchPath, stats, initialAdd);
|
|
31867
31867
|
}
|
|
31868
31868
|
ready();
|
|
31869
31869
|
if (closer)
|
|
31870
|
-
this.fsw._addPathCloser(
|
|
31870
|
+
this.fsw._addPathCloser(path17, closer);
|
|
31871
31871
|
return false;
|
|
31872
31872
|
} catch (error) {
|
|
31873
31873
|
if (this.fsw._handleError(error)) {
|
|
31874
31874
|
ready();
|
|
31875
|
-
return
|
|
31875
|
+
return path17;
|
|
31876
31876
|
}
|
|
31877
31877
|
}
|
|
31878
31878
|
}
|
|
@@ -31915,24 +31915,24 @@ function createPattern(matcher) {
|
|
|
31915
31915
|
}
|
|
31916
31916
|
return () => false;
|
|
31917
31917
|
}
|
|
31918
|
-
function normalizePath(
|
|
31919
|
-
if (typeof
|
|
31918
|
+
function normalizePath(path17) {
|
|
31919
|
+
if (typeof path17 !== "string")
|
|
31920
31920
|
throw new Error("string expected");
|
|
31921
|
-
|
|
31922
|
-
|
|
31921
|
+
path17 = sp2.normalize(path17);
|
|
31922
|
+
path17 = path17.replace(/\\/g, "/");
|
|
31923
31923
|
let prepend = false;
|
|
31924
|
-
if (
|
|
31924
|
+
if (path17.startsWith("//"))
|
|
31925
31925
|
prepend = true;
|
|
31926
|
-
|
|
31926
|
+
path17 = path17.replace(DOUBLE_SLASH_RE, "/");
|
|
31927
31927
|
if (prepend)
|
|
31928
|
-
|
|
31929
|
-
return
|
|
31928
|
+
path17 = "/" + path17;
|
|
31929
|
+
return path17;
|
|
31930
31930
|
}
|
|
31931
31931
|
function matchPatterns(patterns, testString, stats) {
|
|
31932
|
-
const
|
|
31932
|
+
const path17 = normalizePath(testString);
|
|
31933
31933
|
for (let index = 0; index < patterns.length; index++) {
|
|
31934
31934
|
const pattern = patterns[index];
|
|
31935
|
-
if (pattern(
|
|
31935
|
+
if (pattern(path17, stats)) {
|
|
31936
31936
|
return true;
|
|
31937
31937
|
}
|
|
31938
31938
|
}
|
|
@@ -31970,19 +31970,19 @@ var toUnix = (string) => {
|
|
|
31970
31970
|
}
|
|
31971
31971
|
return str;
|
|
31972
31972
|
};
|
|
31973
|
-
var normalizePathToUnix = (
|
|
31974
|
-
var normalizeIgnored = (cwd = "") => (
|
|
31975
|
-
if (typeof
|
|
31976
|
-
return normalizePathToUnix(sp2.isAbsolute(
|
|
31973
|
+
var normalizePathToUnix = (path17) => toUnix(sp2.normalize(toUnix(path17)));
|
|
31974
|
+
var normalizeIgnored = (cwd = "") => (path17) => {
|
|
31975
|
+
if (typeof path17 === "string") {
|
|
31976
|
+
return normalizePathToUnix(sp2.isAbsolute(path17) ? path17 : sp2.join(cwd, path17));
|
|
31977
31977
|
} else {
|
|
31978
|
-
return
|
|
31978
|
+
return path17;
|
|
31979
31979
|
}
|
|
31980
31980
|
};
|
|
31981
|
-
var getAbsolutePath = (
|
|
31982
|
-
if (sp2.isAbsolute(
|
|
31983
|
-
return
|
|
31981
|
+
var getAbsolutePath = (path17, cwd) => {
|
|
31982
|
+
if (sp2.isAbsolute(path17)) {
|
|
31983
|
+
return path17;
|
|
31984
31984
|
}
|
|
31985
|
-
return sp2.join(cwd,
|
|
31985
|
+
return sp2.join(cwd, path17);
|
|
31986
31986
|
};
|
|
31987
31987
|
var EMPTY_SET = Object.freeze(/* @__PURE__ */ new Set());
|
|
31988
31988
|
var DirEntry = class {
|
|
@@ -32047,10 +32047,10 @@ var WatchHelper = class {
|
|
|
32047
32047
|
dirParts;
|
|
32048
32048
|
followSymlinks;
|
|
32049
32049
|
statMethod;
|
|
32050
|
-
constructor(
|
|
32050
|
+
constructor(path17, follow, fsw) {
|
|
32051
32051
|
this.fsw = fsw;
|
|
32052
|
-
const watchPath =
|
|
32053
|
-
this.path =
|
|
32052
|
+
const watchPath = path17;
|
|
32053
|
+
this.path = path17 = path17.replace(REPLACER_RE, "");
|
|
32054
32054
|
this.watchPath = watchPath;
|
|
32055
32055
|
this.fullWatchPath = sp2.resolve(watchPath);
|
|
32056
32056
|
this.dirParts = [];
|
|
@@ -32190,20 +32190,20 @@ var FSWatcher = class extends import_node_events.EventEmitter {
|
|
|
32190
32190
|
this._closePromise = void 0;
|
|
32191
32191
|
let paths = unifyPaths(paths_);
|
|
32192
32192
|
if (cwd) {
|
|
32193
|
-
paths = paths.map((
|
|
32194
|
-
const absPath = getAbsolutePath(
|
|
32193
|
+
paths = paths.map((path17) => {
|
|
32194
|
+
const absPath = getAbsolutePath(path17, cwd);
|
|
32195
32195
|
return absPath;
|
|
32196
32196
|
});
|
|
32197
32197
|
}
|
|
32198
|
-
paths.forEach((
|
|
32199
|
-
this._removeIgnoredPath(
|
|
32198
|
+
paths.forEach((path17) => {
|
|
32199
|
+
this._removeIgnoredPath(path17);
|
|
32200
32200
|
});
|
|
32201
32201
|
this._userIgnored = void 0;
|
|
32202
32202
|
if (!this._readyCount)
|
|
32203
32203
|
this._readyCount = 0;
|
|
32204
32204
|
this._readyCount += paths.length;
|
|
32205
|
-
Promise.all(paths.map(async (
|
|
32206
|
-
const res = await this._nodeFsHandler._addToNodeFs(
|
|
32205
|
+
Promise.all(paths.map(async (path17) => {
|
|
32206
|
+
const res = await this._nodeFsHandler._addToNodeFs(path17, !_internal, void 0, 0, _origAdd);
|
|
32207
32207
|
if (res)
|
|
32208
32208
|
this._emitReady();
|
|
32209
32209
|
return res;
|
|
@@ -32225,17 +32225,17 @@ var FSWatcher = class extends import_node_events.EventEmitter {
|
|
|
32225
32225
|
return this;
|
|
32226
32226
|
const paths = unifyPaths(paths_);
|
|
32227
32227
|
const { cwd } = this.options;
|
|
32228
|
-
paths.forEach((
|
|
32229
|
-
if (!sp2.isAbsolute(
|
|
32228
|
+
paths.forEach((path17) => {
|
|
32229
|
+
if (!sp2.isAbsolute(path17) && !this._closers.has(path17)) {
|
|
32230
32230
|
if (cwd)
|
|
32231
|
-
|
|
32232
|
-
|
|
32231
|
+
path17 = sp2.join(cwd, path17);
|
|
32232
|
+
path17 = sp2.resolve(path17);
|
|
32233
32233
|
}
|
|
32234
|
-
this._closePath(
|
|
32235
|
-
this._addIgnoredPath(
|
|
32236
|
-
if (this._watched.has(
|
|
32234
|
+
this._closePath(path17);
|
|
32235
|
+
this._addIgnoredPath(path17);
|
|
32236
|
+
if (this._watched.has(path17)) {
|
|
32237
32237
|
this._addIgnoredPath({
|
|
32238
|
-
path:
|
|
32238
|
+
path: path17,
|
|
32239
32239
|
recursive: true
|
|
32240
32240
|
});
|
|
32241
32241
|
}
|
|
@@ -32299,38 +32299,38 @@ var FSWatcher = class extends import_node_events.EventEmitter {
|
|
|
32299
32299
|
* @param stats arguments to be passed with event
|
|
32300
32300
|
* @returns the error if defined, otherwise the value of the FSWatcher instance's `closed` flag
|
|
32301
32301
|
*/
|
|
32302
|
-
async _emit(event,
|
|
32302
|
+
async _emit(event, path17, stats) {
|
|
32303
32303
|
if (this.closed)
|
|
32304
32304
|
return;
|
|
32305
32305
|
const opts = this.options;
|
|
32306
32306
|
if (isWindows)
|
|
32307
|
-
|
|
32307
|
+
path17 = sp2.normalize(path17);
|
|
32308
32308
|
if (opts.cwd)
|
|
32309
|
-
|
|
32310
|
-
const args = [
|
|
32309
|
+
path17 = sp2.relative(opts.cwd, path17);
|
|
32310
|
+
const args = [path17];
|
|
32311
32311
|
if (stats != null)
|
|
32312
32312
|
args.push(stats);
|
|
32313
32313
|
const awf = opts.awaitWriteFinish;
|
|
32314
32314
|
let pw;
|
|
32315
|
-
if (awf && (pw = this._pendingWrites.get(
|
|
32315
|
+
if (awf && (pw = this._pendingWrites.get(path17))) {
|
|
32316
32316
|
pw.lastChange = /* @__PURE__ */ new Date();
|
|
32317
32317
|
return this;
|
|
32318
32318
|
}
|
|
32319
32319
|
if (opts.atomic) {
|
|
32320
32320
|
if (event === EVENTS.UNLINK) {
|
|
32321
|
-
this._pendingUnlinks.set(
|
|
32321
|
+
this._pendingUnlinks.set(path17, [event, ...args]);
|
|
32322
32322
|
setTimeout(() => {
|
|
32323
|
-
this._pendingUnlinks.forEach((entry,
|
|
32323
|
+
this._pendingUnlinks.forEach((entry, path18) => {
|
|
32324
32324
|
this.emit(...entry);
|
|
32325
32325
|
this.emit(EVENTS.ALL, ...entry);
|
|
32326
|
-
this._pendingUnlinks.delete(
|
|
32326
|
+
this._pendingUnlinks.delete(path18);
|
|
32327
32327
|
});
|
|
32328
32328
|
}, typeof opts.atomic === "number" ? opts.atomic : 100);
|
|
32329
32329
|
return this;
|
|
32330
32330
|
}
|
|
32331
|
-
if (event === EVENTS.ADD && this._pendingUnlinks.has(
|
|
32331
|
+
if (event === EVENTS.ADD && this._pendingUnlinks.has(path17)) {
|
|
32332
32332
|
event = EVENTS.CHANGE;
|
|
32333
|
-
this._pendingUnlinks.delete(
|
|
32333
|
+
this._pendingUnlinks.delete(path17);
|
|
32334
32334
|
}
|
|
32335
32335
|
}
|
|
32336
32336
|
if (awf && (event === EVENTS.ADD || event === EVENTS.CHANGE) && this._readyEmitted) {
|
|
@@ -32348,16 +32348,16 @@ var FSWatcher = class extends import_node_events.EventEmitter {
|
|
|
32348
32348
|
this.emitWithAll(event, args);
|
|
32349
32349
|
}
|
|
32350
32350
|
};
|
|
32351
|
-
this._awaitWriteFinish(
|
|
32351
|
+
this._awaitWriteFinish(path17, awf.stabilityThreshold, event, awfEmit);
|
|
32352
32352
|
return this;
|
|
32353
32353
|
}
|
|
32354
32354
|
if (event === EVENTS.CHANGE) {
|
|
32355
|
-
const isThrottled = !this._throttle(EVENTS.CHANGE,
|
|
32355
|
+
const isThrottled = !this._throttle(EVENTS.CHANGE, path17, 50);
|
|
32356
32356
|
if (isThrottled)
|
|
32357
32357
|
return this;
|
|
32358
32358
|
}
|
|
32359
32359
|
if (opts.alwaysStat && stats === void 0 && (event === EVENTS.ADD || event === EVENTS.ADD_DIR || event === EVENTS.CHANGE)) {
|
|
32360
|
-
const fullPath = opts.cwd ? sp2.join(opts.cwd,
|
|
32360
|
+
const fullPath = opts.cwd ? sp2.join(opts.cwd, path17) : path17;
|
|
32361
32361
|
let stats2;
|
|
32362
32362
|
try {
|
|
32363
32363
|
stats2 = await (0, import_promises4.stat)(fullPath);
|
|
@@ -32388,23 +32388,23 @@ var FSWatcher = class extends import_node_events.EventEmitter {
|
|
|
32388
32388
|
* @param timeout duration of time to suppress duplicate actions
|
|
32389
32389
|
* @returns tracking object or false if action should be suppressed
|
|
32390
32390
|
*/
|
|
32391
|
-
_throttle(actionType,
|
|
32391
|
+
_throttle(actionType, path17, timeout) {
|
|
32392
32392
|
if (!this._throttled.has(actionType)) {
|
|
32393
32393
|
this._throttled.set(actionType, /* @__PURE__ */ new Map());
|
|
32394
32394
|
}
|
|
32395
32395
|
const action = this._throttled.get(actionType);
|
|
32396
32396
|
if (!action)
|
|
32397
32397
|
throw new Error("invalid throttle");
|
|
32398
|
-
const actionPath = action.get(
|
|
32398
|
+
const actionPath = action.get(path17);
|
|
32399
32399
|
if (actionPath) {
|
|
32400
32400
|
actionPath.count++;
|
|
32401
32401
|
return false;
|
|
32402
32402
|
}
|
|
32403
32403
|
let timeoutObject;
|
|
32404
32404
|
const clear = () => {
|
|
32405
|
-
const item = action.get(
|
|
32405
|
+
const item = action.get(path17);
|
|
32406
32406
|
const count = item ? item.count : 0;
|
|
32407
|
-
action.delete(
|
|
32407
|
+
action.delete(path17);
|
|
32408
32408
|
clearTimeout(timeoutObject);
|
|
32409
32409
|
if (item)
|
|
32410
32410
|
clearTimeout(item.timeoutObject);
|
|
@@ -32412,7 +32412,7 @@ var FSWatcher = class extends import_node_events.EventEmitter {
|
|
|
32412
32412
|
};
|
|
32413
32413
|
timeoutObject = setTimeout(clear, timeout);
|
|
32414
32414
|
const thr = { timeoutObject, clear, count: 0 };
|
|
32415
|
-
action.set(
|
|
32415
|
+
action.set(path17, thr);
|
|
32416
32416
|
return thr;
|
|
32417
32417
|
}
|
|
32418
32418
|
_incrReadyCount() {
|
|
@@ -32426,44 +32426,44 @@ var FSWatcher = class extends import_node_events.EventEmitter {
|
|
|
32426
32426
|
* @param event
|
|
32427
32427
|
* @param awfEmit Callback to be called when ready for event to be emitted.
|
|
32428
32428
|
*/
|
|
32429
|
-
_awaitWriteFinish(
|
|
32429
|
+
_awaitWriteFinish(path17, threshold, event, awfEmit) {
|
|
32430
32430
|
const awf = this.options.awaitWriteFinish;
|
|
32431
32431
|
if (typeof awf !== "object")
|
|
32432
32432
|
return;
|
|
32433
32433
|
const pollInterval = awf.pollInterval;
|
|
32434
32434
|
let timeoutHandler;
|
|
32435
|
-
let fullPath =
|
|
32436
|
-
if (this.options.cwd && !sp2.isAbsolute(
|
|
32437
|
-
fullPath = sp2.join(this.options.cwd,
|
|
32435
|
+
let fullPath = path17;
|
|
32436
|
+
if (this.options.cwd && !sp2.isAbsolute(path17)) {
|
|
32437
|
+
fullPath = sp2.join(this.options.cwd, path17);
|
|
32438
32438
|
}
|
|
32439
32439
|
const now = /* @__PURE__ */ new Date();
|
|
32440
32440
|
const writes = this._pendingWrites;
|
|
32441
32441
|
function awaitWriteFinishFn(prevStat) {
|
|
32442
32442
|
(0, import_node_fs2.stat)(fullPath, (err, curStat) => {
|
|
32443
|
-
if (err || !writes.has(
|
|
32443
|
+
if (err || !writes.has(path17)) {
|
|
32444
32444
|
if (err && err.code !== "ENOENT")
|
|
32445
32445
|
awfEmit(err);
|
|
32446
32446
|
return;
|
|
32447
32447
|
}
|
|
32448
32448
|
const now2 = Number(/* @__PURE__ */ new Date());
|
|
32449
32449
|
if (prevStat && curStat.size !== prevStat.size) {
|
|
32450
|
-
writes.get(
|
|
32450
|
+
writes.get(path17).lastChange = now2;
|
|
32451
32451
|
}
|
|
32452
|
-
const pw = writes.get(
|
|
32452
|
+
const pw = writes.get(path17);
|
|
32453
32453
|
const df = now2 - pw.lastChange;
|
|
32454
32454
|
if (df >= threshold) {
|
|
32455
|
-
writes.delete(
|
|
32455
|
+
writes.delete(path17);
|
|
32456
32456
|
awfEmit(void 0, curStat);
|
|
32457
32457
|
} else {
|
|
32458
32458
|
timeoutHandler = setTimeout(awaitWriteFinishFn, pollInterval, curStat);
|
|
32459
32459
|
}
|
|
32460
32460
|
});
|
|
32461
32461
|
}
|
|
32462
|
-
if (!writes.has(
|
|
32463
|
-
writes.set(
|
|
32462
|
+
if (!writes.has(path17)) {
|
|
32463
|
+
writes.set(path17, {
|
|
32464
32464
|
lastChange: now,
|
|
32465
32465
|
cancelWait: () => {
|
|
32466
|
-
writes.delete(
|
|
32466
|
+
writes.delete(path17);
|
|
32467
32467
|
clearTimeout(timeoutHandler);
|
|
32468
32468
|
return event;
|
|
32469
32469
|
}
|
|
@@ -32474,8 +32474,8 @@ var FSWatcher = class extends import_node_events.EventEmitter {
|
|
|
32474
32474
|
/**
|
|
32475
32475
|
* Determines whether user has asked to ignore this path.
|
|
32476
32476
|
*/
|
|
32477
|
-
_isIgnored(
|
|
32478
|
-
if (this.options.atomic && DOT_RE.test(
|
|
32477
|
+
_isIgnored(path17, stats) {
|
|
32478
|
+
if (this.options.atomic && DOT_RE.test(path17))
|
|
32479
32479
|
return true;
|
|
32480
32480
|
if (!this._userIgnored) {
|
|
32481
32481
|
const { cwd } = this.options;
|
|
@@ -32485,17 +32485,17 @@ var FSWatcher = class extends import_node_events.EventEmitter {
|
|
|
32485
32485
|
const list = [...ignoredPaths.map(normalizeIgnored(cwd)), ...ignored];
|
|
32486
32486
|
this._userIgnored = anymatch(list, void 0);
|
|
32487
32487
|
}
|
|
32488
|
-
return this._userIgnored(
|
|
32488
|
+
return this._userIgnored(path17, stats);
|
|
32489
32489
|
}
|
|
32490
|
-
_isntIgnored(
|
|
32491
|
-
return !this._isIgnored(
|
|
32490
|
+
_isntIgnored(path17, stat9) {
|
|
32491
|
+
return !this._isIgnored(path17, stat9);
|
|
32492
32492
|
}
|
|
32493
32493
|
/**
|
|
32494
32494
|
* Provides a set of common helpers and properties relating to symlink handling.
|
|
32495
32495
|
* @param path file or directory pattern being watched
|
|
32496
32496
|
*/
|
|
32497
|
-
_getWatchHelpers(
|
|
32498
|
-
return new WatchHelper(
|
|
32497
|
+
_getWatchHelpers(path17) {
|
|
32498
|
+
return new WatchHelper(path17, this.options.followSymlinks, this);
|
|
32499
32499
|
}
|
|
32500
32500
|
// Directory helpers
|
|
32501
32501
|
// -----------------
|
|
@@ -32527,63 +32527,63 @@ var FSWatcher = class extends import_node_events.EventEmitter {
|
|
|
32527
32527
|
* @param item base path of item/directory
|
|
32528
32528
|
*/
|
|
32529
32529
|
_remove(directory, item, isDirectory) {
|
|
32530
|
-
const
|
|
32531
|
-
const fullPath = sp2.resolve(
|
|
32532
|
-
isDirectory = isDirectory != null ? isDirectory : this._watched.has(
|
|
32533
|
-
if (!this._throttle("remove",
|
|
32530
|
+
const path17 = sp2.join(directory, item);
|
|
32531
|
+
const fullPath = sp2.resolve(path17);
|
|
32532
|
+
isDirectory = isDirectory != null ? isDirectory : this._watched.has(path17) || this._watched.has(fullPath);
|
|
32533
|
+
if (!this._throttle("remove", path17, 100))
|
|
32534
32534
|
return;
|
|
32535
32535
|
if (!isDirectory && this._watched.size === 1) {
|
|
32536
32536
|
this.add(directory, item, true);
|
|
32537
32537
|
}
|
|
32538
|
-
const wp = this._getWatchedDir(
|
|
32538
|
+
const wp = this._getWatchedDir(path17);
|
|
32539
32539
|
const nestedDirectoryChildren = wp.getChildren();
|
|
32540
|
-
nestedDirectoryChildren.forEach((nested) => this._remove(
|
|
32540
|
+
nestedDirectoryChildren.forEach((nested) => this._remove(path17, nested));
|
|
32541
32541
|
const parent = this._getWatchedDir(directory);
|
|
32542
32542
|
const wasTracked = parent.has(item);
|
|
32543
32543
|
parent.remove(item);
|
|
32544
32544
|
if (this._symlinkPaths.has(fullPath)) {
|
|
32545
32545
|
this._symlinkPaths.delete(fullPath);
|
|
32546
32546
|
}
|
|
32547
|
-
let relPath =
|
|
32547
|
+
let relPath = path17;
|
|
32548
32548
|
if (this.options.cwd)
|
|
32549
|
-
relPath = sp2.relative(this.options.cwd,
|
|
32549
|
+
relPath = sp2.relative(this.options.cwd, path17);
|
|
32550
32550
|
if (this.options.awaitWriteFinish && this._pendingWrites.has(relPath)) {
|
|
32551
32551
|
const event = this._pendingWrites.get(relPath).cancelWait();
|
|
32552
32552
|
if (event === EVENTS.ADD)
|
|
32553
32553
|
return;
|
|
32554
32554
|
}
|
|
32555
|
-
this._watched.delete(
|
|
32555
|
+
this._watched.delete(path17);
|
|
32556
32556
|
this._watched.delete(fullPath);
|
|
32557
32557
|
const eventName = isDirectory ? EVENTS.UNLINK_DIR : EVENTS.UNLINK;
|
|
32558
|
-
if (wasTracked && !this._isIgnored(
|
|
32559
|
-
this._emit(eventName,
|
|
32560
|
-
this._closePath(
|
|
32558
|
+
if (wasTracked && !this._isIgnored(path17))
|
|
32559
|
+
this._emit(eventName, path17);
|
|
32560
|
+
this._closePath(path17);
|
|
32561
32561
|
}
|
|
32562
32562
|
/**
|
|
32563
32563
|
* Closes all watchers for a path
|
|
32564
32564
|
*/
|
|
32565
|
-
_closePath(
|
|
32566
|
-
this._closeFile(
|
|
32567
|
-
const dir = sp2.dirname(
|
|
32568
|
-
this._getWatchedDir(dir).remove(sp2.basename(
|
|
32565
|
+
_closePath(path17) {
|
|
32566
|
+
this._closeFile(path17);
|
|
32567
|
+
const dir = sp2.dirname(path17);
|
|
32568
|
+
this._getWatchedDir(dir).remove(sp2.basename(path17));
|
|
32569
32569
|
}
|
|
32570
32570
|
/**
|
|
32571
32571
|
* Closes only file-specific watchers
|
|
32572
32572
|
*/
|
|
32573
|
-
_closeFile(
|
|
32574
|
-
const closers = this._closers.get(
|
|
32573
|
+
_closeFile(path17) {
|
|
32574
|
+
const closers = this._closers.get(path17);
|
|
32575
32575
|
if (!closers)
|
|
32576
32576
|
return;
|
|
32577
32577
|
closers.forEach((closer) => closer());
|
|
32578
|
-
this._closers.delete(
|
|
32578
|
+
this._closers.delete(path17);
|
|
32579
32579
|
}
|
|
32580
|
-
_addPathCloser(
|
|
32580
|
+
_addPathCloser(path17, closer) {
|
|
32581
32581
|
if (!closer)
|
|
32582
32582
|
return;
|
|
32583
|
-
let list = this._closers.get(
|
|
32583
|
+
let list = this._closers.get(path17);
|
|
32584
32584
|
if (!list) {
|
|
32585
32585
|
list = [];
|
|
32586
|
-
this._closers.set(
|
|
32586
|
+
this._closers.set(path17, list);
|
|
32587
32587
|
}
|
|
32588
32588
|
list.push(closer);
|
|
32589
32589
|
}
|
|
@@ -32616,7 +32616,7 @@ var chokidar_default = { watch, FSWatcher };
|
|
|
32616
32616
|
var import_node_cron = __toESM(require_node_cron());
|
|
32617
32617
|
|
|
32618
32618
|
// src/agent/createAgent.ts
|
|
32619
|
-
var
|
|
32619
|
+
var import_node_fs6 = require("node:fs");
|
|
32620
32620
|
|
|
32621
32621
|
// src/background/BackgroundManager.ts
|
|
32622
32622
|
var import_child_process = require("child_process");
|
|
@@ -34046,12 +34046,12 @@ function encodeURIPath(str) {
|
|
|
34046
34046
|
return str.replace(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/g, encodeURIComponent);
|
|
34047
34047
|
}
|
|
34048
34048
|
var EMPTY = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.create(null));
|
|
34049
|
-
var createPathTagFunction = (pathEncoder = encodeURIPath) => function
|
|
34049
|
+
var createPathTagFunction = (pathEncoder = encodeURIPath) => function path17(statics, ...params) {
|
|
34050
34050
|
if (statics.length === 1)
|
|
34051
34051
|
return statics[0];
|
|
34052
34052
|
let postPath = false;
|
|
34053
34053
|
const invalidSegments = [];
|
|
34054
|
-
const
|
|
34054
|
+
const path18 = statics.reduce((previousValue, currentValue, index) => {
|
|
34055
34055
|
if (/[?#]/.test(currentValue)) {
|
|
34056
34056
|
postPath = true;
|
|
34057
34057
|
}
|
|
@@ -34068,7 +34068,7 @@ var createPathTagFunction = (pathEncoder = encodeURIPath) => function path16(sta
|
|
|
34068
34068
|
}
|
|
34069
34069
|
return previousValue + currentValue + (index === params.length ? "" : encoded);
|
|
34070
34070
|
}, "");
|
|
34071
|
-
const pathOnly =
|
|
34071
|
+
const pathOnly = path18.split(/[?#]/, 1)[0];
|
|
34072
34072
|
const invalidSegmentPattern = /(?<=^|\/)(?:\.|%2e){1,2}(?=\/|$)/gi;
|
|
34073
34073
|
let match2;
|
|
34074
34074
|
while ((match2 = invalidSegmentPattern.exec(pathOnly)) !== null) {
|
|
@@ -34089,10 +34089,10 @@ var createPathTagFunction = (pathEncoder = encodeURIPath) => function path16(sta
|
|
|
34089
34089
|
}, "");
|
|
34090
34090
|
throw new AnthropicError(`Path parameters result in path with invalid segments:
|
|
34091
34091
|
${invalidSegments.map((e) => e.error).join("\n")}
|
|
34092
|
-
${
|
|
34092
|
+
${path18}
|
|
34093
34093
|
${underline}`);
|
|
34094
34094
|
}
|
|
34095
|
-
return
|
|
34095
|
+
return path18;
|
|
34096
34096
|
};
|
|
34097
34097
|
var path4 = /* @__PURE__ */ createPathTagFunction(encodeURIPath);
|
|
34098
34098
|
|
|
@@ -37203,9 +37203,9 @@ var BaseAnthropic = class {
|
|
|
37203
37203
|
makeStatusError(status, error, message, headers) {
|
|
37204
37204
|
return APIError.generate(status, error, message, headers);
|
|
37205
37205
|
}
|
|
37206
|
-
buildURL(
|
|
37206
|
+
buildURL(path17, query, defaultBaseURL) {
|
|
37207
37207
|
const baseURL = !__classPrivateFieldGet(this, _BaseAnthropic_instances, "m", _BaseAnthropic_baseURLOverridden).call(this) && defaultBaseURL || this.baseURL;
|
|
37208
|
-
const url = isAbsoluteURL(
|
|
37208
|
+
const url = isAbsoluteURL(path17) ? new URL(path17) : new URL(baseURL + (baseURL.endsWith("/") && path17.startsWith("/") ? path17.slice(1) : path17));
|
|
37209
37209
|
const defaultQuery = this.defaultQuery();
|
|
37210
37210
|
if (!isEmptyObj(defaultQuery)) {
|
|
37211
37211
|
query = { ...defaultQuery, ...query };
|
|
@@ -37236,24 +37236,24 @@ var BaseAnthropic = class {
|
|
|
37236
37236
|
*/
|
|
37237
37237
|
async prepareRequest(request, { url, options }) {
|
|
37238
37238
|
}
|
|
37239
|
-
get(
|
|
37240
|
-
return this.methodRequest("get",
|
|
37239
|
+
get(path17, opts) {
|
|
37240
|
+
return this.methodRequest("get", path17, opts);
|
|
37241
37241
|
}
|
|
37242
|
-
post(
|
|
37243
|
-
return this.methodRequest("post",
|
|
37242
|
+
post(path17, opts) {
|
|
37243
|
+
return this.methodRequest("post", path17, opts);
|
|
37244
37244
|
}
|
|
37245
|
-
patch(
|
|
37246
|
-
return this.methodRequest("patch",
|
|
37245
|
+
patch(path17, opts) {
|
|
37246
|
+
return this.methodRequest("patch", path17, opts);
|
|
37247
37247
|
}
|
|
37248
|
-
put(
|
|
37249
|
-
return this.methodRequest("put",
|
|
37248
|
+
put(path17, opts) {
|
|
37249
|
+
return this.methodRequest("put", path17, opts);
|
|
37250
37250
|
}
|
|
37251
|
-
delete(
|
|
37252
|
-
return this.methodRequest("delete",
|
|
37251
|
+
delete(path17, opts) {
|
|
37252
|
+
return this.methodRequest("delete", path17, opts);
|
|
37253
37253
|
}
|
|
37254
|
-
methodRequest(method,
|
|
37254
|
+
methodRequest(method, path17, opts) {
|
|
37255
37255
|
return this.request(Promise.resolve(opts).then((opts2) => {
|
|
37256
|
-
return { method, path:
|
|
37256
|
+
return { method, path: path17, ...opts2 };
|
|
37257
37257
|
}));
|
|
37258
37258
|
}
|
|
37259
37259
|
request(options, remainingRetries = null) {
|
|
@@ -37357,8 +37357,8 @@ var BaseAnthropic = class {
|
|
|
37357
37357
|
}));
|
|
37358
37358
|
return { response, options, controller, requestLogID, retryOfRequestLogID, startTime: startTime2 };
|
|
37359
37359
|
}
|
|
37360
|
-
getAPIList(
|
|
37361
|
-
return this.requestAPIList(Page2, opts && "then" in opts ? opts.then((opts2) => ({ method: "get", path:
|
|
37360
|
+
getAPIList(path17, Page2, opts) {
|
|
37361
|
+
return this.requestAPIList(Page2, opts && "then" in opts ? opts.then((opts2) => ({ method: "get", path: path17, ...opts2 })) : { method: "get", path: path17, ...opts });
|
|
37362
37362
|
}
|
|
37363
37363
|
requestAPIList(Page2, options) {
|
|
37364
37364
|
const request = this.makeRequest(options, null, void 0);
|
|
@@ -37446,8 +37446,8 @@ var BaseAnthropic = class {
|
|
|
37446
37446
|
}
|
|
37447
37447
|
async buildRequest(inputOptions, { retryCount = 0 } = {}) {
|
|
37448
37448
|
const options = { ...inputOptions };
|
|
37449
|
-
const { method, path:
|
|
37450
|
-
const url = this.buildURL(
|
|
37449
|
+
const { method, path: path17, query, defaultBaseURL } = options;
|
|
37450
|
+
const url = this.buildURL(path17, query, defaultBaseURL);
|
|
37451
37451
|
if ("timeout" in options)
|
|
37452
37452
|
validatePositiveInteger("timeout", options.timeout);
|
|
37453
37453
|
options.timeout = options.timeout ?? this.timeout;
|
|
@@ -37840,9 +37840,13 @@ var createFileStorage = (options = {}) => {
|
|
|
37840
37840
|
|
|
37841
37841
|
// src/storage/RedisStorage.ts
|
|
37842
37842
|
var import_redis3 = __toESM(require_dist2());
|
|
37843
|
-
var
|
|
37844
|
-
|
|
37845
|
-
|
|
37843
|
+
var sharedClients = /* @__PURE__ */ new Map();
|
|
37844
|
+
var getRedisUrl = (url) => {
|
|
37845
|
+
return url || process.env.REDIS_URL || `redis://localhost:6379`;
|
|
37846
|
+
};
|
|
37847
|
+
var createSharedClient = (url) => {
|
|
37848
|
+
const client2 = (0, import_redis3.createClient)({
|
|
37849
|
+
url,
|
|
37846
37850
|
socket: {
|
|
37847
37851
|
// 连接超时时间(毫秒),默认是 5000ms
|
|
37848
37852
|
connectTimeout: 1e4,
|
|
@@ -37858,28 +37862,50 @@ var createRedisStorage = (options = {}) => {
|
|
|
37858
37862
|
}
|
|
37859
37863
|
}
|
|
37860
37864
|
});
|
|
37861
|
-
|
|
37865
|
+
client2.on("error", (err) => {
|
|
37862
37866
|
console.error(`[RedisStorage] Redis\u9519\u8BEF:`, err);
|
|
37863
37867
|
});
|
|
37864
|
-
|
|
37868
|
+
client2.on("ready", () => {
|
|
37865
37869
|
console.log(`[RedisStorage] Redis\u8FDE\u63A5\u5C31\u7EEA`);
|
|
37866
37870
|
});
|
|
37867
|
-
|
|
37871
|
+
client2.on("reconnecting", () => {
|
|
37868
37872
|
console.log(`[RedisStorage] Redis\u6B63\u5728\u91CD\u8FDE...`);
|
|
37869
37873
|
});
|
|
37870
|
-
|
|
37871
|
-
|
|
37872
|
-
|
|
37874
|
+
return { client: client2, connectPromise: null };
|
|
37875
|
+
};
|
|
37876
|
+
var getSharedClient = (url) => {
|
|
37877
|
+
const existing = sharedClients.get(url);
|
|
37878
|
+
if (existing) return existing;
|
|
37879
|
+
const shared = createSharedClient(url);
|
|
37880
|
+
sharedClients.set(url, shared);
|
|
37881
|
+
return shared;
|
|
37882
|
+
};
|
|
37883
|
+
var getConnectedClient = async (shared) => {
|
|
37884
|
+
if (shared.client.isOpen) return shared.client;
|
|
37885
|
+
if (!shared.connectPromise) {
|
|
37886
|
+
shared.connectPromise = shared.client.connect().then(() => shared.client).catch((err) => {
|
|
37887
|
+
shared.connectPromise = null;
|
|
37888
|
+
console.error(`[RedisStorage] Redis\u8FDE\u63A5\u5931\u8D25:`, err);
|
|
37889
|
+
throw err;
|
|
37890
|
+
});
|
|
37891
|
+
}
|
|
37892
|
+
return shared.connectPromise;
|
|
37893
|
+
};
|
|
37894
|
+
var createRedisStorage = (options = {}) => {
|
|
37895
|
+
const shared = getSharedClient(getRedisUrl(options.url));
|
|
37873
37896
|
const prefix = options.prefix || `agent:`;
|
|
37874
37897
|
return {
|
|
37875
37898
|
async get(key) {
|
|
37899
|
+
const redisClient = await getConnectedClient(shared);
|
|
37876
37900
|
const data = await redisClient.get(`${prefix}${key}`);
|
|
37877
37901
|
return data ? JSON.parse(data) : null;
|
|
37878
37902
|
},
|
|
37879
37903
|
async set(key, value) {
|
|
37904
|
+
const redisClient = await getConnectedClient(shared);
|
|
37880
37905
|
await redisClient.set(`${prefix}${key}`, JSON.stringify(value));
|
|
37881
37906
|
},
|
|
37882
37907
|
async del(key) {
|
|
37908
|
+
const redisClient = await getConnectedClient(shared);
|
|
37883
37909
|
await redisClient.del(`${prefix}${key}`);
|
|
37884
37910
|
}
|
|
37885
37911
|
};
|
|
@@ -38223,7 +38249,7 @@ var getGoalConversationContext = (goalId) => {
|
|
|
38223
38249
|
const defaultThreadId = getGoalThreadId(goalId);
|
|
38224
38250
|
return {
|
|
38225
38251
|
...context,
|
|
38226
|
-
// 对于由
|
|
38252
|
+
// 对于由 CEO 在外部会话里创建的 goal,需求对话默认继承原始 CEO 线程,
|
|
38227
38253
|
// 而不是重新开一个 kanban:goal:* 独立线程。
|
|
38228
38254
|
threadId: context.originUserId && context.threadId === defaultThreadId ? context.originUserId : context.threadId,
|
|
38229
38255
|
syncReplyToOrigin: context.originPlatform === "feishu" ? true : context.syncReplyToOrigin
|
|
@@ -39357,16 +39383,16 @@ var Diff = class {
|
|
|
39357
39383
|
}
|
|
39358
39384
|
}
|
|
39359
39385
|
}
|
|
39360
|
-
addToPath(
|
|
39361
|
-
const last =
|
|
39386
|
+
addToPath(path17, added, removed, oldPosInc, options) {
|
|
39387
|
+
const last = path17.lastComponent;
|
|
39362
39388
|
if (last && !options.oneChangePerToken && last.added === added && last.removed === removed) {
|
|
39363
39389
|
return {
|
|
39364
|
-
oldPos:
|
|
39390
|
+
oldPos: path17.oldPos + oldPosInc,
|
|
39365
39391
|
lastComponent: { count: last.count + 1, added, removed, previousComponent: last.previousComponent }
|
|
39366
39392
|
};
|
|
39367
39393
|
} else {
|
|
39368
39394
|
return {
|
|
39369
|
-
oldPos:
|
|
39395
|
+
oldPos: path17.oldPos + oldPosInc,
|
|
39370
39396
|
lastComponent: { count: 1, added, removed, previousComponent: last }
|
|
39371
39397
|
};
|
|
39372
39398
|
}
|
|
@@ -41057,10 +41083,10 @@ var goalDelete = {
|
|
|
41057
41083
|
}
|
|
41058
41084
|
};
|
|
41059
41085
|
|
|
41060
|
-
// src/tools/tools/
|
|
41086
|
+
// src/tools/tools/department/DepartmentCreate.ts
|
|
41061
41087
|
var import_node_crypto3 = require("node:crypto");
|
|
41062
41088
|
|
|
41063
|
-
// src/
|
|
41089
|
+
// src/department/mailbox/mailbox.ts
|
|
41064
41090
|
var import_node_crypto2 = require("node:crypto");
|
|
41065
41091
|
|
|
41066
41092
|
// src/db/createDB.ts
|
|
@@ -41187,7 +41213,7 @@ var create_mailbox_events_table = () => {
|
|
|
41187
41213
|
}
|
|
41188
41214
|
};
|
|
41189
41215
|
|
|
41190
|
-
// src/
|
|
41216
|
+
// src/department/mailbox/events.ts
|
|
41191
41217
|
var import_node_crypto = require("node:crypto");
|
|
41192
41218
|
var parseDetail = (detailJson) => {
|
|
41193
41219
|
if (!detailJson) return void 0;
|
|
@@ -41311,77 +41337,124 @@ var listMailboxEvents = (params) => {
|
|
|
41311
41337
|
return rows.map(mapMailboxEventRow);
|
|
41312
41338
|
};
|
|
41313
41339
|
|
|
41314
|
-
// src/
|
|
41340
|
+
// src/department/DepartmentMember.ts
|
|
41315
41341
|
var import_fs13 = require("fs");
|
|
41316
41342
|
var import_path19 = __toESM(require("path"));
|
|
41317
41343
|
|
|
41318
|
-
// src/
|
|
41344
|
+
// src/department/Department.ts
|
|
41319
41345
|
var import_path18 = __toESM(require("path"));
|
|
41320
41346
|
var import_fs12 = require("fs");
|
|
41321
|
-
var
|
|
41347
|
+
var legacyMigrationChecked = false;
|
|
41348
|
+
var getDepartmentBaseDir = () => {
|
|
41349
|
+
return import_path18.default.join(getDuclawHomeDir(), "department");
|
|
41350
|
+
};
|
|
41351
|
+
var getLegacyTeamBaseDir = () => {
|
|
41322
41352
|
return import_path18.default.join(getDuclawHomeDir(), "team");
|
|
41323
41353
|
};
|
|
41324
|
-
var
|
|
41325
|
-
return
|
|
41326
|
-
};
|
|
41327
|
-
var
|
|
41328
|
-
return
|
|
41329
|
-
};
|
|
41330
|
-
var
|
|
41331
|
-
|
|
41332
|
-
|
|
41333
|
-
|
|
41334
|
-
|
|
41335
|
-
|
|
41336
|
-
|
|
41337
|
-
|
|
41338
|
-
|
|
41339
|
-
|
|
41340
|
-
|
|
41341
|
-
|
|
41342
|
-
|
|
41343
|
-
|
|
41344
|
-
|
|
41345
|
-
|
|
41346
|
-
|
|
41347
|
-
|
|
41348
|
-
|
|
41349
|
-
|
|
41350
|
-
|
|
41351
|
-
|
|
41352
|
-
|
|
41353
|
-
|
|
41354
|
-
|
|
41355
|
-
|
|
41354
|
+
var getDepartmentWorkSpaceDir = (departmentName) => {
|
|
41355
|
+
return import_path18.default.join(getDepartmentBaseDir(), "workspace", departmentName);
|
|
41356
|
+
};
|
|
41357
|
+
var getLegacyTeamWorkSpaceDir = (teamName) => {
|
|
41358
|
+
return import_path18.default.join(getLegacyTeamBaseDir(), "workspace", teamName);
|
|
41359
|
+
};
|
|
41360
|
+
var getDepartmentJsonPath = (departmentName) => {
|
|
41361
|
+
return import_path18.default.join(getDepartmentWorkSpaceDir(departmentName), "department.json");
|
|
41362
|
+
};
|
|
41363
|
+
var getLegacyTeamJsonPath = (teamName) => {
|
|
41364
|
+
return import_path18.default.join(getLegacyTeamWorkSpaceDir(teamName), "team.json");
|
|
41365
|
+
};
|
|
41366
|
+
var mapLegacyRole = (role) => {
|
|
41367
|
+
return role === "team_manager" ? "department_head" : "executor";
|
|
41368
|
+
};
|
|
41369
|
+
var mapLegacyDepartment = (legacy) => {
|
|
41370
|
+
const departmentMembers = (legacy.teamMembers ?? []).map((member) => ({
|
|
41371
|
+
id: member.id,
|
|
41372
|
+
name: member.name,
|
|
41373
|
+
departmentId: legacy.id,
|
|
41374
|
+
mailBoxId: member.mailBoxId,
|
|
41375
|
+
workspaceId: member.workspaceId,
|
|
41376
|
+
role: mapLegacyRole(member.role),
|
|
41377
|
+
focusOn: member.focusOn
|
|
41378
|
+
}));
|
|
41379
|
+
const headMemberId = legacy.managerMemberId ?? departmentMembers.find((member) => member.role === "department_head")?.id;
|
|
41380
|
+
return {
|
|
41381
|
+
id: legacy.id,
|
|
41382
|
+
name: legacy.name,
|
|
41383
|
+
sourceGoalId: legacy.goalId,
|
|
41384
|
+
charter: legacy.goalId ? `Legacy department migrated from team goal ${legacy.goalId}.` : "Legacy department migrated from team data.",
|
|
41385
|
+
workpath: legacy.workpath,
|
|
41386
|
+
headMemberId,
|
|
41387
|
+
departmentMembers
|
|
41388
|
+
};
|
|
41389
|
+
};
|
|
41390
|
+
var migrateLegacyTeamsToDepartments = () => {
|
|
41391
|
+
if (legacyMigrationChecked) return;
|
|
41392
|
+
legacyMigrationChecked = true;
|
|
41393
|
+
const legacyWorkspaceDir = import_path18.default.join(getLegacyTeamBaseDir(), "workspace");
|
|
41394
|
+
if (!(0, import_fs12.existsSync)(legacyWorkspaceDir)) return;
|
|
41395
|
+
for (const legacyName of (0, import_fs12.readdirSync)(legacyWorkspaceDir)) {
|
|
41396
|
+
const legacyJsonPath = getLegacyTeamJsonPath(legacyName);
|
|
41397
|
+
if (!(0, import_fs12.existsSync)(legacyJsonPath)) continue;
|
|
41398
|
+
const departmentJsonPath = getDepartmentJsonPath(legacyName);
|
|
41399
|
+
if ((0, import_fs12.existsSync)(departmentJsonPath)) continue;
|
|
41400
|
+
try {
|
|
41401
|
+
const legacy = JSON.parse((0, import_fs12.readFileSync)(legacyJsonPath, "utf-8"));
|
|
41402
|
+
const department = mapLegacyDepartment(legacy);
|
|
41403
|
+
(0, import_fs12.mkdirSync)(getDepartmentWorkSpaceDir(department.name), { recursive: true });
|
|
41404
|
+
(0, import_fs12.writeFileSync)(departmentJsonPath, JSON.stringify(department, null, " "), "utf-8");
|
|
41405
|
+
} catch (err) {
|
|
41406
|
+
console.warn(`[department] Failed to migrate legacy team ${legacyName}: ${err.message}`);
|
|
41356
41407
|
}
|
|
41357
41408
|
}
|
|
41358
|
-
return teams;
|
|
41359
41409
|
};
|
|
41360
|
-
var
|
|
41361
|
-
|
|
41362
|
-
const
|
|
41363
|
-
|
|
41364
|
-
|
|
41410
|
+
var createDepartment = (departmentDefinition) => {
|
|
41411
|
+
if (!departmentDefinition) throw new Error(`[createDepartment] departmentDefinition\u4E0D\u80FD\u4E3A\u7A7A`);
|
|
41412
|
+
const departmentPath = getDepartmentWorkSpaceDir(departmentDefinition.name);
|
|
41413
|
+
(0, import_fs12.mkdirSync)(departmentPath, { recursive: true });
|
|
41414
|
+
(0, import_fs12.writeFileSync)(getDepartmentJsonPath(departmentDefinition.name), JSON.stringify(departmentDefinition, null, " "), "utf-8");
|
|
41415
|
+
return departmentDefinition;
|
|
41365
41416
|
};
|
|
41366
|
-
var
|
|
41367
|
-
|
|
41368
|
-
|
|
41417
|
+
var getDepartment = (name) => {
|
|
41418
|
+
migrateLegacyTeamsToDepartments();
|
|
41419
|
+
const departmentJsonPath = getDepartmentJsonPath(name);
|
|
41420
|
+
if (!(0, import_fs12.existsSync)(departmentJsonPath)) return null;
|
|
41421
|
+
const text2 = (0, import_fs12.readFileSync)(departmentJsonPath, "utf-8");
|
|
41422
|
+
return JSON.parse(text2);
|
|
41423
|
+
};
|
|
41424
|
+
var listDepartments = () => {
|
|
41425
|
+
migrateLegacyTeamsToDepartments();
|
|
41426
|
+
const workspaceDir = import_path18.default.join(getDepartmentBaseDir(), "workspace");
|
|
41427
|
+
if (!(0, import_fs12.existsSync)(workspaceDir)) return [];
|
|
41428
|
+
const departments = [];
|
|
41429
|
+
for (const departmentName of (0, import_fs12.readdirSync)(workspaceDir)) {
|
|
41430
|
+
const department = getDepartment(departmentName);
|
|
41431
|
+
if (department) departments.push(department);
|
|
41369
41432
|
}
|
|
41370
|
-
|
|
41433
|
+
return departments;
|
|
41434
|
+
};
|
|
41435
|
+
var getDepartmentById = (id) => {
|
|
41436
|
+
const department = listDepartments().find((item) => item.id === id);
|
|
41437
|
+
return department ?? null;
|
|
41438
|
+
};
|
|
41439
|
+
var deleteDepartment = (name) => {
|
|
41440
|
+
if (!(0, import_fs12.existsSync)(getDepartmentJsonPath(name))) {
|
|
41441
|
+
throw new Error(`[deleteDepartment] \u4E0D\u5B58\u5728\u5BF9\u5E94\u7684\u90E8\u95E8 ${name} \u7684 department.json \u6587\u4EF6`);
|
|
41442
|
+
}
|
|
41443
|
+
(0, import_fs12.rmSync)(getDepartmentJsonPath(name));
|
|
41371
41444
|
};
|
|
41372
41445
|
|
|
41373
|
-
// src/
|
|
41446
|
+
// src/department/workspace/workspace.ts
|
|
41374
41447
|
var db = createSqliteDB();
|
|
41375
|
-
var getWorkspaceId = (
|
|
41376
|
-
return `${
|
|
41448
|
+
var getWorkspaceId = (departmentName, memberName) => {
|
|
41449
|
+
return `${departmentName}::${memberName}`;
|
|
41377
41450
|
};
|
|
41378
41451
|
var createWorkspace = (workspace) => {
|
|
41379
41452
|
const stmt = db.prepare(`INSERT INTO workspace (id, team_name, teammate_name, team_workpath) VALUES (?, ?, ?, ?) `);
|
|
41380
|
-
|
|
41453
|
+
stmt.run(
|
|
41381
41454
|
workspace.id,
|
|
41382
|
-
workspace.
|
|
41383
|
-
workspace.
|
|
41384
|
-
workspace.
|
|
41455
|
+
workspace.departmentName,
|
|
41456
|
+
workspace.memberName,
|
|
41457
|
+
workspace.departmentWorkPath
|
|
41385
41458
|
);
|
|
41386
41459
|
};
|
|
41387
41460
|
var deleteWorkspace = (workspaceId) => {
|
|
@@ -41389,98 +41462,92 @@ var deleteWorkspace = (workspaceId) => {
|
|
|
41389
41462
|
stmt.run(workspaceId);
|
|
41390
41463
|
};
|
|
41391
41464
|
|
|
41392
|
-
// src/
|
|
41393
|
-
var
|
|
41394
|
-
if (!
|
|
41395
|
-
const {
|
|
41396
|
-
const
|
|
41397
|
-
if (!
|
|
41398
|
-
const memberPath = import_path19.default.join(
|
|
41465
|
+
// src/department/DepartmentMember.ts
|
|
41466
|
+
var createDepartmentMember = (departmentMemberDefinition) => {
|
|
41467
|
+
if (!departmentMemberDefinition) throw new Error(`[createDepartmentMember] departmentMemberDefinition\u4E0D\u80FD\u4E3A\u7A7A`);
|
|
41468
|
+
const { name, departmentId, workspaceId } = departmentMemberDefinition;
|
|
41469
|
+
const department = getDepartmentById(departmentId);
|
|
41470
|
+
if (!department) throw new Error(`[createDepartmentMember] \u627E\u4E0D\u5230\u5BF9\u5E94\u7684 department: ${departmentId}`);
|
|
41471
|
+
const memberPath = import_path19.default.join(getDepartmentWorkSpaceDir(department.name), name);
|
|
41399
41472
|
(0, import_fs13.mkdirSync)(memberPath, { recursive: true });
|
|
41400
41473
|
const workspace = {
|
|
41401
|
-
id: getWorkspaceId(
|
|
41402
|
-
|
|
41403
|
-
|
|
41404
|
-
|
|
41474
|
+
id: getWorkspaceId(department.name, departmentMemberDefinition.name),
|
|
41475
|
+
departmentName: department.name,
|
|
41476
|
+
memberName: name,
|
|
41477
|
+
departmentWorkPath: memberPath
|
|
41405
41478
|
};
|
|
41406
41479
|
createWorkspace(workspace);
|
|
41407
|
-
if (!
|
|
41408
|
-
|
|
41409
|
-
}
|
|
41410
|
-
if (
|
|
41411
|
-
throw new Error(`[
|
|
41412
|
-
}
|
|
41413
|
-
if (
|
|
41414
|
-
const
|
|
41415
|
-
if (
|
|
41416
|
-
throw new Error(`[
|
|
41417
|
-
}
|
|
41418
|
-
|
|
41419
|
-
}
|
|
41420
|
-
|
|
41421
|
-
(0, import_fs13.writeFileSync)(
|
|
41422
|
-
return
|
|
41423
|
-
};
|
|
41424
|
-
var
|
|
41425
|
-
const
|
|
41426
|
-
if (!(0, import_fs13.existsSync)(
|
|
41427
|
-
const text2 = (0, import_fs13.readFileSync)(
|
|
41428
|
-
const
|
|
41429
|
-
if (!
|
|
41430
|
-
|
|
41431
|
-
|
|
41432
|
-
|
|
41433
|
-
|
|
41434
|
-
|
|
41435
|
-
|
|
41436
|
-
|
|
41437
|
-
|
|
41438
|
-
|
|
41439
|
-
|
|
41440
|
-
|
|
41441
|
-
|
|
41442
|
-
|
|
41443
|
-
|
|
41444
|
-
|
|
41445
|
-
|
|
41446
|
-
|
|
41447
|
-
|
|
41448
|
-
for (const team of teams) {
|
|
41449
|
-
const targetMember = team.teamMembers.find((m) => m.id === teammateId);
|
|
41480
|
+
if (!department.departmentMembers) {
|
|
41481
|
+
department.departmentMembers = [];
|
|
41482
|
+
}
|
|
41483
|
+
if (department.departmentMembers.some((member) => member.id === departmentMemberDefinition.id || member.name === departmentMemberDefinition.name)) {
|
|
41484
|
+
throw new Error(`[createDepartmentMember] \u90E8\u95E8 ${department.name} \u5DF2\u5B58\u5728\u540C\u540D\u6216\u540C id \u6210\u5458: ${departmentMemberDefinition.name}/${departmentMemberDefinition.id}`);
|
|
41485
|
+
}
|
|
41486
|
+
if (departmentMemberDefinition.role === "department_head") {
|
|
41487
|
+
const existingHead = department.headMemberId ? department.departmentMembers.find((member) => member.id === department.headMemberId) : department.departmentMembers.find((member) => member.role === "department_head");
|
|
41488
|
+
if (existingHead) {
|
|
41489
|
+
throw new Error(`[createDepartmentMember] \u90E8\u95E8 ${department.name} \u5DF2\u5B58\u5728 Department Head: ${existingHead.name}`);
|
|
41490
|
+
}
|
|
41491
|
+
department.headMemberId = departmentMemberDefinition.id;
|
|
41492
|
+
}
|
|
41493
|
+
department.departmentMembers.push(departmentMemberDefinition);
|
|
41494
|
+
(0, import_fs13.writeFileSync)(getDepartmentJsonPath(department.name), JSON.stringify(department, null, " "), "utf-8");
|
|
41495
|
+
return departmentMemberDefinition;
|
|
41496
|
+
};
|
|
41497
|
+
var listDepartmentMembers = (departmentName) => {
|
|
41498
|
+
const departmentJsonPath = getDepartmentJsonPath(departmentName);
|
|
41499
|
+
if (!(0, import_fs13.existsSync)(departmentJsonPath)) return [];
|
|
41500
|
+
const text2 = (0, import_fs13.readFileSync)(departmentJsonPath, "utf-8");
|
|
41501
|
+
const department = JSON.parse(text2);
|
|
41502
|
+
if (!department) throw new Error(`[listDepartmentMembers] \u627E\u4E0D\u5230\u5BF9\u5E94\u7684 department: ${departmentName}`);
|
|
41503
|
+
return department.departmentMembers ?? [];
|
|
41504
|
+
};
|
|
41505
|
+
var getDepartmentMember = (departmentName, departmentMemberId) => {
|
|
41506
|
+
const members = listDepartmentMembers(departmentName);
|
|
41507
|
+
return members.find((member) => member.id === departmentMemberId) || null;
|
|
41508
|
+
};
|
|
41509
|
+
var getDepartmentMemberByName = (departmentName, departmentMemberName) => {
|
|
41510
|
+
const members = listDepartmentMembers(departmentName);
|
|
41511
|
+
return members.find((member) => member.name === departmentMemberName) || null;
|
|
41512
|
+
};
|
|
41513
|
+
var getDepartmentMemberByMailboxId = (mailboxId) => {
|
|
41514
|
+
const [departmentName, memberName] = mailboxId.split("::");
|
|
41515
|
+
if (!departmentName || !memberName) return null;
|
|
41516
|
+
return getDepartmentMemberByName(departmentName, memberName);
|
|
41517
|
+
};
|
|
41518
|
+
var getDepartmentMemberById = (memberId) => {
|
|
41519
|
+
for (const department of listDepartments()) {
|
|
41520
|
+
const targetMember = department.departmentMembers.find((member) => member.id === memberId);
|
|
41450
41521
|
if (targetMember) return targetMember;
|
|
41451
41522
|
}
|
|
41452
41523
|
return null;
|
|
41453
41524
|
};
|
|
41454
|
-
var
|
|
41455
|
-
const
|
|
41456
|
-
if (!
|
|
41457
|
-
|
|
41458
|
-
return value.id === memberId;
|
|
41459
|
-
});
|
|
41525
|
+
var deleteDepartmentMemberById = (departmentName, memberId) => {
|
|
41526
|
+
const department = getDepartment(departmentName);
|
|
41527
|
+
if (!department) throw new Error(`[deleteDepartmentMemberById] \u627E\u4E0D\u5230\u5BF9\u5E94\u7684 department: ${departmentName}`);
|
|
41528
|
+
const memberIdx = department.departmentMembers.findIndex((member) => member.id === memberId);
|
|
41460
41529
|
if (memberIdx === -1) {
|
|
41461
|
-
throw new Error(`[
|
|
41530
|
+
throw new Error(`[deleteDepartmentMemberById] \u627E\u4E0D\u5230\u5BF9\u5E94 id \u7684 department member: ${memberId}`);
|
|
41462
41531
|
}
|
|
41463
|
-
;
|
|
41464
|
-
|
|
41465
|
-
|
|
41466
|
-
delete team.managerMemberId;
|
|
41532
|
+
const workspaceId = department.departmentMembers[memberIdx].workspaceId;
|
|
41533
|
+
if (department.headMemberId === memberId) {
|
|
41534
|
+
delete department.headMemberId;
|
|
41467
41535
|
}
|
|
41468
|
-
|
|
41469
|
-
|
|
41470
|
-
(0, import_fs13.writeFileSync)(getTeamJsonPath(teamName), JSON.stringify(team, null, ` `));
|
|
41536
|
+
department.departmentMembers = department.departmentMembers.filter((_, index) => index !== memberIdx);
|
|
41537
|
+
(0, import_fs13.writeFileSync)(getDepartmentJsonPath(departmentName), JSON.stringify(department, null, " "), "utf-8");
|
|
41471
41538
|
deleteWorkspace(workspaceId);
|
|
41472
41539
|
};
|
|
41473
41540
|
|
|
41474
|
-
// src/
|
|
41475
|
-
var getMailBoxId = (
|
|
41476
|
-
return `${
|
|
41541
|
+
// src/department/mailbox/mailbox.ts
|
|
41542
|
+
var getMailBoxId = (departmentName, memberName) => {
|
|
41543
|
+
return `${departmentName}::${memberName}`;
|
|
41477
41544
|
};
|
|
41478
|
-
var
|
|
41479
|
-
const member =
|
|
41545
|
+
var getMailBoxIdFromDepartmentMemberId = (memberId) => {
|
|
41546
|
+
const member = getDepartmentMemberById(memberId);
|
|
41480
41547
|
if (!member) return null;
|
|
41481
|
-
const
|
|
41482
|
-
if (!
|
|
41483
|
-
return getMailBoxId(
|
|
41548
|
+
const department = getDepartmentById(member.departmentId);
|
|
41549
|
+
if (!department) throw new Error(`[getMailBoxIdFromDepartmentMemberId] \u6B64\u6210\u5458\u4E0D\u5C5E\u4E8E\u4EFB\u4F55\u90E8\u95E8: ${member.departmentId}`);
|
|
41550
|
+
return getMailBoxId(department.name, member.name);
|
|
41484
41551
|
};
|
|
41485
41552
|
var cancelMailboxMessages = (mailboxId) => {
|
|
41486
41553
|
const db3 = createSqliteDB();
|
|
@@ -41545,7 +41612,8 @@ var sendMessage2 = (fromMailboxId, toMailboxId, content, options) => {
|
|
|
41545
41612
|
counterpartMailboxId: fromMailboxId,
|
|
41546
41613
|
eventType: "message_sent",
|
|
41547
41614
|
detail: {
|
|
41548
|
-
initialStatus: mailboxMsg.status
|
|
41615
|
+
initialStatus: mailboxMsg.status,
|
|
41616
|
+
...options?.auditDetail ?? {}
|
|
41549
41617
|
},
|
|
41550
41618
|
createdAt: mailboxMsg.sendTime
|
|
41551
41619
|
});
|
|
@@ -41583,391 +41651,412 @@ var updateMailboxMessageStatus = (messageId, nextStatus, options) => {
|
|
|
41583
41651
|
return true;
|
|
41584
41652
|
};
|
|
41585
41653
|
|
|
41586
|
-
// src/tools/tools/
|
|
41654
|
+
// src/tools/tools/department/DepartmentCreate.ts
|
|
41587
41655
|
var DESCRIPTION20 = `
|
|
41588
|
-
\u521B\u5EFA\
|
|
41656
|
+
\u521B\u5EFA\u90E8\u95E8\u3002Department \u662F\u516C\u53F8\u7EC4\u7EC7\u4E2D\u7684\u957F\u671F\u804C\u8D23\u5355\u5143\uFF0C\u4E0D\u662F\u4E00\u6B21\u6027\u9879\u76EE\u5C0F\u961F\u3002
|
|
41589
41657
|
|
|
41590
41658
|
\u5DE5\u5177\u8C03\u7528\u89C4\u5219\uFF1A
|
|
41591
|
-
- \u5F53\
|
|
41592
|
-
- \
|
|
41593
|
-
- \
|
|
41659
|
+
- \u5F53\u4E00\u4E2A\u590D\u6742\u3001\u957F\u671F\u3001\u4E13\u4E1A\u804C\u8D23\u9700\u8981\u7A33\u5B9A\u7EC4\u7EC7\u627F\u63A5\u65F6\u8C03\u7528\u6B64\u5DE5\u5177\u3002
|
|
41660
|
+
- sourceGoalId \u662F\u53EF\u9009\u6765\u6E90\u76EE\u6807\uFF1B\u90E8\u95E8\u804C\u8D23\u5E94\u5199\u5165 charter\uFF0C\u4E0D\u8981\u628A\u4E00\u6B21\u6027\u4EFB\u52A1\u7EC6\u8282\u5199\u8FDB charter\u3002
|
|
41661
|
+
- \u521B\u5EFA\u90E8\u95E8\u540E\uFF0CCEO \u5E94\u4F7F\u7528 department_member_create \u4EFB\u547D Department Head\uFF0C\u518D\u7528 department_communicate \u53D1\u9001\u672C\u6B21\u5177\u4F53\u4EFB\u52A1\u3002
|
|
41594
41662
|
`;
|
|
41595
|
-
var
|
|
41596
|
-
name: `
|
|
41663
|
+
var departmentCreate = {
|
|
41664
|
+
name: `department_create`,
|
|
41597
41665
|
description: DESCRIPTION20,
|
|
41598
41666
|
input_schema: {
|
|
41599
41667
|
type: `object`,
|
|
41600
41668
|
properties: {
|
|
41601
41669
|
name: {
|
|
41602
41670
|
type: `string`,
|
|
41603
|
-
description: `\
|
|
41671
|
+
description: `\u90E8\u95E8\u540D\u79F0`
|
|
41672
|
+
},
|
|
41673
|
+
charter: {
|
|
41674
|
+
type: `string`,
|
|
41675
|
+
description: `\u90E8\u95E8\u957F\u671F\u804C\u8D23\u8FB9\u754C\uFF0C\u4E0D\u80FD\u5199\u4E00\u6B21\u6027\u4EFB\u52A1\u7EC6\u8282`
|
|
41604
41676
|
},
|
|
41605
|
-
|
|
41677
|
+
sourceGoalId: {
|
|
41606
41678
|
type: `string`,
|
|
41607
|
-
description: `\
|
|
41679
|
+
description: `\u53EF\u9009\uFF1A\u521B\u5EFA\u8BE5\u90E8\u95E8\u65F6\u5173\u8054\u7684\u76EE\u6807 id`
|
|
41608
41680
|
},
|
|
41609
41681
|
workpath: {
|
|
41610
41682
|
type: `string`,
|
|
41611
|
-
description: `\
|
|
41683
|
+
description: `\u90E8\u95E8\u9879\u76EE\u5DE5\u4F5C\u76EE\u5F55\uFF08\u7EDD\u5BF9\u8DEF\u5F84\uFF09\uFF0C\u90E8\u95E8\u6210\u5458\u7684\u6587\u4EF6\u4FEE\u6539\u5E94\u9650\u5236\u5728\u6B64\u76EE\u5F55\u8303\u56F4\u5185`
|
|
41612
41684
|
}
|
|
41613
41685
|
},
|
|
41614
|
-
required: [`name`, `
|
|
41686
|
+
required: [`name`, `charter`, `workpath`]
|
|
41615
41687
|
},
|
|
41616
|
-
async execute(input
|
|
41688
|
+
async execute(input) {
|
|
41617
41689
|
const name = input.name;
|
|
41618
|
-
const
|
|
41690
|
+
const charter = input.charter;
|
|
41691
|
+
const sourceGoalId = input.sourceGoalId;
|
|
41619
41692
|
const workpath = input.workpath;
|
|
41620
|
-
|
|
41621
|
-
|
|
41622
|
-
|
|
41623
|
-
|
|
41693
|
+
if (sourceGoalId && !getGoalById(sourceGoalId)) {
|
|
41694
|
+
return `[departmentCreate] \u4E0D\u5B58\u5728 id=${sourceGoalId} \u7684\u76EE\u6807`;
|
|
41695
|
+
}
|
|
41696
|
+
let departmentDefinition = {
|
|
41624
41697
|
id: (0, import_node_crypto3.randomUUID)().slice(0, 8),
|
|
41625
41698
|
name,
|
|
41626
|
-
|
|
41699
|
+
charter,
|
|
41700
|
+
sourceGoalId,
|
|
41627
41701
|
workpath,
|
|
41628
|
-
|
|
41702
|
+
departmentMembers: []
|
|
41629
41703
|
};
|
|
41630
41704
|
try {
|
|
41631
|
-
|
|
41705
|
+
departmentDefinition = createDepartment(departmentDefinition);
|
|
41632
41706
|
} catch (err) {
|
|
41633
|
-
|
|
41634
|
-
return `[teamCreate] \u521B\u5EFA\u56E2\u961F\u5931\u8D25: ${err_msg.message}`;
|
|
41707
|
+
return `[departmentCreate] \u521B\u5EFA\u90E8\u95E8\u5931\u8D25: ${err.message}`;
|
|
41635
41708
|
}
|
|
41636
|
-
return `[
|
|
41709
|
+
return `[departmentCreate] \u521B\u5EFA\u90E8\u95E8\u6210\u529F: ${JSON.stringify(departmentDefinition)}`;
|
|
41637
41710
|
}
|
|
41638
41711
|
};
|
|
41639
41712
|
|
|
41640
|
-
// src/tools/tools/
|
|
41641
|
-
var
|
|
41713
|
+
// src/tools/tools/department/DepartmentCommunicate.ts
|
|
41714
|
+
var CEO_MAILBOX_ID = `manager`;
|
|
41642
41715
|
var DESCRIPTION21 = `
|
|
41643
|
-
\u5411\
|
|
41644
|
-
|
|
41645
|
-
\u53C2\u6570\u8BF4\u660E\uFF1A
|
|
41646
|
-
- team_name: \u76EE\u6807\u6210\u5458\u6240\u5C5E\u7684\u56E2\u961F\u540D\u79F0
|
|
41647
|
-
- member_name: \u76EE\u6807\u6210\u5458\u7684\u540D\u79F0
|
|
41648
|
-
- content: \u8981\u53D1\u9001\u7684\u6D88\u606F\u5185\u5BB9
|
|
41649
|
-
|
|
41650
|
-
\u89E6\u53D1\u65F6\u673A\uFF1A
|
|
41651
|
-
- \u9700\u8981\u7ED9\u6307\u5B9A\u56E2\u961F\u6210\u5458\u5206\u914D\u4EFB\u52A1\u65F6
|
|
41652
|
-
- \u9700\u8981\u8BE2\u95EE\u56E2\u961F\u6210\u5458\u5DE5\u4F5C\u8FDB\u5C55\u65F6
|
|
41653
|
-
- \u9700\u8981\u534F\u8C03\u591A\u4E2A\u6210\u5458\u4E4B\u95F4\u7684\u5DE5\u4F5C\u65F6
|
|
41716
|
+
\u5411\u90E8\u95E8\u6210\u5458\u53D1\u9001\u6D88\u606F\u6216\u6307\u4EE4\uFF0C\u662F\u516C\u53F8\u5185\u90E8\u5F02\u6B65\u534F\u4F5C\u901A\u4FE1\u6E20\u9053\u3002
|
|
41654
41717
|
|
|
41655
|
-
\
|
|
41656
|
-
- \
|
|
41657
|
-
- \
|
|
41718
|
+
\u9ED8\u8BA4\u7EC4\u7EC7\u6CBB\u7406\uFF1A
|
|
41719
|
+
- CEO \u9ED8\u8BA4\u901A\u8FC7 department_list \u53EA\u770B\u5230\u90E8\u95E8\u548C Department Head\uFF0C\u4E0D\u4E3B\u52A8\u66B4\u9732 Executor\u3002
|
|
41720
|
+
- Department Head \u9ED8\u8BA4\u7BA1\u7406\u672C\u90E8\u95E8\u6210\u5458\u3002
|
|
41721
|
+
- \u5982\u679C\u667A\u80FD\u4F53\u5DF2\u7ECF\u901A\u8FC7\u6B63\u5E38\u6C9F\u901A\u77E5\u9053\u4E86\u5176\u4ED6\u6210\u5458\u7684 mailbox \u5730\u5740\uFF0C\u5DE5\u5177\u4E0D\u4F1A\u786C\u6027\u963B\u6B62\u901A\u4FE1\uFF1B\u8FD9\u7C7B\u975E\u9ED8\u8BA4\u8DEF\u5F84\u4F1A\u5199\u5165\u5BA1\u8BA1\u4FE1\u606F\u3002
|
|
41658
41722
|
|
|
41659
|
-
\
|
|
41660
|
-
- \
|
|
41661
|
-
- \
|
|
41662
|
-
-
|
|
41663
|
-
- \u4E3B Manager \u53EA\u80FD\u8054\u7CFB Team Manager\uFF0C\u666E\u901A\u6210\u5458\u4E0D\u66B4\u9732\u7ED9\u4E3B Manager\u3002
|
|
41664
|
-
- Team Manager \u53EF\u4EE5\u8054\u7CFB\u81EA\u5DF1\u56E2\u961F\u5185\u7684\u666E\u901A\u6210\u5458\u3002
|
|
41723
|
+
\u53C2\u6570\u8BF4\u660E\uFF1A
|
|
41724
|
+
- department_name + member_name: \u9ED8\u8BA4\u5BFB\u5740\u65B9\u5F0F\u3002
|
|
41725
|
+
- target_mailbox_id: \u53EF\u9009\uFF0C\u5DF2\u77E5\u5BF9\u65B9 mailbox \u5730\u5740\u65F6\u4F7F\u7528\uFF1B\u4F7F\u7528\u65F6\u5EFA\u8BAE\u586B\u5199 reason\u3002
|
|
41726
|
+
- content: \u8981\u53D1\u9001\u7684\u6D88\u606F\u5185\u5BB9\u3002
|
|
41665
41727
|
`;
|
|
41666
|
-
var
|
|
41667
|
-
name: `
|
|
41728
|
+
var departmentCommunicate = {
|
|
41729
|
+
name: `department_communicate`,
|
|
41668
41730
|
description: DESCRIPTION21,
|
|
41669
41731
|
input_schema: {
|
|
41670
41732
|
type: `object`,
|
|
41671
41733
|
properties: {
|
|
41672
|
-
|
|
41734
|
+
department_name: {
|
|
41673
41735
|
type: `string`,
|
|
41674
|
-
description: `\u76EE\u6807\u6210\u5458\u6240\u5C5E\
|
|
41736
|
+
description: `\u76EE\u6807\u6210\u5458\u6240\u5C5E\u90E8\u95E8\u540D\u79F0\uFF1B\u4F7F\u7528 target_mailbox_id \u65F6\u53EF\u7701\u7565`
|
|
41675
41737
|
},
|
|
41676
41738
|
member_name: {
|
|
41677
41739
|
type: `string`,
|
|
41678
|
-
description: `\u76EE\u6807\u6210\u5458\
|
|
41740
|
+
description: `\u76EE\u6807\u6210\u5458\u540D\u79F0\uFF1B\u4F7F\u7528 target_mailbox_id \u65F6\u53EF\u7701\u7565`
|
|
41741
|
+
},
|
|
41742
|
+
target_mailbox_id: {
|
|
41743
|
+
type: `string`,
|
|
41744
|
+
description: `\u53EF\u9009\uFF1A\u5DF2\u77E5\u5BF9\u65B9 mailbox \u5730\u5740\u65F6\u76F4\u63A5\u586B\u5199\uFF0C\u4F8B\u5982 Department::Member`
|
|
41679
41745
|
},
|
|
41680
41746
|
content: {
|
|
41681
41747
|
type: `string`,
|
|
41682
41748
|
description: `\u8981\u6295\u9001\u7ED9\u5BF9\u65B9\u7684\u4FE1\u606F\u5185\u5BB9`
|
|
41749
|
+
},
|
|
41750
|
+
reason: {
|
|
41751
|
+
type: `string`,
|
|
41752
|
+
description: `\u53EF\u9009\uFF1A\u8DE8\u9ED8\u8BA4\u7EC4\u7EC7\u94FE\u8DEF\u6C9F\u901A\u7684\u539F\u56E0\uFF0C\u4FBF\u4E8E\u5BA1\u8BA1`
|
|
41683
41753
|
}
|
|
41684
41754
|
},
|
|
41685
|
-
required: [`
|
|
41755
|
+
required: [`content`]
|
|
41686
41756
|
},
|
|
41687
41757
|
async execute(input, userRequest) {
|
|
41688
41758
|
if (!userRequest) {
|
|
41689
|
-
throw new Error(`[
|
|
41759
|
+
throw new Error(`[departmentCommunicate] userRequest\u4E0D\u80FD\u4E3A\u7A7A`);
|
|
41690
41760
|
}
|
|
41691
|
-
const
|
|
41761
|
+
const departmentName = input.department_name;
|
|
41692
41762
|
const memberName = input.member_name;
|
|
41763
|
+
const targetMailboxId = input.target_mailbox_id;
|
|
41693
41764
|
const content = input.content;
|
|
41694
|
-
const
|
|
41695
|
-
|
|
41696
|
-
|
|
41765
|
+
const reason = input.reason;
|
|
41766
|
+
let toMailboxId = targetMailboxId;
|
|
41767
|
+
let targetMember = targetMailboxId ? getDepartmentMemberByMailboxId(targetMailboxId) : null;
|
|
41768
|
+
if (!toMailboxId) {
|
|
41769
|
+
if (!departmentName || !memberName) {
|
|
41770
|
+
return `[departmentCommunicate] department_name/member_name \u6216 target_mailbox_id \u81F3\u5C11\u9700\u8981\u63D0\u4F9B\u4E00\u79CD`;
|
|
41771
|
+
}
|
|
41772
|
+
targetMember = getDepartmentMemberByName(departmentName, memberName);
|
|
41773
|
+
if (!targetMember) {
|
|
41774
|
+
return `[departmentCommunicate] \u4E0D\u5B58\u5728 ${departmentName} \u90E8\u95E8\u7684\u6210\u5458: ${memberName}`;
|
|
41775
|
+
}
|
|
41776
|
+
toMailboxId = getMailBoxId(departmentName, memberName);
|
|
41697
41777
|
}
|
|
41698
|
-
const toMailboxId = getMailBoxId(teamName, memberName);
|
|
41699
41778
|
let fromMailboxId;
|
|
41700
|
-
const
|
|
41701
|
-
|
|
41702
|
-
|
|
41779
|
+
const departmentAgentId = userRequest.departmentAgentId;
|
|
41780
|
+
const actorMember = departmentAgentId ? getDepartmentMemberByMailboxId(
|
|
41781
|
+
departmentAgentId.includes(`::`) ? departmentAgentId : getMailBoxIdFromDepartmentMemberId(departmentAgentId) ?? departmentAgentId
|
|
41782
|
+
) : null;
|
|
41783
|
+
if (departmentAgentId) {
|
|
41784
|
+
const resolved = departmentAgentId.includes(`::`) ? departmentAgentId : getMailBoxIdFromDepartmentMemberId(departmentAgentId);
|
|
41703
41785
|
if (!resolved) {
|
|
41704
|
-
return `[
|
|
41705
|
-
}
|
|
41706
|
-
const currentMember = getTeamMemberByMailboxId(resolved);
|
|
41707
|
-
if (!currentMember) {
|
|
41708
|
-
return `[teamCommunicate] \u65E0\u6CD5\u8BC6\u522B\u5F53\u524Dagent\u5BF9\u5E94\u7684\u56E2\u961F\u6210\u5458: ${resolved}`;
|
|
41709
|
-
}
|
|
41710
|
-
if (currentMember.role !== "team_manager" && targetMember.teamId !== currentMember.teamId) {
|
|
41711
|
-
return `[teamCommunicate] \u666E\u901A\u6210\u5458\u53EA\u80FD\u8054\u7CFB\u81EA\u5DF1\u56E2\u961F\u5185\u7684\u6210\u5458`;
|
|
41786
|
+
return `[departmentCommunicate] \u65E0\u6CD5\u83B7\u53D6\u5F53\u524D agent \u7684 mailboxId\uFF0CdepartmentAgentId: ${departmentAgentId}`;
|
|
41712
41787
|
}
|
|
41713
41788
|
fromMailboxId = resolved;
|
|
41714
41789
|
} else {
|
|
41715
|
-
|
|
41716
|
-
return `[teamCommunicate] \u4E3BManager\u53EA\u80FD\u8054\u7CFBTeam Manager\uFF0C\u4E0D\u80FD\u76F4\u63A5\u8054\u7CFB\u666E\u901A\u6210\u5458`;
|
|
41717
|
-
}
|
|
41718
|
-
fromMailboxId = MANAGER_MAILBOX_ID;
|
|
41790
|
+
fromMailboxId = CEO_MAILBOX_ID;
|
|
41719
41791
|
}
|
|
41720
|
-
const
|
|
41721
|
-
|
|
41792
|
+
const isCrossDepartment = Boolean(actorMember && targetMember && actorMember.departmentId !== targetMember.departmentId);
|
|
41793
|
+
const isKnownAddressPath = Boolean(targetMailboxId);
|
|
41794
|
+
const options = {
|
|
41795
|
+
auditDetail: {
|
|
41796
|
+
communicationPolicy: "allowed_known_address",
|
|
41797
|
+
isKnownAddressPath,
|
|
41798
|
+
isCrossDepartment,
|
|
41799
|
+
actorRole: actorMember?.role ?? "ceo",
|
|
41800
|
+
targetRole: targetMember?.role ?? "unknown",
|
|
41801
|
+
reason: reason ?? null
|
|
41802
|
+
}
|
|
41803
|
+
};
|
|
41804
|
+
if (!departmentAgentId) {
|
|
41722
41805
|
options.originUserId = userRequest.userId;
|
|
41723
41806
|
options.originPlatform = userRequest.platform;
|
|
41724
41807
|
}
|
|
41725
41808
|
try {
|
|
41726
41809
|
sendMessage2(fromMailboxId, toMailboxId, content, options);
|
|
41727
41810
|
} catch (err) {
|
|
41728
|
-
|
|
41729
|
-
return `[teamCommunicate] \u53D1\u9001\u6D88\u606F\u5931\u8D25: ${err_msg.message}`;
|
|
41811
|
+
return `[departmentCommunicate] \u53D1\u9001\u6D88\u606F\u5931\u8D25: ${err.message}`;
|
|
41730
41812
|
}
|
|
41731
|
-
return `[
|
|
41813
|
+
return `[departmentCommunicate] \u6D88\u606F\u5DF2\u53D1\u9001\u5230 ${toMailboxId}`;
|
|
41732
41814
|
}
|
|
41733
41815
|
};
|
|
41734
41816
|
|
|
41735
|
-
// src/tools/tools/
|
|
41817
|
+
// src/tools/tools/department/DepartmentDelete.ts
|
|
41736
41818
|
var DESCRIPTION22 = `
|
|
41737
|
-
\u5220\u9664\
|
|
41819
|
+
\u5220\u9664\u90E8\u95E8\u3002
|
|
41738
41820
|
|
|
41739
41821
|
\u5DE5\u5177\u8C03\u7528\u89C4\u5219\uFF1A
|
|
41740
|
-
- \
|
|
41741
|
-
- \
|
|
41742
|
-
- \u5F53\u56E2\u961F\u5DF2\u7ECF\u6CA1\u6709\u5B58\u5728\u5FC5\u8981\uFF0C\u8BE2\u95EE\u7528\u6237\u662F\u5426\u89E3\u6563\u8BE5\u56E2\u961F\u3002
|
|
41743
|
-
- \u89E3\u6563\u56E2\u961F\u662F\u4E0D\u53EF\u9006\u64CD\u4F5C\uFF0C\u9996\u6B21\u8C03\u7528 confirmed \u5FC5\u987B\u4E3A false\uFF08\u6216\u4E0D\u4F20\uFF0C\u9ED8\u8BA4 false\uFF09\uFF0C\u672C\u5DE5\u5177\u4F1A\u8FD4\u56DE\u63D0\u793A\u8BA9\u4F60\u5148\u901A\u8FC7 send_message \u5411\u7528\u6237\u786E\u8BA4\uFF1B\u7528\u6237\u660E\u786E\u540C\u610F\u89E3\u6563\u540E\uFF0C\u518D\u4EE5 confirmed=true \u91CD\u65B0\u8C03\u7528\u672C\u5DE5\u5177\u6267\u884C\u771F\u6B63\u5220\u9664\u3002
|
|
41822
|
+
- \u89E3\u6563\u90E8\u95E8\u662F\u4E0D\u53EF\u9006\u64CD\u4F5C\uFF0C\u5FC5\u987B\u5148\u5F81\u5F97\u7528\u6237\u660E\u786E\u786E\u8BA4\u3002
|
|
41823
|
+
- \u9996\u6B21\u8C03\u7528 confirmed \u5FC5\u987B\u4E3A false \u6216\u4E0D\u4F20\uFF1B\u5F97\u5230\u7528\u6237\u660E\u786E\u540C\u610F\u540E\uFF0C\u518D\u4EE5 confirmed=true \u8C03\u7528\u3002
|
|
41744
41824
|
- \u4E25\u7981\u5728\u672A\u5F97\u5230\u7528\u6237\u660E\u786E\u786E\u8BA4\u7684\u60C5\u51B5\u4E0B\u76F4\u63A5\u4F20 confirmed=true\u3002
|
|
41745
41825
|
`;
|
|
41746
|
-
var
|
|
41747
|
-
name: `
|
|
41826
|
+
var departmentDelete = {
|
|
41827
|
+
name: `department_delete`,
|
|
41748
41828
|
description: DESCRIPTION22,
|
|
41749
41829
|
input_schema: {
|
|
41750
41830
|
type: `object`,
|
|
41751
41831
|
properties: {
|
|
41752
41832
|
name: {
|
|
41753
41833
|
type: `string`,
|
|
41754
|
-
description: `\u8981\u5220\u9664\u7684\
|
|
41834
|
+
description: `\u8981\u5220\u9664\u7684\u90E8\u95E8\u540D\u79F0`
|
|
41755
41835
|
},
|
|
41756
41836
|
confirmed: {
|
|
41757
41837
|
type: `boolean`,
|
|
41758
|
-
description: `\u7528\u6237\u662F\u5426\u5DF2\u660E\u786E\u786E\u8BA4\u89E3\u6563\u8BE5\
|
|
41838
|
+
description: `\u7528\u6237\u662F\u5426\u5DF2\u660E\u786E\u786E\u8BA4\u89E3\u6563\u8BE5\u90E8\u95E8`
|
|
41759
41839
|
}
|
|
41760
41840
|
},
|
|
41761
41841
|
required: [`name`]
|
|
41762
41842
|
},
|
|
41763
|
-
async execute(input
|
|
41843
|
+
async execute(input) {
|
|
41764
41844
|
const name = input.name;
|
|
41765
41845
|
const confirmed = input.confirmed ?? false;
|
|
41766
41846
|
if (!confirmed) {
|
|
41767
|
-
return `[
|
|
41847
|
+
return `[departmentDelete] \u89E3\u6563\u90E8\u95E8\u662F\u4E0D\u53EF\u9006\u64CD\u4F5C\uFF0C\u8BF7\u5148\u7528 send_message \u5411\u7528\u6237\u786E\u8BA4"\u662F\u5426\u89E3\u6563\u90E8\u95E8 ${name}"\uFF0C\u5F97\u5230\u7528\u6237\u660E\u786E\u540C\u610F\u540E\uFF0C\u518D\u4EE5 confirmed=true \u91CD\u65B0\u8C03\u7528\u672C\u5DE5\u5177\u3002`;
|
|
41768
41848
|
}
|
|
41769
41849
|
try {
|
|
41770
|
-
const members =
|
|
41850
|
+
const members = listDepartmentMembers(name);
|
|
41771
41851
|
let totalCancelled = 0;
|
|
41772
41852
|
for (const member of members) {
|
|
41773
41853
|
const mailboxId = getMailBoxId(name, member.name);
|
|
41774
41854
|
totalCancelled += cancelMailboxMessages(mailboxId);
|
|
41775
41855
|
}
|
|
41776
41856
|
if (totalCancelled > 0) {
|
|
41777
|
-
console.log(`[
|
|
41857
|
+
console.log(`[departmentDelete] \u5DF2\u53D6\u6D88\u90E8\u95E8 ${name} \u7684 ${totalCancelled} \u6761\u6B8B\u7559 mailbox \u6D88\u606F`);
|
|
41778
41858
|
}
|
|
41779
|
-
|
|
41859
|
+
deleteDepartment(name);
|
|
41780
41860
|
} catch (err) {
|
|
41781
|
-
|
|
41782
|
-
return `[teamDelete] \u5220\u9664\u56E2\u961F\u5931\u8D25: ${err_msg.message}`;
|
|
41861
|
+
return `[departmentDelete] \u5220\u9664\u90E8\u95E8\u5931\u8D25: ${err.message}`;
|
|
41783
41862
|
}
|
|
41784
|
-
return `[
|
|
41863
|
+
return `[departmentDelete] \u5220\u9664\u90E8\u95E8\u6210\u529F: ${name}`;
|
|
41785
41864
|
}
|
|
41786
41865
|
};
|
|
41787
41866
|
|
|
41788
|
-
// src/tools/tools/
|
|
41867
|
+
// src/tools/tools/department/DepartmentList.ts
|
|
41789
41868
|
var DESCRIPTION23 = `
|
|
41790
|
-
\u5217\u51FA\u6240\u6709\
|
|
41869
|
+
\u5217\u51FA\u6240\u6709\u90E8\u95E8\u3002\u8BE5\u5DE5\u5177\u9762\u5411 CEO\uFF0C\u53EA\u8FD4\u56DE\u90E8\u95E8\u4E0E Department Head \u4FE1\u606F\uFF0C\u4E0D\u66B4\u9732 Executor \u660E\u7EC6\u3002
|
|
41791
41870
|
|
|
41792
41871
|
\u5DE5\u5177\u8C03\u7528\u89C4\u5219\uFF1A
|
|
41793
|
-
- \u5F53\u7528\u6237\u8981\u6C42\u5217\u51FA\u6240\u6709\
|
|
41794
|
-
- \u5F53\
|
|
41872
|
+
- \u5F53\u7528\u6237\u8981\u6C42\u5217\u51FA\u6240\u6709\u90E8\u95E8\u65F6\u8C03\u7528\u6B64\u5DE5\u5177\u3002
|
|
41873
|
+
- \u5F53\u590D\u6742\u4EFB\u52A1\u9700\u8981\u5224\u65AD\u73B0\u6709\u90E8\u95E8\u804C\u8D23\u65F6\u8C03\u7528\u6B64\u5DE5\u5177\u3002
|
|
41795
41874
|
`;
|
|
41796
|
-
var
|
|
41797
|
-
name: `
|
|
41875
|
+
var departmentList = {
|
|
41876
|
+
name: `department_list`,
|
|
41798
41877
|
description: DESCRIPTION23,
|
|
41799
41878
|
input_schema: {
|
|
41800
41879
|
type: `object`,
|
|
41801
41880
|
properties: {},
|
|
41802
41881
|
required: []
|
|
41803
41882
|
},
|
|
41804
|
-
async execute(
|
|
41805
|
-
const
|
|
41806
|
-
if (
|
|
41807
|
-
return `[
|
|
41808
|
-
}
|
|
41809
|
-
const
|
|
41810
|
-
const
|
|
41811
|
-
const
|
|
41883
|
+
async execute() {
|
|
41884
|
+
const departments = listDepartments();
|
|
41885
|
+
if (departments.length === 0) {
|
|
41886
|
+
return `[departmentList] \u5F53\u524D\u6CA1\u6709\u4EFB\u4F55\u90E8\u95E8\u3002`;
|
|
41887
|
+
}
|
|
41888
|
+
const visibleDepartments = departments.map((department) => {
|
|
41889
|
+
const head = department.headMemberId ? department.departmentMembers.find((member) => member.id === department.headMemberId) : department.departmentMembers.find((member) => member.role === "department_head");
|
|
41890
|
+
const executors = department.departmentMembers.filter((member) => member.id !== head?.id);
|
|
41812
41891
|
return {
|
|
41813
|
-
id:
|
|
41814
|
-
name:
|
|
41815
|
-
|
|
41816
|
-
|
|
41817
|
-
|
|
41818
|
-
|
|
41819
|
-
|
|
41820
|
-
|
|
41821
|
-
|
|
41892
|
+
id: department.id,
|
|
41893
|
+
name: department.name,
|
|
41894
|
+
sourceGoalId: department.sourceGoalId,
|
|
41895
|
+
charter: department.charter,
|
|
41896
|
+
workpath: department.workpath,
|
|
41897
|
+
head: head ? {
|
|
41898
|
+
id: head.id,
|
|
41899
|
+
name: head.name,
|
|
41900
|
+
mailBoxId: head.mailBoxId,
|
|
41901
|
+
focusOn: head.focusOn
|
|
41822
41902
|
} : null,
|
|
41823
|
-
|
|
41903
|
+
executorCount: executors.length
|
|
41824
41904
|
};
|
|
41825
41905
|
});
|
|
41826
|
-
return `[
|
|
41906
|
+
return `[departmentList] \u627E\u5230\u90E8\u95E8: ${JSON.stringify(visibleDepartments)}`;
|
|
41827
41907
|
}
|
|
41828
41908
|
};
|
|
41829
41909
|
|
|
41830
|
-
// src/tools/tools/
|
|
41910
|
+
// src/tools/tools/department/DepartmentMemberCreate.ts
|
|
41831
41911
|
var import_node_crypto4 = require("node:crypto");
|
|
41832
41912
|
var DESCRIPTION24 = `
|
|
41833
|
-
\u521B\u5EFA\
|
|
41913
|
+
\u521B\u5EFA\u90E8\u95E8\u6210\u5458\u3002
|
|
41834
41914
|
|
|
41835
|
-
\
|
|
41836
|
-
-
|
|
41837
|
-
-
|
|
41838
|
-
-
|
|
41915
|
+
\u7BA1\u7406\u6743\u9650\uFF1A
|
|
41916
|
+
- CEO \u53EA\u80FD\u521B\u5EFA Department Head\u3002
|
|
41917
|
+
- Department Head \u53EF\u4EE5\u5728\u81EA\u5DF1\u90E8\u95E8\u5185\u521B\u5EFA Executor\u3002
|
|
41918
|
+
- Executor \u4E0D\u80FD\u521B\u5EFA\u6210\u5458\u3002
|
|
41839
41919
|
`;
|
|
41840
|
-
var
|
|
41841
|
-
name: `
|
|
41920
|
+
var departmentMemberCreate = {
|
|
41921
|
+
name: `department_member_create`,
|
|
41842
41922
|
description: DESCRIPTION24,
|
|
41843
41923
|
input_schema: {
|
|
41844
41924
|
type: `object`,
|
|
41845
41925
|
properties: {
|
|
41846
41926
|
name: {
|
|
41847
41927
|
type: `string`,
|
|
41848
|
-
description: `\
|
|
41928
|
+
description: `\u90E8\u95E8\u6210\u5458\u540D\u79F0`
|
|
41849
41929
|
},
|
|
41850
|
-
|
|
41930
|
+
departmentName: {
|
|
41851
41931
|
type: `string`,
|
|
41852
|
-
description: `\u6210\u5458\u6240\u5C5E\
|
|
41932
|
+
description: `\u6210\u5458\u6240\u5C5E\u90E8\u95E8\u540D\u79F0\uFF0C\u4E0D\u8981\u81C6\u9020`
|
|
41853
41933
|
},
|
|
41854
41934
|
focusOn: {
|
|
41855
41935
|
type: `string`,
|
|
41856
|
-
description: `\
|
|
41936
|
+
description: `\u8BE5\u6210\u5458\u7684\u957F\u671F\u5C97\u4F4D\u804C\u8D23\u4E0E\u884C\u4E3A\u8FB9\u754C\uFF0C\u4E0D\u8981\u5199\u4E00\u6B21\u6027\u4EFB\u52A1\u7EC6\u8282`
|
|
41857
41937
|
},
|
|
41858
41938
|
role: {
|
|
41859
41939
|
type: `string`,
|
|
41860
|
-
enum: [`
|
|
41861
|
-
description: `\u6210\u5458\u89D2\u8272\
|
|
41940
|
+
enum: [`department_head`, `executor`],
|
|
41941
|
+
description: `\u6210\u5458\u89D2\u8272\u3002CEO \u521B\u5EFA\u90E8\u95E8\u8D1F\u8D23\u4EBA\u65F6\u4F20 department_head\uFF1BDepartment Head \u521B\u5EFA\u6267\u884C\u8005\u65F6\u4F20 executor`
|
|
41862
41942
|
}
|
|
41863
41943
|
},
|
|
41864
|
-
required: [`name`, `
|
|
41944
|
+
required: [`name`, `departmentName`, `focusOn`]
|
|
41865
41945
|
},
|
|
41866
41946
|
async execute(input, userRequest) {
|
|
41867
41947
|
const name = input.name;
|
|
41868
|
-
const
|
|
41948
|
+
const departmentName = input.departmentName;
|
|
41869
41949
|
const requestedRole = input.role;
|
|
41870
|
-
const
|
|
41871
|
-
if (!
|
|
41950
|
+
const department = getDepartment(departmentName);
|
|
41951
|
+
if (!department) return `[departmentMemberCreate] \u4E0D\u5B58\u5728\u540D\u79F0\u4E3A ${departmentName} \u7684\u90E8\u95E8`;
|
|
41872
41952
|
const focusOn = input.focusOn;
|
|
41873
|
-
const currentMailboxId = userRequest?.
|
|
41953
|
+
const currentMailboxId = userRequest?.departmentAgentId;
|
|
41874
41954
|
let role;
|
|
41875
41955
|
if (currentMailboxId) {
|
|
41876
|
-
const currentMember =
|
|
41956
|
+
const currentMember = getDepartmentMemberByMailboxId(currentMailboxId);
|
|
41877
41957
|
if (!currentMember) {
|
|
41878
|
-
return `[
|
|
41958
|
+
return `[departmentMemberCreate] \u65E0\u6CD5\u8BC6\u522B\u5F53\u524D\u90E8\u95E8\u6210\u5458: ${currentMailboxId}`;
|
|
41879
41959
|
}
|
|
41880
|
-
if (currentMember.role !== "
|
|
41881
|
-
return `[
|
|
41960
|
+
if (currentMember.role !== "department_head") {
|
|
41961
|
+
return `[departmentMemberCreate] \u53EA\u6709 Department Head \u53EF\u4EE5\u521B\u5EFA Executor`;
|
|
41882
41962
|
}
|
|
41883
|
-
if (currentMember.
|
|
41884
|
-
return `[
|
|
41963
|
+
if (currentMember.departmentId !== department.id) {
|
|
41964
|
+
return `[departmentMemberCreate] Department Head \u53EA\u80FD\u5728\u81EA\u5DF1\u6240\u5C5E\u90E8\u95E8\u5185\u521B\u5EFA\u6210\u5458`;
|
|
41885
41965
|
}
|
|
41886
|
-
role = requestedRole ?? "
|
|
41887
|
-
if (role === "
|
|
41888
|
-
return `[
|
|
41966
|
+
role = requestedRole ?? "executor";
|
|
41967
|
+
if (role === "department_head") {
|
|
41968
|
+
return `[departmentMemberCreate] \u90E8\u95E8\u5DF2\u7531\u5F53\u524D Department Head \u7BA1\u7406\uFF0C\u4E0D\u80FD\u7531 Department Head \u518D\u521B\u5EFA Department Head`;
|
|
41889
41969
|
}
|
|
41890
41970
|
} else {
|
|
41891
|
-
role = requestedRole ?? "
|
|
41892
|
-
if (role !== "
|
|
41893
|
-
return `[
|
|
41971
|
+
role = requestedRole ?? "department_head";
|
|
41972
|
+
if (role !== "department_head") {
|
|
41973
|
+
return `[departmentMemberCreate] CEO \u53EA\u80FD\u521B\u5EFA Department Head\uFF1BExecutor \u5E94\u7531 Department Head \u521B\u5EFA`;
|
|
41894
41974
|
}
|
|
41895
41975
|
}
|
|
41896
|
-
let
|
|
41976
|
+
let departmentMember = {
|
|
41897
41977
|
id: (0, import_node_crypto4.randomUUID)().slice(0, 8),
|
|
41898
41978
|
name,
|
|
41899
|
-
|
|
41900
|
-
mailBoxId: getMailBoxId(
|
|
41901
|
-
workspaceId: getWorkspaceId(
|
|
41979
|
+
departmentId: department.id,
|
|
41980
|
+
mailBoxId: getMailBoxId(department.name, name),
|
|
41981
|
+
workspaceId: getWorkspaceId(department.name, name),
|
|
41902
41982
|
role,
|
|
41903
41983
|
focusOn
|
|
41904
41984
|
};
|
|
41905
41985
|
try {
|
|
41906
|
-
|
|
41986
|
+
departmentMember = createDepartmentMember(departmentMember);
|
|
41907
41987
|
} catch (err) {
|
|
41908
|
-
|
|
41909
|
-
return `[teamMemberCreate] \u521B\u5EFA\u56E2\u961F\u6210\u5458\u5931\u8D25: ${err_msg.message}`;
|
|
41988
|
+
return `[departmentMemberCreate] \u521B\u5EFA\u90E8\u95E8\u6210\u5458\u5931\u8D25: ${err.message}`;
|
|
41910
41989
|
}
|
|
41911
|
-
return `[
|
|
41990
|
+
return `[departmentMemberCreate] \u521B\u5EFA\u90E8\u95E8\u6210\u5458\u6210\u529F: ${JSON.stringify(departmentMember)}`;
|
|
41912
41991
|
}
|
|
41913
41992
|
};
|
|
41914
41993
|
|
|
41915
|
-
// src/tools/tools/
|
|
41994
|
+
// src/tools/tools/department/DepartmentMemberDelete.ts
|
|
41916
41995
|
var DESCRIPTION25 = `
|
|
41917
|
-
\u5220\u9664\
|
|
41996
|
+
\u5220\u9664\u90E8\u95E8\u6210\u5458\u3002
|
|
41918
41997
|
|
|
41919
41998
|
\u5DE5\u5177\u8C03\u7528\u89C4\u5219\uFF1A
|
|
41920
|
-
- \
|
|
41999
|
+
- \u5FC5\u987B\u662F\u7528\u6237\u660E\u786E\u8981\u6C42\u5220\u9664\u6210\u5458\u65F6\u4F7F\u7528\u3002
|
|
42000
|
+
- Department Head \u53EA\u80FD\u5220\u9664\u81EA\u5DF1\u90E8\u95E8\u5185\u7684 Executor\uFF0C\u4E0D\u80FD\u5220\u9664 Department Head\u3002
|
|
42001
|
+
- CEO \u53EF\u4EE5\u5728\u7528\u6237\u660E\u786E\u8981\u6C42\u65F6\u5220\u9664\u90E8\u95E8\u6210\u5458\u3002
|
|
41921
42002
|
`;
|
|
41922
|
-
var
|
|
41923
|
-
name: `
|
|
42003
|
+
var departmentMemberDelete = {
|
|
42004
|
+
name: `department_member_delete`,
|
|
41924
42005
|
description: DESCRIPTION25,
|
|
41925
42006
|
input_schema: {
|
|
41926
42007
|
type: `object`,
|
|
41927
42008
|
properties: {
|
|
41928
|
-
|
|
42009
|
+
department_name: {
|
|
41929
42010
|
type: `string`,
|
|
41930
|
-
description: `\u5F85\u5220\u9664\
|
|
42011
|
+
description: `\u5F85\u5220\u9664\u6210\u5458\u6240\u5C5E\u90E8\u95E8\u540D\u79F0`
|
|
41931
42012
|
},
|
|
41932
|
-
|
|
42013
|
+
member_id: {
|
|
41933
42014
|
type: `string`,
|
|
41934
|
-
description: `\u5F85\u5220\u9664\
|
|
42015
|
+
description: `\u5F85\u5220\u9664\u6210\u5458 id`
|
|
41935
42016
|
}
|
|
41936
42017
|
},
|
|
41937
|
-
required: [`
|
|
42018
|
+
required: [`department_name`, `member_id`]
|
|
41938
42019
|
},
|
|
41939
42020
|
async execute(input, userRequest) {
|
|
41940
|
-
const
|
|
41941
|
-
const
|
|
42021
|
+
const departmentName = input.department_name;
|
|
42022
|
+
const memberId = input.member_id;
|
|
42023
|
+
const department = getDepartment(departmentName);
|
|
42024
|
+
if (!department) return `[departmentMemberDelete] \u4E0D\u5B58\u5728\u540D\u79F0\u4E3A ${departmentName} \u7684\u90E8\u95E8`;
|
|
42025
|
+
const member = getDepartmentMember(departmentName, memberId);
|
|
42026
|
+
if (!member) return `[departmentMemberDelete] \u627E\u4E0D\u5230\u6210\u5458: ${memberId}`;
|
|
42027
|
+
const currentMailboxId = userRequest?.departmentAgentId;
|
|
42028
|
+
if (currentMailboxId) {
|
|
42029
|
+
const currentMember = getDepartmentMemberByMailboxId(currentMailboxId);
|
|
42030
|
+
if (!currentMember) return `[departmentMemberDelete] \u65E0\u6CD5\u8BC6\u522B\u5F53\u524D\u90E8\u95E8\u6210\u5458: ${currentMailboxId}`;
|
|
42031
|
+
if (currentMember.role !== "department_head") return `[departmentMemberDelete] \u53EA\u6709 Department Head \u53EF\u4EE5\u5220\u9664 Executor`;
|
|
42032
|
+
if (currentMember.departmentId !== department.id) return `[departmentMemberDelete] Department Head \u53EA\u80FD\u7BA1\u7406\u81EA\u5DF1\u6240\u5C5E\u90E8\u95E8`;
|
|
42033
|
+
if (member.role === "department_head") return `[departmentMemberDelete] Department Head \u4E0D\u80FD\u5220\u9664 Department Head`;
|
|
42034
|
+
}
|
|
41942
42035
|
try {
|
|
41943
|
-
|
|
41944
|
-
|
|
41945
|
-
|
|
41946
|
-
|
|
41947
|
-
|
|
41948
|
-
if (cancelled > 0) {
|
|
41949
|
-
console.log(`[teamMemberDelete] \u5DF2\u53D6\u6D88 ${cancelled} \u6761\u6B8B\u7559 mailbox \u6D88\u606F: ${mailboxId}`);
|
|
41950
|
-
}
|
|
42036
|
+
deleteDepartmentMemberById(departmentName, memberId);
|
|
42037
|
+
const mailboxId = getMailBoxId(departmentName, member.name);
|
|
42038
|
+
const cancelled = cancelMailboxMessages(mailboxId);
|
|
42039
|
+
if (cancelled > 0) {
|
|
42040
|
+
console.log(`[departmentMemberDelete] \u5DF2\u53D6\u6D88 ${cancelled} \u6761\u6B8B\u7559 mailbox \u6D88\u606F: ${mailboxId}`);
|
|
41951
42041
|
}
|
|
41952
42042
|
} catch (err) {
|
|
41953
|
-
|
|
41954
|
-
return `[teamMemberDelete] \u5220\u9664\u56E2\u961F\u6210\u5458\u5931\u8D25: ${err_msg.message}`;
|
|
42043
|
+
return `[departmentMemberDelete] \u5220\u9664\u90E8\u95E8\u6210\u5458\u5931\u8D25: ${err.message}`;
|
|
41955
42044
|
}
|
|
41956
|
-
return `[
|
|
42045
|
+
return `[departmentMemberDelete] \u5220\u9664\u90E8\u95E8\u6210\u5458\u6210\u529F: ${JSON.stringify(memberId)}`;
|
|
41957
42046
|
}
|
|
41958
42047
|
};
|
|
41959
42048
|
|
|
41960
|
-
// src/tools/tools/
|
|
42049
|
+
// src/tools/tools/department/DepartmentMemberList.ts
|
|
41961
42050
|
var DESCRIPTION26 = `
|
|
41962
|
-
\u67E5\u770B\u5F53\u524D
|
|
42051
|
+
\u67E5\u770B\u5F53\u524D Department Head \u6240\u5C5E\u90E8\u95E8\u7684\u6210\u5458\u76EE\u5F55\u3002
|
|
41963
42052
|
|
|
41964
42053
|
\u4F7F\u7528\u8FB9\u754C\uFF1A
|
|
41965
|
-
- \u4EC5
|
|
41966
|
-
-
|
|
41967
|
-
-
|
|
42054
|
+
- \u4EC5 Department Head \u53EF\u4EE5\u4F7F\u7528\u3002
|
|
42055
|
+
- CEO \u9ED8\u8BA4\u901A\u8FC7 department_list \u53EA\u770B\u5230\u90E8\u95E8\u4E0E\u8D1F\u8D23\u4EBA\u6458\u8981\u3002
|
|
42056
|
+
- Department Head \u53EA\u80FD\u67E5\u770B\u81EA\u5DF1\u6240\u5C5E\u90E8\u95E8\u7684\u6210\u5458\uFF0C\u7528\u4E8E\u590D\u7528\u5DF2\u6709\u6210\u5458\u3001\u5224\u65AD\u662F\u5426\u9700\u8981\u521B\u5EFA\u65B0\u6210\u5458\u3001\u4E86\u89E3\u6210\u5458\u804C\u8D23\u3002
|
|
41968
42057
|
`;
|
|
41969
|
-
var
|
|
41970
|
-
name: `
|
|
42058
|
+
var departmentMemberList = {
|
|
42059
|
+
name: `department_member_list`,
|
|
41971
42060
|
description: DESCRIPTION26,
|
|
41972
42061
|
input_schema: {
|
|
41973
42062
|
type: `object`,
|
|
@@ -41975,43 +42064,450 @@ var teamMemberList = {
|
|
|
41975
42064
|
required: []
|
|
41976
42065
|
},
|
|
41977
42066
|
async execute(input, userRequest) {
|
|
41978
|
-
const mailboxId = userRequest?.
|
|
42067
|
+
const mailboxId = userRequest?.departmentAgentId;
|
|
41979
42068
|
if (!mailboxId) {
|
|
41980
|
-
return `[
|
|
42069
|
+
return `[departmentMemberList] \u53EA\u6709 Department Head \u53EF\u4EE5\u67E5\u770B\u90E8\u95E8\u6210\u5458\u76EE\u5F55`;
|
|
41981
42070
|
}
|
|
41982
|
-
const currentMember =
|
|
42071
|
+
const currentMember = getDepartmentMemberByMailboxId(mailboxId);
|
|
41983
42072
|
if (!currentMember) {
|
|
41984
|
-
return `[
|
|
42073
|
+
return `[departmentMemberList] \u65E0\u6CD5\u8BC6\u522B\u5F53\u524D\u90E8\u95E8\u6210\u5458: ${mailboxId}`;
|
|
41985
42074
|
}
|
|
41986
|
-
if (currentMember.role !== "
|
|
41987
|
-
return `[
|
|
42075
|
+
if (currentMember.role !== "department_head") {
|
|
42076
|
+
return `[departmentMemberList] \u5F53\u524D\u6210\u5458\u4E0D\u662F Department Head\uFF0C\u4E0D\u80FD\u67E5\u770B\u5B8C\u6574\u90E8\u95E8\u6210\u5458\u76EE\u5F55`;
|
|
41988
42077
|
}
|
|
41989
|
-
const
|
|
41990
|
-
if (!
|
|
41991
|
-
return `[
|
|
42078
|
+
const department = getDepartmentById(currentMember.departmentId);
|
|
42079
|
+
if (!department) {
|
|
42080
|
+
return `[departmentMemberList] \u627E\u4E0D\u5230\u5F53\u524D\u6210\u5458\u6240\u5C5E\u90E8\u95E8: ${currentMember.departmentId}`;
|
|
41992
42081
|
}
|
|
41993
|
-
const members =
|
|
42082
|
+
const members = department.departmentMembers.map((member) => ({
|
|
41994
42083
|
id: member.id,
|
|
41995
42084
|
name: member.name,
|
|
41996
|
-
role: member.role ?? "
|
|
42085
|
+
role: member.role ?? "executor",
|
|
41997
42086
|
mailBoxId: member.mailBoxId,
|
|
41998
42087
|
workspaceId: member.workspaceId,
|
|
41999
42088
|
focusOn: member.focusOn
|
|
42000
42089
|
}));
|
|
42001
|
-
return `[
|
|
42090
|
+
return `[departmentMemberList] ${department.name} \u90E8\u95E8\u6210\u5458\u76EE\u5F55: ${JSON.stringify(members)}`;
|
|
42002
42091
|
}
|
|
42003
42092
|
};
|
|
42004
42093
|
|
|
42005
|
-
// src/tools/tools/
|
|
42006
|
-
var MANAGER_MAILBOX_ID2 = `manager`;
|
|
42094
|
+
// src/tools/tools/department/CheckDepartmentReplies.ts
|
|
42007
42095
|
var DESCRIPTION27 = `
|
|
42096
|
+
\u67E5\u770B Department Head \u6216\u90E8\u95E8\u6210\u5458\u53D1\u7ED9 CEO \u7684\u5DE5\u4F5C\u56DE\u590D\u3002
|
|
42097
|
+
|
|
42098
|
+
\u5F53 CEO \u5411 Department Head \u6D3E\u53D1\u4EFB\u52A1\u540E\uFF0C\u5BF9\u65B9\u5B8C\u6210\u5DE5\u4F5C\u4F1A\u901A\u8FC7 mailbox \u56DE\u4FE1\u3002\u4F7F\u7528\u6B64\u5DE5\u5177\u53EF\u4EE5\u67E5\u770B\u672A\u8BFB\u7684\u90E8\u95E8\u56DE\u4FE1\u5185\u5BB9\uFF0C\u4E86\u89E3\u5DE5\u4F5C\u8FDB\u5C55\u548C\u6210\u679C\u3002
|
|
42099
|
+
`;
|
|
42100
|
+
var checkDepartmentReplies = {
|
|
42101
|
+
name: `check_department_replies`,
|
|
42102
|
+
description: DESCRIPTION27,
|
|
42103
|
+
input_schema: {
|
|
42104
|
+
type: `object`,
|
|
42105
|
+
properties: {
|
|
42106
|
+
from_member: {
|
|
42107
|
+
type: `string`,
|
|
42108
|
+
description: `\u53EF\u9009\uFF1A\u53EA\u67E5\u770B\u6307\u5B9A mailboxId \u7684\u56DE\u4FE1\uFF0C\u4E0D\u586B\u5219\u67E5\u770B\u6240\u6709\u56DE\u4FE1`
|
|
42109
|
+
}
|
|
42110
|
+
},
|
|
42111
|
+
required: []
|
|
42112
|
+
},
|
|
42113
|
+
async execute(input) {
|
|
42114
|
+
const db3 = createSqliteDB();
|
|
42115
|
+
const fromMember = input.from_member;
|
|
42116
|
+
let msgs;
|
|
42117
|
+
if (fromMember) {
|
|
42118
|
+
const stmt = db3.prepare(
|
|
42119
|
+
`SELECT id, to_mailbox_id as toMailboxId, from_mailbox_id as fromMailboxId, content, send_time as sendTime, status
|
|
42120
|
+
FROM mailbox
|
|
42121
|
+
WHERE to_mailbox_id = 'manager' AND from_mailbox_id = ? AND status in ('pending', 'processing', 'done')
|
|
42122
|
+
ORDER BY send_time ASC`
|
|
42123
|
+
);
|
|
42124
|
+
msgs = stmt.all(fromMember);
|
|
42125
|
+
} else {
|
|
42126
|
+
const stmt = db3.prepare(
|
|
42127
|
+
`SELECT id, to_mailbox_id as toMailboxId, from_mailbox_id as fromMailboxId, content, send_time as sendTime, status
|
|
42128
|
+
FROM mailbox
|
|
42129
|
+
WHERE to_mailbox_id = 'manager' AND status in ('pending', 'processing', 'done')
|
|
42130
|
+
ORDER BY send_time ASC`
|
|
42131
|
+
);
|
|
42132
|
+
msgs = stmt.all();
|
|
42133
|
+
}
|
|
42134
|
+
if (msgs.length === 0) {
|
|
42135
|
+
return `[checkDepartmentReplies] \u6682\u65E0\u90E8\u95E8\u56DE\u4FE1\u3002\u6210\u5458\u53EF\u80FD\u4ECD\u5728\u5904\u7406\u4EFB\u52A1\u4E2D\uFF0C\u8BF7\u7A0D\u540E\u518D\u67E5\u3002`;
|
|
42136
|
+
}
|
|
42137
|
+
const updateStmt = db3.prepare(`UPDATE mailbox SET status = 'read' WHERE id = ?`);
|
|
42138
|
+
for (const msg of msgs) {
|
|
42139
|
+
updateStmt.run(msg.id);
|
|
42140
|
+
}
|
|
42141
|
+
const replies = msgs.map((msg, i) => {
|
|
42142
|
+
const time = new Date(msg.sendTime).toLocaleString("zh-CN", { timeZone: "Asia/Shanghai" });
|
|
42143
|
+
return `--- \u56DE\u4FE1 ${i + 1} ---
|
|
42144
|
+
id: ${msg.id}
|
|
42145
|
+
\u6765\u81EA: ${msg.fromMailboxId}
|
|
42146
|
+
\u65F6\u95F4: ${time}
|
|
42147
|
+
\u72B6\u6001: ${msg.status}
|
|
42148
|
+
\u5185\u5BB9:
|
|
42149
|
+
${msg.content}`;
|
|
42150
|
+
}).join("\n\n");
|
|
42151
|
+
return `[checkDepartmentReplies] \u6536\u5230 ${msgs.length} \u6761\u90E8\u95E8\u56DE\u4FE1\uFF1A
|
|
42152
|
+
|
|
42153
|
+
${replies}`;
|
|
42154
|
+
}
|
|
42155
|
+
};
|
|
42156
|
+
|
|
42157
|
+
// src/department/learning.ts
|
|
42158
|
+
var import_node_fs3 = require("node:fs");
|
|
42159
|
+
var import_node_path11 = __toESM(require("node:path"));
|
|
42160
|
+
var import_node_crypto5 = require("node:crypto");
|
|
42161
|
+
var ensureDir = (dir) => (0, import_node_fs3.mkdirSync)(dir, { recursive: true });
|
|
42162
|
+
var readJsonArray = (filePath) => {
|
|
42163
|
+
if (!(0, import_node_fs3.existsSync)(filePath)) return [];
|
|
42164
|
+
return JSON.parse((0, import_node_fs3.readFileSync)(filePath, "utf-8"));
|
|
42165
|
+
};
|
|
42166
|
+
var writeJsonArray = (filePath, records) => {
|
|
42167
|
+
ensureDir(import_node_path11.default.dirname(filePath));
|
|
42168
|
+
(0, import_node_fs3.writeFileSync)(filePath, JSON.stringify(records, null, " "), "utf-8");
|
|
42169
|
+
};
|
|
42170
|
+
var departmentMemoryPath = (departmentName) => {
|
|
42171
|
+
return import_node_path11.default.join(getDepartmentWorkSpaceDir(departmentName), "department-memory.json");
|
|
42172
|
+
};
|
|
42173
|
+
var departmentSkillPath = (departmentName) => {
|
|
42174
|
+
return import_node_path11.default.join(getDepartmentWorkSpaceDir(departmentName), "department-skills.json");
|
|
42175
|
+
};
|
|
42176
|
+
var departmentSkillDir = (departmentName, skillName) => {
|
|
42177
|
+
return import_node_path11.default.join(getDepartmentWorkSpaceDir(departmentName), "skills", skillName);
|
|
42178
|
+
};
|
|
42179
|
+
var proposalsPath = () => {
|
|
42180
|
+
return import_node_path11.default.join(getDepartmentBaseDir(), "department-proposals.json");
|
|
42181
|
+
};
|
|
42182
|
+
var getDepartmentNameForHead = (request) => {
|
|
42183
|
+
const mailboxId = request?.departmentAgentId;
|
|
42184
|
+
if (!mailboxId) return null;
|
|
42185
|
+
const member = getDepartmentMemberByMailboxId(mailboxId);
|
|
42186
|
+
if (!member || member.role !== "department_head") return null;
|
|
42187
|
+
const [departmentName] = mailboxId.split("::");
|
|
42188
|
+
return departmentName || null;
|
|
42189
|
+
};
|
|
42190
|
+
var listDepartmentMemories = (departmentName) => {
|
|
42191
|
+
return readJsonArray(departmentMemoryPath(departmentName)).sort((a, b) => b.updatedAt - a.updatedAt);
|
|
42192
|
+
};
|
|
42193
|
+
var createDepartmentMemory = (departmentName, input) => {
|
|
42194
|
+
const now = Date.now();
|
|
42195
|
+
const memory = {
|
|
42196
|
+
id: (0, import_node_crypto5.randomUUID)().slice(0, 8),
|
|
42197
|
+
departmentName,
|
|
42198
|
+
title: input.title,
|
|
42199
|
+
content: input.content,
|
|
42200
|
+
sourceMailboxId: input.sourceMailboxId,
|
|
42201
|
+
createdAt: now,
|
|
42202
|
+
updatedAt: now
|
|
42203
|
+
};
|
|
42204
|
+
const records = listDepartmentMemories(departmentName);
|
|
42205
|
+
records.push(memory);
|
|
42206
|
+
writeJsonArray(departmentMemoryPath(departmentName), records);
|
|
42207
|
+
return memory;
|
|
42208
|
+
};
|
|
42209
|
+
var updateDepartmentMemory = (departmentName, id, patch) => {
|
|
42210
|
+
const records = listDepartmentMemories(departmentName);
|
|
42211
|
+
const idx = records.findIndex((record) => record.id === id);
|
|
42212
|
+
if (idx < 0) return null;
|
|
42213
|
+
records[idx] = {
|
|
42214
|
+
...records[idx],
|
|
42215
|
+
...patch.title !== void 0 ? { title: patch.title } : {},
|
|
42216
|
+
...patch.content !== void 0 ? { content: patch.content } : {},
|
|
42217
|
+
updatedAt: Date.now()
|
|
42218
|
+
};
|
|
42219
|
+
writeJsonArray(departmentMemoryPath(departmentName), records);
|
|
42220
|
+
return records[idx];
|
|
42221
|
+
};
|
|
42222
|
+
var deleteDepartmentMemory = (departmentName, id) => {
|
|
42223
|
+
const records = listDepartmentMemories(departmentName);
|
|
42224
|
+
const target = records.find((record) => record.id === id) ?? null;
|
|
42225
|
+
writeJsonArray(departmentMemoryPath(departmentName), records.filter((record) => record.id !== id));
|
|
42226
|
+
return target;
|
|
42227
|
+
};
|
|
42228
|
+
var listDepartmentSkills = (departmentName) => {
|
|
42229
|
+
return readJsonArray(departmentSkillPath(departmentName)).sort((a, b) => b.updatedAt - a.updatedAt);
|
|
42230
|
+
};
|
|
42231
|
+
var proposeDepartmentSkill = (departmentName, input) => {
|
|
42232
|
+
const records = listDepartmentSkills(departmentName);
|
|
42233
|
+
if (records.some((record) => record.skillName === input.skillName && record.status !== "dropped")) {
|
|
42234
|
+
return null;
|
|
42235
|
+
}
|
|
42236
|
+
const now = Date.now();
|
|
42237
|
+
const skill = {
|
|
42238
|
+
id: (0, import_node_crypto5.randomUUID)().slice(0, 8),
|
|
42239
|
+
departmentName,
|
|
42240
|
+
skillName: input.skillName,
|
|
42241
|
+
description: input.description,
|
|
42242
|
+
skillMd: input.skillMd,
|
|
42243
|
+
status: "pending",
|
|
42244
|
+
createdByMailboxId: input.createdByMailboxId,
|
|
42245
|
+
createdAt: now,
|
|
42246
|
+
updatedAt: now
|
|
42247
|
+
};
|
|
42248
|
+
records.push(skill);
|
|
42249
|
+
writeJsonArray(departmentSkillPath(departmentName), records);
|
|
42250
|
+
return skill;
|
|
42251
|
+
};
|
|
42252
|
+
var keepDepartmentSkill = (departmentName, id) => {
|
|
42253
|
+
const records = listDepartmentSkills(departmentName);
|
|
42254
|
+
const idx = records.findIndex((record) => record.id === id);
|
|
42255
|
+
if (idx < 0) return null;
|
|
42256
|
+
records[idx] = { ...records[idx], status: "active", updatedAt: Date.now() };
|
|
42257
|
+
const skillDir = departmentSkillDir(departmentName, records[idx].skillName);
|
|
42258
|
+
ensureDir(skillDir);
|
|
42259
|
+
(0, import_node_fs3.writeFileSync)(import_node_path11.default.join(skillDir, "SKILL.md"), records[idx].skillMd, "utf-8");
|
|
42260
|
+
writeJsonArray(departmentSkillPath(departmentName), records);
|
|
42261
|
+
return records[idx];
|
|
42262
|
+
};
|
|
42263
|
+
var dropDepartmentSkill = (departmentName, id) => {
|
|
42264
|
+
const records = listDepartmentSkills(departmentName);
|
|
42265
|
+
const idx = records.findIndex((record) => record.id === id);
|
|
42266
|
+
if (idx < 0) return null;
|
|
42267
|
+
records[idx] = { ...records[idx], status: "dropped", updatedAt: Date.now() };
|
|
42268
|
+
writeJsonArray(departmentSkillPath(departmentName), records);
|
|
42269
|
+
return records[idx];
|
|
42270
|
+
};
|
|
42271
|
+
var createDepartmentProposal = (input) => {
|
|
42272
|
+
const records = readJsonArray(proposalsPath());
|
|
42273
|
+
const proposal = {
|
|
42274
|
+
...input,
|
|
42275
|
+
id: (0, import_node_crypto5.randomUUID)().slice(0, 8),
|
|
42276
|
+
status: "pending",
|
|
42277
|
+
createdAt: Date.now()
|
|
42278
|
+
};
|
|
42279
|
+
records.push(proposal);
|
|
42280
|
+
writeJsonArray(proposalsPath(), records);
|
|
42281
|
+
return proposal;
|
|
42282
|
+
};
|
|
42283
|
+
var buildDepartmentLearningContext = (departmentName) => {
|
|
42284
|
+
if (!departmentName) return "";
|
|
42285
|
+
const memories = listDepartmentMemories(departmentName);
|
|
42286
|
+
const activeSkills = listDepartmentSkills(departmentName).filter((skill) => skill.status === "active");
|
|
42287
|
+
if (memories.length === 0 && activeSkills.length === 0) return "";
|
|
42288
|
+
const memoryLines = memories.map(
|
|
42289
|
+
(memory) => ` - [id=${memory.id}] ${memory.title}
|
|
42290
|
+
${memory.content.replace(/\n/g, "\n ")}`
|
|
42291
|
+
).join("\n");
|
|
42292
|
+
const skillLines = activeSkills.map(
|
|
42293
|
+
(skill) => ` - ${skill.skillName}: ${skill.description}`
|
|
42294
|
+
).join("\n");
|
|
42295
|
+
return [
|
|
42296
|
+
`<department-learning-context department="${departmentName}">`,
|
|
42297
|
+
memories.length > 0 ? `Department memories:
|
|
42298
|
+
${memoryLines}` : "",
|
|
42299
|
+
activeSkills.length > 0 ? `Department skills:
|
|
42300
|
+
${skillLines}` : "",
|
|
42301
|
+
`</department-learning-context>`
|
|
42302
|
+
].filter(Boolean).join("\n");
|
|
42303
|
+
};
|
|
42304
|
+
|
|
42305
|
+
// src/tools/tools/department/DepartmentLearning.ts
|
|
42306
|
+
var requireDepartmentHead = (request) => {
|
|
42307
|
+
return getDepartmentNameForHead(request);
|
|
42308
|
+
};
|
|
42309
|
+
var departmentMemoryList = {
|
|
42310
|
+
name: `department_memory_list`,
|
|
42311
|
+
description: `\u5217\u51FA\u5F53\u524D Department Head \u6240\u5C5E\u90E8\u95E8\u7684\u957F\u671F\u7ECF\u9A8C\u8BB0\u5FC6\uFF1BCEO \u53EF\u4F20 departmentName \u67E5\u770B\u6307\u5B9A\u90E8\u95E8\u3002`,
|
|
42312
|
+
input_schema: {
|
|
42313
|
+
type: `object`,
|
|
42314
|
+
properties: {
|
|
42315
|
+
departmentName: { type: `string`, description: `\u53EF\u9009\uFF1ACEO \u67E5\u770B\u6307\u5B9A\u90E8\u95E8\u65F6\u586B\u5199` }
|
|
42316
|
+
},
|
|
42317
|
+
required: []
|
|
42318
|
+
},
|
|
42319
|
+
async execute(input, userRequest) {
|
|
42320
|
+
const departmentName = input.departmentName || requireDepartmentHead(userRequest);
|
|
42321
|
+
if (!departmentName) return `[departmentMemoryList] \u8BF7\u63D0\u4F9B departmentName\uFF0C\u6216\u4EE5 Department Head \u8EAB\u4EFD\u8C03\u7528`;
|
|
42322
|
+
return `[departmentMemoryList] ${departmentName} \u90E8\u95E8\u8BB0\u5FC6: ${JSON.stringify(listDepartmentMemories(departmentName))}`;
|
|
42323
|
+
}
|
|
42324
|
+
};
|
|
42325
|
+
var departmentMemoryCreate = {
|
|
42326
|
+
name: `department_memory_create`,
|
|
42327
|
+
description: `\u7531 Department Head \u5199\u5165\u672C\u90E8\u95E8\u957F\u671F\u7ECF\u9A8C\u8BB0\u5FC6\uFF0C\u7528\u4E8E\u6C89\u6DC0\u8E29\u5751\u3001\u7EA6\u5B9A\u548C\u804C\u8D23\u8303\u56F4\u5185\u7684\u7A33\u5B9A\u5DE5\u4F5C\u65B9\u6CD5\u3002`,
|
|
42328
|
+
input_schema: {
|
|
42329
|
+
type: `object`,
|
|
42330
|
+
properties: {
|
|
42331
|
+
title: { type: `string`, description: `\u8BB0\u5FC6\u6807\u9898` },
|
|
42332
|
+
content: { type: `string`, description: `\u8BB0\u5FC6\u6B63\u6587` },
|
|
42333
|
+
sourceMailboxId: { type: `string`, description: `\u53EF\u9009\uFF1A\u6765\u6E90 mailbox/thread id` }
|
|
42334
|
+
},
|
|
42335
|
+
required: [`title`, `content`]
|
|
42336
|
+
},
|
|
42337
|
+
async execute(input, userRequest) {
|
|
42338
|
+
const departmentName = requireDepartmentHead(userRequest);
|
|
42339
|
+
if (!departmentName) return `[departmentMemoryCreate] \u53EA\u6709 Department Head \u53EF\u4EE5\u5199\u5165\u90E8\u95E8\u8BB0\u5FC6`;
|
|
42340
|
+
const memory = createDepartmentMemory(departmentName, {
|
|
42341
|
+
title: input.title,
|
|
42342
|
+
content: input.content,
|
|
42343
|
+
sourceMailboxId: input.sourceMailboxId
|
|
42344
|
+
});
|
|
42345
|
+
return `[departmentMemoryCreate] \u5DF2\u5199\u5165\u90E8\u95E8\u8BB0\u5FC6: ${JSON.stringify(memory)}`;
|
|
42346
|
+
}
|
|
42347
|
+
};
|
|
42348
|
+
var departmentMemoryUpdate = {
|
|
42349
|
+
name: `department_memory_update`,
|
|
42350
|
+
description: `\u7531 Department Head \u66F4\u65B0\u672C\u90E8\u95E8\u957F\u671F\u7ECF\u9A8C\u8BB0\u5FC6\u3002`,
|
|
42351
|
+
input_schema: {
|
|
42352
|
+
type: `object`,
|
|
42353
|
+
properties: {
|
|
42354
|
+
id: { type: `string`, description: `\u8BB0\u5FC6 id` },
|
|
42355
|
+
title: { type: `string`, description: `\u53EF\u9009\uFF1A\u65B0\u6807\u9898` },
|
|
42356
|
+
content: { type: `string`, description: `\u53EF\u9009\uFF1A\u65B0\u6B63\u6587` }
|
|
42357
|
+
},
|
|
42358
|
+
required: [`id`]
|
|
42359
|
+
},
|
|
42360
|
+
async execute(input, userRequest) {
|
|
42361
|
+
const departmentName = requireDepartmentHead(userRequest);
|
|
42362
|
+
if (!departmentName) return `[departmentMemoryUpdate] \u53EA\u6709 Department Head \u53EF\u4EE5\u66F4\u65B0\u90E8\u95E8\u8BB0\u5FC6`;
|
|
42363
|
+
const memory = updateDepartmentMemory(departmentName, input.id, {
|
|
42364
|
+
title: input.title,
|
|
42365
|
+
content: input.content
|
|
42366
|
+
});
|
|
42367
|
+
if (!memory) return `[departmentMemoryUpdate] \u672A\u627E\u5230\u90E8\u95E8\u8BB0\u5FC6: ${input.id}`;
|
|
42368
|
+
return `[departmentMemoryUpdate] \u5DF2\u66F4\u65B0\u90E8\u95E8\u8BB0\u5FC6: ${JSON.stringify(memory)}`;
|
|
42369
|
+
}
|
|
42370
|
+
};
|
|
42371
|
+
var departmentMemoryDelete = {
|
|
42372
|
+
name: `department_memory_delete`,
|
|
42373
|
+
description: `\u7531 Department Head \u5220\u9664\u672C\u90E8\u95E8\u957F\u671F\u7ECF\u9A8C\u8BB0\u5FC6\u3002`,
|
|
42374
|
+
input_schema: {
|
|
42375
|
+
type: `object`,
|
|
42376
|
+
properties: {
|
|
42377
|
+
id: { type: `string`, description: `\u8BB0\u5FC6 id` }
|
|
42378
|
+
},
|
|
42379
|
+
required: [`id`]
|
|
42380
|
+
},
|
|
42381
|
+
async execute(input, userRequest) {
|
|
42382
|
+
const departmentName = requireDepartmentHead(userRequest);
|
|
42383
|
+
if (!departmentName) return `[departmentMemoryDelete] \u53EA\u6709 Department Head \u53EF\u4EE5\u5220\u9664\u90E8\u95E8\u8BB0\u5FC6`;
|
|
42384
|
+
const memory = deleteDepartmentMemory(departmentName, input.id);
|
|
42385
|
+
if (!memory) return `[departmentMemoryDelete] \u672A\u627E\u5230\u90E8\u95E8\u8BB0\u5FC6: ${input.id}`;
|
|
42386
|
+
return `[departmentMemoryDelete] \u5DF2\u5220\u9664\u90E8\u95E8\u8BB0\u5FC6: ${JSON.stringify(memory)}`;
|
|
42387
|
+
}
|
|
42388
|
+
};
|
|
42389
|
+
var departmentSkillList = {
|
|
42390
|
+
name: `department_skill_list`,
|
|
42391
|
+
description: `\u5217\u51FA\u5F53\u524D\u90E8\u95E8\u7684 Skill \u8349\u7A3F\u4E0E\u5DF2\u4FDD\u7559 Skill\uFF1BCEO \u53EF\u4F20 departmentName \u67E5\u770B\u6307\u5B9A\u90E8\u95E8\u3002`,
|
|
42392
|
+
input_schema: {
|
|
42393
|
+
type: `object`,
|
|
42394
|
+
properties: {
|
|
42395
|
+
departmentName: { type: `string`, description: `\u53EF\u9009\uFF1ACEO \u67E5\u770B\u6307\u5B9A\u90E8\u95E8\u65F6\u586B\u5199` }
|
|
42396
|
+
},
|
|
42397
|
+
required: []
|
|
42398
|
+
},
|
|
42399
|
+
async execute(input, userRequest) {
|
|
42400
|
+
const departmentName = input.departmentName || requireDepartmentHead(userRequest);
|
|
42401
|
+
if (!departmentName) return `[departmentSkillList] \u8BF7\u63D0\u4F9B departmentName\uFF0C\u6216\u4EE5 Department Head \u8EAB\u4EFD\u8C03\u7528`;
|
|
42402
|
+
return `[departmentSkillList] ${departmentName} \u90E8\u95E8 Skill: ${JSON.stringify(listDepartmentSkills(departmentName))}`;
|
|
42403
|
+
}
|
|
42404
|
+
};
|
|
42405
|
+
var departmentSkillPropose = {
|
|
42406
|
+
name: `department_skill_propose`,
|
|
42407
|
+
description: `\u7531 Department Head \u63D0\u4EA4\u90E8\u95E8\u672C\u5730 Skill \u8349\u7A3F\uFF0C\u9002\u5408\u6C89\u6DC0\u804C\u8D23\u8303\u56F4\u5185\u7684\u7A33\u5B9A\u6D41\u7A0B\u3002`,
|
|
42408
|
+
input_schema: {
|
|
42409
|
+
type: `object`,
|
|
42410
|
+
properties: {
|
|
42411
|
+
skillName: { type: `string`, description: `\u6280\u80FD\u540D\uFF0Ckebab-case` },
|
|
42412
|
+
description: { type: `string`, description: `\u6280\u80FD\u63CF\u8FF0` },
|
|
42413
|
+
skillMd: { type: `string`, description: `\u5B8C\u6574 SKILL.md \u5185\u5BB9` }
|
|
42414
|
+
},
|
|
42415
|
+
required: [`skillName`, `description`, `skillMd`]
|
|
42416
|
+
},
|
|
42417
|
+
async execute(input, userRequest) {
|
|
42418
|
+
const departmentName = requireDepartmentHead(userRequest);
|
|
42419
|
+
if (!departmentName) return `[departmentSkillPropose] \u53EA\u6709 Department Head \u53EF\u4EE5\u63D0\u4EA4\u90E8\u95E8 Skill \u8349\u7A3F`;
|
|
42420
|
+
const skill = proposeDepartmentSkill(departmentName, {
|
|
42421
|
+
skillName: input.skillName,
|
|
42422
|
+
description: input.description,
|
|
42423
|
+
skillMd: input.skillMd,
|
|
42424
|
+
createdByMailboxId: userRequest?.departmentAgentId
|
|
42425
|
+
});
|
|
42426
|
+
if (!skill) return `[departmentSkillPropose] \u540C\u540D\u90E8\u95E8 Skill \u5DF2\u5B58\u5728\u6216\u5F85\u786E\u8BA4: ${input.skillName}`;
|
|
42427
|
+
return `[departmentSkillPropose] \u5DF2\u63D0\u4EA4\u90E8\u95E8 Skill \u8349\u7A3F: ${JSON.stringify(skill)}`;
|
|
42428
|
+
}
|
|
42429
|
+
};
|
|
42430
|
+
var departmentSkillKeep = {
|
|
42431
|
+
name: `department_skill_keep`,
|
|
42432
|
+
description: `\u7531 Department Head \u4FDD\u7559\u4E00\u4E2A\u90E8\u95E8 Skill \u8349\u7A3F\uFF0C\u4F7F\u5176\u6210\u4E3A\u672C\u90E8\u95E8\u53EF\u6CE8\u5165\u7684 active Skill\u3002`,
|
|
42433
|
+
input_schema: {
|
|
42434
|
+
type: `object`,
|
|
42435
|
+
properties: {
|
|
42436
|
+
id: { type: `string`, description: `Skill \u8349\u7A3F id` }
|
|
42437
|
+
},
|
|
42438
|
+
required: [`id`]
|
|
42439
|
+
},
|
|
42440
|
+
async execute(input, userRequest) {
|
|
42441
|
+
const departmentName = requireDepartmentHead(userRequest);
|
|
42442
|
+
if (!departmentName) return `[departmentSkillKeep] \u53EA\u6709 Department Head \u53EF\u4EE5\u4FDD\u7559\u90E8\u95E8 Skill`;
|
|
42443
|
+
const skill = keepDepartmentSkill(departmentName, input.id);
|
|
42444
|
+
if (!skill) return `[departmentSkillKeep] \u672A\u627E\u5230\u90E8\u95E8 Skill: ${input.id}`;
|
|
42445
|
+
return `[departmentSkillKeep] \u5DF2\u4FDD\u7559\u90E8\u95E8 Skill: ${JSON.stringify(skill)}`;
|
|
42446
|
+
}
|
|
42447
|
+
};
|
|
42448
|
+
var departmentSkillDrop = {
|
|
42449
|
+
name: `department_skill_drop`,
|
|
42450
|
+
description: `\u7531 Department Head \u4E22\u5F03\u4E00\u4E2A\u90E8\u95E8 Skill \u8349\u7A3F\u3002`,
|
|
42451
|
+
input_schema: {
|
|
42452
|
+
type: `object`,
|
|
42453
|
+
properties: {
|
|
42454
|
+
id: { type: `string`, description: `Skill \u8349\u7A3F id` }
|
|
42455
|
+
},
|
|
42456
|
+
required: [`id`]
|
|
42457
|
+
},
|
|
42458
|
+
async execute(input, userRequest) {
|
|
42459
|
+
const departmentName = requireDepartmentHead(userRequest);
|
|
42460
|
+
if (!departmentName) return `[departmentSkillDrop] \u53EA\u6709 Department Head \u53EF\u4EE5\u4E22\u5F03\u90E8\u95E8 Skill`;
|
|
42461
|
+
const skill = dropDepartmentSkill(departmentName, input.id);
|
|
42462
|
+
if (!skill) return `[departmentSkillDrop] \u672A\u627E\u5230\u90E8\u95E8 Skill: ${input.id}`;
|
|
42463
|
+
return `[departmentSkillDrop] \u5DF2\u4E22\u5F03\u90E8\u95E8 Skill: ${JSON.stringify(skill)}`;
|
|
42464
|
+
}
|
|
42465
|
+
};
|
|
42466
|
+
var departmentProposalCreate = {
|
|
42467
|
+
name: `department_proposal_create`,
|
|
42468
|
+
description: `Department Head \u53D1\u73B0\u65B0\u804C\u8D23\u8FB9\u754C\u65F6\u5411 CEO \u521B\u5EFA\u65B0\u90E8\u95E8\u63D0\u6848\uFF1B\u5DE5\u5177\u53EA\u521B\u5EFA\u63D0\u6848\uFF0C\u4E0D\u81EA\u52A8\u5EFA\u90E8\u95E8\u3002`,
|
|
42469
|
+
input_schema: {
|
|
42470
|
+
type: `object`,
|
|
42471
|
+
properties: {
|
|
42472
|
+
title: { type: `string`, description: `\u63D0\u6848\u6807\u9898` },
|
|
42473
|
+
reason: { type: `string`, description: `\u4E3A\u4EC0\u4E48\u73B0\u6709\u90E8\u95E8\u4E0D\u5E94\u957F\u671F\u627F\u63A5\u8BE5\u804C\u8D23` },
|
|
42474
|
+
suggestedDepartmentName: { type: `string`, description: `\u5EFA\u8BAE\u65B0\u90E8\u95E8\u540D\u79F0` },
|
|
42475
|
+
suggestedCharter: { type: `string`, description: `\u5EFA\u8BAE\u65B0\u90E8\u95E8\u957F\u671F\u804C\u8D23` },
|
|
42476
|
+
evidenceThreadIds: {
|
|
42477
|
+
type: `array`,
|
|
42478
|
+
description: `\u53EF\u9009\uFF1A\u76F8\u5173 mailbox thread/message id`
|
|
42479
|
+
}
|
|
42480
|
+
},
|
|
42481
|
+
required: [`title`, `reason`, `suggestedDepartmentName`, `suggestedCharter`]
|
|
42482
|
+
},
|
|
42483
|
+
async execute(input, userRequest) {
|
|
42484
|
+
const departmentName = requireDepartmentHead(userRequest);
|
|
42485
|
+
if (!departmentName || !userRequest?.departmentAgentId) {
|
|
42486
|
+
return `[departmentProposalCreate] \u53EA\u6709 Department Head \u53EF\u4EE5\u521B\u5EFA\u65B0\u90E8\u95E8\u63D0\u6848`;
|
|
42487
|
+
}
|
|
42488
|
+
const proposal = createDepartmentProposal({
|
|
42489
|
+
proposerDepartmentName: departmentName,
|
|
42490
|
+
proposerMailboxId: userRequest.departmentAgentId,
|
|
42491
|
+
title: input.title,
|
|
42492
|
+
reason: input.reason,
|
|
42493
|
+
suggestedDepartmentName: input.suggestedDepartmentName,
|
|
42494
|
+
suggestedCharter: input.suggestedCharter,
|
|
42495
|
+
evidenceThreadIds: input.evidenceThreadIds ?? []
|
|
42496
|
+
});
|
|
42497
|
+
return `[departmentProposalCreate] \u5DF2\u521B\u5EFA\u65B0\u90E8\u95E8\u63D0\u6848\uFF0C\u5C06\u7531 CEO \u51B3\u5B9A\u662F\u5426\u91C7\u7EB3: ${JSON.stringify(proposal)}`;
|
|
42498
|
+
}
|
|
42499
|
+
};
|
|
42500
|
+
|
|
42501
|
+
// src/tools/tools/department/MailboxFollowup.ts
|
|
42502
|
+
var CEO_MAILBOX_ID2 = `manager`;
|
|
42503
|
+
var DESCRIPTION28 = `
|
|
42008
42504
|
\u5728\u5F53\u524D mailbox \u7EBF\u7A0B\u4E2D\u8FFD\u52A0\u4E00\u6761\u8865\u5145\u6D88\u606F\uFF0C\u4F46\u4E0D\u7ED3\u675F\u539F\u6D88\u606F\u7684\u5904\u7406\u3002
|
|
42009
42505
|
|
|
42010
42506
|
\u9002\u7528\u573A\u666F\uFF1A
|
|
42011
42507
|
- \u540C\u6B65\u9636\u6BB5\u6027\u8FDB\u5C55
|
|
42012
42508
|
- \u4E3B\u52A8\u8FFD\u95EE\u6F84\u6E05\u4FE1\u606F
|
|
42013
42509
|
- \u5148\u53D1\u51FA\u90E8\u5206\u7ED3\u679C\uFF0C\u7A0D\u540E\u7EE7\u7EED\u8865\u5145
|
|
42014
|
-
-
|
|
42510
|
+
- CEO \u6536\u5230\u67D0\u4E2A\u90E8\u95E8\u6210\u5458\u7684\u7ED3\u679C\u540E\uFF0C\u82E5\u7528\u6237\u7EE7\u7EED\u63D0\u4FEE\u6539\u610F\u89C1\u3001bug \u53CD\u9988\u3001\u6253\u4E0D\u5F00\u7B49\u95EE\u9898\uFF0C\u5E94\u4F18\u5148\u5BF9\u8BE5\u6210\u5458\u4E0A\u4E00\u6761\u76F8\u5173\u56DE\u4FE1\u8C03\u7528 mailbox_followup\uFF0C\u628A\u53CD\u9988\u6CBF\u539F\u7EBF\u7A0B\u53D1\u56DE\u539F\u8D23\u4EFB\u4EBA
|
|
42015
42511
|
|
|
42016
42512
|
\u53C2\u6570\uFF1A
|
|
42017
42513
|
- message_id: \u4F5C\u4E3A\u5F53\u524D\u7EBF\u7A0B\u951A\u70B9\u7684\u6D88\u606F id
|
|
@@ -42021,11 +42517,11 @@ var DESCRIPTION27 = `
|
|
|
42021
42517
|
\u6CE8\u610F\uFF1A
|
|
42022
42518
|
- \u6B64\u5DE5\u5177\u4E0D\u4F1A\u4FEE\u6539\u539F\u6D88\u606F\u72B6\u6001
|
|
42023
42519
|
- \u5982\u679C\u4F60\u5DF2\u7ECF\u5F62\u6210\u5BF9\u5F53\u524D\u6D88\u606F\u7684\u6B63\u5F0F\u7B54\u590D\uFF0C\u5E94\u4F7F\u7528 reply_mailbox
|
|
42024
|
-
- \u5BF9
|
|
42520
|
+
- \u5BF9 CEO \u800C\u8A00\uFF0C\u8FD9\u901A\u5E38\u662F\u201C\u628A\u8FD4\u5DE5\u9700\u6C42\u9000\u56DE\u539F\u8D23\u4EFB\u6210\u5458\u201D\u7684\u9996\u9009\u5DE5\u5177\uFF0C\u800C\u4E0D\u662F\u81EA\u5DF1\u76F4\u63A5\u91CD\u505A
|
|
42025
42521
|
`;
|
|
42026
42522
|
var mailboxFollowup = {
|
|
42027
42523
|
name: `mailbox_followup`,
|
|
42028
|
-
description:
|
|
42524
|
+
description: DESCRIPTION28,
|
|
42029
42525
|
input_schema: {
|
|
42030
42526
|
type: `object`,
|
|
42031
42527
|
properties: {
|
|
@@ -42052,7 +42548,7 @@ var mailboxFollowup = {
|
|
|
42052
42548
|
const messageId = input.message_id;
|
|
42053
42549
|
const content = input.content;
|
|
42054
42550
|
const kind = input.kind || `progress`;
|
|
42055
|
-
const myMailboxId = userRequest.
|
|
42551
|
+
const myMailboxId = userRequest.departmentAgentId || CEO_MAILBOX_ID2;
|
|
42056
42552
|
const db3 = createSqliteDB();
|
|
42057
42553
|
const stmt = db3.prepare(
|
|
42058
42554
|
`SELECT
|
|
@@ -42099,8 +42595,8 @@ var mailboxFollowup = {
|
|
|
42099
42595
|
|
|
42100
42596
|
// src/tools/tools/Bash.ts
|
|
42101
42597
|
var import_node_child_process = require("node:child_process");
|
|
42102
|
-
var
|
|
42103
|
-
var
|
|
42598
|
+
var import_node_fs4 = require("node:fs");
|
|
42599
|
+
var DESCRIPTION29 = `\u5728\u7CFB\u7EDF shell \u4E2D\u6267\u884C\u547D\u4EE4\u3002
|
|
42104
42600
|
|
|
42105
42601
|
\u7528\u9014\uFF1A
|
|
42106
42602
|
- \u8FD0\u884C shell \u547D\u4EE4\uFF08\u5982 ls\u3001mkdir\u3001npm\u3001git\u3001rg \u7B49\uFF09
|
|
@@ -42121,14 +42617,14 @@ var DESCRIPTION28 = `\u5728\u7CFB\u7EDF shell \u4E2D\u6267\u884C\u547D\u4EE4\u30
|
|
|
42121
42617
|
\u6CE8\u610F\u4E8B\u9879\uFF1A
|
|
42122
42618
|
- \u4E0D\u8981\u6267\u884C\u7834\u574F\u6027\u547D\u4EE4\uFF08\u5982 rm -rf /\uFF09
|
|
42123
42619
|
- \u957F\u65F6\u95F4\u8FD0\u884C\u7684\u547D\u4EE4\uFF08\u5982\u542F\u52A8\u670D\u52A1\u5668\uFF09\u4F1A\u5728\u8D85\u65F6\u540E\u88AB\u7EC8\u6B62
|
|
42124
|
-
- \u5982\u679C\u4F60\u5904\u4E8E\
|
|
42620
|
+
- \u5982\u679C\u4F60\u5904\u4E8E\u90E8\u95E8\u5DE5\u4F5C\u533A\u6A21\u5F0F\uFF0Ccwd \u5FC5\u987B\u5728\u5DE5\u4F5C\u533A\u8303\u56F4\u5185
|
|
42125
42621
|
`;
|
|
42126
42622
|
var MAX_OUTPUT_LENGTH = 1e4;
|
|
42127
42623
|
var SHELL_CANDIDATES2 = ["/bin/sh", "/usr/bin/sh", "/bin/bash"];
|
|
42128
42624
|
function findExecutableShell2() {
|
|
42129
42625
|
for (const shell of SHELL_CANDIDATES2) {
|
|
42130
42626
|
try {
|
|
42131
|
-
(0,
|
|
42627
|
+
(0, import_node_fs4.accessSync)(shell, import_node_fs4.constants.X_OK);
|
|
42132
42628
|
return shell;
|
|
42133
42629
|
} catch {
|
|
42134
42630
|
}
|
|
@@ -42137,11 +42633,11 @@ function findExecutableShell2() {
|
|
|
42137
42633
|
}
|
|
42138
42634
|
function validateCwd(cwd) {
|
|
42139
42635
|
try {
|
|
42140
|
-
const stat9 = (0,
|
|
42636
|
+
const stat9 = (0, import_node_fs4.statSync)(cwd);
|
|
42141
42637
|
if (!stat9.isDirectory()) {
|
|
42142
42638
|
return `[bash] \u9519\u8BEF: cwd \u4E0D\u662F\u76EE\u5F55: ${cwd}`;
|
|
42143
42639
|
}
|
|
42144
|
-
(0,
|
|
42640
|
+
(0, import_node_fs4.accessSync)(cwd, import_node_fs4.constants.R_OK | import_node_fs4.constants.X_OK);
|
|
42145
42641
|
return null;
|
|
42146
42642
|
} catch (err) {
|
|
42147
42643
|
const code = err.code;
|
|
@@ -42156,7 +42652,7 @@ function validateCwd(cwd) {
|
|
|
42156
42652
|
}
|
|
42157
42653
|
var bashTool = {
|
|
42158
42654
|
name: `bash`,
|
|
42159
|
-
description:
|
|
42655
|
+
description: DESCRIPTION29,
|
|
42160
42656
|
input_schema: {
|
|
42161
42657
|
type: `object`,
|
|
42162
42658
|
properties: {
|
|
@@ -42233,7 +42729,7 @@ ${trimmed}`;
|
|
|
42233
42729
|
};
|
|
42234
42730
|
|
|
42235
42731
|
// src/tools/tools/SendFile.ts
|
|
42236
|
-
var
|
|
42732
|
+
var DESCRIPTION30 = `
|
|
42237
42733
|
\u53D1\u9001\u6587\u4EF6\u7ED9\u7528\u6237\u3002\u652F\u6301\u4E24\u79CD\u65B9\u5F0F\uFF1A
|
|
42238
42734
|
1. \u672C\u5730\u6587\u4EF6\u8DEF\u5F84\uFF08filePath\uFF09\uFF1A\u9002\u7528\u4E8E\u4F60\u901A\u8FC7 Write \u5DE5\u5177\u751F\u6210\u7684\u6587\u4EF6
|
|
42239
42735
|
2. \u8FDC\u7A0B URL\uFF08url\uFF09\uFF1A\u9002\u7528\u4E8E\u4ECE\u7F51\u7EDC\u83B7\u53D6\u7684\u6587\u4EF6
|
|
@@ -42258,7 +42754,7 @@ var inferFileType = (fileName) => {
|
|
|
42258
42754
|
};
|
|
42259
42755
|
var sendFile = {
|
|
42260
42756
|
name: `send_file`,
|
|
42261
|
-
description:
|
|
42757
|
+
description: DESCRIPTION30,
|
|
42262
42758
|
input_schema: {
|
|
42263
42759
|
type: `object`,
|
|
42264
42760
|
properties: {
|
|
@@ -42317,13 +42813,23 @@ var createDefaultTools = (bg) => {
|
|
|
42317
42813
|
registerTool(registry2, cronLogs);
|
|
42318
42814
|
registerTool(registry2, sendMessage);
|
|
42319
42815
|
registerTool(registry2, sendFile);
|
|
42320
|
-
registerTool(registry2,
|
|
42321
|
-
registerTool(registry2,
|
|
42322
|
-
registerTool(registry2,
|
|
42323
|
-
registerTool(registry2,
|
|
42324
|
-
registerTool(registry2,
|
|
42325
|
-
registerTool(registry2,
|
|
42326
|
-
registerTool(registry2,
|
|
42816
|
+
registerTool(registry2, departmentCreate);
|
|
42817
|
+
registerTool(registry2, departmentList);
|
|
42818
|
+
registerTool(registry2, departmentDelete);
|
|
42819
|
+
registerTool(registry2, departmentMemberList);
|
|
42820
|
+
registerTool(registry2, departmentMemberCreate);
|
|
42821
|
+
registerTool(registry2, departmentMemberDelete);
|
|
42822
|
+
registerTool(registry2, departmentCommunicate);
|
|
42823
|
+
registerTool(registry2, checkDepartmentReplies);
|
|
42824
|
+
registerTool(registry2, departmentMemoryList);
|
|
42825
|
+
registerTool(registry2, departmentMemoryCreate);
|
|
42826
|
+
registerTool(registry2, departmentMemoryUpdate);
|
|
42827
|
+
registerTool(registry2, departmentMemoryDelete);
|
|
42828
|
+
registerTool(registry2, departmentSkillList);
|
|
42829
|
+
registerTool(registry2, departmentSkillPropose);
|
|
42830
|
+
registerTool(registry2, departmentSkillKeep);
|
|
42831
|
+
registerTool(registry2, departmentSkillDrop);
|
|
42832
|
+
registerTool(registry2, departmentProposalCreate);
|
|
42327
42833
|
registerTool(registry2, mailboxFollowup);
|
|
42328
42834
|
return {
|
|
42329
42835
|
registry: registry2,
|
|
@@ -42393,7 +42899,7 @@ var searchRecallIndex = async (storage, userId, query, date, limit = 8) => {
|
|
|
42393
42899
|
};
|
|
42394
42900
|
|
|
42395
42901
|
// src/tools/tools/RecallChatHistory.ts
|
|
42396
|
-
var
|
|
42902
|
+
var DESCRIPTION31 = `\u641C\u7D22\u7528\u6237\u7684\u5386\u53F2\u804A\u5929\u8BB0\u5F55\u3001compact \u6458\u8981\u3001dream \u957F\u671F\u8BB0\u5FC6\u548C\u663E\u5F0F\u957F\u671F memory\u3002\u5F53\u7528\u6237\u63D0\u5230\u8FC7\u53BB\u7684\u5BF9\u8BDD\u3001\u4E4B\u524D\u7684\u8BF7\u6C42\u3001\u4E0A\u6B21\u4EFB\u52A1\u3001\u6216\u4F60\u9700\u8981\u56DE\u5FC6\u65E9\u671F\u4EA4\u4E92\u5185\u5BB9\u65F6\u4F7F\u7528\u3002
|
|
42397
42903
|
|
|
42398
42904
|
\u4F7F\u7528\u6307\u5357\uFF1A
|
|
42399
42905
|
- query \u5FC5\u987B\u5177\u4F53\uFF0C\u5305\u542B\u5173\u952E\u8BCD\uFF08\u5982\u6587\u4EF6\u540D\u3001\u529F\u80FD\u540D\u3001\u4E3B\u9898\u8BCD\uFF09
|
|
@@ -42448,7 +42954,7 @@ var formatRecallResult = (result, indexResult) => {
|
|
|
42448
42954
|
};
|
|
42449
42955
|
var recallChatHistory = (messageStorage, topicStorage, recallIndexStorage) => ({
|
|
42450
42956
|
name: "recall_chat_history",
|
|
42451
|
-
description:
|
|
42957
|
+
description: DESCRIPTION31,
|
|
42452
42958
|
input_schema: {
|
|
42453
42959
|
type: "object",
|
|
42454
42960
|
properties: {
|
|
@@ -42788,10 +43294,10 @@ var readDreamHistoryLimit = () => {
|
|
|
42788
43294
|
};
|
|
42789
43295
|
|
|
42790
43296
|
// src/skillForge/SkillForgeEngine.ts
|
|
42791
|
-
var
|
|
43297
|
+
var import_node_fs5 = require("node:fs");
|
|
42792
43298
|
var import_node_os2 = require("node:os");
|
|
42793
|
-
var
|
|
42794
|
-
var
|
|
43299
|
+
var import_node_path12 = require("node:path");
|
|
43300
|
+
var import_node_crypto6 = require("node:crypto");
|
|
42795
43301
|
var SkillForgeEngine = class {
|
|
42796
43302
|
proposalStorage;
|
|
42797
43303
|
draftRoot;
|
|
@@ -42799,8 +43305,8 @@ var SkillForgeEngine = class {
|
|
|
42799
43305
|
constructor(deps) {
|
|
42800
43306
|
this.proposalStorage = deps.proposalStorage;
|
|
42801
43307
|
const opt = deps.options ?? {};
|
|
42802
|
-
this.draftRoot = opt.draftRoot ?? (0,
|
|
42803
|
-
this.skillsInstallDir = opt.skillsInstallDir ?? (0,
|
|
43308
|
+
this.draftRoot = opt.draftRoot ?? (0, import_node_path12.join)((0, import_node_os2.homedir)(), ".duclaw", "skill-proposals");
|
|
43309
|
+
this.skillsInstallDir = opt.skillsInstallDir ?? (0, import_node_path12.join)((0, import_node_os2.homedir)(), ".agents", "skills");
|
|
42804
43310
|
}
|
|
42805
43311
|
// ---------- 公开方法 ----------
|
|
42806
43312
|
/**
|
|
@@ -42820,10 +43326,10 @@ var SkillForgeEngine = class {
|
|
|
42820
43326
|
if (pending.some((p) => p.skillName === skillName)) {
|
|
42821
43327
|
return null;
|
|
42822
43328
|
}
|
|
42823
|
-
const id = (0,
|
|
42824
|
-
const draftDir = (0,
|
|
42825
|
-
(0,
|
|
42826
|
-
(0,
|
|
43329
|
+
const id = (0, import_node_crypto6.randomBytes)(4).toString("hex");
|
|
43330
|
+
const draftDir = (0, import_node_path12.join)(this.draftRoot, userId, id);
|
|
43331
|
+
(0, import_node_fs5.mkdirSync)(draftDir, { recursive: true });
|
|
43332
|
+
(0, import_node_fs5.writeFileSync)((0, import_node_path12.join)(draftDir, "SKILL.md"), skillMd, "utf-8");
|
|
42827
43333
|
const proposal = {
|
|
42828
43334
|
id,
|
|
42829
43335
|
userId,
|
|
@@ -42841,17 +43347,17 @@ var SkillForgeEngine = class {
|
|
|
42841
43347
|
const list = await this.proposalStorage.get(this.proposalKey(userId)) ?? [];
|
|
42842
43348
|
const proposal = list.find((p) => p.id === proposalId);
|
|
42843
43349
|
if (!proposal) return null;
|
|
42844
|
-
const target = (0,
|
|
42845
|
-
if ((0,
|
|
43350
|
+
const target = (0, import_node_path12.join)(this.skillsInstallDir, proposal.skillName);
|
|
43351
|
+
if ((0, import_node_fs5.existsSync)(target)) {
|
|
42846
43352
|
const alt = target + "-" + proposalId;
|
|
42847
|
-
(0,
|
|
42848
|
-
(0,
|
|
43353
|
+
(0, import_node_fs5.mkdirSync)(alt, { recursive: true });
|
|
43354
|
+
(0, import_node_fs5.cpSync)(proposal.draftDir, alt, { recursive: true });
|
|
42849
43355
|
} else {
|
|
42850
|
-
(0,
|
|
42851
|
-
(0,
|
|
43356
|
+
(0, import_node_fs5.mkdirSync)(target, { recursive: true });
|
|
43357
|
+
(0, import_node_fs5.cpSync)(proposal.draftDir, target, { recursive: true });
|
|
42852
43358
|
}
|
|
42853
43359
|
try {
|
|
42854
|
-
(0,
|
|
43360
|
+
(0, import_node_fs5.rmSync)(proposal.draftDir, { recursive: true, force: true });
|
|
42855
43361
|
} catch {
|
|
42856
43362
|
}
|
|
42857
43363
|
await this.removeProposal(userId, proposalId);
|
|
@@ -42863,7 +43369,7 @@ var SkillForgeEngine = class {
|
|
|
42863
43369
|
const proposal = list.find((p) => p.id === proposalId);
|
|
42864
43370
|
if (!proposal) return null;
|
|
42865
43371
|
try {
|
|
42866
|
-
(0,
|
|
43372
|
+
(0, import_node_fs5.rmSync)(proposal.draftDir, { recursive: true, force: true });
|
|
42867
43373
|
} catch {
|
|
42868
43374
|
}
|
|
42869
43375
|
await this.removeProposal(userId, proposalId);
|
|
@@ -42892,7 +43398,7 @@ var SkillForgeEngine = class {
|
|
|
42892
43398
|
};
|
|
42893
43399
|
|
|
42894
43400
|
// src/tools/tools/skillforge/SkillForgePropose.ts
|
|
42895
|
-
var
|
|
43401
|
+
var DESCRIPTION32 = `\u63D0\u4EA4\u4E00\u4E2A"\u6280\u80FD\u8349\u7A3F"\u5230 pending \u5217\u8868\uFF08\u7B49\u5F85\u7528\u6237\u786E\u8BA4\u540E\u843D\u5730\u5230 ~/.agents/skills/\uFF09\u3002
|
|
42896
43402
|
|
|
42897
43403
|
\u4F55\u65F6\u8C03\u7528\uFF1A
|
|
42898
43404
|
\u4F60\u521A\u6210\u529F\u5B8C\u6210\u4E86\u4E00\u4E2A\u590D\u6742\u4EFB\u52A1\uFF08\u901A\u5E38\u5305\u542B 5 \u6B21\u4EE5\u4E0A\u5DE5\u5177\u8C03\u7528\uFF09\uFF0C\u5E76\u4E14\u4F60\u5224\u65AD\u8FD9\u4E2A\u64CD\u4F5C\u6D41\u7A0B\uFF1A
|
|
@@ -42928,7 +43434,7 @@ description: <\u4E0E\u53C2\u6570 description \u4E00\u81F4>
|
|
|
42928
43434
|
`;
|
|
42929
43435
|
var skillForgePropose = (engine) => ({
|
|
42930
43436
|
name: `skill_forge_propose`,
|
|
42931
|
-
description:
|
|
43437
|
+
description: DESCRIPTION32,
|
|
42932
43438
|
input_schema: {
|
|
42933
43439
|
type: `object`,
|
|
42934
43440
|
properties: {
|
|
@@ -42970,7 +43476,7 @@ var skillForgePropose = (engine) => ({
|
|
|
42970
43476
|
});
|
|
42971
43477
|
|
|
42972
43478
|
// src/tools/tools/skillforge/SkillForgeKeep.ts
|
|
42973
|
-
var
|
|
43479
|
+
var DESCRIPTION33 = `\u4FDD\u7559\u4E00\u4E2A\u7531 agent \u81EA\u52A8\u521B\u5EFA\u7684\u6280\u80FD\u8349\u7A3F\uFF08\u628A\u8349\u7A3F\u4ECE\u6682\u5B58\u76EE\u5F55\u62F7\u8D1D\u5230 ~/.agents/skills/\uFF0C\u4E0B\u6B21\u7C7B\u4F3C\u4EFB\u52A1\u4F1A\u81EA\u52A8\u590D\u7528\uFF09\u3002
|
|
42974
43480
|
\u4EC5\u5F53\u7528\u6237\u5BF9\u4E00\u4E2A pending \u7684\u6280\u80FD\u8349\u7A3F\u660E\u786E\u8868\u8FBE"\u4FDD\u7559/\u53EF\u4EE5/\u540C\u610F/\u597D\u7684"\u4E4B\u7C7B\u80AF\u5B9A\u610F\u56FE\u65F6\uFF0C\u624D\u8C03\u7528\u672C\u5DE5\u5177\u3002
|
|
42975
43481
|
\u53C2\u6570 proposalId \u53EF\u9009\uFF1A
|
|
42976
43482
|
- \u5F53\u524D\u53EA\u6709 1 \u4E2A pending \u8349\u7A3F\u65F6\u53EF\u4E0D\u586B\uFF0C\u5DE5\u5177\u4F1A\u81EA\u52A8\u9009\u4E2D\u90A3\u4E00\u6761\uFF1B
|
|
@@ -42991,7 +43497,7 @@ var pickProposal = (pending, hint) => {
|
|
|
42991
43497
|
};
|
|
42992
43498
|
var skillForgeKeep = (engine) => ({
|
|
42993
43499
|
name: `skill_forge_keep`,
|
|
42994
|
-
description:
|
|
43500
|
+
description: DESCRIPTION33,
|
|
42995
43501
|
input_schema: {
|
|
42996
43502
|
type: `object`,
|
|
42997
43503
|
properties: {
|
|
@@ -43019,7 +43525,7 @@ var skillForgeKeep = (engine) => ({
|
|
|
43019
43525
|
});
|
|
43020
43526
|
|
|
43021
43527
|
// src/tools/tools/skillforge/SkillForgeDrop.ts
|
|
43022
|
-
var
|
|
43528
|
+
var DESCRIPTION34 = `\u4E22\u5F03\u4E00\u4E2A pending \u7684\u6280\u80FD\u8349\u7A3F\uFF08\u5220\u9664\u6682\u5B58\u76EE\u5F55\u91CC\u7684 SKILL.md\uFF0C\u4ECE pending \u5217\u8868\u79FB\u9664\uFF09\u3002
|
|
43023
43529
|
\u4EC5\u5F53\u7528\u6237\u5BF9\u6280\u80FD\u8349\u7A3F\u660E\u786E\u8868\u8FBE"\u4E0D\u7528/\u4E0D\u8981/\u7B97\u4E86/\u4E0D\u4FDD\u7559"\u7B49\u5426\u5B9A\u610F\u56FE\u65F6\u8C03\u7528\u3002
|
|
43024
43530
|
\u53C2\u6570 proposalId \u53EF\u9009\uFF1A
|
|
43025
43531
|
- \u5F53\u524D\u53EA\u6709 1 \u4E2A pending \u8349\u7A3F\u65F6\u53EF\u4E0D\u586B\uFF0C\u5DE5\u5177\u4F1A\u81EA\u52A8\u9009\u4E2D\u90A3\u4E00\u6761\uFF1B
|
|
@@ -43040,7 +43546,7 @@ var pickProposal2 = (pending, hint) => {
|
|
|
43040
43546
|
};
|
|
43041
43547
|
var skillForgeDrop = (engine) => ({
|
|
43042
43548
|
name: `skill_forge_drop`,
|
|
43043
|
-
description:
|
|
43549
|
+
description: DESCRIPTION34,
|
|
43044
43550
|
input_schema: {
|
|
43045
43551
|
type: `object`,
|
|
43046
43552
|
properties: {
|
|
@@ -43068,7 +43574,7 @@ var skillForgeDrop = (engine) => ({
|
|
|
43068
43574
|
});
|
|
43069
43575
|
|
|
43070
43576
|
// src/memory/MemoryEngine.ts
|
|
43071
|
-
var
|
|
43577
|
+
var import_node_crypto7 = require("node:crypto");
|
|
43072
43578
|
var MemoryEngine = class {
|
|
43073
43579
|
storage;
|
|
43074
43580
|
recallIndexStorage;
|
|
@@ -43096,7 +43602,7 @@ var MemoryEngine = class {
|
|
|
43096
43602
|
}
|
|
43097
43603
|
const now = Date.now();
|
|
43098
43604
|
const memory = {
|
|
43099
|
-
id: (0,
|
|
43605
|
+
id: (0, import_node_crypto7.randomBytes)(4).toString("hex"),
|
|
43100
43606
|
userId,
|
|
43101
43607
|
title,
|
|
43102
43608
|
content,
|
|
@@ -43186,13 +43692,13 @@ ${memory.content}`),
|
|
|
43186
43692
|
};
|
|
43187
43693
|
|
|
43188
43694
|
// src/tools/tools/memory/MemoryCreate.ts
|
|
43189
|
-
var
|
|
43695
|
+
var DESCRIPTION35 = `\u628A\u4E00\u6761\u503C\u5F97\u957F\u671F\u8BB0\u4F4F\u7684\u4E8B\u5B9E / \u504F\u597D / \u7EA6\u675F\u5199\u5165\u957F\u671F\u8BB0\u5FC6\uFF0C\u4E4B\u540E\u6BCF\u8F6E\u5BF9\u8BDD\u90FD\u4F1A\u81EA\u52A8\u6CE8\u5165\u7ED9\u4F60\u53C2\u8003\u3002
|
|
43190
43696
|
|
|
43191
43697
|
\u4F55\u65F6\u8C03\u7528\uFF1A
|
|
43192
43698
|
1. \u7528\u6237\u660E\u786E\u8BF4"\u8BB0\u4F4F / \u4EE5\u540E\u90FD / \u522B\u518D / \u4ECE\u73B0\u5728\u8D77"\u7B49\u6307\u793A\u6027\u63AA\u8F9E
|
|
43193
43699
|
2. \u7528\u6237\u591A\u6B21\u91CD\u7533\u7684\u504F\u597D\uFF08\u4F8B\u5982"\u6211\u503E\u5411\u7528 pnpm"\u3001"\u56DE\u7B54\u5C3D\u91CF\u7B80\u77ED"\uFF09
|
|
43194
|
-
3. \u7528\u6237\u544A\u77E5\u7684\u7A33\u5B9A\u4E8B\u5B9E\uFF08\u4F8B\u5982"\u6211\u662F DZCD \
|
|
43195
|
-
4. \u6709\u7528\u7684\u9886\u57DF\u7EA6\u5B9A / \
|
|
43700
|
+
3. \u7528\u6237\u544A\u77E5\u7684\u7A33\u5B9A\u4E8B\u5B9E\uFF08\u4F8B\u5982"\u6211\u662F DZCD \u90E8\u95E8\u7684\u540E\u7AEF\u540C\u5B66"\u3001"\u6211\u7684\u751F\u4EA7\u73AF\u5883\u662F staging-us-east"\uFF09
|
|
43701
|
+
4. \u6709\u7528\u7684\u9886\u57DF\u7EA6\u5B9A / \u90E8\u95E8\u89C4\u8303\uFF08\u4F8B\u5982"\u672C\u9879\u76EE commit message \u7528\u4E2D\u6587"\uFF09
|
|
43196
43702
|
|
|
43197
43703
|
\u4F55\u65F6 **\u4E0D\u8981** \u8C03\u7528\uFF1A
|
|
43198
43704
|
- \u4E00\u6B21\u6027\u4FE1\u606F\uFF08"\u5E2E\u6211\u67E5\u4E0B\u4ECA\u5929\u5929\u6C14"\uFF09
|
|
@@ -43200,13 +43706,13 @@ var DESCRIPTION34 = `\u628A\u4E00\u6761\u503C\u5F97\u957F\u671F\u8BB0\u4F4F\u768
|
|
|
43200
43706
|
- \u8C03\u7528\u524D\u5148\u56DE\u987E <memory-context> \u91CC\u5DF2\u6709\u6761\u76EE\uFF0C\u5982\u679C\u53EA\u662F\u4FE1\u606F\u8FC7\u65F6\u6216\u8865\u5145\uFF0C\u5E94\u4F7F\u7528 memory_update \u800C\u4E0D\u662F\u65B0\u5EFA
|
|
43201
43707
|
|
|
43202
43708
|
\u5199\u5165\u8981\u6C42\uFF1A
|
|
43203
|
-
- title\uFF1A\u4E00\u53E5\u8BDD\u5C0F\u6807\u9898\uFF08< 30 \u5B57\uFF09\uFF0C\u4FBF\u4E8E\u4EE5\u540E\u5B9A\u4F4D/\u66F4\u65B0\uFF0C\u4F8B\u5982"\u504F\u597D-\u5305\u7BA1\u7406\u5668"\u3001"\
|
|
43709
|
+
- title\uFF1A\u4E00\u53E5\u8BDD\u5C0F\u6807\u9898\uFF08< 30 \u5B57\uFF09\uFF0C\u4FBF\u4E8E\u4EE5\u540E\u5B9A\u4F4D/\u66F4\u65B0\uFF0C\u4F8B\u5982"\u504F\u597D-\u5305\u7BA1\u7406\u5668"\u3001"\u90E8\u95E8-\u90E8\u7F72\u73AF\u5883"
|
|
43204
43710
|
- content\uFF1A\u5B8C\u6574\u6B63\u6587\uFF0C\u4FDD\u7559\u8DB3\u591F\u4E0A\u4E0B\u6587\u4EE5\u4FBF\u672A\u6765\u91CD\u7528\uFF1B\u4E0D\u8981\u53EA\u5199\u4E00\u4E2A\u5355\u8BCD
|
|
43205
43711
|
- \u540C\u4E00\u7C7B\u4FE1\u606F\u4E0D\u8981\u91CD\u590D\u521B\u5EFA\uFF0C\u67E5\u5230\u540C\u7C7B\u65E7\u8BB0\u5FC6\u8BF7\u6539\u7528 memory_update
|
|
43206
43712
|
`;
|
|
43207
43713
|
var memoryCreate = (engine) => ({
|
|
43208
43714
|
name: `memory_create`,
|
|
43209
|
-
description:
|
|
43715
|
+
description: DESCRIPTION35,
|
|
43210
43716
|
input_schema: {
|
|
43211
43717
|
type: `object`,
|
|
43212
43718
|
properties: {
|
|
@@ -43238,11 +43744,11 @@ var memoryCreate = (engine) => ({
|
|
|
43238
43744
|
});
|
|
43239
43745
|
|
|
43240
43746
|
// src/tools/tools/memory/MemoryUpdate.ts
|
|
43241
|
-
var
|
|
43747
|
+
var DESCRIPTION36 = `\u66F4\u65B0\u4E00\u6761\u5DF2\u5B58\u5728\u7684\u957F\u671F\u8BB0\u5FC6\uFF08\u6309 id \u5B9A\u4F4D\uFF09\u3002
|
|
43242
43748
|
|
|
43243
43749
|
\u4F55\u65F6\u8C03\u7528\uFF1A
|
|
43244
43750
|
1. <memory-context> \u91CC\u5DF2\u6709\u7684\u8BB0\u5FC6\u4FE1\u606F\u8FC7\u65F6\u3001\u6709\u504F\u5DEE\u3001\u9700\u8981\u8865\u5145\u7EC6\u8282
|
|
43245
|
-
2. \u7528\u6237\u4FEE\u6B63\u4E4B\u524D\u8BF4\u8FC7\u7684\u4E8B\u5B9E\uFF08\u4F8B\u5982"\u6211\u5DF2\u7ECF\u4ECE A \
|
|
43751
|
+
2. \u7528\u6237\u4FEE\u6B63\u4E4B\u524D\u8BF4\u8FC7\u7684\u4E8B\u5B9E\uFF08\u4F8B\u5982"\u6211\u5DF2\u7ECF\u4ECE A \u90E8\u95E8\u6362\u5230 B \u90E8\u95E8\u4E86"\uFF09
|
|
43246
43752
|
3. \u540C\u7C7B\u504F\u597D\u53D1\u751F\u53D8\u5316\uFF08\u4F8B\u5982\u4ECE"\u7528 npm"\u6539\u6210"\u7528 pnpm"\uFF09
|
|
43247
43753
|
|
|
43248
43754
|
\u4F7F\u7528\u8981\u70B9\uFF1A
|
|
@@ -43252,7 +43758,7 @@ var DESCRIPTION35 = `\u66F4\u65B0\u4E00\u6761\u5DF2\u5B58\u5728\u7684\u957F\u671
|
|
|
43252
43758
|
`;
|
|
43253
43759
|
var memoryUpdate = (engine) => ({
|
|
43254
43760
|
name: `memory_update`,
|
|
43255
|
-
description:
|
|
43761
|
+
description: DESCRIPTION36,
|
|
43256
43762
|
input_schema: {
|
|
43257
43763
|
type: `object`,
|
|
43258
43764
|
properties: {
|
|
@@ -43289,7 +43795,7 @@ var memoryUpdate = (engine) => ({
|
|
|
43289
43795
|
});
|
|
43290
43796
|
|
|
43291
43797
|
// src/tools/tools/memory/MemoryDelete.ts
|
|
43292
|
-
var
|
|
43798
|
+
var DESCRIPTION37 = `\u5220\u9664\u4E00\u6761\u957F\u671F\u8BB0\u5FC6\uFF08\u6309 id \u5B9A\u4F4D\uFF09\u3002
|
|
43293
43799
|
|
|
43294
43800
|
\u4F55\u65F6\u8C03\u7528\uFF1A
|
|
43295
43801
|
1. \u7528\u6237\u660E\u786E\u8981\u6C42"\u5FD8\u6389 / \u522B\u518D\u8BB0 / \u5220\u6389\u5173\u4E8E X \u7684\u8BB0\u5FC6"
|
|
@@ -43302,7 +43808,7 @@ var DESCRIPTION36 = `\u5220\u9664\u4E00\u6761\u957F\u671F\u8BB0\u5FC6\uFF08\u630
|
|
|
43302
43808
|
`;
|
|
43303
43809
|
var memoryDelete = (engine) => ({
|
|
43304
43810
|
name: `memory_delete`,
|
|
43305
|
-
description:
|
|
43811
|
+
description: DESCRIPTION37,
|
|
43306
43812
|
input_schema: {
|
|
43307
43813
|
type: `object`,
|
|
43308
43814
|
properties: {
|
|
@@ -43509,7 +44015,7 @@ var COMPACT_SYSTEM_PROMPT = `\u4F60\u662F Duclaw \u7684\u4F1A\u8BDD\u538B\u7F29\
|
|
|
43509
44015
|
3. \u4FDD\u7559\u5173\u952E\u6587\u4EF6\u8DEF\u5F84\u3001\u547D\u4EE4\u3001\u9519\u8BEF\u539F\u6587\u7247\u6BB5\u3001\u5916\u90E8\u6587\u6863/\u63A5\u53E3\u7ED3\u8BBA\u3002
|
|
43510
44016
|
4. \u4FDD\u7559\u91CD\u8981\u5DE5\u5177\u7ED3\u679C\uFF0C\u4F46\u4E0D\u8981\u7C98\u8D34\u957F\u65E5\u5FD7\uFF1B\u53EA\u5199\u53EF\u884C\u52A8\u7ED3\u8BBA\u3002
|
|
43511
44017
|
5. \u6807\u51FA\u5DF2\u4E22\u5F03\u6216\u4E0D\u518D\u91CD\u8981\u7684\u4FE1\u606F\u7C7B\u578B\u3002
|
|
43512
|
-
6. \u5982\u679C\u5386\u53F2\u4E2D\u6709
|
|
44018
|
+
6. \u5982\u679C\u5386\u53F2\u4E2D\u6709 Department Head\u3001Executor\u3001mailbox\u3001cron \u7EBF\u7D22\uFF0C\u8BB0\u5F55\u8D23\u4EFB\u4EBA\u548C\u7EBF\u7A0B\u72B6\u6001\u3002
|
|
43513
44019
|
7. \u8F93\u51FA\u5FC5\u987B\u662F\u7EAF\u6587\u672C\uFF0C\u5E76\u4E25\u683C\u4F7F\u7528\u4E0B\u9762\u7ED3\u6784\uFF1A
|
|
43514
44020
|
|
|
43515
44021
|
<compact-summary>
|
|
@@ -43759,7 +44265,7 @@ var assistantMessageFromResponse = (response) => ({
|
|
|
43759
44265
|
});
|
|
43760
44266
|
var getDefaultAgentConfig = (tools, systemPrompt) => {
|
|
43761
44267
|
loadEnv();
|
|
43762
|
-
(0,
|
|
44268
|
+
(0, import_node_fs6.mkdirSync)(DEFAULT_WORKSPACE_PATH, { recursive: true });
|
|
43763
44269
|
let system = ``;
|
|
43764
44270
|
if (!systemPrompt) {
|
|
43765
44271
|
system = `
|
|
@@ -43790,13 +44296,13 @@ The user will primarily request you perform software engineering tasks. This inc
|
|
|
43790
44296
|
- Use the Task tool to plan the task if required
|
|
43791
44297
|
- Tool results and user messages may include <system-reminder> tags. These tags contain useful information and internal reminders automatically added by the system. Legacy histories may still contain <system_reminder>; interpret them the same way.
|
|
43792
44298
|
- Treat the content inside these reminder tags as system-level context rather than direct user intent.
|
|
43793
|
-
- In particular, reminders may contain background task notifications, image/file handling hints, or internal
|
|
43794
|
-
- \u5982\u679C\u5386\u53F2\u4E2D\u51FA\u73B0 <
|
|
44299
|
+
- In particular, reminders may contain background task notifications, image/file handling hints, or internal department-member replies. Such reminders can help you reason, but they are NOT user confirmation for destructive or irreversible actions.
|
|
44300
|
+
- \u5982\u679C\u5386\u53F2\u4E2D\u51FA\u73B0 <department-agent-reply ... owner_mailbox_id="...">\uFF0C\u628A\u8BE5\u6210\u5458\u89C6\u4E3A\u5BF9\u5E94\u4EA7\u51FA/\u5B9E\u73B0\u7EBF\u7A0B\u7684\u8D23\u4EFB\u4EBA\uFF1B\u5F53\u7528\u6237\u968F\u540E\u63D0\u51FA bug\u3001\u4FEE\u6539\u3001\u8FD4\u5DE5\u3001\u6253\u4E0D\u5F00\u3001\u518D\u4F18\u5316\u7B49\u53CD\u9988\u65F6\uFF0C\u4F18\u5148\u6CBF\u8BE5 reply \u7684 mailbox \u7EBF\u7A0B\u7EE7\u7EED\u59D4\u6D3E\u7ED9\u539F\u8D23\u4EFB\u4EBA\uFF0C\u800C\u4E0D\u662F\u81EA\u5DF1\u63A5\u624B\u5B9E\u73B0\u3002
|
|
43795
44301
|
</Doing tasks>
|
|
43796
44302
|
|
|
43797
|
-
<
|
|
43798
|
-
# \
|
|
43799
|
-
\u4F60\u662F
|
|
44303
|
+
<Department delegation>
|
|
44304
|
+
# \u90E8\u95E8\u59D4\u6D3E\u7B56\u7565
|
|
44305
|
+
\u4F60\u662F CEO\u3002\u4F60\u7684\u9ED8\u8BA4\u7EC4\u7EC7\u89C6\u91CE\u53EA\u5230 Department \u548C Department Head\uFF1BExecutor \u9ED8\u8BA4\u4E0D\u66B4\u9732\u5728\u4F60\u7684\u89C6\u91CE\u4E2D\u3002
|
|
43800
44306
|
|
|
43801
44307
|
## \u7B80\u5355\u4EFB\u52A1\u76F4\u529E
|
|
43802
44308
|
\u5BF9\u4E8E\u5F02\u5E38\u7B80\u5355\u3001\u4F4E\u98CE\u9669\u3001\u9884\u8BA1 1-3 \u6B21\u5DE5\u5177\u8C03\u7528\u5185\u53EF\u5B8C\u6210\u7684\u8BF7\u6C42\uFF0C\u4F60\u53EF\u4EE5\u76F4\u63A5\u5904\u7406\uFF0C\u907F\u514D\u8FC7\u5EA6\u7EC4\u7EC7\u5316\u3002
|
|
@@ -43810,35 +44316,36 @@ The user will primarily request you perform software engineering tasks. This inc
|
|
|
43810
44316
|
- \u9700\u8981\u5199\u4EE3\u7801\u3001\u6539\u6587\u4EF6\u3001\u751F\u6210\u590D\u6742\u4EA7\u7269\u3001\u6D4B\u8BD5\u3001\u8C03\u8BD5\u6216\u90E8\u7F72
|
|
43811
44317
|
|
|
43812
44318
|
## \u59D4\u6D3E\u6D41\u7A0B
|
|
43813
|
-
1. \u590D\u6742\u4EFB\u52A1\u5148\u8C03\u7528
|
|
43814
|
-
2. \u5982\u679C\u5B58\u5728\u804C\u8D23\u5339\u914D\u7684\
|
|
43815
|
-
3. \u5982\u679C\u4E0D\u5B58\u5728\u804C\u8D23\u5339\u914D\u7684\
|
|
43816
|
-
4. \u65B0\
|
|
43817
|
-
5. \u521B\u5EFA
|
|
43818
|
-
6. \u521B\u5EFA
|
|
43819
|
-
7. \u7B49\u5F85
|
|
44319
|
+
1. \u590D\u6742\u4EFB\u52A1\u5148\u8C03\u7528 department_list \u67E5\u770B\u5F53\u524D\u6709\u54EA\u4E9B\u90E8\u95E8
|
|
44320
|
+
2. \u5982\u679C\u5B58\u5728\u804C\u8D23\u5339\u914D\u7684\u90E8\u95E8\uFF0C\u628A\u4EFB\u52A1\u53D1\u9001\u7ED9\u8BE5\u90E8\u95E8\u7684 Department Head
|
|
44321
|
+
3. \u5982\u679C\u4E0D\u5B58\u5728\u804C\u8D23\u5339\u914D\u7684\u90E8\u95E8\uFF0C\u5148\u521B\u5EFA\u76EE\u6807\uFF08goal_create\uFF09\uFF0C\u518D\u521B\u5EFA\u90E8\u95E8\uFF08department_create\uFF09
|
|
44322
|
+
4. \u65B0\u90E8\u95E8\u521B\u5EFA\u540E\uFF0C\u5FC5\u987B\u5148\u521B\u5EFA\u8BE5\u90E8\u95E8\u7684 Department Head\uFF08department_member_create\uFF0Crole=department_head\uFF09
|
|
44323
|
+
5. \u521B\u5EFA Department Head \u65F6\uFF0CfocusOn \u53EA\u5199\u957F\u671F\u5C97\u4F4D\u804C\u8D23\u3001\u90E8\u95E8\u8FB9\u754C\u548C\u7BA1\u7406\u539F\u5219\uFF0C\u4E0D\u5199\u5F53\u524D\u4EFB\u52A1\u7EC6\u8282
|
|
44324
|
+
6. \u521B\u5EFA Department Head \u540E\uFF0C\u518D\u901A\u8FC7 department_communicate \u53D1\u9001\u5F53\u524D\u5177\u4F53\u4EFB\u52A1\u90AE\u4EF6
|
|
44325
|
+
7. \u7B49\u5F85 Department Head \u56DE\u590D\u7ED3\u679C\uFF0C\u6C47\u603B\u540E\u56DE\u590D\u7528\u6237
|
|
43820
44326
|
|
|
43821
44327
|
## \u4F60\u7684\u89D2\u8272
|
|
43822
44328
|
- \u7406\u89E3\u7528\u6237\u610F\u56FE\uFF0C\u5236\u5B9A\u8BA1\u5212
|
|
43823
44329
|
- \u5224\u65AD\u7B80\u5355\u4EFB\u52A1\u662F\u5426\u76F4\u529E
|
|
43824
|
-
- \u7EF4\u62A4\
|
|
43825
|
-
- \u5C06\u590D\u6742\u4EFB\u52A1\u8DEF\u7531\u7ED9
|
|
43826
|
-
- \u534F\u8C03
|
|
44330
|
+
- \u7EF4\u62A4\u90E8\u95E8\u7EC4\u7EC7\u7ED3\u6784
|
|
44331
|
+
- \u5C06\u590D\u6742\u4EFB\u52A1\u8DEF\u7531\u7ED9 Department Head
|
|
44332
|
+
- \u534F\u8C03 Department Head \u4E4B\u95F4\u7684\u5DE5\u4F5C
|
|
43827
44333
|
- \u6C47\u603B\u7ED3\u679C\u5E76\u56DE\u590D\u7528\u6237
|
|
43828
|
-
- \u4E0D\u76F4\u63A5\u521B\u5EFA\
|
|
43829
|
-
- \
|
|
44334
|
+
- \u9ED8\u8BA4\u4E0D\u76F4\u63A5\u521B\u5EFA Executor\uFF1BExecutor \u7531 Department Head \u7BA1\u7406
|
|
44335
|
+
- \u9ED8\u8BA4\u4E0D\u66B4\u9732\u8DE8\u5C42\u7EA7/\u8DE8\u90E8\u95E8\u901A\u4FE1\u5730\u5740\uFF1B\u5982\u679C agent \u5DF2\u77E5\u5730\u5740\uFF0C\u901A\u4FE1\u4E0D\u5E94\u88AB\u786C\u6027\u963B\u6B62\uFF0C\u4F46\u8981\u5C0A\u91CD\u7EC4\u7EC7\u8D23\u4EFB\u5E76\u7559\u4E0B\u5BA1\u8BA1\u8BB0\u5F55
|
|
44336
|
+
- \u4FDD\u6301\u8D23\u4EFB\u5F52\u5C5E\u7A33\u5B9A\uFF1A\u67D0\u4E2A Department Head \u5DF2\u7ECF\u8D1F\u8D23\u7684\u4EA7\u51FA\uFF0C\u540E\u7EED\u4FEE\u8BA2\u3001\u8FD4\u5DE5\u3001bug \u4FEE\u590D\u9ED8\u8BA4\u4ECD\u7531\u8BE5 Department Head \u8D1F\u8D23\uFF0C\u901A\u5E38\u5E94\u901A\u8FC7 mailbox_followup \u63A5\u56DE\u539F\u7EBF\u7A0B
|
|
43830
44337
|
|
|
43831
44338
|
## \u8D23\u4EFB\u5F52\u5C5E\u786C\u89C4\u5219
|
|
43832
|
-
-
|
|
43833
|
-
- \u4F18\u5148\u4F7F\u7528 mailbox_followup \u5BF9\u8BE5
|
|
43834
|
-
- \u5982\u679C\
|
|
43835
|
-
</
|
|
44339
|
+
- Department Head \u4EA4\u4ED8\u7ED3\u679C\u540E\uFF0C\u5982\u679C\u7528\u6237\u53CD\u9988\u201C\u6253\u4E0D\u5F00\u201D\u201C\u6709 bug\u201D\u201C\u5E2E\u6211\u6539\u4E00\u4E0B\u201D\u201C\u518D\u51FA\u4E00\u7248\u201D\u7B49\uFF0C\u8FD9\u5C5E\u4E8E\u5BF9\u65E2\u6709\u4EA7\u51FA\u7684\u8FD4\u5DE5\u6216\u8FED\u4EE3\uFF0C\u9ED8\u8BA4\u5E94\u7EE7\u7EED\u4EA4\u7ED9\u539F\u8D23\u4EFB Department Head \u5904\u7406
|
|
44340
|
+
- \u4F18\u5148\u4F7F\u7528 mailbox_followup \u5BF9\u8BE5 Department Head \u6700\u8FD1\u4E00\u6B21\u76F8\u5173\u56DE\u4FE1\u8FFD\u52A0\u53CD\u9988\uFF0C\u907F\u514D CEO \u4EB2\u81EA\u4E0B\u573A\u91CD\u505A\u5B9E\u73B0
|
|
44341
|
+
- \u5982\u679C\u90E8\u95E8\u6CA1\u6709 Department Head\uFF0C\u5E94\u5148\u8865\u5EFA Department Head\uFF0C\u518D\u901A\u8FC7 Department Head \u5904\u7406\u4EFB\u52A1
|
|
44342
|
+
</Department delegation>
|
|
43836
44343
|
|
|
43837
44344
|
<Communication>
|
|
43838
44345
|
# \u4E3B\u52A8\u6C9F\u901A\u4E0E\u7528\u6237\u786E\u8BA4
|
|
43839
44346
|
- \u53CA\u65F6\u56DE\u590D\uFF1A\u5728\u6BCF\u4E2A\u5173\u952E\u8282\u70B9\u90FD\u8981\u901A\u8FC7 send_message \u5DE5\u5177\u4E3B\u52A8\u544A\u77E5\u7528\u6237\u5F53\u524D\u8FDB\u5C55\uFF0C\u4E0D\u8981\u8BA9\u7528\u6237\u957F\u65F6\u95F4\u7B49\u5F85\u65E0\u56DE\u5E94\u3002
|
|
43840
44347
|
- \u6536\u5230\u4EFB\u52A1\u65F6\uFF1A\u544A\u77E5\u7528\u6237\u5DF2\u6536\u5230\uFF0C\u7B80\u8FF0\u4F60\u7684\u7406\u89E3\u548C\u63A5\u4E0B\u6765\u7684\u8BA1\u5212
|
|
43841
|
-
- \u59D4\u6D3E\
|
|
44348
|
+
- \u59D4\u6D3E\u90E8\u95E8\u540E\uFF1A\u544A\u77E5\u7528\u6237\u5DF2\u5206\u914D\u90E8\u95E8\u5904\u7406\uFF0C\u9884\u671F\u7684\u6B65\u9AA4
|
|
43842
44349
|
- \u4EFB\u52A1\u5B8C\u6210\u65F6\uFF1A\u6C47\u603B\u7ED3\u679C\u56DE\u590D\u7528\u6237
|
|
43843
44350
|
- \u9047\u5230\u95EE\u9898\u65F6\uFF1A\u7ACB\u5373\u544A\u77E5\u7528\u6237\u9047\u5230\u4E86\u4EC0\u4E48\u95EE\u9898
|
|
43844
44351
|
- \u5173\u952E\u51B3\u7B56\u8981\u5F81\u6C42\u7528\u6237\u610F\u89C1\uFF1A\u5728\u4EE5\u4E0B\u60C5\u51B5\u5FC5\u987B\u5148\u54A8\u8BE2\u7528\u6237\u3001\u5F97\u5230\u540C\u610F\u540E\u518D\u6267\u884C\uFF1A
|
|
@@ -43881,7 +44388,7 @@ ${getSkillMeta()}
|
|
|
43881
44388
|
\u4F55\u65F6\u5199\u5165\u65B0\u8BB0\u5FC6\uFF08\u8C03\u7528 memory_create\uFF09\uFF1A
|
|
43882
44389
|
1. \u7528\u6237\u660E\u786E\u8BF4"\u8BB0\u4F4F / \u4EE5\u540E\u90FD / \u522B\u518D / \u4ECE\u73B0\u5728\u8D77"\u7B49\u6307\u793A\u6027\u63AA\u8F9E
|
|
43883
44390
|
2. \u7528\u6237\u591A\u6B21\u91CD\u7533\u7684\u504F\u597D\uFF08\u5305\u7BA1\u7406\u5668\u3001\u56DE\u7B54\u98CE\u683C\u7B49\uFF09
|
|
43884
|
-
3. \u7528\u6237\u544A\u77E5\u7684\u7A33\u5B9A\u4E8B\u5B9E\uFF08\
|
|
44391
|
+
3. \u7528\u6237\u544A\u77E5\u7684\u7A33\u5B9A\u4E8B\u5B9E\uFF08\u90E8\u95E8\u3001\u90E8\u7F72\u73AF\u5883\u3001\u8EAB\u4EFD\u7B49\uFF09
|
|
43885
44392
|
4. \u6709\u7528\u7684\u9886\u57DF\u7EA6\u5B9A\uFF08commit \u89C4\u8303\u3001\u7F16\u7801\u98CE\u683C\u7B49\uFF09
|
|
43886
44393
|
\u4F55\u65F6 **\u4E0D** \u8981\u5199\u5165\uFF1A
|
|
43887
44394
|
\u2022 \u4E00\u6B21\u6027\u4FE1\u606F\uFF08\u67E5\u5929\u6C14\u3001\u5177\u4F53\u4EFB\u52A1\u6570\u636E\uFF09
|
|
@@ -44110,7 +44617,7 @@ ${content}`;
|
|
|
44110
44617
|
messages,
|
|
44111
44618
|
systemPrompt: effectiveSystemPrompt,
|
|
44112
44619
|
reason,
|
|
44113
|
-
threadId: request.
|
|
44620
|
+
threadId: request.departmentAgentId || void 0
|
|
44114
44621
|
});
|
|
44115
44622
|
console.warn(
|
|
44116
44623
|
`[compact] \u5B8C\u6574 compact \u6210\u529F reason=${reason} before=${result.record.contextTokensBefore} after=${result.record.contextTokensAfter} messages=${result.messages}`
|
|
@@ -44578,14 +45085,14 @@ var executeAgentJob = async (job) => {
|
|
|
44578
45085
|
const cronSystemPrompt = getCronSystemPrompt();
|
|
44579
45086
|
const agentConfig = getDefaultAgentConfig(tools, cronSystemPrompt);
|
|
44580
45087
|
const agent = createAgent(agentConfig);
|
|
44581
|
-
const
|
|
45088
|
+
const departmentAgentId = `cron-${job.id}`;
|
|
44582
45089
|
const userRequest = {
|
|
44583
45090
|
platform: job.delivery.channel,
|
|
44584
45091
|
userId: job.delivery.to,
|
|
44585
45092
|
requestId: generateRequestId(),
|
|
44586
45093
|
content: `\u9700\u8981 [cron] \u6267\u884C\u4EFB\u52A1: ${job.id} - ${job.title}`,
|
|
44587
45094
|
job,
|
|
44588
|
-
|
|
45095
|
+
departmentAgentId
|
|
44589
45096
|
};
|
|
44590
45097
|
const cronResult = await agent(userRequest);
|
|
44591
45098
|
return cronResult.content;
|
|
@@ -44644,8 +45151,8 @@ var saveResultToFile = (job, cronResp) => {
|
|
|
44644
45151
|
return filePath;
|
|
44645
45152
|
};
|
|
44646
45153
|
|
|
44647
|
-
// src/tools/tools/
|
|
44648
|
-
var
|
|
45154
|
+
// src/tools/tools/department/ListMailbox.ts
|
|
45155
|
+
var DESCRIPTION38 = `
|
|
44649
45156
|
\u67E5\u770B\u4F60\u7684\u90AE\u7BB1\u4E2D\u6240\u6709\u5F85\u5904\u7406\u90AE\u4EF6\u7684\u6458\u8981\u5217\u8868\u3002
|
|
44650
45157
|
|
|
44651
45158
|
\u8FD4\u56DE\u6BCF\u5C01\u90AE\u4EF6\u7684\uFF1Aid\u3001\u53D1\u9001\u8005\u3001\u53D1\u9001\u65F6\u95F4\u3001\u5185\u5BB9\u6458\u8981\uFF08\u524D100\u5B57\uFF09\u3002
|
|
@@ -44660,17 +45167,17 @@ var DESCRIPTION37 = `
|
|
|
44660
45167
|
`;
|
|
44661
45168
|
var listMailbox = {
|
|
44662
45169
|
name: `list_mailbox`,
|
|
44663
|
-
description:
|
|
45170
|
+
description: DESCRIPTION38,
|
|
44664
45171
|
input_schema: {
|
|
44665
45172
|
type: `object`,
|
|
44666
45173
|
properties: {},
|
|
44667
45174
|
required: []
|
|
44668
45175
|
},
|
|
44669
45176
|
async execute(input, userRequest) {
|
|
44670
|
-
if (!userRequest?.
|
|
45177
|
+
if (!userRequest?.departmentAgentId) {
|
|
44671
45178
|
return `[listMailbox] \u65E0\u6CD5\u786E\u5B9A\u5F53\u524D agent \u7684 mailboxId`;
|
|
44672
45179
|
}
|
|
44673
|
-
const myMailboxId = userRequest.
|
|
45180
|
+
const myMailboxId = userRequest.departmentAgentId;
|
|
44674
45181
|
const db3 = createSqliteDB();
|
|
44675
45182
|
const stmt = db3.prepare(
|
|
44676
45183
|
`SELECT id, from_mailbox_id as fromMailboxId, content, send_time as sendTime
|
|
@@ -44715,8 +45222,8 @@ ${list}`;
|
|
|
44715
45222
|
}
|
|
44716
45223
|
};
|
|
44717
45224
|
|
|
44718
|
-
// src/tools/tools/
|
|
44719
|
-
var
|
|
45225
|
+
// src/tools/tools/department/GetMailbox.ts
|
|
45226
|
+
var DESCRIPTION39 = `
|
|
44720
45227
|
\u83B7\u53D6\u6307\u5B9A\u90AE\u4EF6\u7684\u5B8C\u6574\u5185\u5BB9\u3002
|
|
44721
45228
|
|
|
44722
45229
|
\u5728 list_mailbox \u67E5\u770B\u90AE\u4EF6\u5217\u8868\u540E\uFF0C\u4F7F\u7528\u6B64\u5DE5\u5177\u83B7\u53D6\u4F60\u60F3\u8981\u5904\u7406\u7684\u90AE\u4EF6\u7684\u5B8C\u6574\u5185\u5BB9\u3002
|
|
@@ -44727,7 +45234,7 @@ var DESCRIPTION38 = `
|
|
|
44727
45234
|
`;
|
|
44728
45235
|
var getMailbox = {
|
|
44729
45236
|
name: `get_mailbox`,
|
|
44730
|
-
description:
|
|
45237
|
+
description: DESCRIPTION39,
|
|
44731
45238
|
input_schema: {
|
|
44732
45239
|
type: `object`,
|
|
44733
45240
|
properties: {
|
|
@@ -44739,7 +45246,7 @@ var getMailbox = {
|
|
|
44739
45246
|
required: [`message_id`]
|
|
44740
45247
|
},
|
|
44741
45248
|
async execute(input, userRequest) {
|
|
44742
|
-
if (!userRequest?.
|
|
45249
|
+
if (!userRequest?.departmentAgentId) {
|
|
44743
45250
|
return `[getMailbox] \u65E0\u6CD5\u786E\u5B9A\u5F53\u524D agent \u7684 mailboxId`;
|
|
44744
45251
|
}
|
|
44745
45252
|
const messageId = input.message_id;
|
|
@@ -44760,13 +45267,13 @@ var getMailbox = {
|
|
|
44760
45267
|
if (!msg) {
|
|
44761
45268
|
return `[getMailbox] \u672A\u627E\u5230 id \u4E3A ${messageId} \u7684\u90AE\u4EF6`;
|
|
44762
45269
|
}
|
|
44763
|
-
if (msg.toMailboxId !== userRequest.
|
|
45270
|
+
if (msg.toMailboxId !== userRequest.departmentAgentId) {
|
|
44764
45271
|
return `[getMailbox] \u8BE5\u90AE\u4EF6\u4E0D\u5C5E\u4E8E\u4F60\u7684\u90AE\u7BB1`;
|
|
44765
45272
|
}
|
|
44766
45273
|
recordMailboxEvent({
|
|
44767
45274
|
messageId: msg.id,
|
|
44768
45275
|
mailboxId: msg.toMailboxId,
|
|
44769
|
-
actorMailboxId: userRequest.
|
|
45276
|
+
actorMailboxId: userRequest.departmentAgentId,
|
|
44770
45277
|
counterpartMailboxId: msg.fromMailboxId,
|
|
44771
45278
|
eventType: "message_opened"
|
|
44772
45279
|
});
|
|
@@ -44785,8 +45292,8 @@ ${msg.content}`;
|
|
|
44785
45292
|
}
|
|
44786
45293
|
};
|
|
44787
45294
|
|
|
44788
|
-
// src/tools/tools/
|
|
44789
|
-
var
|
|
45295
|
+
// src/tools/tools/department/ReplyMailbox.ts
|
|
45296
|
+
var DESCRIPTION40 = `
|
|
44790
45297
|
\u6B63\u5F0F\u56DE\u590D\u4E00\u5C01\u90AE\u4EF6\u3002\u5BF9\u5F53\u524D\u6D88\u606F\u5F62\u6210\u660E\u786E\u7ED3\u8BBA\u540E\uFF0C\u4F7F\u7528\u6B64\u5DE5\u5177\u5C06\u7ED3\u679C\u53D1\u56DE\u7ED9\u90AE\u4EF6\u53D1\u9001\u8005\uFF0C\u5E76\u7ED3\u675F\u8FD9\u5C01\u6D88\u606F\u7684\u5904\u7406\u3002
|
|
44791
45298
|
|
|
44792
45299
|
\u53C2\u6570\uFF1A
|
|
@@ -44799,7 +45306,7 @@ var DESCRIPTION39 = `
|
|
|
44799
45306
|
`;
|
|
44800
45307
|
var replyMailbox = {
|
|
44801
45308
|
name: `reply_mailbox`,
|
|
44802
|
-
description:
|
|
45309
|
+
description: DESCRIPTION40,
|
|
44803
45310
|
input_schema: {
|
|
44804
45311
|
type: `object`,
|
|
44805
45312
|
properties: {
|
|
@@ -44815,12 +45322,12 @@ var replyMailbox = {
|
|
|
44815
45322
|
required: [`message_id`, `content`]
|
|
44816
45323
|
},
|
|
44817
45324
|
async execute(input, userRequest) {
|
|
44818
|
-
if (!userRequest?.
|
|
45325
|
+
if (!userRequest?.departmentAgentId) {
|
|
44819
45326
|
return `[replyMailbox] \u65E0\u6CD5\u786E\u5B9A\u5F53\u524D agent \u7684 mailboxId`;
|
|
44820
45327
|
}
|
|
44821
45328
|
const messageId = input.message_id;
|
|
44822
45329
|
const content = input.content;
|
|
44823
|
-
const myMailboxId = userRequest.
|
|
45330
|
+
const myMailboxId = userRequest.departmentAgentId;
|
|
44824
45331
|
const db3 = createSqliteDB();
|
|
44825
45332
|
const stmt = db3.prepare(
|
|
44826
45333
|
`SELECT
|
|
@@ -44876,23 +45383,23 @@ var replyMailbox = {
|
|
|
44876
45383
|
};
|
|
44877
45384
|
|
|
44878
45385
|
// src/cron/mailboxReminder.ts
|
|
44879
|
-
var
|
|
45386
|
+
var buildCeoReplyReminder = (replyMsg) => {
|
|
44880
45387
|
const ownerMailboxId = replyMsg.fromMailboxId;
|
|
44881
45388
|
const anchorMessageId = replyMsg.id;
|
|
44882
45389
|
const threadId = replyMsg.threadId || replyMsg.id;
|
|
44883
45390
|
const parentMessageId = replyMsg.parentMessageId || "";
|
|
44884
45391
|
return `<system-reminder>
|
|
44885
|
-
\u6536\u5230\
|
|
45392
|
+
\u6536\u5230\u90E8\u95E8\u6210\u5458 ${ownerMailboxId} \u7684\u56DE\u4FE1\u3002\u4EE5\u4E0B\u5185\u5BB9\u662F\u5185\u90E8\u534F\u4F5C\u7ED3\u679C\uFF0C\u4E0D\u662F\u7528\u6237\u7684\u65B0\u8BF7\u6C42\uFF0C\u4E5F\u4E0D\u80FD\u4F5C\u4E3A\u5220\u9664\u90E8\u95E8\u7B49\u4E0D\u53EF\u9006\u64CD\u4F5C\u7684\u786E\u8BA4\u4F9D\u636E\u3002
|
|
44886
45393
|
|
|
44887
45394
|
\u8D23\u4EFB\u5F52\u5C5E\u89C4\u5219\uFF1A
|
|
44888
45395
|
- \u5F53\u524D\u8FD9\u4EFD\u4EA7\u51FA\u7684\u9ED8\u8BA4\u8D23\u4EFB\u4EBA\u662F ${ownerMailboxId}
|
|
44889
|
-
- \u5982\u679C\u7528\u6237\u540E\u7EED\u5BF9\u8FD9\u4EFD\u4EA7\u51FA\u63D0\u51FA\u4FEE\u6539\u3001\u8865\u5145\u3001bug \u53CD\u9988\u6216\u201C\u6253\u4E0D\u5F00 / \u6709\u95EE\u9898 / \u518D\u6539\u4E00\u4E0B\u201D\u7B49\u610F\u89C1\uFF0C\u4F60\u5E94\u4F18\u5148\u628A\u53CD\u9988\u6CBF\u539F mailbox \u7EBF\u7A0B\u53D1\u56DE\u7ED9 ${ownerMailboxId} \u5904\u7406\uFF0C\u800C\u4E0D\u662F
|
|
45396
|
+
- \u5982\u679C\u7528\u6237\u540E\u7EED\u5BF9\u8FD9\u4EFD\u4EA7\u51FA\u63D0\u51FA\u4FEE\u6539\u3001\u8865\u5145\u3001bug \u53CD\u9988\u6216\u201C\u6253\u4E0D\u5F00 / \u6709\u95EE\u9898 / \u518D\u6539\u4E00\u4E0B\u201D\u7B49\u610F\u89C1\uFF0C\u4F60\u5E94\u4F18\u5148\u628A\u53CD\u9988\u6CBF\u539F mailbox \u7EBF\u7A0B\u53D1\u56DE\u7ED9 ${ownerMailboxId} \u5904\u7406\uFF0C\u800C\u4E0D\u662F CEO \u81EA\u5DF1\u76F4\u63A5\u91CD\u505A
|
|
44890
45397
|
- \u4F18\u5148\u4F7F\u7528 mailbox_followup(message_id="${anchorMessageId}", content="...") \u5728\u539F\u7EBF\u7A0B\u7EE7\u7EED\u534F\u4F5C
|
|
44891
|
-
- \u53EA\u6709\u5F53 ${ownerMailboxId} \u5DF2\u4E0D\u5B58\u5728\u3001\u660E\u786E\u8868\u793A\u65E0\u6CD5\u5904\u7406\u3001\u6216\u7528\u6237\u660E\u786E\u8981\u6C42
|
|
45398
|
+
- \u53EA\u6709\u5F53 ${ownerMailboxId} \u5DF2\u4E0D\u5B58\u5728\u3001\u660E\u786E\u8868\u793A\u65E0\u6CD5\u5904\u7406\u3001\u6216\u7528\u6237\u660E\u786E\u8981\u6C42 CEO \u4EB2\u81EA\u63A5\u7BA1\u65F6\uFF0C\u4F60\u624D\u53EF\u4EE5\u81EA\u5DF1\u6267\u884C
|
|
44892
45399
|
|
|
44893
|
-
<
|
|
45400
|
+
<department-agent-reply from="${ownerMailboxId}" owner_mailbox_id="${ownerMailboxId}" message_id="${anchorMessageId}" thread_id="${threadId}" parent_message_id="${parentMessageId}">
|
|
44894
45401
|
${replyMsg.content}
|
|
44895
|
-
</
|
|
45402
|
+
</department-agent-reply>
|
|
44896
45403
|
</system-reminder>`;
|
|
44897
45404
|
};
|
|
44898
45405
|
|
|
@@ -44913,7 +45420,7 @@ var markMailboxStatus = (msgId, status) => {
|
|
|
44913
45420
|
reason: "mailbox_poller"
|
|
44914
45421
|
});
|
|
44915
45422
|
};
|
|
44916
|
-
var
|
|
45423
|
+
var handleCeoReply = async (replyMsg) => {
|
|
44917
45424
|
const { fromMailboxId, content } = replyMsg;
|
|
44918
45425
|
const originStmt = db2.prepare(
|
|
44919
45426
|
`SELECT origin_user_id as originUserId, origin_platform as originPlatform
|
|
@@ -44927,7 +45434,7 @@ var handleManagerReply = async (replyMsg) => {
|
|
|
44927
45434
|
return;
|
|
44928
45435
|
}
|
|
44929
45436
|
console.log(`[mailbox] \u627E\u5230\u539F\u59CB\u7528\u6237\u4E0A\u4E0B\u6587: userId=${origin.originUserId}, platform=${origin.originPlatform}`);
|
|
44930
|
-
const replyContent =
|
|
45437
|
+
const replyContent = buildCeoReplyReminder({
|
|
44931
45438
|
id: replyMsg.id,
|
|
44932
45439
|
fromMailboxId,
|
|
44933
45440
|
content,
|
|
@@ -44943,7 +45450,7 @@ var handleManagerReply = async (replyMsg) => {
|
|
|
44943
45450
|
platform: origin.originPlatform,
|
|
44944
45451
|
userId: origin.originUserId,
|
|
44945
45452
|
requestId: replyMsg.id,
|
|
44946
|
-
|
|
45453
|
+
departmentAgentId: "",
|
|
44947
45454
|
content: replyContent
|
|
44948
45455
|
};
|
|
44949
45456
|
const config2 = getDefaultAgentConfig();
|
|
@@ -44964,18 +45471,18 @@ var handleManagerReply = async (replyMsg) => {
|
|
|
44964
45471
|
}
|
|
44965
45472
|
}
|
|
44966
45473
|
};
|
|
44967
|
-
var
|
|
45474
|
+
var wakeDepartmentAgent = async (mailboxId, msgIds) => {
|
|
44968
45475
|
try {
|
|
44969
|
-
const [
|
|
44970
|
-
if (!
|
|
45476
|
+
const [departmentName, memberName] = mailboxId.split("::");
|
|
45477
|
+
if (!departmentName || !memberName) {
|
|
44971
45478
|
console.warn(`[mailbox] mailboxId \u683C\u5F0F\u4E0D\u5408\u6CD5: ${mailboxId}`);
|
|
44972
45479
|
for (const id of msgIds) markMailboxStatus(id, "cancelled");
|
|
44973
45480
|
return;
|
|
44974
45481
|
}
|
|
44975
|
-
const member =
|
|
45482
|
+
const member = getDepartmentMemberByName(departmentName, memberName);
|
|
44976
45483
|
if (!member) {
|
|
44977
45484
|
console.warn(`[mailbox] \u76EE\u6807\u6210\u5458\u4E0D\u5B58\u5728\uFF08\u53EF\u80FD\u5DF2\u88AB\u5220\u9664\uFF09: ${mailboxId}`);
|
|
44978
|
-
const notifyContent = `[\u7CFB\u7EDF\u901A\u77E5] \
|
|
45485
|
+
const notifyContent = `[\u7CFB\u7EDF\u901A\u77E5] \u90E8\u95E8\u6210\u5458 ${mailboxId} \u4E0D\u5B58\u5728\uFF08\u53EF\u80FD\u6240\u5C5E\u90E8\u95E8\u5DF2\u89E3\u6563\u6216\u6210\u5458\u5DF2\u88AB\u5220\u9664\uFF09\uFF0C\u4EE5\u4E0B\u6D88\u606F\u65E0\u6CD5\u6295\u9012\u5DF2\u88AB\u53D6\u6D88\u3002\u8BF7\u6839\u636E\u60C5\u51B5\u51B3\u5B9A\u662F\u5426\u9700\u8981\u91CD\u65B0\u7EC4\u5EFA\u90E8\u95E8\u6216\u8C03\u6574\u8BA1\u5212\u3002`;
|
|
44979
45486
|
const originStmt = db2.prepare(
|
|
44980
45487
|
`SELECT origin_user_id as originUserId, origin_platform as originPlatform
|
|
44981
45488
|
FROM mailbox WHERE id IN (${msgIds.map(() => "?").join(",")}) AND origin_user_id IS NOT NULL LIMIT 1`
|
|
@@ -44988,35 +45495,35 @@ var wakeTeamAgent = async (mailboxId, msgIds) => {
|
|
|
44988
45495
|
for (const id of msgIds) markMailboxStatus(id, "cancelled");
|
|
44989
45496
|
return;
|
|
44990
45497
|
}
|
|
44991
|
-
const
|
|
44992
|
-
const workspacePath =
|
|
44993
|
-
const agentConfig =
|
|
45498
|
+
const department = getDepartmentById(member.departmentId);
|
|
45499
|
+
const workspacePath = department?.workpath;
|
|
45500
|
+
const agentConfig = getDepartmentAgentConfig(void 0, member.focusOn, workspacePath, department?.name);
|
|
44994
45501
|
const agent = createAgent(agentConfig);
|
|
44995
45502
|
const request = {
|
|
44996
45503
|
platform: "mailbox",
|
|
44997
45504
|
userId: mailboxId,
|
|
44998
45505
|
requestId: msgIds[0],
|
|
44999
|
-
|
|
45506
|
+
departmentAgentId: mailboxId,
|
|
45000
45507
|
workspacePath,
|
|
45001
45508
|
content: `\u4F60\u7684\u90AE\u7BB1\u4E2D\u6709 ${msgIds.length} \u5C01\u65B0\u90AE\u4EF6\u3002\u8BF7\u4F7F\u7528 list_mailbox \u67E5\u770B\u90AE\u4EF6\u5217\u8868\uFF0C\u6839\u636E\u91CD\u8981\u6027\u548C\u65F6\u6548\u6027\u51B3\u5B9A\u5904\u7406\u987A\u5E8F\uFF0C\u7136\u540E\u4F7F\u7528 get_mailbox \u83B7\u53D6\u90AE\u4EF6\u5185\u5BB9\uFF0C\u5B8C\u6210\u5DE5\u4F5C\u540E\u4F7F\u7528 reply_mailbox \u56DE\u590D\u3002`
|
|
45002
45509
|
};
|
|
45003
45510
|
const result = await agent(request);
|
|
45004
|
-
console.log(`[mailbox]
|
|
45511
|
+
console.log(`[mailbox] department agent ${mailboxId} \u5904\u7406\u5B8C\u6210, alreadySent=${result.alreadySent}`);
|
|
45005
45512
|
for (const id of msgIds) {
|
|
45006
45513
|
const changed = updateMailboxMessageStatus(id, "pending", {
|
|
45007
45514
|
fromStatus: "processing",
|
|
45008
|
-
reason: "
|
|
45515
|
+
reason: "department_agent_retry"
|
|
45009
45516
|
});
|
|
45010
45517
|
if (changed) {
|
|
45011
45518
|
console.log(`[mailbox] \u6D88\u606F ${id} \u672A\u88AB agent \u5904\u7406\uFF0C\u5DF2\u91CD\u7F6E\u4E3A pending`);
|
|
45012
45519
|
}
|
|
45013
45520
|
}
|
|
45014
45521
|
} catch (err) {
|
|
45015
|
-
console.error(`[mailbox] \u5524\u9192
|
|
45522
|
+
console.error(`[mailbox] \u5524\u9192 department agent ${mailboxId} \u5931\u8D25:`, err);
|
|
45016
45523
|
for (const id of msgIds) {
|
|
45017
45524
|
updateMailboxMessageStatus(id, "pending", {
|
|
45018
45525
|
fromStatus: "processing",
|
|
45019
|
-
reason: "
|
|
45526
|
+
reason: "department_agent_wakeup_failed"
|
|
45020
45527
|
});
|
|
45021
45528
|
}
|
|
45022
45529
|
}
|
|
@@ -45038,12 +45545,12 @@ var pollMailbox = async () => {
|
|
|
45038
45545
|
group.push(msg);
|
|
45039
45546
|
grouped.set(msg.toMailboxId, group);
|
|
45040
45547
|
}
|
|
45041
|
-
const
|
|
45548
|
+
const ceoMsgs = grouped.get("manager") || [];
|
|
45042
45549
|
grouped.delete("manager");
|
|
45043
|
-
for (const msg of
|
|
45044
|
-
console.log(`[mailbox] \u6536\u5230
|
|
45550
|
+
for (const msg of ceoMsgs) {
|
|
45551
|
+
console.log(`[mailbox] \u6536\u5230 department agent \u56DE\u4FE1\uFF08\u6765\u81EA ${msg.fromMailboxId}\uFF09\uFF0C\u6B63\u5728\u5524\u9192\u4E3B agent...`);
|
|
45045
45552
|
try {
|
|
45046
|
-
await
|
|
45553
|
+
await handleCeoReply(msg);
|
|
45047
45554
|
markMailboxStatus(msg.id, "done");
|
|
45048
45555
|
} catch (err) {
|
|
45049
45556
|
console.error(`[mailbox] \u5524\u9192\u4E3B agent \u5904\u7406\u56DE\u4FE1\u5931\u8D25:`, err);
|
|
@@ -45052,7 +45559,7 @@ var pollMailbox = async () => {
|
|
|
45052
45559
|
}
|
|
45053
45560
|
const tasks = Array.from(grouped.entries()).map(async ([mailboxId, msgs]) => {
|
|
45054
45561
|
const msgIds = msgs.map((m) => m.id);
|
|
45055
|
-
await
|
|
45562
|
+
await wakeDepartmentAgent(mailboxId, msgIds);
|
|
45056
45563
|
});
|
|
45057
45564
|
await Promise.all(tasks);
|
|
45058
45565
|
} catch (err) {
|
|
@@ -45065,7 +45572,7 @@ var startMailboxPoller = (intervalMs = 3e3) => {
|
|
|
45065
45572
|
console.log(`[mailbox] \u591A\u667A\u80FD\u4F53\u90AE\u7BB1\u8F6E\u8BE2\u5DF2\u542F\u52A8\uFF0C\u95F4\u9694 ${intervalMs}ms`);
|
|
45066
45573
|
return setInterval(pollMailbox, intervalMs);
|
|
45067
45574
|
};
|
|
45068
|
-
var
|
|
45575
|
+
var createDepartmentAgentTools = () => {
|
|
45069
45576
|
const registry2 = createToolRegistry();
|
|
45070
45577
|
const executor = createToolExecutor(registry2);
|
|
45071
45578
|
registerTool(registry2, dateTool);
|
|
@@ -45092,22 +45599,32 @@ var createTeamAgentTools = () => {
|
|
|
45092
45599
|
registerTool(registry2, getMailbox);
|
|
45093
45600
|
registerTool(registry2, mailboxFollowup);
|
|
45094
45601
|
registerTool(registry2, replyMailbox);
|
|
45095
|
-
registerTool(registry2,
|
|
45096
|
-
registerTool(registry2,
|
|
45097
|
-
registerTool(registry2,
|
|
45602
|
+
registerTool(registry2, departmentMemberList);
|
|
45603
|
+
registerTool(registry2, departmentMemberCreate);
|
|
45604
|
+
registerTool(registry2, departmentCommunicate);
|
|
45605
|
+
registerTool(registry2, departmentMemoryList);
|
|
45606
|
+
registerTool(registry2, departmentMemoryCreate);
|
|
45607
|
+
registerTool(registry2, departmentMemoryUpdate);
|
|
45608
|
+
registerTool(registry2, departmentMemoryDelete);
|
|
45609
|
+
registerTool(registry2, departmentSkillList);
|
|
45610
|
+
registerTool(registry2, departmentSkillPropose);
|
|
45611
|
+
registerTool(registry2, departmentSkillKeep);
|
|
45612
|
+
registerTool(registry2, departmentSkillDrop);
|
|
45613
|
+
registerTool(registry2, departmentProposalCreate);
|
|
45098
45614
|
registerTool(registry2, sendMessage);
|
|
45099
45615
|
return { registry: registry2, executor };
|
|
45100
45616
|
};
|
|
45101
|
-
var
|
|
45617
|
+
var getDepartmentAgentConfig = (tools, memberFocusOn, workspacePath, departmentName) => {
|
|
45102
45618
|
loadEnv();
|
|
45103
45619
|
const defaultSystemPrompt = `
|
|
45104
|
-
You are a
|
|
45620
|
+
You are a department member agent in an AI company collaboration system. You communicate with other agents through a mailbox system \u2014 you do NOT interact with end users directly.
|
|
45105
45621
|
|
|
45106
45622
|
<Role>
|
|
45107
|
-
Your role is to process messages from other
|
|
45623
|
+
Your role is to process messages from other department agents, complete your assigned tasks, and respond with clear results. Focus on your department role and collaborate effectively with other agents.
|
|
45108
45624
|
${memberFocusOn ? `
|
|
45109
45625
|
Your specialization: ${memberFocusOn}` : ""}
|
|
45110
45626
|
</Role>
|
|
45627
|
+
${buildDepartmentLearningContext(departmentName)}
|
|
45111
45628
|
${workspacePath ? `
|
|
45112
45629
|
<Workspace>
|
|
45113
45630
|
\u4F60\u7684\u5DE5\u4F5C\u533A\u8DEF\u5F84\u662F: ${workspacePath}
|
|
@@ -45130,9 +45647,9 @@ ${workspacePath ? `
|
|
|
45130
45647
|
- mailbox_followup \u53EF\u4EE5\u8C03\u7528\u591A\u6B21\uFF0C\u7528\u4E8E\u7EBF\u7A0B\u5185\u6301\u7EED\u534F\u4F5C\uFF1B\u5B83\u4E0D\u4F1A\u7ED3\u675F\u539F\u6D88\u606F
|
|
45131
45648
|
- reply_mailbox \u8868\u793A\u201C\u5F53\u524D\u8FD9\u5C01\u6D88\u606F\u6211\u5DF2\u5F62\u6210\u6B63\u5F0F\u56DE\u590D\u201D\uFF0C\u4F1A\u7ED3\u675F\u8FD9\u5C01\u6D88\u606F\u7684\u5904\u7406
|
|
45132
45649
|
- \u5982\u679C\u90AE\u4EF6\u4E2D\u7684\u4EFB\u52A1\u4F60\u5DF2\u7ECF\u5B8C\u6210\u6216\u4E0D\u9700\u8981\u5904\u7406\uFF0C\u53EF\u4EE5\u7528 reply_mailbox \u7B80\u77ED\u56DE\u590D\u8BF4\u660E\u539F\u56E0\uFF08\u5982"\u5DF2\u5B8C\u6210\uFF0C\u65E0\u9700\u5904\u7406"\uFF09\uFF0C\u7136\u540E\u7EE7\u7EED\u4E0B\u4E00\u5C01
|
|
45133
|
-
- \u5982\u679C\u9700\u8981\u4E3B\u52A8\u8054\u7CFB\u5176\u4ED6\
|
|
45134
|
-
- \u5982\u679C\u4F60\u662F
|
|
45135
|
-
- \u5982\u679C\u4F60\u4E0D\u662F
|
|
45650
|
+
- \u5982\u679C\u9700\u8981\u4E3B\u52A8\u8054\u7CFB\u5176\u4ED6\u90E8\u95E8\u6210\u5458\uFF0C\u4F7F\u7528 department_communicate \u5DE5\u5177
|
|
45651
|
+
- \u5982\u679C\u4F60\u662F Department Head\uFF0C\u5904\u7406\u590D\u6742\u4EFB\u52A1\u524D\u53EF\u4EE5\u4F7F\u7528 department_member_list \u67E5\u770B\u672C\u90E8\u95E8\u5DF2\u6709\u6210\u5458\uFF0C\u5E76\u5728\u9700\u8981\u65F6\u4F7F\u7528 department_member_create \u521B\u5EFA Executor
|
|
45652
|
+
- \u5982\u679C\u4F60\u4E0D\u662F Department Head\uFF0C\u4E0D\u8981\u5C1D\u8BD5\u67E5\u770B\u5B8C\u6574\u90E8\u95E8\u6210\u5458\u76EE\u5F55\u6216\u521B\u5EFA\u6210\u5458
|
|
45136
45653
|
- \u56DE\u590D\u5185\u5BB9\u5E94\u6E05\u6670\u3001\u7ED3\u6784\u5316\uFF0C\u4FBF\u4E8E\u5BF9\u65B9\u89E3\u6790\u548C\u7EE7\u7EED\u5DE5\u4F5C
|
|
45137
45654
|
</Mailbox Workflow>
|
|
45138
45655
|
|
|
@@ -45179,7 +45696,7 @@ ${workspacePath ? `
|
|
|
45179
45696
|
let finalTools = [];
|
|
45180
45697
|
let finalExcutor;
|
|
45181
45698
|
if (!tools) {
|
|
45182
|
-
const { registry: registry2, executor } =
|
|
45699
|
+
const { registry: registry2, executor } = createDepartmentAgentTools();
|
|
45183
45700
|
registerTool(registry2, recallChatHistory(storage, topicStorage, recallIndexStorage));
|
|
45184
45701
|
finalTools = getAllTools(registry2);
|
|
45185
45702
|
finalExcutor = executor;
|
|
@@ -45329,26 +45846,26 @@ var handleParsingNestedValues = (form, key, value) => {
|
|
|
45329
45846
|
};
|
|
45330
45847
|
|
|
45331
45848
|
// node_modules/.pnpm/hono@4.12.9/node_modules/hono/dist/utils/url.js
|
|
45332
|
-
var splitPath = (
|
|
45333
|
-
const paths =
|
|
45849
|
+
var splitPath = (path17) => {
|
|
45850
|
+
const paths = path17.split("/");
|
|
45334
45851
|
if (paths[0] === "") {
|
|
45335
45852
|
paths.shift();
|
|
45336
45853
|
}
|
|
45337
45854
|
return paths;
|
|
45338
45855
|
};
|
|
45339
45856
|
var splitRoutingPath = (routePath) => {
|
|
45340
|
-
const { groups, path:
|
|
45341
|
-
const paths = splitPath(
|
|
45857
|
+
const { groups, path: path17 } = extractGroupsFromPath(routePath);
|
|
45858
|
+
const paths = splitPath(path17);
|
|
45342
45859
|
return replaceGroupMarks(paths, groups);
|
|
45343
45860
|
};
|
|
45344
|
-
var extractGroupsFromPath = (
|
|
45861
|
+
var extractGroupsFromPath = (path17) => {
|
|
45345
45862
|
const groups = [];
|
|
45346
|
-
|
|
45863
|
+
path17 = path17.replace(/\{[^}]+\}/g, (match2, index) => {
|
|
45347
45864
|
const mark = `@${index}`;
|
|
45348
45865
|
groups.push([mark, match2]);
|
|
45349
45866
|
return mark;
|
|
45350
45867
|
});
|
|
45351
|
-
return { groups, path:
|
|
45868
|
+
return { groups, path: path17 };
|
|
45352
45869
|
};
|
|
45353
45870
|
var replaceGroupMarks = (paths, groups) => {
|
|
45354
45871
|
for (let i = groups.length - 1; i >= 0; i--) {
|
|
@@ -45405,8 +45922,8 @@ var getPath = (request) => {
|
|
|
45405
45922
|
const queryIndex = url.indexOf("?", i);
|
|
45406
45923
|
const hashIndex = url.indexOf("#", i);
|
|
45407
45924
|
const end = queryIndex === -1 ? hashIndex === -1 ? void 0 : hashIndex : hashIndex === -1 ? queryIndex : Math.min(queryIndex, hashIndex);
|
|
45408
|
-
const
|
|
45409
|
-
return tryDecodeURI(
|
|
45925
|
+
const path17 = url.slice(start, end);
|
|
45926
|
+
return tryDecodeURI(path17.includes("%25") ? path17.replace(/%25/g, "%2525") : path17);
|
|
45410
45927
|
} else if (charCode === 63 || charCode === 35) {
|
|
45411
45928
|
break;
|
|
45412
45929
|
}
|
|
@@ -45423,11 +45940,11 @@ var mergePath = (base, sub, ...rest) => {
|
|
|
45423
45940
|
}
|
|
45424
45941
|
return `${base?.[0] === "/" ? "" : "/"}${base}${sub === "/" ? "" : `${base?.at(-1) === "/" ? "" : "/"}${sub?.[0] === "/" ? sub.slice(1) : sub}`}`;
|
|
45425
45942
|
};
|
|
45426
|
-
var checkOptionalParameter = (
|
|
45427
|
-
if (
|
|
45943
|
+
var checkOptionalParameter = (path17) => {
|
|
45944
|
+
if (path17.charCodeAt(path17.length - 1) !== 63 || !path17.includes(":")) {
|
|
45428
45945
|
return null;
|
|
45429
45946
|
}
|
|
45430
|
-
const segments =
|
|
45947
|
+
const segments = path17.split("/");
|
|
45431
45948
|
const results = [];
|
|
45432
45949
|
let basePath = "";
|
|
45433
45950
|
segments.forEach((segment) => {
|
|
@@ -45568,9 +46085,9 @@ var HonoRequest = class {
|
|
|
45568
46085
|
*/
|
|
45569
46086
|
path;
|
|
45570
46087
|
bodyCache = {};
|
|
45571
|
-
constructor(request,
|
|
46088
|
+
constructor(request, path17 = "/", matchResult = [[]]) {
|
|
45572
46089
|
this.raw = request;
|
|
45573
|
-
this.path =
|
|
46090
|
+
this.path = path17;
|
|
45574
46091
|
this.#matchResult = matchResult;
|
|
45575
46092
|
this.#validatedData = {};
|
|
45576
46093
|
}
|
|
@@ -46307,8 +46824,8 @@ var Hono = class _Hono {
|
|
|
46307
46824
|
return this;
|
|
46308
46825
|
};
|
|
46309
46826
|
});
|
|
46310
|
-
this.on = (method,
|
|
46311
|
-
for (const p of [
|
|
46827
|
+
this.on = (method, path17, ...handlers) => {
|
|
46828
|
+
for (const p of [path17].flat()) {
|
|
46312
46829
|
this.#path = p;
|
|
46313
46830
|
for (const m of [method].flat()) {
|
|
46314
46831
|
handlers.map((handler) => {
|
|
@@ -46365,8 +46882,8 @@ var Hono = class _Hono {
|
|
|
46365
46882
|
* app.route("/api", app2) // GET /api/user
|
|
46366
46883
|
* ```
|
|
46367
46884
|
*/
|
|
46368
|
-
route(
|
|
46369
|
-
const subApp = this.basePath(
|
|
46885
|
+
route(path17, app) {
|
|
46886
|
+
const subApp = this.basePath(path17);
|
|
46370
46887
|
app.routes.map((r) => {
|
|
46371
46888
|
let handler;
|
|
46372
46889
|
if (app.errorHandler === errorHandler) {
|
|
@@ -46392,9 +46909,9 @@ var Hono = class _Hono {
|
|
|
46392
46909
|
* const api = new Hono().basePath('/api')
|
|
46393
46910
|
* ```
|
|
46394
46911
|
*/
|
|
46395
|
-
basePath(
|
|
46912
|
+
basePath(path17) {
|
|
46396
46913
|
const subApp = this.#clone();
|
|
46397
|
-
subApp._basePath = mergePath(this._basePath,
|
|
46914
|
+
subApp._basePath = mergePath(this._basePath, path17);
|
|
46398
46915
|
return subApp;
|
|
46399
46916
|
}
|
|
46400
46917
|
/**
|
|
@@ -46468,7 +46985,7 @@ var Hono = class _Hono {
|
|
|
46468
46985
|
* })
|
|
46469
46986
|
* ```
|
|
46470
46987
|
*/
|
|
46471
|
-
mount(
|
|
46988
|
+
mount(path17, applicationHandler, options) {
|
|
46472
46989
|
let replaceRequest;
|
|
46473
46990
|
let optionHandler;
|
|
46474
46991
|
if (options) {
|
|
@@ -46495,7 +47012,7 @@ var Hono = class _Hono {
|
|
|
46495
47012
|
return [c.env, executionContext];
|
|
46496
47013
|
};
|
|
46497
47014
|
replaceRequest ||= (() => {
|
|
46498
|
-
const mergedPath = mergePath(this._basePath,
|
|
47015
|
+
const mergedPath = mergePath(this._basePath, path17);
|
|
46499
47016
|
const pathPrefixLength = mergedPath === "/" ? 0 : mergedPath.length;
|
|
46500
47017
|
return (request) => {
|
|
46501
47018
|
const url = new URL(request.url);
|
|
@@ -46510,14 +47027,14 @@ var Hono = class _Hono {
|
|
|
46510
47027
|
}
|
|
46511
47028
|
await next();
|
|
46512
47029
|
};
|
|
46513
|
-
this.#addRoute(METHOD_NAME_ALL, mergePath(
|
|
47030
|
+
this.#addRoute(METHOD_NAME_ALL, mergePath(path17, "*"), handler);
|
|
46514
47031
|
return this;
|
|
46515
47032
|
}
|
|
46516
|
-
#addRoute(method,
|
|
47033
|
+
#addRoute(method, path17, handler) {
|
|
46517
47034
|
method = method.toUpperCase();
|
|
46518
|
-
|
|
46519
|
-
const r = { basePath: this._basePath, path:
|
|
46520
|
-
this.router.add(method,
|
|
47035
|
+
path17 = mergePath(this._basePath, path17);
|
|
47036
|
+
const r = { basePath: this._basePath, path: path17, method, handler };
|
|
47037
|
+
this.router.add(method, path17, [handler, r]);
|
|
46521
47038
|
this.routes.push(r);
|
|
46522
47039
|
}
|
|
46523
47040
|
#handleError(err, c) {
|
|
@@ -46530,10 +47047,10 @@ var Hono = class _Hono {
|
|
|
46530
47047
|
if (method === "HEAD") {
|
|
46531
47048
|
return (async () => new Response(null, await this.#dispatch(request, executionCtx, env, "GET")))();
|
|
46532
47049
|
}
|
|
46533
|
-
const
|
|
46534
|
-
const matchResult = this.router.match(method,
|
|
47050
|
+
const path17 = this.getPath(request, { env });
|
|
47051
|
+
const matchResult = this.router.match(method, path17);
|
|
46535
47052
|
const c = new Context(request, {
|
|
46536
|
-
path:
|
|
47053
|
+
path: path17,
|
|
46537
47054
|
matchResult,
|
|
46538
47055
|
env,
|
|
46539
47056
|
executionCtx,
|
|
@@ -46633,7 +47150,7 @@ var Hono = class _Hono {
|
|
|
46633
47150
|
|
|
46634
47151
|
// node_modules/.pnpm/hono@4.12.9/node_modules/hono/dist/router/reg-exp-router/matcher.js
|
|
46635
47152
|
var emptyParam = [];
|
|
46636
|
-
function match(method,
|
|
47153
|
+
function match(method, path17) {
|
|
46637
47154
|
const matchers = this.buildAllMatchers();
|
|
46638
47155
|
const match2 = ((method2, path22) => {
|
|
46639
47156
|
const matcher = matchers[method2] || matchers[METHOD_NAME_ALL];
|
|
@@ -46649,7 +47166,7 @@ function match(method, path16) {
|
|
|
46649
47166
|
return [matcher[1][index], match3];
|
|
46650
47167
|
});
|
|
46651
47168
|
this.match = match2;
|
|
46652
|
-
return match2(method,
|
|
47169
|
+
return match2(method, path17);
|
|
46653
47170
|
}
|
|
46654
47171
|
|
|
46655
47172
|
// node_modules/.pnpm/hono@4.12.9/node_modules/hono/dist/router/reg-exp-router/node.js
|
|
@@ -46764,12 +47281,12 @@ var Node = class _Node {
|
|
|
46764
47281
|
var Trie = class {
|
|
46765
47282
|
#context = { varIndex: 0 };
|
|
46766
47283
|
#root = new Node();
|
|
46767
|
-
insert(
|
|
47284
|
+
insert(path17, index, pathErrorCheckOnly) {
|
|
46768
47285
|
const paramAssoc = [];
|
|
46769
47286
|
const groups = [];
|
|
46770
47287
|
for (let i = 0; ; ) {
|
|
46771
47288
|
let replaced = false;
|
|
46772
|
-
|
|
47289
|
+
path17 = path17.replace(/\{[^}]+\}/g, (m) => {
|
|
46773
47290
|
const mark = `@\\${i}`;
|
|
46774
47291
|
groups[i] = [mark, m];
|
|
46775
47292
|
i++;
|
|
@@ -46780,7 +47297,7 @@ var Trie = class {
|
|
|
46780
47297
|
break;
|
|
46781
47298
|
}
|
|
46782
47299
|
}
|
|
46783
|
-
const tokens =
|
|
47300
|
+
const tokens = path17.match(/(?::[^\/]+)|(?:\/\*$)|./g) || [];
|
|
46784
47301
|
for (let i = groups.length - 1; i >= 0; i--) {
|
|
46785
47302
|
const [mark] = groups[i];
|
|
46786
47303
|
for (let j = tokens.length - 1; j >= 0; j--) {
|
|
@@ -46819,9 +47336,9 @@ var Trie = class {
|
|
|
46819
47336
|
// node_modules/.pnpm/hono@4.12.9/node_modules/hono/dist/router/reg-exp-router/router.js
|
|
46820
47337
|
var nullMatcher = [/^$/, [], /* @__PURE__ */ Object.create(null)];
|
|
46821
47338
|
var wildcardRegExpCache = /* @__PURE__ */ Object.create(null);
|
|
46822
|
-
function buildWildcardRegExp(
|
|
46823
|
-
return wildcardRegExpCache[
|
|
46824
|
-
|
|
47339
|
+
function buildWildcardRegExp(path17) {
|
|
47340
|
+
return wildcardRegExpCache[path17] ??= new RegExp(
|
|
47341
|
+
path17 === "*" ? "" : `^${path17.replace(
|
|
46825
47342
|
/\/\*$|([.\\+*[^\]$()])/g,
|
|
46826
47343
|
(_, metaChar) => metaChar ? `\\${metaChar}` : "(?:|/.*)"
|
|
46827
47344
|
)}$`
|
|
@@ -46843,17 +47360,17 @@ function buildMatcherFromPreprocessedRoutes(routes) {
|
|
|
46843
47360
|
);
|
|
46844
47361
|
const staticMap = /* @__PURE__ */ Object.create(null);
|
|
46845
47362
|
for (let i = 0, j = -1, len = routesWithStaticPathFlag.length; i < len; i++) {
|
|
46846
|
-
const [pathErrorCheckOnly,
|
|
47363
|
+
const [pathErrorCheckOnly, path17, handlers] = routesWithStaticPathFlag[i];
|
|
46847
47364
|
if (pathErrorCheckOnly) {
|
|
46848
|
-
staticMap[
|
|
47365
|
+
staticMap[path17] = [handlers.map(([h]) => [h, /* @__PURE__ */ Object.create(null)]), emptyParam];
|
|
46849
47366
|
} else {
|
|
46850
47367
|
j++;
|
|
46851
47368
|
}
|
|
46852
47369
|
let paramAssoc;
|
|
46853
47370
|
try {
|
|
46854
|
-
paramAssoc = trie.insert(
|
|
47371
|
+
paramAssoc = trie.insert(path17, j, pathErrorCheckOnly);
|
|
46855
47372
|
} catch (e) {
|
|
46856
|
-
throw e === PATH_ERROR ? new UnsupportedPathError(
|
|
47373
|
+
throw e === PATH_ERROR ? new UnsupportedPathError(path17) : e;
|
|
46857
47374
|
}
|
|
46858
47375
|
if (pathErrorCheckOnly) {
|
|
46859
47376
|
continue;
|
|
@@ -46887,12 +47404,12 @@ function buildMatcherFromPreprocessedRoutes(routes) {
|
|
|
46887
47404
|
}
|
|
46888
47405
|
return [regexp, handlerMap, staticMap];
|
|
46889
47406
|
}
|
|
46890
|
-
function findMiddleware(middleware,
|
|
47407
|
+
function findMiddleware(middleware, path17) {
|
|
46891
47408
|
if (!middleware) {
|
|
46892
47409
|
return void 0;
|
|
46893
47410
|
}
|
|
46894
47411
|
for (const k of Object.keys(middleware).sort((a, b) => b.length - a.length)) {
|
|
46895
|
-
if (buildWildcardRegExp(k).test(
|
|
47412
|
+
if (buildWildcardRegExp(k).test(path17)) {
|
|
46896
47413
|
return [...middleware[k]];
|
|
46897
47414
|
}
|
|
46898
47415
|
}
|
|
@@ -46906,7 +47423,7 @@ var RegExpRouter = class {
|
|
|
46906
47423
|
this.#middleware = { [METHOD_NAME_ALL]: /* @__PURE__ */ Object.create(null) };
|
|
46907
47424
|
this.#routes = { [METHOD_NAME_ALL]: /* @__PURE__ */ Object.create(null) };
|
|
46908
47425
|
}
|
|
46909
|
-
add(method,
|
|
47426
|
+
add(method, path17, handler) {
|
|
46910
47427
|
const middleware = this.#middleware;
|
|
46911
47428
|
const routes = this.#routes;
|
|
46912
47429
|
if (!middleware || !routes) {
|
|
@@ -46921,18 +47438,18 @@ var RegExpRouter = class {
|
|
|
46921
47438
|
});
|
|
46922
47439
|
});
|
|
46923
47440
|
}
|
|
46924
|
-
if (
|
|
46925
|
-
|
|
47441
|
+
if (path17 === "/*") {
|
|
47442
|
+
path17 = "*";
|
|
46926
47443
|
}
|
|
46927
|
-
const paramCount = (
|
|
46928
|
-
if (/\*$/.test(
|
|
46929
|
-
const re = buildWildcardRegExp(
|
|
47444
|
+
const paramCount = (path17.match(/\/:/g) || []).length;
|
|
47445
|
+
if (/\*$/.test(path17)) {
|
|
47446
|
+
const re = buildWildcardRegExp(path17);
|
|
46930
47447
|
if (method === METHOD_NAME_ALL) {
|
|
46931
47448
|
Object.keys(middleware).forEach((m) => {
|
|
46932
|
-
middleware[m][
|
|
47449
|
+
middleware[m][path17] ||= findMiddleware(middleware[m], path17) || findMiddleware(middleware[METHOD_NAME_ALL], path17) || [];
|
|
46933
47450
|
});
|
|
46934
47451
|
} else {
|
|
46935
|
-
middleware[method][
|
|
47452
|
+
middleware[method][path17] ||= findMiddleware(middleware[method], path17) || findMiddleware(middleware[METHOD_NAME_ALL], path17) || [];
|
|
46936
47453
|
}
|
|
46937
47454
|
Object.keys(middleware).forEach((m) => {
|
|
46938
47455
|
if (method === METHOD_NAME_ALL || method === m) {
|
|
@@ -46950,7 +47467,7 @@ var RegExpRouter = class {
|
|
|
46950
47467
|
});
|
|
46951
47468
|
return;
|
|
46952
47469
|
}
|
|
46953
|
-
const paths = checkOptionalParameter(
|
|
47470
|
+
const paths = checkOptionalParameter(path17) || [path17];
|
|
46954
47471
|
for (let i = 0, len = paths.length; i < len; i++) {
|
|
46955
47472
|
const path22 = paths[i];
|
|
46956
47473
|
Object.keys(routes).forEach((m) => {
|
|
@@ -46977,13 +47494,13 @@ var RegExpRouter = class {
|
|
|
46977
47494
|
const routes = [];
|
|
46978
47495
|
let hasOwnRoute = method === METHOD_NAME_ALL;
|
|
46979
47496
|
[this.#middleware, this.#routes].forEach((r) => {
|
|
46980
|
-
const ownRoute = r[method] ? Object.keys(r[method]).map((
|
|
47497
|
+
const ownRoute = r[method] ? Object.keys(r[method]).map((path17) => [path17, r[method][path17]]) : [];
|
|
46981
47498
|
if (ownRoute.length !== 0) {
|
|
46982
47499
|
hasOwnRoute ||= true;
|
|
46983
47500
|
routes.push(...ownRoute);
|
|
46984
47501
|
} else if (method !== METHOD_NAME_ALL) {
|
|
46985
47502
|
routes.push(
|
|
46986
|
-
...Object.keys(r[METHOD_NAME_ALL]).map((
|
|
47503
|
+
...Object.keys(r[METHOD_NAME_ALL]).map((path17) => [path17, r[METHOD_NAME_ALL][path17]])
|
|
46987
47504
|
);
|
|
46988
47505
|
}
|
|
46989
47506
|
});
|
|
@@ -47003,13 +47520,13 @@ var SmartRouter = class {
|
|
|
47003
47520
|
constructor(init) {
|
|
47004
47521
|
this.#routers = init.routers;
|
|
47005
47522
|
}
|
|
47006
|
-
add(method,
|
|
47523
|
+
add(method, path17, handler) {
|
|
47007
47524
|
if (!this.#routes) {
|
|
47008
47525
|
throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT);
|
|
47009
47526
|
}
|
|
47010
|
-
this.#routes.push([method,
|
|
47527
|
+
this.#routes.push([method, path17, handler]);
|
|
47011
47528
|
}
|
|
47012
|
-
match(method,
|
|
47529
|
+
match(method, path17) {
|
|
47013
47530
|
if (!this.#routes) {
|
|
47014
47531
|
throw new Error("Fatal error");
|
|
47015
47532
|
}
|
|
@@ -47024,7 +47541,7 @@ var SmartRouter = class {
|
|
|
47024
47541
|
for (let i2 = 0, len2 = routes.length; i2 < len2; i2++) {
|
|
47025
47542
|
router.add(...routes[i2]);
|
|
47026
47543
|
}
|
|
47027
|
-
res = router.match(method,
|
|
47544
|
+
res = router.match(method, path17);
|
|
47028
47545
|
} catch (e) {
|
|
47029
47546
|
if (e instanceof UnsupportedPathError) {
|
|
47030
47547
|
continue;
|
|
@@ -47074,10 +47591,10 @@ var Node2 = class _Node2 {
|
|
|
47074
47591
|
}
|
|
47075
47592
|
this.#patterns = [];
|
|
47076
47593
|
}
|
|
47077
|
-
insert(method,
|
|
47594
|
+
insert(method, path17, handler) {
|
|
47078
47595
|
this.#order = ++this.#order;
|
|
47079
47596
|
let curNode = this;
|
|
47080
|
-
const parts = splitRoutingPath(
|
|
47597
|
+
const parts = splitRoutingPath(path17);
|
|
47081
47598
|
const possibleKeys = [];
|
|
47082
47599
|
for (let i = 0, len = parts.length; i < len; i++) {
|
|
47083
47600
|
const p = parts[i];
|
|
@@ -47126,12 +47643,12 @@ var Node2 = class _Node2 {
|
|
|
47126
47643
|
}
|
|
47127
47644
|
}
|
|
47128
47645
|
}
|
|
47129
|
-
search(method,
|
|
47646
|
+
search(method, path17) {
|
|
47130
47647
|
const handlerSets = [];
|
|
47131
47648
|
this.#params = emptyParams;
|
|
47132
47649
|
const curNode = this;
|
|
47133
47650
|
let curNodes = [curNode];
|
|
47134
|
-
const parts = splitPath(
|
|
47651
|
+
const parts = splitPath(path17);
|
|
47135
47652
|
const curNodesQueue = [];
|
|
47136
47653
|
const len = parts.length;
|
|
47137
47654
|
let partOffsets = null;
|
|
@@ -47173,13 +47690,13 @@ var Node2 = class _Node2 {
|
|
|
47173
47690
|
if (matcher instanceof RegExp) {
|
|
47174
47691
|
if (partOffsets === null) {
|
|
47175
47692
|
partOffsets = new Array(len);
|
|
47176
|
-
let offset =
|
|
47693
|
+
let offset = path17[0] === "/" ? 1 : 0;
|
|
47177
47694
|
for (let p = 0; p < len; p++) {
|
|
47178
47695
|
partOffsets[p] = offset;
|
|
47179
47696
|
offset += parts[p].length + 1;
|
|
47180
47697
|
}
|
|
47181
47698
|
}
|
|
47182
|
-
const restPathString =
|
|
47699
|
+
const restPathString = path17.substring(partOffsets[i]);
|
|
47183
47700
|
const m = matcher.exec(restPathString);
|
|
47184
47701
|
if (m) {
|
|
47185
47702
|
params[name] = m[0];
|
|
@@ -47232,18 +47749,18 @@ var TrieRouter = class {
|
|
|
47232
47749
|
constructor() {
|
|
47233
47750
|
this.#node = new Node2();
|
|
47234
47751
|
}
|
|
47235
|
-
add(method,
|
|
47236
|
-
const results = checkOptionalParameter(
|
|
47752
|
+
add(method, path17, handler) {
|
|
47753
|
+
const results = checkOptionalParameter(path17);
|
|
47237
47754
|
if (results) {
|
|
47238
47755
|
for (let i = 0, len = results.length; i < len; i++) {
|
|
47239
47756
|
this.#node.insert(method, results[i], handler);
|
|
47240
47757
|
}
|
|
47241
47758
|
return;
|
|
47242
47759
|
}
|
|
47243
|
-
this.#node.insert(method,
|
|
47760
|
+
this.#node.insert(method, path17, handler);
|
|
47244
47761
|
}
|
|
47245
|
-
match(method,
|
|
47246
|
-
return this.#node.search(method,
|
|
47762
|
+
match(method, path17) {
|
|
47763
|
+
return this.#node.search(method, path17);
|
|
47247
47764
|
}
|
|
47248
47765
|
};
|
|
47249
47766
|
|
|
@@ -47945,10 +48462,10 @@ var createStreamBody = (stream) => {
|
|
|
47945
48462
|
});
|
|
47946
48463
|
return body;
|
|
47947
48464
|
};
|
|
47948
|
-
var getStats = (
|
|
48465
|
+
var getStats = (path17) => {
|
|
47949
48466
|
let stats;
|
|
47950
48467
|
try {
|
|
47951
|
-
stats = (0, import_fs15.statSync)(
|
|
48468
|
+
stats = (0, import_fs15.statSync)(path17);
|
|
47952
48469
|
} catch {
|
|
47953
48470
|
}
|
|
47954
48471
|
return stats;
|
|
@@ -47991,21 +48508,21 @@ var serveStatic = (options = { root: "" }) => {
|
|
|
47991
48508
|
return next();
|
|
47992
48509
|
}
|
|
47993
48510
|
}
|
|
47994
|
-
let
|
|
48511
|
+
let path17 = (0, import_path20.join)(
|
|
47995
48512
|
root,
|
|
47996
48513
|
!optionPath && options.rewriteRequestPath ? options.rewriteRequestPath(filename, c) : filename
|
|
47997
48514
|
);
|
|
47998
|
-
let stats = getStats(
|
|
48515
|
+
let stats = getStats(path17);
|
|
47999
48516
|
if (stats && stats.isDirectory()) {
|
|
48000
48517
|
const indexFile = options.index ?? "index.html";
|
|
48001
|
-
|
|
48002
|
-
stats = getStats(
|
|
48518
|
+
path17 = (0, import_path20.join)(path17, indexFile);
|
|
48519
|
+
stats = getStats(path17);
|
|
48003
48520
|
}
|
|
48004
48521
|
if (!stats) {
|
|
48005
|
-
await options.onNotFound?.(
|
|
48522
|
+
await options.onNotFound?.(path17, c);
|
|
48006
48523
|
return next();
|
|
48007
48524
|
}
|
|
48008
|
-
const mimeType = getMimeType(
|
|
48525
|
+
const mimeType = getMimeType(path17);
|
|
48009
48526
|
c.header("Content-Type", mimeType || "application/octet-stream");
|
|
48010
48527
|
if (options.precompressed && (!mimeType || COMPRESSIBLE_CONTENT_TYPE_REGEX.test(mimeType))) {
|
|
48011
48528
|
const acceptEncodingSet = new Set(
|
|
@@ -48015,12 +48532,12 @@ var serveStatic = (options = { root: "" }) => {
|
|
|
48015
48532
|
if (!acceptEncodingSet.has(encoding)) {
|
|
48016
48533
|
continue;
|
|
48017
48534
|
}
|
|
48018
|
-
const precompressedStats = getStats(
|
|
48535
|
+
const precompressedStats = getStats(path17 + ENCODINGS[encoding]);
|
|
48019
48536
|
if (precompressedStats) {
|
|
48020
48537
|
c.header("Content-Encoding", encoding);
|
|
48021
48538
|
c.header("Vary", "Accept-Encoding", { append: true });
|
|
48022
48539
|
stats = precompressedStats;
|
|
48023
|
-
|
|
48540
|
+
path17 = path17 + ENCODINGS[encoding];
|
|
48024
48541
|
break;
|
|
48025
48542
|
}
|
|
48026
48543
|
}
|
|
@@ -48034,7 +48551,7 @@ var serveStatic = (options = { root: "" }) => {
|
|
|
48034
48551
|
result = c.body(null);
|
|
48035
48552
|
} else if (!range) {
|
|
48036
48553
|
c.header("Content-Length", size.toString());
|
|
48037
|
-
result = c.body(createStreamBody((0, import_fs15.createReadStream)(
|
|
48554
|
+
result = c.body(createStreamBody((0, import_fs15.createReadStream)(path17)), 200);
|
|
48038
48555
|
} else {
|
|
48039
48556
|
c.header("Accept-Ranges", "bytes");
|
|
48040
48557
|
c.header("Date", stats.birthtime.toUTCString());
|
|
@@ -48045,12 +48562,12 @@ var serveStatic = (options = { root: "" }) => {
|
|
|
48045
48562
|
end = size - 1;
|
|
48046
48563
|
}
|
|
48047
48564
|
const chunksize = end - start + 1;
|
|
48048
|
-
const stream = (0, import_fs15.createReadStream)(
|
|
48565
|
+
const stream = (0, import_fs15.createReadStream)(path17, { start, end });
|
|
48049
48566
|
c.header("Content-Length", chunksize.toString());
|
|
48050
48567
|
c.header("Content-Range", `bytes ${start}-${end}/${stats.size}`);
|
|
48051
48568
|
result = c.body(createStreamBody(stream), 206);
|
|
48052
48569
|
}
|
|
48053
|
-
await options.onFound?.(
|
|
48570
|
+
await options.onFound?.(path17, c);
|
|
48054
48571
|
return result;
|
|
48055
48572
|
};
|
|
48056
48573
|
};
|
|
@@ -48145,7 +48662,7 @@ var cors = (options) => {
|
|
|
48145
48662
|
|
|
48146
48663
|
// src/server/index.ts
|
|
48147
48664
|
var import_promises11 = require("node:fs/promises");
|
|
48148
|
-
var
|
|
48665
|
+
var import_node_path14 = __toESM(require("node:path"));
|
|
48149
48666
|
|
|
48150
48667
|
// src/git/worktree.ts
|
|
48151
48668
|
var import_child_process2 = require("child_process");
|
|
@@ -48650,7 +49167,7 @@ agentRoutes.post("/goals/:gid/tasks/:tid/run", async (c) => {
|
|
|
48650
49167
|
platform: "kanban",
|
|
48651
49168
|
userId: `kanban:${gid}:${tid}`,
|
|
48652
49169
|
requestId,
|
|
48653
|
-
|
|
49170
|
+
departmentAgentId: "",
|
|
48654
49171
|
content: prompt,
|
|
48655
49172
|
workspacePath: task.worktree?.path
|
|
48656
49173
|
};
|
|
@@ -48740,7 +49257,7 @@ agentRoutes.post("/goals/:gid/tasks/:tid/chat", async (c) => {
|
|
|
48740
49257
|
platform: "kanban",
|
|
48741
49258
|
userId: `kanban:${gid}:${tid}`,
|
|
48742
49259
|
requestId,
|
|
48743
|
-
|
|
49260
|
+
departmentAgentId: "",
|
|
48744
49261
|
content: prompt,
|
|
48745
49262
|
workspacePath: task.worktree?.path
|
|
48746
49263
|
};
|
|
@@ -48856,7 +49373,7 @@ agentRoutes.post("/goals/:gid/chat", async (c) => {
|
|
|
48856
49373
|
platform: "kanban",
|
|
48857
49374
|
userId: threadId,
|
|
48858
49375
|
requestId,
|
|
48859
|
-
|
|
49376
|
+
departmentAgentId: "",
|
|
48860
49377
|
content: prompt
|
|
48861
49378
|
};
|
|
48862
49379
|
const config2 = getDefaultAgentConfig();
|
|
@@ -48954,67 +49471,66 @@ agentRoutes.get("/goals/:gid/chat/logs", async (c) => {
|
|
|
48954
49471
|
return c.json({ logs, running: isRunning });
|
|
48955
49472
|
});
|
|
48956
49473
|
|
|
48957
|
-
// src/server/routes/
|
|
48958
|
-
var
|
|
48959
|
-
|
|
49474
|
+
// src/server/routes/departments.ts
|
|
49475
|
+
var departmentRoutes = new Hono2();
|
|
49476
|
+
departmentRoutes.get("/departments", (c) => {
|
|
48960
49477
|
try {
|
|
48961
|
-
|
|
48962
|
-
return c.json(teams);
|
|
49478
|
+
return c.json(listDepartments());
|
|
48963
49479
|
} catch (err) {
|
|
48964
|
-
return c.json({ error: err.message || "Failed to list
|
|
49480
|
+
return c.json({ error: err.message || "Failed to list departments" }, 500);
|
|
48965
49481
|
}
|
|
48966
49482
|
});
|
|
48967
|
-
|
|
49483
|
+
departmentRoutes.get("/departments/:name", (c) => {
|
|
48968
49484
|
const name = c.req.param("name");
|
|
48969
|
-
const
|
|
48970
|
-
if (!
|
|
48971
|
-
return c.json(
|
|
49485
|
+
const department = getDepartment(name);
|
|
49486
|
+
if (!department) return c.json({ error: "Department not found" }, 404);
|
|
49487
|
+
return c.json(department);
|
|
48972
49488
|
});
|
|
48973
|
-
|
|
49489
|
+
departmentRoutes.post("/departments", async (c) => {
|
|
48974
49490
|
const body = await c.req.json();
|
|
48975
|
-
if (!body.id || !body.name
|
|
48976
|
-
return c.json({ error: "id
|
|
49491
|
+
if (!body.id || !body.name) {
|
|
49492
|
+
return c.json({ error: "id and name are required" }, 400);
|
|
48977
49493
|
}
|
|
48978
|
-
const
|
|
49494
|
+
const departmentDefinition = {
|
|
48979
49495
|
id: body.id,
|
|
48980
49496
|
name: body.name,
|
|
48981
|
-
|
|
49497
|
+
sourceGoalId: body.sourceGoalId,
|
|
49498
|
+
charter: body.charter,
|
|
48982
49499
|
workpath: body.workpath,
|
|
48983
|
-
|
|
49500
|
+
departmentMembers: body.departmentMembers ?? []
|
|
48984
49501
|
};
|
|
48985
49502
|
try {
|
|
48986
|
-
const
|
|
48987
|
-
return c.json(
|
|
49503
|
+
const department = createDepartment(departmentDefinition);
|
|
49504
|
+
return c.json(department, 201);
|
|
48988
49505
|
} catch (err) {
|
|
48989
|
-
return c.json({ error: err.message || "Failed to create
|
|
49506
|
+
return c.json({ error: err.message || "Failed to create department" }, 500);
|
|
48990
49507
|
}
|
|
48991
49508
|
});
|
|
48992
|
-
|
|
49509
|
+
departmentRoutes.delete("/departments/:name", async (c) => {
|
|
48993
49510
|
const name = c.req.param("name");
|
|
48994
|
-
const
|
|
48995
|
-
if (!
|
|
49511
|
+
const department = getDepartment(name);
|
|
49512
|
+
if (!department) return c.json({ error: "Department not found" }, 404);
|
|
48996
49513
|
try {
|
|
48997
|
-
|
|
49514
|
+
deleteDepartment(name);
|
|
48998
49515
|
return c.json({ ok: true });
|
|
48999
49516
|
} catch (err) {
|
|
49000
|
-
return c.json({ error: err.message || "Failed to delete
|
|
49517
|
+
return c.json({ error: err.message || "Failed to delete department" }, 500);
|
|
49001
49518
|
}
|
|
49002
49519
|
});
|
|
49003
|
-
|
|
49520
|
+
departmentRoutes.get("/departments/:name/members", (c) => {
|
|
49004
49521
|
const name = c.req.param("name");
|
|
49005
|
-
const
|
|
49006
|
-
if (!
|
|
49522
|
+
const department = getDepartment(name);
|
|
49523
|
+
if (!department) return c.json({ error: "Department not found" }, 404);
|
|
49007
49524
|
try {
|
|
49008
|
-
|
|
49009
|
-
return c.json(members);
|
|
49525
|
+
return c.json(listDepartmentMembers(name));
|
|
49010
49526
|
} catch (err) {
|
|
49011
49527
|
return c.json({ error: err.message || "Failed to list members" }, 500);
|
|
49012
49528
|
}
|
|
49013
49529
|
});
|
|
49014
|
-
|
|
49015
|
-
const
|
|
49016
|
-
const
|
|
49017
|
-
if (!
|
|
49530
|
+
departmentRoutes.post("/departments/:name/members", async (c) => {
|
|
49531
|
+
const departmentName = c.req.param("name");
|
|
49532
|
+
const department = getDepartment(departmentName);
|
|
49533
|
+
if (!department) return c.json({ error: "Department not found" }, 404);
|
|
49018
49534
|
const body = await c.req.json();
|
|
49019
49535
|
if (!body.id || !body.name) {
|
|
49020
49536
|
return c.json({ error: "id and name are required" }, 400);
|
|
@@ -49022,36 +49538,39 @@ teamRoutes.post("/teams/:name/members", async (c) => {
|
|
|
49022
49538
|
const memberDefinition = {
|
|
49023
49539
|
id: body.id,
|
|
49024
49540
|
name: body.name,
|
|
49025
|
-
|
|
49026
|
-
mailBoxId: `${
|
|
49027
|
-
workspaceId: `${
|
|
49541
|
+
departmentId: department.id,
|
|
49542
|
+
mailBoxId: `${departmentName}::${body.name}`,
|
|
49543
|
+
workspaceId: `${departmentName}::${body.name}`,
|
|
49544
|
+
role: body.role,
|
|
49028
49545
|
focusOn: body.focusOn
|
|
49029
49546
|
};
|
|
49030
49547
|
try {
|
|
49031
|
-
const member =
|
|
49548
|
+
const member = createDepartmentMember(memberDefinition);
|
|
49032
49549
|
return c.json(member, 201);
|
|
49033
49550
|
} catch (err) {
|
|
49034
49551
|
return c.json({ error: err.message || "Failed to create member" }, 500);
|
|
49035
49552
|
}
|
|
49036
49553
|
});
|
|
49037
|
-
|
|
49038
|
-
const
|
|
49039
|
-
const
|
|
49040
|
-
const
|
|
49041
|
-
if (!
|
|
49554
|
+
departmentRoutes.delete("/departments/:name/members/:memberId", async (c) => {
|
|
49555
|
+
const departmentName = c.req.param("name");
|
|
49556
|
+
const memberParam = c.req.param("memberId");
|
|
49557
|
+
const department = getDepartment(departmentName);
|
|
49558
|
+
if (!department) return c.json({ error: "Department not found" }, 404);
|
|
49042
49559
|
try {
|
|
49043
|
-
|
|
49560
|
+
const member = getDepartmentMember(departmentName, memberParam) ?? getDepartmentMemberByName(departmentName, memberParam);
|
|
49561
|
+
if (!member) return c.json({ error: "Member not found" }, 404);
|
|
49562
|
+
deleteDepartmentMemberById(departmentName, member.id);
|
|
49044
49563
|
return c.json({ ok: true });
|
|
49045
49564
|
} catch (err) {
|
|
49046
49565
|
return c.json({ error: err.message || "Failed to delete member" }, 500);
|
|
49047
49566
|
}
|
|
49048
49567
|
});
|
|
49049
|
-
|
|
49568
|
+
departmentRoutes.get("/departments/:name/activity", (c) => {
|
|
49050
49569
|
const name = c.req.param("name");
|
|
49051
|
-
const
|
|
49052
|
-
if (!
|
|
49570
|
+
const department = getDepartment(name);
|
|
49571
|
+
if (!department) return c.json({ error: "Department not found" }, 404);
|
|
49053
49572
|
try {
|
|
49054
|
-
const members =
|
|
49573
|
+
const members = listDepartmentMembers(name);
|
|
49055
49574
|
if (members.length === 0) return c.json({ messages: [] });
|
|
49056
49575
|
const mailboxIds = members.map((m) => m.mailBoxId);
|
|
49057
49576
|
const placeholders = mailboxIds.map(() => "?").join(", ");
|
|
@@ -49079,12 +49598,12 @@ teamRoutes.get("/teams/:name/activity", (c) => {
|
|
|
49079
49598
|
return c.json({ error: err.message || "Failed to get activity" }, 500);
|
|
49080
49599
|
}
|
|
49081
49600
|
});
|
|
49082
|
-
|
|
49601
|
+
departmentRoutes.get("/departments/:name/members/:memberName/context", async (c) => {
|
|
49083
49602
|
const name = c.req.param("name");
|
|
49084
49603
|
const memberName = c.req.param("memberName");
|
|
49085
|
-
const
|
|
49086
|
-
if (!
|
|
49087
|
-
const member =
|
|
49604
|
+
const department = getDepartment(name);
|
|
49605
|
+
if (!department) return c.json({ error: "Department not found" }, 404);
|
|
49606
|
+
const member = getDepartmentMemberByName(name, memberName);
|
|
49088
49607
|
if (!member) return c.json({ error: "Member not found" }, 404);
|
|
49089
49608
|
const mailBoxId = `${name}::${memberName}`;
|
|
49090
49609
|
let messages = [];
|
|
@@ -49137,9 +49656,7 @@ teamRoutes.get("/teams/:name/members/:memberName/context", async (c) => {
|
|
|
49137
49656
|
}
|
|
49138
49657
|
agentLogs = allMessages.map((msg, idx) => {
|
|
49139
49658
|
const blocks = msg.content.map((block) => {
|
|
49140
|
-
if (block.type === "text") {
|
|
49141
|
-
return { type: "text", text: block.text };
|
|
49142
|
-
}
|
|
49659
|
+
if (block.type === "text") return { type: "text", text: block.text };
|
|
49143
49660
|
if (block.type === "tool_use") {
|
|
49144
49661
|
return {
|
|
49145
49662
|
type: "tool_use",
|
|
@@ -49157,11 +49674,7 @@ teamRoutes.get("/teams/:name/members/:memberName/context", async (c) => {
|
|
|
49157
49674
|
}
|
|
49158
49675
|
return { type: "unknown" };
|
|
49159
49676
|
});
|
|
49160
|
-
return {
|
|
49161
|
-
index: idx,
|
|
49162
|
-
role: msg.role,
|
|
49163
|
-
blocks
|
|
49164
|
-
};
|
|
49677
|
+
return { index: idx, role: msg.role, blocks };
|
|
49165
49678
|
});
|
|
49166
49679
|
} catch {
|
|
49167
49680
|
agentLogs = [];
|
|
@@ -49202,7 +49715,7 @@ cronRoutes.post("/cron/jobs", async (c) => {
|
|
|
49202
49715
|
platform: body.delivery.channel,
|
|
49203
49716
|
userId: body.delivery.to,
|
|
49204
49717
|
requestId: (0, import_crypto7.randomUUID)().slice(0, 8),
|
|
49205
|
-
|
|
49718
|
+
departmentAgentId: ""
|
|
49206
49719
|
}
|
|
49207
49720
|
);
|
|
49208
49721
|
return c.json(job, 201);
|
|
@@ -49363,8 +49876,8 @@ mailboxRoutes.get("/mailbox/summary", (c) => {
|
|
|
49363
49876
|
|
|
49364
49877
|
// src/server/routes/memory.ts
|
|
49365
49878
|
var import_redis4 = __toESM(require_dist2());
|
|
49366
|
-
var
|
|
49367
|
-
var
|
|
49879
|
+
var import_node_fs7 = require("node:fs");
|
|
49880
|
+
var import_node_path13 = __toESM(require("node:path"));
|
|
49368
49881
|
var memoryEngineSingleton = null;
|
|
49369
49882
|
var dreamStorageSingleton = null;
|
|
49370
49883
|
var dreamHistoryStorageSingleton = null;
|
|
@@ -49464,29 +49977,49 @@ var addPlausibleUserId = (set, userId) => {
|
|
|
49464
49977
|
if (normalized && isPlausibleUserId(normalized)) set.add(normalized);
|
|
49465
49978
|
};
|
|
49466
49979
|
var readJsonFilesFromDir = (dir) => {
|
|
49467
|
-
if (!(0,
|
|
49980
|
+
if (!(0, import_node_fs7.existsSync)(dir)) return [];
|
|
49468
49981
|
const result = [];
|
|
49469
|
-
for (const file of (0,
|
|
49982
|
+
for (const file of (0, import_node_fs7.readdirSync)(dir)) {
|
|
49470
49983
|
if (!file.endsWith(".json")) continue;
|
|
49471
49984
|
try {
|
|
49472
|
-
result.push(JSON.parse((0,
|
|
49985
|
+
result.push(JSON.parse((0, import_node_fs7.readFileSync)(import_node_path13.default.join(dir, file), "utf-8")));
|
|
49473
49986
|
} catch (err) {
|
|
49474
49987
|
console.warn(`[memoryRoutes] \u8DF3\u8FC7\u65E0\u6CD5\u89E3\u6790\u7684\u672C\u5730\u4E0A\u4E0B\u6587\u6587\u4EF6 ${file}: ${err.message}`);
|
|
49475
49988
|
}
|
|
49476
49989
|
}
|
|
49477
49990
|
return result;
|
|
49478
49991
|
};
|
|
49992
|
+
var extractFileBackedStorageKeysForTest = (dataDir) => {
|
|
49993
|
+
const kvRoot = import_node_path13.default.join(dataDir, "kv");
|
|
49994
|
+
if (!(0, import_node_fs7.existsSync)(kvRoot)) return [];
|
|
49995
|
+
const keys = [];
|
|
49996
|
+
for (const prefixDir of (0, import_node_fs7.readdirSync)(kvRoot)) {
|
|
49997
|
+
const absolutePrefixDir = import_node_path13.default.join(kvRoot, prefixDir);
|
|
49998
|
+
if (!(0, import_node_fs7.existsSync)(absolutePrefixDir)) continue;
|
|
49999
|
+
for (const file of (0, import_node_fs7.readdirSync)(absolutePrefixDir)) {
|
|
50000
|
+
if (!file.endsWith(".json")) continue;
|
|
50001
|
+
try {
|
|
50002
|
+
const logicalKey = Buffer.from(file.replace(/\.json$/, ""), "base64url").toString("utf8");
|
|
50003
|
+
const normalizedPrefix = prefixDir.replace(/[:/\\]+$/g, "") || "agent";
|
|
50004
|
+
keys.push(`${normalizedPrefix}:${logicalKey}`);
|
|
50005
|
+
} catch (err) {
|
|
50006
|
+
console.warn(`[memoryRoutes] \u8DF3\u8FC7\u65E0\u6CD5\u89E3\u7801\u7684\u672C\u5730\u5B58\u50A8 key ${file}: ${err.message}`);
|
|
50007
|
+
}
|
|
50008
|
+
}
|
|
50009
|
+
}
|
|
50010
|
+
return keys;
|
|
50011
|
+
};
|
|
49479
50012
|
var collectLocalConversationUserIds = () => {
|
|
49480
50013
|
return extractLocalConversationUserIdsForTest(getDuclawHomeDir());
|
|
49481
50014
|
};
|
|
49482
50015
|
var extractLocalConversationUserIdsForTest = (homeDir) => {
|
|
49483
50016
|
const userIds = /* @__PURE__ */ new Set();
|
|
49484
|
-
for (const context of readJsonFilesFromDir(
|
|
50017
|
+
for (const context of readJsonFilesFromDir(import_node_path13.default.join(homeDir, "goal-context"))) {
|
|
49485
50018
|
addPlausibleUserId(userIds, context.threadId);
|
|
49486
50019
|
addPlausibleUserId(userIds, context.originUserId);
|
|
49487
50020
|
if (context.goalId) addPlausibleUserId(userIds, `kanban:goal:${context.goalId}`);
|
|
49488
50021
|
}
|
|
49489
|
-
for (const goal of readJsonFilesFromDir(
|
|
50022
|
+
for (const goal of readJsonFilesFromDir(import_node_path13.default.join(homeDir, "tasks"))) {
|
|
49490
50023
|
if (goal.id) addPlausibleUserId(userIds, `kanban:goal:${goal.id}`);
|
|
49491
50024
|
}
|
|
49492
50025
|
return userIds;
|
|
@@ -49526,6 +50059,9 @@ var collectUserIds = async () => {
|
|
|
49526
50059
|
const localConversationUserIds = collectLocalConversationUserIds();
|
|
49527
50060
|
for (const userId of localConversationUserIds) userIds.add(userId);
|
|
49528
50061
|
if (isFileBackedRuntime()) {
|
|
50062
|
+
for (const userId of extractMemoryUserIdsFromKeys(extractFileBackedStorageKeysForTest(getDuclawDataDir()))) {
|
|
50063
|
+
userIds.add(userId);
|
|
50064
|
+
}
|
|
49529
50065
|
return { userIds: Array.from(userIds), localConversationUserIds };
|
|
49530
50066
|
}
|
|
49531
50067
|
const client2 = await getRedisClient();
|
|
@@ -49777,7 +50313,7 @@ var systemRoutes = new Hono2();
|
|
|
49777
50313
|
var startTime = Date.now();
|
|
49778
50314
|
systemRoutes.get("/system/info", (c) => {
|
|
49779
50315
|
return c.json({
|
|
49780
|
-
version: true ? "1.8.
|
|
50316
|
+
version: true ? "1.8.1" : "unknown",
|
|
49781
50317
|
uptime: Math.floor((Date.now() - startTime) / 1e3),
|
|
49782
50318
|
env: process.env.NODE_ENV || "development",
|
|
49783
50319
|
nodeVersion: process.version
|
|
@@ -49793,7 +50329,7 @@ function createServer() {
|
|
|
49793
50329
|
app.route("/api", taskRoutes);
|
|
49794
50330
|
app.route("/api", worktreeRoutes);
|
|
49795
50331
|
app.route("/api", agentRoutes);
|
|
49796
|
-
app.route("/api",
|
|
50332
|
+
app.route("/api", departmentRoutes);
|
|
49797
50333
|
app.route("/api", cronRoutes);
|
|
49798
50334
|
app.route("/api", mailboxRoutes);
|
|
49799
50335
|
app.route("/api", memoryRoutes);
|
|
@@ -49801,7 +50337,7 @@ function createServer() {
|
|
|
49801
50337
|
app.route("/api", systemRoutes);
|
|
49802
50338
|
app.use("/*", serveStatic({ root: webDistRoot }));
|
|
49803
50339
|
app.get("/*", async (c) => {
|
|
49804
|
-
const indexHtml = await (0, import_promises11.readFile)(
|
|
50340
|
+
const indexHtml = await (0, import_promises11.readFile)(import_node_path14.default.join(webDistRoot, "index.html"), "utf8");
|
|
49805
50341
|
const tenantId = c.req.header("x-tenant-id");
|
|
49806
50342
|
const assetBase = tenantId ? `/t/${tenantId}` : "";
|
|
49807
50343
|
const html = indexHtml.replaceAll('"./', `"${assetBase}/`);
|
|
@@ -49815,6 +50351,18 @@ function startServer(port = 3e3) {
|
|
|
49815
50351
|
console.log(`[server] Kanban HTTP \u670D\u52A1\u5668\u5DF2\u542F\u52A8: http://localhost:${port}`);
|
|
49816
50352
|
}
|
|
49817
50353
|
|
|
50354
|
+
// src/channels/gatewayOwner.ts
|
|
50355
|
+
function normalizeChannelGatewayOwner(value) {
|
|
50356
|
+
const normalized = value?.trim().toLowerCase();
|
|
50357
|
+
if (!normalized) return "core";
|
|
50358
|
+
if (normalized === "core" || normalized === "saas") return normalized;
|
|
50359
|
+
throw new Error(`invalid_channel_gateway_owner:${value}`);
|
|
50360
|
+
}
|
|
50361
|
+
function shouldStartCoreChannelGateways(env = process.env) {
|
|
50362
|
+
if (env.DUCLAW_DISABLE_CHANNEL_GATEWAY === "true") return false;
|
|
50363
|
+
return normalizeChannelGatewayOwner(env.CHANNEL_GATEWAY_OWNER) === "core";
|
|
50364
|
+
}
|
|
50365
|
+
|
|
49818
50366
|
// src/main.ts
|
|
49819
50367
|
var cliResult = handleCliCommand(process.argv.slice(2));
|
|
49820
50368
|
if (cliResult !== void 0) {
|
|
@@ -49849,18 +50397,23 @@ async function main() {
|
|
|
49849
50397
|
const { registry: registry2 } = createDefaultChannels();
|
|
49850
50398
|
const channels = getAllChannels(registry2);
|
|
49851
50399
|
const abortController = new AbortController();
|
|
49852
|
-
|
|
49853
|
-
|
|
49854
|
-
const
|
|
49855
|
-
cfg
|
|
49856
|
-
|
|
49857
|
-
|
|
49858
|
-
|
|
49859
|
-
|
|
49860
|
-
|
|
49861
|
-
|
|
49862
|
-
|
|
49863
|
-
|
|
50400
|
+
const channelGatewaysStarted = shouldStartCoreChannelGateways();
|
|
50401
|
+
if (channelGatewaysStarted) {
|
|
50402
|
+
for (const channel of channels) {
|
|
50403
|
+
const account = channel.config.resolveAccount(cfg);
|
|
50404
|
+
const ctx = {
|
|
50405
|
+
cfg,
|
|
50406
|
+
accountId: channel.id,
|
|
50407
|
+
account,
|
|
50408
|
+
abortSignal: abortController.signal
|
|
50409
|
+
};
|
|
50410
|
+
console.log(`[main] \u542F\u52A8 Channel Gateway: ${channel.meta.label}`);
|
|
50411
|
+
await channel.gateway.startAccount(ctx);
|
|
50412
|
+
}
|
|
50413
|
+
console.log(`[main] \u6240\u6709 Channel \u5DF2\u542F\u52A8\uFF0C\u7B49\u5F85\u6D88\u606F...`);
|
|
50414
|
+
} else {
|
|
50415
|
+
console.log(`[main] Core Channel Gateway \u5DF2\u8DF3\u8FC7\uFF0C\u5F53\u524D\u5916\u90E8\u6D88\u606F\u5165\u53E3\u7531 SaaS \u5C42\u63A5\u7BA1`);
|
|
50416
|
+
}
|
|
49864
50417
|
startScheduler();
|
|
49865
50418
|
console.log(`[main] \u5B9A\u65F6\u4EFB\u52A1\u8C03\u5EA6\u5668\u5DF2\u542F\u52A8`);
|
|
49866
50419
|
startMailboxPoller();
|
|
@@ -49871,14 +50424,16 @@ async function main() {
|
|
|
49871
50424
|
console.log(`
|
|
49872
50425
|
[main] \u6536\u5230\u9000\u51FA\u4FE1\u53F7\uFF0C\u6B63\u5728\u505C\u6B62\u6240\u6709 Channel...`);
|
|
49873
50426
|
abortController.abort();
|
|
49874
|
-
|
|
49875
|
-
const
|
|
49876
|
-
|
|
49877
|
-
|
|
49878
|
-
|
|
49879
|
-
|
|
49880
|
-
|
|
49881
|
-
|
|
50427
|
+
if (channelGatewaysStarted) {
|
|
50428
|
+
for (const channel of channels) {
|
|
50429
|
+
const ctx = {
|
|
50430
|
+
cfg,
|
|
50431
|
+
accountId: channel.id,
|
|
50432
|
+
account: channel.config.resolveAccount(cfg),
|
|
50433
|
+
abortSignal: abortController.signal
|
|
50434
|
+
};
|
|
50435
|
+
await channel.gateway.stopAccount(ctx);
|
|
50436
|
+
}
|
|
49882
50437
|
}
|
|
49883
50438
|
console.log(`[main] \u6240\u6709 Channel \u5DF2\u505C\u6B62\uFF0C\u9000\u51FA`);
|
|
49884
50439
|
process.exit(0);
|