titan-agent 6.4.1 → 6.4.4

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 (151) hide show
  1. package/dist/agent/agent.js +61 -46
  2. package/dist/agent/agent.js.map +1 -1
  3. package/dist/agent/pipeline.js +11 -6
  4. package/dist/agent/pipeline.js.map +1 -1
  5. package/dist/skills/builtin/cron.js +7 -6
  6. package/dist/skills/builtin/cron.js.map +1 -1
  7. package/dist/utils/constants.js +1 -1
  8. package/dist/utils/constants.js.map +1 -1
  9. package/package.json +10 -2
  10. package/ui/dist/assets/{AuditPanel-B55jmQpR.js → AuditPanel-BOIeotPE.js} +1 -1
  11. package/ui/dist/assets/{AutonomyPanel-MP5tOLxX.js → AutonomyPanel-Dv8ClpL9.js} +1 -1
  12. package/ui/dist/assets/{AutopilotPanel-DB38vjfF.js → AutopilotPanel-Dv3-_6fZ.js} +1 -1
  13. package/ui/dist/assets/{AutoresearchPanel-CFvfx18N.js → AutoresearchPanel-DdLmfGpC.js} +1 -1
  14. package/ui/dist/assets/{BackupPanel-0a5SbfaS.js → BackupPanel-DYr6APwV.js} +1 -1
  15. package/ui/dist/assets/{BrowserPanel-CvOVGtTp.js → BrowserPanel-DMZf6mNn.js} +1 -1
  16. package/ui/dist/assets/{CPActivity-FlC0Ac-0.js → CPActivity-B2kmaYR9.js} +1 -1
  17. package/ui/dist/assets/{CPAgentDetail-CNiDw2g2.js → CPAgentDetail--ploJZFv.js} +1 -1
  18. package/ui/dist/assets/{CPAgents-2qeSr80C.js → CPAgents-ctC99jCR.js} +1 -1
  19. package/ui/dist/assets/{CPApprovals-D2m2dYBD.js → CPApprovals-BZHaJ6d_.js} +1 -1
  20. package/ui/dist/assets/{CPCosts-CbRtk5BJ.js → CPCosts--xJmtfEi.js} +1 -1
  21. package/ui/dist/assets/{CPDashboard-sGImoKeh.js → CPDashboard-rThYnRLi.js} +1 -1
  22. package/ui/dist/assets/{CPFiles-OVqWt7zC.js → CPFiles-IRzbOaxo.js} +1 -1
  23. package/ui/dist/assets/{CPGoals-wgG_oJF6.js → CPGoals-BQ4Kasli.js} +1 -1
  24. package/ui/dist/assets/{CPInbox-C4toHLIj.js → CPInbox-DYvoAJdg.js} +1 -1
  25. package/ui/dist/assets/{CPIssueDetail-CYVivz76.js → CPIssueDetail-D4JUVm7B.js} +1 -1
  26. package/ui/dist/assets/{CPIssues-CrYg3hHZ.js → CPIssues-C_K0zuiB.js} +1 -1
  27. package/ui/dist/assets/CPLayout-B3Lr8puc.js +2 -0
  28. package/ui/dist/assets/{CPOrg-BvU8zgIR.js → CPOrg-CAKwV8Kr.js} +1 -1
  29. package/ui/dist/assets/{CPRuns-tXHGoKnO.js → CPRuns-COUYpSBB.js} +1 -1
  30. package/ui/dist/assets/{CPSocial-Dxt58jcE.js → CPSocial-BCTgcO3V.js} +1 -1
  31. package/ui/dist/assets/{CPVoice-DBWsPDYo.js → CPVoice-D-wxXUGf.js} +1 -1
  32. package/ui/dist/assets/{ChannelsPanel-Cc1rpsDr.js → ChannelsPanel-Cx3dxaP9.js} +1 -1
  33. package/ui/dist/assets/{CheckpointsPanel-BMxuQIKg.js → CheckpointsPanel-D2ATiPXs.js} +1 -1
  34. package/ui/dist/assets/{CommandPostHub--U1dHmDw.js → CommandPostHub-DTs1EGm8.js} +3 -3
  35. package/ui/dist/assets/{CronPanel-C7uIoKAb.js → CronPanel-D0j9zDVW.js} +1 -1
  36. package/ui/dist/assets/{DataTable-DtjGbNj5.js → DataTable-CgeOprjv.js} +1 -1
  37. package/ui/dist/assets/{DreamPanel-DhjOkThA.js → DreamPanel-CJAI6Aka.js} +2 -2
  38. package/ui/dist/assets/{EmptyState-cLzelkoZ.js → EmptyState-NMpt-ODJ.js} +1 -1
  39. package/ui/dist/assets/{EvalHarnessPanel-Dm6DyPTs.js → EvalHarnessPanel-ZPXlKHaK.js} +1 -1
  40. package/ui/dist/assets/{EvalPanel-BDiX_uNI.js → EvalPanel-DpmEQQXh.js} +1 -1
  41. package/ui/dist/assets/{FileViewer-CHrDPOA5.js → FileViewer-B7Mm4cJL.js} +1 -1
  42. package/ui/dist/assets/{FilesPanel-CNCqxSjS.js → FilesPanel-CvrGQwh3.js} +1 -1
  43. package/ui/dist/assets/{FleetPanel-UOTqdrh3.js → FleetPanel-BDf9E7dQ.js} +1 -1
  44. package/ui/dist/assets/{HomelabPanel-8GyBOfWC.js → HomelabPanel-CKGR1kGN.js} +1 -1
  45. package/ui/dist/assets/InfraView-CreCQSNl.js +2 -0
  46. package/ui/dist/assets/{InlineEditableField-CFx4EOF1.js → InlineEditableField-JxqorUFO.js} +1 -1
  47. package/ui/dist/assets/{Input-CT_e2ZXD.js → Input-rfmX8eLw.js} +1 -1
  48. package/ui/dist/assets/{IntegrationsPanel-_MC_FcOZ.js → IntegrationsPanel-Ds5KCGUi.js} +1 -1
  49. package/ui/dist/assets/IntelligenceView-YcrYQTVO.js +2 -0
  50. package/ui/dist/assets/{LearningPanel-DIsuxMlC.js → LearningPanel-CZUd4UsW.js} +1 -1
  51. package/ui/dist/assets/{LogsPanel-hUcRe-Pt.js → LogsPanel-CmUBA-jG.js} +1 -1
  52. package/ui/dist/assets/{McpPanel-B2L9oapp.js → McpPanel-CVyjQ6H6.js} +1 -1
  53. package/ui/dist/assets/{MemoryGraphPanel-eVPWv4Fz.js → MemoryGraphPanel-BK-AbsbF.js} +1 -1
  54. package/ui/dist/assets/{MemoryWikiPanel-CDuJkatJ.js → MemoryWikiPanel-DkfHLaje.js} +1 -1
  55. package/ui/dist/assets/{MeshPanel-C42VpfJ5.js → MeshPanel-BCDzhBRO.js} +1 -1
  56. package/ui/dist/assets/{MissionCanvas-BMw2FCD5.js → MissionCanvas-GvSYEkjz.js} +1 -1
  57. package/ui/dist/assets/{MissionChat-C9HHYet2.js → MissionChat-DpyGbBhk.js} +1 -1
  58. package/ui/dist/assets/{MissionLibrary-D2yhbAJg.js → MissionLibrary-Dwn2vP2g.js} +1 -1
  59. package/ui/dist/assets/{MissionStart-BKeop9F5.js → MissionStart-DIYEotqX.js} +1 -1
  60. package/ui/dist/assets/{Modal-Bdo-V7t6.js → Modal-BFii_RIq.js} +1 -1
  61. package/ui/dist/assets/{NvidiaPanel-CEss--Dl.js → NvidiaPanel-BCmLv4bY.js} +1 -1
  62. package/ui/dist/assets/{OrganismPanel-CToPtDaz.js → OrganismPanel-CDMC8-yf.js} +1 -1
  63. package/ui/dist/assets/{OverviewPanel-D7IolCYo.js → OverviewPanel-C9ErRTB1.js} +1 -1
  64. package/ui/dist/assets/{PageHeader-CjDtUo8m.js → PageHeader-CawSrb9E.js} +1 -1
  65. package/ui/dist/assets/{PersonaProfilesPanel-Df5og1Sg.js → PersonaProfilesPanel-B_hx3sLQ.js} +1 -1
  66. package/ui/dist/assets/{PersonasPanel-DKr-x2AB.js → PersonasPanel-BhfAKQWd.js} +1 -1
  67. package/ui/dist/assets/{PhoneDeskPanel-CkEnpVrz.js → PhoneDeskPanel-Cew4jv5F.js} +1 -1
  68. package/ui/dist/assets/{RecipesPanel-CiQiYqpA.js → RecipesPanel-KSNQil0R.js} +1 -1
  69. package/ui/dist/assets/{SecurityPanel-nTFIdiqf.js → SecurityPanel-ojbdvuZR.js} +1 -1
  70. package/ui/dist/assets/{SelfImprovePanel-mPChEVjC.js → SelfImprovePanel-D743Dh0z.js} +1 -1
  71. package/ui/dist/assets/{SelfProposalsPanel-CXIGD8P3.js → SelfProposalsPanel-DHPrgGsJ.js} +1 -1
  72. package/ui/dist/assets/{SessionsPanel-C8nt7rxV.js → SessionsPanel-Bd8dAJQa.js} +1 -1
  73. package/ui/dist/assets/{SessionsTab-Bp5WaW_Q.js → SessionsTab-BjyOfaQ9.js} +1 -1
  74. package/ui/dist/assets/{SettingsPanel-Cg5tgqDO.js → SettingsPanel-CWvFc8MJ.js} +1 -1
  75. package/ui/dist/assets/SettingsView-Chh-hdRF.js +2 -0
  76. package/ui/dist/assets/{SkeletonLoader-DwBcLrhl.js → SkeletonLoader-sjDa7Y96.js} +1 -1
  77. package/ui/dist/assets/{SkillsPanel-CHnd8BmR.js → SkillsPanel-B0UwrZGA.js} +1 -1
  78. package/ui/dist/assets/{SomaView-1zShMywA.js → SomaView-CXfqpdNP.js} +1 -1
  79. package/ui/dist/assets/{StatCard-BUO6lNlX.js → StatCard-B4qf3WOB.js} +1 -1
  80. package/ui/dist/assets/{StatusBadge-CmSemYNT.js → StatusBadge-BtDtyL5L.js} +1 -1
  81. package/ui/dist/assets/{Tabs-Zo1JoN_G.js → Tabs-CeY7i2tk.js} +1 -1
  82. package/ui/dist/assets/{TeamsPanel-C96TIEna.js → TeamsPanel-BxFpHD58.js} +1 -1
  83. package/ui/dist/assets/{TelemetryPanel-DlI9vEZU.js → TelemetryPanel-D2L98GwC.js} +1 -1
  84. package/ui/dist/assets/{TitanCanvas-BewmO4FZ.js → TitanCanvas-D7TL368k.js} +4 -4
  85. package/ui/dist/assets/{ToolsView-BY73iyvj.js → ToolsView-BiW0mds2.js} +2 -2
  86. package/ui/dist/assets/{Tooltip-DHrJsv5K.js → Tooltip-C3exOcZa.js} +1 -1
  87. package/ui/dist/assets/{TraceViewer-BVH6WsWN.js → TraceViewer-z42wYVdE.js} +1 -1
  88. package/ui/dist/assets/{TrainingPanel-Beam9vXX.js → TrainingPanel-BPVftaSt.js} +1 -1
  89. package/ui/dist/assets/{VoiceOverlay-B03bLRa6.js → VoiceOverlay-DNzDqitY.js} +1 -1
  90. package/ui/dist/assets/{VramPanel-Cv48drRb.js → VramPanel-CF4l5fe_.js} +1 -1
  91. package/ui/dist/assets/{WatchView-VtZRF3Ah.js → WatchView-CewHUoxK.js} +1 -1
  92. package/ui/dist/assets/{WorkTab-gIgsVURN.js → WorkTab-ByC4niLi.js} +1 -1
  93. package/ui/dist/assets/{WorkflowsPanel-xGphoCgy.js → WorkflowsPanel-Bsyhjv87.js} +1 -1
  94. package/ui/dist/assets/{archive-B27XcT_v.js → archive-Cz-kvWW5.js} +1 -1
  95. package/ui/dist/assets/{arrow-left-DSU0t1ZF.js → arrow-left-CGVxTClf.js} +1 -1
  96. package/ui/dist/assets/{book-open-CCt4Gq9I.js → book-open-CrOs3smB.js} +1 -1
  97. package/ui/dist/assets/{bot-DK7dbBfX.js → bot-C0wiWyCT.js} +1 -1
  98. package/ui/dist/assets/{chart-column-CixcF9Pi.js → chart-column-Dcc3a8m5.js} +1 -1
  99. package/ui/dist/assets/{check-oX--Xdud.js → check-BhmlTEFk.js} +1 -1
  100. package/ui/dist/assets/{chevron-right-D1DyaeTm.js → chevron-right-DJCsUSwz.js} +1 -1
  101. package/ui/dist/assets/{chevron-up-uKeW050h.js → chevron-up-cs3cBR4O.js} +1 -1
  102. package/ui/dist/assets/{circle-check-big-C7KjulF6.js → circle-check-big-De2k5qVr.js} +1 -1
  103. package/ui/dist/assets/{circle-stop-DMMdkBs2.js → circle-stop-u0L9iQ69.js} +1 -1
  104. package/ui/dist/assets/{clipboard-list-C3GIPAT3.js → clipboard-list-DF1F3Vjf.js} +1 -1
  105. package/ui/dist/assets/{clock-BgvC0T_E.js → clock-Bc6IrFv8.js} +1 -1
  106. package/ui/dist/assets/{dollar-sign-DuP1ZChI.js → dollar-sign-BStL62ws.js} +1 -1
  107. package/ui/dist/assets/{download-CnPu926z.js → download-VXqww0Iy.js} +1 -1
  108. package/ui/dist/assets/{external-link-fIw1hJS5.js → external-link-BjN0VrNb.js} +1 -1
  109. package/ui/dist/assets/{file-text-kYsk6v9z.js → file-text-SIULFbzy.js} +1 -1
  110. package/ui/dist/assets/{flask-conical-CAMJ0Plo.js → flask-conical-CsShOfpS.js} +1 -1
  111. package/ui/dist/assets/{folder-Dq6luLP7.js → folder-DwOkgBGj.js} +1 -1
  112. package/ui/dist/assets/{funnel-hj2rC4MH.js → funnel-CDnA2Enn.js} +1 -1
  113. package/ui/dist/assets/{git-branch-DX_X3HtU.js → git-branch-BAFSlxgi.js} +1 -1
  114. package/ui/dist/assets/{index-BISxhHXP.js → index-BlFxPvdg.js} +2 -2
  115. package/ui/dist/assets/{layers-BseADaVO.js → layers-DKKOtsYx.js} +1 -1
  116. package/ui/dist/assets/{legacy-B7aW_gUV.js → legacy-YQ03_WIq.js} +1 -1
  117. package/ui/dist/assets/{lightbulb-DdDY0MbY.js → lightbulb-D4Syh7fA.js} +1 -1
  118. package/ui/dist/assets/{link-BZZB4JyS.js → link-C_6ueq0o.js} +1 -1
  119. package/ui/dist/assets/{list-todo-bSv3SQAa.js → list-todo-3Me4V-34.js} +1 -1
  120. package/ui/dist/assets/{message-square-D9n28WBl.js → message-square-Dv6Q3VRO.js} +1 -1
  121. package/ui/dist/assets/{mic-DsWOcLkn.js → mic-BInf3BDE.js} +1 -1
  122. package/ui/dist/assets/{missions-CmBxbp0k.js → missions-BUTRB5Lq.js} +1 -1
  123. package/ui/dist/assets/{network-CkgG0zu0.js → network-BsSfc5IE.js} +1 -1
  124. package/ui/dist/assets/{pause-CvgG1y4I.js → pause-CXCmPcHk.js} +1 -1
  125. package/ui/dist/assets/{pencil-c0GVcCA9.js → pencil-DAvceqn3.js} +1 -1
  126. package/ui/dist/assets/{play-CuwPKVSv.js → play-MuD1S1C5.js} +1 -1
  127. package/ui/dist/assets/{plug-D-b321IK.js → plug-Chv5y4No.js} +1 -1
  128. package/ui/dist/assets/{plus-IFwPqtUW.js → plus-SBD6A3Qb.js} +1 -1
  129. package/ui/dist/assets/{proxy-Dm6tNAsg.js → proxy-C5UuKDtU.js} +1 -1
  130. package/ui/dist/assets/{radio-BNdFCb41.js → radio-BySzBvYH.js} +1 -1
  131. package/ui/dist/assets/{refresh-cw-CFv1BDy9.js → refresh-cw-BdcqinTm.js} +1 -1
  132. package/ui/dist/assets/{rotate-ccw-iCpZfipQ.js → rotate-ccw-CRA_s5tz.js} +1 -1
  133. package/ui/dist/assets/{save-o5ciSOaB.js → save-BWhXC8Tv.js} +1 -1
  134. package/ui/dist/assets/{search-DmeBed-X.js → search-DF7UnWEk.js} +1 -1
  135. package/ui/dist/assets/{send-BoLKNmgS.js → send-CmvPtbvy.js} +1 -1
  136. package/ui/dist/assets/{server-Ov6rxCAc.js → server-1PubNLgw.js} +1 -1
  137. package/ui/dist/assets/{shield-check-CKPsc0rI.js → shield-check-BjuAv28a.js} +1 -1
  138. package/ui/dist/assets/{terminal-CcPGcWeJ.js → terminal-BvDfNOXl.js} +1 -1
  139. package/ui/dist/assets/{test-tube-564jDt0t.js → test-tube-CrzRsKdm.js} +1 -1
  140. package/ui/dist/assets/{toggle-right-B7gXrucx.js → toggle-right-BRJ_dULZ.js} +1 -1
  141. package/ui/dist/assets/{trash-2-B7yIJ8B5.js → trash-2-Dtxmn6GE.js} +1 -1
  142. package/ui/dist/assets/{trending-up-DdxHXTsD.js → trending-up-C7pfwW1S.js} +1 -1
  143. package/ui/dist/assets/{trophy-mttLLqgk.js → trophy-Dknrgn8P.js} +1 -1
  144. package/ui/dist/assets/{volume-2-DcpX5fnm.js → volume-2-ahkfEwxT.js} +1 -1
  145. package/ui/dist/assets/{wifi-off-B4cf3i9g.js → wifi-off-wACQ7wec.js} +1 -1
  146. package/ui/dist/index.html +1 -1
  147. package/ui/dist/sw.js +1 -1
  148. package/ui/dist/assets/CPLayout-BXcOZUo7.js +0 -2
  149. package/ui/dist/assets/InfraView-Ds53Fjni.js +0 -2
  150. package/ui/dist/assets/IntelligenceView-DHKwRkc_.js +0 -2
  151. package/ui/dist/assets/SettingsView-DosHEIoU.js +0 -2
@@ -1278,66 +1278,81 @@ CRITICAL: Widgets are NOT files. Do NOT use write_file, edit_file, or any file t
1278
1278
  }
1279
1279
  modelUsed = activeModel;
1280
1280
  let activeTools = tools;
1281
- if (earlyPersona) {
1282
- const { applyPersonaToolFilter } = await import("./personaProfiles.js");
1281
+ let allToolsBackup = activeTools;
1282
+ let toolSearchEnabled = true;
1283
+ const explicitAllowList = overrides?.allowedTools;
1284
+ if (explicitAllowList && explicitAllowList.length > 0) {
1285
+ const allow = new Set(explicitAllowList);
1283
1286
  const before = activeTools.length;
1284
- activeTools = applyPersonaToolFilter(activeTools, earlyPersona);
1285
- if (activeTools.length !== before) {
1286
- logger.info(COMPONENT, `[Persona:${earlyPersona.id}] tools ${before} \u2192 ${activeTools.length}`);
1287
+ activeTools = tools.filter((t) => allow.has(t.function.name));
1288
+ allToolsBackup = activeTools;
1289
+ logger.info(COMPONENT, `[AllowedTools] override bound ${activeTools.length}/${explicitAllowList.length} requested tools (filter chain bypassed): [${activeTools.map((t) => t.function.name).join(", ")}] from pool of ${before}`);
1290
+ const missing = explicitAllowList.filter((name) => !activeTools.some((t) => t.function.name === name));
1291
+ if (missing.length > 0) {
1292
+ logger.warn(COMPONENT, `[AllowedTools] caller asked for tools that aren't registered: [${missing.join(", ")}]`);
1287
1293
  }
1288
- }
1289
- const SMALL_MODEL_PATTERNS = ["llama3.2", "llama3.1:8b", "phi", "gemma:2b", "qwen3.5:4b", "tinyllama", "dolphin3"];
1290
- const isSmallModel = SMALL_MODEL_PATTERNS.some((p) => activeModel.toLowerCase().includes(p));
1291
- if (isSmallModel) {
1292
- const CORE_TOOL_NAMES = ["shell", "read_file", "write_file", "edit_file", "list_dir", "memory"];
1293
- const coreTools = activeTools.filter((t) => CORE_TOOL_NAMES.includes(t.function.name));
1294
- logger.info(COMPONENT, `[SmallModel] Reducing tools from ${activeTools.length} to ${coreTools.length} for ${activeModel}`);
1295
- activeTools = coreTools;
1296
- }
1297
- if (!voiceFastPath && !isSmallModel && isBrainAvailable()) {
1298
- const brainFiltered = await brainSelectTools(message, activeTools);
1299
- if (brainFiltered.length > 0 && brainFiltered.length < activeTools.length) {
1300
- logger.info(COMPONENT, `[Brain] Filtered: ${activeTools.length} \u2192 ${brainFiltered.length} tools`);
1301
- activeTools = brainFiltered;
1294
+ } else {
1295
+ if (earlyPersona) {
1296
+ const { applyPersonaToolFilter } = await import("./personaProfiles.js");
1297
+ const before = activeTools.length;
1298
+ activeTools = applyPersonaToolFilter(activeTools, earlyPersona);
1299
+ if (activeTools.length !== before) {
1300
+ logger.info(COMPONENT, `[Persona:${earlyPersona.id}] tools ${before} \u2192 ${activeTools.length}`);
1301
+ }
1302
1302
  }
1303
- }
1304
- const toolSearchConfig = config.toolSearch;
1305
- const toolSearchEnabled = toolSearchConfig?.enabled ?? true;
1306
- const allToolsBackup = activeTools;
1307
- if (pipelineEnsureTools.length > 0 && !(toolSearchEnabled && !isSmallModel && activeTools.length > 12)) {
1308
- const activeNames = new Set(activeTools.map((t) => t.function.name));
1309
- const missing = pipelineEnsureTools.filter((name) => !activeNames.has(name));
1310
- if (missing.length > 0) {
1311
- const rescued = allToolsBackup.filter((t) => missing.includes(t.function.name));
1312
- activeTools.push(...rescued);
1313
- if (rescued.length > 0) {
1314
- logger.info(COMPONENT, `[Pipeline:${pipelineType}] Ensured ${rescued.length} tools (no-compact): [${rescued.map((t) => t.function.name).join(", ")}]`);
1303
+ const SMALL_MODEL_PATTERNS = ["llama3.2", "llama3.1:8b", "phi", "gemma:2b", "qwen3.5:4b", "tinyllama", "dolphin3"];
1304
+ const isSmallModel = SMALL_MODEL_PATTERNS.some((p) => activeModel.toLowerCase().includes(p));
1305
+ if (isSmallModel) {
1306
+ const CORE_TOOL_NAMES = ["shell", "read_file", "write_file", "edit_file", "list_dir", "memory"];
1307
+ const coreTools = activeTools.filter((t) => CORE_TOOL_NAMES.includes(t.function.name));
1308
+ logger.info(COMPONENT, `[SmallModel] Reducing tools from ${activeTools.length} to ${coreTools.length} for ${activeModel}`);
1309
+ activeTools = coreTools;
1310
+ }
1311
+ if (!voiceFastPath && !isSmallModel && isBrainAvailable()) {
1312
+ const brainFiltered = await brainSelectTools(message, activeTools);
1313
+ if (brainFiltered.length > 0 && brainFiltered.length < activeTools.length) {
1314
+ logger.info(COMPONENT, `[Brain] Filtered: ${activeTools.length} \u2192 ${brainFiltered.length} tools`);
1315
+ activeTools = brainFiltered;
1315
1316
  }
1316
1317
  }
1317
- }
1318
- if (toolSearchEnabled && !isSmallModel && activeTools.length > 12) {
1319
- const VOICE_CORE_TOOLS = ["shell", "web_search", "weather", "memory", "ha_control", "ha_devices", "ha_status", "ha_setup", "tool_search"];
1320
- const configCoreTools = toolSearchConfig?.coreTools;
1321
- const effectiveCoreTools = configCoreTools && configCoreTools.length > 0 ? configCoreTools : DEFAULT_CORE_TOOLS;
1322
- const pipelineMerged = pipelineEnsureTools.length > 0 ? [.../* @__PURE__ */ new Set([...effectiveCoreTools, ...pipelineEnsureTools])] : effectiveCoreTools;
1323
- const coreNames = new Set(voiceFastPath ? VOICE_CORE_TOOLS : pipelineMerged);
1324
- activeTools = activeTools.filter((t) => coreNames.has(t.function.name));
1325
- if (pipelineEnsureTools.length > 0) {
1318
+ const toolSearchConfig = config.toolSearch;
1319
+ toolSearchEnabled = toolSearchConfig?.enabled ?? true;
1320
+ allToolsBackup = activeTools;
1321
+ if (pipelineEnsureTools.length > 0 && !(toolSearchEnabled && !isSmallModel && activeTools.length > 12)) {
1326
1322
  const activeNames = new Set(activeTools.map((t) => t.function.name));
1327
1323
  const missing = pipelineEnsureTools.filter((name) => !activeNames.has(name));
1328
1324
  if (missing.length > 0) {
1329
1325
  const rescued = allToolsBackup.filter((t) => missing.includes(t.function.name));
1330
1326
  activeTools.push(...rescued);
1331
1327
  if (rescued.length > 0) {
1332
- logger.info(COMPONENT, `[Pipeline:${pipelineType}] Rescued ${rescued.length} tools: [${rescued.map((t) => t.function.name).join(", ")}]`);
1328
+ logger.info(COMPONENT, `[Pipeline:${pipelineType}] Ensured ${rescued.length} tools (no-compact): [${rescued.map((t) => t.function.name).join(", ")}]`);
1333
1329
  }
1334
1330
  }
1335
1331
  }
1336
- logger.info(COMPONENT, `[ToolSearch] Compact mode: ${allToolsBackup.length} \u2192 ${activeTools.length} tools (${allToolsBackup.length - activeTools.length} discoverable via tool_search)`);
1337
- }
1338
- if (dangerous) {
1339
- activeTools = [];
1340
- logger.info(COMPONENT, "[Safety] Stripped all tools \u2014 dangerous command detected");
1332
+ if (toolSearchEnabled && !isSmallModel && activeTools.length > 12) {
1333
+ const VOICE_CORE_TOOLS = ["shell", "web_search", "weather", "memory", "ha_control", "ha_devices", "ha_status", "ha_setup", "tool_search"];
1334
+ const configCoreTools = toolSearchConfig?.coreTools;
1335
+ const effectiveCoreTools = configCoreTools && configCoreTools.length > 0 ? configCoreTools : DEFAULT_CORE_TOOLS;
1336
+ const pipelineMerged = pipelineEnsureTools.length > 0 ? [.../* @__PURE__ */ new Set([...effectiveCoreTools, ...pipelineEnsureTools])] : effectiveCoreTools;
1337
+ const coreNames = new Set(voiceFastPath ? VOICE_CORE_TOOLS : pipelineMerged);
1338
+ activeTools = activeTools.filter((t) => coreNames.has(t.function.name));
1339
+ if (pipelineEnsureTools.length > 0) {
1340
+ const activeNames = new Set(activeTools.map((t) => t.function.name));
1341
+ const missing = pipelineEnsureTools.filter((name) => !activeNames.has(name));
1342
+ if (missing.length > 0) {
1343
+ const rescued = allToolsBackup.filter((t) => missing.includes(t.function.name));
1344
+ activeTools.push(...rescued);
1345
+ if (rescued.length > 0) {
1346
+ logger.info(COMPONENT, `[Pipeline:${pipelineType}] Rescued ${rescued.length} tools: [${rescued.map((t) => t.function.name).join(", ")}]`);
1347
+ }
1348
+ }
1349
+ }
1350
+ logger.info(COMPONENT, `[ToolSearch] Compact mode: ${allToolsBackup.length} \u2192 ${activeTools.length} tools (${allToolsBackup.length - activeTools.length} discoverable via tool_search)`);
1351
+ }
1352
+ if (dangerous) {
1353
+ activeTools = [];
1354
+ logger.info(COMPONENT, "[Safety] Stripped all tools \u2014 dangerous command detected");
1355
+ }
1341
1356
  }
1342
1357
  setAutonomousMode(isAutonomous);
1343
1358
  heartbeat(session.id);