duclaw-cli 1.8.0 → 1.8.2

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 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 path16 = require("path");
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 = path16.resolve(process.cwd(), ".env.vault");
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] === "~" ? path16.join(os.homedir(), envPath.slice(1)) : envPath;
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 = path16.resolve(process.cwd(), ".env");
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 path17 of optionPaths) {
317
+ for (const path18 of optionPaths) {
318
318
  try {
319
- const parsed = DotenvModule.parse(fs3.readFileSync(path17, { encoding }));
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 ${path17} ${e.message}`);
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 = path16.relative(process.cwd(), filePath);
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, path16, moduleArguments) {
8241
- parser.push("MODULE", "LOAD", path16);
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, path16, json, ...jsons) {
23542
+ parseCommand(parser, key, path17, json, ...jsons) {
23543
23543
  parser.push("JSON.ARRAPPEND");
23544
23544
  parser.pushKey(key);
23545
- parser.push(path16, (0, generic_transformers_1.transformRedisJsonArgument)(json));
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, path16, json, options) {
23575
+ parseCommand(parser, key, path17, json, options) {
23576
23576
  parser.push("JSON.ARRINDEX");
23577
23577
  parser.pushKey(key);
23578
- parser.push(path16, (0, generic_transformers_1.transformRedisJsonArgument)(json));
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, path16, index, json, ...jsons) {
23610
+ parseCommand(parser, key, path17, index, json, ...jsons) {
23611
23611
  parser.push("JSON.ARRINSERT");
23612
23612
  parser.pushKey(key);
23613
- parser.push(path16, index.toString(), (0, generic_transformers_1.transformRedisJsonArgument)(json));
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, path16, start, stop) {
23703
+ parseCommand(parser, key, path17, start, stop) {
23704
23704
  parser.push("JSON.ARRTRIM");
23705
23705
  parser.pushKey(key);
23706
- parser.push(path16, start.toString(), stop.toString());
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, path16, value) {
23871
+ parseCommand(parser, key, path17, value) {
23872
23872
  parser.push("JSON.MERGE");
23873
23873
  parser.pushKey(key);
23874
- parser.push(path16, (0, generic_transformers_1.transformRedisJsonArgument)(value));
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, path16) {
23897
+ parseCommand(parser, keys, path17) {
23898
23898
  parser.push("JSON.MGET");
23899
23899
  parser.pushKeys(keys);
23900
- parser.push(path16);
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, path16, by) {
23955
+ parseCommand(parser, key, path17, by) {
23956
23956
  parser.push("JSON.NUMINCRBY");
23957
23957
  parser.pushKey(key);
23958
- parser.push(path16, by.toString());
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, path16, by) {
23990
+ parseCommand(parser, key, path17, by) {
23991
23991
  parser.push("JSON.NUMMULTBY");
23992
23992
  parser.pushKey(key);
23993
- parser.push(path16, by.toString());
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, path16, json, options) {
24077
+ parseCommand(parser, key, path17, json, options) {
24078
24078
  parser.push("JSON.SET");
24079
24079
  parser.pushKey(key);
24080
- parser.push(path16, (0, generic_transformers_1.transformRedisJsonArgument)(json));
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, path16) {
24168
+ parseCommand(parser, key, path17) {
24169
24169
  parser.push("JSON.TOGGLE");
24170
24170
  parser.pushKey(key);
24171
- parser.push(path16);
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.0" : "unknown"}`);
30245
+ console.log(`duclaw-cli v${true ? "1.8.2" : "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 = (path16) => statMethod(path16, { bigint: true });
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: path16, depth } = par;
30999
- const slice = fil.splice(0, batch).map((dirent) => this._formatEntry(dirent, path16));
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(path16, depth) {
31039
+ async _exploreDir(path17, depth) {
31040
31040
  let files;
31041
31041
  try {
31042
- files = await (0, import_promises2.readdir)(path16, this._rdOptions);
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: path16 };
31046
+ return { files, depth, path: path17 };
31047
31047
  }
31048
- async _formatEntry(dirent, path16) {
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)(path16, basename4));
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(path16, options, listener, errHandler, emitRaw) {
31452
+ function createFsWatchInstance(path17, options, listener, errHandler, emitRaw) {
31453
31453
  const handleEvent = (rawEvent, evPath) => {
31454
- listener(path16);
31455
- emitRaw(rawEvent, evPath, { watchedPath: path16 });
31456
- if (evPath && path16 !== evPath) {
31457
- fsWatchBroadcast(sp.resolve(path16, evPath), KEY_LISTENERS, sp.join(path16, evPath));
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)(path16, {
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 = (path16, fullPath, options, handlers) => {
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(path16, options, listener, errHandler, rawEmitter);
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
- path16,
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)(path16, "r");
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 = (path16, fullPath, options, handlers) => {
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(path16, curr));
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(path16, listener) {
31591
+ _watchWithNodeFs(path17, listener) {
31592
31592
  const opts = this.fsw.options;
31593
- const directory = sp.dirname(path16);
31594
- const basename4 = sp.basename(path16);
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(path16);
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(path16, absolutePath, options, {
31607
+ closer = setFsWatchFileListener(path17, absolutePath, options, {
31608
31608
  listener,
31609
31609
  rawEmitter: this.fsw._emitRaw
31610
31610
  });
31611
31611
  } else {
31612
- closer = setFsWatchListener(path16, absolutePath, options, {
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 (path16, newStats) => {
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(path16);
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(path16, closer2);
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, path16, item) {
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)(path16);
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, path16, entry.stats);
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, path16, entry.stats);
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 path16 = sp.join(directory, item);
31739
+ let path17 = sp.join(directory, item);
31740
31740
  current.add(item);
31741
- if (entry.stats.isSymbolicLink() && await this._handleSymlink(entry, directory, path16, item)) {
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
- path16 = sp.join(dir, sp.relative(dir, path16));
31751
- this._addToNodeFs(path16, initialAdd, wh, depth + 1);
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(path16, initialAdd, priorWh, depth, target) {
31820
+ async _addToNodeFs(path17, initialAdd, priorWh, depth, target) {
31821
31821
  const ready = this.fsw._emitReady;
31822
- if (this.fsw._isIgnored(path16) || this.fsw.closed) {
31822
+ if (this.fsw._isIgnored(path17) || this.fsw.closed) {
31823
31823
  ready();
31824
31824
  return false;
31825
31825
  }
31826
- const wh = this.fsw._getWatchHelpers(path16);
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(path16);
31843
- const targetPath = follow ? await (0, import_promises3.realpath)(path16) : path16;
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)(path16) : path16;
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, path16, wh, targetPath);
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(path16), targetPath);
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(path16, closer);
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 path16;
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(path16) {
31919
- if (typeof path16 !== "string")
31918
+ function normalizePath(path17) {
31919
+ if (typeof path17 !== "string")
31920
31920
  throw new Error("string expected");
31921
- path16 = sp2.normalize(path16);
31922
- path16 = path16.replace(/\\/g, "/");
31921
+ path17 = sp2.normalize(path17);
31922
+ path17 = path17.replace(/\\/g, "/");
31923
31923
  let prepend = false;
31924
- if (path16.startsWith("//"))
31924
+ if (path17.startsWith("//"))
31925
31925
  prepend = true;
31926
- path16 = path16.replace(DOUBLE_SLASH_RE, "/");
31926
+ path17 = path17.replace(DOUBLE_SLASH_RE, "/");
31927
31927
  if (prepend)
31928
- path16 = "/" + path16;
31929
- return path16;
31928
+ path17 = "/" + path17;
31929
+ return path17;
31930
31930
  }
31931
31931
  function matchPatterns(patterns, testString, stats) {
31932
- const path16 = normalizePath(testString);
31932
+ const path17 = normalizePath(testString);
31933
31933
  for (let index = 0; index < patterns.length; index++) {
31934
31934
  const pattern = patterns[index];
31935
- if (pattern(path16, stats)) {
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 = (path16) => toUnix(sp2.normalize(toUnix(path16)));
31974
- var normalizeIgnored = (cwd = "") => (path16) => {
31975
- if (typeof path16 === "string") {
31976
- return normalizePathToUnix(sp2.isAbsolute(path16) ? path16 : sp2.join(cwd, path16));
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 path16;
31978
+ return path17;
31979
31979
  }
31980
31980
  };
31981
- var getAbsolutePath = (path16, cwd) => {
31982
- if (sp2.isAbsolute(path16)) {
31983
- return path16;
31981
+ var getAbsolutePath = (path17, cwd) => {
31982
+ if (sp2.isAbsolute(path17)) {
31983
+ return path17;
31984
31984
  }
31985
- return sp2.join(cwd, path16);
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(path16, follow, fsw) {
32050
+ constructor(path17, follow, fsw) {
32051
32051
  this.fsw = fsw;
32052
- const watchPath = path16;
32053
- this.path = path16 = path16.replace(REPLACER_RE, "");
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((path16) => {
32194
- const absPath = getAbsolutePath(path16, cwd);
32193
+ paths = paths.map((path17) => {
32194
+ const absPath = getAbsolutePath(path17, cwd);
32195
32195
  return absPath;
32196
32196
  });
32197
32197
  }
32198
- paths.forEach((path16) => {
32199
- this._removeIgnoredPath(path16);
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 (path16) => {
32206
- const res = await this._nodeFsHandler._addToNodeFs(path16, !_internal, void 0, 0, _origAdd);
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((path16) => {
32229
- if (!sp2.isAbsolute(path16) && !this._closers.has(path16)) {
32228
+ paths.forEach((path17) => {
32229
+ if (!sp2.isAbsolute(path17) && !this._closers.has(path17)) {
32230
32230
  if (cwd)
32231
- path16 = sp2.join(cwd, path16);
32232
- path16 = sp2.resolve(path16);
32231
+ path17 = sp2.join(cwd, path17);
32232
+ path17 = sp2.resolve(path17);
32233
32233
  }
32234
- this._closePath(path16);
32235
- this._addIgnoredPath(path16);
32236
- if (this._watched.has(path16)) {
32234
+ this._closePath(path17);
32235
+ this._addIgnoredPath(path17);
32236
+ if (this._watched.has(path17)) {
32237
32237
  this._addIgnoredPath({
32238
- path: path16,
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, path16, stats) {
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
- path16 = sp2.normalize(path16);
32307
+ path17 = sp2.normalize(path17);
32308
32308
  if (opts.cwd)
32309
- path16 = sp2.relative(opts.cwd, path16);
32310
- const args = [path16];
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(path16))) {
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(path16, [event, ...args]);
32321
+ this._pendingUnlinks.set(path17, [event, ...args]);
32322
32322
  setTimeout(() => {
32323
- this._pendingUnlinks.forEach((entry, path17) => {
32323
+ this._pendingUnlinks.forEach((entry, path18) => {
32324
32324
  this.emit(...entry);
32325
32325
  this.emit(EVENTS.ALL, ...entry);
32326
- this._pendingUnlinks.delete(path17);
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(path16)) {
32331
+ if (event === EVENTS.ADD && this._pendingUnlinks.has(path17)) {
32332
32332
  event = EVENTS.CHANGE;
32333
- this._pendingUnlinks.delete(path16);
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(path16, awf.stabilityThreshold, event, awfEmit);
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, path16, 50);
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, path16) : path16;
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, path16, timeout) {
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(path16);
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(path16);
32405
+ const item = action.get(path17);
32406
32406
  const count = item ? item.count : 0;
32407
- action.delete(path16);
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(path16, thr);
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(path16, threshold, event, awfEmit) {
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 = path16;
32436
- if (this.options.cwd && !sp2.isAbsolute(path16)) {
32437
- fullPath = sp2.join(this.options.cwd, path16);
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(path16)) {
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(path16).lastChange = now2;
32450
+ writes.get(path17).lastChange = now2;
32451
32451
  }
32452
- const pw = writes.get(path16);
32452
+ const pw = writes.get(path17);
32453
32453
  const df = now2 - pw.lastChange;
32454
32454
  if (df >= threshold) {
32455
- writes.delete(path16);
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(path16)) {
32463
- writes.set(path16, {
32462
+ if (!writes.has(path17)) {
32463
+ writes.set(path17, {
32464
32464
  lastChange: now,
32465
32465
  cancelWait: () => {
32466
- writes.delete(path16);
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(path16, stats) {
32478
- if (this.options.atomic && DOT_RE.test(path16))
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(path16, stats);
32488
+ return this._userIgnored(path17, stats);
32489
32489
  }
32490
- _isntIgnored(path16, stat9) {
32491
- return !this._isIgnored(path16, stat9);
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(path16) {
32498
- return new WatchHelper(path16, this.options.followSymlinks, this);
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 path16 = sp2.join(directory, item);
32531
- const fullPath = sp2.resolve(path16);
32532
- isDirectory = isDirectory != null ? isDirectory : this._watched.has(path16) || this._watched.has(fullPath);
32533
- if (!this._throttle("remove", path16, 100))
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(path16);
32538
+ const wp = this._getWatchedDir(path17);
32539
32539
  const nestedDirectoryChildren = wp.getChildren();
32540
- nestedDirectoryChildren.forEach((nested) => this._remove(path16, nested));
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 = path16;
32547
+ let relPath = path17;
32548
32548
  if (this.options.cwd)
32549
- relPath = sp2.relative(this.options.cwd, path16);
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(path16);
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(path16))
32559
- this._emit(eventName, path16);
32560
- this._closePath(path16);
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(path16) {
32566
- this._closeFile(path16);
32567
- const dir = sp2.dirname(path16);
32568
- this._getWatchedDir(dir).remove(sp2.basename(path16));
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(path16) {
32574
- const closers = this._closers.get(path16);
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(path16);
32578
+ this._closers.delete(path17);
32579
32579
  }
32580
- _addPathCloser(path16, closer) {
32580
+ _addPathCloser(path17, closer) {
32581
32581
  if (!closer)
32582
32582
  return;
32583
- let list = this._closers.get(path16);
32583
+ let list = this._closers.get(path17);
32584
32584
  if (!list) {
32585
32585
  list = [];
32586
- this._closers.set(path16, list);
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 import_node_fs5 = require("node:fs");
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 path16(statics, ...params) {
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 path17 = statics.reduce((previousValue, currentValue, index) => {
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 = path17.split(/[?#]/, 1)[0];
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
- ${path17}
34092
+ ${path18}
34093
34093
  ${underline}`);
34094
34094
  }
34095
- return path17;
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(path16, query, defaultBaseURL) {
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(path16) ? new URL(path16) : new URL(baseURL + (baseURL.endsWith("/") && path16.startsWith("/") ? path16.slice(1) : path16));
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(path16, opts) {
37240
- return this.methodRequest("get", path16, opts);
37239
+ get(path17, opts) {
37240
+ return this.methodRequest("get", path17, opts);
37241
37241
  }
37242
- post(path16, opts) {
37243
- return this.methodRequest("post", path16, opts);
37242
+ post(path17, opts) {
37243
+ return this.methodRequest("post", path17, opts);
37244
37244
  }
37245
- patch(path16, opts) {
37246
- return this.methodRequest("patch", path16, opts);
37245
+ patch(path17, opts) {
37246
+ return this.methodRequest("patch", path17, opts);
37247
37247
  }
37248
- put(path16, opts) {
37249
- return this.methodRequest("put", path16, opts);
37248
+ put(path17, opts) {
37249
+ return this.methodRequest("put", path17, opts);
37250
37250
  }
37251
- delete(path16, opts) {
37252
- return this.methodRequest("delete", path16, opts);
37251
+ delete(path17, opts) {
37252
+ return this.methodRequest("delete", path17, opts);
37253
37253
  }
37254
- methodRequest(method, path16, opts) {
37254
+ methodRequest(method, path17, opts) {
37255
37255
  return this.request(Promise.resolve(opts).then((opts2) => {
37256
- return { method, path: path16, ...opts2 };
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(path16, Page2, opts) {
37361
- return this.requestAPIList(Page2, opts && "then" in opts ? opts.then((opts2) => ({ method: "get", path: path16, ...opts2 })) : { method: "get", path: path16, ...opts });
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: path16, query, defaultBaseURL } = options;
37450
- const url = this.buildURL(path16, query, defaultBaseURL);
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 createRedisStorage = (options = {}) => {
37844
- let redisClient = (0, import_redis3.createClient)({
37845
- url: options.url || process.env.REDIS_URL || `redis://localhost:6379`,
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
- redisClient.on("error", (err) => {
37865
+ client2.on("error", (err) => {
37862
37866
  console.error(`[RedisStorage] Redis\u9519\u8BEF:`, err);
37863
37867
  });
37864
- redisClient.on("ready", () => {
37868
+ client2.on("ready", () => {
37865
37869
  console.log(`[RedisStorage] Redis\u8FDE\u63A5\u5C31\u7EEA`);
37866
37870
  });
37867
- redisClient.on("reconnecting", () => {
37871
+ client2.on("reconnecting", () => {
37868
37872
  console.log(`[RedisStorage] Redis\u6B63\u5728\u91CD\u8FDE...`);
37869
37873
  });
37870
- redisClient.connect().catch((err) => {
37871
- console.error(`[RedisStorage] Redis\u8FDE\u63A5\u5931\u8D25:`, err);
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
  };
@@ -37911,20 +37937,29 @@ var getMessages = async (storage, userId, limit = 300, date, cronTitle) => {
37911
37937
  const key = buildMessageKey(userId, date, cronTitle);
37912
37938
  const data = await storage.get(key);
37913
37939
  if (!data) return [];
37914
- let start = Math.max(0, data.length - limit);
37915
- if (data[start].role !== "user") {
37940
+ const repair = sanitizeMessagesWithReport(data, {
37941
+ mergeAdjacentNonProtocolMessages: false
37942
+ });
37943
+ const repairedData = repair.messages;
37944
+ if (repair.report.changed) {
37945
+ await storage.set(key, repairedData);
37946
+ logSanitizeRepair(repair.report);
37947
+ }
37948
+ if (repairedData.length === 0) return [];
37949
+ let start = Math.max(0, repairedData.length - limit);
37950
+ if (repairedData[start].role !== "user") {
37916
37951
  let earlier = start - 1;
37917
- while (earlier >= 0 && data[earlier].role !== "user") earlier--;
37952
+ while (earlier >= 0 && repairedData[earlier].role !== "user") earlier--;
37918
37953
  if (earlier >= 0) {
37919
37954
  start = earlier;
37920
37955
  } else {
37921
37956
  let later = start + 1;
37922
- while (later < data.length && data[later].role !== "user") later++;
37923
- if (later >= data.length) return [];
37957
+ while (later < repairedData.length && repairedData[later].role !== "user") later++;
37958
+ if (later >= repairedData.length) return [];
37924
37959
  start = later;
37925
37960
  }
37926
37961
  }
37927
- return sanitizeMessages(data.slice(start));
37962
+ return sanitizeMessages(repairedData.slice(start));
37928
37963
  };
37929
37964
  var isInjectedMemoryContextMessage = (msg) => {
37930
37965
  if (msg.role !== "user" || msg.content.length === 0) return false;
@@ -37935,44 +37970,113 @@ var isInjectedMemoryContextMessage = (msg) => {
37935
37970
  var hasProtocolBlock = (msg) => {
37936
37971
  return msg.content.some((block) => block.type === "tool_use" || block.type === "tool_result");
37937
37972
  };
37938
- var stripToolResultBlocks = (msg) => {
37973
+ var createSanitizeReport = () => ({
37974
+ changed: false,
37975
+ removedToolUses: 0,
37976
+ removedToolResults: 0,
37977
+ removedEmptyMessages: 0,
37978
+ removedMemoryContextMessages: 0,
37979
+ droppedMessages: 0,
37980
+ shiftedLeadingMessages: 0,
37981
+ mergedAdjacentMessages: 0
37982
+ });
37983
+ var markSanitizeChanged = (report, index) => {
37984
+ report.changed = true;
37985
+ if (report.firstChangedIndex === void 0 || index < report.firstChangedIndex) {
37986
+ report.firstChangedIndex = index;
37987
+ }
37988
+ };
37989
+ var mergeSanitizeReport = (target, source) => {
37990
+ if (!source.changed) return;
37991
+ target.changed = true;
37992
+ if (source.firstChangedIndex !== void 0 && (target.firstChangedIndex === void 0 || source.firstChangedIndex < target.firstChangedIndex)) {
37993
+ target.firstChangedIndex = source.firstChangedIndex;
37994
+ }
37995
+ target.removedToolUses += source.removedToolUses;
37996
+ target.removedToolResults += source.removedToolResults;
37997
+ target.removedEmptyMessages += source.removedEmptyMessages;
37998
+ target.removedMemoryContextMessages += source.removedMemoryContextMessages;
37999
+ target.droppedMessages += source.droppedMessages;
38000
+ target.shiftedLeadingMessages += source.shiftedLeadingMessages;
38001
+ target.mergedAdjacentMessages += source.mergedAdjacentMessages;
38002
+ };
38003
+ var stripToolResultBlocks = (msg, report, index) => {
38004
+ const removed = msg.content.filter((block) => block.type === "tool_result").length;
37939
38005
  const content = msg.content.filter((block) => block.type !== "tool_result");
38006
+ if (report && removed > 0 && index !== void 0) {
38007
+ report.removedToolResults += removed;
38008
+ markSanitizeChanged(report, index);
38009
+ }
37940
38010
  if (content.length === 0) return null;
37941
38011
  if (content.every((b) => b.type === "text" && !b.text?.trim())) return null;
37942
38012
  return { ...msg, content };
37943
38013
  };
37944
- var stripToolUseBlocks = (msg) => {
38014
+ var stripToolUseBlocks = (msg, report, index) => {
38015
+ const removed = msg.content.filter((block) => block.type === "tool_use").length;
37945
38016
  const content = msg.content.filter((block) => block.type !== "tool_use");
38017
+ if (report && removed > 0 && index !== void 0) {
38018
+ report.removedToolUses += removed;
38019
+ markSanitizeChanged(report, index);
38020
+ }
37946
38021
  if (content.length === 0) return null;
37947
38022
  if (content.every((b) => b.type === "text" && !b.text?.trim())) return null;
37948
38023
  return { ...msg, content };
37949
38024
  };
37950
- var sanitizeMessages = (messages) => {
37951
- if (messages.length === 0) return messages;
38025
+ var recordDroppedMessage = (report, index) => {
38026
+ report.droppedMessages++;
38027
+ markSanitizeChanged(report, index);
38028
+ };
38029
+ var logSanitizeRepair = (report) => {
38030
+ console.warn(
38031
+ `[sanitize] repaired message history removedToolUses=${report.removedToolUses} removedToolResults=${report.removedToolResults} droppedMessages=${report.droppedMessages} emptyMessages=${report.removedEmptyMessages} memoryContextMessages=${report.removedMemoryContextMessages} shiftedLeadingMessages=${report.shiftedLeadingMessages} firstIndex=${report.firstChangedIndex ?? -1}`
38032
+ );
38033
+ };
38034
+ var sanitizeMessagesWithReport = (messages, options = {}) => {
38035
+ const report = createSanitizeReport();
38036
+ const mergeAdjacentNonProtocolMessages2 = options.mergeAdjacentNonProtocolMessages ?? true;
38037
+ if (messages.length === 0) {
38038
+ return { messages, report };
38039
+ }
37952
38040
  const result = [];
37953
38041
  for (let i = 0; i < messages.length; i++) {
37954
38042
  const msg = messages[i];
37955
- if (isInjectedMemoryContextMessage(msg)) continue;
37956
- if (!msg.content || msg.content.length === 0) continue;
37957
- if (msg.content.every((b) => b.type === "text" && !b.text?.trim())) continue;
38043
+ if (isInjectedMemoryContextMessage(msg)) {
38044
+ report.removedMemoryContextMessages++;
38045
+ recordDroppedMessage(report, i);
38046
+ continue;
38047
+ }
38048
+ if (!msg.content || msg.content.length === 0) {
38049
+ report.removedEmptyMessages++;
38050
+ recordDroppedMessage(report, i);
38051
+ continue;
38052
+ }
38053
+ if (msg.content.every((b) => b.type === "text" && !b.text?.trim())) {
38054
+ report.removedEmptyMessages++;
38055
+ recordDroppedMessage(report, i);
38056
+ continue;
38057
+ }
37958
38058
  let nextMsg = msg;
37959
38059
  if (msg.role === "assistant") {
37960
38060
  const toolUses = msg.content.filter((b) => b.type === "tool_use");
37961
38061
  if (toolUses.length > 0) {
37962
38062
  const next = messages[i + 1];
37963
38063
  if (!next || next.role !== "user") {
37964
- console.warn(`[sanitize] \u53D1\u73B0 assistant tool_use \u65E0\u5BF9\u5E94 tool_result\uFF0C\u5DF2\u79FB\u9664\u4E0D\u5408\u6CD5\u5DE5\u5177\u8C03\u7528\uFF08index=${i}\uFF09`);
37965
- nextMsg = stripToolUseBlocks(msg);
37966
- if (!nextMsg) continue;
38064
+ nextMsg = stripToolUseBlocks(msg, report, i);
38065
+ if (!nextMsg) {
38066
+ recordDroppedMessage(report, i);
38067
+ continue;
38068
+ }
37967
38069
  } else {
37968
38070
  const resultIds = new Set(
37969
38071
  next.content.filter((b) => b.type === "tool_result").map((b) => b.tool_use_id)
37970
38072
  );
37971
38073
  const allMatched = toolUses.every((tu) => resultIds.has(tu.id));
37972
38074
  if (!allMatched) {
37973
- console.warn(`[sanitize] tool_use/tool_result id \u4E0D\u5339\u914D\uFF0C\u5DF2\u79FB\u9664\u4E0D\u5408\u6CD5\u5DE5\u5177\u8C03\u7528\uFF08index=${i}\uFF09`);
37974
- nextMsg = stripToolUseBlocks(msg);
37975
- if (!nextMsg) continue;
38075
+ nextMsg = stripToolUseBlocks(msg, report, i);
38076
+ if (!nextMsg) {
38077
+ recordDroppedMessage(report, i);
38078
+ continue;
38079
+ }
37976
38080
  }
37977
38081
  }
37978
38082
  }
@@ -37986,23 +38090,39 @@ var sanitizeMessages = (messages) => {
37986
38090
  );
37987
38091
  const allResultsMatched = toolResults.every((tr) => prevToolUseIds.has(tr.tool_use_id));
37988
38092
  if (!prev2 || prev2.role !== "assistant" || prevToolUseIds.size === 0 || !allResultsMatched) {
37989
- console.warn(`[sanitize] \u53D1\u73B0\u5B64\u513F tool_result\uFF0C\u5DF2\u79FB\u9664\u4E0D\u5408\u6CD5\u5DE5\u5177\u7ED3\u679C`);
37990
- nextMsg = stripToolResultBlocks(nextMsg);
37991
- if (!nextMsg) continue;
38093
+ nextMsg = stripToolResultBlocks(nextMsg, report, i);
38094
+ if (!nextMsg) {
38095
+ recordDroppedMessage(report, i);
38096
+ continue;
38097
+ }
37992
38098
  }
37993
38099
  }
37994
38100
  }
37995
38101
  const prev = result[result.length - 1];
37996
- if (prev && prev.role === nextMsg.role && !hasProtocolBlock(prev) && !hasProtocolBlock(nextMsg)) {
38102
+ if (mergeAdjacentNonProtocolMessages2 && prev && prev.role === nextMsg.role && !hasProtocolBlock(prev) && !hasProtocolBlock(nextMsg)) {
37997
38103
  prev.content = [...prev.content, ...nextMsg.content];
38104
+ report.mergedAdjacentMessages++;
38105
+ markSanitizeChanged(report, i);
37998
38106
  } else {
37999
38107
  result.push({ ...nextMsg, content: [...nextMsg.content] });
38000
38108
  }
38001
38109
  }
38002
38110
  while (result.length > 0 && result[0].role !== "user") {
38003
38111
  result.shift();
38112
+ report.shiftedLeadingMessages++;
38113
+ markSanitizeChanged(report, 0);
38004
38114
  }
38005
- return result;
38115
+ if (report.shiftedLeadingMessages > 0) {
38116
+ const revalidated = sanitizeMessagesWithReport(result, options);
38117
+ if (revalidated.report.changed) {
38118
+ mergeSanitizeReport(report, revalidated.report);
38119
+ return { messages: revalidated.messages, report };
38120
+ }
38121
+ }
38122
+ return { messages: result, report };
38123
+ };
38124
+ var sanitizeMessages = (messages) => {
38125
+ return sanitizeMessagesWithReport(messages).messages;
38006
38126
  };
38007
38127
  var addMessage = async (storage, userId, message, date, cronTitle) => {
38008
38128
  const key = buildMessageKey(userId, date, cronTitle);
@@ -38223,7 +38343,7 @@ var getGoalConversationContext = (goalId) => {
38223
38343
  const defaultThreadId = getGoalThreadId(goalId);
38224
38344
  return {
38225
38345
  ...context,
38226
- // 对于由 manager 在外部会话里创建的 goal,需求对话默认继承原始 manager 线程,
38346
+ // 对于由 CEO 在外部会话里创建的 goal,需求对话默认继承原始 CEO 线程,
38227
38347
  // 而不是重新开一个 kanban:goal:* 独立线程。
38228
38348
  threadId: context.originUserId && context.threadId === defaultThreadId ? context.originUserId : context.threadId,
38229
38349
  syncReplyToOrigin: context.originPlatform === "feishu" ? true : context.syncReplyToOrigin
@@ -39357,16 +39477,16 @@ var Diff = class {
39357
39477
  }
39358
39478
  }
39359
39479
  }
39360
- addToPath(path16, added, removed, oldPosInc, options) {
39361
- const last = path16.lastComponent;
39480
+ addToPath(path17, added, removed, oldPosInc, options) {
39481
+ const last = path17.lastComponent;
39362
39482
  if (last && !options.oneChangePerToken && last.added === added && last.removed === removed) {
39363
39483
  return {
39364
- oldPos: path16.oldPos + oldPosInc,
39484
+ oldPos: path17.oldPos + oldPosInc,
39365
39485
  lastComponent: { count: last.count + 1, added, removed, previousComponent: last.previousComponent }
39366
39486
  };
39367
39487
  } else {
39368
39488
  return {
39369
- oldPos: path16.oldPos + oldPosInc,
39489
+ oldPos: path17.oldPos + oldPosInc,
39370
39490
  lastComponent: { count: 1, added, removed, previousComponent: last }
39371
39491
  };
39372
39492
  }
@@ -40540,6 +40660,128 @@ var isTextBlock = (block) => block.type === `text`;
40540
40660
  var isToolUseBlock = (block) => block.type === "tool_use";
40541
40661
  var extractText = (blocks) => blocks.filter(isTextBlock).map((b) => b.text).join("\n");
40542
40662
 
40663
+ // src/tools/tools/ImageUnderstandMetering.ts
40664
+ var import_node_crypto = require("node:crypto");
40665
+ var ImageUnderstandMeteringError = class extends Error {
40666
+ constructor(message, statusCode, meteringStatus) {
40667
+ super(message);
40668
+ this.statusCode = statusCode;
40669
+ this.meteringStatus = meteringStatus;
40670
+ this.name = "ImageUnderstandMeteringError";
40671
+ }
40672
+ statusCode;
40673
+ meteringStatus;
40674
+ };
40675
+ async function reportImageUnderstandUsage(input) {
40676
+ const baseUrl = input.baseUrl?.trim().replace(/\/+$/, "");
40677
+ const token = input.token?.trim();
40678
+ const tenantId = input.tenantId?.trim();
40679
+ if (!baseUrl || !token || !tenantId) {
40680
+ return { status: "disabled" };
40681
+ }
40682
+ const payload = buildImageUnderstandMeteringPayload({
40683
+ ...input,
40684
+ tenantId
40685
+ });
40686
+ const response = await fetch(`${baseUrl}/internal/metering/image-understand`, {
40687
+ method: "POST",
40688
+ headers: {
40689
+ "content-type": "application/json",
40690
+ authorization: `Bearer ${token}`
40691
+ },
40692
+ body: JSON.stringify(payload)
40693
+ });
40694
+ const body = await parseResponseJson(response);
40695
+ const result = body && typeof body === "object" && "result" in body ? body.result : void 0;
40696
+ if (result?.status === "credit_exhausted") {
40697
+ throw new ImageUnderstandMeteringError(
40698
+ "[ImageUnderstand] credit_exhausted",
40699
+ response.status,
40700
+ result.status
40701
+ );
40702
+ }
40703
+ if (!response.ok || result?.status === "failed") {
40704
+ throw new ImageUnderstandMeteringError(
40705
+ `[ImageUnderstand] \u56FE\u7247\u7406\u89E3\u6263\u8D39\u4E0A\u62A5\u5931\u8D25: ${result?.status ?? response.status}`,
40706
+ response.status,
40707
+ result?.status
40708
+ );
40709
+ }
40710
+ return {
40711
+ status: result?.status === "skipped_existing" ? "skipped_existing" : "charged",
40712
+ creditAmount: result?.creditAmount ?? null
40713
+ };
40714
+ }
40715
+ function buildImageUnderstandMeteringPayload(input) {
40716
+ const metadata = input.userRequest?.metadata ?? {};
40717
+ const messageId = stringValue(metadata.message_id) ?? nestedMessageId(metadata) ?? stringValue(input.userRequest?.requestId);
40718
+ const imageKey = stringValue(metadata.imageKey) ?? stringValue(metadata.image_key) ?? firstString(metadata.imageKeys);
40719
+ return {
40720
+ tenantId: input.tenantId,
40721
+ provider: input.provider,
40722
+ model: input.model,
40723
+ requestId: stringValue(input.userRequest?.requestId),
40724
+ messageId,
40725
+ imageKey,
40726
+ imageFingerprint: fingerprintImageSource(input.imageSource),
40727
+ toolCallId: stringValue(metadata.toolCallId),
40728
+ promptChars: input.prompt.length,
40729
+ resultChars: input.resultText.length,
40730
+ platform: stringValue(input.userRequest?.platform),
40731
+ occurredAt: (/* @__PURE__ */ new Date()).toISOString(),
40732
+ metadata: {
40733
+ imageSourceKind: imageSourceKind(input.imageSource),
40734
+ chatType: stringValue(input.userRequest?.chatType),
40735
+ authStyle: stringValue(input.authStyle)
40736
+ }
40737
+ };
40738
+ }
40739
+ function inferImageProvider(baseUrl) {
40740
+ if (!baseUrl) return "moonshot";
40741
+ try {
40742
+ const host = new URL(baseUrl).hostname.toLowerCase();
40743
+ if (host.includes("moonshot")) return "moonshot";
40744
+ if (host.includes("anthropic")) return "anthropic";
40745
+ if (host.includes("bigmodel") || host.includes("zhipu")) return "zhipu";
40746
+ return host.replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, "") || "custom";
40747
+ } catch {
40748
+ return "custom";
40749
+ }
40750
+ }
40751
+ function fingerprintImageSource(imageSource) {
40752
+ return (0, import_node_crypto.createHash)("sha256").update(imageSource).digest("hex");
40753
+ }
40754
+ function imageSourceKind(imageSource) {
40755
+ if (imageSource.startsWith("http://") || imageSource.startsWith("https://")) return "url";
40756
+ if (imageSource.startsWith("/") || imageSource.startsWith(".") || /^[A-Za-z]:[\\/]/.test(imageSource)) return "local_file";
40757
+ return "base64";
40758
+ }
40759
+ function nestedMessageId(metadata) {
40760
+ const message = metadata.message;
40761
+ if (!message || typeof message !== "object" || Array.isArray(message)) return null;
40762
+ return stringValue(message.message_id);
40763
+ }
40764
+ function firstString(value) {
40765
+ if (!Array.isArray(value)) return null;
40766
+ for (const item of value) {
40767
+ const normalized = stringValue(item);
40768
+ if (normalized) return normalized;
40769
+ }
40770
+ return null;
40771
+ }
40772
+ function stringValue(value) {
40773
+ if (typeof value !== "string") return null;
40774
+ const normalized = value.trim();
40775
+ return normalized ? normalized : null;
40776
+ }
40777
+ async function parseResponseJson(response) {
40778
+ try {
40779
+ return await response.json();
40780
+ } catch {
40781
+ return null;
40782
+ }
40783
+ }
40784
+
40543
40785
  // src/tools/tools/ImageUnderstand.ts
40544
40786
  var guessMediaTypeFromData = (base64Data) => {
40545
40787
  if (base64Data.startsWith("/9j/")) return "image/jpeg";
@@ -40617,11 +40859,12 @@ var imageUnderstand = {
40617
40859
  if (!url) throw new Error(`[ImageUnderstand] TOOL_IMAGE_ANTHROPIC_BASE_URL\u672A\u914D\u7F6E`);
40618
40860
  if (!key) throw new Error(`[ImageUnderstand] TOOL_IMAGE_ANTHROPIC_AUTH_TOKEN\u672A\u914D\u7F6E`);
40619
40861
  if (!model) throw new Error(`[ImageUnderstand] TOOL_IMAGE_ANTHROPIC_MODEL\u672A\u914D\u7F6E`);
40862
+ const authStyle = process.env.TOOL_IMAGE_ANTHROPIC_AUTH_STYLE || "bearer";
40620
40863
  const anthropicOption = {
40621
40864
  baseURL: url,
40622
40865
  apiKey: key,
40623
40866
  model,
40624
- authStyle: process.env.TOOL_IMAGE_ANTHROPIC_AUTH_STYLE || "bearer"
40867
+ authStyle
40625
40868
  };
40626
40869
  const llmClient = createAnthropicAdapter(anthropicOption);
40627
40870
  const imageBlock = await resolveImageBlock(imageSource);
@@ -40631,7 +40874,20 @@ var imageUnderstand = {
40631
40874
  [imageMessage],
40632
40875
  system
40633
40876
  );
40634
- return extractText(response.content);
40877
+ const resultText = extractText(response.content);
40878
+ await reportImageUnderstandUsage({
40879
+ baseUrl: process.env.DUCLAW_CONTROL_PLANE_BASE_URL,
40880
+ token: process.env.DUCLAW_CONTROL_PLANE_METERING_TOKEN,
40881
+ tenantId: process.env.DUCLAW_TENANT_ID,
40882
+ provider: inferImageProvider(url),
40883
+ model,
40884
+ prompt,
40885
+ resultText,
40886
+ imageSource,
40887
+ authStyle,
40888
+ userRequest
40889
+ });
40890
+ return resultText;
40635
40891
  }
40636
40892
  };
40637
40893
 
@@ -41057,11 +41313,11 @@ var goalDelete = {
41057
41313
  }
41058
41314
  };
41059
41315
 
41060
- // src/tools/tools/team/TeamCreate.ts
41061
- var import_node_crypto3 = require("node:crypto");
41316
+ // src/tools/tools/department/DepartmentCreate.ts
41317
+ var import_node_crypto4 = require("node:crypto");
41062
41318
 
41063
- // src/team/mailbox/mailbox.ts
41064
- var import_node_crypto2 = require("node:crypto");
41319
+ // src/department/mailbox/mailbox.ts
41320
+ var import_node_crypto3 = require("node:crypto");
41065
41321
 
41066
41322
  // src/db/createDB.ts
41067
41323
  var import_better_sqlite3 = __toESM(require("better-sqlite3"));
@@ -41187,8 +41443,8 @@ var create_mailbox_events_table = () => {
41187
41443
  }
41188
41444
  };
41189
41445
 
41190
- // src/team/mailbox/events.ts
41191
- var import_node_crypto = require("node:crypto");
41446
+ // src/department/mailbox/events.ts
41447
+ var import_node_crypto2 = require("node:crypto");
41192
41448
  var parseDetail = (detailJson) => {
41193
41449
  if (!detailJson) return void 0;
41194
41450
  try {
@@ -41229,7 +41485,7 @@ var mapMailboxEventRow = (row) => {
41229
41485
  var recordMailboxEvent = (input) => {
41230
41486
  const db3 = createSqliteDB();
41231
41487
  const event = {
41232
- id: (0, import_node_crypto.randomUUID)().slice(0, 12),
41488
+ id: (0, import_node_crypto2.randomUUID)().slice(0, 12),
41233
41489
  messageId: input.messageId,
41234
41490
  mailboxId: input.mailboxId,
41235
41491
  actorMailboxId: input.actorMailboxId,
@@ -41311,77 +41567,124 @@ var listMailboxEvents = (params) => {
41311
41567
  return rows.map(mapMailboxEventRow);
41312
41568
  };
41313
41569
 
41314
- // src/team/TeamMember.ts
41570
+ // src/department/DepartmentMember.ts
41315
41571
  var import_fs13 = require("fs");
41316
41572
  var import_path19 = __toESM(require("path"));
41317
41573
 
41318
- // src/team/Team.ts
41574
+ // src/department/Department.ts
41319
41575
  var import_path18 = __toESM(require("path"));
41320
41576
  var import_fs12 = require("fs");
41321
- var getTeamBaseDir = () => {
41577
+ var legacyMigrationChecked = false;
41578
+ var getDepartmentBaseDir = () => {
41579
+ return import_path18.default.join(getDuclawHomeDir(), "department");
41580
+ };
41581
+ var getLegacyTeamBaseDir = () => {
41322
41582
  return import_path18.default.join(getDuclawHomeDir(), "team");
41323
41583
  };
41324
- var getTeamWorkSpaceDir = (teamName) => {
41325
- return `${getTeamBaseDir()}/workspace/${teamName}`;
41326
- };
41327
- var getTeamJsonPath = (teamName) => {
41328
- return `${getTeamWorkSpaceDir(teamName)}/team.json`;
41329
- };
41330
- var createTeam = (teamDefinition) => {
41331
- if (!teamDefinition) throw new Error(`[createTeam] teamDefinition\u4E0D\u80FD\u4E3A\u7A7A`);
41332
- const { id, name, goalId, teamMembers } = teamDefinition;
41333
- const teamPath = import_path18.default.join(getTeamWorkSpaceDir(name));
41334
- (0, import_fs12.mkdirSync)(teamPath, { recursive: true });
41335
- (0, import_fs12.writeFileSync)(`${teamPath}/team.json`, JSON.stringify(teamDefinition, null, " "), "utf-8");
41336
- return teamDefinition;
41337
- };
41338
- var getTeam = (name) => {
41339
- const teamJsonPath = getTeamJsonPath(name);
41340
- if (!(0, import_fs12.existsSync)(teamJsonPath)) return null;
41341
- const text2 = (0, import_fs12.readFileSync)(teamJsonPath, `utf-8`);
41342
- const obj = JSON.parse(text2) || {};
41343
- const team = obj;
41344
- return team;
41345
- };
41346
- var listTeams = () => {
41347
- const baseDir = getTeamBaseDir();
41348
- const workspaceDir = import_path18.default.join(baseDir, `workspace`);
41349
- if (!(0, import_fs12.existsSync)(workspaceDir)) return [];
41350
- const teamnames = (0, import_fs12.readdirSync)(workspaceDir);
41351
- const teams = [];
41352
- for (const teamname of teamnames) {
41353
- const team = getTeam(teamname);
41354
- if (team) {
41355
- teams.push(team);
41584
+ var getDepartmentWorkSpaceDir = (departmentName) => {
41585
+ return import_path18.default.join(getDepartmentBaseDir(), "workspace", departmentName);
41586
+ };
41587
+ var getLegacyTeamWorkSpaceDir = (teamName) => {
41588
+ return import_path18.default.join(getLegacyTeamBaseDir(), "workspace", teamName);
41589
+ };
41590
+ var getDepartmentJsonPath = (departmentName) => {
41591
+ return import_path18.default.join(getDepartmentWorkSpaceDir(departmentName), "department.json");
41592
+ };
41593
+ var getLegacyTeamJsonPath = (teamName) => {
41594
+ return import_path18.default.join(getLegacyTeamWorkSpaceDir(teamName), "team.json");
41595
+ };
41596
+ var mapLegacyRole = (role) => {
41597
+ return role === "team_manager" ? "department_head" : "executor";
41598
+ };
41599
+ var mapLegacyDepartment = (legacy) => {
41600
+ const departmentMembers = (legacy.teamMembers ?? []).map((member) => ({
41601
+ id: member.id,
41602
+ name: member.name,
41603
+ departmentId: legacy.id,
41604
+ mailBoxId: member.mailBoxId,
41605
+ workspaceId: member.workspaceId,
41606
+ role: mapLegacyRole(member.role),
41607
+ focusOn: member.focusOn
41608
+ }));
41609
+ const headMemberId = legacy.managerMemberId ?? departmentMembers.find((member) => member.role === "department_head")?.id;
41610
+ return {
41611
+ id: legacy.id,
41612
+ name: legacy.name,
41613
+ sourceGoalId: legacy.goalId,
41614
+ charter: legacy.goalId ? `Legacy department migrated from team goal ${legacy.goalId}.` : "Legacy department migrated from team data.",
41615
+ workpath: legacy.workpath,
41616
+ headMemberId,
41617
+ departmentMembers
41618
+ };
41619
+ };
41620
+ var migrateLegacyTeamsToDepartments = () => {
41621
+ if (legacyMigrationChecked) return;
41622
+ legacyMigrationChecked = true;
41623
+ const legacyWorkspaceDir = import_path18.default.join(getLegacyTeamBaseDir(), "workspace");
41624
+ if (!(0, import_fs12.existsSync)(legacyWorkspaceDir)) return;
41625
+ for (const legacyName of (0, import_fs12.readdirSync)(legacyWorkspaceDir)) {
41626
+ const legacyJsonPath = getLegacyTeamJsonPath(legacyName);
41627
+ if (!(0, import_fs12.existsSync)(legacyJsonPath)) continue;
41628
+ const departmentJsonPath = getDepartmentJsonPath(legacyName);
41629
+ if ((0, import_fs12.existsSync)(departmentJsonPath)) continue;
41630
+ try {
41631
+ const legacy = JSON.parse((0, import_fs12.readFileSync)(legacyJsonPath, "utf-8"));
41632
+ const department = mapLegacyDepartment(legacy);
41633
+ (0, import_fs12.mkdirSync)(getDepartmentWorkSpaceDir(department.name), { recursive: true });
41634
+ (0, import_fs12.writeFileSync)(departmentJsonPath, JSON.stringify(department, null, " "), "utf-8");
41635
+ } catch (err) {
41636
+ console.warn(`[department] Failed to migrate legacy team ${legacyName}: ${err.message}`);
41356
41637
  }
41357
41638
  }
41358
- return teams;
41359
41639
  };
41360
- var getTeamById = (id) => {
41361
- const teams = listTeams();
41362
- const team = teams.find((t) => t.id === id);
41363
- if (!team) return null;
41364
- return team;
41640
+ var createDepartment = (departmentDefinition) => {
41641
+ if (!departmentDefinition) throw new Error(`[createDepartment] departmentDefinition\u4E0D\u80FD\u4E3A\u7A7A`);
41642
+ const departmentPath = getDepartmentWorkSpaceDir(departmentDefinition.name);
41643
+ (0, import_fs12.mkdirSync)(departmentPath, { recursive: true });
41644
+ (0, import_fs12.writeFileSync)(getDepartmentJsonPath(departmentDefinition.name), JSON.stringify(departmentDefinition, null, " "), "utf-8");
41645
+ return departmentDefinition;
41646
+ };
41647
+ var getDepartment = (name) => {
41648
+ migrateLegacyTeamsToDepartments();
41649
+ const departmentJsonPath = getDepartmentJsonPath(name);
41650
+ if (!(0, import_fs12.existsSync)(departmentJsonPath)) return null;
41651
+ const text2 = (0, import_fs12.readFileSync)(departmentJsonPath, "utf-8");
41652
+ return JSON.parse(text2);
41365
41653
  };
41366
- var deleteTeam = (name) => {
41367
- if (!(0, import_fs12.existsSync)(getTeamJsonPath(name))) {
41368
- throw new Error(`[deleteTeam] \u4E0D\u5B58\u5728\u5BF9\u5E94\u7684\u56E2\u961F${name}\u7684team.json\u6587\u4EF6`);
41654
+ var listDepartments = () => {
41655
+ migrateLegacyTeamsToDepartments();
41656
+ const workspaceDir = import_path18.default.join(getDepartmentBaseDir(), "workspace");
41657
+ if (!(0, import_fs12.existsSync)(workspaceDir)) return [];
41658
+ const departments = [];
41659
+ for (const departmentName of (0, import_fs12.readdirSync)(workspaceDir)) {
41660
+ const department = getDepartment(departmentName);
41661
+ if (department) departments.push(department);
41369
41662
  }
41370
- (0, import_fs12.rmSync)(getTeamJsonPath(name));
41663
+ return departments;
41664
+ };
41665
+ var getDepartmentById = (id) => {
41666
+ const department = listDepartments().find((item) => item.id === id);
41667
+ return department ?? null;
41668
+ };
41669
+ var deleteDepartment = (name) => {
41670
+ if (!(0, import_fs12.existsSync)(getDepartmentJsonPath(name))) {
41671
+ throw new Error(`[deleteDepartment] \u4E0D\u5B58\u5728\u5BF9\u5E94\u7684\u90E8\u95E8 ${name} \u7684 department.json \u6587\u4EF6`);
41672
+ }
41673
+ (0, import_fs12.rmSync)(getDepartmentJsonPath(name));
41371
41674
  };
41372
41675
 
41373
- // src/team/workspace/workspace.ts
41676
+ // src/department/workspace/workspace.ts
41374
41677
  var db = createSqliteDB();
41375
- var getWorkspaceId = (teamName, teammateName) => {
41376
- return `${teamName}::${teammateName}`;
41678
+ var getWorkspaceId = (departmentName, memberName) => {
41679
+ return `${departmentName}::${memberName}`;
41377
41680
  };
41378
41681
  var createWorkspace = (workspace) => {
41379
41682
  const stmt = db.prepare(`INSERT INTO workspace (id, team_name, teammate_name, team_workpath) VALUES (?, ?, ?, ?) `);
41380
- const result = stmt.run(
41683
+ stmt.run(
41381
41684
  workspace.id,
41382
- workspace.teamName,
41383
- workspace.teammateName,
41384
- workspace.teamWorkPath
41685
+ workspace.departmentName,
41686
+ workspace.memberName,
41687
+ workspace.departmentWorkPath
41385
41688
  );
41386
41689
  };
41387
41690
  var deleteWorkspace = (workspaceId) => {
@@ -41389,98 +41692,92 @@ var deleteWorkspace = (workspaceId) => {
41389
41692
  stmt.run(workspaceId);
41390
41693
  };
41391
41694
 
41392
- // src/team/TeamMember.ts
41393
- var createTeamMember = (teamMemberDefinition) => {
41394
- if (!teamMemberDefinition) throw new Error(`[createTeamMember] teamMemberDefinition\u4E0D\u80FD\u4E3A\u7A7A`);
41395
- const { id, name, teamId, mailBoxId, workspaceId } = teamMemberDefinition;
41396
- const team = getTeamById(teamMemberDefinition.teamId);
41397
- if (!team) throw new Error(`[createTeamMember] \u627E\u4E0D\u5230\u5BF9\u5E94\u7684team: ${teamId}`);
41398
- const memberPath = import_path19.default.join(getTeamWorkSpaceDir(team.name), name);
41695
+ // src/department/DepartmentMember.ts
41696
+ var createDepartmentMember = (departmentMemberDefinition) => {
41697
+ if (!departmentMemberDefinition) throw new Error(`[createDepartmentMember] departmentMemberDefinition\u4E0D\u80FD\u4E3A\u7A7A`);
41698
+ const { name, departmentId, workspaceId } = departmentMemberDefinition;
41699
+ const department = getDepartmentById(departmentId);
41700
+ if (!department) throw new Error(`[createDepartmentMember] \u627E\u4E0D\u5230\u5BF9\u5E94\u7684 department: ${departmentId}`);
41701
+ const memberPath = import_path19.default.join(getDepartmentWorkSpaceDir(department.name), name);
41399
41702
  (0, import_fs13.mkdirSync)(memberPath, { recursive: true });
41400
41703
  const workspace = {
41401
- id: getWorkspaceId(team.name, teamMemberDefinition.name),
41402
- teamName: team.name,
41403
- teammateName: name,
41404
- teamWorkPath: memberPath
41704
+ id: getWorkspaceId(department.name, departmentMemberDefinition.name),
41705
+ departmentName: department.name,
41706
+ memberName: name,
41707
+ departmentWorkPath: memberPath
41405
41708
  };
41406
41709
  createWorkspace(workspace);
41407
- if (!team.teamMembers) {
41408
- team.teamMembers = [];
41409
- }
41410
- if (team.teamMembers.some((member) => member.id === teamMemberDefinition.id || member.name === teamMemberDefinition.name)) {
41411
- throw new Error(`[createTeamMember] \u56E2\u961F ${team.name} \u5DF2\u5B58\u5728\u540C\u540D\u6216\u540Cid\u6210\u5458: ${teamMemberDefinition.name}/${teamMemberDefinition.id}`);
41412
- }
41413
- if (teamMemberDefinition.role === "team_manager") {
41414
- const existingManager = team.managerMemberId ? team.teamMembers.find((member) => member.id === team.managerMemberId) : team.teamMembers.find((member) => member.role === "team_manager");
41415
- if (existingManager) {
41416
- throw new Error(`[createTeamMember] \u56E2\u961F ${team.name} \u5DF2\u5B58\u5728Team Manager: ${existingManager.name}`);
41417
- }
41418
- team.managerMemberId = teamMemberDefinition.id;
41419
- }
41420
- team.teamMembers.push(teamMemberDefinition);
41421
- (0, import_fs13.writeFileSync)(getTeamJsonPath(team.name), JSON.stringify(team, null, " "), "utf-8");
41422
- return teamMemberDefinition;
41423
- };
41424
- var listTeamMember = (teamName) => {
41425
- const teamJsonPath = getTeamJsonPath(teamName);
41426
- if (!(0, import_fs13.existsSync)(teamJsonPath)) return [];
41427
- const text2 = (0, import_fs13.readFileSync)(teamJsonPath, `utf-8`);
41428
- const team = JSON.parse(text2);
41429
- if (!team) throw new Error(`[listTeamMember] \u627E\u4E0D\u5230\u5BF9\u5E94\u7684team: ${teamName}`);
41430
- if (!team.teamMembers) return [];
41431
- return team.teamMembers;
41432
- };
41433
- var getTeamMember = (teamName, teamMemberId) => {
41434
- const members = listTeamMember(teamName);
41435
- return members.find((m) => m.id === teamMemberId) || null;
41436
- };
41437
- var getTeamMemberByName = (teamName, teamMemberName) => {
41438
- const members = listTeamMember(teamName);
41439
- return members.find((m) => m.name === teamMemberName) || null;
41440
- };
41441
- var getTeamMemberByMailboxId = (mailboxId) => {
41442
- const [teamName, memberName] = mailboxId.split("::");
41443
- if (!teamName || !memberName) return null;
41444
- return getTeamMemberByName(teamName, memberName);
41445
- };
41446
- var getTeamMemberById = (teammateId) => {
41447
- const teams = listTeams();
41448
- for (const team of teams) {
41449
- const targetMember = team.teamMembers.find((m) => m.id === teammateId);
41710
+ if (!department.departmentMembers) {
41711
+ department.departmentMembers = [];
41712
+ }
41713
+ if (department.departmentMembers.some((member) => member.id === departmentMemberDefinition.id || member.name === departmentMemberDefinition.name)) {
41714
+ throw new Error(`[createDepartmentMember] \u90E8\u95E8 ${department.name} \u5DF2\u5B58\u5728\u540C\u540D\u6216\u540C id \u6210\u5458: ${departmentMemberDefinition.name}/${departmentMemberDefinition.id}`);
41715
+ }
41716
+ if (departmentMemberDefinition.role === "department_head") {
41717
+ const existingHead = department.headMemberId ? department.departmentMembers.find((member) => member.id === department.headMemberId) : department.departmentMembers.find((member) => member.role === "department_head");
41718
+ if (existingHead) {
41719
+ throw new Error(`[createDepartmentMember] \u90E8\u95E8 ${department.name} \u5DF2\u5B58\u5728 Department Head: ${existingHead.name}`);
41720
+ }
41721
+ department.headMemberId = departmentMemberDefinition.id;
41722
+ }
41723
+ department.departmentMembers.push(departmentMemberDefinition);
41724
+ (0, import_fs13.writeFileSync)(getDepartmentJsonPath(department.name), JSON.stringify(department, null, " "), "utf-8");
41725
+ return departmentMemberDefinition;
41726
+ };
41727
+ var listDepartmentMembers = (departmentName) => {
41728
+ const departmentJsonPath = getDepartmentJsonPath(departmentName);
41729
+ if (!(0, import_fs13.existsSync)(departmentJsonPath)) return [];
41730
+ const text2 = (0, import_fs13.readFileSync)(departmentJsonPath, "utf-8");
41731
+ const department = JSON.parse(text2);
41732
+ if (!department) throw new Error(`[listDepartmentMembers] \u627E\u4E0D\u5230\u5BF9\u5E94\u7684 department: ${departmentName}`);
41733
+ return department.departmentMembers ?? [];
41734
+ };
41735
+ var getDepartmentMember = (departmentName, departmentMemberId) => {
41736
+ const members = listDepartmentMembers(departmentName);
41737
+ return members.find((member) => member.id === departmentMemberId) || null;
41738
+ };
41739
+ var getDepartmentMemberByName = (departmentName, departmentMemberName) => {
41740
+ const members = listDepartmentMembers(departmentName);
41741
+ return members.find((member) => member.name === departmentMemberName) || null;
41742
+ };
41743
+ var getDepartmentMemberByMailboxId = (mailboxId) => {
41744
+ const [departmentName, memberName] = mailboxId.split("::");
41745
+ if (!departmentName || !memberName) return null;
41746
+ return getDepartmentMemberByName(departmentName, memberName);
41747
+ };
41748
+ var getDepartmentMemberById = (memberId) => {
41749
+ for (const department of listDepartments()) {
41750
+ const targetMember = department.departmentMembers.find((member) => member.id === memberId);
41450
41751
  if (targetMember) return targetMember;
41451
41752
  }
41452
41753
  return null;
41453
41754
  };
41454
- var deleteTeamMemberById = (teamName, memberId) => {
41455
- const team = getTeam(teamName);
41456
- if (!team) throw new Error(`[deleteTeamMemberById] \u627E\u4E0D\u5230\u5BF9\u5E94\u7684team: ${teamName}`);
41457
- let memberIdx = team.teamMembers.findIndex((value, index, obj) => {
41458
- return value.id === memberId;
41459
- });
41755
+ var deleteDepartmentMemberById = (departmentName, memberId) => {
41756
+ const department = getDepartment(departmentName);
41757
+ if (!department) throw new Error(`[deleteDepartmentMemberById] \u627E\u4E0D\u5230\u5BF9\u5E94\u7684 department: ${departmentName}`);
41758
+ const memberIdx = department.departmentMembers.findIndex((member) => member.id === memberId);
41460
41759
  if (memberIdx === -1) {
41461
- throw new Error(`[updateTeamMember] \u627E\u4E0D\u5230\u5BF9\u5E94\u7684id\u7684teamMember: ${memberId}`);
41760
+ throw new Error(`[deleteDepartmentMemberById] \u627E\u4E0D\u5230\u5BF9\u5E94 id \u7684 department member: ${memberId}`);
41462
41761
  }
41463
- ;
41464
- const workspaceId = team.teamMembers[memberIdx].workspaceId;
41465
- if (team.managerMemberId === memberId) {
41466
- delete team.managerMemberId;
41762
+ const workspaceId = department.departmentMembers[memberIdx].workspaceId;
41763
+ if (department.headMemberId === memberId) {
41764
+ delete department.headMemberId;
41467
41765
  }
41468
- let newTeamMember = team.teamMembers.filter((_, index) => index !== memberIdx);
41469
- team.teamMembers = newTeamMember;
41470
- (0, import_fs13.writeFileSync)(getTeamJsonPath(teamName), JSON.stringify(team, null, ` `));
41766
+ department.departmentMembers = department.departmentMembers.filter((_, index) => index !== memberIdx);
41767
+ (0, import_fs13.writeFileSync)(getDepartmentJsonPath(departmentName), JSON.stringify(department, null, " "), "utf-8");
41471
41768
  deleteWorkspace(workspaceId);
41472
41769
  };
41473
41770
 
41474
- // src/team/mailbox/mailbox.ts
41475
- var getMailBoxId = (teamName, teammateName) => {
41476
- return `${teamName}::${teammateName}`;
41771
+ // src/department/mailbox/mailbox.ts
41772
+ var getMailBoxId = (departmentName, memberName) => {
41773
+ return `${departmentName}::${memberName}`;
41477
41774
  };
41478
- var getMailBoxIdFromTeammateId = (teammateId) => {
41479
- const member = getTeamMemberById(teammateId);
41775
+ var getMailBoxIdFromDepartmentMemberId = (memberId) => {
41776
+ const member = getDepartmentMemberById(memberId);
41480
41777
  if (!member) return null;
41481
- const team = getTeamById(member.teamId);
41482
- if (!team) throw new Error(`[getMailBoxIdFromTeammateId] \u6B64\u6210\u5458\u4E0D\u5C5E\u4E8E\u4EFB\u4F55\u56E2\u961Fteam: ${member.teamId}`);
41483
- return getMailBoxId(team.name, member.name);
41778
+ const department = getDepartmentById(member.departmentId);
41779
+ if (!department) throw new Error(`[getMailBoxIdFromDepartmentMemberId] \u6B64\u6210\u5458\u4E0D\u5C5E\u4E8E\u4EFB\u4F55\u90E8\u95E8: ${member.departmentId}`);
41780
+ return getMailBoxId(department.name, member.name);
41484
41781
  };
41485
41782
  var cancelMailboxMessages = (mailboxId) => {
41486
41783
  const db3 = createSqliteDB();
@@ -41512,7 +41809,7 @@ var sendMessage2 = (fromMailboxId, toMailboxId, content, options) => {
41512
41809
  thread_id,
41513
41810
  parent_message_id
41514
41811
  ) values (?,?,?,?,?,?,?,?,?,?) `);
41515
- const id = (0, import_node_crypto2.randomUUID)().slice(0, 8);
41812
+ const id = (0, import_node_crypto3.randomUUID)().slice(0, 8);
41516
41813
  const threadId = options?.threadId || id;
41517
41814
  let mailboxMsg = {
41518
41815
  id,
@@ -41545,7 +41842,8 @@ var sendMessage2 = (fromMailboxId, toMailboxId, content, options) => {
41545
41842
  counterpartMailboxId: fromMailboxId,
41546
41843
  eventType: "message_sent",
41547
41844
  detail: {
41548
- initialStatus: mailboxMsg.status
41845
+ initialStatus: mailboxMsg.status,
41846
+ ...options?.auditDetail ?? {}
41549
41847
  },
41550
41848
  createdAt: mailboxMsg.sendTime
41551
41849
  });
@@ -41583,391 +41881,412 @@ var updateMailboxMessageStatus = (messageId, nextStatus, options) => {
41583
41881
  return true;
41584
41882
  };
41585
41883
 
41586
- // src/tools/tools/team/TeamCreate.ts
41884
+ // src/tools/tools/department/DepartmentCreate.ts
41587
41885
  var DESCRIPTION20 = `
41588
- \u521B\u5EFA\u56E2\u961F
41886
+ \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
41887
 
41590
41888
  \u5DE5\u5177\u8C03\u7528\u89C4\u5219\uFF1A
41591
- - \u5F53\u7528\u6237\u8981\u6C42\u521B\u5EFA\u56E2\u961F\u65F6\u8C03\u7528\u6B64\u5DE5\u5177\u3002
41592
- - \u5F53\u4E00\u4E2A\u76EE\u6807\u9700\u8981\u667A\u80FD\u4F53\u56E2\u961F\u534F\u4F5C\u65F6\u8C03\u7528\u6B64\u5DE5\u5177\u3002
41593
- - \u8C03\u7528\u6B64\u5DE5\u5177\u4E4B\u524D\uFF0C\u9700\u7528goal_* \u5DE5\u5177\u5148\u7BA1\u7406\u597D\u76EE\u6807\u3002
41889
+ - \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
41890
+ - 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
41891
+ - \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
41892
  `;
41595
- var teamCreate = {
41596
- name: `create_team`,
41893
+ var departmentCreate = {
41894
+ name: `department_create`,
41597
41895
  description: DESCRIPTION20,
41598
41896
  input_schema: {
41599
41897
  type: `object`,
41600
41898
  properties: {
41601
41899
  name: {
41602
41900
  type: `string`,
41603
- description: `\u56E2\u961F\u540D\u79F0`
41901
+ description: `\u90E8\u95E8\u540D\u79F0`
41604
41902
  },
41605
- goalId: {
41903
+ charter: {
41606
41904
  type: `string`,
41607
- description: `\u76EE\u6807id,\u8FD9\u4E2A\u56E2\u961F\u662F\u4E3A\u4E86\u89E3\u51B3\u54EA\u4E2A\u76EE\u6807id\u800C\u521B\u5EFA\u7684`
41905
+ description: `\u90E8\u95E8\u957F\u671F\u804C\u8D23\u8FB9\u754C\uFF0C\u4E0D\u80FD\u5199\u4E00\u6B21\u6027\u4EFB\u52A1\u7EC6\u8282`
41906
+ },
41907
+ sourceGoalId: {
41908
+ type: `string`,
41909
+ description: `\u53EF\u9009\uFF1A\u521B\u5EFA\u8BE5\u90E8\u95E8\u65F6\u5173\u8054\u7684\u76EE\u6807 id`
41608
41910
  },
41609
41911
  workpath: {
41610
41912
  type: `string`,
41611
- description: `\u56E2\u961F\u7684\u9879\u76EE\u5DE5\u4F5C\u76EE\u5F55\uFF08\u7EDD\u5BF9\u8DEF\u5F84\uFF09\uFF0C\u6240\u6709\u56E2\u961F\u6210\u5458\u7684\u6587\u4EF6\u64CD\u4F5C\u5FC5\u987B\u5728\u6B64\u76EE\u5F55\u8303\u56F4\u5185\u3002\u4F8B\u5982 /Users/xxx/project`
41913
+ 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
41914
  }
41613
41915
  },
41614
- required: [`name`, `goalId`, `workpath`]
41916
+ required: [`name`, `charter`, `workpath`]
41615
41917
  },
41616
- async execute(input, userRequest) {
41918
+ async execute(input) {
41617
41919
  const name = input.name;
41618
- const goalId = input.goalId;
41920
+ const charter = input.charter;
41921
+ const sourceGoalId = input.sourceGoalId;
41619
41922
  const workpath = input.workpath;
41620
- const goal = getGoalById(goalId);
41621
- if (!goal) return `[teamCreate] \u4E0D\u5B58\u5728id=${goalId}\u7684\u76EE\u6807`;
41622
- let teamDefinition = {
41623
- // 前8位作为id
41624
- id: (0, import_node_crypto3.randomUUID)().slice(0, 8),
41923
+ if (sourceGoalId && !getGoalById(sourceGoalId)) {
41924
+ return `[departmentCreate] \u4E0D\u5B58\u5728 id=${sourceGoalId} \u7684\u76EE\u6807`;
41925
+ }
41926
+ let departmentDefinition = {
41927
+ id: (0, import_node_crypto4.randomUUID)().slice(0, 8),
41625
41928
  name,
41626
- goalId,
41929
+ charter,
41930
+ sourceGoalId,
41627
41931
  workpath,
41628
- teamMembers: []
41932
+ departmentMembers: []
41629
41933
  };
41630
41934
  try {
41631
- teamDefinition = createTeam(teamDefinition);
41935
+ departmentDefinition = createDepartment(departmentDefinition);
41632
41936
  } catch (err) {
41633
- const err_msg = err;
41634
- return `[teamCreate] \u521B\u5EFA\u56E2\u961F\u5931\u8D25: ${err_msg.message}`;
41937
+ return `[departmentCreate] \u521B\u5EFA\u90E8\u95E8\u5931\u8D25: ${err.message}`;
41635
41938
  }
41636
- return `[teamCreate] \u521B\u5EFA\u56E2\u961F\u6210\u529F: ${JSON.stringify(teamDefinition)}`;
41939
+ return `[departmentCreate] \u521B\u5EFA\u90E8\u95E8\u6210\u529F: ${JSON.stringify(departmentDefinition)}`;
41637
41940
  }
41638
41941
  };
41639
41942
 
41640
- // src/tools/tools/team/TeamCommunicate.ts
41641
- var MANAGER_MAILBOX_ID = `manager`;
41943
+ // src/tools/tools/department/DepartmentCommunicate.ts
41944
+ var CEO_MAILBOX_ID = `manager`;
41642
41945
  var DESCRIPTION21 = `
41643
- \u5411\u56E2\u961F\u6210\u5458\u53D1\u9001\u6D88\u606F\u6216\u6307\u4EE4\uFF0C\u662F\u56E2\u961F\u901A\u4FE1\u7684\u552F\u4E00\u6E20\u9053\u3002
41946
+ \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
41644
41947
 
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
41654
-
41655
- \u524D\u7F6E\u6761\u4EF6\uFF1A
41656
- - \u56E2\u961F\u5FC5\u987B\u5DF2\u5B58\u5728\uFF08\u901A\u8FC7 create_team \u521B\u5EFA\uFF09
41657
- - \u76EE\u6807\u6210\u5458\u5FC5\u987B\u5728\u56E2\u961F\u4E2D\uFF08\u901A\u8FC7 team_member_create \u6DFB\u52A0\uFF09
41948
+ \u9ED8\u8BA4\u7EC4\u7EC7\u6CBB\u7406\uFF1A
41949
+ - CEO \u9ED8\u8BA4\u901A\u8FC7 department_list \u53EA\u770B\u5230\u90E8\u95E8\u548C Department Head\uFF0C\u4E0D\u4E3B\u52A8\u66B4\u9732 Executor\u3002
41950
+ - Department Head \u9ED8\u8BA4\u7BA1\u7406\u672C\u90E8\u95E8\u6210\u5458\u3002
41951
+ - \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
41952
 
41659
- \u6CE8\u610F\u4E8B\u9879\uFF1A
41660
- - \u8FD9\u662F\u5F02\u6B65\u6D88\u606F\u53D1\u9001\uFF0C\u6D88\u606F\u4F1A\u6295\u9012\u5230\u5BF9\u65B9\u7684 mailbox \u4E2D\u7B49\u5F85\u5904\u7406
41661
- - \u6D88\u606F\u5185\u5BB9\u5E94\u6E05\u6670\u3001\u53EF\u6267\u884C
41662
- - \u5982\u679C\u67D0\u4F4D\u6210\u5458\u5DF2\u7ECF\u4EA4\u4ED8\u8FC7\u4E00\u4EFD\u7ED3\u679C\uFF0C\u540E\u7EED\u5BF9\u8FD9\u4EFD\u7ED3\u679C\u7684\u4FEE\u6539/\u8FD4\u5DE5/bug \u4FEE\u590D\u4F18\u5148\u4F7F\u7528 mailbox_followup \u5EF6\u7EED\u539F\u7EBF\u7A0B\uFF1Bteam_communicate \u66F4\u9002\u5408\u65B0\u4EFB\u52A1\u6216\u660E\u786E\u9700\u8981\u66F4\u6362\u8D23\u4EFB\u4EBA\u65F6\u4F7F\u7528
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
41953
+ \u53C2\u6570\u8BF4\u660E\uFF1A
41954
+ - department_name + member_name: \u9ED8\u8BA4\u5BFB\u5740\u65B9\u5F0F\u3002
41955
+ - 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
41956
+ - content: \u8981\u53D1\u9001\u7684\u6D88\u606F\u5185\u5BB9\u3002
41665
41957
  `;
41666
- var teamCommunicate = {
41667
- name: `team_communicate`,
41958
+ var departmentCommunicate = {
41959
+ name: `department_communicate`,
41668
41960
  description: DESCRIPTION21,
41669
41961
  input_schema: {
41670
41962
  type: `object`,
41671
41963
  properties: {
41672
- team_name: {
41964
+ department_name: {
41673
41965
  type: `string`,
41674
- description: `\u76EE\u6807\u6210\u5458\u6240\u5C5E\u7684\u56E2\u961F\u540D\u79F0`
41966
+ description: `\u76EE\u6807\u6210\u5458\u6240\u5C5E\u90E8\u95E8\u540D\u79F0\uFF1B\u4F7F\u7528 target_mailbox_id \u65F6\u53EF\u7701\u7565`
41675
41967
  },
41676
41968
  member_name: {
41677
41969
  type: `string`,
41678
- description: `\u76EE\u6807\u6210\u5458\u7684\u540D\u79F0`
41970
+ description: `\u76EE\u6807\u6210\u5458\u540D\u79F0\uFF1B\u4F7F\u7528 target_mailbox_id \u65F6\u53EF\u7701\u7565`
41971
+ },
41972
+ target_mailbox_id: {
41973
+ type: `string`,
41974
+ description: `\u53EF\u9009\uFF1A\u5DF2\u77E5\u5BF9\u65B9 mailbox \u5730\u5740\u65F6\u76F4\u63A5\u586B\u5199\uFF0C\u4F8B\u5982 Department::Member`
41679
41975
  },
41680
41976
  content: {
41681
41977
  type: `string`,
41682
41978
  description: `\u8981\u6295\u9001\u7ED9\u5BF9\u65B9\u7684\u4FE1\u606F\u5185\u5BB9`
41979
+ },
41980
+ reason: {
41981
+ type: `string`,
41982
+ description: `\u53EF\u9009\uFF1A\u8DE8\u9ED8\u8BA4\u7EC4\u7EC7\u94FE\u8DEF\u6C9F\u901A\u7684\u539F\u56E0\uFF0C\u4FBF\u4E8E\u5BA1\u8BA1`
41683
41983
  }
41684
41984
  },
41685
- required: [`team_name`, `member_name`, `content`]
41985
+ required: [`content`]
41686
41986
  },
41687
41987
  async execute(input, userRequest) {
41688
41988
  if (!userRequest) {
41689
- throw new Error(`[teamCommunicate] userRequest\u4E0D\u80FD\u4E3A\u7A7A`);
41989
+ throw new Error(`[departmentCommunicate] userRequest\u4E0D\u80FD\u4E3A\u7A7A`);
41690
41990
  }
41691
- const teamName = input.team_name;
41991
+ const departmentName = input.department_name;
41692
41992
  const memberName = input.member_name;
41993
+ const targetMailboxId = input.target_mailbox_id;
41693
41994
  const content = input.content;
41694
- const targetMember = getTeamMemberByName(teamName, memberName);
41695
- if (!targetMember) {
41696
- return `[teamCommunicate] \u4E0D\u5B58\u5728 ${teamName} \u56E2\u961F\u7684\u6210\u5458: ${memberName}`;
41995
+ const reason = input.reason;
41996
+ let toMailboxId = targetMailboxId;
41997
+ let targetMember = targetMailboxId ? getDepartmentMemberByMailboxId(targetMailboxId) : null;
41998
+ if (!toMailboxId) {
41999
+ if (!departmentName || !memberName) {
42000
+ return `[departmentCommunicate] department_name/member_name \u6216 target_mailbox_id \u81F3\u5C11\u9700\u8981\u63D0\u4F9B\u4E00\u79CD`;
42001
+ }
42002
+ targetMember = getDepartmentMemberByName(departmentName, memberName);
42003
+ if (!targetMember) {
42004
+ return `[departmentCommunicate] \u4E0D\u5B58\u5728 ${departmentName} \u90E8\u95E8\u7684\u6210\u5458: ${memberName}`;
42005
+ }
42006
+ toMailboxId = getMailBoxId(departmentName, memberName);
41697
42007
  }
41698
- const toMailboxId = getMailBoxId(teamName, memberName);
41699
42008
  let fromMailboxId;
41700
- const teamAgentId = userRequest.teamAgentId;
41701
- if (teamAgentId) {
41702
- const resolved = teamAgentId.includes(`::`) ? teamAgentId : getMailBoxIdFromTeammateId(teamAgentId);
42009
+ const departmentAgentId = userRequest.departmentAgentId;
42010
+ const actorMember = departmentAgentId ? getDepartmentMemberByMailboxId(
42011
+ departmentAgentId.includes(`::`) ? departmentAgentId : getMailBoxIdFromDepartmentMemberId(departmentAgentId) ?? departmentAgentId
42012
+ ) : null;
42013
+ if (departmentAgentId) {
42014
+ const resolved = departmentAgentId.includes(`::`) ? departmentAgentId : getMailBoxIdFromDepartmentMemberId(departmentAgentId);
41703
42015
  if (!resolved) {
41704
- return `[teamCommunicate] \u65E0\u6CD5\u83B7\u53D6\u5F53\u524Dagent\u7684mailboxId\uFF0CteamAgentId: ${teamAgentId}`;
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`;
42016
+ return `[departmentCommunicate] \u65E0\u6CD5\u83B7\u53D6\u5F53\u524D agent \u7684 mailboxId\uFF0CdepartmentAgentId: ${departmentAgentId}`;
41712
42017
  }
41713
42018
  fromMailboxId = resolved;
41714
42019
  } else {
41715
- if (targetMember.role !== "team_manager") {
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;
42020
+ fromMailboxId = CEO_MAILBOX_ID;
41719
42021
  }
41720
- const options = {};
41721
- if (!teamAgentId) {
42022
+ const isCrossDepartment = Boolean(actorMember && targetMember && actorMember.departmentId !== targetMember.departmentId);
42023
+ const isKnownAddressPath = Boolean(targetMailboxId);
42024
+ const options = {
42025
+ auditDetail: {
42026
+ communicationPolicy: "allowed_known_address",
42027
+ isKnownAddressPath,
42028
+ isCrossDepartment,
42029
+ actorRole: actorMember?.role ?? "ceo",
42030
+ targetRole: targetMember?.role ?? "unknown",
42031
+ reason: reason ?? null
42032
+ }
42033
+ };
42034
+ if (!departmentAgentId) {
41722
42035
  options.originUserId = userRequest.userId;
41723
42036
  options.originPlatform = userRequest.platform;
41724
42037
  }
41725
42038
  try {
41726
42039
  sendMessage2(fromMailboxId, toMailboxId, content, options);
41727
42040
  } catch (err) {
41728
- const err_msg = err;
41729
- return `[teamCommunicate] \u53D1\u9001\u6D88\u606F\u5931\u8D25: ${err_msg.message}`;
42041
+ return `[departmentCommunicate] \u53D1\u9001\u6D88\u606F\u5931\u8D25: ${err.message}`;
41730
42042
  }
41731
- return `[teamCommunicate] \u6D88\u606F\u5DF2\u53D1\u9001\u5230 ${teamName} \u56E2\u961F\u7684 ${memberName} \u6210\u5458\u7684 mailbox`;
42043
+ return `[departmentCommunicate] \u6D88\u606F\u5DF2\u53D1\u9001\u5230 ${toMailboxId}`;
41732
42044
  }
41733
42045
  };
41734
42046
 
41735
- // src/tools/tools/team/TeamDelete.ts
42047
+ // src/tools/tools/department/DepartmentDelete.ts
41736
42048
  var DESCRIPTION22 = `
41737
- \u5220\u9664\u56E2\u961F
42049
+ \u5220\u9664\u90E8\u95E8\u3002
41738
42050
 
41739
42051
  \u5DE5\u5177\u8C03\u7528\u89C4\u5219\uFF1A
41740
- - \u5F53\u7528\u6237\u8981\u6C42\u5220\u9664\u56E2\u961F\u65F6\u8C03\u7528\u6B64\u5DE5\u5177\u3002
41741
- - \u5F53\u56E2\u961F\u5DF2\u7ECF\u4E0D\u518D\u9700\u8981\u4E3A\u5BF9\u5E94\u76EE\u6807\u800C\u5DE5\u4F5C\u65F6\uFF0C\u8BE2\u95EE\u7528\u6237\u662F\u5426\u89E3\u6563\u8BE5\u56E2\u961F\u3002
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
42052
+ - \u89E3\u6563\u90E8\u95E8\u662F\u4E0D\u53EF\u9006\u64CD\u4F5C\uFF0C\u5FC5\u987B\u5148\u5F81\u5F97\u7528\u6237\u660E\u786E\u786E\u8BA4\u3002
42053
+ - \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
42054
  - \u4E25\u7981\u5728\u672A\u5F97\u5230\u7528\u6237\u660E\u786E\u786E\u8BA4\u7684\u60C5\u51B5\u4E0B\u76F4\u63A5\u4F20 confirmed=true\u3002
41745
42055
  `;
41746
- var teamDelete = {
41747
- name: `team_delete`,
42056
+ var departmentDelete = {
42057
+ name: `department_delete`,
41748
42058
  description: DESCRIPTION22,
41749
42059
  input_schema: {
41750
42060
  type: `object`,
41751
42061
  properties: {
41752
42062
  name: {
41753
42063
  type: `string`,
41754
- description: `\u8981\u5220\u9664\u7684\u56E2\u961F\u540D\u79F0`
42064
+ description: `\u8981\u5220\u9664\u7684\u90E8\u95E8\u540D\u79F0`
41755
42065
  },
41756
42066
  confirmed: {
41757
42067
  type: `boolean`,
41758
- description: `\u7528\u6237\u662F\u5426\u5DF2\u660E\u786E\u786E\u8BA4\u89E3\u6563\u8BE5\u56E2\u961F\u3002\u9ED8\u8BA4 false\uFF1B\u9996\u6B21\u8C03\u7528\u4F20 false \u6216\u4E0D\u4F20\uFF0C\u5F97\u5230\u7528\u6237\u660E\u786E\u540C\u610F\u540E\u518D\u4EE5 true \u91CD\u65B0\u8C03\u7528\u3002`
42068
+ description: `\u7528\u6237\u662F\u5426\u5DF2\u660E\u786E\u786E\u8BA4\u89E3\u6563\u8BE5\u90E8\u95E8`
41759
42069
  }
41760
42070
  },
41761
42071
  required: [`name`]
41762
42072
  },
41763
- async execute(input, userRequest) {
42073
+ async execute(input) {
41764
42074
  const name = input.name;
41765
42075
  const confirmed = input.confirmed ?? false;
41766
42076
  if (!confirmed) {
41767
- return `[teamDelete] \u89E3\u6563\u56E2\u961F\u662F\u4E0D\u53EF\u9006\u64CD\u4F5C\uFF0C\u8BF7\u5148\u7528 send_message \u5411\u7528\u6237\u786E\u8BA4"\u662F\u5426\u89E3\u6563\u56E2\u961F ${name}"\uFF0C\u5F97\u5230\u7528\u6237\u660E\u786E\u540C\u610F\u540E\uFF0C\u518D\u4EE5 confirmed=true \u91CD\u65B0\u8C03\u7528\u672C\u5DE5\u5177\u3002`;
42077
+ 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
42078
  }
41769
42079
  try {
41770
- const members = listTeamMember(name);
42080
+ const members = listDepartmentMembers(name);
41771
42081
  let totalCancelled = 0;
41772
42082
  for (const member of members) {
41773
42083
  const mailboxId = getMailBoxId(name, member.name);
41774
42084
  totalCancelled += cancelMailboxMessages(mailboxId);
41775
42085
  }
41776
42086
  if (totalCancelled > 0) {
41777
- console.log(`[teamDelete] \u5DF2\u53D6\u6D88\u56E2\u961F ${name} \u7684 ${totalCancelled} \u6761\u6B8B\u7559 mailbox \u6D88\u606F`);
42087
+ console.log(`[departmentDelete] \u5DF2\u53D6\u6D88\u90E8\u95E8 ${name} \u7684 ${totalCancelled} \u6761\u6B8B\u7559 mailbox \u6D88\u606F`);
41778
42088
  }
41779
- deleteTeam(name);
42089
+ deleteDepartment(name);
41780
42090
  } catch (err) {
41781
- const err_msg = err;
41782
- return `[teamDelete] \u5220\u9664\u56E2\u961F\u5931\u8D25: ${err_msg.message}`;
42091
+ return `[departmentDelete] \u5220\u9664\u90E8\u95E8\u5931\u8D25: ${err.message}`;
41783
42092
  }
41784
- return `[teamDelete] \u5220\u9664\u56E2\u961F\u6210\u529F: ${name}`;
42093
+ return `[departmentDelete] \u5220\u9664\u90E8\u95E8\u6210\u529F: ${name}`;
41785
42094
  }
41786
42095
  };
41787
42096
 
41788
- // src/tools/tools/team/TeamList.ts
42097
+ // src/tools/tools/department/DepartmentList.ts
41789
42098
  var DESCRIPTION23 = `
41790
- \u5217\u51FA\u6240\u6709\u56E2\u961F\u3002\u8BE5\u5DE5\u5177\u9762\u5411\u4E3B Manager\uFF0C\u53EA\u8FD4\u56DE\u56E2\u961F\u4E0E Team Manager \u4FE1\u606F\uFF0C\u4E0D\u66B4\u9732\u666E\u901A\u6210\u5458\u660E\u7EC6\u3002
42099
+ \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
42100
 
41792
42101
  \u5DE5\u5177\u8C03\u7528\u89C4\u5219\uFF1A
41793
- - \u5F53\u7528\u6237\u8981\u6C42\u5217\u51FA\u6240\u6709\u56E2\u961F\u65F6\u8C03\u7528\u6B64\u5DE5\u5177\u3002
41794
- - \u5F53\u4E0D\u6E05\u695A\u73B0\u5B58\u6709\u54EA\u4E9B\u56E2\u961F\u65F6\u53EF\u4EE5\u4F7F\u7528\u3002
42102
+ - \u5F53\u7528\u6237\u8981\u6C42\u5217\u51FA\u6240\u6709\u90E8\u95E8\u65F6\u8C03\u7528\u6B64\u5DE5\u5177\u3002
42103
+ - \u5F53\u590D\u6742\u4EFB\u52A1\u9700\u8981\u5224\u65AD\u73B0\u6709\u90E8\u95E8\u804C\u8D23\u65F6\u8C03\u7528\u6B64\u5DE5\u5177\u3002
41795
42104
  `;
41796
- var teamList = {
41797
- name: `team_list`,
42105
+ var departmentList = {
42106
+ name: `department_list`,
41798
42107
  description: DESCRIPTION23,
41799
42108
  input_schema: {
41800
42109
  type: `object`,
41801
42110
  properties: {},
41802
42111
  required: []
41803
42112
  },
41804
- async execute(input, userRequest) {
41805
- const teams = listTeams();
41806
- if (teams.length === 0) {
41807
- return `[teamList] \u5F53\u524D\u6CA1\u6709\u4EFB\u4F55\u56E2\u961F\u3002`;
41808
- }
41809
- const visibleTeams = teams.map((team) => {
41810
- const manager = team.managerMemberId ? team.teamMembers.find((member) => member.id === team.managerMemberId) : team.teamMembers.find((member) => member.role === "team_manager");
41811
- const workers = team.teamMembers.filter((member) => member.id !== manager?.id);
42113
+ async execute() {
42114
+ const departments = listDepartments();
42115
+ if (departments.length === 0) {
42116
+ return `[departmentList] \u5F53\u524D\u6CA1\u6709\u4EFB\u4F55\u90E8\u95E8\u3002`;
42117
+ }
42118
+ const visibleDepartments = departments.map((department) => {
42119
+ const head = department.headMemberId ? department.departmentMembers.find((member) => member.id === department.headMemberId) : department.departmentMembers.find((member) => member.role === "department_head");
42120
+ const executors = department.departmentMembers.filter((member) => member.id !== head?.id);
41812
42121
  return {
41813
- id: team.id,
41814
- name: team.name,
41815
- goalId: team.goalId,
41816
- workpath: team.workpath,
41817
- manager: manager ? {
41818
- id: manager.id,
41819
- name: manager.name,
41820
- mailBoxId: manager.mailBoxId,
41821
- focusOn: manager.focusOn
42122
+ id: department.id,
42123
+ name: department.name,
42124
+ sourceGoalId: department.sourceGoalId,
42125
+ charter: department.charter,
42126
+ workpath: department.workpath,
42127
+ head: head ? {
42128
+ id: head.id,
42129
+ name: head.name,
42130
+ mailBoxId: head.mailBoxId,
42131
+ focusOn: head.focusOn
41822
42132
  } : null,
41823
- workerCount: workers.length
42133
+ executorCount: executors.length
41824
42134
  };
41825
42135
  });
41826
- return `[teamList] \u627E\u5230\u56E2\u961F: ${JSON.stringify(visibleTeams)}`;
42136
+ return `[departmentList] \u627E\u5230\u90E8\u95E8: ${JSON.stringify(visibleDepartments)}`;
41827
42137
  }
41828
42138
  };
41829
42139
 
41830
- // src/tools/tools/team/TeamMemberCreate.ts
41831
- var import_node_crypto4 = require("node:crypto");
42140
+ // src/tools/tools/department/DepartmentMemberCreate.ts
42141
+ var import_node_crypto5 = require("node:crypto");
41832
42142
  var DESCRIPTION24 = `
41833
- \u521B\u5EFA\u56E2\u961F\u6210\u5458
42143
+ \u521B\u5EFA\u90E8\u95E8\u6210\u5458\u3002
41834
42144
 
41835
- \u5DE5\u5177\u8C03\u7528\u89C4\u5219\uFF1A
41836
- - \u4E3B Manager \u53EA\u80FD\u7528\u8BE5\u5DE5\u5177\u521B\u5EFA Team Manager\u3002
41837
- - Team Manager \u53EF\u4EE5\u7528\u8BE5\u5DE5\u5177\u5728\u81EA\u5DF1\u56E2\u961F\u5185\u521B\u5EFA\u666E\u901A worker\u3002
41838
- - Team Manager \u4E0D\u80FD\u4E3A\u5176\u4ED6\u56E2\u961F\u521B\u5EFA\u6210\u5458\u3002
42145
+ \u7BA1\u7406\u6743\u9650\uFF1A
42146
+ - CEO \u53EA\u80FD\u521B\u5EFA Department Head\u3002
42147
+ - Department Head \u53EF\u4EE5\u5728\u81EA\u5DF1\u90E8\u95E8\u5185\u521B\u5EFA Executor\u3002
42148
+ - Executor \u4E0D\u80FD\u521B\u5EFA\u6210\u5458\u3002
41839
42149
  `;
41840
- var teamMemberCreate = {
41841
- name: `team_member_create`,
42150
+ var departmentMemberCreate = {
42151
+ name: `department_member_create`,
41842
42152
  description: DESCRIPTION24,
41843
42153
  input_schema: {
41844
42154
  type: `object`,
41845
42155
  properties: {
41846
42156
  name: {
41847
42157
  type: `string`,
41848
- description: `\u56E2\u961F\u6210\u5458\u540D\u5B57`
42158
+ description: `\u90E8\u95E8\u6210\u5458\u540D\u79F0`
41849
42159
  },
41850
- teamName: {
42160
+ departmentName: {
41851
42161
  type: `string`,
41852
- description: `\u6210\u5458\u6240\u5C5E\u56E2\u961F\u540D\u79F0\uFF0C\u4E0D\u8981\u81C6\u9020`
42162
+ description: `\u6210\u5458\u6240\u5C5E\u90E8\u95E8\u540D\u79F0\uFF0C\u4E0D\u8981\u81C6\u9020`
41853
42163
  },
41854
42164
  focusOn: {
41855
42165
  type: `string`,
41856
- description: `\u8BE6\u7EC6\u63CF\u8FF0\u8FD9\u4E2A\u6210\u5458\u7684\u4E3B\u8981\u4EFB\u52A1\u662F\u4EC0\u4E48\uFF0C\u4EE5\u53CA\u884C\u4E3A\u89C4\u8303`
42166
+ 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
42167
  },
41858
42168
  role: {
41859
42169
  type: `string`,
41860
- enum: [`team_manager`, `worker`],
41861
- description: `\u6210\u5458\u89D2\u8272\u3002\u4E3BManager\u521B\u5EFA\u56E2\u961F\u7EC4\u957F\u65F6\u4F20 team_manager\uFF1BTeam Manager\u521B\u5EFA\u6267\u884C\u6210\u5458\u65F6\u4F20 worker`
42170
+ enum: [`department_head`, `executor`],
42171
+ 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
42172
  }
41863
42173
  },
41864
- required: [`name`, `teamName`, `focusOn`]
42174
+ required: [`name`, `departmentName`, `focusOn`]
41865
42175
  },
41866
42176
  async execute(input, userRequest) {
41867
42177
  const name = input.name;
41868
- const teamName = input.teamName;
42178
+ const departmentName = input.departmentName;
41869
42179
  const requestedRole = input.role;
41870
- const team = getTeam(teamName);
41871
- if (!team) return `[teamMemberCreate] \u4E0D\u5B58\u5728\u540D\u79F0\u4E3A ${teamName} \u7684\u56E2\u961F`;
42180
+ const department = getDepartment(departmentName);
42181
+ if (!department) return `[departmentMemberCreate] \u4E0D\u5B58\u5728\u540D\u79F0\u4E3A ${departmentName} \u7684\u90E8\u95E8`;
41872
42182
  const focusOn = input.focusOn;
41873
- const currentMailboxId = userRequest?.teamAgentId;
42183
+ const currentMailboxId = userRequest?.departmentAgentId;
41874
42184
  let role;
41875
42185
  if (currentMailboxId) {
41876
- const currentMember = getTeamMemberByMailboxId(currentMailboxId);
42186
+ const currentMember = getDepartmentMemberByMailboxId(currentMailboxId);
41877
42187
  if (!currentMember) {
41878
- return `[teamMemberCreate] \u65E0\u6CD5\u8BC6\u522B\u5F53\u524D\u56E2\u961F\u6210\u5458: ${currentMailboxId}`;
42188
+ return `[departmentMemberCreate] \u65E0\u6CD5\u8BC6\u522B\u5F53\u524D\u90E8\u95E8\u6210\u5458: ${currentMailboxId}`;
41879
42189
  }
41880
- if (currentMember.role !== "team_manager") {
41881
- return `[teamMemberCreate] \u53EA\u6709Team Manager\u53EF\u4EE5\u521B\u5EFA\u666E\u901A\u6210\u5458`;
42190
+ if (currentMember.role !== "department_head") {
42191
+ return `[departmentMemberCreate] \u53EA\u6709 Department Head \u53EF\u4EE5\u521B\u5EFA Executor`;
41882
42192
  }
41883
- if (currentMember.teamId !== team.id) {
41884
- return `[teamMemberCreate] Team Manager\u53EA\u80FD\u5728\u81EA\u5DF1\u6240\u5C5E\u56E2\u961F\u5185\u521B\u5EFA\u6210\u5458`;
42193
+ if (currentMember.departmentId !== department.id) {
42194
+ return `[departmentMemberCreate] Department Head \u53EA\u80FD\u5728\u81EA\u5DF1\u6240\u5C5E\u90E8\u95E8\u5185\u521B\u5EFA\u6210\u5458`;
41885
42195
  }
41886
- role = requestedRole ?? "worker";
41887
- if (role === "team_manager") {
41888
- return `[teamMemberCreate] \u56E2\u961F\u5DF2\u7531\u5F53\u524DTeam Manager\u7BA1\u7406\uFF0C\u4E0D\u80FD\u7531Team Manager\u518D\u521B\u5EFATeam Manager`;
42196
+ role = requestedRole ?? "executor";
42197
+ if (role === "department_head") {
42198
+ return `[departmentMemberCreate] \u90E8\u95E8\u5DF2\u7531\u5F53\u524D Department Head \u7BA1\u7406\uFF0C\u4E0D\u80FD\u7531 Department Head \u518D\u521B\u5EFA Department Head`;
41889
42199
  }
41890
42200
  } else {
41891
- role = requestedRole ?? "team_manager";
41892
- if (role !== "team_manager") {
41893
- return `[teamMemberCreate] \u4E3BManager\u53EA\u80FD\u521B\u5EFATeam Manager\uFF1B\u666E\u901A\u6210\u5458\u5E94\u7531Team Manager\u521B\u5EFA`;
42201
+ role = requestedRole ?? "department_head";
42202
+ if (role !== "department_head") {
42203
+ return `[departmentMemberCreate] CEO \u53EA\u80FD\u521B\u5EFA Department Head\uFF1BExecutor \u5E94\u7531 Department Head \u521B\u5EFA`;
41894
42204
  }
41895
42205
  }
41896
- let teamMember = {
41897
- id: (0, import_node_crypto4.randomUUID)().slice(0, 8),
42206
+ let departmentMember = {
42207
+ id: (0, import_node_crypto5.randomUUID)().slice(0, 8),
41898
42208
  name,
41899
- teamId: team.id,
41900
- mailBoxId: getMailBoxId(team.name, name),
41901
- workspaceId: getWorkspaceId(team.name, name),
42209
+ departmentId: department.id,
42210
+ mailBoxId: getMailBoxId(department.name, name),
42211
+ workspaceId: getWorkspaceId(department.name, name),
41902
42212
  role,
41903
42213
  focusOn
41904
42214
  };
41905
42215
  try {
41906
- teamMember = createTeamMember(teamMember);
42216
+ departmentMember = createDepartmentMember(departmentMember);
41907
42217
  } catch (err) {
41908
- const err_msg = err;
41909
- return `[teamMemberCreate] \u521B\u5EFA\u56E2\u961F\u6210\u5458\u5931\u8D25: ${err_msg.message}`;
42218
+ return `[departmentMemberCreate] \u521B\u5EFA\u90E8\u95E8\u6210\u5458\u5931\u8D25: ${err.message}`;
41910
42219
  }
41911
- return `[teamMemberCreate] \u521B\u5EFA\u56E2\u961F\u6210\u5458\u6210\u529F: ${JSON.stringify(teamMember)}`;
42220
+ return `[departmentMemberCreate] \u521B\u5EFA\u90E8\u95E8\u6210\u5458\u6210\u529F: ${JSON.stringify(departmentMember)}`;
41912
42221
  }
41913
42222
  };
41914
42223
 
41915
- // src/tools/tools/team/TeamMemberDelete.ts
42224
+ // src/tools/tools/department/DepartmentMemberDelete.ts
41916
42225
  var DESCRIPTION25 = `
41917
- \u5220\u9664\u56E2\u961F\u6210\u5458
42226
+ \u5220\u9664\u90E8\u95E8\u6210\u5458\u3002
41918
42227
 
41919
42228
  \u5DE5\u5177\u8C03\u7528\u89C4\u5219\uFF1A
41920
- - \u6CE8\u610F\uFF0C\u6B64\u5DE5\u5177\u5FC5\u987B\u662F\u7528\u6237\u660E\u786E\u8981\u6C42\u5220\u9664\u5176\u4E2D\u67D0\u4E00\u4E2A\u6210\u5458\u65F6\u4F7F\u7528\uFF0C\u667A\u80FD\u4F53\u4E0D\u80FD\u4E3B\u52A8\u8C03\u7528\u6B64\u5DE5\u5177\uFF01\u5F53\u7528\u6237\u6CA1\u6709\u660E\u786E\u8981\u6C42\u5220\u9664\u65F6\u667A\u80FD\u4F53\u4E3B\u52A8\u5220\u9664\u662F\u4E07\u4E07\u4E0D\u5141\u8BB8\u7684\u3002
42229
+ - \u5FC5\u987B\u662F\u7528\u6237\u660E\u786E\u8981\u6C42\u5220\u9664\u6210\u5458\u65F6\u4F7F\u7528\u3002
42230
+ - Department Head \u53EA\u80FD\u5220\u9664\u81EA\u5DF1\u90E8\u95E8\u5185\u7684 Executor\uFF0C\u4E0D\u80FD\u5220\u9664 Department Head\u3002
42231
+ - CEO \u53EF\u4EE5\u5728\u7528\u6237\u660E\u786E\u8981\u6C42\u65F6\u5220\u9664\u90E8\u95E8\u6210\u5458\u3002
41921
42232
  `;
41922
- var teamMemberDelete = {
41923
- name: `team_member_delete`,
42233
+ var departmentMemberDelete = {
42234
+ name: `department_member_delete`,
41924
42235
  description: DESCRIPTION25,
41925
42236
  input_schema: {
41926
42237
  type: `object`,
41927
42238
  properties: {
41928
- team_name: {
42239
+ department_name: {
41929
42240
  type: `string`,
41930
- description: `\u5F85\u5220\u9664\u7684\u6210\u5458\u5BF9\u5E94\u7684\u56E2\u961F\u540D\u79F0`
42241
+ description: `\u5F85\u5220\u9664\u6210\u5458\u6240\u5C5E\u90E8\u95E8\u540D\u79F0`
41931
42242
  },
41932
- teammate_id: {
42243
+ member_id: {
41933
42244
  type: `string`,
41934
- description: `\u5F85\u5220\u9664\u7684\u6210\u5458id`
42245
+ description: `\u5F85\u5220\u9664\u6210\u5458 id`
41935
42246
  }
41936
42247
  },
41937
- required: [`team_name`, `teammate_id`]
42248
+ required: [`department_name`, `member_id`]
41938
42249
  },
41939
42250
  async execute(input, userRequest) {
41940
- const teamName = input.team_name;
41941
- const teammateId = input.teammate_id;
42251
+ const departmentName = input.department_name;
42252
+ const memberId = input.member_id;
42253
+ const department = getDepartment(departmentName);
42254
+ if (!department) return `[departmentMemberDelete] \u4E0D\u5B58\u5728\u540D\u79F0\u4E3A ${departmentName} \u7684\u90E8\u95E8`;
42255
+ const member = getDepartmentMember(departmentName, memberId);
42256
+ if (!member) return `[departmentMemberDelete] \u627E\u4E0D\u5230\u6210\u5458: ${memberId}`;
42257
+ const currentMailboxId = userRequest?.departmentAgentId;
42258
+ if (currentMailboxId) {
42259
+ const currentMember = getDepartmentMemberByMailboxId(currentMailboxId);
42260
+ if (!currentMember) return `[departmentMemberDelete] \u65E0\u6CD5\u8BC6\u522B\u5F53\u524D\u90E8\u95E8\u6210\u5458: ${currentMailboxId}`;
42261
+ if (currentMember.role !== "department_head") return `[departmentMemberDelete] \u53EA\u6709 Department Head \u53EF\u4EE5\u5220\u9664 Executor`;
42262
+ if (currentMember.departmentId !== department.id) return `[departmentMemberDelete] Department Head \u53EA\u80FD\u7BA1\u7406\u81EA\u5DF1\u6240\u5C5E\u90E8\u95E8`;
42263
+ if (member.role === "department_head") return `[departmentMemberDelete] Department Head \u4E0D\u80FD\u5220\u9664 Department Head`;
42264
+ }
41942
42265
  try {
41943
- const member = getTeamMember(teamName, teammateId);
41944
- deleteTeamMemberById(teamName, teammateId);
41945
- if (member) {
41946
- const mailboxId = getMailBoxId(teamName, member.name);
41947
- const cancelled = cancelMailboxMessages(mailboxId);
41948
- if (cancelled > 0) {
41949
- console.log(`[teamMemberDelete] \u5DF2\u53D6\u6D88 ${cancelled} \u6761\u6B8B\u7559 mailbox \u6D88\u606F: ${mailboxId}`);
41950
- }
42266
+ deleteDepartmentMemberById(departmentName, memberId);
42267
+ const mailboxId = getMailBoxId(departmentName, member.name);
42268
+ const cancelled = cancelMailboxMessages(mailboxId);
42269
+ if (cancelled > 0) {
42270
+ console.log(`[departmentMemberDelete] \u5DF2\u53D6\u6D88 ${cancelled} \u6761\u6B8B\u7559 mailbox \u6D88\u606F: ${mailboxId}`);
41951
42271
  }
41952
42272
  } catch (err) {
41953
- const err_msg = err;
41954
- return `[teamMemberDelete] \u5220\u9664\u56E2\u961F\u6210\u5458\u5931\u8D25: ${err_msg.message}`;
42273
+ return `[departmentMemberDelete] \u5220\u9664\u90E8\u95E8\u6210\u5458\u5931\u8D25: ${err.message}`;
41955
42274
  }
41956
- return `[teamMemberDelete] \u5220\u9664\u56E2\u961F\u6210\u5458\u6210\u529F: ${JSON.stringify(teammateId)}`;
42275
+ return `[departmentMemberDelete] \u5220\u9664\u90E8\u95E8\u6210\u5458\u6210\u529F: ${JSON.stringify(memberId)}`;
41957
42276
  }
41958
42277
  };
41959
42278
 
41960
- // src/tools/tools/team/TeamMemberList.ts
42279
+ // src/tools/tools/department/DepartmentMemberList.ts
41961
42280
  var DESCRIPTION26 = `
41962
- \u67E5\u770B\u5F53\u524D Team Manager \u6240\u5C5E\u56E2\u961F\u7684\u6210\u5458\u76EE\u5F55\u3002
42281
+ \u67E5\u770B\u5F53\u524D Department Head \u6240\u5C5E\u90E8\u95E8\u7684\u6210\u5458\u76EE\u5F55\u3002
41963
42282
 
41964
42283
  \u4F7F\u7528\u8FB9\u754C\uFF1A
41965
- - \u4EC5 Team Manager \u53EF\u4EE5\u4F7F\u7528\u3002
41966
- - \u4E3B Manager \u4E0D\u5E94\u4E5F\u4E0D\u80FD\u7528\u8BE5\u5DE5\u5177\u67E5\u770B\u666E\u901A\u6210\u5458\u3002
41967
- - Team Manager \u53EA\u80FD\u67E5\u770B\u81EA\u5DF1\u6240\u5C5E\u56E2\u961F\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
42284
+ - \u4EC5 Department Head \u53EF\u4EE5\u4F7F\u7528\u3002
42285
+ - CEO \u9ED8\u8BA4\u901A\u8FC7 department_list \u53EA\u770B\u5230\u90E8\u95E8\u4E0E\u8D1F\u8D23\u4EBA\u6458\u8981\u3002
42286
+ - 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
42287
  `;
41969
- var teamMemberList = {
41970
- name: `team_member_list`,
42288
+ var departmentMemberList = {
42289
+ name: `department_member_list`,
41971
42290
  description: DESCRIPTION26,
41972
42291
  input_schema: {
41973
42292
  type: `object`,
@@ -41975,43 +42294,450 @@ var teamMemberList = {
41975
42294
  required: []
41976
42295
  },
41977
42296
  async execute(input, userRequest) {
41978
- const mailboxId = userRequest?.teamAgentId;
42297
+ const mailboxId = userRequest?.departmentAgentId;
41979
42298
  if (!mailboxId) {
41980
- return `[teamMemberList] \u53EA\u6709Team Manager\u53EF\u4EE5\u67E5\u770B\u56E2\u961F\u6210\u5458\u76EE\u5F55`;
42299
+ return `[departmentMemberList] \u53EA\u6709 Department Head \u53EF\u4EE5\u67E5\u770B\u90E8\u95E8\u6210\u5458\u76EE\u5F55`;
41981
42300
  }
41982
- const currentMember = getTeamMemberByMailboxId(mailboxId);
42301
+ const currentMember = getDepartmentMemberByMailboxId(mailboxId);
41983
42302
  if (!currentMember) {
41984
- return `[teamMemberList] \u65E0\u6CD5\u8BC6\u522B\u5F53\u524D\u56E2\u961F\u6210\u5458: ${mailboxId}`;
42303
+ return `[departmentMemberList] \u65E0\u6CD5\u8BC6\u522B\u5F53\u524D\u90E8\u95E8\u6210\u5458: ${mailboxId}`;
41985
42304
  }
41986
- if (currentMember.role !== "team_manager") {
41987
- return `[teamMemberList] \u5F53\u524D\u6210\u5458\u4E0D\u662FTeam Manager\uFF0C\u4E0D\u80FD\u67E5\u770B\u5B8C\u6574\u56E2\u961F\u6210\u5458\u76EE\u5F55`;
42305
+ if (currentMember.role !== "department_head") {
42306
+ return `[departmentMemberList] \u5F53\u524D\u6210\u5458\u4E0D\u662F Department Head\uFF0C\u4E0D\u80FD\u67E5\u770B\u5B8C\u6574\u90E8\u95E8\u6210\u5458\u76EE\u5F55`;
41988
42307
  }
41989
- const team = getTeamById(currentMember.teamId);
41990
- if (!team) {
41991
- return `[teamMemberList] \u627E\u4E0D\u5230\u5F53\u524D\u6210\u5458\u6240\u5C5E\u56E2\u961F: ${currentMember.teamId}`;
42308
+ const department = getDepartmentById(currentMember.departmentId);
42309
+ if (!department) {
42310
+ return `[departmentMemberList] \u627E\u4E0D\u5230\u5F53\u524D\u6210\u5458\u6240\u5C5E\u90E8\u95E8: ${currentMember.departmentId}`;
41992
42311
  }
41993
- const members = team.teamMembers.map((member) => ({
42312
+ const members = department.departmentMembers.map((member) => ({
41994
42313
  id: member.id,
41995
42314
  name: member.name,
41996
- role: member.role ?? "worker",
42315
+ role: member.role ?? "executor",
41997
42316
  mailBoxId: member.mailBoxId,
41998
42317
  workspaceId: member.workspaceId,
41999
42318
  focusOn: member.focusOn
42000
42319
  }));
42001
- return `[teamMemberList] ${team.name} \u56E2\u961F\u6210\u5458\u76EE\u5F55: ${JSON.stringify(members)}`;
42320
+ return `[departmentMemberList] ${department.name} \u90E8\u95E8\u6210\u5458\u76EE\u5F55: ${JSON.stringify(members)}`;
42002
42321
  }
42003
42322
  };
42004
42323
 
42005
- // src/tools/tools/team/MailboxFollowup.ts
42006
- var MANAGER_MAILBOX_ID2 = `manager`;
42324
+ // src/tools/tools/department/CheckDepartmentReplies.ts
42007
42325
  var DESCRIPTION27 = `
42326
+ \u67E5\u770B Department Head \u6216\u90E8\u95E8\u6210\u5458\u53D1\u7ED9 CEO \u7684\u5DE5\u4F5C\u56DE\u590D\u3002
42327
+
42328
+ \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
42329
+ `;
42330
+ var checkDepartmentReplies = {
42331
+ name: `check_department_replies`,
42332
+ description: DESCRIPTION27,
42333
+ input_schema: {
42334
+ type: `object`,
42335
+ properties: {
42336
+ from_member: {
42337
+ type: `string`,
42338
+ description: `\u53EF\u9009\uFF1A\u53EA\u67E5\u770B\u6307\u5B9A mailboxId \u7684\u56DE\u4FE1\uFF0C\u4E0D\u586B\u5219\u67E5\u770B\u6240\u6709\u56DE\u4FE1`
42339
+ }
42340
+ },
42341
+ required: []
42342
+ },
42343
+ async execute(input) {
42344
+ const db3 = createSqliteDB();
42345
+ const fromMember = input.from_member;
42346
+ let msgs;
42347
+ if (fromMember) {
42348
+ const stmt = db3.prepare(
42349
+ `SELECT id, to_mailbox_id as toMailboxId, from_mailbox_id as fromMailboxId, content, send_time as sendTime, status
42350
+ FROM mailbox
42351
+ WHERE to_mailbox_id = 'manager' AND from_mailbox_id = ? AND status in ('pending', 'processing', 'done')
42352
+ ORDER BY send_time ASC`
42353
+ );
42354
+ msgs = stmt.all(fromMember);
42355
+ } else {
42356
+ const stmt = db3.prepare(
42357
+ `SELECT id, to_mailbox_id as toMailboxId, from_mailbox_id as fromMailboxId, content, send_time as sendTime, status
42358
+ FROM mailbox
42359
+ WHERE to_mailbox_id = 'manager' AND status in ('pending', 'processing', 'done')
42360
+ ORDER BY send_time ASC`
42361
+ );
42362
+ msgs = stmt.all();
42363
+ }
42364
+ if (msgs.length === 0) {
42365
+ 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`;
42366
+ }
42367
+ const updateStmt = db3.prepare(`UPDATE mailbox SET status = 'read' WHERE id = ?`);
42368
+ for (const msg of msgs) {
42369
+ updateStmt.run(msg.id);
42370
+ }
42371
+ const replies = msgs.map((msg, i) => {
42372
+ const time = new Date(msg.sendTime).toLocaleString("zh-CN", { timeZone: "Asia/Shanghai" });
42373
+ return `--- \u56DE\u4FE1 ${i + 1} ---
42374
+ id: ${msg.id}
42375
+ \u6765\u81EA: ${msg.fromMailboxId}
42376
+ \u65F6\u95F4: ${time}
42377
+ \u72B6\u6001: ${msg.status}
42378
+ \u5185\u5BB9:
42379
+ ${msg.content}`;
42380
+ }).join("\n\n");
42381
+ return `[checkDepartmentReplies] \u6536\u5230 ${msgs.length} \u6761\u90E8\u95E8\u56DE\u4FE1\uFF1A
42382
+
42383
+ ${replies}`;
42384
+ }
42385
+ };
42386
+
42387
+ // src/department/learning.ts
42388
+ var import_node_fs3 = require("node:fs");
42389
+ var import_node_path11 = __toESM(require("node:path"));
42390
+ var import_node_crypto6 = require("node:crypto");
42391
+ var ensureDir = (dir) => (0, import_node_fs3.mkdirSync)(dir, { recursive: true });
42392
+ var readJsonArray = (filePath) => {
42393
+ if (!(0, import_node_fs3.existsSync)(filePath)) return [];
42394
+ return JSON.parse((0, import_node_fs3.readFileSync)(filePath, "utf-8"));
42395
+ };
42396
+ var writeJsonArray = (filePath, records) => {
42397
+ ensureDir(import_node_path11.default.dirname(filePath));
42398
+ (0, import_node_fs3.writeFileSync)(filePath, JSON.stringify(records, null, " "), "utf-8");
42399
+ };
42400
+ var departmentMemoryPath = (departmentName) => {
42401
+ return import_node_path11.default.join(getDepartmentWorkSpaceDir(departmentName), "department-memory.json");
42402
+ };
42403
+ var departmentSkillPath = (departmentName) => {
42404
+ return import_node_path11.default.join(getDepartmentWorkSpaceDir(departmentName), "department-skills.json");
42405
+ };
42406
+ var departmentSkillDir = (departmentName, skillName) => {
42407
+ return import_node_path11.default.join(getDepartmentWorkSpaceDir(departmentName), "skills", skillName);
42408
+ };
42409
+ var proposalsPath = () => {
42410
+ return import_node_path11.default.join(getDepartmentBaseDir(), "department-proposals.json");
42411
+ };
42412
+ var getDepartmentNameForHead = (request) => {
42413
+ const mailboxId = request?.departmentAgentId;
42414
+ if (!mailboxId) return null;
42415
+ const member = getDepartmentMemberByMailboxId(mailboxId);
42416
+ if (!member || member.role !== "department_head") return null;
42417
+ const [departmentName] = mailboxId.split("::");
42418
+ return departmentName || null;
42419
+ };
42420
+ var listDepartmentMemories = (departmentName) => {
42421
+ return readJsonArray(departmentMemoryPath(departmentName)).sort((a, b) => b.updatedAt - a.updatedAt);
42422
+ };
42423
+ var createDepartmentMemory = (departmentName, input) => {
42424
+ const now = Date.now();
42425
+ const memory = {
42426
+ id: (0, import_node_crypto6.randomUUID)().slice(0, 8),
42427
+ departmentName,
42428
+ title: input.title,
42429
+ content: input.content,
42430
+ sourceMailboxId: input.sourceMailboxId,
42431
+ createdAt: now,
42432
+ updatedAt: now
42433
+ };
42434
+ const records = listDepartmentMemories(departmentName);
42435
+ records.push(memory);
42436
+ writeJsonArray(departmentMemoryPath(departmentName), records);
42437
+ return memory;
42438
+ };
42439
+ var updateDepartmentMemory = (departmentName, id, patch) => {
42440
+ const records = listDepartmentMemories(departmentName);
42441
+ const idx = records.findIndex((record) => record.id === id);
42442
+ if (idx < 0) return null;
42443
+ records[idx] = {
42444
+ ...records[idx],
42445
+ ...patch.title !== void 0 ? { title: patch.title } : {},
42446
+ ...patch.content !== void 0 ? { content: patch.content } : {},
42447
+ updatedAt: Date.now()
42448
+ };
42449
+ writeJsonArray(departmentMemoryPath(departmentName), records);
42450
+ return records[idx];
42451
+ };
42452
+ var deleteDepartmentMemory = (departmentName, id) => {
42453
+ const records = listDepartmentMemories(departmentName);
42454
+ const target = records.find((record) => record.id === id) ?? null;
42455
+ writeJsonArray(departmentMemoryPath(departmentName), records.filter((record) => record.id !== id));
42456
+ return target;
42457
+ };
42458
+ var listDepartmentSkills = (departmentName) => {
42459
+ return readJsonArray(departmentSkillPath(departmentName)).sort((a, b) => b.updatedAt - a.updatedAt);
42460
+ };
42461
+ var proposeDepartmentSkill = (departmentName, input) => {
42462
+ const records = listDepartmentSkills(departmentName);
42463
+ if (records.some((record) => record.skillName === input.skillName && record.status !== "dropped")) {
42464
+ return null;
42465
+ }
42466
+ const now = Date.now();
42467
+ const skill = {
42468
+ id: (0, import_node_crypto6.randomUUID)().slice(0, 8),
42469
+ departmentName,
42470
+ skillName: input.skillName,
42471
+ description: input.description,
42472
+ skillMd: input.skillMd,
42473
+ status: "pending",
42474
+ createdByMailboxId: input.createdByMailboxId,
42475
+ createdAt: now,
42476
+ updatedAt: now
42477
+ };
42478
+ records.push(skill);
42479
+ writeJsonArray(departmentSkillPath(departmentName), records);
42480
+ return skill;
42481
+ };
42482
+ var keepDepartmentSkill = (departmentName, id) => {
42483
+ const records = listDepartmentSkills(departmentName);
42484
+ const idx = records.findIndex((record) => record.id === id);
42485
+ if (idx < 0) return null;
42486
+ records[idx] = { ...records[idx], status: "active", updatedAt: Date.now() };
42487
+ const skillDir = departmentSkillDir(departmentName, records[idx].skillName);
42488
+ ensureDir(skillDir);
42489
+ (0, import_node_fs3.writeFileSync)(import_node_path11.default.join(skillDir, "SKILL.md"), records[idx].skillMd, "utf-8");
42490
+ writeJsonArray(departmentSkillPath(departmentName), records);
42491
+ return records[idx];
42492
+ };
42493
+ var dropDepartmentSkill = (departmentName, id) => {
42494
+ const records = listDepartmentSkills(departmentName);
42495
+ const idx = records.findIndex((record) => record.id === id);
42496
+ if (idx < 0) return null;
42497
+ records[idx] = { ...records[idx], status: "dropped", updatedAt: Date.now() };
42498
+ writeJsonArray(departmentSkillPath(departmentName), records);
42499
+ return records[idx];
42500
+ };
42501
+ var createDepartmentProposal = (input) => {
42502
+ const records = readJsonArray(proposalsPath());
42503
+ const proposal = {
42504
+ ...input,
42505
+ id: (0, import_node_crypto6.randomUUID)().slice(0, 8),
42506
+ status: "pending",
42507
+ createdAt: Date.now()
42508
+ };
42509
+ records.push(proposal);
42510
+ writeJsonArray(proposalsPath(), records);
42511
+ return proposal;
42512
+ };
42513
+ var buildDepartmentLearningContext = (departmentName) => {
42514
+ if (!departmentName) return "";
42515
+ const memories = listDepartmentMemories(departmentName);
42516
+ const activeSkills = listDepartmentSkills(departmentName).filter((skill) => skill.status === "active");
42517
+ if (memories.length === 0 && activeSkills.length === 0) return "";
42518
+ const memoryLines = memories.map(
42519
+ (memory) => ` - [id=${memory.id}] ${memory.title}
42520
+ ${memory.content.replace(/\n/g, "\n ")}`
42521
+ ).join("\n");
42522
+ const skillLines = activeSkills.map(
42523
+ (skill) => ` - ${skill.skillName}: ${skill.description}`
42524
+ ).join("\n");
42525
+ return [
42526
+ `<department-learning-context department="${departmentName}">`,
42527
+ memories.length > 0 ? `Department memories:
42528
+ ${memoryLines}` : "",
42529
+ activeSkills.length > 0 ? `Department skills:
42530
+ ${skillLines}` : "",
42531
+ `</department-learning-context>`
42532
+ ].filter(Boolean).join("\n");
42533
+ };
42534
+
42535
+ // src/tools/tools/department/DepartmentLearning.ts
42536
+ var requireDepartmentHead = (request) => {
42537
+ return getDepartmentNameForHead(request);
42538
+ };
42539
+ var departmentMemoryList = {
42540
+ name: `department_memory_list`,
42541
+ 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`,
42542
+ input_schema: {
42543
+ type: `object`,
42544
+ properties: {
42545
+ departmentName: { type: `string`, description: `\u53EF\u9009\uFF1ACEO \u67E5\u770B\u6307\u5B9A\u90E8\u95E8\u65F6\u586B\u5199` }
42546
+ },
42547
+ required: []
42548
+ },
42549
+ async execute(input, userRequest) {
42550
+ const departmentName = input.departmentName || requireDepartmentHead(userRequest);
42551
+ if (!departmentName) return `[departmentMemoryList] \u8BF7\u63D0\u4F9B departmentName\uFF0C\u6216\u4EE5 Department Head \u8EAB\u4EFD\u8C03\u7528`;
42552
+ return `[departmentMemoryList] ${departmentName} \u90E8\u95E8\u8BB0\u5FC6: ${JSON.stringify(listDepartmentMemories(departmentName))}`;
42553
+ }
42554
+ };
42555
+ var departmentMemoryCreate = {
42556
+ name: `department_memory_create`,
42557
+ 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`,
42558
+ input_schema: {
42559
+ type: `object`,
42560
+ properties: {
42561
+ title: { type: `string`, description: `\u8BB0\u5FC6\u6807\u9898` },
42562
+ content: { type: `string`, description: `\u8BB0\u5FC6\u6B63\u6587` },
42563
+ sourceMailboxId: { type: `string`, description: `\u53EF\u9009\uFF1A\u6765\u6E90 mailbox/thread id` }
42564
+ },
42565
+ required: [`title`, `content`]
42566
+ },
42567
+ async execute(input, userRequest) {
42568
+ const departmentName = requireDepartmentHead(userRequest);
42569
+ if (!departmentName) return `[departmentMemoryCreate] \u53EA\u6709 Department Head \u53EF\u4EE5\u5199\u5165\u90E8\u95E8\u8BB0\u5FC6`;
42570
+ const memory = createDepartmentMemory(departmentName, {
42571
+ title: input.title,
42572
+ content: input.content,
42573
+ sourceMailboxId: input.sourceMailboxId
42574
+ });
42575
+ return `[departmentMemoryCreate] \u5DF2\u5199\u5165\u90E8\u95E8\u8BB0\u5FC6: ${JSON.stringify(memory)}`;
42576
+ }
42577
+ };
42578
+ var departmentMemoryUpdate = {
42579
+ name: `department_memory_update`,
42580
+ description: `\u7531 Department Head \u66F4\u65B0\u672C\u90E8\u95E8\u957F\u671F\u7ECF\u9A8C\u8BB0\u5FC6\u3002`,
42581
+ input_schema: {
42582
+ type: `object`,
42583
+ properties: {
42584
+ id: { type: `string`, description: `\u8BB0\u5FC6 id` },
42585
+ title: { type: `string`, description: `\u53EF\u9009\uFF1A\u65B0\u6807\u9898` },
42586
+ content: { type: `string`, description: `\u53EF\u9009\uFF1A\u65B0\u6B63\u6587` }
42587
+ },
42588
+ required: [`id`]
42589
+ },
42590
+ async execute(input, userRequest) {
42591
+ const departmentName = requireDepartmentHead(userRequest);
42592
+ if (!departmentName) return `[departmentMemoryUpdate] \u53EA\u6709 Department Head \u53EF\u4EE5\u66F4\u65B0\u90E8\u95E8\u8BB0\u5FC6`;
42593
+ const memory = updateDepartmentMemory(departmentName, input.id, {
42594
+ title: input.title,
42595
+ content: input.content
42596
+ });
42597
+ if (!memory) return `[departmentMemoryUpdate] \u672A\u627E\u5230\u90E8\u95E8\u8BB0\u5FC6: ${input.id}`;
42598
+ return `[departmentMemoryUpdate] \u5DF2\u66F4\u65B0\u90E8\u95E8\u8BB0\u5FC6: ${JSON.stringify(memory)}`;
42599
+ }
42600
+ };
42601
+ var departmentMemoryDelete = {
42602
+ name: `department_memory_delete`,
42603
+ description: `\u7531 Department Head \u5220\u9664\u672C\u90E8\u95E8\u957F\u671F\u7ECF\u9A8C\u8BB0\u5FC6\u3002`,
42604
+ input_schema: {
42605
+ type: `object`,
42606
+ properties: {
42607
+ id: { type: `string`, description: `\u8BB0\u5FC6 id` }
42608
+ },
42609
+ required: [`id`]
42610
+ },
42611
+ async execute(input, userRequest) {
42612
+ const departmentName = requireDepartmentHead(userRequest);
42613
+ if (!departmentName) return `[departmentMemoryDelete] \u53EA\u6709 Department Head \u53EF\u4EE5\u5220\u9664\u90E8\u95E8\u8BB0\u5FC6`;
42614
+ const memory = deleteDepartmentMemory(departmentName, input.id);
42615
+ if (!memory) return `[departmentMemoryDelete] \u672A\u627E\u5230\u90E8\u95E8\u8BB0\u5FC6: ${input.id}`;
42616
+ return `[departmentMemoryDelete] \u5DF2\u5220\u9664\u90E8\u95E8\u8BB0\u5FC6: ${JSON.stringify(memory)}`;
42617
+ }
42618
+ };
42619
+ var departmentSkillList = {
42620
+ name: `department_skill_list`,
42621
+ 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`,
42622
+ input_schema: {
42623
+ type: `object`,
42624
+ properties: {
42625
+ departmentName: { type: `string`, description: `\u53EF\u9009\uFF1ACEO \u67E5\u770B\u6307\u5B9A\u90E8\u95E8\u65F6\u586B\u5199` }
42626
+ },
42627
+ required: []
42628
+ },
42629
+ async execute(input, userRequest) {
42630
+ const departmentName = input.departmentName || requireDepartmentHead(userRequest);
42631
+ if (!departmentName) return `[departmentSkillList] \u8BF7\u63D0\u4F9B departmentName\uFF0C\u6216\u4EE5 Department Head \u8EAB\u4EFD\u8C03\u7528`;
42632
+ return `[departmentSkillList] ${departmentName} \u90E8\u95E8 Skill: ${JSON.stringify(listDepartmentSkills(departmentName))}`;
42633
+ }
42634
+ };
42635
+ var departmentSkillPropose = {
42636
+ name: `department_skill_propose`,
42637
+ 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`,
42638
+ input_schema: {
42639
+ type: `object`,
42640
+ properties: {
42641
+ skillName: { type: `string`, description: `\u6280\u80FD\u540D\uFF0Ckebab-case` },
42642
+ description: { type: `string`, description: `\u6280\u80FD\u63CF\u8FF0` },
42643
+ skillMd: { type: `string`, description: `\u5B8C\u6574 SKILL.md \u5185\u5BB9` }
42644
+ },
42645
+ required: [`skillName`, `description`, `skillMd`]
42646
+ },
42647
+ async execute(input, userRequest) {
42648
+ const departmentName = requireDepartmentHead(userRequest);
42649
+ if (!departmentName) return `[departmentSkillPropose] \u53EA\u6709 Department Head \u53EF\u4EE5\u63D0\u4EA4\u90E8\u95E8 Skill \u8349\u7A3F`;
42650
+ const skill = proposeDepartmentSkill(departmentName, {
42651
+ skillName: input.skillName,
42652
+ description: input.description,
42653
+ skillMd: input.skillMd,
42654
+ createdByMailboxId: userRequest?.departmentAgentId
42655
+ });
42656
+ if (!skill) return `[departmentSkillPropose] \u540C\u540D\u90E8\u95E8 Skill \u5DF2\u5B58\u5728\u6216\u5F85\u786E\u8BA4: ${input.skillName}`;
42657
+ return `[departmentSkillPropose] \u5DF2\u63D0\u4EA4\u90E8\u95E8 Skill \u8349\u7A3F: ${JSON.stringify(skill)}`;
42658
+ }
42659
+ };
42660
+ var departmentSkillKeep = {
42661
+ name: `department_skill_keep`,
42662
+ 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`,
42663
+ input_schema: {
42664
+ type: `object`,
42665
+ properties: {
42666
+ id: { type: `string`, description: `Skill \u8349\u7A3F id` }
42667
+ },
42668
+ required: [`id`]
42669
+ },
42670
+ async execute(input, userRequest) {
42671
+ const departmentName = requireDepartmentHead(userRequest);
42672
+ if (!departmentName) return `[departmentSkillKeep] \u53EA\u6709 Department Head \u53EF\u4EE5\u4FDD\u7559\u90E8\u95E8 Skill`;
42673
+ const skill = keepDepartmentSkill(departmentName, input.id);
42674
+ if (!skill) return `[departmentSkillKeep] \u672A\u627E\u5230\u90E8\u95E8 Skill: ${input.id}`;
42675
+ return `[departmentSkillKeep] \u5DF2\u4FDD\u7559\u90E8\u95E8 Skill: ${JSON.stringify(skill)}`;
42676
+ }
42677
+ };
42678
+ var departmentSkillDrop = {
42679
+ name: `department_skill_drop`,
42680
+ description: `\u7531 Department Head \u4E22\u5F03\u4E00\u4E2A\u90E8\u95E8 Skill \u8349\u7A3F\u3002`,
42681
+ input_schema: {
42682
+ type: `object`,
42683
+ properties: {
42684
+ id: { type: `string`, description: `Skill \u8349\u7A3F id` }
42685
+ },
42686
+ required: [`id`]
42687
+ },
42688
+ async execute(input, userRequest) {
42689
+ const departmentName = requireDepartmentHead(userRequest);
42690
+ if (!departmentName) return `[departmentSkillDrop] \u53EA\u6709 Department Head \u53EF\u4EE5\u4E22\u5F03\u90E8\u95E8 Skill`;
42691
+ const skill = dropDepartmentSkill(departmentName, input.id);
42692
+ if (!skill) return `[departmentSkillDrop] \u672A\u627E\u5230\u90E8\u95E8 Skill: ${input.id}`;
42693
+ return `[departmentSkillDrop] \u5DF2\u4E22\u5F03\u90E8\u95E8 Skill: ${JSON.stringify(skill)}`;
42694
+ }
42695
+ };
42696
+ var departmentProposalCreate = {
42697
+ name: `department_proposal_create`,
42698
+ 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`,
42699
+ input_schema: {
42700
+ type: `object`,
42701
+ properties: {
42702
+ title: { type: `string`, description: `\u63D0\u6848\u6807\u9898` },
42703
+ reason: { type: `string`, description: `\u4E3A\u4EC0\u4E48\u73B0\u6709\u90E8\u95E8\u4E0D\u5E94\u957F\u671F\u627F\u63A5\u8BE5\u804C\u8D23` },
42704
+ suggestedDepartmentName: { type: `string`, description: `\u5EFA\u8BAE\u65B0\u90E8\u95E8\u540D\u79F0` },
42705
+ suggestedCharter: { type: `string`, description: `\u5EFA\u8BAE\u65B0\u90E8\u95E8\u957F\u671F\u804C\u8D23` },
42706
+ evidenceThreadIds: {
42707
+ type: `array`,
42708
+ description: `\u53EF\u9009\uFF1A\u76F8\u5173 mailbox thread/message id`
42709
+ }
42710
+ },
42711
+ required: [`title`, `reason`, `suggestedDepartmentName`, `suggestedCharter`]
42712
+ },
42713
+ async execute(input, userRequest) {
42714
+ const departmentName = requireDepartmentHead(userRequest);
42715
+ if (!departmentName || !userRequest?.departmentAgentId) {
42716
+ return `[departmentProposalCreate] \u53EA\u6709 Department Head \u53EF\u4EE5\u521B\u5EFA\u65B0\u90E8\u95E8\u63D0\u6848`;
42717
+ }
42718
+ const proposal = createDepartmentProposal({
42719
+ proposerDepartmentName: departmentName,
42720
+ proposerMailboxId: userRequest.departmentAgentId,
42721
+ title: input.title,
42722
+ reason: input.reason,
42723
+ suggestedDepartmentName: input.suggestedDepartmentName,
42724
+ suggestedCharter: input.suggestedCharter,
42725
+ evidenceThreadIds: input.evidenceThreadIds ?? []
42726
+ });
42727
+ return `[departmentProposalCreate] \u5DF2\u521B\u5EFA\u65B0\u90E8\u95E8\u63D0\u6848\uFF0C\u5C06\u7531 CEO \u51B3\u5B9A\u662F\u5426\u91C7\u7EB3: ${JSON.stringify(proposal)}`;
42728
+ }
42729
+ };
42730
+
42731
+ // src/tools/tools/department/MailboxFollowup.ts
42732
+ var CEO_MAILBOX_ID2 = `manager`;
42733
+ var DESCRIPTION28 = `
42008
42734
  \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
42735
 
42010
42736
  \u9002\u7528\u573A\u666F\uFF1A
42011
42737
  - \u540C\u6B65\u9636\u6BB5\u6027\u8FDB\u5C55
42012
42738
  - \u4E3B\u52A8\u8FFD\u95EE\u6F84\u6E05\u4FE1\u606F
42013
42739
  - \u5148\u53D1\u51FA\u90E8\u5206\u7ED3\u679C\uFF0C\u7A0D\u540E\u7EE7\u7EED\u8865\u5145
42014
- - manager \u6536\u5230\u67D0\u4E2A\u56E2\u961F\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
42740
+ - 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
42741
 
42016
42742
  \u53C2\u6570\uFF1A
42017
42743
  - message_id: \u4F5C\u4E3A\u5F53\u524D\u7EBF\u7A0B\u951A\u70B9\u7684\u6D88\u606F id
@@ -42021,11 +42747,11 @@ var DESCRIPTION27 = `
42021
42747
  \u6CE8\u610F\uFF1A
42022
42748
  - \u6B64\u5DE5\u5177\u4E0D\u4F1A\u4FEE\u6539\u539F\u6D88\u606F\u72B6\u6001
42023
42749
  - \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 manager \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
42750
+ - \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
42751
  `;
42026
42752
  var mailboxFollowup = {
42027
42753
  name: `mailbox_followup`,
42028
- description: DESCRIPTION27,
42754
+ description: DESCRIPTION28,
42029
42755
  input_schema: {
42030
42756
  type: `object`,
42031
42757
  properties: {
@@ -42052,7 +42778,7 @@ var mailboxFollowup = {
42052
42778
  const messageId = input.message_id;
42053
42779
  const content = input.content;
42054
42780
  const kind = input.kind || `progress`;
42055
- const myMailboxId = userRequest.teamAgentId || MANAGER_MAILBOX_ID2;
42781
+ const myMailboxId = userRequest.departmentAgentId || CEO_MAILBOX_ID2;
42056
42782
  const db3 = createSqliteDB();
42057
42783
  const stmt = db3.prepare(
42058
42784
  `SELECT
@@ -42099,8 +42825,8 @@ var mailboxFollowup = {
42099
42825
 
42100
42826
  // src/tools/tools/Bash.ts
42101
42827
  var import_node_child_process = require("node:child_process");
42102
- var import_node_fs3 = require("node:fs");
42103
- var DESCRIPTION28 = `\u5728\u7CFB\u7EDF shell \u4E2D\u6267\u884C\u547D\u4EE4\u3002
42828
+ var import_node_fs4 = require("node:fs");
42829
+ var DESCRIPTION29 = `\u5728\u7CFB\u7EDF shell \u4E2D\u6267\u884C\u547D\u4EE4\u3002
42104
42830
 
42105
42831
  \u7528\u9014\uFF1A
42106
42832
  - \u8FD0\u884C shell \u547D\u4EE4\uFF08\u5982 ls\u3001mkdir\u3001npm\u3001git\u3001rg \u7B49\uFF09
@@ -42121,14 +42847,14 @@ var DESCRIPTION28 = `\u5728\u7CFB\u7EDF shell \u4E2D\u6267\u884C\u547D\u4EE4\u30
42121
42847
  \u6CE8\u610F\u4E8B\u9879\uFF1A
42122
42848
  - \u4E0D\u8981\u6267\u884C\u7834\u574F\u6027\u547D\u4EE4\uFF08\u5982 rm -rf /\uFF09
42123
42849
  - \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\u56E2\u961F\u5DE5\u4F5C\u533A\u6A21\u5F0F\uFF0Ccwd \u5FC5\u987B\u5728\u5DE5\u4F5C\u533A\u8303\u56F4\u5185
42850
+ - \u5982\u679C\u4F60\u5904\u4E8E\u90E8\u95E8\u5DE5\u4F5C\u533A\u6A21\u5F0F\uFF0Ccwd \u5FC5\u987B\u5728\u5DE5\u4F5C\u533A\u8303\u56F4\u5185
42125
42851
  `;
42126
42852
  var MAX_OUTPUT_LENGTH = 1e4;
42127
42853
  var SHELL_CANDIDATES2 = ["/bin/sh", "/usr/bin/sh", "/bin/bash"];
42128
42854
  function findExecutableShell2() {
42129
42855
  for (const shell of SHELL_CANDIDATES2) {
42130
42856
  try {
42131
- (0, import_node_fs3.accessSync)(shell, import_node_fs3.constants.X_OK);
42857
+ (0, import_node_fs4.accessSync)(shell, import_node_fs4.constants.X_OK);
42132
42858
  return shell;
42133
42859
  } catch {
42134
42860
  }
@@ -42137,11 +42863,11 @@ function findExecutableShell2() {
42137
42863
  }
42138
42864
  function validateCwd(cwd) {
42139
42865
  try {
42140
- const stat9 = (0, import_node_fs3.statSync)(cwd);
42866
+ const stat9 = (0, import_node_fs4.statSync)(cwd);
42141
42867
  if (!stat9.isDirectory()) {
42142
42868
  return `[bash] \u9519\u8BEF: cwd \u4E0D\u662F\u76EE\u5F55: ${cwd}`;
42143
42869
  }
42144
- (0, import_node_fs3.accessSync)(cwd, import_node_fs3.constants.R_OK | import_node_fs3.constants.X_OK);
42870
+ (0, import_node_fs4.accessSync)(cwd, import_node_fs4.constants.R_OK | import_node_fs4.constants.X_OK);
42145
42871
  return null;
42146
42872
  } catch (err) {
42147
42873
  const code = err.code;
@@ -42156,7 +42882,7 @@ function validateCwd(cwd) {
42156
42882
  }
42157
42883
  var bashTool = {
42158
42884
  name: `bash`,
42159
- description: DESCRIPTION28,
42885
+ description: DESCRIPTION29,
42160
42886
  input_schema: {
42161
42887
  type: `object`,
42162
42888
  properties: {
@@ -42233,7 +42959,7 @@ ${trimmed}`;
42233
42959
  };
42234
42960
 
42235
42961
  // src/tools/tools/SendFile.ts
42236
- var DESCRIPTION29 = `
42962
+ var DESCRIPTION30 = `
42237
42963
  \u53D1\u9001\u6587\u4EF6\u7ED9\u7528\u6237\u3002\u652F\u6301\u4E24\u79CD\u65B9\u5F0F\uFF1A
42238
42964
  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
42965
  2. \u8FDC\u7A0B URL\uFF08url\uFF09\uFF1A\u9002\u7528\u4E8E\u4ECE\u7F51\u7EDC\u83B7\u53D6\u7684\u6587\u4EF6
@@ -42258,7 +42984,7 @@ var inferFileType = (fileName) => {
42258
42984
  };
42259
42985
  var sendFile = {
42260
42986
  name: `send_file`,
42261
- description: DESCRIPTION29,
42987
+ description: DESCRIPTION30,
42262
42988
  input_schema: {
42263
42989
  type: `object`,
42264
42990
  properties: {
@@ -42317,13 +43043,23 @@ var createDefaultTools = (bg) => {
42317
43043
  registerTool(registry2, cronLogs);
42318
43044
  registerTool(registry2, sendMessage);
42319
43045
  registerTool(registry2, sendFile);
42320
- registerTool(registry2, teamCreate);
42321
- registerTool(registry2, teamList);
42322
- registerTool(registry2, teamDelete);
42323
- registerTool(registry2, teamMemberList);
42324
- registerTool(registry2, teamMemberCreate);
42325
- registerTool(registry2, teamMemberDelete);
42326
- registerTool(registry2, teamCommunicate);
43046
+ registerTool(registry2, departmentCreate);
43047
+ registerTool(registry2, departmentList);
43048
+ registerTool(registry2, departmentDelete);
43049
+ registerTool(registry2, departmentMemberList);
43050
+ registerTool(registry2, departmentMemberCreate);
43051
+ registerTool(registry2, departmentMemberDelete);
43052
+ registerTool(registry2, departmentCommunicate);
43053
+ registerTool(registry2, checkDepartmentReplies);
43054
+ registerTool(registry2, departmentMemoryList);
43055
+ registerTool(registry2, departmentMemoryCreate);
43056
+ registerTool(registry2, departmentMemoryUpdate);
43057
+ registerTool(registry2, departmentMemoryDelete);
43058
+ registerTool(registry2, departmentSkillList);
43059
+ registerTool(registry2, departmentSkillPropose);
43060
+ registerTool(registry2, departmentSkillKeep);
43061
+ registerTool(registry2, departmentSkillDrop);
43062
+ registerTool(registry2, departmentProposalCreate);
42327
43063
  registerTool(registry2, mailboxFollowup);
42328
43064
  return {
42329
43065
  registry: registry2,
@@ -42393,7 +43129,7 @@ var searchRecallIndex = async (storage, userId, query, date, limit = 8) => {
42393
43129
  };
42394
43130
 
42395
43131
  // src/tools/tools/RecallChatHistory.ts
42396
- var DESCRIPTION30 = `\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
43132
+ 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
43133
 
42398
43134
  \u4F7F\u7528\u6307\u5357\uFF1A
42399
43135
  - 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 +43184,7 @@ var formatRecallResult = (result, indexResult) => {
42448
43184
  };
42449
43185
  var recallChatHistory = (messageStorage, topicStorage, recallIndexStorage) => ({
42450
43186
  name: "recall_chat_history",
42451
- description: DESCRIPTION30,
43187
+ description: DESCRIPTION31,
42452
43188
  input_schema: {
42453
43189
  type: "object",
42454
43190
  properties: {
@@ -42788,10 +43524,10 @@ var readDreamHistoryLimit = () => {
42788
43524
  };
42789
43525
 
42790
43526
  // src/skillForge/SkillForgeEngine.ts
42791
- var import_node_fs4 = require("node:fs");
43527
+ var import_node_fs5 = require("node:fs");
42792
43528
  var import_node_os2 = require("node:os");
42793
- var import_node_path11 = require("node:path");
42794
- var import_node_crypto5 = require("node:crypto");
43529
+ var import_node_path12 = require("node:path");
43530
+ var import_node_crypto7 = require("node:crypto");
42795
43531
  var SkillForgeEngine = class {
42796
43532
  proposalStorage;
42797
43533
  draftRoot;
@@ -42799,8 +43535,8 @@ var SkillForgeEngine = class {
42799
43535
  constructor(deps) {
42800
43536
  this.proposalStorage = deps.proposalStorage;
42801
43537
  const opt = deps.options ?? {};
42802
- this.draftRoot = opt.draftRoot ?? (0, import_node_path11.join)((0, import_node_os2.homedir)(), ".duclaw", "skill-proposals");
42803
- this.skillsInstallDir = opt.skillsInstallDir ?? (0, import_node_path11.join)((0, import_node_os2.homedir)(), ".agents", "skills");
43538
+ this.draftRoot = opt.draftRoot ?? (0, import_node_path12.join)((0, import_node_os2.homedir)(), ".duclaw", "skill-proposals");
43539
+ this.skillsInstallDir = opt.skillsInstallDir ?? (0, import_node_path12.join)((0, import_node_os2.homedir)(), ".agents", "skills");
42804
43540
  }
42805
43541
  // ---------- 公开方法 ----------
42806
43542
  /**
@@ -42820,10 +43556,10 @@ var SkillForgeEngine = class {
42820
43556
  if (pending.some((p) => p.skillName === skillName)) {
42821
43557
  return null;
42822
43558
  }
42823
- const id = (0, import_node_crypto5.randomBytes)(4).toString("hex");
42824
- const draftDir = (0, import_node_path11.join)(this.draftRoot, userId, id);
42825
- (0, import_node_fs4.mkdirSync)(draftDir, { recursive: true });
42826
- (0, import_node_fs4.writeFileSync)((0, import_node_path11.join)(draftDir, "SKILL.md"), skillMd, "utf-8");
43559
+ const id = (0, import_node_crypto7.randomBytes)(4).toString("hex");
43560
+ const draftDir = (0, import_node_path12.join)(this.draftRoot, userId, id);
43561
+ (0, import_node_fs5.mkdirSync)(draftDir, { recursive: true });
43562
+ (0, import_node_fs5.writeFileSync)((0, import_node_path12.join)(draftDir, "SKILL.md"), skillMd, "utf-8");
42827
43563
  const proposal = {
42828
43564
  id,
42829
43565
  userId,
@@ -42841,17 +43577,17 @@ var SkillForgeEngine = class {
42841
43577
  const list = await this.proposalStorage.get(this.proposalKey(userId)) ?? [];
42842
43578
  const proposal = list.find((p) => p.id === proposalId);
42843
43579
  if (!proposal) return null;
42844
- const target = (0, import_node_path11.join)(this.skillsInstallDir, proposal.skillName);
42845
- if ((0, import_node_fs4.existsSync)(target)) {
43580
+ const target = (0, import_node_path12.join)(this.skillsInstallDir, proposal.skillName);
43581
+ if ((0, import_node_fs5.existsSync)(target)) {
42846
43582
  const alt = target + "-" + proposalId;
42847
- (0, import_node_fs4.mkdirSync)(alt, { recursive: true });
42848
- (0, import_node_fs4.cpSync)(proposal.draftDir, alt, { recursive: true });
43583
+ (0, import_node_fs5.mkdirSync)(alt, { recursive: true });
43584
+ (0, import_node_fs5.cpSync)(proposal.draftDir, alt, { recursive: true });
42849
43585
  } else {
42850
- (0, import_node_fs4.mkdirSync)(target, { recursive: true });
42851
- (0, import_node_fs4.cpSync)(proposal.draftDir, target, { recursive: true });
43586
+ (0, import_node_fs5.mkdirSync)(target, { recursive: true });
43587
+ (0, import_node_fs5.cpSync)(proposal.draftDir, target, { recursive: true });
42852
43588
  }
42853
43589
  try {
42854
- (0, import_node_fs4.rmSync)(proposal.draftDir, { recursive: true, force: true });
43590
+ (0, import_node_fs5.rmSync)(proposal.draftDir, { recursive: true, force: true });
42855
43591
  } catch {
42856
43592
  }
42857
43593
  await this.removeProposal(userId, proposalId);
@@ -42863,7 +43599,7 @@ var SkillForgeEngine = class {
42863
43599
  const proposal = list.find((p) => p.id === proposalId);
42864
43600
  if (!proposal) return null;
42865
43601
  try {
42866
- (0, import_node_fs4.rmSync)(proposal.draftDir, { recursive: true, force: true });
43602
+ (0, import_node_fs5.rmSync)(proposal.draftDir, { recursive: true, force: true });
42867
43603
  } catch {
42868
43604
  }
42869
43605
  await this.removeProposal(userId, proposalId);
@@ -42892,7 +43628,7 @@ var SkillForgeEngine = class {
42892
43628
  };
42893
43629
 
42894
43630
  // src/tools/tools/skillforge/SkillForgePropose.ts
42895
- var DESCRIPTION31 = `\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
43631
+ 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
43632
 
42897
43633
  \u4F55\u65F6\u8C03\u7528\uFF1A
42898
43634
  \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 +43664,7 @@ description: <\u4E0E\u53C2\u6570 description \u4E00\u81F4>
42928
43664
  `;
42929
43665
  var skillForgePropose = (engine) => ({
42930
43666
  name: `skill_forge_propose`,
42931
- description: DESCRIPTION31,
43667
+ description: DESCRIPTION32,
42932
43668
  input_schema: {
42933
43669
  type: `object`,
42934
43670
  properties: {
@@ -42970,7 +43706,7 @@ var skillForgePropose = (engine) => ({
42970
43706
  });
42971
43707
 
42972
43708
  // src/tools/tools/skillforge/SkillForgeKeep.ts
42973
- var DESCRIPTION32 = `\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
43709
+ 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
43710
  \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
43711
  \u53C2\u6570 proposalId \u53EF\u9009\uFF1A
42976
43712
  - \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 +43727,7 @@ var pickProposal = (pending, hint) => {
42991
43727
  };
42992
43728
  var skillForgeKeep = (engine) => ({
42993
43729
  name: `skill_forge_keep`,
42994
- description: DESCRIPTION32,
43730
+ description: DESCRIPTION33,
42995
43731
  input_schema: {
42996
43732
  type: `object`,
42997
43733
  properties: {
@@ -43019,7 +43755,7 @@ var skillForgeKeep = (engine) => ({
43019
43755
  });
43020
43756
 
43021
43757
  // src/tools/tools/skillforge/SkillForgeDrop.ts
43022
- var DESCRIPTION33 = `\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
43758
+ 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
43759
  \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
43760
  \u53C2\u6570 proposalId \u53EF\u9009\uFF1A
43025
43761
  - \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 +43776,7 @@ var pickProposal2 = (pending, hint) => {
43040
43776
  };
43041
43777
  var skillForgeDrop = (engine) => ({
43042
43778
  name: `skill_forge_drop`,
43043
- description: DESCRIPTION33,
43779
+ description: DESCRIPTION34,
43044
43780
  input_schema: {
43045
43781
  type: `object`,
43046
43782
  properties: {
@@ -43068,7 +43804,7 @@ var skillForgeDrop = (engine) => ({
43068
43804
  });
43069
43805
 
43070
43806
  // src/memory/MemoryEngine.ts
43071
- var import_node_crypto6 = require("node:crypto");
43807
+ var import_node_crypto8 = require("node:crypto");
43072
43808
  var MemoryEngine = class {
43073
43809
  storage;
43074
43810
  recallIndexStorage;
@@ -43096,7 +43832,7 @@ var MemoryEngine = class {
43096
43832
  }
43097
43833
  const now = Date.now();
43098
43834
  const memory = {
43099
- id: (0, import_node_crypto6.randomBytes)(4).toString("hex"),
43835
+ id: (0, import_node_crypto8.randomBytes)(4).toString("hex"),
43100
43836
  userId,
43101
43837
  title,
43102
43838
  content,
@@ -43186,13 +43922,13 @@ ${memory.content}`),
43186
43922
  };
43187
43923
 
43188
43924
  // src/tools/tools/memory/MemoryCreate.ts
43189
- var DESCRIPTION34 = `\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
43925
+ 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
43926
 
43191
43927
  \u4F55\u65F6\u8C03\u7528\uFF1A
43192
43928
  1. \u7528\u6237\u660E\u786E\u8BF4"\u8BB0\u4F4F / \u4EE5\u540E\u90FD / \u522B\u518D / \u4ECE\u73B0\u5728\u8D77"\u7B49\u6307\u793A\u6027\u63AA\u8F9E
43193
43929
  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 \u56E2\u961F\u7684\u540E\u7AEF\u540C\u5B66"\u3001"\u6211\u7684\u751F\u4EA7\u73AF\u5883\u662F staging-us-east"\uFF09
43195
- 4. \u6709\u7528\u7684\u9886\u57DF\u7EA6\u5B9A / \u56E2\u961F\u89C4\u8303\uFF08\u4F8B\u5982"\u672C\u9879\u76EE commit message \u7528\u4E2D\u6587"\uFF09
43930
+ 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
43931
+ 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
43932
 
43197
43933
  \u4F55\u65F6 **\u4E0D\u8981** \u8C03\u7528\uFF1A
43198
43934
  - \u4E00\u6B21\u6027\u4FE1\u606F\uFF08"\u5E2E\u6211\u67E5\u4E0B\u4ECA\u5929\u5929\u6C14"\uFF09
@@ -43200,13 +43936,13 @@ var DESCRIPTION34 = `\u628A\u4E00\u6761\u503C\u5F97\u957F\u671F\u8BB0\u4F4F\u768
43200
43936
  - \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
43937
 
43202
43938
  \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"\u56E2\u961F-\u90E8\u7F72\u73AF\u5883"
43939
+ - 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
43940
  - 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
43941
  - \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
43942
  `;
43207
43943
  var memoryCreate = (engine) => ({
43208
43944
  name: `memory_create`,
43209
- description: DESCRIPTION34,
43945
+ description: DESCRIPTION35,
43210
43946
  input_schema: {
43211
43947
  type: `object`,
43212
43948
  properties: {
@@ -43238,11 +43974,11 @@ var memoryCreate = (engine) => ({
43238
43974
  });
43239
43975
 
43240
43976
  // src/tools/tools/memory/MemoryUpdate.ts
43241
- var DESCRIPTION35 = `\u66F4\u65B0\u4E00\u6761\u5DF2\u5B58\u5728\u7684\u957F\u671F\u8BB0\u5FC6\uFF08\u6309 id \u5B9A\u4F4D\uFF09\u3002
43977
+ var DESCRIPTION36 = `\u66F4\u65B0\u4E00\u6761\u5DF2\u5B58\u5728\u7684\u957F\u671F\u8BB0\u5FC6\uFF08\u6309 id \u5B9A\u4F4D\uFF09\u3002
43242
43978
 
43243
43979
  \u4F55\u65F6\u8C03\u7528\uFF1A
43244
43980
  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 \u56E2\u961F\u6362\u5230 B \u56E2\u961F\u4E86"\uFF09
43981
+ 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
43982
  3. \u540C\u7C7B\u504F\u597D\u53D1\u751F\u53D8\u5316\uFF08\u4F8B\u5982\u4ECE"\u7528 npm"\u6539\u6210"\u7528 pnpm"\uFF09
43247
43983
 
43248
43984
  \u4F7F\u7528\u8981\u70B9\uFF1A
@@ -43252,7 +43988,7 @@ var DESCRIPTION35 = `\u66F4\u65B0\u4E00\u6761\u5DF2\u5B58\u5728\u7684\u957F\u671
43252
43988
  `;
43253
43989
  var memoryUpdate = (engine) => ({
43254
43990
  name: `memory_update`,
43255
- description: DESCRIPTION35,
43991
+ description: DESCRIPTION36,
43256
43992
  input_schema: {
43257
43993
  type: `object`,
43258
43994
  properties: {
@@ -43289,7 +44025,7 @@ var memoryUpdate = (engine) => ({
43289
44025
  });
43290
44026
 
43291
44027
  // src/tools/tools/memory/MemoryDelete.ts
43292
- var DESCRIPTION36 = `\u5220\u9664\u4E00\u6761\u957F\u671F\u8BB0\u5FC6\uFF08\u6309 id \u5B9A\u4F4D\uFF09\u3002
44028
+ var DESCRIPTION37 = `\u5220\u9664\u4E00\u6761\u957F\u671F\u8BB0\u5FC6\uFF08\u6309 id \u5B9A\u4F4D\uFF09\u3002
43293
44029
 
43294
44030
  \u4F55\u65F6\u8C03\u7528\uFF1A
43295
44031
  1. \u7528\u6237\u660E\u786E\u8981\u6C42"\u5FD8\u6389 / \u522B\u518D\u8BB0 / \u5220\u6389\u5173\u4E8E X \u7684\u8BB0\u5FC6"
@@ -43302,7 +44038,7 @@ var DESCRIPTION36 = `\u5220\u9664\u4E00\u6761\u957F\u671F\u8BB0\u5FC6\uFF08\u630
43302
44038
  `;
43303
44039
  var memoryDelete = (engine) => ({
43304
44040
  name: `memory_delete`,
43305
- description: DESCRIPTION36,
44041
+ description: DESCRIPTION37,
43306
44042
  input_schema: {
43307
44043
  type: `object`,
43308
44044
  properties: {
@@ -43509,7 +44245,7 @@ var COMPACT_SYSTEM_PROMPT = `\u4F60\u662F Duclaw \u7684\u4F1A\u8BDD\u538B\u7F29\
43509
44245
  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
44246
  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
44247
  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 team manager\u3001worker\u3001mailbox\u3001cron \u7EBF\u7D22\uFF0C\u8BB0\u5F55\u8D23\u4EFB\u4EBA\u548C\u7EBF\u7A0B\u72B6\u6001\u3002
44248
+ 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
44249
  7. \u8F93\u51FA\u5FC5\u987B\u662F\u7EAF\u6587\u672C\uFF0C\u5E76\u4E25\u683C\u4F7F\u7528\u4E0B\u9762\u7ED3\u6784\uFF1A
43514
44250
 
43515
44251
  <compact-summary>
@@ -43759,7 +44495,7 @@ var assistantMessageFromResponse = (response) => ({
43759
44495
  });
43760
44496
  var getDefaultAgentConfig = (tools, systemPrompt) => {
43761
44497
  loadEnv();
43762
- (0, import_node_fs5.mkdirSync)(DEFAULT_WORKSPACE_PATH, { recursive: true });
44498
+ (0, import_node_fs6.mkdirSync)(DEFAULT_WORKSPACE_PATH, { recursive: true });
43763
44499
  let system = ``;
43764
44500
  if (!systemPrompt) {
43765
44501
  system = `
@@ -43790,13 +44526,13 @@ The user will primarily request you perform software engineering tasks. This inc
43790
44526
  - Use the Task tool to plan the task if required
43791
44527
  - 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
44528
  - 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 team-member replies. Such reminders can help you reason, but they are NOT user confirmation for destructive or irreversible actions.
43794
- - \u5982\u679C\u5386\u53F2\u4E2D\u51FA\u73B0 <team-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
44529
+ - 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.
44530
+ - \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
44531
  </Doing tasks>
43796
44532
 
43797
- <Team delegation>
43798
- # \u56E2\u961F\u59D4\u6D3E\u7B56\u7565
43799
- \u4F60\u662F\u4E3B Manager\uFF0C\u7C7B\u4F3C CEO\u3002\u4F60\u7684\u7EC4\u7EC7\u89C6\u91CE\u53EA\u5230\u56E2\u961F\u548C Team Manager\uFF1B\u666E\u901A\u6210\u5458\u4E0D\u66B4\u9732\u5728\u4F60\u7684\u89C6\u91CE\u4E2D\u3002
44533
+ <Department delegation>
44534
+ # \u90E8\u95E8\u59D4\u6D3E\u7B56\u7565
44535
+ \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
44536
 
43801
44537
  ## \u7B80\u5355\u4EFB\u52A1\u76F4\u529E
43802
44538
  \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 +44546,36 @@ The user will primarily request you perform software engineering tasks. This inc
43810
44546
  - \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
44547
 
43812
44548
  ## \u59D4\u6D3E\u6D41\u7A0B
43813
- 1. \u590D\u6742\u4EFB\u52A1\u5148\u8C03\u7528 team_list \u67E5\u770B\u5F53\u524D\u6709\u54EA\u4E9B\u56E2\u961F
43814
- 2. \u5982\u679C\u5B58\u5728\u804C\u8D23\u5339\u914D\u7684\u56E2\u961F\uFF0C\u628A\u4EFB\u52A1\u53D1\u9001\u7ED9\u8BE5\u56E2\u961F\u7684 Team Manager
43815
- 3. \u5982\u679C\u4E0D\u5B58\u5728\u804C\u8D23\u5339\u914D\u7684\u56E2\u961F\uFF0C\u5148\u521B\u5EFA\u76EE\u6807\uFF08goal_create\uFF09\uFF0C\u518D\u521B\u5EFA\u56E2\u961F\uFF08create_team\uFF09
43816
- 4. \u65B0\u56E2\u961F\u521B\u5EFA\u540E\uFF0C\u5FC5\u987B\u5148\u521B\u5EFA\u8BE5\u56E2\u961F\u7684 Team Manager\uFF08team_member_create\uFF0Crole=team_manager\uFF09
43817
- 5. \u521B\u5EFA Team Manager \u65F6\uFF0CfocusOn \u53EA\u5199\u957F\u671F\u5C97\u4F4D\u804C\u8D23\u3001\u56E2\u961F\u8FB9\u754C\u548C\u7BA1\u7406\u539F\u5219\uFF0C\u4E0D\u5199\u5F53\u524D\u4EFB\u52A1\u7EC6\u8282
43818
- 6. \u521B\u5EFA Team Manager \u540E\uFF0C\u518D\u901A\u8FC7 team_communicate \u53D1\u9001\u5F53\u524D\u5177\u4F53\u4EFB\u52A1\u90AE\u4EF6
43819
- 7. \u7B49\u5F85 Team Manager \u56DE\u590D\u7ED3\u679C\uFF0C\u6C47\u603B\u540E\u56DE\u590D\u7528\u6237
44549
+ 1. \u590D\u6742\u4EFB\u52A1\u5148\u8C03\u7528 department_list \u67E5\u770B\u5F53\u524D\u6709\u54EA\u4E9B\u90E8\u95E8
44550
+ 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
44551
+ 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
44552
+ 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
44553
+ 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
44554
+ 6. \u521B\u5EFA Department Head \u540E\uFF0C\u518D\u901A\u8FC7 department_communicate \u53D1\u9001\u5F53\u524D\u5177\u4F53\u4EFB\u52A1\u90AE\u4EF6
44555
+ 7. \u7B49\u5F85 Department Head \u56DE\u590D\u7ED3\u679C\uFF0C\u6C47\u603B\u540E\u56DE\u590D\u7528\u6237
43820
44556
 
43821
44557
  ## \u4F60\u7684\u89D2\u8272
43822
44558
  - \u7406\u89E3\u7528\u6237\u610F\u56FE\uFF0C\u5236\u5B9A\u8BA1\u5212
43823
44559
  - \u5224\u65AD\u7B80\u5355\u4EFB\u52A1\u662F\u5426\u76F4\u529E
43824
- - \u7EF4\u62A4\u56E2\u961F\u7EC4\u7EC7\u7ED3\u6784
43825
- - \u5C06\u590D\u6742\u4EFB\u52A1\u8DEF\u7531\u7ED9 Team Manager
43826
- - \u534F\u8C03 Team Manager \u4E4B\u95F4\u7684\u5DE5\u4F5C
44560
+ - \u7EF4\u62A4\u90E8\u95E8\u7EC4\u7EC7\u7ED3\u6784
44561
+ - \u5C06\u590D\u6742\u4EFB\u52A1\u8DEF\u7531\u7ED9 Department Head
44562
+ - \u534F\u8C03 Department Head \u4E4B\u95F4\u7684\u5DE5\u4F5C
43827
44563
  - \u6C47\u603B\u7ED3\u679C\u5E76\u56DE\u590D\u7528\u6237
43828
- - \u4E0D\u76F4\u63A5\u521B\u5EFA\u6216\u8054\u7CFB\u666E\u901A\u6210\u5458\uFF1B\u666E\u901A\u6210\u5458\u7531 Team Manager \u7BA1\u7406
43829
- - \u4FDD\u6301\u8D23\u4EFB\u5F52\u5C5E\u7A33\u5B9A\uFF1A\u67D0\u4E2A Team Manager \u5DF2\u7ECF\u8D1F\u8D23\u7684\u4EA7\u51FA\uFF0C\u540E\u7EED\u4FEE\u8BA2\u3001\u8FD4\u5DE5\u3001bug \u4FEE\u590D\u9ED8\u8BA4\u4ECD\u7531\u8BE5 Team Manager \u8D1F\u8D23\uFF0C\u901A\u5E38\u5E94\u901A\u8FC7 mailbox_followup \u63A5\u56DE\u539F\u7EBF\u7A0B
44564
+ - \u9ED8\u8BA4\u4E0D\u76F4\u63A5\u521B\u5EFA Executor\uFF1BExecutor \u7531 Department Head \u7BA1\u7406
44565
+ - \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
44566
+ - \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
44567
 
43831
44568
  ## \u8D23\u4EFB\u5F52\u5C5E\u786C\u89C4\u5219
43832
- - Team Manager \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 Team Manager \u5904\u7406
43833
- - \u4F18\u5148\u4F7F\u7528 mailbox_followup \u5BF9\u8BE5 Team Manager \u6700\u8FD1\u4E00\u6B21\u76F8\u5173\u56DE\u4FE1\u8FFD\u52A0\u53CD\u9988\uFF0C\u907F\u514D\u4E3B Manager \u4EB2\u81EA\u4E0B\u573A\u91CD\u505A\u5B9E\u73B0
43834
- - \u5982\u679C\u56E2\u961F\u6CA1\u6709 Team Manager\uFF0C\u5E94\u5148\u8865\u5EFA Team Manager\uFF0C\u518D\u901A\u8FC7 Team Manager \u5904\u7406\u4EFB\u52A1
43835
- </Team delegation>
44569
+ - 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
44570
+ - \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
44571
+ - \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
44572
+ </Department delegation>
43836
44573
 
43837
44574
  <Communication>
43838
44575
  # \u4E3B\u52A8\u6C9F\u901A\u4E0E\u7528\u6237\u786E\u8BA4
43839
44576
  - \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
44577
  - \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\u56E2\u961F\u540E\uFF1A\u544A\u77E5\u7528\u6237\u5DF2\u5206\u914D\u56E2\u961F\u5904\u7406\uFF0C\u9884\u671F\u7684\u6B65\u9AA4
44578
+ - \u59D4\u6D3E\u90E8\u95E8\u540E\uFF1A\u544A\u77E5\u7528\u6237\u5DF2\u5206\u914D\u90E8\u95E8\u5904\u7406\uFF0C\u9884\u671F\u7684\u6B65\u9AA4
43842
44579
  - \u4EFB\u52A1\u5B8C\u6210\u65F6\uFF1A\u6C47\u603B\u7ED3\u679C\u56DE\u590D\u7528\u6237
43843
44580
  - \u9047\u5230\u95EE\u9898\u65F6\uFF1A\u7ACB\u5373\u544A\u77E5\u7528\u6237\u9047\u5230\u4E86\u4EC0\u4E48\u95EE\u9898
43844
44581
  - \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 +44618,7 @@ ${getSkillMeta()}
43881
44618
  \u4F55\u65F6\u5199\u5165\u65B0\u8BB0\u5FC6\uFF08\u8C03\u7528 memory_create\uFF09\uFF1A
43882
44619
  1. \u7528\u6237\u660E\u786E\u8BF4"\u8BB0\u4F4F / \u4EE5\u540E\u90FD / \u522B\u518D / \u4ECE\u73B0\u5728\u8D77"\u7B49\u6307\u793A\u6027\u63AA\u8F9E
43883
44620
  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\u56E2\u961F\u3001\u90E8\u7F72\u73AF\u5883\u3001\u8EAB\u4EFD\u7B49\uFF09
44621
+ 3. \u7528\u6237\u544A\u77E5\u7684\u7A33\u5B9A\u4E8B\u5B9E\uFF08\u90E8\u95E8\u3001\u90E8\u7F72\u73AF\u5883\u3001\u8EAB\u4EFD\u7B49\uFF09
43885
44622
  4. \u6709\u7528\u7684\u9886\u57DF\u7EA6\u5B9A\uFF08commit \u89C4\u8303\u3001\u7F16\u7801\u98CE\u683C\u7B49\uFF09
43886
44623
  \u4F55\u65F6 **\u4E0D** \u8981\u5199\u5165\uFF1A
43887
44624
  \u2022 \u4E00\u6B21\u6027\u4FE1\u606F\uFF08\u67E5\u5929\u6C14\u3001\u5177\u4F53\u4EFB\u52A1\u6570\u636E\uFF09
@@ -44110,7 +44847,7 @@ ${content}`;
44110
44847
  messages,
44111
44848
  systemPrompt: effectiveSystemPrompt,
44112
44849
  reason,
44113
- threadId: request.teamAgentId || void 0
44850
+ threadId: request.departmentAgentId || void 0
44114
44851
  });
44115
44852
  console.warn(
44116
44853
  `[compact] \u5B8C\u6574 compact \u6210\u529F reason=${reason} before=${result.record.contextTokensBefore} after=${result.record.contextTokensAfter} messages=${result.messages}`
@@ -44287,7 +45024,14 @@ ${memoryInjection}` : "") + dreamInjection;
44287
45024
  }
44288
45025
  }
44289
45026
  }
44290
- const result = await toolExecutor.execute(useBlock.name, useBlock.input, request);
45027
+ const toolRequest = {
45028
+ ...request,
45029
+ metadata: {
45030
+ ...request.metadata ?? {},
45031
+ toolCallId: useBlock.id
45032
+ }
45033
+ };
45034
+ const result = await toolExecutor.execute(useBlock.name, useBlock.input, toolRequest);
44291
45035
  return toolResult(useBlock.id, result);
44292
45036
  } catch (error) {
44293
45037
  const err = error;
@@ -44578,14 +45322,14 @@ var executeAgentJob = async (job) => {
44578
45322
  const cronSystemPrompt = getCronSystemPrompt();
44579
45323
  const agentConfig = getDefaultAgentConfig(tools, cronSystemPrompt);
44580
45324
  const agent = createAgent(agentConfig);
44581
- const teamAgentId = `cron-${job.id}`;
45325
+ const departmentAgentId = `cron-${job.id}`;
44582
45326
  const userRequest = {
44583
45327
  platform: job.delivery.channel,
44584
45328
  userId: job.delivery.to,
44585
45329
  requestId: generateRequestId(),
44586
45330
  content: `\u9700\u8981 [cron] \u6267\u884C\u4EFB\u52A1: ${job.id} - ${job.title}`,
44587
45331
  job,
44588
- teamAgentId
45332
+ departmentAgentId
44589
45333
  };
44590
45334
  const cronResult = await agent(userRequest);
44591
45335
  return cronResult.content;
@@ -44644,8 +45388,8 @@ var saveResultToFile = (job, cronResp) => {
44644
45388
  return filePath;
44645
45389
  };
44646
45390
 
44647
- // src/tools/tools/team/ListMailbox.ts
44648
- var DESCRIPTION37 = `
45391
+ // src/tools/tools/department/ListMailbox.ts
45392
+ var DESCRIPTION38 = `
44649
45393
  \u67E5\u770B\u4F60\u7684\u90AE\u7BB1\u4E2D\u6240\u6709\u5F85\u5904\u7406\u90AE\u4EF6\u7684\u6458\u8981\u5217\u8868\u3002
44650
45394
 
44651
45395
  \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 +45404,17 @@ var DESCRIPTION37 = `
44660
45404
  `;
44661
45405
  var listMailbox = {
44662
45406
  name: `list_mailbox`,
44663
- description: DESCRIPTION37,
45407
+ description: DESCRIPTION38,
44664
45408
  input_schema: {
44665
45409
  type: `object`,
44666
45410
  properties: {},
44667
45411
  required: []
44668
45412
  },
44669
45413
  async execute(input, userRequest) {
44670
- if (!userRequest?.teamAgentId) {
45414
+ if (!userRequest?.departmentAgentId) {
44671
45415
  return `[listMailbox] \u65E0\u6CD5\u786E\u5B9A\u5F53\u524D agent \u7684 mailboxId`;
44672
45416
  }
44673
- const myMailboxId = userRequest.teamAgentId;
45417
+ const myMailboxId = userRequest.departmentAgentId;
44674
45418
  const db3 = createSqliteDB();
44675
45419
  const stmt = db3.prepare(
44676
45420
  `SELECT id, from_mailbox_id as fromMailboxId, content, send_time as sendTime
@@ -44715,8 +45459,8 @@ ${list}`;
44715
45459
  }
44716
45460
  };
44717
45461
 
44718
- // src/tools/tools/team/GetMailbox.ts
44719
- var DESCRIPTION38 = `
45462
+ // src/tools/tools/department/GetMailbox.ts
45463
+ var DESCRIPTION39 = `
44720
45464
  \u83B7\u53D6\u6307\u5B9A\u90AE\u4EF6\u7684\u5B8C\u6574\u5185\u5BB9\u3002
44721
45465
 
44722
45466
  \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 +45471,7 @@ var DESCRIPTION38 = `
44727
45471
  `;
44728
45472
  var getMailbox = {
44729
45473
  name: `get_mailbox`,
44730
- description: DESCRIPTION38,
45474
+ description: DESCRIPTION39,
44731
45475
  input_schema: {
44732
45476
  type: `object`,
44733
45477
  properties: {
@@ -44739,7 +45483,7 @@ var getMailbox = {
44739
45483
  required: [`message_id`]
44740
45484
  },
44741
45485
  async execute(input, userRequest) {
44742
- if (!userRequest?.teamAgentId) {
45486
+ if (!userRequest?.departmentAgentId) {
44743
45487
  return `[getMailbox] \u65E0\u6CD5\u786E\u5B9A\u5F53\u524D agent \u7684 mailboxId`;
44744
45488
  }
44745
45489
  const messageId = input.message_id;
@@ -44760,13 +45504,13 @@ var getMailbox = {
44760
45504
  if (!msg) {
44761
45505
  return `[getMailbox] \u672A\u627E\u5230 id \u4E3A ${messageId} \u7684\u90AE\u4EF6`;
44762
45506
  }
44763
- if (msg.toMailboxId !== userRequest.teamAgentId) {
45507
+ if (msg.toMailboxId !== userRequest.departmentAgentId) {
44764
45508
  return `[getMailbox] \u8BE5\u90AE\u4EF6\u4E0D\u5C5E\u4E8E\u4F60\u7684\u90AE\u7BB1`;
44765
45509
  }
44766
45510
  recordMailboxEvent({
44767
45511
  messageId: msg.id,
44768
45512
  mailboxId: msg.toMailboxId,
44769
- actorMailboxId: userRequest.teamAgentId,
45513
+ actorMailboxId: userRequest.departmentAgentId,
44770
45514
  counterpartMailboxId: msg.fromMailboxId,
44771
45515
  eventType: "message_opened"
44772
45516
  });
@@ -44785,8 +45529,8 @@ ${msg.content}`;
44785
45529
  }
44786
45530
  };
44787
45531
 
44788
- // src/tools/tools/team/ReplyMailbox.ts
44789
- var DESCRIPTION39 = `
45532
+ // src/tools/tools/department/ReplyMailbox.ts
45533
+ var DESCRIPTION40 = `
44790
45534
  \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
45535
 
44792
45536
  \u53C2\u6570\uFF1A
@@ -44799,7 +45543,7 @@ var DESCRIPTION39 = `
44799
45543
  `;
44800
45544
  var replyMailbox = {
44801
45545
  name: `reply_mailbox`,
44802
- description: DESCRIPTION39,
45546
+ description: DESCRIPTION40,
44803
45547
  input_schema: {
44804
45548
  type: `object`,
44805
45549
  properties: {
@@ -44815,12 +45559,12 @@ var replyMailbox = {
44815
45559
  required: [`message_id`, `content`]
44816
45560
  },
44817
45561
  async execute(input, userRequest) {
44818
- if (!userRequest?.teamAgentId) {
45562
+ if (!userRequest?.departmentAgentId) {
44819
45563
  return `[replyMailbox] \u65E0\u6CD5\u786E\u5B9A\u5F53\u524D agent \u7684 mailboxId`;
44820
45564
  }
44821
45565
  const messageId = input.message_id;
44822
45566
  const content = input.content;
44823
- const myMailboxId = userRequest.teamAgentId;
45567
+ const myMailboxId = userRequest.departmentAgentId;
44824
45568
  const db3 = createSqliteDB();
44825
45569
  const stmt = db3.prepare(
44826
45570
  `SELECT
@@ -44876,23 +45620,23 @@ var replyMailbox = {
44876
45620
  };
44877
45621
 
44878
45622
  // src/cron/mailboxReminder.ts
44879
- var buildManagerReplyReminder = (replyMsg) => {
45623
+ var buildCeoReplyReminder = (replyMsg) => {
44880
45624
  const ownerMailboxId = replyMsg.fromMailboxId;
44881
45625
  const anchorMessageId = replyMsg.id;
44882
45626
  const threadId = replyMsg.threadId || replyMsg.id;
44883
45627
  const parentMessageId = replyMsg.parentMessageId || "";
44884
45628
  return `<system-reminder>
44885
- \u6536\u5230\u56E2\u961F\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\u56E2\u961F\u7B49\u4E0D\u53EF\u9006\u64CD\u4F5C\u7684\u786E\u8BA4\u4F9D\u636E\u3002
45629
+ \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
45630
 
44887
45631
  \u8D23\u4EFB\u5F52\u5C5E\u89C4\u5219\uFF1A
44888
45632
  - \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 manager \u81EA\u5DF1\u76F4\u63A5\u91CD\u505A
45633
+ - \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
45634
  - \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 manager \u4EB2\u81EA\u63A5\u7BA1\u65F6\uFF0C\u4F60\u624D\u53EF\u4EE5\u81EA\u5DF1\u6267\u884C
45635
+ - \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
45636
 
44893
- <team-agent-reply from="${ownerMailboxId}" owner_mailbox_id="${ownerMailboxId}" message_id="${anchorMessageId}" thread_id="${threadId}" parent_message_id="${parentMessageId}">
45637
+ <department-agent-reply from="${ownerMailboxId}" owner_mailbox_id="${ownerMailboxId}" message_id="${anchorMessageId}" thread_id="${threadId}" parent_message_id="${parentMessageId}">
44894
45638
  ${replyMsg.content}
44895
- </team-agent-reply>
45639
+ </department-agent-reply>
44896
45640
  </system-reminder>`;
44897
45641
  };
44898
45642
 
@@ -44913,7 +45657,7 @@ var markMailboxStatus = (msgId, status) => {
44913
45657
  reason: "mailbox_poller"
44914
45658
  });
44915
45659
  };
44916
- var handleManagerReply = async (replyMsg) => {
45660
+ var handleCeoReply = async (replyMsg) => {
44917
45661
  const { fromMailboxId, content } = replyMsg;
44918
45662
  const originStmt = db2.prepare(
44919
45663
  `SELECT origin_user_id as originUserId, origin_platform as originPlatform
@@ -44927,7 +45671,7 @@ var handleManagerReply = async (replyMsg) => {
44927
45671
  return;
44928
45672
  }
44929
45673
  console.log(`[mailbox] \u627E\u5230\u539F\u59CB\u7528\u6237\u4E0A\u4E0B\u6587: userId=${origin.originUserId}, platform=${origin.originPlatform}`);
44930
- const replyContent = buildManagerReplyReminder({
45674
+ const replyContent = buildCeoReplyReminder({
44931
45675
  id: replyMsg.id,
44932
45676
  fromMailboxId,
44933
45677
  content,
@@ -44943,7 +45687,7 @@ var handleManagerReply = async (replyMsg) => {
44943
45687
  platform: origin.originPlatform,
44944
45688
  userId: origin.originUserId,
44945
45689
  requestId: replyMsg.id,
44946
- teamAgentId: "",
45690
+ departmentAgentId: "",
44947
45691
  content: replyContent
44948
45692
  };
44949
45693
  const config2 = getDefaultAgentConfig();
@@ -44964,18 +45708,18 @@ var handleManagerReply = async (replyMsg) => {
44964
45708
  }
44965
45709
  }
44966
45710
  };
44967
- var wakeTeamAgent = async (mailboxId, msgIds) => {
45711
+ var wakeDepartmentAgent = async (mailboxId, msgIds) => {
44968
45712
  try {
44969
- const [teamName, memberName] = mailboxId.split("::");
44970
- if (!teamName || !memberName) {
45713
+ const [departmentName, memberName] = mailboxId.split("::");
45714
+ if (!departmentName || !memberName) {
44971
45715
  console.warn(`[mailbox] mailboxId \u683C\u5F0F\u4E0D\u5408\u6CD5: ${mailboxId}`);
44972
45716
  for (const id of msgIds) markMailboxStatus(id, "cancelled");
44973
45717
  return;
44974
45718
  }
44975
- const member = getTeamMemberByName(teamName, memberName);
45719
+ const member = getDepartmentMemberByName(departmentName, memberName);
44976
45720
  if (!member) {
44977
45721
  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] \u56E2\u961F\u6210\u5458 ${mailboxId} \u4E0D\u5B58\u5728\uFF08\u53EF\u80FD\u6240\u5C5E\u56E2\u961F\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\u56E2\u961F\u6216\u8C03\u6574\u8BA1\u5212\u3002`;
45722
+ 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
45723
  const originStmt = db2.prepare(
44980
45724
  `SELECT origin_user_id as originUserId, origin_platform as originPlatform
44981
45725
  FROM mailbox WHERE id IN (${msgIds.map(() => "?").join(",")}) AND origin_user_id IS NOT NULL LIMIT 1`
@@ -44988,35 +45732,35 @@ var wakeTeamAgent = async (mailboxId, msgIds) => {
44988
45732
  for (const id of msgIds) markMailboxStatus(id, "cancelled");
44989
45733
  return;
44990
45734
  }
44991
- const team = getTeamById(member.teamId);
44992
- const workspacePath = team?.workpath;
44993
- const agentConfig = getTeamAgentConfig(void 0, member.focusOn, workspacePath);
45735
+ const department = getDepartmentById(member.departmentId);
45736
+ const workspacePath = department?.workpath;
45737
+ const agentConfig = getDepartmentAgentConfig(void 0, member.focusOn, workspacePath, department?.name);
44994
45738
  const agent = createAgent(agentConfig);
44995
45739
  const request = {
44996
45740
  platform: "mailbox",
44997
45741
  userId: mailboxId,
44998
45742
  requestId: msgIds[0],
44999
- teamAgentId: mailboxId,
45743
+ departmentAgentId: mailboxId,
45000
45744
  workspacePath,
45001
45745
  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
45746
  };
45003
45747
  const result = await agent(request);
45004
- console.log(`[mailbox] team agent ${mailboxId} \u5904\u7406\u5B8C\u6210, alreadySent=${result.alreadySent}`);
45748
+ console.log(`[mailbox] department agent ${mailboxId} \u5904\u7406\u5B8C\u6210, alreadySent=${result.alreadySent}`);
45005
45749
  for (const id of msgIds) {
45006
45750
  const changed = updateMailboxMessageStatus(id, "pending", {
45007
45751
  fromStatus: "processing",
45008
- reason: "team_agent_retry"
45752
+ reason: "department_agent_retry"
45009
45753
  });
45010
45754
  if (changed) {
45011
45755
  console.log(`[mailbox] \u6D88\u606F ${id} \u672A\u88AB agent \u5904\u7406\uFF0C\u5DF2\u91CD\u7F6E\u4E3A pending`);
45012
45756
  }
45013
45757
  }
45014
45758
  } catch (err) {
45015
- console.error(`[mailbox] \u5524\u9192 team agent ${mailboxId} \u5931\u8D25:`, err);
45759
+ console.error(`[mailbox] \u5524\u9192 department agent ${mailboxId} \u5931\u8D25:`, err);
45016
45760
  for (const id of msgIds) {
45017
45761
  updateMailboxMessageStatus(id, "pending", {
45018
45762
  fromStatus: "processing",
45019
- reason: "team_agent_wakeup_failed"
45763
+ reason: "department_agent_wakeup_failed"
45020
45764
  });
45021
45765
  }
45022
45766
  }
@@ -45038,12 +45782,12 @@ var pollMailbox = async () => {
45038
45782
  group.push(msg);
45039
45783
  grouped.set(msg.toMailboxId, group);
45040
45784
  }
45041
- const managerMsgs = grouped.get("manager") || [];
45785
+ const ceoMsgs = grouped.get("manager") || [];
45042
45786
  grouped.delete("manager");
45043
- for (const msg of managerMsgs) {
45044
- console.log(`[mailbox] \u6536\u5230 team agent \u56DE\u4FE1\uFF08\u6765\u81EA ${msg.fromMailboxId}\uFF09\uFF0C\u6B63\u5728\u5524\u9192\u4E3B agent...`);
45787
+ for (const msg of ceoMsgs) {
45788
+ console.log(`[mailbox] \u6536\u5230 department agent \u56DE\u4FE1\uFF08\u6765\u81EA ${msg.fromMailboxId}\uFF09\uFF0C\u6B63\u5728\u5524\u9192\u4E3B agent...`);
45045
45789
  try {
45046
- await handleManagerReply(msg);
45790
+ await handleCeoReply(msg);
45047
45791
  markMailboxStatus(msg.id, "done");
45048
45792
  } catch (err) {
45049
45793
  console.error(`[mailbox] \u5524\u9192\u4E3B agent \u5904\u7406\u56DE\u4FE1\u5931\u8D25:`, err);
@@ -45052,7 +45796,7 @@ var pollMailbox = async () => {
45052
45796
  }
45053
45797
  const tasks = Array.from(grouped.entries()).map(async ([mailboxId, msgs]) => {
45054
45798
  const msgIds = msgs.map((m) => m.id);
45055
- await wakeTeamAgent(mailboxId, msgIds);
45799
+ await wakeDepartmentAgent(mailboxId, msgIds);
45056
45800
  });
45057
45801
  await Promise.all(tasks);
45058
45802
  } catch (err) {
@@ -45065,7 +45809,7 @@ var startMailboxPoller = (intervalMs = 3e3) => {
45065
45809
  console.log(`[mailbox] \u591A\u667A\u80FD\u4F53\u90AE\u7BB1\u8F6E\u8BE2\u5DF2\u542F\u52A8\uFF0C\u95F4\u9694 ${intervalMs}ms`);
45066
45810
  return setInterval(pollMailbox, intervalMs);
45067
45811
  };
45068
- var createTeamAgentTools = () => {
45812
+ var createDepartmentAgentTools = () => {
45069
45813
  const registry2 = createToolRegistry();
45070
45814
  const executor = createToolExecutor(registry2);
45071
45815
  registerTool(registry2, dateTool);
@@ -45092,22 +45836,32 @@ var createTeamAgentTools = () => {
45092
45836
  registerTool(registry2, getMailbox);
45093
45837
  registerTool(registry2, mailboxFollowup);
45094
45838
  registerTool(registry2, replyMailbox);
45095
- registerTool(registry2, teamMemberList);
45096
- registerTool(registry2, teamMemberCreate);
45097
- registerTool(registry2, teamCommunicate);
45839
+ registerTool(registry2, departmentMemberList);
45840
+ registerTool(registry2, departmentMemberCreate);
45841
+ registerTool(registry2, departmentCommunicate);
45842
+ registerTool(registry2, departmentMemoryList);
45843
+ registerTool(registry2, departmentMemoryCreate);
45844
+ registerTool(registry2, departmentMemoryUpdate);
45845
+ registerTool(registry2, departmentMemoryDelete);
45846
+ registerTool(registry2, departmentSkillList);
45847
+ registerTool(registry2, departmentSkillPropose);
45848
+ registerTool(registry2, departmentSkillKeep);
45849
+ registerTool(registry2, departmentSkillDrop);
45850
+ registerTool(registry2, departmentProposalCreate);
45098
45851
  registerTool(registry2, sendMessage);
45099
45852
  return { registry: registry2, executor };
45100
45853
  };
45101
- var getTeamAgentConfig = (tools, memberFocusOn, workspacePath) => {
45854
+ var getDepartmentAgentConfig = (tools, memberFocusOn, workspacePath, departmentName) => {
45102
45855
  loadEnv();
45103
45856
  const defaultSystemPrompt = `
45104
- You are a team member agent in a multi-agent collaboration system. You communicate exclusively with other agents through a mailbox system \u2014 you do NOT interact with end users directly.
45857
+ 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
45858
 
45106
45859
  <Role>
45107
- Your role is to process messages from other team agents, complete your assigned tasks, and respond with clear, structured results. Focus on your area of expertise and collaborate effectively with other agents.
45860
+ 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
45861
  ${memberFocusOn ? `
45109
45862
  Your specialization: ${memberFocusOn}` : ""}
45110
45863
  </Role>
45864
+ ${buildDepartmentLearningContext(departmentName)}
45111
45865
  ${workspacePath ? `
45112
45866
  <Workspace>
45113
45867
  \u4F60\u7684\u5DE5\u4F5C\u533A\u8DEF\u5F84\u662F: ${workspacePath}
@@ -45130,9 +45884,9 @@ ${workspacePath ? `
45130
45884
  - 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
45885
  - 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
45886
  - \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\u56E2\u961F\u6210\u5458\uFF0C\u4F7F\u7528 team_communicate \u5DE5\u5177
45134
- - \u5982\u679C\u4F60\u662F Team Manager\uFF0C\u5904\u7406\u590D\u6742\u4EFB\u52A1\u524D\u53EF\u4EE5\u4F7F\u7528 team_member_list \u67E5\u770B\u672C\u56E2\u961F\u5DF2\u6709\u6210\u5458\uFF0C\u5E76\u5728\u9700\u8981\u65F6\u4F7F\u7528 team_member_create \u521B\u5EFA\u666E\u901A\u6210\u5458
45135
- - \u5982\u679C\u4F60\u4E0D\u662F Team Manager\uFF0C\u4E0D\u8981\u5C1D\u8BD5\u67E5\u770B\u5B8C\u6574\u56E2\u961F\u6210\u5458\u76EE\u5F55\u6216\u521B\u5EFA\u6210\u5458
45887
+ - \u5982\u679C\u9700\u8981\u4E3B\u52A8\u8054\u7CFB\u5176\u4ED6\u90E8\u95E8\u6210\u5458\uFF0C\u4F7F\u7528 department_communicate \u5DE5\u5177
45888
+ - \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
45889
+ - \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
45890
  - \u56DE\u590D\u5185\u5BB9\u5E94\u6E05\u6670\u3001\u7ED3\u6784\u5316\uFF0C\u4FBF\u4E8E\u5BF9\u65B9\u89E3\u6790\u548C\u7EE7\u7EED\u5DE5\u4F5C
45137
45891
  </Mailbox Workflow>
45138
45892
 
@@ -45179,7 +45933,7 @@ ${workspacePath ? `
45179
45933
  let finalTools = [];
45180
45934
  let finalExcutor;
45181
45935
  if (!tools) {
45182
- const { registry: registry2, executor } = createTeamAgentTools();
45936
+ const { registry: registry2, executor } = createDepartmentAgentTools();
45183
45937
  registerTool(registry2, recallChatHistory(storage, topicStorage, recallIndexStorage));
45184
45938
  finalTools = getAllTools(registry2);
45185
45939
  finalExcutor = executor;
@@ -45329,26 +46083,26 @@ var handleParsingNestedValues = (form, key, value) => {
45329
46083
  };
45330
46084
 
45331
46085
  // node_modules/.pnpm/hono@4.12.9/node_modules/hono/dist/utils/url.js
45332
- var splitPath = (path16) => {
45333
- const paths = path16.split("/");
46086
+ var splitPath = (path17) => {
46087
+ const paths = path17.split("/");
45334
46088
  if (paths[0] === "") {
45335
46089
  paths.shift();
45336
46090
  }
45337
46091
  return paths;
45338
46092
  };
45339
46093
  var splitRoutingPath = (routePath) => {
45340
- const { groups, path: path16 } = extractGroupsFromPath(routePath);
45341
- const paths = splitPath(path16);
46094
+ const { groups, path: path17 } = extractGroupsFromPath(routePath);
46095
+ const paths = splitPath(path17);
45342
46096
  return replaceGroupMarks(paths, groups);
45343
46097
  };
45344
- var extractGroupsFromPath = (path16) => {
46098
+ var extractGroupsFromPath = (path17) => {
45345
46099
  const groups = [];
45346
- path16 = path16.replace(/\{[^}]+\}/g, (match2, index) => {
46100
+ path17 = path17.replace(/\{[^}]+\}/g, (match2, index) => {
45347
46101
  const mark = `@${index}`;
45348
46102
  groups.push([mark, match2]);
45349
46103
  return mark;
45350
46104
  });
45351
- return { groups, path: path16 };
46105
+ return { groups, path: path17 };
45352
46106
  };
45353
46107
  var replaceGroupMarks = (paths, groups) => {
45354
46108
  for (let i = groups.length - 1; i >= 0; i--) {
@@ -45405,8 +46159,8 @@ var getPath = (request) => {
45405
46159
  const queryIndex = url.indexOf("?", i);
45406
46160
  const hashIndex = url.indexOf("#", i);
45407
46161
  const end = queryIndex === -1 ? hashIndex === -1 ? void 0 : hashIndex : hashIndex === -1 ? queryIndex : Math.min(queryIndex, hashIndex);
45408
- const path16 = url.slice(start, end);
45409
- return tryDecodeURI(path16.includes("%25") ? path16.replace(/%25/g, "%2525") : path16);
46162
+ const path17 = url.slice(start, end);
46163
+ return tryDecodeURI(path17.includes("%25") ? path17.replace(/%25/g, "%2525") : path17);
45410
46164
  } else if (charCode === 63 || charCode === 35) {
45411
46165
  break;
45412
46166
  }
@@ -45423,11 +46177,11 @@ var mergePath = (base, sub, ...rest) => {
45423
46177
  }
45424
46178
  return `${base?.[0] === "/" ? "" : "/"}${base}${sub === "/" ? "" : `${base?.at(-1) === "/" ? "" : "/"}${sub?.[0] === "/" ? sub.slice(1) : sub}`}`;
45425
46179
  };
45426
- var checkOptionalParameter = (path16) => {
45427
- if (path16.charCodeAt(path16.length - 1) !== 63 || !path16.includes(":")) {
46180
+ var checkOptionalParameter = (path17) => {
46181
+ if (path17.charCodeAt(path17.length - 1) !== 63 || !path17.includes(":")) {
45428
46182
  return null;
45429
46183
  }
45430
- const segments = path16.split("/");
46184
+ const segments = path17.split("/");
45431
46185
  const results = [];
45432
46186
  let basePath = "";
45433
46187
  segments.forEach((segment) => {
@@ -45568,9 +46322,9 @@ var HonoRequest = class {
45568
46322
  */
45569
46323
  path;
45570
46324
  bodyCache = {};
45571
- constructor(request, path16 = "/", matchResult = [[]]) {
46325
+ constructor(request, path17 = "/", matchResult = [[]]) {
45572
46326
  this.raw = request;
45573
- this.path = path16;
46327
+ this.path = path17;
45574
46328
  this.#matchResult = matchResult;
45575
46329
  this.#validatedData = {};
45576
46330
  }
@@ -46307,8 +47061,8 @@ var Hono = class _Hono {
46307
47061
  return this;
46308
47062
  };
46309
47063
  });
46310
- this.on = (method, path16, ...handlers) => {
46311
- for (const p of [path16].flat()) {
47064
+ this.on = (method, path17, ...handlers) => {
47065
+ for (const p of [path17].flat()) {
46312
47066
  this.#path = p;
46313
47067
  for (const m of [method].flat()) {
46314
47068
  handlers.map((handler) => {
@@ -46365,8 +47119,8 @@ var Hono = class _Hono {
46365
47119
  * app.route("/api", app2) // GET /api/user
46366
47120
  * ```
46367
47121
  */
46368
- route(path16, app) {
46369
- const subApp = this.basePath(path16);
47122
+ route(path17, app) {
47123
+ const subApp = this.basePath(path17);
46370
47124
  app.routes.map((r) => {
46371
47125
  let handler;
46372
47126
  if (app.errorHandler === errorHandler) {
@@ -46392,9 +47146,9 @@ var Hono = class _Hono {
46392
47146
  * const api = new Hono().basePath('/api')
46393
47147
  * ```
46394
47148
  */
46395
- basePath(path16) {
47149
+ basePath(path17) {
46396
47150
  const subApp = this.#clone();
46397
- subApp._basePath = mergePath(this._basePath, path16);
47151
+ subApp._basePath = mergePath(this._basePath, path17);
46398
47152
  return subApp;
46399
47153
  }
46400
47154
  /**
@@ -46468,7 +47222,7 @@ var Hono = class _Hono {
46468
47222
  * })
46469
47223
  * ```
46470
47224
  */
46471
- mount(path16, applicationHandler, options) {
47225
+ mount(path17, applicationHandler, options) {
46472
47226
  let replaceRequest;
46473
47227
  let optionHandler;
46474
47228
  if (options) {
@@ -46495,7 +47249,7 @@ var Hono = class _Hono {
46495
47249
  return [c.env, executionContext];
46496
47250
  };
46497
47251
  replaceRequest ||= (() => {
46498
- const mergedPath = mergePath(this._basePath, path16);
47252
+ const mergedPath = mergePath(this._basePath, path17);
46499
47253
  const pathPrefixLength = mergedPath === "/" ? 0 : mergedPath.length;
46500
47254
  return (request) => {
46501
47255
  const url = new URL(request.url);
@@ -46510,14 +47264,14 @@ var Hono = class _Hono {
46510
47264
  }
46511
47265
  await next();
46512
47266
  };
46513
- this.#addRoute(METHOD_NAME_ALL, mergePath(path16, "*"), handler);
47267
+ this.#addRoute(METHOD_NAME_ALL, mergePath(path17, "*"), handler);
46514
47268
  return this;
46515
47269
  }
46516
- #addRoute(method, path16, handler) {
47270
+ #addRoute(method, path17, handler) {
46517
47271
  method = method.toUpperCase();
46518
- path16 = mergePath(this._basePath, path16);
46519
- const r = { basePath: this._basePath, path: path16, method, handler };
46520
- this.router.add(method, path16, [handler, r]);
47272
+ path17 = mergePath(this._basePath, path17);
47273
+ const r = { basePath: this._basePath, path: path17, method, handler };
47274
+ this.router.add(method, path17, [handler, r]);
46521
47275
  this.routes.push(r);
46522
47276
  }
46523
47277
  #handleError(err, c) {
@@ -46530,10 +47284,10 @@ var Hono = class _Hono {
46530
47284
  if (method === "HEAD") {
46531
47285
  return (async () => new Response(null, await this.#dispatch(request, executionCtx, env, "GET")))();
46532
47286
  }
46533
- const path16 = this.getPath(request, { env });
46534
- const matchResult = this.router.match(method, path16);
47287
+ const path17 = this.getPath(request, { env });
47288
+ const matchResult = this.router.match(method, path17);
46535
47289
  const c = new Context(request, {
46536
- path: path16,
47290
+ path: path17,
46537
47291
  matchResult,
46538
47292
  env,
46539
47293
  executionCtx,
@@ -46633,7 +47387,7 @@ var Hono = class _Hono {
46633
47387
 
46634
47388
  // node_modules/.pnpm/hono@4.12.9/node_modules/hono/dist/router/reg-exp-router/matcher.js
46635
47389
  var emptyParam = [];
46636
- function match(method, path16) {
47390
+ function match(method, path17) {
46637
47391
  const matchers = this.buildAllMatchers();
46638
47392
  const match2 = ((method2, path22) => {
46639
47393
  const matcher = matchers[method2] || matchers[METHOD_NAME_ALL];
@@ -46649,7 +47403,7 @@ function match(method, path16) {
46649
47403
  return [matcher[1][index], match3];
46650
47404
  });
46651
47405
  this.match = match2;
46652
- return match2(method, path16);
47406
+ return match2(method, path17);
46653
47407
  }
46654
47408
 
46655
47409
  // node_modules/.pnpm/hono@4.12.9/node_modules/hono/dist/router/reg-exp-router/node.js
@@ -46764,12 +47518,12 @@ var Node = class _Node {
46764
47518
  var Trie = class {
46765
47519
  #context = { varIndex: 0 };
46766
47520
  #root = new Node();
46767
- insert(path16, index, pathErrorCheckOnly) {
47521
+ insert(path17, index, pathErrorCheckOnly) {
46768
47522
  const paramAssoc = [];
46769
47523
  const groups = [];
46770
47524
  for (let i = 0; ; ) {
46771
47525
  let replaced = false;
46772
- path16 = path16.replace(/\{[^}]+\}/g, (m) => {
47526
+ path17 = path17.replace(/\{[^}]+\}/g, (m) => {
46773
47527
  const mark = `@\\${i}`;
46774
47528
  groups[i] = [mark, m];
46775
47529
  i++;
@@ -46780,7 +47534,7 @@ var Trie = class {
46780
47534
  break;
46781
47535
  }
46782
47536
  }
46783
- const tokens = path16.match(/(?::[^\/]+)|(?:\/\*$)|./g) || [];
47537
+ const tokens = path17.match(/(?::[^\/]+)|(?:\/\*$)|./g) || [];
46784
47538
  for (let i = groups.length - 1; i >= 0; i--) {
46785
47539
  const [mark] = groups[i];
46786
47540
  for (let j = tokens.length - 1; j >= 0; j--) {
@@ -46819,9 +47573,9 @@ var Trie = class {
46819
47573
  // node_modules/.pnpm/hono@4.12.9/node_modules/hono/dist/router/reg-exp-router/router.js
46820
47574
  var nullMatcher = [/^$/, [], /* @__PURE__ */ Object.create(null)];
46821
47575
  var wildcardRegExpCache = /* @__PURE__ */ Object.create(null);
46822
- function buildWildcardRegExp(path16) {
46823
- return wildcardRegExpCache[path16] ??= new RegExp(
46824
- path16 === "*" ? "" : `^${path16.replace(
47576
+ function buildWildcardRegExp(path17) {
47577
+ return wildcardRegExpCache[path17] ??= new RegExp(
47578
+ path17 === "*" ? "" : `^${path17.replace(
46825
47579
  /\/\*$|([.\\+*[^\]$()])/g,
46826
47580
  (_, metaChar) => metaChar ? `\\${metaChar}` : "(?:|/.*)"
46827
47581
  )}$`
@@ -46843,17 +47597,17 @@ function buildMatcherFromPreprocessedRoutes(routes) {
46843
47597
  );
46844
47598
  const staticMap = /* @__PURE__ */ Object.create(null);
46845
47599
  for (let i = 0, j = -1, len = routesWithStaticPathFlag.length; i < len; i++) {
46846
- const [pathErrorCheckOnly, path16, handlers] = routesWithStaticPathFlag[i];
47600
+ const [pathErrorCheckOnly, path17, handlers] = routesWithStaticPathFlag[i];
46847
47601
  if (pathErrorCheckOnly) {
46848
- staticMap[path16] = [handlers.map(([h]) => [h, /* @__PURE__ */ Object.create(null)]), emptyParam];
47602
+ staticMap[path17] = [handlers.map(([h]) => [h, /* @__PURE__ */ Object.create(null)]), emptyParam];
46849
47603
  } else {
46850
47604
  j++;
46851
47605
  }
46852
47606
  let paramAssoc;
46853
47607
  try {
46854
- paramAssoc = trie.insert(path16, j, pathErrorCheckOnly);
47608
+ paramAssoc = trie.insert(path17, j, pathErrorCheckOnly);
46855
47609
  } catch (e) {
46856
- throw e === PATH_ERROR ? new UnsupportedPathError(path16) : e;
47610
+ throw e === PATH_ERROR ? new UnsupportedPathError(path17) : e;
46857
47611
  }
46858
47612
  if (pathErrorCheckOnly) {
46859
47613
  continue;
@@ -46887,12 +47641,12 @@ function buildMatcherFromPreprocessedRoutes(routes) {
46887
47641
  }
46888
47642
  return [regexp, handlerMap, staticMap];
46889
47643
  }
46890
- function findMiddleware(middleware, path16) {
47644
+ function findMiddleware(middleware, path17) {
46891
47645
  if (!middleware) {
46892
47646
  return void 0;
46893
47647
  }
46894
47648
  for (const k of Object.keys(middleware).sort((a, b) => b.length - a.length)) {
46895
- if (buildWildcardRegExp(k).test(path16)) {
47649
+ if (buildWildcardRegExp(k).test(path17)) {
46896
47650
  return [...middleware[k]];
46897
47651
  }
46898
47652
  }
@@ -46906,7 +47660,7 @@ var RegExpRouter = class {
46906
47660
  this.#middleware = { [METHOD_NAME_ALL]: /* @__PURE__ */ Object.create(null) };
46907
47661
  this.#routes = { [METHOD_NAME_ALL]: /* @__PURE__ */ Object.create(null) };
46908
47662
  }
46909
- add(method, path16, handler) {
47663
+ add(method, path17, handler) {
46910
47664
  const middleware = this.#middleware;
46911
47665
  const routes = this.#routes;
46912
47666
  if (!middleware || !routes) {
@@ -46921,18 +47675,18 @@ var RegExpRouter = class {
46921
47675
  });
46922
47676
  });
46923
47677
  }
46924
- if (path16 === "/*") {
46925
- path16 = "*";
47678
+ if (path17 === "/*") {
47679
+ path17 = "*";
46926
47680
  }
46927
- const paramCount = (path16.match(/\/:/g) || []).length;
46928
- if (/\*$/.test(path16)) {
46929
- const re = buildWildcardRegExp(path16);
47681
+ const paramCount = (path17.match(/\/:/g) || []).length;
47682
+ if (/\*$/.test(path17)) {
47683
+ const re = buildWildcardRegExp(path17);
46930
47684
  if (method === METHOD_NAME_ALL) {
46931
47685
  Object.keys(middleware).forEach((m) => {
46932
- middleware[m][path16] ||= findMiddleware(middleware[m], path16) || findMiddleware(middleware[METHOD_NAME_ALL], path16) || [];
47686
+ middleware[m][path17] ||= findMiddleware(middleware[m], path17) || findMiddleware(middleware[METHOD_NAME_ALL], path17) || [];
46933
47687
  });
46934
47688
  } else {
46935
- middleware[method][path16] ||= findMiddleware(middleware[method], path16) || findMiddleware(middleware[METHOD_NAME_ALL], path16) || [];
47689
+ middleware[method][path17] ||= findMiddleware(middleware[method], path17) || findMiddleware(middleware[METHOD_NAME_ALL], path17) || [];
46936
47690
  }
46937
47691
  Object.keys(middleware).forEach((m) => {
46938
47692
  if (method === METHOD_NAME_ALL || method === m) {
@@ -46950,7 +47704,7 @@ var RegExpRouter = class {
46950
47704
  });
46951
47705
  return;
46952
47706
  }
46953
- const paths = checkOptionalParameter(path16) || [path16];
47707
+ const paths = checkOptionalParameter(path17) || [path17];
46954
47708
  for (let i = 0, len = paths.length; i < len; i++) {
46955
47709
  const path22 = paths[i];
46956
47710
  Object.keys(routes).forEach((m) => {
@@ -46977,13 +47731,13 @@ var RegExpRouter = class {
46977
47731
  const routes = [];
46978
47732
  let hasOwnRoute = method === METHOD_NAME_ALL;
46979
47733
  [this.#middleware, this.#routes].forEach((r) => {
46980
- const ownRoute = r[method] ? Object.keys(r[method]).map((path16) => [path16, r[method][path16]]) : [];
47734
+ const ownRoute = r[method] ? Object.keys(r[method]).map((path17) => [path17, r[method][path17]]) : [];
46981
47735
  if (ownRoute.length !== 0) {
46982
47736
  hasOwnRoute ||= true;
46983
47737
  routes.push(...ownRoute);
46984
47738
  } else if (method !== METHOD_NAME_ALL) {
46985
47739
  routes.push(
46986
- ...Object.keys(r[METHOD_NAME_ALL]).map((path16) => [path16, r[METHOD_NAME_ALL][path16]])
47740
+ ...Object.keys(r[METHOD_NAME_ALL]).map((path17) => [path17, r[METHOD_NAME_ALL][path17]])
46987
47741
  );
46988
47742
  }
46989
47743
  });
@@ -47003,13 +47757,13 @@ var SmartRouter = class {
47003
47757
  constructor(init) {
47004
47758
  this.#routers = init.routers;
47005
47759
  }
47006
- add(method, path16, handler) {
47760
+ add(method, path17, handler) {
47007
47761
  if (!this.#routes) {
47008
47762
  throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT);
47009
47763
  }
47010
- this.#routes.push([method, path16, handler]);
47764
+ this.#routes.push([method, path17, handler]);
47011
47765
  }
47012
- match(method, path16) {
47766
+ match(method, path17) {
47013
47767
  if (!this.#routes) {
47014
47768
  throw new Error("Fatal error");
47015
47769
  }
@@ -47024,7 +47778,7 @@ var SmartRouter = class {
47024
47778
  for (let i2 = 0, len2 = routes.length; i2 < len2; i2++) {
47025
47779
  router.add(...routes[i2]);
47026
47780
  }
47027
- res = router.match(method, path16);
47781
+ res = router.match(method, path17);
47028
47782
  } catch (e) {
47029
47783
  if (e instanceof UnsupportedPathError) {
47030
47784
  continue;
@@ -47074,10 +47828,10 @@ var Node2 = class _Node2 {
47074
47828
  }
47075
47829
  this.#patterns = [];
47076
47830
  }
47077
- insert(method, path16, handler) {
47831
+ insert(method, path17, handler) {
47078
47832
  this.#order = ++this.#order;
47079
47833
  let curNode = this;
47080
- const parts = splitRoutingPath(path16);
47834
+ const parts = splitRoutingPath(path17);
47081
47835
  const possibleKeys = [];
47082
47836
  for (let i = 0, len = parts.length; i < len; i++) {
47083
47837
  const p = parts[i];
@@ -47126,12 +47880,12 @@ var Node2 = class _Node2 {
47126
47880
  }
47127
47881
  }
47128
47882
  }
47129
- search(method, path16) {
47883
+ search(method, path17) {
47130
47884
  const handlerSets = [];
47131
47885
  this.#params = emptyParams;
47132
47886
  const curNode = this;
47133
47887
  let curNodes = [curNode];
47134
- const parts = splitPath(path16);
47888
+ const parts = splitPath(path17);
47135
47889
  const curNodesQueue = [];
47136
47890
  const len = parts.length;
47137
47891
  let partOffsets = null;
@@ -47173,13 +47927,13 @@ var Node2 = class _Node2 {
47173
47927
  if (matcher instanceof RegExp) {
47174
47928
  if (partOffsets === null) {
47175
47929
  partOffsets = new Array(len);
47176
- let offset = path16[0] === "/" ? 1 : 0;
47930
+ let offset = path17[0] === "/" ? 1 : 0;
47177
47931
  for (let p = 0; p < len; p++) {
47178
47932
  partOffsets[p] = offset;
47179
47933
  offset += parts[p].length + 1;
47180
47934
  }
47181
47935
  }
47182
- const restPathString = path16.substring(partOffsets[i]);
47936
+ const restPathString = path17.substring(partOffsets[i]);
47183
47937
  const m = matcher.exec(restPathString);
47184
47938
  if (m) {
47185
47939
  params[name] = m[0];
@@ -47232,18 +47986,18 @@ var TrieRouter = class {
47232
47986
  constructor() {
47233
47987
  this.#node = new Node2();
47234
47988
  }
47235
- add(method, path16, handler) {
47236
- const results = checkOptionalParameter(path16);
47989
+ add(method, path17, handler) {
47990
+ const results = checkOptionalParameter(path17);
47237
47991
  if (results) {
47238
47992
  for (let i = 0, len = results.length; i < len; i++) {
47239
47993
  this.#node.insert(method, results[i], handler);
47240
47994
  }
47241
47995
  return;
47242
47996
  }
47243
- this.#node.insert(method, path16, handler);
47997
+ this.#node.insert(method, path17, handler);
47244
47998
  }
47245
- match(method, path16) {
47246
- return this.#node.search(method, path16);
47999
+ match(method, path17) {
48000
+ return this.#node.search(method, path17);
47247
48001
  }
47248
48002
  };
47249
48003
 
@@ -47945,10 +48699,10 @@ var createStreamBody = (stream) => {
47945
48699
  });
47946
48700
  return body;
47947
48701
  };
47948
- var getStats = (path16) => {
48702
+ var getStats = (path17) => {
47949
48703
  let stats;
47950
48704
  try {
47951
- stats = (0, import_fs15.statSync)(path16);
48705
+ stats = (0, import_fs15.statSync)(path17);
47952
48706
  } catch {
47953
48707
  }
47954
48708
  return stats;
@@ -47991,21 +48745,21 @@ var serveStatic = (options = { root: "" }) => {
47991
48745
  return next();
47992
48746
  }
47993
48747
  }
47994
- let path16 = (0, import_path20.join)(
48748
+ let path17 = (0, import_path20.join)(
47995
48749
  root,
47996
48750
  !optionPath && options.rewriteRequestPath ? options.rewriteRequestPath(filename, c) : filename
47997
48751
  );
47998
- let stats = getStats(path16);
48752
+ let stats = getStats(path17);
47999
48753
  if (stats && stats.isDirectory()) {
48000
48754
  const indexFile = options.index ?? "index.html";
48001
- path16 = (0, import_path20.join)(path16, indexFile);
48002
- stats = getStats(path16);
48755
+ path17 = (0, import_path20.join)(path17, indexFile);
48756
+ stats = getStats(path17);
48003
48757
  }
48004
48758
  if (!stats) {
48005
- await options.onNotFound?.(path16, c);
48759
+ await options.onNotFound?.(path17, c);
48006
48760
  return next();
48007
48761
  }
48008
- const mimeType = getMimeType(path16);
48762
+ const mimeType = getMimeType(path17);
48009
48763
  c.header("Content-Type", mimeType || "application/octet-stream");
48010
48764
  if (options.precompressed && (!mimeType || COMPRESSIBLE_CONTENT_TYPE_REGEX.test(mimeType))) {
48011
48765
  const acceptEncodingSet = new Set(
@@ -48015,12 +48769,12 @@ var serveStatic = (options = { root: "" }) => {
48015
48769
  if (!acceptEncodingSet.has(encoding)) {
48016
48770
  continue;
48017
48771
  }
48018
- const precompressedStats = getStats(path16 + ENCODINGS[encoding]);
48772
+ const precompressedStats = getStats(path17 + ENCODINGS[encoding]);
48019
48773
  if (precompressedStats) {
48020
48774
  c.header("Content-Encoding", encoding);
48021
48775
  c.header("Vary", "Accept-Encoding", { append: true });
48022
48776
  stats = precompressedStats;
48023
- path16 = path16 + ENCODINGS[encoding];
48777
+ path17 = path17 + ENCODINGS[encoding];
48024
48778
  break;
48025
48779
  }
48026
48780
  }
@@ -48034,7 +48788,7 @@ var serveStatic = (options = { root: "" }) => {
48034
48788
  result = c.body(null);
48035
48789
  } else if (!range) {
48036
48790
  c.header("Content-Length", size.toString());
48037
- result = c.body(createStreamBody((0, import_fs15.createReadStream)(path16)), 200);
48791
+ result = c.body(createStreamBody((0, import_fs15.createReadStream)(path17)), 200);
48038
48792
  } else {
48039
48793
  c.header("Accept-Ranges", "bytes");
48040
48794
  c.header("Date", stats.birthtime.toUTCString());
@@ -48045,12 +48799,12 @@ var serveStatic = (options = { root: "" }) => {
48045
48799
  end = size - 1;
48046
48800
  }
48047
48801
  const chunksize = end - start + 1;
48048
- const stream = (0, import_fs15.createReadStream)(path16, { start, end });
48802
+ const stream = (0, import_fs15.createReadStream)(path17, { start, end });
48049
48803
  c.header("Content-Length", chunksize.toString());
48050
48804
  c.header("Content-Range", `bytes ${start}-${end}/${stats.size}`);
48051
48805
  result = c.body(createStreamBody(stream), 206);
48052
48806
  }
48053
- await options.onFound?.(path16, c);
48807
+ await options.onFound?.(path17, c);
48054
48808
  return result;
48055
48809
  };
48056
48810
  };
@@ -48145,7 +48899,7 @@ var cors = (options) => {
48145
48899
 
48146
48900
  // src/server/index.ts
48147
48901
  var import_promises11 = require("node:fs/promises");
48148
- var import_node_path13 = __toESM(require("node:path"));
48902
+ var import_node_path14 = __toESM(require("node:path"));
48149
48903
 
48150
48904
  // src/git/worktree.ts
48151
48905
  var import_child_process2 = require("child_process");
@@ -48650,7 +49404,7 @@ agentRoutes.post("/goals/:gid/tasks/:tid/run", async (c) => {
48650
49404
  platform: "kanban",
48651
49405
  userId: `kanban:${gid}:${tid}`,
48652
49406
  requestId,
48653
- teamAgentId: "",
49407
+ departmentAgentId: "",
48654
49408
  content: prompt,
48655
49409
  workspacePath: task.worktree?.path
48656
49410
  };
@@ -48740,7 +49494,7 @@ agentRoutes.post("/goals/:gid/tasks/:tid/chat", async (c) => {
48740
49494
  platform: "kanban",
48741
49495
  userId: `kanban:${gid}:${tid}`,
48742
49496
  requestId,
48743
- teamAgentId: "",
49497
+ departmentAgentId: "",
48744
49498
  content: prompt,
48745
49499
  workspacePath: task.worktree?.path
48746
49500
  };
@@ -48856,7 +49610,7 @@ agentRoutes.post("/goals/:gid/chat", async (c) => {
48856
49610
  platform: "kanban",
48857
49611
  userId: threadId,
48858
49612
  requestId,
48859
- teamAgentId: "",
49613
+ departmentAgentId: "",
48860
49614
  content: prompt
48861
49615
  };
48862
49616
  const config2 = getDefaultAgentConfig();
@@ -48954,67 +49708,66 @@ agentRoutes.get("/goals/:gid/chat/logs", async (c) => {
48954
49708
  return c.json({ logs, running: isRunning });
48955
49709
  });
48956
49710
 
48957
- // src/server/routes/teams.ts
48958
- var teamRoutes = new Hono2();
48959
- teamRoutes.get("/teams", (c) => {
49711
+ // src/server/routes/departments.ts
49712
+ var departmentRoutes = new Hono2();
49713
+ departmentRoutes.get("/departments", (c) => {
48960
49714
  try {
48961
- const teams = listTeams();
48962
- return c.json(teams);
49715
+ return c.json(listDepartments());
48963
49716
  } catch (err) {
48964
- return c.json({ error: err.message || "Failed to list teams" }, 500);
49717
+ return c.json({ error: err.message || "Failed to list departments" }, 500);
48965
49718
  }
48966
49719
  });
48967
- teamRoutes.get("/teams/:name", (c) => {
49720
+ departmentRoutes.get("/departments/:name", (c) => {
48968
49721
  const name = c.req.param("name");
48969
- const team = getTeam(name);
48970
- if (!team) return c.json({ error: "Team not found" }, 404);
48971
- return c.json(team);
49722
+ const department = getDepartment(name);
49723
+ if (!department) return c.json({ error: "Department not found" }, 404);
49724
+ return c.json(department);
48972
49725
  });
48973
- teamRoutes.post("/teams", async (c) => {
49726
+ departmentRoutes.post("/departments", async (c) => {
48974
49727
  const body = await c.req.json();
48975
- if (!body.id || !body.name || !body.goalId) {
48976
- return c.json({ error: "id, name, and goalId are required" }, 400);
49728
+ if (!body.id || !body.name) {
49729
+ return c.json({ error: "id and name are required" }, 400);
48977
49730
  }
48978
- const teamDefinition = {
49731
+ const departmentDefinition = {
48979
49732
  id: body.id,
48980
49733
  name: body.name,
48981
- goalId: body.goalId,
49734
+ sourceGoalId: body.sourceGoalId,
49735
+ charter: body.charter,
48982
49736
  workpath: body.workpath,
48983
- teamMembers: body.teamMembers ?? []
49737
+ departmentMembers: body.departmentMembers ?? []
48984
49738
  };
48985
49739
  try {
48986
- const team = createTeam(teamDefinition);
48987
- return c.json(team, 201);
49740
+ const department = createDepartment(departmentDefinition);
49741
+ return c.json(department, 201);
48988
49742
  } catch (err) {
48989
- return c.json({ error: err.message || "Failed to create team" }, 500);
49743
+ return c.json({ error: err.message || "Failed to create department" }, 500);
48990
49744
  }
48991
49745
  });
48992
- teamRoutes.delete("/teams/:name", async (c) => {
49746
+ departmentRoutes.delete("/departments/:name", async (c) => {
48993
49747
  const name = c.req.param("name");
48994
- const team = getTeam(name);
48995
- if (!team) return c.json({ error: "Team not found" }, 404);
49748
+ const department = getDepartment(name);
49749
+ if (!department) return c.json({ error: "Department not found" }, 404);
48996
49750
  try {
48997
- deleteTeam(name);
49751
+ deleteDepartment(name);
48998
49752
  return c.json({ ok: true });
48999
49753
  } catch (err) {
49000
- return c.json({ error: err.message || "Failed to delete team" }, 500);
49754
+ return c.json({ error: err.message || "Failed to delete department" }, 500);
49001
49755
  }
49002
49756
  });
49003
- teamRoutes.get("/teams/:name/members", (c) => {
49757
+ departmentRoutes.get("/departments/:name/members", (c) => {
49004
49758
  const name = c.req.param("name");
49005
- const team = getTeam(name);
49006
- if (!team) return c.json({ error: "Team not found" }, 404);
49759
+ const department = getDepartment(name);
49760
+ if (!department) return c.json({ error: "Department not found" }, 404);
49007
49761
  try {
49008
- const members = listTeamMember(name);
49009
- return c.json(members);
49762
+ return c.json(listDepartmentMembers(name));
49010
49763
  } catch (err) {
49011
49764
  return c.json({ error: err.message || "Failed to list members" }, 500);
49012
49765
  }
49013
49766
  });
49014
- teamRoutes.post("/teams/:name/members", async (c) => {
49015
- const teamName = c.req.param("name");
49016
- const team = getTeam(teamName);
49017
- if (!team) return c.json({ error: "Team not found" }, 404);
49767
+ departmentRoutes.post("/departments/:name/members", async (c) => {
49768
+ const departmentName = c.req.param("name");
49769
+ const department = getDepartment(departmentName);
49770
+ if (!department) return c.json({ error: "Department not found" }, 404);
49018
49771
  const body = await c.req.json();
49019
49772
  if (!body.id || !body.name) {
49020
49773
  return c.json({ error: "id and name are required" }, 400);
@@ -49022,36 +49775,39 @@ teamRoutes.post("/teams/:name/members", async (c) => {
49022
49775
  const memberDefinition = {
49023
49776
  id: body.id,
49024
49777
  name: body.name,
49025
- teamId: team.id,
49026
- mailBoxId: `${teamName}::${body.name}`,
49027
- workspaceId: `${teamName}::${body.name}`,
49778
+ departmentId: department.id,
49779
+ mailBoxId: `${departmentName}::${body.name}`,
49780
+ workspaceId: `${departmentName}::${body.name}`,
49781
+ role: body.role,
49028
49782
  focusOn: body.focusOn
49029
49783
  };
49030
49784
  try {
49031
- const member = createTeamMember(memberDefinition);
49785
+ const member = createDepartmentMember(memberDefinition);
49032
49786
  return c.json(member, 201);
49033
49787
  } catch (err) {
49034
49788
  return c.json({ error: err.message || "Failed to create member" }, 500);
49035
49789
  }
49036
49790
  });
49037
- teamRoutes.delete("/teams/:name/members/:memberId", async (c) => {
49038
- const teamName = c.req.param("name");
49039
- const memberId = c.req.param("memberId");
49040
- const team = getTeam(teamName);
49041
- if (!team) return c.json({ error: "Team not found" }, 404);
49791
+ departmentRoutes.delete("/departments/:name/members/:memberId", async (c) => {
49792
+ const departmentName = c.req.param("name");
49793
+ const memberParam = c.req.param("memberId");
49794
+ const department = getDepartment(departmentName);
49795
+ if (!department) return c.json({ error: "Department not found" }, 404);
49042
49796
  try {
49043
- deleteTeamMemberById(teamName, memberId);
49797
+ const member = getDepartmentMember(departmentName, memberParam) ?? getDepartmentMemberByName(departmentName, memberParam);
49798
+ if (!member) return c.json({ error: "Member not found" }, 404);
49799
+ deleteDepartmentMemberById(departmentName, member.id);
49044
49800
  return c.json({ ok: true });
49045
49801
  } catch (err) {
49046
49802
  return c.json({ error: err.message || "Failed to delete member" }, 500);
49047
49803
  }
49048
49804
  });
49049
- teamRoutes.get("/teams/:name/activity", (c) => {
49805
+ departmentRoutes.get("/departments/:name/activity", (c) => {
49050
49806
  const name = c.req.param("name");
49051
- const team = getTeam(name);
49052
- if (!team) return c.json({ error: "Team not found" }, 404);
49807
+ const department = getDepartment(name);
49808
+ if (!department) return c.json({ error: "Department not found" }, 404);
49053
49809
  try {
49054
- const members = listTeamMember(name);
49810
+ const members = listDepartmentMembers(name);
49055
49811
  if (members.length === 0) return c.json({ messages: [] });
49056
49812
  const mailboxIds = members.map((m) => m.mailBoxId);
49057
49813
  const placeholders = mailboxIds.map(() => "?").join(", ");
@@ -49079,12 +49835,12 @@ teamRoutes.get("/teams/:name/activity", (c) => {
49079
49835
  return c.json({ error: err.message || "Failed to get activity" }, 500);
49080
49836
  }
49081
49837
  });
49082
- teamRoutes.get("/teams/:name/members/:memberName/context", async (c) => {
49838
+ departmentRoutes.get("/departments/:name/members/:memberName/context", async (c) => {
49083
49839
  const name = c.req.param("name");
49084
49840
  const memberName = c.req.param("memberName");
49085
- const team = getTeam(name);
49086
- if (!team) return c.json({ error: "Team not found" }, 404);
49087
- const member = getTeamMemberByName(name, memberName);
49841
+ const department = getDepartment(name);
49842
+ if (!department) return c.json({ error: "Department not found" }, 404);
49843
+ const member = getDepartmentMemberByName(name, memberName);
49088
49844
  if (!member) return c.json({ error: "Member not found" }, 404);
49089
49845
  const mailBoxId = `${name}::${memberName}`;
49090
49846
  let messages = [];
@@ -49137,9 +49893,7 @@ teamRoutes.get("/teams/:name/members/:memberName/context", async (c) => {
49137
49893
  }
49138
49894
  agentLogs = allMessages.map((msg, idx) => {
49139
49895
  const blocks = msg.content.map((block) => {
49140
- if (block.type === "text") {
49141
- return { type: "text", text: block.text };
49142
- }
49896
+ if (block.type === "text") return { type: "text", text: block.text };
49143
49897
  if (block.type === "tool_use") {
49144
49898
  return {
49145
49899
  type: "tool_use",
@@ -49157,11 +49911,7 @@ teamRoutes.get("/teams/:name/members/:memberName/context", async (c) => {
49157
49911
  }
49158
49912
  return { type: "unknown" };
49159
49913
  });
49160
- return {
49161
- index: idx,
49162
- role: msg.role,
49163
- blocks
49164
- };
49914
+ return { index: idx, role: msg.role, blocks };
49165
49915
  });
49166
49916
  } catch {
49167
49917
  agentLogs = [];
@@ -49202,7 +49952,7 @@ cronRoutes.post("/cron/jobs", async (c) => {
49202
49952
  platform: body.delivery.channel,
49203
49953
  userId: body.delivery.to,
49204
49954
  requestId: (0, import_crypto7.randomUUID)().slice(0, 8),
49205
- teamAgentId: ""
49955
+ departmentAgentId: ""
49206
49956
  }
49207
49957
  );
49208
49958
  return c.json(job, 201);
@@ -49363,8 +50113,8 @@ mailboxRoutes.get("/mailbox/summary", (c) => {
49363
50113
 
49364
50114
  // src/server/routes/memory.ts
49365
50115
  var import_redis4 = __toESM(require_dist2());
49366
- var import_node_fs6 = require("node:fs");
49367
- var import_node_path12 = __toESM(require("node:path"));
50116
+ var import_node_fs7 = require("node:fs");
50117
+ var import_node_path13 = __toESM(require("node:path"));
49368
50118
  var memoryEngineSingleton = null;
49369
50119
  var dreamStorageSingleton = null;
49370
50120
  var dreamHistoryStorageSingleton = null;
@@ -49464,29 +50214,49 @@ var addPlausibleUserId = (set, userId) => {
49464
50214
  if (normalized && isPlausibleUserId(normalized)) set.add(normalized);
49465
50215
  };
49466
50216
  var readJsonFilesFromDir = (dir) => {
49467
- if (!(0, import_node_fs6.existsSync)(dir)) return [];
50217
+ if (!(0, import_node_fs7.existsSync)(dir)) return [];
49468
50218
  const result = [];
49469
- for (const file of (0, import_node_fs6.readdirSync)(dir)) {
50219
+ for (const file of (0, import_node_fs7.readdirSync)(dir)) {
49470
50220
  if (!file.endsWith(".json")) continue;
49471
50221
  try {
49472
- result.push(JSON.parse((0, import_node_fs6.readFileSync)(import_node_path12.default.join(dir, file), "utf-8")));
50222
+ result.push(JSON.parse((0, import_node_fs7.readFileSync)(import_node_path13.default.join(dir, file), "utf-8")));
49473
50223
  } catch (err) {
49474
50224
  console.warn(`[memoryRoutes] \u8DF3\u8FC7\u65E0\u6CD5\u89E3\u6790\u7684\u672C\u5730\u4E0A\u4E0B\u6587\u6587\u4EF6 ${file}: ${err.message}`);
49475
50225
  }
49476
50226
  }
49477
50227
  return result;
49478
50228
  };
50229
+ var extractFileBackedStorageKeysForTest = (dataDir) => {
50230
+ const kvRoot = import_node_path13.default.join(dataDir, "kv");
50231
+ if (!(0, import_node_fs7.existsSync)(kvRoot)) return [];
50232
+ const keys = [];
50233
+ for (const prefixDir of (0, import_node_fs7.readdirSync)(kvRoot)) {
50234
+ const absolutePrefixDir = import_node_path13.default.join(kvRoot, prefixDir);
50235
+ if (!(0, import_node_fs7.existsSync)(absolutePrefixDir)) continue;
50236
+ for (const file of (0, import_node_fs7.readdirSync)(absolutePrefixDir)) {
50237
+ if (!file.endsWith(".json")) continue;
50238
+ try {
50239
+ const logicalKey = Buffer.from(file.replace(/\.json$/, ""), "base64url").toString("utf8");
50240
+ const normalizedPrefix = prefixDir.replace(/[:/\\]+$/g, "") || "agent";
50241
+ keys.push(`${normalizedPrefix}:${logicalKey}`);
50242
+ } catch (err) {
50243
+ console.warn(`[memoryRoutes] \u8DF3\u8FC7\u65E0\u6CD5\u89E3\u7801\u7684\u672C\u5730\u5B58\u50A8 key ${file}: ${err.message}`);
50244
+ }
50245
+ }
50246
+ }
50247
+ return keys;
50248
+ };
49479
50249
  var collectLocalConversationUserIds = () => {
49480
50250
  return extractLocalConversationUserIdsForTest(getDuclawHomeDir());
49481
50251
  };
49482
50252
  var extractLocalConversationUserIdsForTest = (homeDir) => {
49483
50253
  const userIds = /* @__PURE__ */ new Set();
49484
- for (const context of readJsonFilesFromDir(import_node_path12.default.join(homeDir, "goal-context"))) {
50254
+ for (const context of readJsonFilesFromDir(import_node_path13.default.join(homeDir, "goal-context"))) {
49485
50255
  addPlausibleUserId(userIds, context.threadId);
49486
50256
  addPlausibleUserId(userIds, context.originUserId);
49487
50257
  if (context.goalId) addPlausibleUserId(userIds, `kanban:goal:${context.goalId}`);
49488
50258
  }
49489
- for (const goal of readJsonFilesFromDir(import_node_path12.default.join(homeDir, "tasks"))) {
50259
+ for (const goal of readJsonFilesFromDir(import_node_path13.default.join(homeDir, "tasks"))) {
49490
50260
  if (goal.id) addPlausibleUserId(userIds, `kanban:goal:${goal.id}`);
49491
50261
  }
49492
50262
  return userIds;
@@ -49526,6 +50296,9 @@ var collectUserIds = async () => {
49526
50296
  const localConversationUserIds = collectLocalConversationUserIds();
49527
50297
  for (const userId of localConversationUserIds) userIds.add(userId);
49528
50298
  if (isFileBackedRuntime()) {
50299
+ for (const userId of extractMemoryUserIdsFromKeys(extractFileBackedStorageKeysForTest(getDuclawDataDir()))) {
50300
+ userIds.add(userId);
50301
+ }
49529
50302
  return { userIds: Array.from(userIds), localConversationUserIds };
49530
50303
  }
49531
50304
  const client2 = await getRedisClient();
@@ -49777,7 +50550,7 @@ var systemRoutes = new Hono2();
49777
50550
  var startTime = Date.now();
49778
50551
  systemRoutes.get("/system/info", (c) => {
49779
50552
  return c.json({
49780
- version: true ? "1.8.0" : "unknown",
50553
+ version: true ? "1.8.2" : "unknown",
49781
50554
  uptime: Math.floor((Date.now() - startTime) / 1e3),
49782
50555
  env: process.env.NODE_ENV || "development",
49783
50556
  nodeVersion: process.version
@@ -49793,7 +50566,7 @@ function createServer() {
49793
50566
  app.route("/api", taskRoutes);
49794
50567
  app.route("/api", worktreeRoutes);
49795
50568
  app.route("/api", agentRoutes);
49796
- app.route("/api", teamRoutes);
50569
+ app.route("/api", departmentRoutes);
49797
50570
  app.route("/api", cronRoutes);
49798
50571
  app.route("/api", mailboxRoutes);
49799
50572
  app.route("/api", memoryRoutes);
@@ -49801,7 +50574,7 @@ function createServer() {
49801
50574
  app.route("/api", systemRoutes);
49802
50575
  app.use("/*", serveStatic({ root: webDistRoot }));
49803
50576
  app.get("/*", async (c) => {
49804
- const indexHtml = await (0, import_promises11.readFile)(import_node_path13.default.join(webDistRoot, "index.html"), "utf8");
50577
+ const indexHtml = await (0, import_promises11.readFile)(import_node_path14.default.join(webDistRoot, "index.html"), "utf8");
49805
50578
  const tenantId = c.req.header("x-tenant-id");
49806
50579
  const assetBase = tenantId ? `/t/${tenantId}` : "";
49807
50580
  const html = indexHtml.replaceAll('"./', `"${assetBase}/`);
@@ -49815,6 +50588,18 @@ function startServer(port = 3e3) {
49815
50588
  console.log(`[server] Kanban HTTP \u670D\u52A1\u5668\u5DF2\u542F\u52A8: http://localhost:${port}`);
49816
50589
  }
49817
50590
 
50591
+ // src/channels/gatewayOwner.ts
50592
+ function normalizeChannelGatewayOwner(value) {
50593
+ const normalized = value?.trim().toLowerCase();
50594
+ if (!normalized) return "core";
50595
+ if (normalized === "core" || normalized === "saas") return normalized;
50596
+ throw new Error(`invalid_channel_gateway_owner:${value}`);
50597
+ }
50598
+ function shouldStartCoreChannelGateways(env = process.env) {
50599
+ if (env.DUCLAW_DISABLE_CHANNEL_GATEWAY === "true") return false;
50600
+ return normalizeChannelGatewayOwner(env.CHANNEL_GATEWAY_OWNER) === "core";
50601
+ }
50602
+
49818
50603
  // src/main.ts
49819
50604
  var cliResult = handleCliCommand(process.argv.slice(2));
49820
50605
  if (cliResult !== void 0) {
@@ -49849,18 +50634,23 @@ async function main() {
49849
50634
  const { registry: registry2 } = createDefaultChannels();
49850
50635
  const channels = getAllChannels(registry2);
49851
50636
  const abortController = new AbortController();
49852
- for (const channel of channels) {
49853
- const account = channel.config.resolveAccount(cfg);
49854
- const ctx = {
49855
- cfg,
49856
- accountId: channel.id,
49857
- account,
49858
- abortSignal: abortController.signal
49859
- };
49860
- console.log(`[main] \u542F\u52A8 Channel Gateway: ${channel.meta.label}`);
49861
- await channel.gateway.startAccount(ctx);
49862
- }
49863
- console.log(`[main] \u6240\u6709 Channel \u5DF2\u542F\u52A8\uFF0C\u7B49\u5F85\u6D88\u606F...`);
50637
+ const channelGatewaysStarted = shouldStartCoreChannelGateways();
50638
+ if (channelGatewaysStarted) {
50639
+ for (const channel of channels) {
50640
+ const account = channel.config.resolveAccount(cfg);
50641
+ const ctx = {
50642
+ cfg,
50643
+ accountId: channel.id,
50644
+ account,
50645
+ abortSignal: abortController.signal
50646
+ };
50647
+ console.log(`[main] \u542F\u52A8 Channel Gateway: ${channel.meta.label}`);
50648
+ await channel.gateway.startAccount(ctx);
50649
+ }
50650
+ console.log(`[main] \u6240\u6709 Channel \u5DF2\u542F\u52A8\uFF0C\u7B49\u5F85\u6D88\u606F...`);
50651
+ } else {
50652
+ console.log(`[main] Core Channel Gateway \u5DF2\u8DF3\u8FC7\uFF0C\u5F53\u524D\u5916\u90E8\u6D88\u606F\u5165\u53E3\u7531 SaaS \u5C42\u63A5\u7BA1`);
50653
+ }
49864
50654
  startScheduler();
49865
50655
  console.log(`[main] \u5B9A\u65F6\u4EFB\u52A1\u8C03\u5EA6\u5668\u5DF2\u542F\u52A8`);
49866
50656
  startMailboxPoller();
@@ -49871,14 +50661,16 @@ async function main() {
49871
50661
  console.log(`
49872
50662
  [main] \u6536\u5230\u9000\u51FA\u4FE1\u53F7\uFF0C\u6B63\u5728\u505C\u6B62\u6240\u6709 Channel...`);
49873
50663
  abortController.abort();
49874
- for (const channel of channels) {
49875
- const ctx = {
49876
- cfg,
49877
- accountId: channel.id,
49878
- account: channel.config.resolveAccount(cfg),
49879
- abortSignal: abortController.signal
49880
- };
49881
- await channel.gateway.stopAccount(ctx);
50664
+ if (channelGatewaysStarted) {
50665
+ for (const channel of channels) {
50666
+ const ctx = {
50667
+ cfg,
50668
+ accountId: channel.id,
50669
+ account: channel.config.resolveAccount(cfg),
50670
+ abortSignal: abortController.signal
50671
+ };
50672
+ await channel.gateway.stopAccount(ctx);
50673
+ }
49882
50674
  }
49883
50675
  console.log(`[main] \u6240\u6709 Channel \u5DF2\u505C\u6B62\uFF0C\u9000\u51FA`);
49884
50676
  process.exit(0);