@node9/proxy 1.21.1 → 1.21.3

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/dist/cli.js CHANGED
@@ -16834,6 +16834,35 @@ function isTestEntry(entry, testTs) {
16834
16834
  }
16835
16835
  return false;
16836
16836
  }
16837
+ var SUPERSEDE_WINDOW_MS = 6e4;
16838
+ function buildSupersededSet(entries) {
16839
+ const superseded = /* @__PURE__ */ new Set();
16840
+ for (let i = 0; i < entries.length; i++) {
16841
+ const e = entries[i];
16842
+ if (e.decision !== "deny") continue;
16843
+ if (e.checkedBy !== "smart-rule-block-override") continue;
16844
+ if (!e.argsHash || !e.sessionId) continue;
16845
+ const eTs = Date.parse(e.ts);
16846
+ if (Number.isNaN(eTs)) continue;
16847
+ for (let j = i + 1; j < entries.length; j++) {
16848
+ const next = entries[j];
16849
+ const nextTs = Date.parse(next.ts);
16850
+ if (Number.isNaN(nextTs)) continue;
16851
+ if (nextTs - eTs > SUPERSEDE_WINDOW_MS) break;
16852
+ if (next.argsHash !== e.argsHash) continue;
16853
+ if (next.sessionId !== e.sessionId) continue;
16854
+ if (next.tool !== e.tool) continue;
16855
+ if (next.decision === "allow" && next.checkedBy === "daemon") {
16856
+ superseded.add(`${e.ts}|${e.argsHash}`);
16857
+ break;
16858
+ }
16859
+ }
16860
+ }
16861
+ return superseded;
16862
+ }
16863
+ function supersedeKey(e) {
16864
+ return `${e.ts}|${e.argsHash ?? ""}`;
16865
+ }
16837
16866
  function getDateRange(period, now) {
16838
16867
  const todayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate());
16839
16868
  const end = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 23, 59, 59, 999);
@@ -17285,6 +17314,7 @@ function aggregateReportFromAudit(period, opts = {}) {
17285
17314
  }
17286
17315
  return true;
17287
17316
  });
17317
+ const superseded = buildSupersededSet(entries);
17288
17318
  let userApproved = 0;
17289
17319
  let userDenied = 0;
17290
17320
  let timedOut = 0;
@@ -17302,6 +17332,7 @@ function aggregateReportFromAudit(period, opts = {}) {
17302
17332
  const dailyMap = /* @__PURE__ */ new Map();
17303
17333
  const hourMap = /* @__PURE__ */ new Map();
17304
17334
  for (const e of entries) {
17335
+ if (superseded.has(supersedeKey(e))) continue;
17305
17336
  const allow = isAllow(e.decision);
17306
17337
  const dateKey = e.ts.slice(0, 10);
17307
17338
  const userInteracted = e.source === "daemon";
@@ -17312,6 +17343,7 @@ function aggregateReportFromAudit(period, opts = {}) {
17312
17343
  if (e.checkedBy === "timeout") timedOut++;
17313
17344
  else if (e.checkedBy === "observe-mode-dlp-would-block") observeDlp++;
17314
17345
  else if (isDlp(e.checkedBy)) dlpBlocked++;
17346
+ else if (e.checkedBy === "local-decision") userDenied++;
17315
17347
  else if (e.checkedBy !== "loop-detected") hardBlocked++;
17316
17348
  }
17317
17349
  if (e.checkedBy === "loop-detected") loopHits++;
@@ -17319,8 +17351,11 @@ function aggregateReportFromAudit(period, opts = {}) {
17319
17351
  t.calls++;
17320
17352
  if (!allow) t.blocked++;
17321
17353
  toolMap.set(e.tool, t);
17322
- if (!allow && e.checkedBy) {
17323
- blockMap.set(e.checkedBy, (blockMap.get(e.checkedBy) ?? 0) + 1);
17354
+ if (!allow) {
17355
+ const key = e.checkedBy ?? (e.source === "daemon" ? "local-decision" : null);
17356
+ if (key) {
17357
+ blockMap.set(key, (blockMap.get(key) ?? 0) + 1);
17358
+ }
17324
17359
  }
17325
17360
  if (!allow && e.ruleName) {
17326
17361
  ruleMap.set(e.ruleName, (ruleMap.get(e.ruleName) ?? 0) + 1);
@@ -17349,7 +17384,9 @@ function aggregateReportFromAudit(period, opts = {}) {
17349
17384
  start,
17350
17385
  end,
17351
17386
  excludedTests,
17352
- total: entries.length,
17387
+ // Subtract superseded rows so the headline event count agrees with
17388
+ // the bucket counters (which skip them in the loop above).
17389
+ total: entries.length - superseded.size,
17353
17390
  userApproved,
17354
17391
  userDenied,
17355
17392
  timedOut,
package/dist/cli.mjs CHANGED
@@ -16807,6 +16807,35 @@ function isTestEntry(entry, testTs) {
16807
16807
  }
16808
16808
  return false;
16809
16809
  }
16810
+ var SUPERSEDE_WINDOW_MS = 6e4;
16811
+ function buildSupersededSet(entries) {
16812
+ const superseded = /* @__PURE__ */ new Set();
16813
+ for (let i = 0; i < entries.length; i++) {
16814
+ const e = entries[i];
16815
+ if (e.decision !== "deny") continue;
16816
+ if (e.checkedBy !== "smart-rule-block-override") continue;
16817
+ if (!e.argsHash || !e.sessionId) continue;
16818
+ const eTs = Date.parse(e.ts);
16819
+ if (Number.isNaN(eTs)) continue;
16820
+ for (let j = i + 1; j < entries.length; j++) {
16821
+ const next = entries[j];
16822
+ const nextTs = Date.parse(next.ts);
16823
+ if (Number.isNaN(nextTs)) continue;
16824
+ if (nextTs - eTs > SUPERSEDE_WINDOW_MS) break;
16825
+ if (next.argsHash !== e.argsHash) continue;
16826
+ if (next.sessionId !== e.sessionId) continue;
16827
+ if (next.tool !== e.tool) continue;
16828
+ if (next.decision === "allow" && next.checkedBy === "daemon") {
16829
+ superseded.add(`${e.ts}|${e.argsHash}`);
16830
+ break;
16831
+ }
16832
+ }
16833
+ }
16834
+ return superseded;
16835
+ }
16836
+ function supersedeKey(e) {
16837
+ return `${e.ts}|${e.argsHash ?? ""}`;
16838
+ }
16810
16839
  function getDateRange(period, now) {
16811
16840
  const todayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate());
16812
16841
  const end = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 23, 59, 59, 999);
@@ -17258,6 +17287,7 @@ function aggregateReportFromAudit(period, opts = {}) {
17258
17287
  }
17259
17288
  return true;
17260
17289
  });
17290
+ const superseded = buildSupersededSet(entries);
17261
17291
  let userApproved = 0;
17262
17292
  let userDenied = 0;
17263
17293
  let timedOut = 0;
@@ -17275,6 +17305,7 @@ function aggregateReportFromAudit(period, opts = {}) {
17275
17305
  const dailyMap = /* @__PURE__ */ new Map();
17276
17306
  const hourMap = /* @__PURE__ */ new Map();
17277
17307
  for (const e of entries) {
17308
+ if (superseded.has(supersedeKey(e))) continue;
17278
17309
  const allow = isAllow(e.decision);
17279
17310
  const dateKey = e.ts.slice(0, 10);
17280
17311
  const userInteracted = e.source === "daemon";
@@ -17285,6 +17316,7 @@ function aggregateReportFromAudit(period, opts = {}) {
17285
17316
  if (e.checkedBy === "timeout") timedOut++;
17286
17317
  else if (e.checkedBy === "observe-mode-dlp-would-block") observeDlp++;
17287
17318
  else if (isDlp(e.checkedBy)) dlpBlocked++;
17319
+ else if (e.checkedBy === "local-decision") userDenied++;
17288
17320
  else if (e.checkedBy !== "loop-detected") hardBlocked++;
17289
17321
  }
17290
17322
  if (e.checkedBy === "loop-detected") loopHits++;
@@ -17292,8 +17324,11 @@ function aggregateReportFromAudit(period, opts = {}) {
17292
17324
  t.calls++;
17293
17325
  if (!allow) t.blocked++;
17294
17326
  toolMap.set(e.tool, t);
17295
- if (!allow && e.checkedBy) {
17296
- blockMap.set(e.checkedBy, (blockMap.get(e.checkedBy) ?? 0) + 1);
17327
+ if (!allow) {
17328
+ const key = e.checkedBy ?? (e.source === "daemon" ? "local-decision" : null);
17329
+ if (key) {
17330
+ blockMap.set(key, (blockMap.get(key) ?? 0) + 1);
17331
+ }
17297
17332
  }
17298
17333
  if (!allow && e.ruleName) {
17299
17334
  ruleMap.set(e.ruleName, (ruleMap.get(e.ruleName) ?? 0) + 1);
@@ -17322,7 +17357,9 @@ function aggregateReportFromAudit(period, opts = {}) {
17322
17357
  start,
17323
17358
  end,
17324
17359
  excludedTests,
17325
- total: entries.length,
17360
+ // Subtract superseded rows so the headline event count agrees with
17361
+ // the bucket counters (which skip them in the loop above).
17362
+ total: entries.length - superseded.size,
17326
17363
  userApproved,
17327
17364
  userDenied,
17328
17365
  timedOut,
@@ -2645,6 +2645,34 @@ function isTestEntry(entry, testTs) {
2645
2645
  }
2646
2646
  return false;
2647
2647
  }
2648
+ function buildSupersededSet(entries) {
2649
+ const superseded = /* @__PURE__ */ new Set();
2650
+ for (let i = 0; i < entries.length; i++) {
2651
+ const e = entries[i];
2652
+ if (e.decision !== "deny") continue;
2653
+ if (e.checkedBy !== "smart-rule-block-override") continue;
2654
+ if (!e.argsHash || !e.sessionId) continue;
2655
+ const eTs = Date.parse(e.ts);
2656
+ if (Number.isNaN(eTs)) continue;
2657
+ for (let j = i + 1; j < entries.length; j++) {
2658
+ const next = entries[j];
2659
+ const nextTs = Date.parse(next.ts);
2660
+ if (Number.isNaN(nextTs)) continue;
2661
+ if (nextTs - eTs > SUPERSEDE_WINDOW_MS) break;
2662
+ if (next.argsHash !== e.argsHash) continue;
2663
+ if (next.sessionId !== e.sessionId) continue;
2664
+ if (next.tool !== e.tool) continue;
2665
+ if (next.decision === "allow" && next.checkedBy === "daemon") {
2666
+ superseded.add(`${e.ts}|${e.argsHash}`);
2667
+ break;
2668
+ }
2669
+ }
2670
+ }
2671
+ return superseded;
2672
+ }
2673
+ function supersedeKey(e) {
2674
+ return `${e.ts}|${e.argsHash ?? ""}`;
2675
+ }
2648
2676
  function getReportDateRange(period, now = /* @__PURE__ */ new Date()) {
2649
2677
  return getDateRange(period, now);
2650
2678
  }
@@ -3126,6 +3154,7 @@ function aggregateReportFromAudit(period, opts = {}) {
3126
3154
  }
3127
3155
  return true;
3128
3156
  });
3157
+ const superseded = buildSupersededSet(entries);
3129
3158
  let userApproved = 0;
3130
3159
  let userDenied = 0;
3131
3160
  let timedOut = 0;
@@ -3143,6 +3172,7 @@ function aggregateReportFromAudit(period, opts = {}) {
3143
3172
  const dailyMap = /* @__PURE__ */ new Map();
3144
3173
  const hourMap = /* @__PURE__ */ new Map();
3145
3174
  for (const e of entries) {
3175
+ if (superseded.has(supersedeKey(e))) continue;
3146
3176
  const allow = isAllow(e.decision);
3147
3177
  const dateKey = e.ts.slice(0, 10);
3148
3178
  const userInteracted = e.source === "daemon";
@@ -3153,6 +3183,7 @@ function aggregateReportFromAudit(period, opts = {}) {
3153
3183
  if (e.checkedBy === "timeout") timedOut++;
3154
3184
  else if (e.checkedBy === "observe-mode-dlp-would-block") observeDlp++;
3155
3185
  else if (isDlp(e.checkedBy)) dlpBlocked++;
3186
+ else if (e.checkedBy === "local-decision") userDenied++;
3156
3187
  else if (e.checkedBy !== "loop-detected") hardBlocked++;
3157
3188
  }
3158
3189
  if (e.checkedBy === "loop-detected") loopHits++;
@@ -3160,8 +3191,11 @@ function aggregateReportFromAudit(period, opts = {}) {
3160
3191
  t.calls++;
3161
3192
  if (!allow) t.blocked++;
3162
3193
  toolMap.set(e.tool, t);
3163
- if (!allow && e.checkedBy) {
3164
- blockMap.set(e.checkedBy, (blockMap.get(e.checkedBy) ?? 0) + 1);
3194
+ if (!allow) {
3195
+ const key = e.checkedBy ?? (e.source === "daemon" ? "local-decision" : null);
3196
+ if (key) {
3197
+ blockMap.set(key, (blockMap.get(key) ?? 0) + 1);
3198
+ }
3165
3199
  }
3166
3200
  if (!allow && e.ruleName) {
3167
3201
  ruleMap.set(e.ruleName, (ruleMap.get(e.ruleName) ?? 0) + 1);
@@ -3190,7 +3224,9 @@ function aggregateReportFromAudit(period, opts = {}) {
3190
3224
  start,
3191
3225
  end,
3192
3226
  excludedTests,
3193
- total: entries.length,
3227
+ // Subtract superseded rows so the headline event count agrees with
3228
+ // the bucket counters (which skip them in the loop above).
3229
+ total: entries.length - superseded.size,
3194
3230
  userApproved,
3195
3231
  userDenied,
3196
3232
  timedOut,
@@ -3225,13 +3261,14 @@ function aggregateReportFromAudit(period, opts = {}) {
3225
3261
  };
3226
3262
  return { data, hasAuditFile, responseDlpEntries };
3227
3263
  }
3228
- var TEST_COMMAND_RE, CLAUDE_PRICING, GEMINI_FALLBACK_MODELS;
3264
+ var TEST_COMMAND_RE, SUPERSEDE_WINDOW_MS, CLAUDE_PRICING, GEMINI_FALLBACK_MODELS;
3229
3265
  var init_report_audit = __esm({
3230
3266
  "src/cli/aggregate/report-audit.ts"() {
3231
3267
  "use strict";
3232
3268
  init_costSync();
3233
3269
  init_litellm();
3234
3270
  TEST_COMMAND_RE = /(?:^|\s)(npm\s+(?:run\s+)?test|npx\s+(?:vitest|jest|mocha)|yarn\s+(?:run\s+)?test|pnpm\s+(?:run\s+)?test|vitest|jest|mocha|pytest|py\.test|cargo\s+test|go\s+test|bundle\s+exec\s+rspec|rspec|phpunit|dotnet\s+test)\b/i;
3271
+ SUPERSEDE_WINDOW_MS = 6e4;
3235
3272
  CLAUDE_PRICING = {
3236
3273
  "claude-opus-4-6": { i: 5e-6, o: 25e-6, cw: 625e-8, cr: 5e-7 },
3237
3274
  "claude-opus-4-5": { i: 5e-6, o: 25e-6, cw: 625e-8, cr: 5e-7 },
@@ -5588,14 +5625,15 @@ function TopToolsProjects({ audit }) {
5588
5625
  /* @__PURE__ */ jsx4(Text4, { bold: true, children: "TOP TOOLS / PROJECTS" }),
5589
5626
  audit === null ? /* @__PURE__ */ jsx4(Text4, { dimColor: true, children: "loading\u2026" }) : tools.length === 0 && projects.length === 0 ? /* @__PURE__ */ jsx4(Text4, { dimColor: true, children: "\u2014" }) : /* @__PURE__ */ jsxs4(Fragment3, { children: [
5590
5627
  /* @__PURE__ */ jsxs4(Box4, { children: [
5591
- /* @__PURE__ */ jsx4(Box4, { width: TOOL_LABEL_W + TOOL_COUNT_W + COL_GUTTER, children: /* @__PURE__ */ jsx4(Text4, { dimColor: true, children: "TOOLS" }) }),
5628
+ /* @__PURE__ */ jsx4(Box4, { width: TOOL_LABEL_W, children: /* @__PURE__ */ jsx4(Text4, { dimColor: true, children: "TOOLS" }) }),
5629
+ /* @__PURE__ */ jsx4(Box4, { width: TOOL_COUNT_W }),
5630
+ /* @__PURE__ */ jsx4(Text4, { dimColor: true, children: COL_GUTTER }),
5592
5631
  /* @__PURE__ */ jsx4(Text4, { dimColor: true, children: "PROJECTS" })
5593
5632
  ] }),
5594
5633
  rows.map((r, i) => /* @__PURE__ */ jsxs4(Box4, { height: 1, children: [
5595
- /* @__PURE__ */ jsx4(Box4, { width: TOOL_LABEL_W + TOOL_COUNT_W + COL_GUTTER, children: r.tool ? /* @__PURE__ */ jsxs4(Fragment3, { children: [
5596
- /* @__PURE__ */ jsx4(Box4, { width: TOOL_LABEL_W, children: /* @__PURE__ */ jsx4(Text4, { children: fit(r.tool[0], TOOL_LABEL_W) }) }),
5597
- /* @__PURE__ */ jsx4(Box4, { width: TOOL_COUNT_W, justifyContent: "flex-end", children: /* @__PURE__ */ jsx4(Text4, { bold: true, children: num(r.tool[1].calls) }) })
5598
- ] }) : null }),
5634
+ /* @__PURE__ */ jsx4(Box4, { width: TOOL_LABEL_W, children: /* @__PURE__ */ jsx4(Text4, { children: r.tool ? fit(r.tool[0], TOOL_LABEL_W) : "" }) }),
5635
+ /* @__PURE__ */ jsx4(Box4, { width: TOOL_COUNT_W, justifyContent: "flex-end", children: /* @__PURE__ */ jsx4(Text4, { bold: true, children: r.tool ? num(r.tool[1].calls) : "" }) }),
5636
+ /* @__PURE__ */ jsx4(Text4, { children: COL_GUTTER }),
5599
5637
  r.project ? /* @__PURE__ */ jsxs4(Fragment3, { children: [
5600
5638
  /* @__PURE__ */ jsx4(Box4, { width: PROJECT_LABEL_W, children: /* @__PURE__ */ jsx4(Text4, { children: fit(r.project.name, PROJECT_LABEL_W) }) }),
5601
5639
  /* @__PURE__ */ jsx4(Text4, { dimColor: true, children: `${formatTokens(r.project.tokens)} ` }),
@@ -5625,7 +5663,7 @@ var init_TopToolsProjects = __esm({
5625
5663
  ROW_LIMIT = 4;
5626
5664
  TOOL_LABEL_W = 10;
5627
5665
  TOOL_COUNT_W = 6;
5628
- COL_GUTTER = 3;
5666
+ COL_GUTTER = " ";
5629
5667
  PROJECT_LABEL_W = 14;
5630
5668
  }
5631
5669
  });
package/dist/scan-ink.mjs CHANGED
@@ -164,10 +164,9 @@ function relativeDate(timestamp, now = /* @__PURE__ */ new Date()) {
164
164
  // src/cli/render/ink/panels/LeaksPanel.tsx
165
165
  import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
166
166
  var ROW_LIMIT = 4;
167
- function LeaksPanel({ summary, width }) {
167
+ function LeaksPanel({ summary, width, now = /* @__PURE__ */ new Date() }) {
168
168
  const leaks = summary.leaks;
169
169
  if (leaks.length === 0) return null;
170
- const now = /* @__PURE__ */ new Date();
171
170
  return /* @__PURE__ */ jsxs5(Box5, { borderStyle: "round", borderColor: "red", paddingX: 1, flexDirection: "column", width, children: [
172
171
  /* @__PURE__ */ jsx5(Text5, { bold: true, color: "red", children: "CREDENTIAL LEAKS" }),
173
172
  leaks.slice(0, ROW_LIMIT).map((leak, i) => /* @__PURE__ */ jsxs5(Box5, { children: [
@@ -1599,7 +1598,7 @@ function renderWidth() {
1599
1598
  const term = process.stdout.columns ?? MAX_WIDTH;
1600
1599
  return Math.min(term, MAX_WIDTH);
1601
1600
  }
1602
- function StaticScorecard({ input, rangeLabel }) {
1601
+ function StaticScorecard({ input, rangeLabel, now }) {
1603
1602
  const { summary, blockedCount } = input;
1604
1603
  const width = renderWidth();
1605
1604
  const halfWidth = Math.floor((width - 1) / 2);
@@ -1625,7 +1624,7 @@ function StaticScorecard({ input, rangeLabel }) {
1625
1624
  hasCritical ? /* @__PURE__ */ jsxs11(Fragment2, { children: [
1626
1625
  /* @__PURE__ */ jsx11(SeverityBand, { label: criticalLabel, width }),
1627
1626
  /* @__PURE__ */ jsxs11(Box11, { flexDirection: "row", gap: 1, children: [
1628
- /* @__PURE__ */ jsx11(LeaksPanel, { summary, width: halfWidth }),
1627
+ /* @__PURE__ */ jsx11(LeaksPanel, { summary, width: halfWidth, now }),
1629
1628
  /* @__PURE__ */ jsx11(BlockedPanel, { summary, width: halfWidth })
1630
1629
  ] })
1631
1630
  ] }) : null,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@node9/proxy",
3
- "version": "1.21.1",
3
+ "version": "1.21.3",
4
4
  "description": "The Sudo Command for AI Agents. Execution Security for Claude Code & MCP.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",