switchroom 0.19.47 → 0.19.48

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.
@@ -11095,6 +11095,8 @@ var AgentMemorySchema = exports_external.object({
11095
11095
  profile: exports_external.string().optional().describe("Memory profile bank this agent's curated memory defaults key off — " + "the built-in disposition + observations_mission in PROFILE_MEMORY_DEFAULTS. " + "Decouples the memory profile from `extends` (the filesystem persona " + "profile), so an agent on `extends: default` can opt into the `coding` " + "memory bundle via `memory.profile: coding` without inheriting the coding " + "persona. Resolution: memory.profile → extends → DEFAULT_PROFILE (see " + "resolveMemoryProfile). Unset ⇒ byte-identical to keying off `extends`."),
11096
11096
  bank_mission: exports_external.string().optional().describe("Bank-level mission statement used during recall to contextualize " + "results. NOTE: this is an alias for the Hindsight engine's " + "`reflect_mission` field (verified live: switchroom's bank_mission " + "lands in `config.reflect_mission`). Prefer `reflect_mission` going " + "forward; `bank_mission` is retained for back-compat. If both are " + "set, `reflect_mission` wins. Cascade: override."),
11097
11097
  reflect_mission: exports_external.string().optional().describe("Mission/context steering Hindsight Reflect operations (the bank's " + "'who am I / what matters' framing applied during recall). The " + "engine-accurate name for what `bank_mission` sets. Cascade: override."),
11098
+ reflect_budget: exports_external.enum(["low", "mid", "high"]).optional().describe("Thinking/retrieval budget injected into reflect MCP calls when the " + "caller omits budget. Unset ⇒ shim default (mid). Explicit per-call " + "budget always wins. Higher = better recall on fuzzy queries, more " + "backend latency/compute. stdio-shim transport only (ignored under " + "memory.config.mcp_transport: http). Cascade: override (per-agent " + "wins over default)."),
11099
+ reflect_max_tokens: exports_external.number().int().positive().max(8192).optional().describe("Token cap injected into reflect MCP calls when caller omits " + "max_tokens. Unset ⇒ shim default 1024. Values much above ~2048 risk " + "exceeding Claude Code's MCP output cap, silently dropping the " + "payload — raise deliberately. Explicit per-call values always win. " + "stdio-shim transport only. Cascade: override."),
11098
11100
  retain_mission: exports_external.string().optional().describe("Instructions for the fact extraction LLM during retain. Cascade: override."),
11099
11101
  mental_models: exports_external.array(exports_external.object({
11100
11102
  name: exports_external.string().min(1).describe("Stable model name (identity key for idempotent ensure). Two " + "declarations with the same name in one agent are rejected."),
@@ -11586,6 +11588,8 @@ var profileFields = {
11586
11588
  }).optional(),
11587
11589
  bank_mission: exports_external.string().optional(),
11588
11590
  reflect_mission: exports_external.string().optional(),
11591
+ reflect_budget: exports_external.enum(["low", "mid", "high"]).optional(),
11592
+ reflect_max_tokens: exports_external.number().int().positive().max(8192).optional(),
11589
11593
  retain_mission: exports_external.string().optional(),
11590
11594
  observations_mission: exports_external.string().optional(),
11591
11595
  disposition: exports_external.object({
@@ -11120,6 +11120,8 @@ var init_schema = __esm(() => {
11120
11120
  profile: exports_external.string().optional().describe("Memory profile bank this agent's curated memory defaults key off — " + "the built-in disposition + observations_mission in PROFILE_MEMORY_DEFAULTS. " + "Decouples the memory profile from `extends` (the filesystem persona " + "profile), so an agent on `extends: default` can opt into the `coding` " + "memory bundle via `memory.profile: coding` without inheriting the coding " + "persona. Resolution: memory.profile → extends → DEFAULT_PROFILE (see " + "resolveMemoryProfile). Unset ⇒ byte-identical to keying off `extends`."),
11121
11121
  bank_mission: exports_external.string().optional().describe("Bank-level mission statement used during recall to contextualize " + "results. NOTE: this is an alias for the Hindsight engine's " + "`reflect_mission` field (verified live: switchroom's bank_mission " + "lands in `config.reflect_mission`). Prefer `reflect_mission` going " + "forward; `bank_mission` is retained for back-compat. If both are " + "set, `reflect_mission` wins. Cascade: override."),
11122
11122
  reflect_mission: exports_external.string().optional().describe("Mission/context steering Hindsight Reflect operations (the bank's " + "'who am I / what matters' framing applied during recall). The " + "engine-accurate name for what `bank_mission` sets. Cascade: override."),
11123
+ reflect_budget: exports_external.enum(["low", "mid", "high"]).optional().describe("Thinking/retrieval budget injected into reflect MCP calls when the " + "caller omits budget. Unset ⇒ shim default (mid). Explicit per-call " + "budget always wins. Higher = better recall on fuzzy queries, more " + "backend latency/compute. stdio-shim transport only (ignored under " + "memory.config.mcp_transport: http). Cascade: override (per-agent " + "wins over default)."),
11124
+ reflect_max_tokens: exports_external.number().int().positive().max(8192).optional().describe("Token cap injected into reflect MCP calls when caller omits " + "max_tokens. Unset ⇒ shim default 1024. Values much above ~2048 risk " + "exceeding Claude Code's MCP output cap, silently dropping the " + "payload — raise deliberately. Explicit per-call values always win. " + "stdio-shim transport only. Cascade: override."),
11123
11125
  retain_mission: exports_external.string().optional().describe("Instructions for the fact extraction LLM during retain. Cascade: override."),
11124
11126
  mental_models: exports_external.array(exports_external.object({
11125
11127
  name: exports_external.string().min(1).describe("Stable model name (identity key for idempotent ensure). Two " + "declarations with the same name in one agent are rejected."),
@@ -11611,6 +11613,8 @@ var init_schema = __esm(() => {
11611
11613
  }).optional(),
11612
11614
  bank_mission: exports_external.string().optional(),
11613
11615
  reflect_mission: exports_external.string().optional(),
11616
+ reflect_budget: exports_external.enum(["low", "mid", "high"]).optional(),
11617
+ reflect_max_tokens: exports_external.number().int().positive().max(8192).optional(),
11614
11618
  retain_mission: exports_external.string().optional(),
11615
11619
  observations_mission: exports_external.string().optional(),
11616
11620
  disposition: exports_external.object({
@@ -18944,6 +18948,9 @@ for (const name of SHARED_FRAGMENTS) {
18944
18948
  }
18945
18949
  }
18946
18950
 
18951
+ // src/memory/scaffold-integration.ts
18952
+ init_merge();
18953
+
18947
18954
  // src/litellm/timeout-budget.ts
18948
18955
  var LITELLM_ROUTER_MARGIN_S = 10;
18949
18956
  var LITELLM_TIMEOUT_TIERS = {
@@ -11856,6 +11856,8 @@ var AgentMemorySchema = exports_external.object({
11856
11856
  profile: exports_external.string().optional().describe("Memory profile bank this agent's curated memory defaults key off \u2014 " + "the built-in disposition + observations_mission in PROFILE_MEMORY_DEFAULTS. " + "Decouples the memory profile from `extends` (the filesystem persona " + "profile), so an agent on `extends: default` can opt into the `coding` " + "memory bundle via `memory.profile: coding` without inheriting the coding " + "persona. Resolution: memory.profile \u2192 extends \u2192 DEFAULT_PROFILE (see " + "resolveMemoryProfile). Unset \u21d2 byte-identical to keying off `extends`."),
11857
11857
  bank_mission: exports_external.string().optional().describe("Bank-level mission statement used during recall to contextualize " + "results. NOTE: this is an alias for the Hindsight engine's " + "`reflect_mission` field (verified live: switchroom's bank_mission " + "lands in `config.reflect_mission`). Prefer `reflect_mission` going " + "forward; `bank_mission` is retained for back-compat. If both are " + "set, `reflect_mission` wins. Cascade: override."),
11858
11858
  reflect_mission: exports_external.string().optional().describe("Mission/context steering Hindsight Reflect operations (the bank's " + "'who am I / what matters' framing applied during recall). The " + "engine-accurate name for what `bank_mission` sets. Cascade: override."),
11859
+ reflect_budget: exports_external.enum(["low", "mid", "high"]).optional().describe("Thinking/retrieval budget injected into reflect MCP calls when the " + "caller omits budget. Unset \u21d2 shim default (mid). Explicit per-call " + "budget always wins. Higher = better recall on fuzzy queries, more " + "backend latency/compute. stdio-shim transport only (ignored under " + "memory.config.mcp_transport: http). Cascade: override (per-agent " + "wins over default)."),
11860
+ reflect_max_tokens: exports_external.number().int().positive().max(8192).optional().describe("Token cap injected into reflect MCP calls when caller omits " + "max_tokens. Unset \u21d2 shim default 1024. Values much above ~2048 risk " + "exceeding Claude Code's MCP output cap, silently dropping the " + "payload \u2014 raise deliberately. Explicit per-call values always win. " + "stdio-shim transport only. Cascade: override."),
11859
11861
  retain_mission: exports_external.string().optional().describe("Instructions for the fact extraction LLM during retain. Cascade: override."),
11860
11862
  mental_models: exports_external.array(exports_external.object({
11861
11863
  name: exports_external.string().min(1).describe("Stable model name (identity key for idempotent ensure). Two " + "declarations with the same name in one agent are rejected."),
@@ -12347,6 +12349,8 @@ var profileFields = {
12347
12349
  }).optional(),
12348
12350
  bank_mission: exports_external.string().optional(),
12349
12351
  reflect_mission: exports_external.string().optional(),
12352
+ reflect_budget: exports_external.enum(["low", "mid", "high"]).optional(),
12353
+ reflect_max_tokens: exports_external.number().int().positive().max(8192).optional(),
12350
12354
  retain_mission: exports_external.string().optional(),
12351
12355
  observations_mission: exports_external.string().optional(),
12352
12356
  disposition: exports_external.object({
@@ -2120,7 +2120,7 @@ var init_esm = __esm(() => {
2120
2120
  });
2121
2121
 
2122
2122
  // src/build-info.ts
2123
- var VERSION = "0.19.47", COMMIT_SHA = "9693493e";
2123
+ var VERSION = "0.19.48", COMMIT_SHA = "22eb634b";
2124
2124
 
2125
2125
  // src/cli/resolve-version.ts
2126
2126
  import { existsSync, readFileSync } from "node:fs";
@@ -13721,6 +13721,8 @@ var init_schema = __esm(() => {
13721
13721
  profile: exports_external.string().optional().describe("Memory profile bank this agent's curated memory defaults key off \u2014 " + "the built-in disposition + observations_mission in PROFILE_MEMORY_DEFAULTS. " + "Decouples the memory profile from `extends` (the filesystem persona " + "profile), so an agent on `extends: default` can opt into the `coding` " + "memory bundle via `memory.profile: coding` without inheriting the coding " + "persona. Resolution: memory.profile \u2192 extends \u2192 DEFAULT_PROFILE (see " + "resolveMemoryProfile). Unset \u21d2 byte-identical to keying off `extends`."),
13722
13722
  bank_mission: exports_external.string().optional().describe("Bank-level mission statement used during recall to contextualize " + "results. NOTE: this is an alias for the Hindsight engine's " + "`reflect_mission` field (verified live: switchroom's bank_mission " + "lands in `config.reflect_mission`). Prefer `reflect_mission` going " + "forward; `bank_mission` is retained for back-compat. If both are " + "set, `reflect_mission` wins. Cascade: override."),
13723
13723
  reflect_mission: exports_external.string().optional().describe("Mission/context steering Hindsight Reflect operations (the bank's " + "'who am I / what matters' framing applied during recall). The " + "engine-accurate name for what `bank_mission` sets. Cascade: override."),
13724
+ reflect_budget: exports_external.enum(["low", "mid", "high"]).optional().describe("Thinking/retrieval budget injected into reflect MCP calls when the " + "caller omits budget. Unset \u21d2 shim default (mid). Explicit per-call " + "budget always wins. Higher = better recall on fuzzy queries, more " + "backend latency/compute. stdio-shim transport only (ignored under " + "memory.config.mcp_transport: http). Cascade: override (per-agent " + "wins over default)."),
13725
+ reflect_max_tokens: exports_external.number().int().positive().max(8192).optional().describe("Token cap injected into reflect MCP calls when caller omits " + "max_tokens. Unset \u21d2 shim default 1024. Values much above ~2048 risk " + "exceeding Claude Code's MCP output cap, silently dropping the " + "payload \u2014 raise deliberately. Explicit per-call values always win. " + "stdio-shim transport only. Cascade: override."),
13724
13726
  retain_mission: exports_external.string().optional().describe("Instructions for the fact extraction LLM during retain. Cascade: override."),
13725
13727
  mental_models: exports_external.array(exports_external.object({
13726
13728
  name: exports_external.string().min(1).describe("Stable model name (identity key for idempotent ensure). Two " + "declarations with the same name in one agent are rejected."),
@@ -14212,6 +14214,8 @@ var init_schema = __esm(() => {
14212
14214
  }).optional(),
14213
14215
  bank_mission: exports_external.string().optional(),
14214
14216
  reflect_mission: exports_external.string().optional(),
14217
+ reflect_budget: exports_external.enum(["low", "mid", "high"]).optional(),
14218
+ reflect_max_tokens: exports_external.number().int().positive().max(8192).optional(),
14215
14219
  retain_mission: exports_external.string().optional(),
14216
14220
  observations_mission: exports_external.string().optional(),
14217
14221
  disposition: exports_external.object({
@@ -19130,9 +19134,12 @@ var init_hindsight = __esm(() => {
19130
19134
  });
19131
19135
 
19132
19136
  // src/memory/hindsight.ts
19133
- function generateHindsightMcpConfig(collection, memoryConfig) {
19137
+ function generateHindsightMcpConfig(collection, memoryConfig, opts = {}) {
19134
19138
  const url = memoryConfig.config?.url ?? HINDSIGHT_DEFAULT_MCP_URL;
19135
19139
  if (memoryConfig.config?.mcp_transport === "http") {
19140
+ if (opts.reflectBudget !== undefined || opts.reflectMaxTokens !== undefined) {
19141
+ console.error("memory.reflect_budget/reflect_max_tokens have no effect under " + "mcp_transport: http \u2014 bypasses the shim");
19142
+ }
19136
19143
  return {
19137
19144
  type: "http",
19138
19145
  url,
@@ -19149,7 +19156,9 @@ function generateHindsightMcpConfig(collection, memoryConfig) {
19149
19156
  HINDSIGHT_MCP_URL: url,
19150
19157
  HINDSIGHT_BANK_ID: collection,
19151
19158
  HINDSIGHT_SHIM_CACHE_DIR: `${HINDSIGHT_SHIM_AGENT_HOME}/.hindsight-shim`,
19152
- HOME: HINDSIGHT_SHIM_AGENT_HOME
19159
+ HOME: HINDSIGHT_SHIM_AGENT_HOME,
19160
+ ...opts.reflectBudget ? { HINDSIGHT_SHIM_REFLECT_BUDGET: opts.reflectBudget } : {},
19161
+ ...opts.reflectMaxTokens ? { HINDSIGHT_SHIM_REFLECT_MAX_TOKENS: String(opts.reflectMaxTokens) } : {}
19153
19162
  }
19154
19163
  };
19155
19164
  }
@@ -27359,7 +27368,11 @@ function getHindsightSettingsEntry(agentName, config) {
27359
27368
  return null;
27360
27369
  }
27361
27370
  const collection = getCollectionForAgent(agentName, config);
27362
- const mcpConfig = generateHindsightMcpConfig(collection, memoryConfig);
27371
+ const resolved = resolveAgentConfig(config.defaults, config.profiles, config.agents[agentName] ?? {});
27372
+ const mcpConfig = generateHindsightMcpConfig(collection, memoryConfig, {
27373
+ reflectBudget: resolved.memory?.reflect_budget,
27374
+ reflectMaxTokens: resolved.memory?.reflect_max_tokens
27375
+ });
27363
27376
  return { key: "hindsight", value: { ...mcpConfig, alwaysLoad: false } };
27364
27377
  }
27365
27378
  function getPlaywrightMcpSettingsEntry() {
@@ -27450,6 +27463,7 @@ function getBuiltinDefaultSkillEntries() {
27450
27463
  }
27451
27464
  var GOOGLE_WORKSPACE_MCP_PINNED_SHA = "9d69115b63e6bc2ef0d4b5d7a3b962396382b44c", MICROSOFT_WORKSPACE_MCP_PINNED_VERSION = "0.113.0", MICROSOFT_WORKSPACE_MCP_PACKAGE = "@softeria/ms-365-mcp-server", NOTION_MCP_PINNED_VERSION = "1.8.1", NOTION_MCP_PACKAGE = "@notionhq/notion-mcp-server", NOTION_TOKEN_ENV = "NOTION_TOKEN";
27452
27465
  var init_scaffold_integration = __esm(() => {
27466
+ init_merge();
27453
27467
  init_hindsight2();
27454
27468
  });
27455
27469
 
@@ -101463,12 +101477,20 @@ function redactToolCallParams(params) {
101463
101477
  }
101464
101478
  var DEFAULT_RECALL_MAX_TOKENS = 1024;
101465
101479
  var DEFAULT_REFLECT_MAX_TOKENS = 1024;
101480
+ var DEFAULT_RECALL_BUDGET = "low";
101481
+ var DEFAULT_REFLECT_BUDGET = "mid";
101482
+ var VALID_BUDGETS = new Set(["low", "mid", "high"]);
101466
101483
  function resolveClampMaxTokens(envVal, fallback) {
101467
101484
  if (envVal === undefined || envVal === "")
101468
101485
  return fallback;
101469
101486
  const n = Number.parseInt(envVal, 10);
101470
101487
  return Number.isFinite(n) && n > 0 ? n : fallback;
101471
101488
  }
101489
+ function resolveClampBudget(envVal, fallback) {
101490
+ if (envVal === undefined || envVal === "")
101491
+ return fallback;
101492
+ return VALID_BUDGETS.has(envVal) ? envVal : fallback;
101493
+ }
101472
101494
  function acceptedArgs(name) {
101473
101495
  const spec = FALLBACK_TOOL_TABLE[name];
101474
101496
  if (!spec)
@@ -101503,8 +101525,9 @@ function guardAndClampToolCall(params, env2) {
101503
101525
  if (injected.max_tokens === undefined) {
101504
101526
  injected.max_tokens = name === "recall" ? resolveClampMaxTokens(env2.HINDSIGHT_SHIM_RECALL_MAX_TOKENS, DEFAULT_RECALL_MAX_TOKENS) : resolveClampMaxTokens(env2.HINDSIGHT_SHIM_REFLECT_MAX_TOKENS, DEFAULT_REFLECT_MAX_TOKENS);
101505
101527
  }
101506
- if (injected.budget === undefined)
101507
- injected.budget = "low";
101528
+ if (injected.budget === undefined) {
101529
+ injected.budget = name === "recall" ? resolveClampBudget(env2.HINDSIGHT_SHIM_RECALL_BUDGET, DEFAULT_RECALL_BUDGET) : resolveClampBudget(env2.HINDSIGHT_SHIM_REFLECT_BUDGET, DEFAULT_REFLECT_BUDGET);
101530
+ }
101508
101531
  return { ok: true, params: { ...called, arguments: injected } };
101509
101532
  }
101510
101533
  return { ok: true, params };
@@ -11120,6 +11120,8 @@ var init_schema = __esm(() => {
11120
11120
  profile: exports_external.string().optional().describe("Memory profile bank this agent's curated memory defaults key off — " + "the built-in disposition + observations_mission in PROFILE_MEMORY_DEFAULTS. " + "Decouples the memory profile from `extends` (the filesystem persona " + "profile), so an agent on `extends: default` can opt into the `coding` " + "memory bundle via `memory.profile: coding` without inheriting the coding " + "persona. Resolution: memory.profile → extends → DEFAULT_PROFILE (see " + "resolveMemoryProfile). Unset ⇒ byte-identical to keying off `extends`."),
11121
11121
  bank_mission: exports_external.string().optional().describe("Bank-level mission statement used during recall to contextualize " + "results. NOTE: this is an alias for the Hindsight engine's " + "`reflect_mission` field (verified live: switchroom's bank_mission " + "lands in `config.reflect_mission`). Prefer `reflect_mission` going " + "forward; `bank_mission` is retained for back-compat. If both are " + "set, `reflect_mission` wins. Cascade: override."),
11122
11122
  reflect_mission: exports_external.string().optional().describe("Mission/context steering Hindsight Reflect operations (the bank's " + "'who am I / what matters' framing applied during recall). The " + "engine-accurate name for what `bank_mission` sets. Cascade: override."),
11123
+ reflect_budget: exports_external.enum(["low", "mid", "high"]).optional().describe("Thinking/retrieval budget injected into reflect MCP calls when the " + "caller omits budget. Unset ⇒ shim default (mid). Explicit per-call " + "budget always wins. Higher = better recall on fuzzy queries, more " + "backend latency/compute. stdio-shim transport only (ignored under " + "memory.config.mcp_transport: http). Cascade: override (per-agent " + "wins over default)."),
11124
+ reflect_max_tokens: exports_external.number().int().positive().max(8192).optional().describe("Token cap injected into reflect MCP calls when caller omits " + "max_tokens. Unset ⇒ shim default 1024. Values much above ~2048 risk " + "exceeding Claude Code's MCP output cap, silently dropping the " + "payload — raise deliberately. Explicit per-call values always win. " + "stdio-shim transport only. Cascade: override."),
11123
11125
  retain_mission: exports_external.string().optional().describe("Instructions for the fact extraction LLM during retain. Cascade: override."),
11124
11126
  mental_models: exports_external.array(exports_external.object({
11125
11127
  name: exports_external.string().min(1).describe("Stable model name (identity key for idempotent ensure). Two " + "declarations with the same name in one agent are rejected."),
@@ -11611,6 +11613,8 @@ var init_schema = __esm(() => {
11611
11613
  }).optional(),
11612
11614
  bank_mission: exports_external.string().optional(),
11613
11615
  reflect_mission: exports_external.string().optional(),
11616
+ reflect_budget: exports_external.enum(["low", "mid", "high"]).optional(),
11617
+ reflect_max_tokens: exports_external.number().int().positive().max(8192).optional(),
11614
11618
  retain_mission: exports_external.string().optional(),
11615
11619
  observations_mission: exports_external.string().optional(),
11616
11620
  disposition: exports_external.object({
@@ -21411,7 +21415,7 @@ function allocateAgentUid(name) {
21411
21415
  }
21412
21416
 
21413
21417
  // src/build-info.ts
21414
- var VERSION = "0.19.47";
21418
+ var VERSION = "0.19.48";
21415
21419
 
21416
21420
  // src/setup/hindsight-recall-tunables.ts
21417
21421
  var RECALL_DEADLINE_HEADROOM_SECONDS = 2;
@@ -21482,6 +21486,9 @@ for (const name of SHARED_FRAGMENTS) {
21482
21486
  }
21483
21487
  }
21484
21488
 
21489
+ // src/memory/scaffold-integration.ts
21490
+ init_merge();
21491
+
21485
21492
  // src/litellm/timeout-budget.ts
21486
21493
  var LITELLM_ROUTER_MARGIN_S = 10;
21487
21494
  var LITELLM_TIMEOUT_TIERS = {
@@ -4560,6 +4560,8 @@ var init_schema = __esm(() => {
4560
4560
  profile: exports_external.string().optional().describe("Memory profile bank this agent's curated memory defaults key off — " + "the built-in disposition + observations_mission in PROFILE_MEMORY_DEFAULTS. " + "Decouples the memory profile from `extends` (the filesystem persona " + "profile), so an agent on `extends: default` can opt into the `coding` " + "memory bundle via `memory.profile: coding` without inheriting the coding " + "persona. Resolution: memory.profile → extends → DEFAULT_PROFILE (see " + "resolveMemoryProfile). Unset ⇒ byte-identical to keying off `extends`."),
4561
4561
  bank_mission: exports_external.string().optional().describe("Bank-level mission statement used during recall to contextualize " + "results. NOTE: this is an alias for the Hindsight engine's " + "`reflect_mission` field (verified live: switchroom's bank_mission " + "lands in `config.reflect_mission`). Prefer `reflect_mission` going " + "forward; `bank_mission` is retained for back-compat. If both are " + "set, `reflect_mission` wins. Cascade: override."),
4562
4562
  reflect_mission: exports_external.string().optional().describe("Mission/context steering Hindsight Reflect operations (the bank's " + "'who am I / what matters' framing applied during recall). The " + "engine-accurate name for what `bank_mission` sets. Cascade: override."),
4563
+ reflect_budget: exports_external.enum(["low", "mid", "high"]).optional().describe("Thinking/retrieval budget injected into reflect MCP calls when the " + "caller omits budget. Unset ⇒ shim default (mid). Explicit per-call " + "budget always wins. Higher = better recall on fuzzy queries, more " + "backend latency/compute. stdio-shim transport only (ignored under " + "memory.config.mcp_transport: http). Cascade: override (per-agent " + "wins over default)."),
4564
+ reflect_max_tokens: exports_external.number().int().positive().max(8192).optional().describe("Token cap injected into reflect MCP calls when caller omits " + "max_tokens. Unset ⇒ shim default 1024. Values much above ~2048 risk " + "exceeding Claude Code's MCP output cap, silently dropping the " + "payload — raise deliberately. Explicit per-call values always win. " + "stdio-shim transport only. Cascade: override."),
4563
4565
  retain_mission: exports_external.string().optional().describe("Instructions for the fact extraction LLM during retain. Cascade: override."),
4564
4566
  mental_models: exports_external.array(exports_external.object({
4565
4567
  name: exports_external.string().min(1).describe("Stable model name (identity key for idempotent ensure). Two " + "declarations with the same name in one agent are rejected."),
@@ -5051,6 +5053,8 @@ var init_schema = __esm(() => {
5051
5053
  }).optional(),
5052
5054
  bank_mission: exports_external.string().optional(),
5053
5055
  reflect_mission: exports_external.string().optional(),
5056
+ reflect_budget: exports_external.enum(["low", "mid", "high"]).optional(),
5057
+ reflect_max_tokens: exports_external.number().int().positive().max(8192).optional(),
5054
5058
  retain_mission: exports_external.string().optional(),
5055
5059
  observations_mission: exports_external.string().optional(),
5056
5060
  disposition: exports_external.object({
@@ -19377,6 +19381,9 @@ for (const name of SHARED_FRAGMENTS) {
19377
19381
  }
19378
19382
  }
19379
19383
 
19384
+ // src/memory/scaffold-integration.ts
19385
+ init_merge();
19386
+
19380
19387
  // src/litellm/timeout-budget.ts
19381
19388
  var LITELLM_ROUTER_MARGIN_S = 10;
19382
19389
  var LITELLM_TIMEOUT_TIERS = {
@@ -4156,6 +4156,8 @@ var init_schema = __esm(() => {
4156
4156
  profile: exports_external.string().optional().describe("Memory profile bank this agent's curated memory defaults key off — " + "the built-in disposition + observations_mission in PROFILE_MEMORY_DEFAULTS. " + "Decouples the memory profile from `extends` (the filesystem persona " + "profile), so an agent on `extends: default` can opt into the `coding` " + "memory bundle via `memory.profile: coding` without inheriting the coding " + "persona. Resolution: memory.profile → extends → DEFAULT_PROFILE (see " + "resolveMemoryProfile). Unset ⇒ byte-identical to keying off `extends`."),
4157
4157
  bank_mission: exports_external.string().optional().describe("Bank-level mission statement used during recall to contextualize " + "results. NOTE: this is an alias for the Hindsight engine's " + "`reflect_mission` field (verified live: switchroom's bank_mission " + "lands in `config.reflect_mission`). Prefer `reflect_mission` going " + "forward; `bank_mission` is retained for back-compat. If both are " + "set, `reflect_mission` wins. Cascade: override."),
4158
4158
  reflect_mission: exports_external.string().optional().describe("Mission/context steering Hindsight Reflect operations (the bank's " + "'who am I / what matters' framing applied during recall). The " + "engine-accurate name for what `bank_mission` sets. Cascade: override."),
4159
+ reflect_budget: exports_external.enum(["low", "mid", "high"]).optional().describe("Thinking/retrieval budget injected into reflect MCP calls when the " + "caller omits budget. Unset ⇒ shim default (mid). Explicit per-call " + "budget always wins. Higher = better recall on fuzzy queries, more " + "backend latency/compute. stdio-shim transport only (ignored under " + "memory.config.mcp_transport: http). Cascade: override (per-agent " + "wins over default)."),
4160
+ reflect_max_tokens: exports_external.number().int().positive().max(8192).optional().describe("Token cap injected into reflect MCP calls when caller omits " + "max_tokens. Unset ⇒ shim default 1024. Values much above ~2048 risk " + "exceeding Claude Code's MCP output cap, silently dropping the " + "payload — raise deliberately. Explicit per-call values always win. " + "stdio-shim transport only. Cascade: override."),
4159
4161
  retain_mission: exports_external.string().optional().describe("Instructions for the fact extraction LLM during retain. Cascade: override."),
4160
4162
  mental_models: exports_external.array(exports_external.object({
4161
4163
  name: exports_external.string().min(1).describe("Stable model name (identity key for idempotent ensure). Two " + "declarations with the same name in one agent are rejected."),
@@ -4647,6 +4649,8 @@ var init_schema = __esm(() => {
4647
4649
  }).optional(),
4648
4650
  bank_mission: exports_external.string().optional(),
4649
4651
  reflect_mission: exports_external.string().optional(),
4652
+ reflect_budget: exports_external.enum(["low", "mid", "high"]).optional(),
4653
+ reflect_max_tokens: exports_external.number().int().positive().max(8192).optional(),
4650
4654
  retain_mission: exports_external.string().optional(),
4651
4655
  observations_mission: exports_external.string().optional(),
4652
4656
  disposition: exports_external.object({
@@ -19790,6 +19794,9 @@ for (const name of SHARED_FRAGMENTS) {
19790
19794
  }
19791
19795
  }
19792
19796
 
19797
+ // src/memory/scaffold-integration.ts
19798
+ init_merge();
19799
+
19793
19800
  // src/litellm/timeout-budget.ts
19794
19801
  var LITELLM_ROUTER_MARGIN_S = 10;
19795
19802
  var LITELLM_TIMEOUT_TIERS = {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "switchroom",
3
3
  "//version": "NOT the release version — source of truth is the git tag, resolved by scripts/build.mjs:resolveVersion() (see CLAUDE.md > Standard release process). This field is stale by design and only the Layer-4 dev/non-tag fallback for build.mjs + src/cli/resolve-version.ts; do NOT bump it expecting a release to pick it up. npm-pack tarball naming needs a real version — do that as an UNCOMMITTED pack-time bump (see release step 6), never a committed one.",
4
- "version": "0.19.47",
4
+ "version": "0.19.48",
5
5
  "description": "Run Claude Code 24/7 on your Claude Pro/Max subscription over Telegram. Open-source alternative to OpenClaw and NanoClaw — no API keys.",
6
6
  "type": "module",
7
7
  "bin": {
@@ -21673,6 +21673,8 @@ var init_schema = __esm(() => {
21673
21673
  profile: exports_external.string().optional().describe("Memory profile bank this agent's curated memory defaults key off \u2014 " + "the built-in disposition + observations_mission in PROFILE_MEMORY_DEFAULTS. " + "Decouples the memory profile from `extends` (the filesystem persona " + "profile), so an agent on `extends: default` can opt into the `coding` " + "memory bundle via `memory.profile: coding` without inheriting the coding " + "persona. Resolution: memory.profile \u2192 extends \u2192 DEFAULT_PROFILE (see " + "resolveMemoryProfile). Unset \u21d2 byte-identical to keying off `extends`."),
21674
21674
  bank_mission: exports_external.string().optional().describe("Bank-level mission statement used during recall to contextualize " + "results. NOTE: this is an alias for the Hindsight engine's " + "`reflect_mission` field (verified live: switchroom's bank_mission " + "lands in `config.reflect_mission`). Prefer `reflect_mission` going " + "forward; `bank_mission` is retained for back-compat. If both are " + "set, `reflect_mission` wins. Cascade: override."),
21675
21675
  reflect_mission: exports_external.string().optional().describe("Mission/context steering Hindsight Reflect operations (the bank's " + "'who am I / what matters' framing applied during recall). The " + "engine-accurate name for what `bank_mission` sets. Cascade: override."),
21676
+ reflect_budget: exports_external.enum(["low", "mid", "high"]).optional().describe("Thinking/retrieval budget injected into reflect MCP calls when the " + "caller omits budget. Unset \u21d2 shim default (mid). Explicit per-call " + "budget always wins. Higher = better recall on fuzzy queries, more " + "backend latency/compute. stdio-shim transport only (ignored under " + "memory.config.mcp_transport: http). Cascade: override (per-agent " + "wins over default)."),
21677
+ reflect_max_tokens: exports_external.number().int().positive().max(8192).optional().describe("Token cap injected into reflect MCP calls when caller omits " + "max_tokens. Unset \u21d2 shim default 1024. Values much above ~2048 risk " + "exceeding Claude Code's MCP output cap, silently dropping the " + "payload \u2014 raise deliberately. Explicit per-call values always win. " + "stdio-shim transport only. Cascade: override."),
21676
21678
  retain_mission: exports_external.string().optional().describe("Instructions for the fact extraction LLM during retain. Cascade: override."),
21677
21679
  mental_models: exports_external.array(exports_external.object({
21678
21680
  name: exports_external.string().min(1).describe("Stable model name (identity key for idempotent ensure). Two " + "declarations with the same name in one agent are rejected."),
@@ -22164,6 +22166,8 @@ var init_schema = __esm(() => {
22164
22166
  }).optional(),
22165
22167
  bank_mission: exports_external.string().optional(),
22166
22168
  reflect_mission: exports_external.string().optional(),
22169
+ reflect_budget: exports_external.enum(["low", "mid", "high"]).optional(),
22170
+ reflect_max_tokens: exports_external.number().int().positive().max(8192).optional(),
22167
22171
  retain_mission: exports_external.string().optional(),
22168
22172
  observations_mission: exports_external.string().optional(),
22169
22173
  disposition: exports_external.object({
@@ -86064,6 +86068,9 @@ for (const name of SHARED_FRAGMENTS) {
86064
86068
  }
86065
86069
  }
86066
86070
 
86071
+ // ../src/memory/scaffold-integration.ts
86072
+ init_merge();
86073
+
86067
86074
  // ../src/litellm/timeout-budget.ts
86068
86075
  var LITELLM_ROUTER_MARGIN_S = 10;
86069
86076
  var LITELLM_TIMEOUT_TIERS = {
@@ -101140,10 +101147,10 @@ function startOutboxSweep(deps) {
101140
101147
  }
101141
101148
 
101142
101149
  // ../src/build-info.ts
101143
- var VERSION2 = "0.19.47";
101144
- var COMMIT_SHA = "9693493e";
101145
- var COMMIT_DATE = "2026-08-02T01:20:29Z";
101146
- var LATEST_PR = 4201;
101150
+ var VERSION2 = "0.19.48";
101151
+ var COMMIT_SHA = "22eb634b";
101152
+ var COMMIT_DATE = "2026-08-02T05:59:26Z";
101153
+ var LATEST_PR = 4207;
101147
101154
  var COMMITS_AHEAD_OF_TAG = 0;
101148
101155
 
101149
101156
  // gateway/boot-version.ts