diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/dist/cyberstrikeai-burp-extension.jar b/plugins/burp-suite/cyberstrikeai-burp-extension/dist/cyberstrikeai-burp-extension.jar index ae3e6ead..0f3e9d52 100644 Binary files a/plugins/burp-suite/cyberstrikeai-burp-extension/dist/cyberstrikeai-burp-extension.jar and b/plugins/burp-suite/cyberstrikeai-burp-extension/dist/cyberstrikeai-burp-extension.jar differ diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/BurpExtender.java b/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/BurpExtender.java index 7ef116e6..40c011ca 100644 --- a/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/BurpExtender.java +++ b/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/BurpExtender.java @@ -81,13 +81,21 @@ public class BurpExtender implements IBurpExtender, IContextMenuFactory { tab.setRunStatus(runId, "error"); break; case "thinking_stream_start": + if (tab.isShowDebugEvents()) { + tab.resetThinkingStream(runId); + } + break; case "thinking_stream_delta": case "tool_call": case "tool_result": case "tool_result_delta": // debug; hide by default if (tab.isShowDebugEvents() && message != null && !message.isEmpty()) { - tab.appendProgressToRun(runId, "\n[" + type + "] " + message + "\n"); + if ("thinking_stream_delta".equals(type)) { + tab.appendThinkingDelta(runId, message); + } else { + tab.appendProgressToRun(runId, "\n[" + type + "] " + message + "\n"); + } } break; case "conversation": diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/CyberStrikeAITab.java b/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/CyberStrikeAITab.java index 1654e457..29a24f03 100644 --- a/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/CyberStrikeAITab.java +++ b/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/CyberStrikeAITab.java @@ -57,6 +57,7 @@ final class CyberStrikeAITab implements ITab { final StringBuilder buffer = new StringBuilder(); final StringBuilder progressBuffer = new StringBuilder(); final StringBuilder finalBuffer = new StringBuilder(); + final StringBuilder thinkingPending = new StringBuilder(); String status; String conversationId; String requestRaw; @@ -568,6 +569,43 @@ final class CyberStrikeAITab implements ITab { } } + void resetThinkingStream(String runId) { + if (runId == null) return; + TestRun run = runs.get(runId); + if (run == null) return; + synchronized (run) { + run.thinkingPending.setLength(0); + } + appendProgressToRun(runId, "\n[thinking]\n"); + } + + void appendThinkingDelta(String runId, String delta) { + if (runId == null || delta == null) return; + TestRun run = runs.get(runId); + if (run == null) return; + + StringBuilder toAppend = new StringBuilder(); + synchronized (run) { + for (int i = 0; i < delta.length(); i++) { + char c = delta.charAt(i); + if (c == '\n') { + if (run.thinkingPending.length() > 0) { + toAppend.append(" ").append(run.thinkingPending).append("\n"); + run.thinkingPending.setLength(0); + } else { + toAppend.append("\n"); + } + } else if (c != '\r') { + run.thinkingPending.append(c); + } + } + } + + if (toAppend.length() > 0) { + appendProgressToRun(runId, toAppend.toString()); + } + } + void appendFinalToRun(String runId, String s) { if (runId == null || s == null) return; TestRun run = runs.get(runId); diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/MarkdownRenderer.java b/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/MarkdownRenderer.java index b1666f0c..1fdd7043 100644 --- a/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/MarkdownRenderer.java +++ b/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/MarkdownRenderer.java @@ -20,10 +20,18 @@ final class MarkdownRenderer { StringBuilder out = new StringBuilder(4096); out.append("") .append(""); diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/BurpExtender$1.class b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/BurpExtender$1.class index 07d7e8b6..d3f3b4a2 100644 Binary files a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/BurpExtender$1.class and b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/BurpExtender$1.class differ diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/BurpExtender.class b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/BurpExtender.class index 57d17f83..396d2c69 100644 Binary files a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/BurpExtender.class and b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/BurpExtender.class differ diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab$1.class b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab$1.class index 50419043..9fd5ec35 100644 Binary files a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab$1.class and b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab$1.class differ diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab$DotIcon.class b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab$DotIcon.class index e206138c..a42c4763 100644 Binary files a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab$DotIcon.class and b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab$DotIcon.class differ diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab$TestRun.class b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab$TestRun.class index 8f50315c..5d902bcd 100644 Binary files a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab$TestRun.class and b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab$TestRun.class differ diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab$TestRunCellRenderer.class b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab$TestRunCellRenderer.class index 1e732b99..2f69f3ca 100644 Binary files a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab$TestRunCellRenderer.class and b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab$TestRunCellRenderer.class differ diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab.class b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab.class index b58b59d1..a01eb1ba 100644 Binary files a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab.class and b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab.class differ diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/MarkdownRenderer.class b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/MarkdownRenderer.class index 329c36a3..2a5267b7 100644 Binary files a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/MarkdownRenderer.class and b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/MarkdownRenderer.class differ diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/cyberstrikeai-burp-extension-1.0.0.jar b/plugins/burp-suite/cyberstrikeai-burp-extension/target/cyberstrikeai-burp-extension-1.0.0.jar index ae3e6ead..0f3e9d52 100644 Binary files a/plugins/burp-suite/cyberstrikeai-burp-extension/target/cyberstrikeai-burp-extension-1.0.0.jar and b/plugins/burp-suite/cyberstrikeai-burp-extension/target/cyberstrikeai-burp-extension-1.0.0.jar differ