pi-smart-compact 9.2.1 → 9.3.0

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.
@@ -2,7 +2,7 @@
2
2
  var __require = import.meta.require;
3
3
 
4
4
  // src/constants.ts
5
- var VERSION = "9.2.1";
5
+ var VERSION = "9.3.0";
6
6
  var SETTLED_TRIGGER_COOLDOWN_MS = 10 * 60000;
7
7
  var COMPACT_SYSTEM_PREFIX = "You are an expert conversation summarizer for a coding agent. " + "Produce structured markdown summaries. " + "Follow output format exactly. " + "Use EXACT names \u2014 never paraphrase code identifiers. " + "Trust deterministic extraction data over intuition.";
8
8
  var PROFILES = {
@@ -534,6 +534,188 @@ function lruSet(m, key, value, max) {
534
534
  }
535
535
 
536
536
  // src/utils/tokens.ts
537
+ var PROVIDER_MAP = {
538
+ "zai-anthropic": {
539
+ maxOutputTokens: 8192,
540
+ supportsTools: "probe",
541
+ jsonReliability: "high",
542
+ instructionFollowing: "high",
543
+ tokenRatioEstimate: 3.5,
544
+ concurrencyLimit: 3,
545
+ cacheStrategy: "anthropic",
546
+ timeoutMultiplier: 1.2,
547
+ singlePassTokenMultiplier: 1,
548
+ multimodal: "metadata-only"
549
+ },
550
+ "kimi-coding": {
551
+ maxOutputTokens: 8192,
552
+ supportsTools: "probe",
553
+ jsonReliability: "high",
554
+ instructionFollowing: "high",
555
+ tokenRatioEstimate: 3.5,
556
+ concurrencyLimit: 2,
557
+ cacheStrategy: "anthropic",
558
+ timeoutMultiplier: 1.5,
559
+ singlePassTokenMultiplier: 0.95,
560
+ multimodal: "metadata-only"
561
+ },
562
+ anthropic: {
563
+ maxOutputTokens: 8192,
564
+ supportsTools: true,
565
+ jsonReliability: "high",
566
+ instructionFollowing: "high",
567
+ tokenRatioEstimate: 3.5,
568
+ concurrencyLimit: 3,
569
+ cacheStrategy: "anthropic",
570
+ timeoutMultiplier: 1.2,
571
+ singlePassTokenMultiplier: 1,
572
+ multimodal: "native"
573
+ },
574
+ openai: {
575
+ maxOutputTokens: 16384,
576
+ supportsTools: true,
577
+ jsonReliability: "high",
578
+ instructionFollowing: "high",
579
+ tokenRatioEstimate: 4,
580
+ concurrencyLimit: 5,
581
+ cacheStrategy: "openai",
582
+ timeoutMultiplier: 1,
583
+ singlePassTokenMultiplier: 1.15,
584
+ multimodal: "native"
585
+ },
586
+ google: {
587
+ maxOutputTokens: 8192,
588
+ supportsTools: true,
589
+ jsonReliability: "high",
590
+ instructionFollowing: "high",
591
+ tokenRatioEstimate: 3.8,
592
+ concurrencyLimit: 3,
593
+ cacheStrategy: "openai",
594
+ timeoutMultiplier: 1.15,
595
+ singlePassTokenMultiplier: 1.1,
596
+ multimodal: "native"
597
+ },
598
+ deepseek: {
599
+ maxOutputTokens: 8192,
600
+ supportsTools: true,
601
+ jsonReliability: "medium",
602
+ instructionFollowing: "medium",
603
+ tokenRatioEstimate: 3.6,
604
+ concurrencyLimit: 2,
605
+ cacheStrategy: "none",
606
+ timeoutMultiplier: 1.5,
607
+ singlePassTokenMultiplier: 0.85,
608
+ multimodal: "metadata-only"
609
+ },
610
+ minimax: {
611
+ maxOutputTokens: 4096,
612
+ supportsTools: "probe",
613
+ jsonReliability: "medium",
614
+ instructionFollowing: "medium",
615
+ tokenRatioEstimate: 3.8,
616
+ concurrencyLimit: 2,
617
+ cacheStrategy: "anthropic",
618
+ timeoutMultiplier: 1.6,
619
+ singlePassTokenMultiplier: 0.8,
620
+ multimodal: "metadata-only"
621
+ },
622
+ "xiaomi-token-plan": {
623
+ maxOutputTokens: 8192,
624
+ supportsTools: "probe",
625
+ jsonReliability: "medium",
626
+ instructionFollowing: "medium",
627
+ tokenRatioEstimate: 3.3,
628
+ concurrencyLimit: 2,
629
+ cacheStrategy: "openai",
630
+ timeoutMultiplier: 1.35,
631
+ singlePassTokenMultiplier: 0.9,
632
+ multimodal: "metadata-only"
633
+ },
634
+ "xiaomi-mimo": {
635
+ maxOutputTokens: 8192,
636
+ supportsTools: "probe",
637
+ jsonReliability: "medium",
638
+ instructionFollowing: "medium",
639
+ tokenRatioEstimate: 3.3,
640
+ concurrencyLimit: 2,
641
+ cacheStrategy: "anthropic",
642
+ timeoutMultiplier: 1.35,
643
+ singlePassTokenMultiplier: 0.9,
644
+ multimodal: "metadata-only"
645
+ },
646
+ crofai: {
647
+ maxOutputTokens: 8192,
648
+ supportsTools: "probe",
649
+ jsonReliability: "medium",
650
+ instructionFollowing: "medium",
651
+ tokenRatioEstimate: 3.8,
652
+ concurrencyLimit: 3,
653
+ cacheStrategy: "none",
654
+ timeoutMultiplier: 1.2,
655
+ singlePassTokenMultiplier: 0.95,
656
+ multimodal: "metadata-only"
657
+ },
658
+ mistral: {
659
+ maxOutputTokens: 8192,
660
+ supportsTools: true,
661
+ jsonReliability: "high",
662
+ instructionFollowing: "high",
663
+ tokenRatioEstimate: 3.5,
664
+ concurrencyLimit: 3,
665
+ cacheStrategy: "openai",
666
+ timeoutMultiplier: 1.2,
667
+ singlePassTokenMultiplier: 1,
668
+ multimodal: "metadata-only"
669
+ },
670
+ xai: {
671
+ maxOutputTokens: 8192,
672
+ supportsTools: true,
673
+ jsonReliability: "medium",
674
+ instructionFollowing: "high",
675
+ tokenRatioEstimate: 3.8,
676
+ concurrencyLimit: 3,
677
+ cacheStrategy: "openai",
678
+ timeoutMultiplier: 1.2,
679
+ singlePassTokenMultiplier: 1,
680
+ multimodal: "native"
681
+ }
682
+ };
683
+ var PROVIDER_ALIASES = [
684
+ { pattern: /anthropic/i, provider: "anthropic" },
685
+ { pattern: /kimi/i, provider: "kimi-coding" },
686
+ { pattern: /zai/i, provider: "zai-anthropic" },
687
+ { pattern: /openai/i, provider: "openai" },
688
+ { pattern: /gpt/i, provider: "openai" },
689
+ { pattern: /google|gemini/i, provider: "google" },
690
+ { pattern: /deepseek/i, provider: "deepseek" },
691
+ { pattern: /minimax/i, provider: "minimax" },
692
+ { pattern: /xiaomi-mimo/i, provider: "xiaomi-mimo" },
693
+ { pattern: /xiaomi/i, provider: "xiaomi-token-plan" },
694
+ { pattern: /crofai/i, provider: "crofai" },
695
+ { pattern: /mistral/i, provider: "mistral" },
696
+ { pattern: /xai|grok/i, provider: "xai" }
697
+ ];
698
+ var DEFAULT_CAPS = {
699
+ maxOutputTokens: 8192,
700
+ supportsTools: "probe",
701
+ jsonReliability: "medium",
702
+ instructionFollowing: "medium",
703
+ tokenRatioEstimate: 3.8,
704
+ concurrencyLimit: 2,
705
+ cacheStrategy: "none",
706
+ timeoutMultiplier: 1.35,
707
+ singlePassTokenMultiplier: 0.9,
708
+ multimodal: "metadata-only"
709
+ };
710
+ function getProviderCaps(provider) {
711
+ if (PROVIDER_MAP[provider])
712
+ return PROVIDER_MAP[provider];
713
+ for (const { pattern, provider: key } of PROVIDER_ALIASES) {
714
+ if (pattern.test(provider))
715
+ return PROVIDER_MAP[key] ?? DEFAULT_CAPS;
716
+ }
717
+ return DEFAULT_CAPS;
718
+ }
537
719
  class TokenCalibrationStore {
538
720
  maxEntries;
539
721
  factors = new Map;
@@ -631,10 +813,22 @@ function buildUniquePathNeedles(filePath, allPaths) {
631
813
  });
632
814
  }
633
815
  function isKnownPathReference(ref, knownPaths) {
634
- const normalizedRef = normalizePath(ref);
816
+ const normalizedRef = normalizePath(ref).replace(/^\/+/, "");
817
+ if (!normalizedRef)
818
+ return false;
819
+ const pathShaped = normalizedRef.includes("/");
635
820
  return knownPaths.some((path2) => {
636
- const normalizedPath = normalizePath(path2);
637
- return normalizedPath === normalizedRef || normalizedPath.endsWith("/" + normalizedRef);
821
+ const normalizedPath = normalizePath(path2).replace(/^\/+/, "");
822
+ if (normalizedPath === normalizedRef || normalizedPath.endsWith("/" + normalizedRef))
823
+ return true;
824
+ if (normalizedPath.endsWith(normalizedRef)) {
825
+ const boundary = normalizedPath[normalizedPath.length - normalizedRef.length - 1];
826
+ if (boundary && !/[\w./-]/.test(boundary))
827
+ return true;
828
+ }
829
+ if (!pathShaped)
830
+ return false;
831
+ return normalizedPath.split("/").some((_, index, parts) => parts.slice(index).join("/").startsWith(normalizedRef + "/"));
638
832
  });
639
833
  }
640
834
 
@@ -720,10 +914,20 @@ function isLikelyFileRef(candidate) {
720
914
  return CODE_EXT_RE.test(candidate);
721
915
  }
722
916
  function extractFileRefs(summary) {
723
- const candidates = summary.match(FILE_REF_CANDIDATE_RE) ?? [];
724
- return candidates.filter(isLikelyFileRef);
917
+ const matcher = new RegExp(FILE_REF_CANDIDATE_RE.source, FILE_REF_CANDIDATE_RE.flags);
918
+ const refs = [];
919
+ for (const match of summary.matchAll(matcher)) {
920
+ if (/[\\/]/.test(summary[(match.index ?? 0) + match[0].length] ?? ""))
921
+ continue;
922
+ if (isLikelyFileRef(match[0]))
923
+ refs.push(match[0]);
924
+ }
925
+ return refs;
725
926
  }
726
927
 
928
+ // src/domain/summary-parse.ts
929
+ import { createHash } from "crypto";
930
+
727
931
  // src/domain/summary-schema.ts
728
932
  function classifyHeading(raw) {
729
933
  const text = raw.replace(/^#+\s*/, "").replace(/[:\s]+$/, "").trim().toLowerCase();
@@ -763,6 +967,58 @@ var HEADING_RE = /^(#{1,3})\s+(.+?)\s*$/;
763
967
  function summaryEvidenceLine(value, maxLength) {
764
968
  return value.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/g, " ").replace(/\s+/g, " ").trim().replace(/^(?:(?:#{1,6}|[-*+]|>)\s+)+/, "").slice(0, maxLength).trim();
765
969
  }
970
+ function summaryPathLine(value) {
971
+ return JSON.stringify(value);
972
+ }
973
+ function compactPathLine(value, maxLength, digest) {
974
+ const minimal = JSON.stringify("#" + digest);
975
+ if (minimal.length >= maxLength)
976
+ return minimal;
977
+ const chars = Array.from(value.replace(/\\/g, "/"));
978
+ let low = 0;
979
+ let high = chars.length;
980
+ let best = minimal;
981
+ while (low <= high) {
982
+ const length = Math.floor((low + high) / 2);
983
+ const candidate = JSON.stringify("\u2026/" + chars.slice(-length).join("") + "#" + digest);
984
+ if (candidate.length <= maxLength) {
985
+ best = candidate;
986
+ low = length + 1;
987
+ } else {
988
+ high = length - 1;
989
+ }
990
+ }
991
+ return best;
992
+ }
993
+ function buildSummaryPathEvidence(paths, budgetTokens = PROFILES.balanced.summaryBudgetTokens) {
994
+ const unique = Array.from(new Set(paths.filter(Boolean)));
995
+ if (!unique.length)
996
+ return new Map;
997
+ const full = unique.map((path2) => [path2, summaryPathLine(path2)]);
998
+ const minimumPerLine = JSON.stringify("#" + "x".repeat(12)).length + 3;
999
+ const budgetChars = Math.max(unique.length * minimumPerLine, Math.min(20000, Math.max(4000, Math.floor(budgetTokens * 2))));
1000
+ if (full.reduce((total, [, line]) => total + line.length + 3, 0) <= budgetChars) {
1001
+ return new Map(full);
1002
+ }
1003
+ const digests = new Map;
1004
+ const owners = new Map;
1005
+ for (const path2 of unique) {
1006
+ const fullDigest = createHash("sha256").update(path2).digest("base64url");
1007
+ let digest = fullDigest.slice(0, 12);
1008
+ const owner = owners.get(digest);
1009
+ if (owner && owner !== path2) {
1010
+ digest = fullDigest;
1011
+ digests.set(owner, createHash("sha256").update(owner).digest("base64url"));
1012
+ }
1013
+ owners.set(digest, path2);
1014
+ digests.set(path2, digest);
1015
+ }
1016
+ const perPath = Math.max(JSON.stringify("#" + "x".repeat(12)).length, Math.floor((budgetChars - unique.length * 3) / unique.length));
1017
+ return new Map(unique.map((path2) => [
1018
+ path2,
1019
+ compactPathLine(path2, perPath, digests.get(path2) ?? "")
1020
+ ]));
1021
+ }
766
1022
  function mergeBodies(first, second) {
767
1023
  const seen = new Set;
768
1024
  return [first, second].filter(Boolean).flatMap((body) => body.split(`
@@ -787,7 +1043,11 @@ function parseSummary(markdown) {
787
1043
  if (existing)
788
1044
  existing.body = mergeBodies(existing.body, body);
789
1045
  else
790
- sections.push({ kind: currentKind, heading: currentHeading.trim(), body });
1046
+ sections.push({
1047
+ kind: currentKind,
1048
+ heading: currentHeading.trim(),
1049
+ body
1050
+ });
791
1051
  };
792
1052
  for (const line of lines) {
793
1053
  const fenceMatch = line.match(/^\s{0,3}(`{3,}|~{3,})(.*)$/);
@@ -878,7 +1138,11 @@ function buildToolCallIndex(msgs) {
878
1138
  for (let t = 0;t < nested.length; t++) {
879
1139
  const tool = nested[t];
880
1140
  const id = nestedToolCallId(b.id, i, t, tool.id);
881
- idx.set(id, { name: tool.name, arguments: tool.arguments, msgIndex: i });
1141
+ idx.set(id, {
1142
+ name: tool.name,
1143
+ arguments: tool.arguments,
1144
+ msgIndex: i
1145
+ });
882
1146
  }
883
1147
  }
884
1148
  }
@@ -886,12 +1150,36 @@ function buildToolCallIndex(msgs) {
886
1150
  return idx;
887
1151
  }
888
1152
  var CONSTRAINT_PATTERNS = [
889
- { re: /\b(?:must|need|require|has to|important)\b.*\b(?:be|use|have|include|support)\b/i, cat: "requirement", conf: TUNING.CONFIDENCE_HIGH },
890
- { re: /\b(?:don't|never|avoid|shouldn't|must not|do not|no\s+(?:need|want))\b/i, cat: "prohibition", conf: TUNING.CONFIDENCE_MEDIUM },
891
- { re: /\b(?:prefer|like|want|would rather|should)\b.*\b(?:use|be|have|with)\b/i, cat: "preference", conf: TUNING.CONFIDENCE_LOW },
892
- { re: /(?<![A-Za-z0-9_])(?:yapma|kullanma|sak\u0131n|sak\u0131nha|asla(?:\s+(?:kullanma|yapma|getirme))?|bunu yapma)(?![A-Za-z0-9_])/iu, cat: "prohibition", conf: TUNING.CONFIDENCE_MEDIUM },
893
- { re: /(?<![A-Za-z0-9_])(?:kritik|kritikal|\u00F6nemli|onemli|\u015Fart|sart|zorunlu|\u015Fart ko\u015Ful|\u00F6nemli \u015Fart|kesinlikle|kesinlikle \u015Fart|b\u00F6yle olsun|b\u00F6yle yap\u0131n|\u015F\u00F6yle olsun|\u015F\u00F6yle yap\u0131n)(?![A-Za-z0-9_])/iu, cat: "requirement", conf: TUNING.CONFIDENCE_MEDIUM },
894
- { re: /(?<![A-Za-z0-9_])(?:tercih|isterim|olsun|kullanal\u0131m|yapal\u0131m|istiyorum)(?![A-Za-z0-9_])/iu, cat: "preference", conf: TUNING.CONFIDENCE_LOW }
1153
+ {
1154
+ re: /\b(?:must|need|require|has to|important)\b.*\b(?:be|use|have|include|support)\b/i,
1155
+ cat: "requirement",
1156
+ conf: TUNING.CONFIDENCE_HIGH
1157
+ },
1158
+ {
1159
+ re: /\b(?:don't|never|avoid|shouldn't|must not|do not|no\s+(?:need|want))\b/i,
1160
+ cat: "prohibition",
1161
+ conf: TUNING.CONFIDENCE_MEDIUM
1162
+ },
1163
+ {
1164
+ re: /\b(?:prefer|like|want|would rather|should)\b.*\b(?:use|be|have|with)\b/i,
1165
+ cat: "preference",
1166
+ conf: TUNING.CONFIDENCE_LOW
1167
+ },
1168
+ {
1169
+ re: /(?<![A-Za-z0-9_])(?:yapma|kullanma|sak\u0131n|sak\u0131nha|asla(?:\s+(?:kullanma|yapma|getirme))?|bunu yapma)(?![A-Za-z0-9_])/iu,
1170
+ cat: "prohibition",
1171
+ conf: TUNING.CONFIDENCE_MEDIUM
1172
+ },
1173
+ {
1174
+ re: /(?<![A-Za-z0-9_])(?:kritik|kritikal|\u00F6nemli|onemli|\u015Fart|sart|zorunlu|\u015Fart ko\u015Ful|\u00F6nemli \u015Fart|kesinlikle|kesinlikle \u015Fart|b\u00F6yle olsun|b\u00F6yle yap\u0131n|\u015F\u00F6yle olsun|\u015F\u00F6yle yap\u0131n)(?![A-Za-z0-9_])/iu,
1175
+ cat: "requirement",
1176
+ conf: TUNING.CONFIDENCE_MEDIUM
1177
+ },
1178
+ {
1179
+ re: /(?<![A-Za-z0-9_])(?:tercih|isterim|olsun|kullanal\u0131m|yapal\u0131m|istiyorum)(?![A-Za-z0-9_])/iu,
1180
+ cat: "preference",
1181
+ conf: TUNING.CONFIDENCE_LOW
1182
+ }
895
1183
  ];
896
1184
  function isDiagnosticConstraintText(text) {
897
1185
  const candidate = text.replace(/^\s*[-*]\s+/, "").trim();
@@ -960,7 +1248,10 @@ function withCodexWireLimit(model, opts) {
960
1248
  onPayload: async (payload, requestModel) => {
961
1249
  const transformed = await previous?.(payload, requestModel);
962
1250
  const body = transformed ?? payload;
963
- return body && typeof body === "object" ? { ...body, max_output_tokens: opts.maxTokens } : body;
1251
+ return body && typeof body === "object" ? {
1252
+ ...body,
1253
+ max_output_tokens: opts.maxTokens
1254
+ } : body;
964
1255
  }
965
1256
  };
966
1257
  }
@@ -981,11 +1272,12 @@ function assertSuccessful(message) {
981
1272
  }
982
1273
  return message;
983
1274
  }
984
- async function withProviderDeadline(opts, invoke) {
1275
+ async function withProviderDeadline(opts, invoke, modelId) {
985
1276
  if (opts.signal?.aborted)
986
1277
  throw new Error("LLM request aborted before dispatch");
987
1278
  const controller = new AbortController;
988
- const watchdogMs = resolveCodexWatchdogMs(opts.maxTokens, opts.codexWatchdogMs);
1279
+ const multiplier = modelId && !((opts.codexWatchdogMs ?? 0) > 0) ? getProviderCaps(modelId).timeoutMultiplier : 1;
1280
+ const watchdogMs = Math.round(resolveCodexWatchdogMs(opts.maxTokens, opts.codexWatchdogMs) * multiplier);
989
1281
  const abort = Promise.withResolvers();
990
1282
  const abortFromCaller = () => {
991
1283
  controller.abort(opts.signal?.reason);
@@ -1058,7 +1350,7 @@ var rawLlmClient = {
1058
1350
  return completeChatGptCodex(model, body, bounded);
1059
1351
  const response = bounded.reasoning === undefined ? await (await resolveComplete())(model, body, bounded) : await (await resolveCompleteSimple())(model, body, bounded);
1060
1352
  return assertSuccessful(response);
1061
- });
1353
+ }, model.id);
1062
1354
  }
1063
1355
  };
1064
1356
  var defaultLlmClient = rawLlmClient;
@@ -1072,7 +1364,10 @@ import crypto from "crypto";
1072
1364
 
1073
1365
  // src/domain/scrub.ts
1074
1366
  var SECRET_PATTERNS = [
1075
- { kind: "private-key", regex: /-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g },
1367
+ {
1368
+ kind: "private-key",
1369
+ regex: /-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g
1370
+ },
1076
1371
  { kind: "aws-access-key", regex: /\bAKIA[0-9A-Z]{16}\b/g },
1077
1372
  { kind: "google-api-key", regex: /\bAIza[0-9A-Za-z_-]{30,}\b/g },
1078
1373
  { kind: "stripe-key", regex: /\b[rs]k_(?:live|test)_[0-9A-Za-z]{16,}\b/g },
@@ -1081,8 +1376,15 @@ var SECRET_PATTERNS = [
1081
1376
  { kind: "github-token", regex: /\bgh[pousr]_[A-Za-z0-9]{20,}\b/g },
1082
1377
  { kind: "api-key", regex: /\bsk-(?:ant-)?[A-Za-z0-9_-]{20,}\b/g },
1083
1378
  { kind: "slack-token", regex: /\bxox[baprs]-[A-Za-z0-9-]{10,}\b/g },
1084
- { kind: "jwt", regex: /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g },
1085
- { kind: "bearer-token", regex: /\bBearer\s+[A-Za-z0-9._~+\/-]{12,}=*/gi, replacement: () => "Bearer [REDACTED:bearer-token]" },
1379
+ {
1380
+ kind: "jwt",
1381
+ regex: /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g
1382
+ },
1383
+ {
1384
+ kind: "bearer-token",
1385
+ regex: /\bBearer\s+[A-Za-z0-9._~+/-]{12,}=*/gi,
1386
+ replacement: () => "Bearer [REDACTED:bearer-token]"
1387
+ },
1086
1388
  {
1087
1389
  kind: "connection-password",
1088
1390
  regex: /\b([a-z][a-z0-9+.-]*:\/\/[^:\s/@]+:)[^@\s/]+(@)/gi,
@@ -1091,12 +1393,35 @@ var SECRET_PATTERNS = [
1091
1393
  {
1092
1394
  kind: "credential",
1093
1395
  regex: /\b((?:[A-Za-z0-9]+[_-])*(?:api[_-]?key|access[_-]?token|auth[_-]?token|token|password|passwd|secret(?:[_-]?(?:access)?[_-]?key)?|client[_-]?secret)(?:[_-][A-Za-z0-9]+)*)\s*([:=])\s*["']?([^\s"']{16,})["']?/gi,
1094
- replacement: (name, separator) => name + separator + "[REDACTED:credential]"
1396
+ replacement: (name, separator, value, match) => /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)+$/.test(value) ? match : name + separator + "[REDACTED:credential]"
1095
1397
  }
1096
1398
  ];
1399
+ function passesLuhn(candidate) {
1400
+ const digits = candidate.replace(/\D/g, "");
1401
+ if (digits.length < 13 || digits.length > 19)
1402
+ return false;
1403
+ if (/^(\d)\1+$/.test(digits))
1404
+ return false;
1405
+ let sum = 0, double = false;
1406
+ for (let i = digits.length - 1;i >= 0; i--) {
1407
+ let d = digits.charCodeAt(i) - 48;
1408
+ if (double) {
1409
+ d *= 2;
1410
+ if (d > 9)
1411
+ d -= 9;
1412
+ }
1413
+ sum += d;
1414
+ double = !double;
1415
+ }
1416
+ return sum % 10 === 0;
1417
+ }
1097
1418
  var PII_PATTERNS = [
1098
1419
  { kind: "email", regex: /\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/gi },
1099
- { kind: "payment-card", regex: /\b(?:\d[ -]*?){13,19}\b/g },
1420
+ {
1421
+ kind: "payment-card",
1422
+ regex: /\b(?:\d[ -]*?){13,19}\b/g,
1423
+ replacement: (candidate) => passesLuhn(candidate) ? "[REDACTED:payment-card]" : candidate
1424
+ },
1100
1425
  { kind: "phone", regex: /(?<![\w.])(?:\+?\d[\d ()-]{8,}\d)(?![\w.])/g }
1101
1426
  ];
1102
1427
  function redact(text, patterns) {
@@ -1104,15 +1429,22 @@ function redact(text, patterns) {
1104
1429
  let value = text;
1105
1430
  for (const pattern of patterns) {
1106
1431
  value = value.replace(pattern.regex, (...args) => {
1107
- counts.set(pattern.kind, (counts.get(pattern.kind) ?? 0) + 1);
1432
+ const match = String(args[0]);
1433
+ let replacement = "[REDACTED:" + pattern.kind + "]";
1108
1434
  if (pattern.replacement) {
1109
1435
  const groups = args.slice(1, -2).map(String);
1110
- return pattern.replacement(...groups);
1436
+ replacement = pattern.replacement(...groups, match);
1111
1437
  }
1112
- return "[REDACTED:" + pattern.kind + "]";
1438
+ if (replacement === match)
1439
+ return match;
1440
+ counts.set(pattern.kind, (counts.get(pattern.kind) ?? 0) + 1);
1441
+ return replacement;
1113
1442
  });
1114
1443
  }
1115
- return { value, findings: [...counts].map(([kind, count]) => ({ kind, count })) };
1444
+ return {
1445
+ value,
1446
+ findings: [...counts].map(([kind, count]) => ({ kind, count }))
1447
+ };
1116
1448
  }
1117
1449
  function mergeFindings(target, findings) {
1118
1450
  for (const finding of findings)
@@ -1142,7 +1474,6 @@ var SECRET_KEY_NAMES = {
1142
1474
  set_cookie: true,
1143
1475
  otp: true,
1144
1476
  one_time_password: true,
1145
- pin: true,
1146
1477
  passcode: true
1147
1478
  };
1148
1479
  function normalizeObjectKey(key) {
@@ -1208,7 +1539,7 @@ class SecretScrubber {
1208
1539
  const output = {};
1209
1540
  seen.set(value2, output);
1210
1541
  for (const [key, item] of Object.entries(value2)) {
1211
- const carriesSecret = typeof item === "string" ? item.length > 0 : item != null;
1542
+ const carriesSecret = typeof item === "string" && item.length >= 8;
1212
1543
  if (this.secretsEnabled && isSecretBearingKey(key) && carriesSecret) {
1213
1544
  output[key] = "[REDACTED:credential]";
1214
1545
  recordCredential();
@@ -1219,7 +1550,10 @@ class SecretScrubber {
1219
1550
  return output;
1220
1551
  };
1221
1552
  const value = visit(input);
1222
- return { value, findings: [...findings].map(([kind, count]) => ({ kind, count })) };
1553
+ return {
1554
+ value,
1555
+ findings: [...findings].map(([kind, count]) => ({ kind, count }))
1556
+ };
1223
1557
  }
1224
1558
  count() {
1225
1559
  return this.total;
@@ -1 +1 @@
1
- {"version":3,"file":"extraction.d.ts","sourceRoot":"","sources":["../../src/utils/extraction.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"extraction.d.ts","sourceRoot":"","sources":["../../src/utils/extraction.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"file-needles.d.ts","sourceRoot":"","sources":["../../src/utils/file-needles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAIhD,CAAC;AAEH,6EAA6E;AAC7E,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAEvC;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAgB3D;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAU9F;AAED,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAMxF"}
1
+ {"version":3,"file":"file-needles.d.ts","sourceRoot":"","sources":["../../src/utils/file-needles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAahD,CAAC;AAEH,6EAA6E;AAC7E,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAEvC;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAmB3D;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACrC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,SAAS,MAAM,EAAE,GACzB,MAAM,EAAE,CAUV;AAED,gFAAgF;AAChF,wBAAgB,oBAAoB,CACnC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,SAAS,MAAM,EAAE,GAC3B,OAAO,CA+BT"}
@@ -1 +1 @@
1
- {"version":3,"file":"file-ref-detect.d.ts","sourceRoot":"","sources":["../../src/utils/file-ref-detect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;;;GAIG;AACH,eAAO,MAAM,WAAW,QACoI,CAAC;AAE7J;;;;GAIG;AACH,eAAO,MAAM,UAAU,QAAuC,CAAC;AAE/D,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,QAAsB,CAAC;AAEzD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAa1D;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAGzD"}
1
+ {"version":3,"file":"file-ref-detect.d.ts","sourceRoot":"","sources":["../../src/utils/file-ref-detect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;;;GAIG;AACH,eAAO,MAAM,WAAW,QACoI,CAAC;AAE7J;;;;GAIG;AACH,eAAO,MAAM,UAAU,QAAuC,CAAC;AAE/D,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,QAAsB,CAAC;AAEzD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAa1D;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAWzD"}
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/utils/state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/utils/state.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-smart-compact",
3
- "version": "9.2.1",
3
+ "version": "9.3.0",
4
4
  "description": "Verification-oriented smart compaction extension for Pi Coding Agent — deterministic extraction, exploration, synthesis, verification, metrics, and safety checks.",
5
5
  "packageManager": "bun@1.3.14",
6
6
  "engines": {
@@ -58,7 +58,7 @@
58
58
  "telemetry-report": "bun run dist/telemetry-report.js",
59
59
  "compat:pi": "bun run scripts/check-pi-compat.ts",
60
60
  "release:audit": "bun run scripts/release-audit.ts",
61
- "release:check": "bun run typecheck && bun test && bun run gate && bun run bench && bun run build && bun run release:audit",
61
+ "release:check": "bun run typecheck && bun test && bun run gate && bun run bench && bun run build && bun run release:audit && bun run compat:pi latest",
62
62
  "typecheck": "bun x tsc --noEmit && bun x tsc -p tsconfig.scripts.json",
63
63
  "prepublishOnly": "bun run release:check"
64
64
  },