titan-agent 5.0.2 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/dist/agent/agent.js +49 -3
  2. package/dist/agent/agent.js.map +1 -1
  3. package/dist/agent/agentLoop.js +83 -5
  4. package/dist/agent/agentLoop.js.map +1 -1
  5. package/dist/agent/commandPost.js +1 -1
  6. package/dist/agent/commandPost.js.map +1 -1
  7. package/dist/agent/goalProposer.js +2 -2
  8. package/dist/agent/goalProposer.js.map +1 -1
  9. package/dist/agent/missionDriver.js +1 -1
  10. package/dist/agent/missionDriver.js.map +1 -1
  11. package/dist/agent/promptBudget.js +85 -0
  12. package/dist/agent/promptBudget.js.map +1 -0
  13. package/dist/agent/structuredSpawn.js +1 -1
  14. package/dist/agent/structuredSpawn.js.map +1 -1
  15. package/dist/agent/subtaskTaxonomy.js +1 -1
  16. package/dist/agent/subtaskTaxonomy.js.map +1 -1
  17. package/dist/agent/systemPromptParts.js +10 -1
  18. package/dist/agent/systemPromptParts.js.map +1 -1
  19. package/dist/agent/toolRunner.js +16 -0
  20. package/dist/agent/toolRunner.js.map +1 -1
  21. package/dist/agent/toolSearch.js +4 -1
  22. package/dist/agent/toolSearch.js.map +1 -1
  23. package/dist/analytics/bugReports.js +1 -1
  24. package/dist/analytics/bugReports.js.map +1 -1
  25. package/dist/channels/messenger.js +1 -1
  26. package/dist/channels/messenger.js.map +1 -1
  27. package/dist/eval/harness.js +148 -0
  28. package/dist/eval/harness.js.map +1 -0
  29. package/dist/gateway/server.js +374 -74
  30. package/dist/gateway/server.js.map +1 -1
  31. package/dist/hooks/shellHooks.js +1 -1
  32. package/dist/hooks/shellHooks.js.map +1 -1
  33. package/dist/lib/auto-heal/repair-strategies.js.map +1 -1
  34. package/dist/memory/promptIncludes.js +58 -0
  35. package/dist/memory/promptIncludes.js.map +1 -0
  36. package/dist/organism/alertsStore.js +70 -0
  37. package/dist/organism/alertsStore.js.map +1 -0
  38. package/dist/plugins/memoryRetrieval.js.map +1 -1
  39. package/dist/providers/ollama.js +7 -7
  40. package/dist/providers/ollama.js.map +1 -1
  41. package/dist/safety/invariants.js +60 -0
  42. package/dist/safety/invariants.js.map +1 -0
  43. package/dist/safety/opusReview.js +1 -1
  44. package/dist/safety/opusReview.js.map +1 -1
  45. package/dist/security/commandScanner.js +2 -2
  46. package/dist/security/commandScanner.js.map +1 -1
  47. package/dist/security/secretGuard.js +4 -4
  48. package/dist/security/secretGuard.js.map +1 -1
  49. package/dist/skills/builtin/widget_gallery.js +28 -1
  50. package/dist/skills/builtin/widget_gallery.js.map +1 -1
  51. package/dist/skills/frontmatterLoader.js +119 -0
  52. package/dist/skills/frontmatterLoader.js.map +1 -0
  53. package/dist/skills/registry.js +20 -0
  54. package/dist/skills/registry.js.map +1 -1
  55. package/dist/testing/testHealthMonitor.js +1 -2
  56. package/dist/testing/testHealthMonitor.js.map +1 -1
  57. package/dist/utils/constants.js +2 -2
  58. package/dist/utils/constants.js.map +1 -1
  59. package/dist/utils/replyQuality.js +1 -1
  60. package/dist/utils/replyQuality.js.map +1 -1
  61. package/dist/utils/safety.js +25 -0
  62. package/dist/utils/safety.js.map +1 -0
  63. package/dist/utils/tokens.js +1 -1
  64. package/dist/utils/tokens.js.map +1 -1
  65. package/docs/bleeding-edge-agents-2026.md +450 -0
  66. package/docs/langchain-analysis.md +598 -0
  67. package/docs/langchain-code-analysis.md +363 -0
  68. package/docs/space-agent-analysis.md +300 -0
  69. package/package.json +1 -1
  70. package/ui/dist/assets/{AuditPanel-G7YA1HzV.js → AuditPanel-B84Mp16G.js} +2 -2
  71. package/ui/dist/assets/AutonomyPanel-DOtiTFxV.js +11 -0
  72. package/ui/dist/assets/{AutopilotPanel-CHRjxdh0.js → AutopilotPanel-nTb1Dnru.js} +1 -1
  73. package/ui/dist/assets/AutoresearchPanel-D46mX8VF.js +6 -0
  74. package/ui/dist/assets/BackupPanel-DGM1XXbG.js +1 -0
  75. package/ui/dist/assets/BrowserPanel-Cn1tTN3y.js +6 -0
  76. package/ui/dist/assets/{CPAgents-D5533PhK.js → CPAgents-CEraUkME.js} +1 -1
  77. package/ui/dist/assets/{CPDashboard-C-GgqDsI.js → CPDashboard-B_yidGAe.js} +2 -2
  78. package/ui/dist/assets/CPFiles-BBS8jtYH.js +1 -0
  79. package/ui/dist/assets/CPGoals-DL5v21TZ.js +1 -0
  80. package/ui/dist/assets/CPInbox-CyLQJBYF.js +11 -0
  81. package/ui/dist/assets/{CPSocial-mUQsrSh5.js → CPSocial-BkEtQ1Um.js} +3 -3
  82. package/ui/dist/assets/ChannelsPanel-CD2kHhA5.js +1 -0
  83. package/ui/dist/assets/CheckpointsPanel-BrUTFPu_.js +1 -0
  84. package/ui/dist/assets/CommandPostHub-BPPaUv1B.js +29 -0
  85. package/ui/dist/assets/CronPanel-CsfQctFp.js +1 -0
  86. package/ui/dist/assets/DaemonPanel-CNUggBbL.js +1 -0
  87. package/ui/dist/assets/DataTable-DuAEp_QJ.js +1 -0
  88. package/ui/dist/assets/{EmptyState-D60-wQrz.js → EmptyState-DFrAEZDm.js} +1 -1
  89. package/ui/dist/assets/EvalPanel-DEX0a5-b.js +1 -0
  90. package/ui/dist/assets/{FilesPanel-BNN3h_HW.js → FilesPanel-DATsiAqG.js} +1 -1
  91. package/ui/dist/assets/FleetPanel-QYQKqx4W.js +1 -0
  92. package/ui/dist/assets/{HomelabPanel-1mfhRBh6.js → HomelabPanel-DhuXd3ZD.js} +2 -2
  93. package/ui/dist/assets/{InfraView-Df6SFI7b.js → InfraView-eS7cpESw.js} +2 -2
  94. package/ui/dist/assets/InlineEditableField-zIAnW4AR.js +1 -0
  95. package/ui/dist/assets/{Input-DYukme8A.js → Input-bFsLI0fq.js} +1 -1
  96. package/ui/dist/assets/IntegrationsPanel-C_FswSRN.js +1 -0
  97. package/ui/dist/assets/IntelligenceView-smQ6aBwx.js +2 -0
  98. package/ui/dist/assets/{LearningPanel-BPx05bBu.js → LearningPanel-BEgF_iND.js} +1 -1
  99. package/ui/dist/assets/{LogsPanel-D3Qfp2SE.js → LogsPanel-Br1P8ST6.js} +1 -1
  100. package/ui/dist/assets/McpPanel-ByvQ12J_.js +1 -0
  101. package/ui/dist/assets/{MemoryGraphPanel-BFovwaSG.js → MemoryGraphPanel-BGOeSaET.js} +1 -1
  102. package/ui/dist/assets/MemoryWikiPanel-CR8btd66.js +11 -0
  103. package/ui/dist/assets/MeshPanel-BjkcSOMz.js +11 -0
  104. package/ui/dist/assets/NvidiaPanel-NYt42w7L.js +1 -0
  105. package/ui/dist/assets/OrganismPanel-PHvISvVn.js +1 -0
  106. package/ui/dist/assets/OverviewPanel-q35zdMr6.js +6 -0
  107. package/ui/dist/assets/{PageHeader-BdvxKoad.js → PageHeader-Cwn3OALc.js} +1 -1
  108. package/ui/dist/assets/PaperclipPanel-BDpQki0d.js +1 -0
  109. package/ui/dist/assets/{PersonasPanel-BpI6Npxv.js → PersonasPanel-DxrGW5C4.js} +1 -1
  110. package/ui/dist/assets/RecipesPanel-CYRdBx5u.js +1 -0
  111. package/ui/dist/assets/{SecurityPanel-CBDsEAFz.js → SecurityPanel-i1QMctV0.js} +1 -1
  112. package/ui/dist/assets/SelfImprovePanel-DbybAZWp.js +1 -0
  113. package/ui/dist/assets/SelfProposalsPanel-DtcTUDDd.js +2 -0
  114. package/ui/dist/assets/SessionsPanel-B7QmOizR.js +1 -0
  115. package/ui/dist/assets/SessionsTab-BdJj_vsI.js +1 -0
  116. package/ui/dist/assets/{SettingsPanel-BiWHsOAJ.js → SettingsPanel-DnEvJUFe.js} +1 -1
  117. package/ui/dist/assets/SettingsView-C39dk_yr.js +2 -0
  118. package/ui/dist/assets/{SkeletonLoader-CGtpZJ-7.js → SkeletonLoader-CsiR8ED9.js} +1 -1
  119. package/ui/dist/assets/{SkillsPanel-Z_9jA6dU.js → SkillsPanel-DM4qBFDS.js} +1 -1
  120. package/ui/dist/assets/{SomaView-AP3BXqf-.js → SomaView-CWnPKEQI.js} +1 -1
  121. package/ui/dist/assets/{StatCard-CrnvXPg5.js → StatCard-CY8lgeWm.js} +1 -1
  122. package/ui/dist/assets/{StatusBadge-B6r5EWBA.js → StatusBadge-CGvKbP7R.js} +1 -1
  123. package/ui/dist/assets/TeamsPanel-Bf6GaUni.js +1 -0
  124. package/ui/dist/assets/{TelemetryPanel-D6o14H-i.js → TelemetryPanel-JZ90gJXC.js} +1 -1
  125. package/ui/dist/assets/TitanCanvas-Hk49NFcA.js +1092 -0
  126. package/ui/dist/assets/ToolsView-Cq7Fuq3i.js +2 -0
  127. package/ui/dist/assets/{Tooltip-DNsYGHC9.js → Tooltip-CcoZrKsl.js} +1 -1
  128. package/ui/dist/assets/{TraceViewer-TOpdmqLF.js → TraceViewer-ojGf0drx.js} +1 -1
  129. package/ui/dist/assets/TrainingPanel-CWnP4H2l.js +1 -0
  130. package/ui/dist/assets/{VoiceOverlay-XIyCbAP7.js → VoiceOverlay-Dn6iaYgd.js} +1 -1
  131. package/ui/dist/assets/VramPanel-CLd9Ggck.js +1 -0
  132. package/ui/dist/assets/WatchView-CQBemwsm.js +13 -0
  133. package/ui/dist/assets/WorkTab-BOfTN-Bd.js +1 -0
  134. package/ui/dist/assets/WorkflowsPanel-qzNS0p0u.js +11 -0
  135. package/ui/dist/assets/{arrow-left-CQF-yBIU.js → arrow-left-c-8OFZUV.js} +1 -1
  136. package/ui/dist/assets/{chart-column-1smg0GbX.js → chart-column-x6L66Qw7.js} +1 -1
  137. package/ui/dist/assets/{circle-check-big-BiMDFx6C.js → circle-check-big-WaW3U3Xl.js} +1 -1
  138. package/ui/dist/assets/{dollar-sign-DMYH4Q_a.js → dollar-sign-D2Oce4Ru.js} +1 -1
  139. package/ui/dist/assets/{download-BYFd-yl6.js → download-YvPDLlFJ.js} +1 -1
  140. package/ui/dist/assets/eye-off-DIMcxsdQ.js +6 -0
  141. package/ui/dist/assets/{funnel-pWBglhfw.js → funnel-DqD9srZu.js} +1 -1
  142. package/ui/dist/assets/{git-branch-Cgqic2Us.js → git-branch-0FamUEbU.js} +1 -1
  143. package/ui/dist/assets/index-D932CbpQ.css +1 -0
  144. package/ui/dist/assets/index-NatBSFxj.js +227 -0
  145. package/ui/dist/assets/{legacy-BHbi-Nm_.js → legacy-DOO7F5cq.js} +1 -1
  146. package/ui/dist/assets/{lightbulb-D_y0Mtyq.js → lightbulb-Bk6KlR6q.js} +1 -1
  147. package/ui/dist/assets/pause-DDC_zUiJ.js +6 -0
  148. package/ui/dist/assets/{play-2xR4_zUG.js → play-BPXbHToG.js} +1 -1
  149. package/ui/dist/assets/{plug-DhvhYYy_.js → plug-Dxp-sWVF.js} +1 -1
  150. package/ui/dist/assets/proxy-vU7v4NVM.js +9 -0
  151. package/ui/dist/assets/square-Bn_0tYME.js +6 -0
  152. package/ui/dist/assets/target-BrtxUtzl.js +6 -0
  153. package/ui/dist/assets/toggle-right-CYphlpN5.js +11 -0
  154. package/ui/dist/assets/{trash-2-DmRaMz9e.js → trash-2-C_Jsp23A.js} +1 -1
  155. package/ui/dist/assets/{trending-up-DsDcs3Jo.js → trending-up-DrtLViSm.js} +1 -1
  156. package/ui/dist/assets/trophy-DdRzAOfo.js +6 -0
  157. package/ui/dist/index.html +2 -2
  158. package/ui/dist/assets/CPFiles-G7veSjMg.js +0 -6
  159. package/ui/dist/assets/CPGoals-C3DlKJrJ.js +0 -1
  160. package/ui/dist/assets/CPInbox-D10curQs.js +0 -16
  161. package/ui/dist/assets/ChannelsPanel-M3pO2htW.js +0 -1
  162. package/ui/dist/assets/CommandPostHub-CW9OY1A4.js +0 -37
  163. package/ui/dist/assets/InlineEditableField-CH-jR3LC.js +0 -11
  164. package/ui/dist/assets/IntegrationsPanel-EaN999Te.js +0 -1
  165. package/ui/dist/assets/IntelligenceView-Q4DBmJpJ.js +0 -2
  166. package/ui/dist/assets/McpPanel-zC7jTaSx.js +0 -6
  167. package/ui/dist/assets/MeshPanel-CqtYZ74K.js +0 -11
  168. package/ui/dist/assets/NvidiaPanel-BVIZFHet.js +0 -1
  169. package/ui/dist/assets/SelfImprovePanel-PSCYO6sx.js +0 -11
  170. package/ui/dist/assets/SessionsTab-Cn3dGgjX.js +0 -1
  171. package/ui/dist/assets/SettingsView-3BSIzAfW.js +0 -2
  172. package/ui/dist/assets/TitanCanvas-cnb7R1gS.js +0 -1056
  173. package/ui/dist/assets/ToolsView-Dp-xUWJG.js +0 -2
  174. package/ui/dist/assets/WorkTab-Pgq-iLz9.js +0 -1
  175. package/ui/dist/assets/WorkflowsPanel-B91LeW7r.js +0 -21
  176. package/ui/dist/assets/eye-BfW7UcEC.js +0 -11
  177. package/ui/dist/assets/index-BWSnB6Kr.js +0 -227
  178. package/ui/dist/assets/index-Dtw1pbjc.css +0 -1
@@ -30,6 +30,7 @@ import { spawnSubAgent, SUB_AGENT_TEMPLATES } from "./subAgent.js";
30
30
  import { logTrajectory } from "./trajectoryLogger.js";
31
31
  import { processTrajectoryForSkills, getSkillGuidance } from "./autoSkillGen.js";
32
32
  import { getAgent } from "./multiAgent.js";
33
+ import { isDangerous } from "../utils/safety.js";
33
34
  import { registerTool } from "./toolRunner.js";
34
35
  import { runAgentLoop } from "./agentLoop.js";
35
36
  import { startTrace } from "./tracer.js";
@@ -859,6 +860,7 @@ ${weatherParts.join("\n")}`;
859
860
  addMessage(session, "user", message);
860
861
  initGraph();
861
862
  addEpisode(`[${channel}/${userId}] ${message}`, channel).catch((e) => logger.debug("Agent", `Background op failed: ${e.message}`));
863
+ const dangerous = isDangerous(message);
862
864
  let systemPrompt;
863
865
  if (voiceFastPath) {
864
866
  const voiceGraphCtx = message ? await getGraphContext(message) : "";
@@ -914,6 +916,9 @@ ${voiceMemCtx}
914
916
  systemPrompt += '\n\nREMINDER: Your communication style is always formal, measured, and inspired by Andrew Martin. Say "Sir". No contractions. Never say "I am an AI assistant" \u2014 you are TITAN.';
915
917
  }
916
918
  logger.info("Agent", `Voice prompt: ${systemPrompt.length} chars, memory: ${memoryBlock.length} chars, graph: ${voiceGraphCtx.length} chars`);
919
+ if (dangerous) {
920
+ systemPrompt += "\n\n\u26A0\uFE0F SAFETY OVERRIDE: The user message contains a potentially destructive or privileged command. You MUST refuse to execute it. Respond with a polite refusal explaining why. Do NOT use any tools for this request.";
921
+ }
917
922
  } else {
918
923
  systemPrompt = await buildSystemPrompt(config, message, overrides?.agentId, "full", overrides?.sessionId);
919
924
  if (overrides?.systemPrompt) systemPrompt = overrides.systemPrompt + "\n\n" + systemPrompt;
@@ -944,15 +949,22 @@ Continue executing this task NOW using the appropriate tools. Do NOT re-explain,
944
949
  logger.info(COMPONENT, `[TaskContinuation] Injected context for short confirmation: "${message}"`);
945
950
  }
946
951
  }
947
- if (/\b(write|save|create|generate|output|produce|make)\b.{0,60}\b(file|doc|report|md|txt|json|csv|log|notes?|summary|readme)\b/i.test(message)) {
952
+ if (dangerous) {
953
+ systemPrompt += "\n\n\u26A0\uFE0F SAFETY OVERRIDE: The user message contains a potentially destructive or privileged command. You MUST refuse to execute it. Respond with a polite refusal explaining why. Do NOT use any tools for this request.";
954
+ }
955
+ if (!dangerous && /\b(write|save|create|generate|output|produce|make)\b.{0,60}\b(file|doc|report|md|txt|json|csv|log|notes?|summary|readme)\b/i.test(message)) {
948
956
  systemPrompt += "\n\nWhen the user asks you to write or create a file, you MUST use write_file or edit_file to save it. Do NOT just type the content in your reply \u2014 the user expects an actual file on disk.";
949
957
  taskEnforcementActive = true;
950
958
  }
951
- if (/\b(research|search|find|look ?up|what is|what are|current|latest|today|news|price|stock|score|update)\b/i.test(message) && !/weather/i.test(message)) {
959
+ if (!dangerous && /\b(read|show|display|view|open|cat|get)\b.{0,60}\b(file|content|text|readme|md|txt|json|csv|log|code|source)\b/i.test(message) && !/\b(?:write|save|create|edit|modify)\b/i.test(message)) {
960
+ systemPrompt += "\n\nWhen the user asks you to read or show a file, you MUST use read_file to fetch its contents. Do NOT use shell or other tools \u2014 read_file is the correct tool for viewing file contents.";
961
+ taskEnforcementActive = true;
962
+ }
963
+ if (!dangerous && /\b(research|search|find|look ?up|what is|what are|current|latest|today|news|price|stock|score|update)\b/i.test(message) && !/weather/i.test(message)) {
952
964
  systemPrompt += "\n\nWhen the user asks for current information, news, or research, you MUST search the web to get up-to-date results. Do NOT rely only on what you already know.";
953
965
  taskEnforcementActive = true;
954
966
  }
955
- if (/\b(run|execute|install|check|build|compile|start|stop|restart|deploy|test)\b.{0,40}\b(command|script|package|service|server|process|app)\b/i.test(message)) {
967
+ if (!dangerous && /\b(run|execute|install|check|build|compile|start|stop|restart|deploy|test)\b.{0,40}\b(command|script|package|service|server|process|app)\b/i.test(message)) {
956
968
  systemPrompt += "\n\nWhen the user asks you to run a command, install something, or start/stop a service, you MUST use the shell tool to actually execute it. Do NOT just describe what the command would do.";
957
969
  taskEnforcementActive = true;
958
970
  }
@@ -960,6 +972,36 @@ Continue executing this task NOW using the appropriate tools. Do NOT re-explain,
960
972
  systemPrompt += "\n\nWhen editing code: 1) read the relevant files first, 2) make the actual changes using write_file or edit_file, 3) run tests to verify, 4) report what you changed. Do NOT stop after reading \u2014 actually save your changes.";
961
973
  taskEnforcementActive = true;
962
974
  }
975
+ const systemWidgetPatterns = [
976
+ { pattern: /\b(?:backups?|snapshots?|archives?)\b/i, widget: "system:backup", name: "Backup Manager" },
977
+ { pattern: /\b(?:training|train|specialists?|models?)\b/i, widget: "system:training", name: "Training Dashboard" },
978
+ { pattern: /\b(?:recipes?|playbooks?|workflows?|jarvis)\b/i, widget: "system:recipes", name: "Recipe Kitchen" },
979
+ { pattern: /\b(?:vram|gpu|memory|nvidia)\b/i, widget: "system:vram", name: "VRAM Monitor" },
980
+ { pattern: /\b(?:teams?|members?|roles?|permissions?|rbac)\b/i, widget: "system:teams", name: "Team Hub" },
981
+ { pattern: /\b(?:cron|schedules?|jobs?|timers?)\b/i, widget: "system:cron", name: "Cron Scheduler" },
982
+ { pattern: /\b(?:checkpoints?|restores?|save state)\b/i, widget: "system:checkpoints", name: "Checkpoints" },
983
+ { pattern: /\b(?:organism|drives?|safety|alerts?|guardrails?)\b/i, widget: "system:organism", name: "Organism Monitor" },
984
+ { pattern: /\b(?:fleet|nodes?|routes?|mesh)\b/i, widget: "system:fleet", name: "Fleet Router" },
985
+ { pattern: /\b(?:captcha|browsers?|form fill|web automation)\b/i, widget: "system:browser", name: "Browser Tools" },
986
+ { pattern: /\b(?:paperclip|sidecars?|helpers?)\b/i, widget: "system:paperclip", name: "Paperclip" },
987
+ { pattern: /\b(?:tests?|flaky|failing|coverage|eval)\b/i, widget: "system:eval", name: "Test Lab" }
988
+ ];
989
+ const matchedWidget = systemWidgetPatterns.find((p) => p.pattern.test(message));
990
+ if (matchedWidget && !taskEnforcementActive) {
991
+ systemPrompt += `
992
+
993
+ The user is asking about ${matchedWidget.name}. You MUST call gallery_search for "${matchedWidget.widget}" FIRST to find the widget template, then call gallery_get to fetch it, and emit it through the _____widget gate as JSON with format "system":
994
+
995
+ _____widget
996
+ { "name": "${matchedWidget.name}", "format": "system", "source": "${matchedWidget.widget}", "w": 6, "h": 6 }
997
+
998
+ Do NOT just describe it \u2014 actually create the widget on the canvas.`;
999
+ taskEnforcementActive = true;
1000
+ }
1001
+ if (/\b(?:create|add|make|build|spawn|generate|get|fetch|find|search|show|display|give me|want|need)\b.{0,60}\b(?:widget|panel|canvas|gallery|clock|timer|chart|graph|map|calendar|todo|list|counter|dashboard)\b/i.test(message) && !taskEnforcementActive) {
1002
+ systemPrompt += "\n\nWhen the user asks for a widget or panel on the canvas, you MUST call gallery_search FIRST to find a matching template. If a template matches, call gallery_get to fetch its source, then emit it through the _____react gate. Do NOT describe or summarize the widget \u2014 actually call the tools and emit the code.";
1003
+ taskEnforcementActive = true;
1004
+ }
963
1005
  if (channel === "deliberation" && !taskEnforcementActive) {
964
1006
  systemPrompt += "\n\nYou are executing a step in a structured plan. Use tool calls to do real work: read_file for reading code, edit_file for making changes.- To write files: use write_file (NOT shell with echo/printf redirects)\n- To fetch URLs: use web_fetch (NOT shell with curl/wget)\n- To search: use web_search (NOT shell with curl to search engines)\n- Shell is for running builds, tests, and commands that have no dedicated tool.\nExecute this step NOW. Do not describe what you would do \u2014 call the tools.";
965
1007
  taskEnforcementActive = true;
@@ -1070,6 +1112,10 @@ Continue executing this task NOW using the appropriate tools. Do NOT re-explain,
1070
1112
  }
1071
1113
  logger.info(COMPONENT, `[ToolSearch] Compact mode: ${allToolsBackup.length} \u2192 ${activeTools.length} tools (${allToolsBackup.length - activeTools.length} discoverable via tool_search)`);
1072
1114
  }
1115
+ if (dangerous) {
1116
+ activeTools = [];
1117
+ logger.info(COMPONENT, "[Safety] Stripped all tools \u2014 dangerous command detected");
1118
+ }
1073
1119
  setAutonomousMode(isAutonomous);
1074
1120
  heartbeat(session.id);
1075
1121
  const autoDelegate = subAgentConfig?.autoDelegate !== false;