openmausbot 0.1.87 → 0.1.89

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.
Files changed (150) hide show
  1. package/README.md +2 -1
  2. package/dist/assets/{abnfDiagram-O67JEVCF-BTiuL79F.js → abnfDiagram-O67JEVCF-BwaMaZEm.js} +1 -1
  3. package/dist/assets/{arc-C88Blc2v.js → arc-Be-8GKxd.js} +1 -1
  4. package/dist/assets/{architectureDiagram-NJMV4G6O-BZsJIZrb.js → architectureDiagram-NJMV4G6O-Dp_U2Kv1.js} +1 -1
  5. package/dist/assets/{blockDiagram-BEXU5L5S-CVeMe9Ah.js → blockDiagram-BEXU5L5S-DQjUjYUk.js} +1 -1
  6. package/dist/assets/{c4Diagram-YGBWAQC7-Cedk3Bhx.js → c4Diagram-YGBWAQC7-Bd3aE4Kc.js} +1 -1
  7. package/dist/assets/channel-DqY_gMLg.js +1 -0
  8. package/dist/assets/{chunk-2Q5K7J3B-D-VRqzTB.js → chunk-2Q5K7J3B-BijjTBeJ.js} +1 -1
  9. package/dist/assets/{chunk-3FUC2YCW-BChov01Y.js → chunk-3FUC2YCW-CMGdwvzW.js} +2 -2
  10. package/dist/assets/{chunk-5VM5RSS4-C-TfwvHy.js → chunk-5VM5RSS4-0G09BfsZ.js} +1 -1
  11. package/dist/assets/{chunk-GTNCS2PH-Db7CGj5Y.js → chunk-GTNCS2PH-FOp3vSHe.js} +1 -1
  12. package/dist/assets/{chunk-GWA4HPMP-CNvIfqKT.js → chunk-GWA4HPMP-Dv-20VIn.js} +1 -1
  13. package/dist/assets/{chunk-JWPE2WC7-C_bEp5tq.js → chunk-JWPE2WC7-CRgrdFcz.js} +1 -1
  14. package/dist/assets/{chunk-NETBCI7D-Coi4BOls.js → chunk-NETBCI7D-3hP4f7QB.js} +1 -1
  15. package/dist/assets/{chunk-WEXAMYUT-CzylEuL3.js → chunk-WEXAMYUT-CG98IjlG.js} +1 -1
  16. package/dist/assets/{chunk-XXDRQBXY-m7p7ztaD.js → chunk-XXDRQBXY-BrSTC9xG.js} +1 -1
  17. package/dist/assets/{classDiagram-v2-NBCMYWYE-BMy6o9x2.js → classDiagram-v2-NBCMYWYE-rpQQQDFX.js} +1 -1
  18. package/dist/assets/{cose-bilkent-JH36ORCC-BDQ__0_J.js → cose-bilkent-JH36ORCC-G6RSafHA.js} +1 -1
  19. package/dist/assets/{cynefin-OW5HDTMX-Djv4ghUb.js → cynefin-OW5HDTMX-CXjv-IM2.js} +1 -1
  20. package/dist/assets/{cynefinDiagram-VND7K2PF-BULrlGYH.js → cynefinDiagram-VND7K2PF-Dw07MR9f.js} +1 -1
  21. package/dist/assets/{dagre-6A5THRUB-D-jrT_hU.js → dagre-6A5THRUB-BwPnlTg2.js} +1 -1
  22. package/dist/assets/{diagram-22UHCM2B-p2UhQmfL.js → diagram-22UHCM2B-Cm6xcMiz.js} +1 -1
  23. package/dist/assets/{diagram-3UASUU5V-DHvGWZ7q.js → diagram-3UASUU5V-CDpogPbE.js} +1 -1
  24. package/dist/assets/{diagram-ATOU4E4O-ChhKDot-.js → diagram-ATOU4E4O-BV8z3Pnc.js} +1 -1
  25. package/dist/assets/{diagram-CDSNMT55-B-T7A43R.js → diagram-CDSNMT55-CKCQhOOC.js} +1 -1
  26. package/dist/assets/{diagram-MLGK6HIB-CJm8ENNY.js → diagram-MLGK6HIB-FGvJg69C.js} +1 -1
  27. package/dist/assets/{diagram-MPIPVDR6-510tlza8.js → diagram-MPIPVDR6-CwATvgnS.js} +1 -1
  28. package/dist/assets/{ebnfDiagram-ZINNZB2B-PkvRPHel.js → ebnfDiagram-ZINNZB2B-CH_c3SSC.js} +1 -1
  29. package/dist/assets/{elk-276RUBZZ-BVBVPoX3.js → elk-276RUBZZ-3guZi71R.js} +1 -1
  30. package/dist/assets/{erDiagram-OPXOYQCR-BgYMVm7L.js → erDiagram-OPXOYQCR-BMHphR2n.js} +1 -1
  31. package/dist/assets/{flowDiagram-KWPJA3E3-BGqsnc_3.js → flowDiagram-KWPJA3E3-Vm5DkW5x.js} +1 -1
  32. package/dist/assets/{ganttDiagram-FUAMR5RP-D_-UeReH.js → ganttDiagram-FUAMR5RP-DO-1ct07.js} +1 -1
  33. package/dist/assets/{gitGraphDiagram-X574FWY7-D0uooONx.js → gitGraphDiagram-X574FWY7-nxeksEIN.js} +1 -1
  34. package/dist/assets/index-BIMdIbaw.css +1 -0
  35. package/dist/assets/index-BVPdbq2r.js +583 -0
  36. package/dist/assets/{index-zRsJERGJ.js → index-Oxk9x45i.js} +1 -1
  37. package/dist/assets/{infoDiagram-VRGFBTTK-B9e1z77f.js → infoDiagram-VRGFBTTK-Dkcvr0p7.js} +1 -1
  38. package/dist/assets/{ishikawaDiagram-OU5B5YK6-BB4vNwvD.js → ishikawaDiagram-OU5B5YK6-BwVibkoO.js} +1 -1
  39. package/dist/assets/{journeyDiagram-ZHPQQLJL-DpkosOTB.js → journeyDiagram-ZHPQQLJL-ByiBZqgG.js} +1 -1
  40. package/dist/assets/{kanban-definition-PNTS6WVX-DbDP4kUu.js → kanban-definition-PNTS6WVX-qqjgXBF3.js} +1 -1
  41. package/dist/assets/{linear-DBJGPmjT.js → linear-CtJnKe6A.js} +1 -1
  42. package/dist/assets/{mermaid.core-DWPRi-ue.js → mermaid.core-BEiDklrY.js} +5 -5
  43. package/dist/assets/{mindmap-definition-NLK3R4M7-nszBbJmx.js → mindmap-definition-NLK3R4M7-DfIYHia9.js} +1 -1
  44. package/dist/assets/{pegDiagram-GJSIUBJH-CWykJWu_.js → pegDiagram-GJSIUBJH-CYyRqa1a.js} +1 -1
  45. package/dist/assets/{pieDiagram-5QR66LMP-g3Da-Vnv.js → pieDiagram-5QR66LMP-hOToy_zH.js} +1 -1
  46. package/dist/assets/{quadrantDiagram-O4NWA36T-Wzrlpzgh.js → quadrantDiagram-O4NWA36T-DKAsNN9I.js} +1 -1
  47. package/dist/assets/{railroadDiagram-XR7U4H2S-moHTFMC0.js → railroadDiagram-XR7U4H2S-BSA-d8JU.js} +1 -1
  48. package/dist/assets/{requirementDiagram-PLB6GJNP-CwfXdFH8.js → requirementDiagram-PLB6GJNP-CSmlvb-p.js} +1 -1
  49. package/dist/assets/{sankeyDiagram-IPEJSGJF-3ZROYvnq.js → sankeyDiagram-IPEJSGJF-CD5F6fnG.js} +1 -1
  50. package/dist/assets/{sequenceDiagram-PO4LG4MO-E1TBebP8.js → sequenceDiagram-PO4LG4MO-JUq5sx6d.js} +1 -1
  51. package/dist/assets/{sizeCapture-INFHLROL-DHKEU5pu.js → sizeCapture-INFHLROL-BjIS-Stk.js} +1 -1
  52. package/dist/assets/{stateDiagram-v2-GCMORJYK-BguEj09D.js → stateDiagram-v2-GCMORJYK-DklkUxOg.js} +1 -1
  53. package/dist/assets/{swimlanes-2SLR337P-C7IDYnhd.js → swimlanes-2SLR337P-CsjIU6be.js} +1 -1
  54. package/dist/assets/swimlanesDiagram-TC7HE7FX-Bk14M0_B.js +8 -0
  55. package/dist/assets/{timeline-definition-EJHVYXUP-DCW-F5PW.js → timeline-definition-EJHVYXUP-BkFqK7AB.js} +1 -1
  56. package/dist/assets/{usecaseDiagram-POWQR4AR-xBMFtWYV.js → usecaseDiagram-POWQR4AR-70gJB1EU.js} +1 -1
  57. package/dist/assets/{vennDiagram-UO4OBE2U-B5nIkuH8.js → vennDiagram-UO4OBE2U-83Tm62dN.js} +1 -1
  58. package/dist/assets/{wardleyDiagram-VNRHLVJA-DYFAhdbr.js → wardleyDiagram-VNRHLVJA-tTmseoX9.js} +1 -1
  59. package/dist/assets/{xychartDiagram-PMCCYNJV-DeXwX6Cz.js → xychartDiagram-PMCCYNJV-R1LBA55a.js} +1 -1
  60. package/dist/index.html +2 -2
  61. package/dist-server/companion/src/routes.js +8 -1
  62. package/dist-server/connector-proxy.js +105 -1
  63. package/dist-server/container-mcp.js +11 -1
  64. package/dist-server/drivers/agents-proxy.js +277 -22
  65. package/dist-server/index.js +23722 -20272
  66. package/dist-server/local-computer-proxy.js +2 -0
  67. package/dist-server/mcp-gate.js +2 -0
  68. package/dist-server/mcp-server.js +5 -3
  69. package/dist-server/message-search.worker.js +52 -0
  70. package/dist-server/openmausbot.js +755 -404
  71. package/dist-server/pair-cli.js +755 -404
  72. package/dist-server/server/admission.js +81 -0
  73. package/dist-server/server/aside-queue.js +294 -0
  74. package/dist-server/server/attachments.js +43 -1
  75. package/dist-server/server/automatic-recovery.js +15 -0
  76. package/dist-server/server/bot-attachment.js +107 -0
  77. package/dist-server/server/bot-overview.js +19 -0
  78. package/dist-server/server/composio.js +297 -1
  79. package/dist-server/server/config.js +34 -3
  80. package/dist-server/server/connector-advertisement.js +165 -0
  81. package/dist-server/server/connector-proxy.js +14 -2
  82. package/dist-server/server/connector-verdict.js +31 -4
  83. package/dist-server/server/container-computer.js +70 -0
  84. package/dist-server/server/contracts.js +32 -0
  85. package/dist-server/server/drivers/acp/core.js +148 -23
  86. package/dist-server/server/drivers/acp/cursor.js +3 -7
  87. package/dist-server/server/drivers/acp/droid.js +4 -7
  88. package/dist-server/server/drivers/acp/gemini.js +4 -4
  89. package/dist-server/server/drivers/acp/grok.js +4 -9
  90. package/dist-server/server/drivers/acp/hermes.js +3 -5
  91. package/dist-server/server/drivers/acp/opencode-go.js +2 -5
  92. package/dist-server/server/drivers/acp/qwen.js +12 -15
  93. package/dist-server/server/drivers/agents-call.js +137 -10
  94. package/dist-server/server/drivers/agents-catalog.js +100 -6
  95. package/dist-server/server/drivers/boxagent.js +3 -17
  96. package/dist-server/server/drivers/claude.js +31 -17
  97. package/dist-server/server/drivers/codex-catalog.js +14 -6
  98. package/dist-server/server/drivers/codex-identity.js +2 -1
  99. package/dist-server/server/drivers/codex-release.js +48 -0
  100. package/dist-server/server/drivers/codex.js +7 -25
  101. package/dist-server/server/drivers/openai-chat.js +31 -3
  102. package/dist-server/server/drivers/pi.js +237 -30
  103. package/dist-server/server/drivers/prompt-split.js +32 -9
  104. package/dist-server/server/drivers/session-idle.js +29 -0
  105. package/dist-server/server/env-path.js +15 -0
  106. package/dist-server/server/guarded-requests.js +2 -2
  107. package/dist-server/server/harness-capabilities.js +61 -0
  108. package/dist-server/server/index.js +1173 -262
  109. package/dist-server/server/message-db.js +22 -42
  110. package/dist-server/server/message-file.js +9 -1
  111. package/dist-server/server/message-search-query.js +43 -0
  112. package/dist-server/server/message-search-worker.js +80 -0
  113. package/dist-server/server/message-search.worker.js +21 -0
  114. package/dist-server/server/model-requests.js +248 -0
  115. package/dist-server/server/options-card.js +21 -0
  116. package/dist-server/server/org-library.js +15 -1
  117. package/dist-server/server/peer-delivery.js +60 -0
  118. package/dist-server/server/peer-roster.js +57 -0
  119. package/dist-server/server/presets.js +32 -32
  120. package/dist-server/server/profile-requests.js +66 -39
  121. package/dist-server/server/profile-revision.js +9 -1
  122. package/dist-server/server/profile-versions.js +6 -3
  123. package/dist-server/server/routine-requests.js +29 -7
  124. package/dist-server/server/skill-fetch.js +72 -14
  125. package/dist-server/server/skills.js +1 -0
  126. package/dist-server/server/store.js +32 -2
  127. package/dist-server/server/system-prompt.js +37 -2
  128. package/dist-server/server/team-setup-requests.js +124 -23
  129. package/dist-server/server/thread-events.js +3 -1
  130. package/dist-server/server/tightening-requests.js +405 -0
  131. package/dist-server/server/tts/chatterbox.js +27 -5
  132. package/dist-server/server/usage-ledger.js +7 -1
  133. package/dist-server/server/webhooks.js +21 -3
  134. package/dist-server/server/workspace-backup.js +40 -3
  135. package/dist-server/server/workspace-backup.worker.js +10 -0
  136. package/dist-server/shared/ask-question.js +19 -0
  137. package/dist-server/shared/credential-request.js +5 -1
  138. package/dist-server/shared/line-diff.js +23 -0
  139. package/dist-server/shared/model-request.js +1 -0
  140. package/dist-server/shared/options-card.js +51 -0
  141. package/dist-server/shared/profile-request.js +5 -4
  142. package/dist-server/shared/tightening-request.js +87 -0
  143. package/dist-server/src/lib/composer-attachments.js +42 -3
  144. package/dist-server/vps-container-mcp.js +11 -1
  145. package/dist-server/workspace-backup.worker.js +19482 -0
  146. package/package.json +1 -1
  147. package/dist/assets/channel-taCNRlUU.js +0 -1
  148. package/dist/assets/index-BwdMAQ6p.css +0 -1
  149. package/dist/assets/index-ByJennr7.js +0 -581
  150. package/dist/assets/swimlanesDiagram-TC7HE7FX-BpEdoB2e.js +0 -8
@@ -1,11 +1,113 @@
1
1
  // server/connector-proxy.ts
2
2
  import readline from "node:readline";
3
3
  import { randomUUID } from "node:crypto";
4
+
5
+ // shared/wire.ts
6
+ var CONNECTOR_SLUG_PATTERN = /^[a-z0-9][a-z0-9_-]{0,80}$/;
7
+ var CONNECTOR_TOOL_NAME_PATTERN = /^[A-Z][A-Z0-9_]{0,127}$/;
8
+
9
+ // server/connector-verdict.ts
10
+ function serviceSlugFor(tool) {
11
+ const underscore = tool.indexOf("_");
12
+ if (underscore <= 0) return null;
13
+ return tool.slice(0, underscore).toLowerCase();
14
+ }
15
+ function serviceSlugForCandidates(tool, candidates) {
16
+ let match = null;
17
+ for (const candidate of candidates) {
18
+ if (tool.startsWith(candidate.toUpperCase() + "_") && (match === null || candidate.length > match.length)) {
19
+ match = candidate;
20
+ }
21
+ }
22
+ return match;
23
+ }
24
+
25
+ // server/connector-advertisement.ts
26
+ var CONNECTOR_ALLOWED_TOOLS_ENV = "OMB_CONNECTOR_ALLOWED_TOOLS";
27
+ var CONNECTOR_SERVICE_SLUGS_ENV = "OMB_CONNECTOR_SERVICE_SLUGS";
28
+ var CONNECTOR_ALLOWED_TOOLS_MAX_BYTES = 32 * 1024;
29
+ var CONNECTOR_SERVICE_SLUGS_MAX_BYTES = 32 * 1024;
30
+ var CONNECTOR_META_TOOLS = [
31
+ "COMPOSIO_SEARCH_TOOLS",
32
+ "COMPOSIO_GET_TOOL_SCHEMAS",
33
+ "COMPOSIO_MULTI_EXECUTE_TOOL",
34
+ // Session-level connection meta-tools. COMPOSIO_MANAGE_CONNECTIONS ships
35
+ // in every Composio session; COMPOSIO_WAIT_FOR_CONNECTIONS is opt-in and
36
+ // off by default. They prefix as service "composio", which no grant
37
+ // names, so they ride this list instead of CONNECTION_TOOL_SUFFIXES —
38
+ // connector-proxy intercepts their calls to surface connection cards.
39
+ // The filter only keeps names upstream actually lists, so advertising an
40
+ // opted-out tool changes nothing.
41
+ "COMPOSIO_MANAGE_CONNECTIONS",
42
+ "COMPOSIO_WAIT_FOR_CONNECTIONS"
43
+ ];
44
+ var CONNECTION_TOOL_SUFFIXES = ["_MANAGE_CONNECTIONS", "_WAIT_FOR_CONNECTIONS"];
45
+ function parseConnectorAllowedToolsEnv(raw) {
46
+ if (!raw) return null;
47
+ let value;
48
+ try {
49
+ value = JSON.parse(raw);
50
+ } catch {
51
+ return null;
52
+ }
53
+ if (!value || typeof value !== "object" || Array.isArray(value)) return null;
54
+ const grants = {};
55
+ for (const [slug, grant] of Object.entries(value)) {
56
+ if (!CONNECTOR_SLUG_PATTERN.test(slug)) return null;
57
+ if (!grant || typeof grant !== "object" || Array.isArray(grant)) return null;
58
+ const tools = grant.tools;
59
+ if (tools === "*") {
60
+ grants[slug] = { tools: "*" };
61
+ continue;
62
+ }
63
+ if (!Array.isArray(tools) || tools.length === 0) return null;
64
+ if (!tools.every((tool) => typeof tool === "string" && CONNECTOR_TOOL_NAME_PATTERN.test(tool))) {
65
+ return null;
66
+ }
67
+ grants[slug] = { tools };
68
+ }
69
+ return grants;
70
+ }
71
+ function parseConnectorServiceSlugsEnv(raw) {
72
+ if (!raw) return [];
73
+ let value;
74
+ try {
75
+ value = JSON.parse(raw);
76
+ } catch {
77
+ return [];
78
+ }
79
+ if (!Array.isArray(value)) return [];
80
+ return value.every((slug) => typeof slug === "string" && CONNECTOR_SLUG_PATTERN.test(slug)) ? value : [];
81
+ }
82
+ function connectorToolAdvertised(name, grants, candidates = []) {
83
+ if (Object.keys(grants).length > 0 && CONNECTOR_META_TOOLS.includes(name)) return true;
84
+ const service = serviceSlugForCandidates(name, candidates) ?? serviceSlugFor(name);
85
+ const grant = service === null ? void 0 : grants[service];
86
+ if (!grant) return false;
87
+ if (grant.tools === "*") return true;
88
+ if (grant.tools.includes(name)) return true;
89
+ return CONNECTION_TOOL_SUFFIXES.some((suffix) => name.endsWith(suffix));
90
+ }
91
+ function filterToolsListFrame(frame, grants, candidates = []) {
92
+ const result = frame.result;
93
+ if (!result || typeof result !== "object" || Array.isArray(result)) return frame;
94
+ const tools = result.tools;
95
+ if (!Array.isArray(tools)) return frame;
96
+ const kept = tools.filter((tool) => {
97
+ const name = tool && typeof tool === "object" && !Array.isArray(tool) ? tool.name : void 0;
98
+ return typeof name === "string" ? connectorToolAdvertised(name, grants, candidates) : true;
99
+ });
100
+ return { ...frame, result: { ...result, tools: kept } };
101
+ }
102
+
103
+ // server/connector-proxy.ts
4
104
  var UPSTREAM = process.env.OMB_CONNECTOR_UPSTREAM_URL ?? "";
5
105
  var HARNESS = process.env.OMB_HARNESS_URL ?? "http://127.0.0.1:8799";
6
106
  var BOT_ID = process.env.OMB_BOT_ID ?? "";
7
107
  var THREAD_ID = process.env.OMB_THREAD_ID ?? "";
8
108
  var TOKEN = process.env.OMB_CONNECTOR_TOKEN ?? process.env.OMB_COMMS_TOKEN ?? "";
109
+ var ALLOWED_TOOLS = parseConnectorAllowedToolsEnv(process.env[CONNECTOR_ALLOWED_TOOLS_ENV]);
110
+ var SERVICE_SLUGS = parseConnectorServiceSlugsEnv(process.env[CONNECTOR_SERVICE_SLUGS_ENV]);
9
111
  var MAX_RESPONSE_BYTES = 20 * 1024 * 1024;
10
112
  var INITIALIZE_RELAY_TIMEOUT_MS = 1e3;
11
113
  var RELAY_TIMEOUT_MS = 10 * 6e4;
@@ -176,7 +278,9 @@ async function handle(message) {
176
278
  }
177
279
  try {
178
280
  const response = await relay(message);
179
- if (response && id !== void 0) send(response);
281
+ if (response && id !== void 0) {
282
+ send(method === "tools/list" && ALLOWED_TOOLS ? filterToolsListFrame(response, ALLOWED_TOOLS, SERVICE_SLUGS) : response);
283
+ }
180
284
  } catch (error) {
181
285
  if (id === void 0) return;
182
286
  const messageText = error instanceof Error ? error.message : String(error);
@@ -44,6 +44,8 @@ function knownDirs() {
44
44
  join(home, ".volta", "bin"),
45
45
  join(home, ".bun", "bin"),
46
46
  join(home, ".asdf", "shims"),
47
+ join(home, ".local", "share", "mise", "shims"),
48
+ // mise installer
47
49
  join(home, ".deno", "bin"),
48
50
  join(home, "bin"),
49
51
  ...nvmBinDirs()
@@ -15642,7 +15644,7 @@ var MAX_CONCURRENT_BOT_THREADS = 10;
15642
15644
  var MIN_THREAD_EVENT_LOG_BYTES = 256 * 1024;
15643
15645
  var MAX_THREAD_EVENT_LOG_BYTES = 4 * 1024 * 1024 * 1024;
15644
15646
  var MIN_LOCAL_VM_MAX_INSTANCES = 1;
15645
- var MAX_LOCAL_VM_MAX_INSTANCES = 4;
15647
+ var MAX_LOCAL_VM_MAX_INSTANCES = 8;
15646
15648
  function isValidSshAlias(value) {
15647
15649
  return typeof value === "string" && SSH_ALIAS.test(value);
15648
15650
  }
@@ -15843,6 +15845,13 @@ var defaultModelSelectionSchema = external_exports.object({
15843
15845
  (selection) => selection.variant === void 0 || selection.effort === void 0,
15844
15846
  "choose either a model variant or an effort level"
15845
15847
  );
15848
+ var automaticRecoverySchema = external_exports.object({
15849
+ enabled: external_exports.boolean(),
15850
+ backup: defaultModelSelectionSchema.optional()
15851
+ }).strict().refine(
15852
+ (recovery) => !recovery.enabled || recovery.backup !== void 0,
15853
+ { message: "Choose a backup model before enabling automatic recovery", path: ["backup"] }
15854
+ );
15846
15855
  var threadsConfigSchema = external_exports.object({
15847
15856
  maxConcurrentPerBot: external_exports.number().int().min(1).max(MAX_CONCURRENT_BOT_THREADS),
15848
15857
  /** Cap each per-thread events/ and native/ NDJSON log at this many
@@ -15871,6 +15880,7 @@ var appConfigSchema = external_exports.object({
15871
15880
  * addresses or `@domain` entries; admins get every scope, members chat only. */
15872
15881
  signIn: external_exports.object({ admins: external_exports.array(external_exports.string().max(320)).max(500).optional(), members: external_exports.array(external_exports.string().max(320)).max(5e3).optional() }).optional(),
15873
15882
  defaultModelSelection: defaultModelSelectionSchema.optional(),
15883
+ automaticRecovery: automaticRecoverySchema.optional(),
15874
15884
  newBotDefaults: newBotDefaultsSchema.optional(),
15875
15885
  newBots: newBotsConfigSchema.optional(),
15876
15886
  /** CLI-only launch preferences. Never enable remote access implicitly. */