switchroom 0.14.5 → 0.14.6

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.
@@ -11240,7 +11240,9 @@ var profileFields = {
11240
11240
  experimental: exports_external.object({
11241
11241
  legacy_pty: exports_external.boolean().optional().describe("Opt out of the default tmux supervisor (#725) and run the agent under " + "the legacy PTY supervisor instead. Default: false (tmux is the default)."),
11242
11242
  legacy_autoaccept_expect: exports_external.boolean().optional().describe("Opt the autoaccept gateway back into the legacy expect-script behaviour " + "instead of the tmux send-keys path. Default: false.")
11243
- }).optional().describe("Opt-in flags for experimental / legacy behaviours. Cascades through " + "defaults → profile → per-agent.")
11243
+ }).optional().describe("Opt-in flags for experimental / legacy behaviours. Cascades through " + "defaults → profile → per-agent."),
11244
+ allowed_tools: exports_external.array(exports_external.string()).optional().describe("Granular tool allowlist passed verbatim to Claude Code's --allowedTools " + "flag. Cascades defaults → profile → per-agent (union, dedup). Supports " + "patterns like 'Bash(git *)' or 'mcp__perplexity__*' that the coarse " + "`tools.allow` field can't express. See #199."),
11245
+ disallowed_tools: exports_external.array(exports_external.string()).optional().describe("Granular tool denylist passed verbatim to Claude Code's --disallowedTools " + "flag. Cascades defaults → profile → per-agent (union, dedup). Same pattern " + "syntax as allowed_tools (e.g. 'Bash(rm *)'). See #199.")
11244
11246
  };
11245
11247
  var ProfileSchema = exports_external.object(profileFields);
11246
11248
  var { extends: _omitExtends, ...defaultsFields } = profileFields;
@@ -11893,6 +11895,18 @@ function mergeAgentConfig(defaultsIn, agentIn) {
11893
11895
  ...merged.cli_args ?? []
11894
11896
  ];
11895
11897
  }
11898
+ if (defaults.allowed_tools || merged.allowed_tools) {
11899
+ merged.allowed_tools = dedupe([
11900
+ ...defaults.allowed_tools ?? [],
11901
+ ...merged.allowed_tools ?? []
11902
+ ]);
11903
+ }
11904
+ if (defaults.disallowed_tools || merged.disallowed_tools) {
11905
+ merged.disallowed_tools = dedupe([
11906
+ ...defaults.disallowed_tools ?? [],
11907
+ ...merged.disallowed_tools ?? []
11908
+ ]);
11909
+ }
11896
11910
  if (defaults.extra_stable_files || merged.extra_stable_files) {
11897
11911
  const d = defaults.extra_stable_files ?? [];
11898
11912
  const a = merged.extra_stable_files ?? [];
@@ -11240,7 +11240,9 @@ var profileFields = {
11240
11240
  experimental: exports_external.object({
11241
11241
  legacy_pty: exports_external.boolean().optional().describe("Opt out of the default tmux supervisor (#725) and run the agent under " + "the legacy PTY supervisor instead. Default: false (tmux is the default)."),
11242
11242
  legacy_autoaccept_expect: exports_external.boolean().optional().describe("Opt the autoaccept gateway back into the legacy expect-script behaviour " + "instead of the tmux send-keys path. Default: false.")
11243
- }).optional().describe("Opt-in flags for experimental / legacy behaviours. Cascades through " + "defaults → profile → per-agent.")
11243
+ }).optional().describe("Opt-in flags for experimental / legacy behaviours. Cascades through " + "defaults → profile → per-agent."),
11244
+ allowed_tools: exports_external.array(exports_external.string()).optional().describe("Granular tool allowlist passed verbatim to Claude Code's --allowedTools " + "flag. Cascades defaults → profile → per-agent (union, dedup). Supports " + "patterns like 'Bash(git *)' or 'mcp__perplexity__*' that the coarse " + "`tools.allow` field can't express. See #199."),
11245
+ disallowed_tools: exports_external.array(exports_external.string()).optional().describe("Granular tool denylist passed verbatim to Claude Code's --disallowedTools " + "flag. Cascades defaults → profile → per-agent (union, dedup). Same pattern " + "syntax as allowed_tools (e.g. 'Bash(rm *)'). See #199.")
11244
11246
  };
11245
11247
  var ProfileSchema = exports_external.object(profileFields);
11246
11248
  var { extends: _omitExtends, ...defaultsFields } = profileFields;
@@ -11893,6 +11895,18 @@ function mergeAgentConfig(defaultsIn, agentIn) {
11893
11895
  ...merged.cli_args ?? []
11894
11896
  ];
11895
11897
  }
11898
+ if (defaults.allowed_tools || merged.allowed_tools) {
11899
+ merged.allowed_tools = dedupe([
11900
+ ...defaults.allowed_tools ?? [],
11901
+ ...merged.allowed_tools ?? []
11902
+ ]);
11903
+ }
11904
+ if (defaults.disallowed_tools || merged.disallowed_tools) {
11905
+ merged.disallowed_tools = dedupe([
11906
+ ...defaults.disallowed_tools ?? [],
11907
+ ...merged.disallowed_tools ?? []
11908
+ ]);
11909
+ }
11896
11910
  if (defaults.extra_stable_files || merged.extra_stable_files) {
11897
11911
  const d = defaults.extra_stable_files ?? [];
11898
11912
  const a = merged.extra_stable_files ?? [];
@@ -11987,7 +11987,9 @@ var profileFields = {
11987
11987
  experimental: exports_external.object({
11988
11988
  legacy_pty: exports_external.boolean().optional().describe("Opt out of the default tmux supervisor (#725) and run the agent under " + "the legacy PTY supervisor instead. Default: false (tmux is the default)."),
11989
11989
  legacy_autoaccept_expect: exports_external.boolean().optional().describe("Opt the autoaccept gateway back into the legacy expect-script behaviour " + "instead of the tmux send-keys path. Default: false.")
11990
- }).optional().describe("Opt-in flags for experimental / legacy behaviours. Cascades through " + "defaults \u2192 profile \u2192 per-agent.")
11990
+ }).optional().describe("Opt-in flags for experimental / legacy behaviours. Cascades through " + "defaults \u2192 profile \u2192 per-agent."),
11991
+ allowed_tools: exports_external.array(exports_external.string()).optional().describe("Granular tool allowlist passed verbatim to Claude Code's --allowedTools " + "flag. Cascades defaults \u2192 profile \u2192 per-agent (union, dedup). Supports " + "patterns like 'Bash(git *)' or 'mcp__perplexity__*' that the coarse " + "`tools.allow` field can't express. See #199."),
11992
+ disallowed_tools: exports_external.array(exports_external.string()).optional().describe("Granular tool denylist passed verbatim to Claude Code's --disallowedTools " + "flag. Cascades defaults \u2192 profile \u2192 per-agent (union, dedup). Same pattern " + "syntax as allowed_tools (e.g. 'Bash(rm *)'). See #199.")
11991
11993
  };
11992
11994
  var ProfileSchema = exports_external.object(profileFields);
11993
11995
  var { extends: _omitExtends, ...defaultsFields } = profileFields;
@@ -12642,6 +12644,18 @@ function mergeAgentConfig(defaultsIn, agentIn) {
12642
12644
  ...merged.cli_args ?? []
12643
12645
  ];
12644
12646
  }
12647
+ if (defaults.allowed_tools || merged.allowed_tools) {
12648
+ merged.allowed_tools = dedupe([
12649
+ ...defaults.allowed_tools ?? [],
12650
+ ...merged.allowed_tools ?? []
12651
+ ]);
12652
+ }
12653
+ if (defaults.disallowed_tools || merged.disallowed_tools) {
12654
+ merged.disallowed_tools = dedupe([
12655
+ ...defaults.disallowed_tools ?? [],
12656
+ ...merged.disallowed_tools ?? []
12657
+ ]);
12658
+ }
12645
12659
  if (defaults.extra_stable_files || merged.extra_stable_files) {
12646
12660
  const d = defaults.extra_stable_files ?? [];
12647
12661
  const a = merged.extra_stable_files ?? [];
@@ -13804,7 +13804,9 @@ var init_schema = __esm(() => {
13804
13804
  experimental: exports_external.object({
13805
13805
  legacy_pty: exports_external.boolean().optional().describe("Opt out of the default tmux supervisor (#725) and run the agent under " + "the legacy PTY supervisor instead. Default: false (tmux is the default)."),
13806
13806
  legacy_autoaccept_expect: exports_external.boolean().optional().describe("Opt the autoaccept gateway back into the legacy expect-script behaviour " + "instead of the tmux send-keys path. Default: false.")
13807
- }).optional().describe("Opt-in flags for experimental / legacy behaviours. Cascades through " + "defaults \u2192 profile \u2192 per-agent.")
13807
+ }).optional().describe("Opt-in flags for experimental / legacy behaviours. Cascades through " + "defaults \u2192 profile \u2192 per-agent."),
13808
+ allowed_tools: exports_external.array(exports_external.string()).optional().describe("Granular tool allowlist passed verbatim to Claude Code's --allowedTools " + "flag. Cascades defaults \u2192 profile \u2192 per-agent (union, dedup). Supports " + "patterns like 'Bash(git *)' or 'mcp__perplexity__*' that the coarse " + "`tools.allow` field can't express. See #199."),
13809
+ disallowed_tools: exports_external.array(exports_external.string()).optional().describe("Granular tool denylist passed verbatim to Claude Code's --disallowedTools " + "flag. Cascades defaults \u2192 profile \u2192 per-agent (union, dedup). Same pattern " + "syntax as allowed_tools (e.g. 'Bash(rm *)'). See #199.")
13808
13810
  };
13809
13811
  ProfileSchema = exports_external.object(profileFields);
13810
13812
  ({ extends: _omitExtends, ...defaultsFields } = profileFields);
@@ -14509,6 +14511,18 @@ function mergeAgentConfig(defaultsIn, agentIn) {
14509
14511
  ...merged.cli_args ?? []
14510
14512
  ];
14511
14513
  }
14514
+ if (defaults.allowed_tools || merged.allowed_tools) {
14515
+ merged.allowed_tools = dedupe([
14516
+ ...defaults.allowed_tools ?? [],
14517
+ ...merged.allowed_tools ?? []
14518
+ ]);
14519
+ }
14520
+ if (defaults.disallowed_tools || merged.disallowed_tools) {
14521
+ merged.disallowed_tools = dedupe([
14522
+ ...defaults.disallowed_tools ?? [],
14523
+ ...merged.disallowed_tools ?? []
14524
+ ]);
14525
+ }
14512
14526
  if (defaults.extra_stable_files || merged.extra_stable_files) {
14513
14527
  const d = defaults.extra_stable_files ?? [];
14514
14528
  const a = merged.extra_stable_files ?? [];
@@ -49352,8 +49366,8 @@ var {
49352
49366
  } = import__.default;
49353
49367
 
49354
49368
  // src/build-info.ts
49355
- var VERSION = "0.14.5";
49356
- var COMMIT_SHA = "c12d4240";
49369
+ var VERSION = "0.14.6";
49370
+ var COMMIT_SHA = "ff204bcf";
49357
49371
 
49358
49372
  // src/cli/agent.ts
49359
49373
  init_source();
@@ -13975,7 +13975,9 @@ var profileFields = {
13975
13975
  experimental: exports_external.object({
13976
13976
  legacy_pty: exports_external.boolean().optional().describe("Opt out of the default tmux supervisor (#725) and run the agent under " + "the legacy PTY supervisor instead. Default: false (tmux is the default)."),
13977
13977
  legacy_autoaccept_expect: exports_external.boolean().optional().describe("Opt the autoaccept gateway back into the legacy expect-script behaviour " + "instead of the tmux send-keys path. Default: false.")
13978
- }).optional().describe("Opt-in flags for experimental / legacy behaviours. Cascades through " + "defaults → profile → per-agent.")
13978
+ }).optional().describe("Opt-in flags for experimental / legacy behaviours. Cascades through " + "defaults → profile → per-agent."),
13979
+ allowed_tools: exports_external.array(exports_external.string()).optional().describe("Granular tool allowlist passed verbatim to Claude Code's --allowedTools " + "flag. Cascades defaults → profile → per-agent (union, dedup). Supports " + "patterns like 'Bash(git *)' or 'mcp__perplexity__*' that the coarse " + "`tools.allow` field can't express. See #199."),
13980
+ disallowed_tools: exports_external.array(exports_external.string()).optional().describe("Granular tool denylist passed verbatim to Claude Code's --disallowedTools " + "flag. Cascades defaults → profile → per-agent (union, dedup). Same pattern " + "syntax as allowed_tools (e.g. 'Bash(rm *)'). See #199.")
13979
13981
  };
13980
13982
  var ProfileSchema = exports_external.object(profileFields);
13981
13983
  var { extends: _omitExtends, ...defaultsFields } = profileFields;
@@ -14638,6 +14640,18 @@ function mergeAgentConfig(defaultsIn, agentIn) {
14638
14640
  ...merged.cli_args ?? []
14639
14641
  ];
14640
14642
  }
14643
+ if (defaults.allowed_tools || merged.allowed_tools) {
14644
+ merged.allowed_tools = dedupe([
14645
+ ...defaults.allowed_tools ?? [],
14646
+ ...merged.allowed_tools ?? []
14647
+ ]);
14648
+ }
14649
+ if (defaults.disallowed_tools || merged.disallowed_tools) {
14650
+ merged.disallowed_tools = dedupe([
14651
+ ...defaults.disallowed_tools ?? [],
14652
+ ...merged.disallowed_tools ?? []
14653
+ ]);
14654
+ }
14641
14655
  if (defaults.extra_stable_files || merged.extra_stable_files) {
14642
14656
  const d = defaults.extra_stable_files ?? [];
14643
14657
  const a = merged.extra_stable_files ?? [];
@@ -4258,6 +4258,18 @@ function mergeAgentConfig(defaultsIn, agentIn) {
4258
4258
  ...merged.cli_args ?? []
4259
4259
  ];
4260
4260
  }
4261
+ if (defaults.allowed_tools || merged.allowed_tools) {
4262
+ merged.allowed_tools = dedupe([
4263
+ ...defaults.allowed_tools ?? [],
4264
+ ...merged.allowed_tools ?? []
4265
+ ]);
4266
+ }
4267
+ if (defaults.disallowed_tools || merged.disallowed_tools) {
4268
+ merged.disallowed_tools = dedupe([
4269
+ ...defaults.disallowed_tools ?? [],
4270
+ ...merged.disallowed_tools ?? []
4271
+ ]);
4272
+ }
4261
4273
  if (defaults.extra_stable_files || merged.extra_stable_files) {
4262
4274
  const d = defaults.extra_stable_files ?? [];
4263
4275
  const a = merged.extra_stable_files ?? [];
@@ -11543,7 +11555,9 @@ var init_schema = __esm(() => {
11543
11555
  experimental: exports_external.object({
11544
11556
  legacy_pty: exports_external.boolean().optional().describe("Opt out of the default tmux supervisor (#725) and run the agent under " + "the legacy PTY supervisor instead. Default: false (tmux is the default)."),
11545
11557
  legacy_autoaccept_expect: exports_external.boolean().optional().describe("Opt the autoaccept gateway back into the legacy expect-script behaviour " + "instead of the tmux send-keys path. Default: false.")
11546
- }).optional().describe("Opt-in flags for experimental / legacy behaviours. Cascades through " + "defaults → profile → per-agent.")
11558
+ }).optional().describe("Opt-in flags for experimental / legacy behaviours. Cascades through " + "defaults → profile → per-agent."),
11559
+ allowed_tools: exports_external.array(exports_external.string()).optional().describe("Granular tool allowlist passed verbatim to Claude Code's --allowedTools " + "flag. Cascades defaults → profile → per-agent (union, dedup). Supports " + "patterns like 'Bash(git *)' or 'mcp__perplexity__*' that the coarse " + "`tools.allow` field can't express. See #199."),
11560
+ disallowed_tools: exports_external.array(exports_external.string()).optional().describe("Granular tool denylist passed verbatim to Claude Code's --disallowedTools " + "flag. Cascades defaults → profile → per-agent (union, dedup). Same pattern " + "syntax as allowed_tools (e.g. 'Bash(rm *)'). See #199.")
11547
11561
  };
11548
11562
  ProfileSchema = exports_external.object(profileFields);
11549
11563
  ({ extends: _omitExtends, ...defaultsFields } = profileFields);
@@ -292,6 +292,18 @@ function mergeAgentConfig(defaultsIn, agentIn) {
292
292
  ...merged.cli_args ?? []
293
293
  ];
294
294
  }
295
+ if (defaults.allowed_tools || merged.allowed_tools) {
296
+ merged.allowed_tools = dedupe([
297
+ ...defaults.allowed_tools ?? [],
298
+ ...merged.allowed_tools ?? []
299
+ ]);
300
+ }
301
+ if (defaults.disallowed_tools || merged.disallowed_tools) {
302
+ merged.disallowed_tools = dedupe([
303
+ ...defaults.disallowed_tools ?? [],
304
+ ...merged.disallowed_tools ?? []
305
+ ]);
306
+ }
295
307
  if (defaults.extra_stable_files || merged.extra_stable_files) {
296
308
  const d = defaults.extra_stable_files ?? [];
297
309
  const a = merged.extra_stable_files ?? [];
@@ -11543,7 +11555,9 @@ var init_schema = __esm(() => {
11543
11555
  experimental: exports_external.object({
11544
11556
  legacy_pty: exports_external.boolean().optional().describe("Opt out of the default tmux supervisor (#725) and run the agent under " + "the legacy PTY supervisor instead. Default: false (tmux is the default)."),
11545
11557
  legacy_autoaccept_expect: exports_external.boolean().optional().describe("Opt the autoaccept gateway back into the legacy expect-script behaviour " + "instead of the tmux send-keys path. Default: false.")
11546
- }).optional().describe("Opt-in flags for experimental / legacy behaviours. Cascades through " + "defaults → profile → per-agent.")
11558
+ }).optional().describe("Opt-in flags for experimental / legacy behaviours. Cascades through " + "defaults → profile → per-agent."),
11559
+ allowed_tools: exports_external.array(exports_external.string()).optional().describe("Granular tool allowlist passed verbatim to Claude Code's --allowedTools " + "flag. Cascades defaults → profile → per-agent (union, dedup). Supports " + "patterns like 'Bash(git *)' or 'mcp__perplexity__*' that the coarse " + "`tools.allow` field can't express. See #199."),
11560
+ disallowed_tools: exports_external.array(exports_external.string()).optional().describe("Granular tool denylist passed verbatim to Claude Code's --disallowedTools " + "flag. Cascades defaults → profile → per-agent (union, dedup). Same pattern " + "syntax as allowed_tools (e.g. 'Bash(rm *)'). See #199.")
11547
11561
  };
11548
11562
  ProfileSchema = exports_external.object(profileFields);
11549
11563
  ({ extends: _omitExtends, ...defaultsFields } = profileFields);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "switchroom",
3
- "version": "0.14.5",
3
+ "version": "0.14.6",
4
4
  "description": "Run Claude Code 24/7 on your Claude Pro/Max subscription over Telegram. Open-source alternative to OpenClaw and NanoClaw — no API keys.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -23891,7 +23891,9 @@ var init_schema = __esm(() => {
23891
23891
  experimental: exports_external.object({
23892
23892
  legacy_pty: exports_external.boolean().optional().describe("Opt out of the default tmux supervisor (#725) and run the agent under " + "the legacy PTY supervisor instead. Default: false (tmux is the default)."),
23893
23893
  legacy_autoaccept_expect: exports_external.boolean().optional().describe("Opt the autoaccept gateway back into the legacy expect-script behaviour " + "instead of the tmux send-keys path. Default: false.")
23894
- }).optional().describe("Opt-in flags for experimental / legacy behaviours. Cascades through " + "defaults \u2192 profile \u2192 per-agent.")
23894
+ }).optional().describe("Opt-in flags for experimental / legacy behaviours. Cascades through " + "defaults \u2192 profile \u2192 per-agent."),
23895
+ allowed_tools: exports_external.array(exports_external.string()).optional().describe("Granular tool allowlist passed verbatim to Claude Code's --allowedTools " + "flag. Cascades defaults \u2192 profile \u2192 per-agent (union, dedup). Supports " + "patterns like 'Bash(git *)' or 'mcp__perplexity__*' that the coarse " + "`tools.allow` field can't express. See #199."),
23896
+ disallowed_tools: exports_external.array(exports_external.string()).optional().describe("Granular tool denylist passed verbatim to Claude Code's --disallowedTools " + "flag. Cascades defaults \u2192 profile \u2192 per-agent (union, dedup). Same pattern " + "syntax as allowed_tools (e.g. 'Bash(rm *)'). See #199.")
23895
23897
  };
23896
23898
  ProfileSchema = exports_external.object(profileFields);
23897
23899
  ({ extends: _omitExtends, ...defaultsFields } = profileFields);
@@ -24554,6 +24556,18 @@ function mergeAgentConfig(defaultsIn, agentIn) {
24554
24556
  ...merged.cli_args ?? []
24555
24557
  ];
24556
24558
  }
24559
+ if (defaults.allowed_tools || merged.allowed_tools) {
24560
+ merged.allowed_tools = dedupe([
24561
+ ...defaults.allowed_tools ?? [],
24562
+ ...merged.allowed_tools ?? []
24563
+ ]);
24564
+ }
24565
+ if (defaults.disallowed_tools || merged.disallowed_tools) {
24566
+ merged.disallowed_tools = dedupe([
24567
+ ...defaults.disallowed_tools ?? [],
24568
+ ...merged.disallowed_tools ?? []
24569
+ ]);
24570
+ }
24557
24571
  if (defaults.extra_stable_files || merged.extra_stable_files) {
24558
24572
  const d = defaults.extra_stable_files ?? [];
24559
24573
  const a = merged.extra_stable_files ?? [];
@@ -44048,6 +44062,18 @@ function mergeAgentConfig2(defaultsIn, agentIn) {
44048
44062
  ...merged.cli_args ?? []
44049
44063
  ];
44050
44064
  }
44065
+ if (defaults.allowed_tools || merged.allowed_tools) {
44066
+ merged.allowed_tools = dedupe2([
44067
+ ...defaults.allowed_tools ?? [],
44068
+ ...merged.allowed_tools ?? []
44069
+ ]);
44070
+ }
44071
+ if (defaults.disallowed_tools || merged.disallowed_tools) {
44072
+ merged.disallowed_tools = dedupe2([
44073
+ ...defaults.disallowed_tools ?? [],
44074
+ ...merged.disallowed_tools ?? []
44075
+ ]);
44076
+ }
44051
44077
  if (defaults.extra_stable_files || merged.extra_stable_files) {
44052
44078
  const d = defaults.extra_stable_files ?? [];
44053
44079
  const a = merged.extra_stable_files ?? [];
@@ -50068,11 +50094,11 @@ function sweepStaleTurnActiveMarker(stateDir, opts) {
50068
50094
  }
50069
50095
 
50070
50096
  // ../src/build-info.ts
50071
- var VERSION = "0.14.5";
50072
- var COMMIT_SHA = "c12d4240";
50073
- var COMMIT_DATE = "2026-05-28T21:57:39+10:00";
50074
- var LATEST_PR = null;
50075
- var COMMITS_AHEAD_OF_TAG = 2;
50097
+ var VERSION = "0.14.6";
50098
+ var COMMIT_SHA = "ff204bcf";
50099
+ var COMMIT_DATE = "2026-05-28T21:21:23Z";
50100
+ var LATEST_PR = 1974;
50101
+ var COMMITS_AHEAD_OF_TAG = 0;
50076
50102
 
50077
50103
  // gateway/boot-version.ts
50078
50104
  function formatRelativeAgo(iso) {