blitzstrike 1.0.72 → 1.0.74

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.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,28 @@ All notable changes to Blitz Strike are documented here.
5
5
  The format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/).
7
7
 
8
+ ## [1.0.74] — 2026-09-13
9
+
10
+ ### Fixed — banner now visibly surfaces in the terminal
11
+
12
+ - `run_engagement` now returns the "orchestrator in control" banner as a
13
+ standalone first text block (plus a one-line status summary), instead of
14
+ burying it inside the JSON result — so it actually appears in the client
15
+ terminal when the engagement starts.
16
+ - `bs-orchestrate-engagement` now instructs the driving agent to relay the
17
+ banner verbatim and drive `blitz_status` for live progress.
18
+
19
+ ## [1.0.73] — 2026-09-13
20
+
21
+ ### Added — orchestrator "in control" banner + live progress
22
+
23
+ - `run_engagement` now returns a terminal-friendly banner announcing the
24
+ engagement ("orchestrator in control") with the target, mode, and the
25
+ canonical scope→recon→analyze→verify→review→report pipeline.
26
+ - New `blitz_status` MCP tool: format a live progress snapshot (current stage,
27
+ checkmark/active/pending markers, finding counts, task status) so a driving
28
+ agent can announce progress to the user as it works.
29
+
8
30
  ## [1.0.72] — 2026-09-13
9
31
 
10
32
  ### Changed — coordinated agent guidance
package/dist/index.js CHANGED
@@ -30787,6 +30787,33 @@ function resolveFinding(finding, verdict) {
30787
30787
  }
30788
30788
 
30789
30789
  // src/orchestrator.ts
30790
+ var ENGAGEMENT_STAGES = ["scope", "recon", "analyze", "verify", "review", "report"];
30791
+ function engagementBanner(target, mode) {
30792
+ return [
30793
+ "⚡ BLITZ engagement — orchestrator in control",
30794
+ ` target: ${target}`,
30795
+ ` mode: ${mode}`,
30796
+ ` stages: ${ENGAGEMENT_STAGES.join(" → ")}`
30797
+ ].join(`
30798
+ `);
30799
+ }
30800
+ function formatStatus(opts) {
30801
+ const lines = [];
30802
+ const idx = opts.phase ? ENGAGEMENT_STAGES.indexOf(opts.phase) : -1;
30803
+ lines.push(`BLITZ engagement${idx >= 0 ? ` — ${opts.phase} (${idx + 1}/${ENGAGEMENT_STAGES.length})` : ""}`);
30804
+ if (idx >= 0) {
30805
+ lines.push(` stages: ${ENGAGEMENT_STAGES.map((s, i) => i < idx ? `${s} ✓` : i === idx ? `${s} ▶` : `${s} ☐`).join(" ")}`);
30806
+ }
30807
+ if (opts.findings) {
30808
+ const f = opts.findings;
30809
+ lines.push(` findings: ${[`${f.detected ?? 0} detected`, `${f.hypothesis ?? 0} hypothesis`, `${f.confirmed ?? 0} confirmed`, `${f.false_positive ?? 0} false_positive`].join(" · ")}`);
30810
+ }
30811
+ if (opts.tasks && opts.tasks.length) {
30812
+ lines.push(` tasks: ${opts.tasks.map((t) => `${t.objective} (${t.status})`).join(" · ")}`);
30813
+ }
30814
+ return lines.join(`
30815
+ `);
30816
+ }
30790
30817
  var _chainsCache = null;
30791
30818
  function loadChains() {
30792
30819
  if (_chainsCache)
@@ -30904,6 +30931,7 @@ function enrichScan(path, maxFiles = 2000) {
30904
30931
  }
30905
30932
  function runEngagement(target, scope = "", mode = "bug-bounty", maxFiles = 2000, remember = true) {
30906
30933
  const report = {
30934
+ banner: engagementBanner(target, mode),
30907
30935
  target,
30908
30936
  mode,
30909
30937
  tiers: {},
@@ -31057,7 +31085,7 @@ function listChains() {
31057
31085
  }
31058
31086
  var LIVE_SWEEP_PARAMS = ["q", "search", "query", "s", "id", "url", "redirect", "name", "page"];
31059
31087
  async function runLiveEngagement(url, scope = "", mode = "bug-bounty") {
31060
- const report = { target: url, mode, findings: [], scope: null, status: "" };
31088
+ const report = { banner: engagementBanner(url, mode), target: url, mode, findings: [], scope: null, status: "" };
31061
31089
  const sc = scopeCheck(url, scope, mode);
31062
31090
  report.scope = sc;
31063
31091
  if (!sc.allowed) {
@@ -53490,8 +53518,28 @@ function createServer() {
53490
53518
  }, async ({ target, scope, mode, max_files, remember }) => {
53491
53519
  const isUrl = /^https?:\/\//i.test(target);
53492
53520
  const r = isUrl ? await runLiveEngagement(target, scope ?? "", mode ?? "bug-bounty") : runEngagement(target, scope ?? "", mode ?? "bug-bounty", max_files ?? 2000, remember ?? true);
53521
+ const banner = typeof r.banner === "string" ? r.banner : "";
53522
+ const statusLine = r.status === "BLOCKED" ? `✋ BLOCKED — ${r.reason ?? "scope required"}` : `→ ${Array.isArray(r.findings) ? r.findings.length : 0} finding(s), status=${r.status ?? "COMPLETE"}`;
53493
53523
  return {
53494
- content: [{ type: "text", text: JSON.stringify(r) }]
53524
+ content: [
53525
+ { type: "text", text: banner ? `${banner}
53526
+
53527
+ ${statusLine}` : statusLine },
53528
+ { type: "text", text: JSON.stringify(r) }
53529
+ ]
53530
+ };
53531
+ });
53532
+ server.registerTool("blitz_status", {
53533
+ title: "Engagement progress banner",
53534
+ description: "Format a terminal-friendly live progress snapshot of the running engagement — current stage (of the scope→recon→analyze→verify→review→report pipeline), finding counts, and task status. Call it to announce progress to the user as you drive the audit.",
53535
+ inputSchema: {
53536
+ phase: string2().optional().describe("Current stage: scope/recon/analyze/verify/review/report"),
53537
+ findings: record(string2(), number2()).optional().describe("Finding counts, e.g. {detected:4,hypothesis:2,confirmed:1,false_positive:0}"),
53538
+ tasks: array(object2({ id: string2(), objective: string2(), status: string2() })).optional().describe("Task list with status")
53539
+ }
53540
+ }, async ({ phase, findings, tasks }) => {
53541
+ return {
53542
+ content: [{ type: "text", text: formatStatus({ phase, findings, tasks }) }]
53495
53543
  };
53496
53544
  });
53497
53545
  server.registerTool("list_chains", {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blitzstrike",
3
- "version": "1.0.72",
3
+ "version": "1.0.74",
4
4
  "description": "Blitz Strike — a universal MCP security-audit toolbelt. BLITZ sweeps the attack surface, EAGLE-EYE traces source-to-sink, STRIKE verifies live. 57 attack chains, 130-tool catalog, intelligence data layer. One server, every agent.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -15,6 +15,12 @@ deterministic MCP tools; never guess a finding — produce it from tool output.
15
15
  Static source paths on disk are always in-scope; live URLs require an
16
16
  explicit scope.
17
17
 
18
+ **Announce takeover.** When you start an engagement, `run_engagement`
19
+ returns a `banner` ("orchestrator in control") as a standalone text block.
20
+ RELAY that banner verbatim to the user — it is the visible signal that you
21
+ have taken control, not a detail to bury in a JSON dump. Then drive
22
+ `blitz_status` at each stage to show live progress.
23
+
18
24
  2. **Recon (passive-first).** For a live target: `live_recon` (fingerprint, WAF,
19
25
  endpoints, tech). For a source tree: `blitz_scan` (entry points + sinks),
20
26
  `detect_framework`, `list_attack_vectors`.