claude-threads 1.38.0 → 1.39.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12683,20 +12683,469 @@ var init_types = __esm(() => {
12683
12683
  REMOTE_KEYS = new Set(["type", "url", "headers"]);
12684
12684
  });
12685
12685
 
12686
- // src/utils/spawn.ts
12687
- import { spawn as nodeSpawn, spawnSync as nodeSpawnSync } from "child_process";
12688
- function addWindowsShell(options) {
12689
- if (isWindows && options.shell === undefined) {
12690
- return { ...options, shell: true };
12686
+ // node_modules/isexe/windows.js
12687
+ var require_windows = __commonJS(function(exports, module) {
12688
+ module.exports = isexe;
12689
+ isexe.sync = sync;
12690
+ var fs = __require("fs");
12691
+ function checkPathExt(path, options) {
12692
+ var pathext = options.pathExt !== undefined ? options.pathExt : process.env.PATHEXT;
12693
+ if (!pathext) {
12694
+ return true;
12695
+ }
12696
+ pathext = pathext.split(";");
12697
+ if (pathext.indexOf("") !== -1) {
12698
+ return true;
12699
+ }
12700
+ for (var i = 0;i < pathext.length; i++) {
12701
+ var p = pathext[i].toLowerCase();
12702
+ if (p && path.substr(-p.length).toLowerCase() === p) {
12703
+ return true;
12704
+ }
12705
+ }
12706
+ return false;
12691
12707
  }
12692
- return options;
12693
- }
12708
+ function checkStat(stat, path, options) {
12709
+ if (!stat.isSymbolicLink() && !stat.isFile()) {
12710
+ return false;
12711
+ }
12712
+ return checkPathExt(path, options);
12713
+ }
12714
+ function isexe(path, options, cb) {
12715
+ fs.stat(path, function(er, stat) {
12716
+ cb(er, er ? false : checkStat(stat, path, options));
12717
+ });
12718
+ }
12719
+ function sync(path, options) {
12720
+ return checkStat(fs.statSync(path), path, options);
12721
+ }
12722
+ });
12723
+
12724
+ // node_modules/isexe/mode.js
12725
+ var require_mode = __commonJS(function(exports, module) {
12726
+ module.exports = isexe;
12727
+ isexe.sync = sync;
12728
+ var fs = __require("fs");
12729
+ function isexe(path, options, cb) {
12730
+ fs.stat(path, function(er, stat) {
12731
+ cb(er, er ? false : checkStat(stat, options));
12732
+ });
12733
+ }
12734
+ function sync(path, options) {
12735
+ return checkStat(fs.statSync(path), options);
12736
+ }
12737
+ function checkStat(stat, options) {
12738
+ return stat.isFile() && checkMode(stat, options);
12739
+ }
12740
+ function checkMode(stat, options) {
12741
+ var mod = stat.mode;
12742
+ var uid = stat.uid;
12743
+ var gid = stat.gid;
12744
+ var myUid = options.uid !== undefined ? options.uid : process.getuid && process.getuid();
12745
+ var myGid = options.gid !== undefined ? options.gid : process.getgid && process.getgid();
12746
+ var u = parseInt("100", 8);
12747
+ var g = parseInt("010", 8);
12748
+ var o = parseInt("001", 8);
12749
+ var ug = u | g;
12750
+ var ret = mod & o || mod & g && gid === myGid || mod & u && uid === myUid || mod & ug && myUid === 0;
12751
+ return ret;
12752
+ }
12753
+ });
12754
+
12755
+ // node_modules/isexe/index.js
12756
+ var require_isexe = __commonJS(function(exports, module) {
12757
+ var fs = __require("fs");
12758
+ var core;
12759
+ if (process.platform === "win32" || global.TESTING_WINDOWS) {
12760
+ core = require_windows();
12761
+ } else {
12762
+ core = require_mode();
12763
+ }
12764
+ module.exports = isexe;
12765
+ isexe.sync = sync;
12766
+ function isexe(path, options, cb) {
12767
+ if (typeof options === "function") {
12768
+ cb = options;
12769
+ options = {};
12770
+ }
12771
+ if (!cb) {
12772
+ if (typeof Promise !== "function") {
12773
+ throw new TypeError("callback not provided");
12774
+ }
12775
+ return new Promise(function(resolve, reject) {
12776
+ isexe(path, options || {}, function(er, is) {
12777
+ if (er) {
12778
+ reject(er);
12779
+ } else {
12780
+ resolve(is);
12781
+ }
12782
+ });
12783
+ });
12784
+ }
12785
+ core(path, options || {}, function(er, is) {
12786
+ if (er) {
12787
+ if (er.code === "EACCES" || options && options.ignoreErrors) {
12788
+ er = null;
12789
+ is = false;
12790
+ }
12791
+ }
12792
+ cb(er, is);
12793
+ });
12794
+ }
12795
+ function sync(path, options) {
12796
+ try {
12797
+ return core.sync(path, options || {});
12798
+ } catch (er) {
12799
+ if (options && options.ignoreErrors || er.code === "EACCES") {
12800
+ return false;
12801
+ } else {
12802
+ throw er;
12803
+ }
12804
+ }
12805
+ }
12806
+ });
12807
+
12808
+ // node_modules/which/which.js
12809
+ var require_which = __commonJS(function(exports, module) {
12810
+ var isWindows = process.platform === "win32" || process.env.OSTYPE === "cygwin" || process.env.OSTYPE === "msys";
12811
+ var path = __require("path");
12812
+ var COLON = isWindows ? ";" : ":";
12813
+ var isexe = require_isexe();
12814
+ var getNotFoundError = (cmd) => Object.assign(new Error(`not found: ${cmd}`), { code: "ENOENT" });
12815
+ var getPathInfo = (cmd, opt) => {
12816
+ const colon = opt.colon || COLON;
12817
+ const pathEnv = cmd.match(/\//) || isWindows && cmd.match(/\\/) ? [""] : [
12818
+ ...isWindows ? [process.cwd()] : [],
12819
+ ...(opt.path || process.env.PATH || "").split(colon)
12820
+ ];
12821
+ const pathExtExe = isWindows ? opt.pathExt || process.env.PATHEXT || ".EXE;.CMD;.BAT;.COM" : "";
12822
+ const pathExt = isWindows ? pathExtExe.split(colon) : [""];
12823
+ if (isWindows) {
12824
+ if (cmd.indexOf(".") !== -1 && pathExt[0] !== "")
12825
+ pathExt.unshift("");
12826
+ }
12827
+ return {
12828
+ pathEnv,
12829
+ pathExt,
12830
+ pathExtExe
12831
+ };
12832
+ };
12833
+ var which = (cmd, opt, cb) => {
12834
+ if (typeof opt === "function") {
12835
+ cb = opt;
12836
+ opt = {};
12837
+ }
12838
+ if (!opt)
12839
+ opt = {};
12840
+ const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt);
12841
+ const found = [];
12842
+ const step = (i) => new Promise((resolve, reject) => {
12843
+ if (i === pathEnv.length)
12844
+ return opt.all && found.length ? resolve(found) : reject(getNotFoundError(cmd));
12845
+ const ppRaw = pathEnv[i];
12846
+ const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw;
12847
+ const pCmd = path.join(pathPart, cmd);
12848
+ const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd : pCmd;
12849
+ resolve(subStep(p, i, 0));
12850
+ });
12851
+ const subStep = (p, i, ii) => new Promise((resolve, reject) => {
12852
+ if (ii === pathExt.length)
12853
+ return resolve(step(i + 1));
12854
+ const ext = pathExt[ii];
12855
+ isexe(p + ext, { pathExt: pathExtExe }, (er, is) => {
12856
+ if (!er && is) {
12857
+ if (opt.all)
12858
+ found.push(p + ext);
12859
+ else
12860
+ return resolve(p + ext);
12861
+ }
12862
+ return resolve(subStep(p, i, ii + 1));
12863
+ });
12864
+ });
12865
+ return cb ? step(0).then((res) => cb(null, res), cb) : step(0);
12866
+ };
12867
+ var whichSync = (cmd, opt) => {
12868
+ opt = opt || {};
12869
+ const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt);
12870
+ const found = [];
12871
+ for (let i = 0;i < pathEnv.length; i++) {
12872
+ const ppRaw = pathEnv[i];
12873
+ const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw;
12874
+ const pCmd = path.join(pathPart, cmd);
12875
+ const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd : pCmd;
12876
+ for (let j = 0;j < pathExt.length; j++) {
12877
+ const cur = p + pathExt[j];
12878
+ try {
12879
+ const is = isexe.sync(cur, { pathExt: pathExtExe });
12880
+ if (is) {
12881
+ if (opt.all)
12882
+ found.push(cur);
12883
+ else
12884
+ return cur;
12885
+ }
12886
+ } catch (ex) {}
12887
+ }
12888
+ }
12889
+ if (opt.all && found.length)
12890
+ return found;
12891
+ if (opt.nothrow)
12892
+ return null;
12893
+ throw getNotFoundError(cmd);
12894
+ };
12895
+ module.exports = which;
12896
+ which.sync = whichSync;
12897
+ });
12898
+
12899
+ // node_modules/path-key/index.js
12900
+ var require_path_key = __commonJS(function(exports, module) {
12901
+ var pathKey = (options = {}) => {
12902
+ const environment = options.env || process.env;
12903
+ const platform = options.platform || process.platform;
12904
+ if (platform !== "win32") {
12905
+ return "PATH";
12906
+ }
12907
+ return Object.keys(environment).reverse().find((key) => key.toUpperCase() === "PATH") || "Path";
12908
+ };
12909
+ module.exports = pathKey;
12910
+ module.exports.default = pathKey;
12911
+ });
12912
+
12913
+ // node_modules/cross-spawn/lib/util/resolveCommand.js
12914
+ var require_resolveCommand = __commonJS(function(exports, module) {
12915
+ var path = __require("path");
12916
+ var which = require_which();
12917
+ var getPathKey = require_path_key();
12918
+ function resolveCommandAttempt(parsed, withoutPathExt) {
12919
+ const env = parsed.options.env || process.env;
12920
+ const cwd = process.cwd();
12921
+ const hasCustomCwd = parsed.options.cwd != null;
12922
+ const shouldSwitchCwd = hasCustomCwd && process.chdir !== undefined && !process.chdir.disabled;
12923
+ if (shouldSwitchCwd) {
12924
+ try {
12925
+ process.chdir(parsed.options.cwd);
12926
+ } catch (err) {}
12927
+ }
12928
+ let resolved;
12929
+ try {
12930
+ resolved = which.sync(parsed.command, {
12931
+ path: env[getPathKey({ env })],
12932
+ pathExt: withoutPathExt ? path.delimiter : undefined
12933
+ });
12934
+ } catch (e) {} finally {
12935
+ if (shouldSwitchCwd) {
12936
+ process.chdir(cwd);
12937
+ }
12938
+ }
12939
+ if (resolved) {
12940
+ resolved = path.resolve(hasCustomCwd ? parsed.options.cwd : "", resolved);
12941
+ }
12942
+ return resolved;
12943
+ }
12944
+ function resolveCommand(parsed) {
12945
+ return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true);
12946
+ }
12947
+ module.exports = resolveCommand;
12948
+ });
12949
+
12950
+ // node_modules/cross-spawn/lib/util/escape.js
12951
+ var require_escape = __commonJS(function(exports, module) {
12952
+ var metaCharsRegExp = /([()\][%!^"`<>&|;, *?])/g;
12953
+ function escapeCommand(arg) {
12954
+ arg = arg.replace(metaCharsRegExp, "^$1");
12955
+ return arg;
12956
+ }
12957
+ function escapeArgument(arg, doubleEscapeMetaChars) {
12958
+ arg = `${arg}`;
12959
+ arg = arg.replace(/(?=(\\+?)?)\1"/g, "$1$1\\\"");
12960
+ arg = arg.replace(/(?=(\\+?)?)\1$/, "$1$1");
12961
+ arg = `"${arg}"`;
12962
+ arg = arg.replace(metaCharsRegExp, "^$1");
12963
+ if (doubleEscapeMetaChars) {
12964
+ arg = arg.replace(metaCharsRegExp, "^$1");
12965
+ }
12966
+ return arg;
12967
+ }
12968
+ exports.command = escapeCommand;
12969
+ exports.argument = escapeArgument;
12970
+ });
12971
+
12972
+ // node_modules/shebang-regex/index.js
12973
+ var require_shebang_regex = __commonJS(function(exports, module) {
12974
+ module.exports = /^#!(.*)/;
12975
+ });
12976
+
12977
+ // node_modules/shebang-command/index.js
12978
+ var require_shebang_command = __commonJS(function(exports, module) {
12979
+ var shebangRegex = require_shebang_regex();
12980
+ module.exports = (string = "") => {
12981
+ const match = string.match(shebangRegex);
12982
+ if (!match) {
12983
+ return null;
12984
+ }
12985
+ const [path, argument] = match[0].replace(/#! ?/, "").split(" ");
12986
+ const binary = path.split("/").pop();
12987
+ if (binary === "env") {
12988
+ return argument;
12989
+ }
12990
+ return argument ? `${binary} ${argument}` : binary;
12991
+ };
12992
+ });
12993
+
12994
+ // node_modules/cross-spawn/lib/util/readShebang.js
12995
+ var require_readShebang = __commonJS(function(exports, module) {
12996
+ var fs = __require("fs");
12997
+ var shebangCommand = require_shebang_command();
12998
+ function readShebang(command) {
12999
+ const size = 150;
13000
+ const buffer = Buffer.alloc(size);
13001
+ let fd;
13002
+ try {
13003
+ fd = fs.openSync(command, "r");
13004
+ fs.readSync(fd, buffer, 0, size, 0);
13005
+ fs.closeSync(fd);
13006
+ } catch (e) {}
13007
+ return shebangCommand(buffer.toString());
13008
+ }
13009
+ module.exports = readShebang;
13010
+ });
13011
+
13012
+ // node_modules/cross-spawn/lib/parse.js
13013
+ var require_parse = __commonJS(function(exports, module) {
13014
+ var path = __require("path");
13015
+ var resolveCommand = require_resolveCommand();
13016
+ var escape = require_escape();
13017
+ var readShebang = require_readShebang();
13018
+ var isWin = process.platform === "win32";
13019
+ var isExecutableRegExp = /\.(?:com|exe)$/i;
13020
+ var isCmdShimRegExp = /node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;
13021
+ function detectShebang(parsed) {
13022
+ parsed.file = resolveCommand(parsed);
13023
+ const shebang = parsed.file && readShebang(parsed.file);
13024
+ if (shebang) {
13025
+ parsed.args.unshift(parsed.file);
13026
+ parsed.command = shebang;
13027
+ return resolveCommand(parsed);
13028
+ }
13029
+ return parsed.file;
13030
+ }
13031
+ function parseNonShell(parsed) {
13032
+ if (!isWin) {
13033
+ return parsed;
13034
+ }
13035
+ const commandFile = detectShebang(parsed);
13036
+ const needsShell = !isExecutableRegExp.test(commandFile);
13037
+ if (parsed.options.forceShell || needsShell) {
13038
+ const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile);
13039
+ parsed.command = path.normalize(parsed.command);
13040
+ parsed.command = escape.command(parsed.command);
13041
+ parsed.args = parsed.args.map((arg) => escape.argument(arg, needsDoubleEscapeMetaChars));
13042
+ const shellCommand = [parsed.command].concat(parsed.args).join(" ");
13043
+ parsed.args = ["/d", "/s", "/c", `"${shellCommand}"`];
13044
+ parsed.command = process.env.comspec || "cmd.exe";
13045
+ parsed.options.windowsVerbatimArguments = true;
13046
+ }
13047
+ return parsed;
13048
+ }
13049
+ function parse(command, args, options) {
13050
+ if (args && !Array.isArray(args)) {
13051
+ options = args;
13052
+ args = null;
13053
+ }
13054
+ args = args ? args.slice(0) : [];
13055
+ options = Object.assign({}, options);
13056
+ const parsed = {
13057
+ command,
13058
+ args,
13059
+ options,
13060
+ file: undefined,
13061
+ original: {
13062
+ command,
13063
+ args
13064
+ }
13065
+ };
13066
+ return options.shell ? parsed : parseNonShell(parsed);
13067
+ }
13068
+ module.exports = parse;
13069
+ });
13070
+
13071
+ // node_modules/cross-spawn/lib/enoent.js
13072
+ var require_enoent = __commonJS(function(exports, module) {
13073
+ var isWin = process.platform === "win32";
13074
+ function notFoundError(original, syscall) {
13075
+ return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), {
13076
+ code: "ENOENT",
13077
+ errno: "ENOENT",
13078
+ syscall: `${syscall} ${original.command}`,
13079
+ path: original.command,
13080
+ spawnargs: original.args
13081
+ });
13082
+ }
13083
+ function hookChildProcess(cp, parsed) {
13084
+ if (!isWin) {
13085
+ return;
13086
+ }
13087
+ const originalEmit = cp.emit;
13088
+ cp.emit = function(name, arg1) {
13089
+ if (name === "exit") {
13090
+ const err = verifyENOENT(arg1, parsed);
13091
+ if (err) {
13092
+ return originalEmit.call(cp, "error", err);
13093
+ }
13094
+ }
13095
+ return originalEmit.apply(cp, arguments);
13096
+ };
13097
+ }
13098
+ function verifyENOENT(status, parsed) {
13099
+ if (isWin && status === 1 && !parsed.file) {
13100
+ return notFoundError(parsed.original, "spawn");
13101
+ }
13102
+ return null;
13103
+ }
13104
+ function verifyENOENTSync(status, parsed) {
13105
+ if (isWin && status === 1 && !parsed.file) {
13106
+ return notFoundError(parsed.original, "spawnSync");
13107
+ }
13108
+ return null;
13109
+ }
13110
+ module.exports = {
13111
+ hookChildProcess,
13112
+ verifyENOENT,
13113
+ verifyENOENTSync,
13114
+ notFoundError
13115
+ };
13116
+ });
13117
+
13118
+ // node_modules/cross-spawn/index.js
13119
+ var require_cross_spawn = __commonJS(function(exports, module) {
13120
+ var cp = __require("child_process");
13121
+ var parse = require_parse();
13122
+ var enoent = require_enoent();
13123
+ function spawn(command, args, options) {
13124
+ const parsed = parse(command, args, options);
13125
+ const spawned = cp.spawn(parsed.command, parsed.args, parsed.options);
13126
+ enoent.hookChildProcess(spawned, parsed);
13127
+ return spawned;
13128
+ }
13129
+ function spawnSync(command, args, options) {
13130
+ const parsed = parse(command, args, options);
13131
+ const result = cp.spawnSync(parsed.command, parsed.args, parsed.options);
13132
+ result.error = result.error || enoent.verifyENOENTSync(result.status, parsed);
13133
+ return result;
13134
+ }
13135
+ module.exports = spawn;
13136
+ module.exports.spawn = spawn;
13137
+ module.exports.sync = spawnSync;
13138
+ module.exports._parse = parse;
13139
+ module.exports._enoent = enoent;
13140
+ });
13141
+
13142
+ // src/utils/spawn.ts
12694
13143
  function crossSpawn(command, args, options) {
12695
- return nodeSpawn(command, args, addWindowsShell(options ?? {}));
13144
+ return import_cross_spawn.default(command, args, options ?? {});
12696
13145
  }
12697
- var isWindows;
13146
+ var import_cross_spawn;
12698
13147
  var init_spawn = __esm(() => {
12699
- isWindows = process.platform === "win32";
13148
+ import_cross_spawn = __toESM(require_cross_spawn(), 1);
12700
13149
  });
12701
13150
 
12702
13151
  // src/utils/logger.ts
@@ -13210,7 +13659,7 @@ var require_semver = __commonJS(function(exports, module) {
13210
13659
  });
13211
13660
 
13212
13661
  // node_modules/semver/functions/parse.js
13213
- var require_parse = __commonJS(function(exports, module) {
13662
+ var require_parse2 = __commonJS(function(exports, module) {
13214
13663
  var SemVer = require_semver();
13215
13664
  var parse = (version, options, throwErrors = false) => {
13216
13665
  if (version instanceof SemVer) {
@@ -13230,7 +13679,7 @@ var require_parse = __commonJS(function(exports, module) {
13230
13679
 
13231
13680
  // node_modules/semver/functions/valid.js
13232
13681
  var require_valid = __commonJS(function(exports, module) {
13233
- var parse = require_parse();
13682
+ var parse = require_parse2();
13234
13683
  var valid = (version, options) => {
13235
13684
  const v = parse(version, options);
13236
13685
  return v ? v.version : null;
@@ -13240,7 +13689,7 @@ var require_valid = __commonJS(function(exports, module) {
13240
13689
 
13241
13690
  // node_modules/semver/functions/clean.js
13242
13691
  var require_clean = __commonJS(function(exports, module) {
13243
- var parse = require_parse();
13692
+ var parse = require_parse2();
13244
13693
  var clean = (version, options) => {
13245
13694
  const s = parse(version.trim().replace(/^[=v]+/, ""), options);
13246
13695
  return s ? s.version : null;
@@ -13268,7 +13717,7 @@ var require_inc = __commonJS(function(exports, module) {
13268
13717
 
13269
13718
  // node_modules/semver/functions/diff.js
13270
13719
  var require_diff = __commonJS(function(exports, module) {
13271
- var parse = require_parse();
13720
+ var parse = require_parse2();
13272
13721
  var diff = (version1, version2) => {
13273
13722
  const v1 = parse(version1, null, true);
13274
13723
  const v2 = parse(version2, null, true);
@@ -13330,7 +13779,7 @@ var require_patch = __commonJS(function(exports, module) {
13330
13779
 
13331
13780
  // node_modules/semver/functions/prerelease.js
13332
13781
  var require_prerelease = __commonJS(function(exports, module) {
13333
- var parse = require_parse();
13782
+ var parse = require_parse2();
13334
13783
  var prerelease = (version, options) => {
13335
13784
  const parsed = parse(version, options);
13336
13785
  return parsed && parsed.prerelease.length ? parsed.prerelease : null;
@@ -13476,7 +13925,7 @@ var require_cmp = __commonJS(function(exports, module) {
13476
13925
  // node_modules/semver/functions/coerce.js
13477
13926
  var require_coerce = __commonJS(function(exports, module) {
13478
13927
  var SemVer = require_semver();
13479
- var parse = require_parse();
13928
+ var parse = require_parse2();
13480
13929
  var { safeRe: re, t } = require_re();
13481
13930
  var coerce = (version, options) => {
13482
13931
  if (version instanceof SemVer) {
@@ -13518,7 +13967,7 @@ var require_coerce = __commonJS(function(exports, module) {
13518
13967
 
13519
13968
  // node_modules/semver/functions/truncate.js
13520
13969
  var require_truncate = __commonJS(function(exports, module) {
13521
- var parse = require_parse();
13970
+ var parse = require_parse2();
13522
13971
  var constants = require_constants();
13523
13972
  var SemVer = require_semver();
13524
13973
  var truncate = (version, truncation, options) => {
@@ -14526,7 +14975,7 @@ var require_semver2 = __commonJS(function(exports, module) {
14526
14975
  var constants = require_constants();
14527
14976
  var SemVer = require_semver();
14528
14977
  var identifiers = require_identifiers();
14529
- var parse = require_parse();
14978
+ var parse = require_parse2();
14530
14979
  var valid = require_valid();
14531
14980
  var clean = require_clean();
14532
14981
  var inc = require_inc();
@@ -34190,11 +34639,6 @@ var METADATA_STORE_PATH = path.join(stateHome(), ".claude-threads", "worktree-me
34190
34639
  var log5 = createLogger("helpers");
34191
34640
  var sessionLog = createSessionLog(log5);
34192
34641
 
34193
- // src/operations/message-manager.ts
34194
- init_types();
34195
-
34196
- // src/operations/task-tracker.ts
34197
- var VALID_STATUSES = new Set(["pending", "in_progress", "completed"]);
34198
34642
  // src/platform/utils.ts
34199
34643
  function formatWebSocketError(err) {
34200
34644
  if (err instanceof Error)
@@ -34315,6 +34759,12 @@ function isDcmThreadId(threadId) {
34315
34759
  function resolvePostThreadId(threadId) {
34316
34760
  return isDcmThreadId(threadId) ? undefined : threadId;
34317
34761
  }
34762
+
34763
+ // src/operations/message-manager.ts
34764
+ init_types();
34765
+
34766
+ // src/operations/task-tracker.ts
34767
+ var VALID_STATUSES = new Set(["pending", "in_progress", "completed"]);
34318
34768
  // src/operations/executors/task-list.ts
34319
34769
  init_emoji();
34320
34770
  // src/operations/executors/subagent.ts
@@ -423,6 +423,32 @@ platforms:
423
423
 
424
424
  Note: the per-platform `stickyMessage: <mode>` field is distinct from the top-level `Config.stickyMessage: { description, footer }` block, which still customizes the full sticky for platforms not in `hidden` mode.
425
425
 
426
+ #### Tool activity: a summary line instead of the stream
427
+
428
+ By default every tool Claude uses streams into the reply (`Bash …`, `Read …`, `↳ ✓`). For an assistant-style channel where you want the answer, not the shopping, two per-platform fields change that:
429
+
430
+ ```yaml
431
+ platforms:
432
+ - id: slack-assistant
433
+ type: slack
434
+ # ... credentials ...
435
+ toolActivity: summary # full (default) | summary | hidden
436
+ toolDetails: thread # thread (default for summary) | none
437
+ ```
438
+
439
+ | `toolActivity` | The reply |
440
+ |---|---|
441
+ | `full` | unchanged: every tool inline with its completion indicator |
442
+ | `summary` | one live line at the top of the turn's post, `🔧 12 tools · 40 s · Bash`, updated as tools run; the name is the tool most recently started, so the line shows what the bot is doing; `· 1 ❌` when a tool failed. Claude's text follows |
443
+ | `hidden` | nothing about tools at all |
444
+
445
+ | `toolDetails` | Where the full tool stream goes when `toolActivity` is not `full` |
446
+ |---|---|
447
+ | `thread` | posted as replies in a thread under the turn's post (in a thread-mode session, after the reply in the same thread, once the turn ends: Slack has no nested threads) |
448
+ | `none` | dropped |
449
+
450
+ Permission prompts, plan approvals, questions, task lists and errors post as before in every mode. `toolDetails` with `full`, or `thread` with `hidden`, is a startup config error.
451
+
426
452
  #### End-of-turn marker
427
453
 
428
454
  Integrations that read the channel (a voice front end, a phone bridge, a dashboard) need to know when Claude's answer is complete. The daemon streams by editing one post, so without help they can only guess from the text going quiet. With a marker, the daemon stamps the turn's last reply post the moment the turn ends: