lines = splitLines(markdown);
+ StringBuilder out = new StringBuilder(4096);
+ out.append("")
+ .append("");
+
+ boolean inCode = false;
+ boolean inList = false;
+ StringBuilder codeBuf = new StringBuilder();
+
+ for (String raw : lines) {
+ String line = raw == null ? "" : raw;
+
+ if (line.trim().startsWith("```")) {
+ if (!inCode) {
+ inCode = true;
+ codeBuf.setLength(0);
+ } else {
+ // close code
+ out.append("")
+ .append(escapeHtml(codeBuf.toString()))
+ .append("
");
+ inCode = false;
+ }
+ continue;
+ }
+
+ if (inCode) {
+ codeBuf.append(line).append("\n");
+ continue;
+ }
+
+ String trimmed = line.trim();
+ if (trimmed.isEmpty()) {
+ if (inList) {
+ out.append("");
+ inList = false;
+ }
+ out.append("");
+ continue;
+ }
+
+ // headings
+ int h = headingLevel(trimmed);
+ if (h > 0) {
+ if (inList) {
+ out.append("");
+ inList = false;
+ }
+ String text = trimmed.substring(h).trim();
+ out.append("")
+ .append(inlineFormat(text))
+ .append("");
+ continue;
+ }
+
+ // list items
+ if (trimmed.startsWith("- ") || trimmed.startsWith("* ")) {
+ if (!inList) {
+ out.append("");
+ inList = true;
+ }
+ String item = trimmed.substring(2).trim();
+ out.append("- ").append(inlineFormat(item)).append("
");
+ continue;
+ }
+
+ // normal paragraph
+ if (inList) {
+ out.append("
");
+ inList = false;
+ }
+ out.append("").append(inlineFormat(trimmed)).append("
");
+ }
+
+ if (inCode) {
+ out.append("")
+ .append(escapeHtml(codeBuf.toString()))
+ .append("
");
+ }
+ if (inList) {
+ out.append("");
+ }
+
+ out.append("");
+ return out.toString();
+ }
+
+ private static int headingLevel(String s) {
+ int i = 0;
+ while (i < s.length() && s.charAt(i) == '#') i++;
+ if (i >= 1 && i <= 6 && i < s.length() && Character.isWhitespace(s.charAt(i))) return i;
+ return 0;
+ }
+
+ private static String inlineFormat(String text) {
+ // escape first, then apply simple replacements using placeholders
+ String escaped = escapeHtml(text);
+
+ // inline code: `code`
+ escaped = replaceInlineCode(escaped);
+
+ // bold: **text**
+ escaped = replaceBold(escaped);
+
+ return escaped;
+ }
+
+ private static String replaceInlineCode(String s) {
+ StringBuilder out = new StringBuilder(s.length() + 16);
+ boolean in = false;
+ StringBuilder buf = new StringBuilder();
+ for (int i = 0; i < s.length(); i++) {
+ char c = s.charAt(i);
+ if (c == '`') {
+ if (!in) {
+ in = true;
+ buf.setLength(0);
+ } else {
+ out.append("").append(buf).append("");
+ in = false;
+ }
+ continue;
+ }
+ if (in) buf.append(c);
+ else out.append(c);
+ }
+ if (in) {
+ // unmatched backtick: keep as literal
+ out.append("`").append(buf);
+ }
+ return out.toString();
+ }
+
+ private static String replaceBold(String s) {
+ // simple non-nested **...**
+ StringBuilder out = new StringBuilder(s.length() + 16);
+ int i = 0;
+ while (i < s.length()) {
+ int start = s.indexOf("**", i);
+ if (start < 0) {
+ out.append(s.substring(i));
+ break;
+ }
+ int end = s.indexOf("**", start + 2);
+ if (end < 0) {
+ out.append(s.substring(i));
+ break;
+ }
+ out.append(s.substring(i, start));
+ out.append("").append(s, start + 2, end).append("");
+ i = end + 2;
+ }
+ return out.toString();
+ }
+
+ private static String escapeHtml(String s) {
+ if (s == null) return "";
+ return s.replace("&", "&")
+ .replace("<", "<")
+ .replace(">", ">")
+ .replace("\"", """);
+ }
+
+ private static List splitLines(String s) {
+ String[] parts = s.split("\\r?\\n", -1);
+ List lines = new ArrayList<>(parts.length);
+ for (String p : parts) lines.add(p);
+ return lines;
+ }
+}
+
diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/SimpleJson.java b/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/SimpleJson.java
new file mode 100644
index 00000000..e798fb52
--- /dev/null
+++ b/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/SimpleJson.java
@@ -0,0 +1,80 @@
+package burp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Minimal JSON extractor for the SSE payloads we emit:
+ * {"type":"...","message":"...","data":...}
+ *
+ * This is NOT a general-purpose JSON parser; it's intentionally small to avoid external deps.
+ */
+final class SimpleJson {
+ private SimpleJson() {}
+
+ static Map extractTopLevelStringFields(String json, String... keys) {
+ Map out = new HashMap<>();
+ if (json == null) return out;
+ for (String key : keys) {
+ out.put(key, extractStringField(json, key));
+ }
+ return out;
+ }
+
+ static String extractStringField(String json, String key) {
+ if (json == null || key == null) return "";
+ String needle = "\"" + key + "\"";
+ int k = json.indexOf(needle);
+ if (k < 0) return "";
+ int colon = json.indexOf(':', k + needle.length());
+ if (colon < 0) return "";
+ int i = colon + 1;
+ while (i < json.length() && Character.isWhitespace(json.charAt(i))) i++;
+ if (i >= json.length() || json.charAt(i) != '"') return "";
+ i++; // after opening quote
+ StringBuilder sb = new StringBuilder();
+ boolean esc = false;
+ while (i < json.length()) {
+ char c = json.charAt(i++);
+ if (esc) {
+ switch (c) {
+ case '"': sb.append('"'); break;
+ case '\\': sb.append('\\'); break;
+ case '/': sb.append('/'); break;
+ case 'b': sb.append('\b'); break;
+ case 'f': sb.append('\f'); break;
+ case 'n': sb.append('\n'); break;
+ case 'r': sb.append('\r'); break;
+ case 't': sb.append('\t'); break;
+ case 'u':
+ if (i + 3 < json.length()) {
+ String hex = json.substring(i, i + 4);
+ try {
+ sb.append((char) Integer.parseInt(hex, 16));
+ i += 4;
+ } catch (NumberFormatException ignored) {
+ // best-effort: keep raw
+ sb.append("\\u").append(hex);
+ i += 4;
+ }
+ }
+ break;
+ default:
+ sb.append(c);
+ }
+ esc = false;
+ continue;
+ }
+ if (c == '\\') {
+ esc = true;
+ continue;
+ }
+ if (c == '"') {
+ break;
+ }
+ sb.append(c);
+ }
+ return sb.toString();
+ }
+}
+
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
new file mode 100644
index 00000000..07d7e8b6
Binary files /dev/null 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
new file mode 100644
index 00000000..57d17f83
Binary files /dev/null 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/CyberStrikeAIClient$AgentMode.class b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAIClient$AgentMode.class
new file mode 100644
index 00000000..26566ef6
Binary files /dev/null and b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAIClient$AgentMode.class differ
diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAIClient$Config.class b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAIClient$Config.class
new file mode 100644
index 00000000..f2a79c3c
Binary files /dev/null and b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAIClient$Config.class differ
diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAIClient$StreamListener.class b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAIClient$StreamListener.class
new file mode 100644
index 00000000..cb6eb8e7
Binary files /dev/null and b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAIClient$StreamListener.class differ
diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAIClient.class b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAIClient.class
new file mode 100644
index 00000000..d85bd5ff
Binary files /dev/null and b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAIClient.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
new file mode 100644
index 00000000..50419043
Binary files /dev/null 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
new file mode 100644
index 00000000..e206138c
Binary files /dev/null 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
new file mode 100644
index 00000000..8f50315c
Binary files /dev/null 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
new file mode 100644
index 00000000..1e732b99
Binary files /dev/null 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
new file mode 100644
index 00000000..b58b59d1
Binary files /dev/null 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/HttpMessageFormatter.class b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/HttpMessageFormatter.class
new file mode 100644
index 00000000..e4a781e5
Binary files /dev/null and b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/HttpMessageFormatter.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
new file mode 100644
index 00000000..329c36a3
Binary files /dev/null and b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/MarkdownRenderer.class differ
diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/SimpleJson.class b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/SimpleJson.class
new file mode 100644
index 00000000..c155627a
Binary files /dev/null and b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/SimpleJson.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
new file mode 100644
index 00000000..ae3e6ead
Binary files /dev/null and b/plugins/burp-suite/cyberstrikeai-burp-extension/target/cyberstrikeai-burp-extension-1.0.0.jar differ
diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/maven-archiver/pom.properties b/plugins/burp-suite/cyberstrikeai-burp-extension/target/maven-archiver/pom.properties
new file mode 100644
index 00000000..e8f61d98
--- /dev/null
+++ b/plugins/burp-suite/cyberstrikeai-burp-extension/target/maven-archiver/pom.properties
@@ -0,0 +1,3 @@
+artifactId=cyberstrikeai-burp-extension
+groupId=ai.cyberstrike
+version=1.0.0
diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/plugins/burp-suite/cyberstrikeai-burp-extension/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
new file mode 100644
index 00000000..fd49ad75
--- /dev/null
+++ b/plugins/burp-suite/cyberstrikeai-burp-extension/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
@@ -0,0 +1,14 @@
+burp/CyberStrikeAIClient$StreamListener.class
+burp/CyberStrikeAIClient$Config.class
+burp/CyberStrikeAIClient$AgentMode.class
+burp/MarkdownRenderer.class
+burp/SimpleJson.class
+burp/CyberStrikeAIClient.class
+burp/CyberStrikeAITab$DotIcon.class
+burp/CyberStrikeAITab.class
+burp/CyberStrikeAITab$1.class
+burp/BurpExtender$1.class
+burp/BurpExtender.class
+burp/CyberStrikeAITab$TestRun.class
+burp/CyberStrikeAITab$TestRunCellRenderer.class
+burp/HttpMessageFormatter.class
diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/plugins/burp-suite/cyberstrikeai-burp-extension/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
new file mode 100644
index 00000000..1f4d83a9
--- /dev/null
+++ b/plugins/burp-suite/cyberstrikeai-burp-extension/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
@@ -0,0 +1,6 @@
+/Users/temp/Downloads/CyberStrikeAI-main/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/BurpExtender.java
+/Users/temp/Downloads/CyberStrikeAI-main/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/CyberStrikeAIClient.java
+/Users/temp/Downloads/CyberStrikeAI-main/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/CyberStrikeAITab.java
+/Users/temp/Downloads/CyberStrikeAI-main/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/HttpMessageFormatter.java
+/Users/temp/Downloads/CyberStrikeAI-main/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/MarkdownRenderer.java
+/Users/temp/Downloads/CyberStrikeAI-main/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/SimpleJson.java