blitzstrike 1.0.52 → 1.0.53

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,22 @@ 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.53] — 2026-09-13
9
+
10
+ ### Added — Autonomous Security Engine (phase 13: model router)
11
+
12
+ - **Model Router** (`src/mission/router.ts`, §21):
13
+ - Pure routing layer — never calls a model. Deterministic by default.
14
+ - `routeTask()` — maps an agent type to a model tier (`large`/`medium`/`small`)
15
+ only when a provider is configured; otherwise routes to `none`.
16
+ - `AGENT_TIER` — §21 mapping (planning/source/review → large; attack execution
17
+ → medium; verification → small).
18
+ - `loadRouterConfig()` — reads `BLITZSTRIKE_MODEL_PROVIDER` / `_LARGE` /
19
+ `_MEDIUM` / `_SMALL` env vars.
20
+ - `routingPlan()` — full plan (all `none` when deterministic).
21
+ - Mission Control records the routing decision (tier) per task and the overall
22
+ routing plan in the mission `decision_log`.
23
+
8
24
  ## [1.0.52] — 2026-09-13
9
25
 
10
26
  ### Added — Autonomous Security Engine (phase 12: browser automation agent)
package/dist/index.js CHANGED
@@ -19085,6 +19085,55 @@ var init_memory2 = __esm(() => {
19085
19085
  init_memory();
19086
19086
  });
19087
19087
 
19088
+ // src/mission/router.ts
19089
+ function isModelConfigured(config) {
19090
+ return Boolean(config?.provider);
19091
+ }
19092
+ function routeTask(agent, config) {
19093
+ if (!isModelConfigured(config)) {
19094
+ return { agent, tier: "none", model: null, deterministic: true };
19095
+ }
19096
+ const tier = AGENT_TIER[agent] ?? "medium";
19097
+ const key = `model_${tier}`;
19098
+ const model = config?.[key] ?? null;
19099
+ return { agent, tier, model, deterministic: model === null };
19100
+ }
19101
+ function loadRouterConfig(env = process.env) {
19102
+ return {
19103
+ provider: env.BLITZSTRIKE_MODEL_PROVIDER || undefined,
19104
+ model_large: env.BLITZSTRIKE_MODEL_LARGE || undefined,
19105
+ model_medium: env.BLITZSTRIKE_MODEL_MEDIUM || undefined,
19106
+ model_small: env.BLITZSTRIKE_MODEL_SMALL || undefined
19107
+ };
19108
+ }
19109
+ function routingPlan(config) {
19110
+ if (!isModelConfigured(config)) {
19111
+ const out = {};
19112
+ for (const k of Object.keys(AGENT_TIER))
19113
+ out[k] = "none";
19114
+ return out;
19115
+ }
19116
+ return { ...AGENT_TIER };
19117
+ }
19118
+ var AGENT_TIER;
19119
+ var init_router = __esm(() => {
19120
+ AGENT_TIER = {
19121
+ commander: "large",
19122
+ source: "large",
19123
+ analysis: "large",
19124
+ reviewer: "large",
19125
+ recon: "medium",
19126
+ web: "medium",
19127
+ api: "medium",
19128
+ auth: "medium",
19129
+ mobile: "medium",
19130
+ cloud: "medium",
19131
+ reporter: "medium",
19132
+ validator: "small",
19133
+ browser: "small"
19134
+ };
19135
+ });
19136
+
19088
19137
  // src/mission/control.ts
19089
19138
  import { existsSync as existsSync8, statSync as statSync4 } from "node:fs";
19090
19139
  function scopeAllowed(mission) {
@@ -19164,6 +19213,11 @@ async function runMission(mission) {
19164
19213
  let m = { ...mission, status: "running" };
19165
19214
  m.tasks = buildInitialTasks(m);
19166
19215
  m.graph = loadEscalationGraph(m.graph);
19216
+ const routerCfg = loadRouterConfig();
19217
+ m.decision_log = [
19218
+ ...m.decision_log,
19219
+ { at: new Date().toISOString(), agent: "router", decision: isModelConfigured(routerCfg) ? `model routing active: ${JSON.stringify(routingPlan(routerCfg))}` : "deterministic (no model provider configured)" }
19220
+ ];
19167
19221
  m = saveMission(m);
19168
19222
  const scope = m.scope.join(",");
19169
19223
  let iterations = 0;
@@ -19193,20 +19247,22 @@ async function runMission(mission) {
19193
19247
  const results = await Promise.all(batch.map((t) => executeTask(t, m, scope)));
19194
19248
  for (const r of results) {
19195
19249
  const decision = r.ok ? `${r.task.agent_type} completed (${Object.keys(r.output).length} output fields, ${r.hypotheses.length} hypotheses)` : `${r.task.agent_type} failed: ${r.error ?? "unknown"}`;
19250
+ const route = routeTask(r.task.agent_type, routerCfg);
19251
+ const logEntry = (entryDecision) => ({ at: new Date().toISOString(), agent: r.task.agent_type, decision: entryDecision, tier: route.tier });
19196
19252
  if (r.ok) {
19197
19253
  m = {
19198
19254
  ...m,
19199
19255
  tasks: setTask(m.tasks, r.task.task_id, { status: "success", result: r.output }),
19200
19256
  hypotheses: mergeHypotheses(m.hypotheses, r.hypotheses),
19201
19257
  graph: mergeGraphs(m.graph, r.graph),
19202
- decision_log: [...m.decision_log, { at: new Date().toISOString(), agent: r.task.agent_type, decision }]
19258
+ decision_log: [...m.decision_log, logEntry(decision)]
19203
19259
  };
19204
19260
  if (r.task.agent_type === "reporter") {
19205
19261
  m = { ...m, report: r.output };
19206
19262
  }
19207
19263
  } else {
19208
19264
  const rec = recoveryDecision(r.task, r.error ?? "unknown error");
19209
- const stamp = { at: new Date().toISOString(), agent: r.task.agent_type, decision };
19265
+ const stamp = logEntry(decision);
19210
19266
  if (rec.action === "retry") {
19211
19267
  const retried = setTask(m.tasks, r.task.task_id, { status: "retry", error: r.error ?? null });
19212
19268
  m = { ...m, tasks: retried, decision_log: [...m.decision_log, stamp] };
@@ -19274,6 +19330,7 @@ var init_control = __esm(() => {
19274
19330
  init_coverage();
19275
19331
  init_recovery();
19276
19332
  init_memory2();
19333
+ init_router();
19277
19334
  MODE_PROFILES = {
19278
19335
  web: { agents: ["recon", "web", "api", "auth", "validator", "reviewer", "reporter"], verify: true, risk: "medium" },
19279
19336
  api: { agents: ["recon", "api", "auth", "validator", "reviewer", "reporter"], verify: true, risk: "medium" },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blitzstrike",
3
- "version": "1.0.52",
3
+ "version": "1.0.53",
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": {