@bouncesecurity/aghast 0.4.4 → 0.6.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.
Files changed (109) hide show
  1. package/README.md +8 -3
  2. package/config/pricing.json +42 -0
  3. package/config/prompts/false-positive-validation.md +1 -0
  4. package/config/prompts/general-vuln-discovery.md +8 -3
  5. package/config/prompts/generic-instructions.md +3 -2
  6. package/dist/budget.d.ts +62 -0
  7. package/dist/budget.d.ts.map +1 -0
  8. package/dist/budget.js +137 -0
  9. package/dist/budget.js.map +1 -0
  10. package/dist/build-config.d.ts +15 -0
  11. package/dist/build-config.d.ts.map +1 -0
  12. package/dist/build-config.js +568 -0
  13. package/dist/build-config.js.map +1 -0
  14. package/dist/check-library.d.ts +1 -0
  15. package/dist/check-library.d.ts.map +1 -1
  16. package/dist/check-library.js +26 -7
  17. package/dist/check-library.js.map +1 -1
  18. package/dist/check-types.d.ts +1 -1
  19. package/dist/check-types.d.ts.map +1 -1
  20. package/dist/claude-code-provider.d.ts +6 -6
  21. package/dist/claude-code-provider.d.ts.map +1 -1
  22. package/dist/claude-code-provider.js +151 -66
  23. package/dist/claude-code-provider.js.map +1 -1
  24. package/dist/cli.js +19 -3
  25. package/dist/cli.js.map +1 -1
  26. package/dist/colors.js +4 -4
  27. package/dist/colors.js.map +1 -1
  28. package/dist/cost-calculator.d.ts +80 -0
  29. package/dist/cost-calculator.d.ts.map +1 -0
  30. package/dist/cost-calculator.js +226 -0
  31. package/dist/cost-calculator.js.map +1 -0
  32. package/dist/defaults.d.ts +21 -0
  33. package/dist/defaults.d.ts.map +1 -0
  34. package/dist/defaults.js +21 -0
  35. package/dist/defaults.js.map +1 -0
  36. package/dist/discoveries/openant-discovery.d.ts.map +1 -1
  37. package/dist/discoveries/openant-discovery.js +3 -2
  38. package/dist/discoveries/openant-discovery.js.map +1 -1
  39. package/dist/discoveries/sarif-discovery.d.ts.map +1 -1
  40. package/dist/discoveries/sarif-discovery.js +2 -1
  41. package/dist/discoveries/sarif-discovery.js.map +1 -1
  42. package/dist/discoveries/semgrep-discovery.d.ts.map +1 -1
  43. package/dist/discoveries/semgrep-discovery.js +11 -2
  44. package/dist/discoveries/semgrep-discovery.js.map +1 -1
  45. package/dist/discovery.d.ts +8 -2
  46. package/dist/discovery.d.ts.map +1 -1
  47. package/dist/discovery.js +8 -0
  48. package/dist/discovery.js.map +1 -1
  49. package/dist/error-codes.d.ts +3 -1
  50. package/dist/error-codes.d.ts.map +1 -1
  51. package/dist/error-codes.js +10 -3
  52. package/dist/error-codes.js.map +1 -1
  53. package/dist/formatters/types.d.ts +1 -1
  54. package/dist/formatters/types.js +1 -1
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +257 -82
  57. package/dist/index.js.map +1 -1
  58. package/dist/logging.d.ts +1 -1
  59. package/dist/logging.d.ts.map +1 -1
  60. package/dist/logging.js +50 -31
  61. package/dist/logging.js.map +1 -1
  62. package/dist/{mock-ai-provider.d.ts → mock-agent-provider.d.ts} +10 -7
  63. package/dist/mock-agent-provider.d.ts.map +1 -0
  64. package/dist/{mock-ai-provider.js → mock-agent-provider.js} +15 -8
  65. package/dist/mock-agent-provider.js.map +1 -0
  66. package/dist/new-check.js +2 -2
  67. package/dist/new-check.js.map +1 -1
  68. package/dist/opencode-provider.d.ts +63 -0
  69. package/dist/opencode-provider.d.ts.map +1 -0
  70. package/dist/opencode-provider.js +614 -0
  71. package/dist/opencode-provider.js.map +1 -0
  72. package/dist/prompt-template.d.ts.map +1 -1
  73. package/dist/prompt-template.js +2 -1
  74. package/dist/prompt-template.js.map +1 -1
  75. package/dist/provider-registry.d.ts +6 -6
  76. package/dist/provider-registry.d.ts.map +1 -1
  77. package/dist/provider-registry.js +6 -4
  78. package/dist/provider-registry.js.map +1 -1
  79. package/dist/provider-utils.d.ts +52 -0
  80. package/dist/provider-utils.d.ts.map +1 -0
  81. package/dist/provider-utils.js +40 -0
  82. package/dist/provider-utils.js.map +1 -0
  83. package/dist/response-parser.d.ts +8 -6
  84. package/dist/response-parser.d.ts.map +1 -1
  85. package/dist/response-parser.js +8 -6
  86. package/dist/response-parser.js.map +1 -1
  87. package/dist/runtime-config.d.ts +4 -4
  88. package/dist/runtime-config.d.ts.map +1 -1
  89. package/dist/runtime-config.js +107 -8
  90. package/dist/runtime-config.js.map +1 -1
  91. package/dist/scan-history.d.ts +82 -0
  92. package/dist/scan-history.d.ts.map +1 -0
  93. package/dist/scan-history.js +127 -0
  94. package/dist/scan-history.js.map +1 -0
  95. package/dist/scan-runner.d.ts +67 -4
  96. package/dist/scan-runner.d.ts.map +1 -1
  97. package/dist/scan-runner.js +267 -51
  98. package/dist/scan-runner.js.map +1 -1
  99. package/dist/stats.d.ts +11 -0
  100. package/dist/stats.d.ts.map +1 -0
  101. package/dist/stats.js +197 -0
  102. package/dist/stats.js.map +1 -0
  103. package/dist/types.d.ts +74 -8
  104. package/dist/types.d.ts.map +1 -1
  105. package/dist/types.js +3 -3
  106. package/dist/types.js.map +1 -1
  107. package/package.json +6 -4
  108. package/dist/mock-ai-provider.d.ts.map +0 -1
  109. package/dist/mock-ai-provider.js.map +0 -1
package/dist/cli.js CHANGED
@@ -20,8 +20,10 @@ process.env._AGHAST_CLI = '1';
20
20
  const USAGE = `Usage: aghast <command> [options]
21
21
 
22
22
  Commands:
23
- scan Run security checks against a repository
24
- new-check Scaffold a new security check
23
+ scan Run security checks against a repository
24
+ new-check Scaffold a new security check
25
+ build-config Build or edit a runtime-config.json (interactive or flag-driven)
26
+ stats Print a cost summary from the scan history
25
27
 
26
28
  Options:
27
29
  --help Show this help message
@@ -55,9 +57,13 @@ async function main() {
55
57
  process.on('SIGTERM', () => {
56
58
  process.exit(143);
57
59
  });
58
- printLogo();
59
60
  const args = process.argv.slice(2);
60
61
  const command = args[0];
62
+ // Skip the logo for `stats --json` so machine-readable output is parseable.
63
+ const isStatsJson = command === 'stats' && args.includes('--json');
64
+ if (!isStatsJson) {
65
+ printLogo();
66
+ }
61
67
  if (!command || command === '--help' || command === '-h') {
62
68
  console.log(USAGE);
63
69
  process.exit(0);
@@ -78,6 +84,16 @@ async function main() {
78
84
  await runNewCheck(subArgs);
79
85
  break;
80
86
  }
87
+ case 'build-config': {
88
+ const { runBuildConfig } = await import('./build-config.js');
89
+ await runBuildConfig(subArgs);
90
+ break;
91
+ }
92
+ case 'stats': {
93
+ const { runStats } = await import('./stats.js');
94
+ await runStats(subArgs);
95
+ break;
96
+ }
81
97
  default:
82
98
  console.error(formatError(ERROR_CODES.E1002, `Unknown command: ${command}`));
83
99
  console.error('');
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAEH,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAE9E,6EAA6E;AAC7E,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC;AAE9B,MAAM,KAAK,GAAG;;;;;;;;;;iEAUmD,CAAC;AAElE,SAAS,UAAU;IACjB,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;IAC9D,OAAO,GAAG,CAAC,OAAO,CAAC;AACrB,CAAC;AAED,SAAS,YAAY;IACnB,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IACvE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;IAC9C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,qCAAqC;IACrC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,SAAS,EAAE,CAAC;IAEZ,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAChD,YAAY,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE9B,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;YAC/C,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM;QACR,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;YACvD,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;YAC3B,MAAM;QACR,CAAC;QACD;YACE,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,EAAE,oBAAoB,OAAO,EAAE,CAAC,CAAC,CAAC;YAC7E,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClB,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;IAChG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/colors.js CHANGED
@@ -5,10 +5,10 @@
5
5
  import pc from 'picocolors';
6
6
  export function colorStatus(status) {
7
7
  switch (status) {
8
- case 'PASS': return pc.green(status);
9
- case 'FAIL': return pc.red(status);
10
- case 'FLAG': return pc.yellow(status);
11
- case 'ERROR': return pc.red(status);
8
+ case 'NO ISSUES DETECTED': return pc.green(status);
9
+ case 'ISSUES DETECTED': return pc.red(status);
10
+ case 'REVIEW REQUIRED': return pc.yellow(status);
11
+ case 'SCAN ERROR': return pc.red(status);
12
12
  default: return status;
13
13
  }
14
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"colors.js","sourceRoot":"","sources":["../src/colors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrC,KAAK,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACnC,KAAK,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtC,KAAK,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,CAAC,CAAC,OAAO,MAAM,CAAC;IACzB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../src/colors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,oBAAoB,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnD,KAAK,iBAAiB,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC9C,KAAK,iBAAiB,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjD,KAAK,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzC,OAAO,CAAC,CAAC,OAAO,MAAM,CAAC;IACzB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Cost calculator: maps token usage to estimated USD cost using per-model pricing.
3
+ *
4
+ * Pricing is loaded from `config/pricing.json` (built-in defaults) and may be
5
+ * overridden via the runtime config `pricing` section. Prices change over time
6
+ * and are not authoritative — they are estimates for budgeting/dashboarding.
7
+ */
8
+ import type { TokenUsage } from './types.js';
9
+ /** Per-million-token rates for a single model. */
10
+ export interface ModelPricing {
11
+ inputPerMillion: number;
12
+ outputPerMillion: number;
13
+ cacheReadPerMillion?: number;
14
+ cacheWritePerMillion?: number;
15
+ }
16
+ /** Pricing config (default file or runtime override). */
17
+ export interface PricingConfig {
18
+ currency?: string;
19
+ models: Record<string, ModelPricing>;
20
+ }
21
+ /** Computed cost for a single token-usage record. */
22
+ export interface CostBreakdown {
23
+ inputCost: number;
24
+ outputCost: number;
25
+ cacheReadCost?: number;
26
+ cacheWriteCost?: number;
27
+ totalCost: number;
28
+ currency: string;
29
+ /** How the cost was determined. */
30
+ source: 'reported' | 'estimated' | 'estimated-unpriced' | 'legacy';
31
+ /** When source === 'reported', which provider reported it. */
32
+ reportedBy?: 'claude-agent-sdk' | 'opencode';
33
+ /** true when running with AGHAST_LOCAL_CLAUDE=true — amount is API-equivalent, not billed */
34
+ coveredBySubscription?: boolean;
35
+ }
36
+ /**
37
+ * Calculate cost for a TokenUsage value.
38
+ *
39
+ * Priority:
40
+ * 1. tokens.reportedCost — provider-reported amount used verbatim (source='reported').
41
+ * 2. Rate-table fallback — model must exist in pricing.models; includes cache and
42
+ * reasoning tokens. Reasoning is billed at output rate (Decision 5).
43
+ * 3. Rate-table fallback but model unknown → source='estimated-unpriced', cost=$0 + warning.
44
+ * 4. tokens undefined → source='estimated', cost=$0.
45
+ */
46
+ export declare function calculateCost(tokens: TokenUsage | undefined, model: string, pricing: PricingConfig): CostBreakdown;
47
+ /**
48
+ * Sum a list of CostBreakdowns into one total. Returns zeros if list is empty.
49
+ * Currency is taken from the first non-empty entry (or USD by default).
50
+ */
51
+ export declare function sumCosts(costs: CostBreakdown[]): CostBreakdown;
52
+ /**
53
+ * Load the built-in pricing.json shipped with aghast.
54
+ *
55
+ * Behaviour:
56
+ * - File missing (ENOENT): return empty pricing silently. This is expected
57
+ * when running from a build that doesn't ship the file.
58
+ * - File present but unreadable / invalid JSON / wrong shape: log a warning
59
+ * and return empty pricing so the scan can still run. The empty pricing
60
+ * means cost is reported as 0 — distinct from a corrupt pricing file
61
+ * producing meaningless costs.
62
+ */
63
+ export declare function loadDefaultPricing(): Promise<PricingConfig>;
64
+ /**
65
+ * Merge a runtime-config override into a base pricing config.
66
+ * Per-model entries from the override replace those in the base. Unspecified
67
+ * models are inherited from the base.
68
+ */
69
+ export declare function mergePricing(base: PricingConfig, override?: Partial<PricingConfig>): PricingConfig;
70
+ /**
71
+ * Format a cost as a fixed-precision string with currency suffix.
72
+ * Used for CLI summaries.
73
+ */
74
+ export declare function formatCost(cost: number, currency?: string): string;
75
+ /**
76
+ * Map a CostBreakdown source (and optional reportedBy) to a human-readable
77
+ * label for banner / stats / JSON output.
78
+ */
79
+ export declare function formatCostSourceLabel(source: CostBreakdown['source'] | undefined, reportedBy?: CostBreakdown['reportedBy'], coveredBySubscription?: boolean): string;
80
+ //# sourceMappingURL=cost-calculator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-calculator.d.ts","sourceRoot":"","sources":["../src/cost-calculator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAM7C,kDAAkD;AAClD,MAAM,WAAW,YAAY;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,yDAAyD;AACzD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACtC;AAED,qDAAqD;AACrD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,oBAAoB,GAAG,QAAQ,CAAC;IACnE,8DAA8D;IAC9D,UAAU,CAAC,EAAE,kBAAkB,GAAG,UAAU,CAAC;IAC7C,6FAA6F;IAC7F,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAID;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,UAAU,GAAG,SAAS,EAC9B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,aAAa,GACrB,aAAa,CA+Cf;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,aAAa,CA8C9D;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,aAAa,CAAC,CA8CjE;AA4BD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAMlG;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAyB,GAAG,MAAM,CAGpF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,SAAS,EAC3C,UAAU,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC,EACxC,qBAAqB,CAAC,EAAE,OAAO,GAC9B,MAAM,CASR"}
@@ -0,0 +1,226 @@
1
+ /**
2
+ * Cost calculator: maps token usage to estimated USD cost using per-model pricing.
3
+ *
4
+ * Pricing is loaded from `config/pricing.json` (built-in defaults) and may be
5
+ * overridden via the runtime config `pricing` section. Prices change over time
6
+ * and are not authoritative — they are estimates for budgeting/dashboarding.
7
+ */
8
+ import { readFile } from 'node:fs/promises';
9
+ import { resolve, dirname } from 'node:path';
10
+ import { fileURLToPath } from 'node:url';
11
+ import { logWarn } from './logging.js';
12
+ const TAG = 'pricing';
13
+ const __dirname = dirname(fileURLToPath(import.meta.url));
14
+ const DEFAULT_CURRENCY = 'USD';
15
+ /**
16
+ * Calculate cost for a TokenUsage value.
17
+ *
18
+ * Priority:
19
+ * 1. tokens.reportedCost — provider-reported amount used verbatim (source='reported').
20
+ * 2. Rate-table fallback — model must exist in pricing.models; includes cache and
21
+ * reasoning tokens. Reasoning is billed at output rate (Decision 5).
22
+ * 3. Rate-table fallback but model unknown → source='estimated-unpriced', cost=$0 + warning.
23
+ * 4. tokens undefined → source='estimated', cost=$0.
24
+ */
25
+ export function calculateCost(tokens, model, pricing) {
26
+ const currency = pricing.currency ?? DEFAULT_CURRENCY;
27
+ if (tokens?.reportedCost !== undefined) {
28
+ return {
29
+ inputCost: 0,
30
+ outputCost: 0,
31
+ totalCost: tokens.reportedCost.amountUsd,
32
+ currency,
33
+ source: 'reported',
34
+ reportedBy: tokens.reportedCost.source,
35
+ ...(tokens.reportedCost.coveredBySubscription ? { coveredBySubscription: true } : {}),
36
+ };
37
+ }
38
+ if (!tokens) {
39
+ return { inputCost: 0, outputCost: 0, totalCost: 0, currency, source: 'estimated' };
40
+ }
41
+ const rates = pricing.models[model];
42
+ if (!rates) {
43
+ logWarn(TAG, `Model "${model}" not in pricing table; cost reported as $0`);
44
+ return { inputCost: 0, outputCost: 0, totalCost: 0, currency, source: 'estimated-unpriced' };
45
+ }
46
+ // Reasoning tokens billed at output rate (Decision 5).
47
+ const billableOutputTokens = tokens.outputTokens + (tokens.reasoningTokens ?? 0);
48
+ const inputCost = (tokens.inputTokens / 1_000_000) * rates.inputPerMillion;
49
+ const outputCost = (billableOutputTokens / 1_000_000) * rates.outputPerMillion;
50
+ const cacheReadCost = rates.cacheReadPerMillion !== undefined && tokens.cacheReadInputTokens !== undefined
51
+ ? (tokens.cacheReadInputTokens / 1_000_000) * rates.cacheReadPerMillion
52
+ : undefined;
53
+ const cacheWriteCost = rates.cacheWritePerMillion !== undefined && tokens.cacheCreationInputTokens !== undefined
54
+ ? (tokens.cacheCreationInputTokens / 1_000_000) * rates.cacheWritePerMillion
55
+ : undefined;
56
+ return {
57
+ inputCost,
58
+ outputCost,
59
+ cacheReadCost,
60
+ cacheWriteCost,
61
+ totalCost: inputCost + outputCost + (cacheReadCost ?? 0) + (cacheWriteCost ?? 0),
62
+ currency,
63
+ source: 'estimated',
64
+ };
65
+ }
66
+ /**
67
+ * Sum a list of CostBreakdowns into one total. Returns zeros if list is empty.
68
+ * Currency is taken from the first non-empty entry (or USD by default).
69
+ */
70
+ export function sumCosts(costs) {
71
+ if (costs.length === 0) {
72
+ return { inputCost: 0, outputCost: 0, totalCost: 0, currency: DEFAULT_CURRENCY, source: 'estimated' };
73
+ }
74
+ let inputCost = 0;
75
+ let outputCost = 0;
76
+ let cacheReadCost = 0;
77
+ let cacheWriteCost = 0;
78
+ // totalCost must be accumulated directly from each entry rather than derived as
79
+ // inputCost+outputCost at the end. Two reasons:
80
+ // 1. For 'reported' breakdowns, calculateCost returns inputCost=0/outputCost=0
81
+ // with the full amount in totalCost — deriving from the sub-fields drops it.
82
+ // 2. For 'estimated' breakdowns, totalCost includes cache costs (cacheReadCost,
83
+ // cacheWriteCost) that are not reflected in inputCost or outputCost.
84
+ let totalCost = 0;
85
+ for (const c of costs) {
86
+ inputCost += c.inputCost;
87
+ outputCost += c.outputCost;
88
+ cacheReadCost += c.cacheReadCost ?? 0;
89
+ cacheWriteCost += c.cacheWriteCost ?? 0;
90
+ totalCost += c.totalCost;
91
+ }
92
+ // Pick the most authoritative source across all summands.
93
+ // Precedence: reported > estimated > estimated-unpriced > legacy.
94
+ const SOURCE_PRIORITY = {
95
+ reported: 3,
96
+ estimated: 2,
97
+ 'estimated-unpriced': 1,
98
+ legacy: 0,
99
+ };
100
+ const dominant = costs.reduce((best, c) => SOURCE_PRIORITY[c.source] > SOURCE_PRIORITY[best.source] ? c : best);
101
+ // coveredBySubscription is true only when ALL summands are covered.
102
+ const allCovered = costs.every((c) => c.coveredBySubscription === true);
103
+ return {
104
+ inputCost,
105
+ outputCost,
106
+ ...(cacheReadCost > 0 ? { cacheReadCost } : {}),
107
+ ...(cacheWriteCost > 0 ? { cacheWriteCost } : {}),
108
+ totalCost,
109
+ currency: costs[0].currency,
110
+ source: dominant.source,
111
+ reportedBy: dominant.reportedBy,
112
+ ...(allCovered ? { coveredBySubscription: true } : {}),
113
+ };
114
+ }
115
+ /**
116
+ * Load the built-in pricing.json shipped with aghast.
117
+ *
118
+ * Behaviour:
119
+ * - File missing (ENOENT): return empty pricing silently. This is expected
120
+ * when running from a build that doesn't ship the file.
121
+ * - File present but unreadable / invalid JSON / wrong shape: log a warning
122
+ * and return empty pricing so the scan can still run. The empty pricing
123
+ * means cost is reported as 0 — distinct from a corrupt pricing file
124
+ * producing meaningless costs.
125
+ */
126
+ export async function loadDefaultPricing() {
127
+ // src/cost-calculator.ts -> ../config/pricing.json
128
+ const pricingPath = resolve(__dirname, '..', 'config', 'pricing.json');
129
+ let content;
130
+ try {
131
+ content = await readFile(pricingPath, 'utf-8');
132
+ }
133
+ catch (err) {
134
+ if (err.code !== 'ENOENT') {
135
+ logWarn(TAG, `Could not read pricing file at ${pricingPath} (${err instanceof Error ? err.message : String(err)}); cost estimates will be 0.`);
136
+ }
137
+ return { currency: DEFAULT_CURRENCY, models: {} };
138
+ }
139
+ let parsed;
140
+ try {
141
+ parsed = JSON.parse(content);
142
+ }
143
+ catch (err) {
144
+ logWarn(TAG, `Pricing file at ${pricingPath} contains invalid JSON (${err instanceof Error ? err.message : String(err)}); cost estimates will be 0.`);
145
+ return { currency: DEFAULT_CURRENCY, models: {} };
146
+ }
147
+ // JSON parsed, but the shape may still be wrong (e.g., null, an array, or a
148
+ // bare string). Normalize defensively and report shape errors with a
149
+ // distinct message so the user knows it's not a JSON-syntax problem.
150
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
151
+ logWarn(TAG, `Pricing file at ${pricingPath} did not contain a JSON object; cost estimates will be 0.`);
152
+ return { currency: DEFAULT_CURRENCY, models: {} };
153
+ }
154
+ try {
155
+ return normalizePricing(parsed);
156
+ }
157
+ catch (err) {
158
+ logWarn(TAG, `Pricing file at ${pricingPath} could not be parsed as a pricing config (${err instanceof Error ? err.message : String(err)}); cost estimates will be 0.`);
159
+ return { currency: DEFAULT_CURRENCY, models: {} };
160
+ }
161
+ }
162
+ /**
163
+ * Normalize a raw object into a PricingConfig, dropping unknown keys.
164
+ * Tolerant of extra fields (e.g. `_comment`).
165
+ */
166
+ function normalizePricing(raw) {
167
+ const currency = typeof raw.currency === 'string' ? raw.currency : DEFAULT_CURRENCY;
168
+ const models = {};
169
+ const rawModels = raw.models;
170
+ if (rawModels && typeof rawModels === 'object' && !Array.isArray(rawModels)) {
171
+ for (const [name, def] of Object.entries(rawModels)) {
172
+ if (def && typeof def === 'object' && !Array.isArray(def)) {
173
+ const d = def;
174
+ if (typeof d.inputPerMillion === 'number' && typeof d.outputPerMillion === 'number') {
175
+ models[name] = {
176
+ inputPerMillion: d.inputPerMillion,
177
+ outputPerMillion: d.outputPerMillion,
178
+ ...(typeof d.cacheReadPerMillion === 'number' ? { cacheReadPerMillion: d.cacheReadPerMillion } : {}),
179
+ ...(typeof d.cacheWritePerMillion === 'number' ? { cacheWritePerMillion: d.cacheWritePerMillion } : {}),
180
+ };
181
+ }
182
+ }
183
+ }
184
+ }
185
+ return { currency, models };
186
+ }
187
+ /**
188
+ * Merge a runtime-config override into a base pricing config.
189
+ * Per-model entries from the override replace those in the base. Unspecified
190
+ * models are inherited from the base.
191
+ */
192
+ export function mergePricing(base, override) {
193
+ if (!override)
194
+ return base;
195
+ return {
196
+ currency: override.currency ?? base.currency ?? DEFAULT_CURRENCY,
197
+ models: { ...base.models, ...(override.models ?? {}) },
198
+ };
199
+ }
200
+ /**
201
+ * Format a cost as a fixed-precision string with currency suffix.
202
+ * Used for CLI summaries.
203
+ */
204
+ export function formatCost(cost, currency = DEFAULT_CURRENCY) {
205
+ // 4 decimal places preserves sub-cent precision for individual checks.
206
+ return `${cost.toFixed(4)} ${currency}`;
207
+ }
208
+ /**
209
+ * Map a CostBreakdown source (and optional reportedBy) to a human-readable
210
+ * label for banner / stats / JSON output.
211
+ */
212
+ export function formatCostSourceLabel(source, reportedBy, coveredBySubscription) {
213
+ if (source === 'reported') {
214
+ if (coveredBySubscription)
215
+ return '(covered by subscription — claude-agent-sdk)';
216
+ if (reportedBy === 'opencode')
217
+ return '(reported by opencode — see docs/cost-tracking.md)';
218
+ return '(reported by claude-agent-sdk)';
219
+ }
220
+ if (source === 'estimated-unpriced')
221
+ return '(estimated — model not in pricing table)';
222
+ if (source === 'legacy')
223
+ return '(legacy estimate)';
224
+ return '(estimated from config/pricing.json)';
225
+ }
226
+ //# sourceMappingURL=cost-calculator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-calculator.js","sourceRoot":"","sources":["../src/cost-calculator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Central registry of scanner defaults used when a value is absent from CLI flags,
3
+ * environment variables, and runtime-config.json.
4
+ *
5
+ * These are surfaced to users by `aghast build-config`, and applied at runtime by
6
+ * the scanner. Single source of truth — do not duplicate these literals elsewhere.
7
+ *
8
+ * (Provider and model defaults live alongside their respective registries:
9
+ * `DEFAULT_PROVIDER_NAME` in `provider-registry.ts`, `DEFAULT_MODEL` in `types.ts`.)
10
+ */
11
+ /** Default output format for scan reports. */
12
+ export declare const DEFAULT_OUTPUT_FORMAT = "json";
13
+ /** Default console log level when none is specified. */
14
+ export declare const DEFAULT_LOG_LEVEL = "info";
15
+ /** Default log file handler type when --log-file is set without --log-type. */
16
+ export declare const DEFAULT_LOG_TYPE = "file";
17
+ /** Default generic prompt template filename prepended to check instructions. */
18
+ export declare const DEFAULT_GENERIC_PROMPT = "generic-instructions.md";
19
+ /** Default for whether the scan should exit non-zero on FAIL/ERROR results. */
20
+ export declare const DEFAULT_FAIL_ON_CHECK_FAILURE = false;
21
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,8CAA8C;AAC9C,eAAO,MAAM,qBAAqB,SAAS,CAAC;AAE5C,wDAAwD;AACxD,eAAO,MAAM,iBAAiB,SAAS,CAAC;AAExC,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,SAAS,CAAC;AAEvC,gFAAgF;AAChF,eAAO,MAAM,sBAAsB,4BAA4B,CAAC;AAEhE,+EAA+E;AAC/E,eAAO,MAAM,6BAA6B,QAAQ,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Central registry of scanner defaults used when a value is absent from CLI flags,
3
+ * environment variables, and runtime-config.json.
4
+ *
5
+ * These are surfaced to users by `aghast build-config`, and applied at runtime by
6
+ * the scanner. Single source of truth — do not duplicate these literals elsewhere.
7
+ *
8
+ * (Provider and model defaults live alongside their respective registries:
9
+ * `DEFAULT_PROVIDER_NAME` in `provider-registry.ts`, `DEFAULT_MODEL` in `types.ts`.)
10
+ */
11
+ /** Default output format for scan reports. */
12
+ export const DEFAULT_OUTPUT_FORMAT = 'json';
13
+ /** Default console log level when none is specified. */
14
+ export const DEFAULT_LOG_LEVEL = 'info';
15
+ /** Default log file handler type when --log-file is set without --log-type. */
16
+ export const DEFAULT_LOG_TYPE = 'file';
17
+ /** Default generic prompt template filename prepended to check instructions. */
18
+ export const DEFAULT_GENERIC_PROMPT = 'generic-instructions.md';
19
+ /** Default for whether the scan should exit non-zero on FAIL/ERROR results. */
20
+ export const DEFAULT_FAIL_ON_CHECK_FAILURE = false;
21
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,8CAA8C;AAC9C,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAE5C,wDAAwD;AACxD,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAExC,+EAA+E;AAC/E,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEvC,gFAAgF;AAChF,MAAM,CAAC,MAAM,sBAAsB,GAAG,yBAAyB,CAAC;AAEhE,+EAA+E;AAC/E,MAAM,CAAC,MAAM,6BAA6B,GAAG,KAAK,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"openant-discovery.d.ts","sourceRoot":"","sources":["../../src/discoveries/openant-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAsC,MAAM,iBAAiB,CAAC;AAK3F,eAAO,MAAM,gBAAgB,EAAE,eAuC9B,CAAC"}
1
+ {"version":3,"file":"openant-discovery.d.ts","sourceRoot":"","sources":["../../src/discoveries/openant-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAsC,MAAM,iBAAiB,CAAC;AAK3F,eAAO,MAAM,gBAAgB,EAAE,eAuC9B,CAAC"}
@@ -8,10 +8,11 @@
8
8
  import { runOpenAnt } from '../openant-runner.js';
9
9
  import { loadDatasetFromFile, filterUnits, formatUnitPromptSection } from '../openant-loader.js';
10
10
  import { logProgress, logDebug } from '../logging.js';
11
+ import { DEFAULT_GENERIC_PROMPT } from '../defaults.js';
11
12
  const TAG = 'openant-discovery';
12
13
  export const openantDiscovery = {
13
14
  name: 'openant',
14
- defaultGenericPrompt: 'generic-instructions.md',
15
+ defaultGenericPrompt: DEFAULT_GENERIC_PROMPT,
15
16
  needsInstructions: true,
16
17
  async discover(check, repoPath, _options) {
17
18
  const checkTarget = check.checkTarget;
@@ -31,7 +32,7 @@ export const openantDiscovery = {
31
32
  endLine: origin.end_line,
32
33
  label: `[unit ${idx + 1}/${units.length}]`,
33
34
  promptEnrichment: formatUnitPromptSection(unit),
34
- aiOptions: { maxTurns: 20 },
35
+ agentOptions: { maxTurns: 20 },
35
36
  };
36
37
  });
37
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"openant-discovery.js","sourceRoot":"","sources":["../../src/discoveries/openant-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAItD,MAAM,GAAG,GAAG,mBAAmB,CAAC;AAEhC,MAAM,CAAC,MAAM,gBAAgB,GAAoB;IAC/C,IAAI,EAAE,SAAS;IACf,oBAAoB,EAAE,yBAAyB;IAC/C,iBAAiB,EAAE,IAAI;IAEvB,KAAK,CAAC,QAAQ,CACZ,KAAoB,EACpB,QAAgB,EAChB,QAA2B;QAE3B,MAAM,WAAW,GAAG,KAAK,CAAC,WAAY,CAAC;QAEvC,kCAAkC;QAClC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAE5D,IAAI,CAAC;YACH,wBAAwB;YACxB,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAC;YACvD,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;YACxC,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;YAE9D,WAAW,CAAC,GAAG,EAAE,UAAU,UAAU,WAAW,KAAK,CAAC,MAAM,mBAAmB,CAAC,CAAC;YAEjF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;gBAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;gBACxC,OAAO;oBACL,IAAI,EAAE,MAAM,CAAC,SAAS;oBACtB,SAAS,EAAE,MAAM,CAAC,UAAU;oBAC5B,OAAO,EAAE,MAAM,CAAC,QAAQ;oBACxB,KAAK,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG;oBAC1C,gBAAgB,EAAE,uBAAuB,CAAC,IAAI,CAAC;oBAC/C,SAAS,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;iBAC5B,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,EAAE,CAAC;YAChB,QAAQ,CAAC,GAAG,EAAE,qCAAqC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"openant-discovery.js","sourceRoot":"","sources":["../../src/discoveries/openant-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAIxD,MAAM,GAAG,GAAG,mBAAmB,CAAC;AAEhC,MAAM,CAAC,MAAM,gBAAgB,GAAoB;IAC/C,IAAI,EAAE,SAAS;IACf,oBAAoB,EAAE,sBAAsB;IAC5C,iBAAiB,EAAE,IAAI;IAEvB,KAAK,CAAC,QAAQ,CACZ,KAAoB,EACpB,QAAgB,EAChB,QAA2B;QAE3B,MAAM,WAAW,GAAG,KAAK,CAAC,WAAY,CAAC;QAEvC,kCAAkC;QAClC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAE5D,IAAI,CAAC;YACH,wBAAwB;YACxB,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAC;YACvD,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;YACxC,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;YAE9D,WAAW,CAAC,GAAG,EAAE,UAAU,UAAU,WAAW,KAAK,CAAC,MAAM,mBAAmB,CAAC,CAAC;YAEjF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;gBAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;gBACxC,OAAO;oBACL,IAAI,EAAE,MAAM,CAAC,SAAS;oBACtB,SAAS,EAAE,MAAM,CAAC,UAAU;oBAC5B,OAAO,EAAE,MAAM,CAAC,QAAQ;oBACxB,KAAK,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG;oBAC1C,gBAAgB,EAAE,uBAAuB,CAAC,IAAI,CAAC;oBAC/C,YAAY,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;iBAC/B,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,EAAE,CAAC;YAChB,QAAQ,CAAC,GAAG,EAAE,qCAAqC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"sarif-discovery.d.ts","sourceRoot":"","sources":["../../src/discoveries/sarif-discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAsC,MAAM,iBAAiB,CAAC;AA0B3F,eAAO,MAAM,cAAc,EAAE,eA6C5B,CAAC"}
1
+ {"version":3,"file":"sarif-discovery.d.ts","sourceRoot":"","sources":["../../src/discoveries/sarif-discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EAAE,eAAe,EAAsC,MAAM,iBAAiB,CAAC;AA0B3F,eAAO,MAAM,cAAc,EAAE,eA6C5B,CAAC"}
@@ -9,6 +9,7 @@ import { resolve } from 'node:path';
9
9
  import { parseSARIF, deduplicateTargets } from '../sarif-parser.js';
10
10
  import { logDebug } from '../logging.js';
11
11
  import { ERROR_CODES, formatError } from '../error-codes.js';
12
+ import { DEFAULT_GENERIC_PROMPT } from '../defaults.js';
12
13
  const TAG = 'sarif-discovery';
13
14
  function buildFindingPromptEnrichment(file, startLine, endLine, message, snippet) {
14
15
  const snippetSection = snippet ? `\n- Code snippet from tool: ${snippet}` : '';
@@ -26,7 +27,7 @@ You MUST:
26
27
  }
27
28
  export const sarifDiscovery = {
28
29
  name: 'sarif',
29
- defaultGenericPrompt: 'generic-instructions.md',
30
+ defaultGenericPrompt: DEFAULT_GENERIC_PROMPT,
30
31
  needsInstructions: true,
31
32
  async discover(check, repoPath, _options) {
32
33
  const checkTarget = check.checkTarget;
@@ -1 +1 @@
1
- {"version":3,"file":"sarif-discovery.js","sourceRoot":"","sources":["../../src/discoveries/sarif-discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAI7D,MAAM,GAAG,GAAG,iBAAiB,CAAC;AAE9B,SAAS,4BAA4B,CACnC,IAAY,EACZ,SAAiB,EACjB,OAAe,EACf,OAAe,EACf,OAAgB;IAEhB,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,+BAA+B,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/E,OAAO;;UAEC,IAAI;WACH,SAAS,IAAI,OAAO;gCACC,OAAO,GAAG,cAAc;;;;;;CAMvD,CAAC;AACF,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC7C,IAAI,EAAE,OAAO;IACb,oBAAoB,EAAE,yBAAyB;IAC/C,iBAAiB,EAAE,IAAI;IAEvB,KAAK,CAAC,QAAQ,CACZ,KAAoB,EACpB,QAAgB,EAChB,QAA2B;QAE3B,MAAM,WAAW,GAAG,KAAK,CAAC,WAAY,CAAC;QAEvC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,WAAW,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,KAAK,CAAC,EAAE,uEAAuE,CAAC,CAC1H,CAAC;QACJ,CAAC;QAED,gDAAgD;QAChD,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;QAE/D,QAAQ,CAAC,GAAG,EAAE,uBAAuB,aAAa,EAAE,CAAC,CAAC;QACtD,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAE5D,IAAI,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;QACvC,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAEtC,QAAQ,CAAC,GAAG,EAAE,cAAc,OAAO,CAAC,MAAM,WAAW,CAAC,CAAC;QAEvD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YACnC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,YAAY,GAAG,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG;YAC/C,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,gBAAgB,EAAE,4BAA4B,CAC5C,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,OAAO,CACf;SACF,CAAC,CAAC,CAAC;IACN,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"sarif-discovery.js","sourceRoot":"","sources":["../../src/discoveries/sarif-discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAIxD,MAAM,GAAG,GAAG,iBAAiB,CAAC;AAE9B,SAAS,4BAA4B,CACnC,IAAY,EACZ,SAAiB,EACjB,OAAe,EACf,OAAe,EACf,OAAgB;IAEhB,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,+BAA+B,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/E,OAAO;;UAEC,IAAI;WACH,SAAS,IAAI,OAAO;gCACC,OAAO,GAAG,cAAc;;;;;;CAMvD,CAAC;AACF,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC7C,IAAI,EAAE,OAAO;IACb,oBAAoB,EAAE,sBAAsB;IAC5C,iBAAiB,EAAE,IAAI;IAEvB,KAAK,CAAC,QAAQ,CACZ,KAAoB,EACpB,QAAgB,EAChB,QAA2B;QAE3B,MAAM,WAAW,GAAG,KAAK,CAAC,WAAY,CAAC;QAEvC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,WAAW,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,KAAK,CAAC,EAAE,uEAAuE,CAAC,CAC1H,CAAC;QACJ,CAAC;QAED,gDAAgD;QAChD,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;QAE/D,QAAQ,CAAC,GAAG,EAAE,uBAAuB,aAAa,EAAE,CAAC,CAAC;QACtD,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAE5D,IAAI,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;QACvC,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAEtC,QAAQ,CAAC,GAAG,EAAE,cAAc,OAAO,CAAC,MAAM,WAAW,CAAC,CAAC;QAEvD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YACnC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,YAAY,GAAG,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG;YAC/C,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,gBAAgB,EAAE,4BAA4B,CAC5C,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,OAAO,CACf;SACF,CAAC,CAAC,CAAC;IACN,CAAC;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"semgrep-discovery.d.ts","sourceRoot":"","sources":["../../src/discoveries/semgrep-discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAsC,MAAM,iBAAiB,CAAC;AAoB3F,eAAO,MAAM,gBAAgB,EAAE,eAmC9B,CAAC"}
1
+ {"version":3,"file":"semgrep-discovery.d.ts","sourceRoot":"","sources":["../../src/discoveries/semgrep-discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAsC,MAAM,iBAAiB,CAAC;AA4B3F,eAAO,MAAM,gBAAgB,EAAE,eAmC9B,CAAC"}
@@ -7,6 +7,7 @@
7
7
  import { runSemgrep } from '../semgrep-runner.js';
8
8
  import { parseSARIF, deduplicateTargets } from '../sarif-parser.js';
9
9
  import { logDebug } from '../logging.js';
10
+ import { DEFAULT_GENERIC_PROMPT } from '../defaults.js';
10
11
  const TAG = 'semgrep-discovery';
11
12
  function buildTargetPromptEnrichment(file, startLine, endLine) {
12
13
  return `\n\nTARGET LOCATION:
@@ -18,13 +19,21 @@ You are analyzing a specific code location:
18
19
  You MUST:
19
20
  - Analyze ONLY this specific target location — do not search for or report issues at other locations
20
21
  - You may read other files to understand context (e.g., imports, type definitions, data flow), but only report issues for this target
21
- - If the code at this location is not vulnerable, return {"issues": []}
22
+ - If the code at this location is not vulnerable, return {"issues": []} — do not "spend" the target by reporting an issue you noticed somewhere else in the file
22
23
  - Do NOT scan the broader repository for other instances of this vulnerability pattern
24
+
25
+ REPORTING RULES (strict — these prevent cross-target hallucinations):
26
+ - Each reported issue's "file"/"startLine"/"endLine" MUST point at this target's range above, OR at a line inside a function this target directly/transitively calls. They must NOT point at a sibling location (e.g. another function, another route handler, another class) that simply happens to live in the same file. If that sibling is genuinely vulnerable, it has its own target run — leave it alone here.
27
+
28
+ DESCRIPTION OPENING (mandatory output contract):
29
+ - Your description's first heading MUST identify the entry point this target represents — its function name, route path+verb, class method, or equivalent — exactly as it appears in the source. For example: a route handler → "## Missing X in DELETE /:id"; a function → "## Missing X in processPayment".
30
+ - The rest of the description must then describe THAT specific symbol's vulnerability — not a sibling's. If, while writing, you find yourself describing a different route/function than the one you opened with, stop: you are hallucinating across targets. Discard the issue and return {"issues": []}.
31
+ - If you noticed a real vulnerability while reading the file but it is in a sibling location, do NOT smuggle it into this target's report. That sibling has its own target run.
23
32
  `;
24
33
  }
25
34
  export const semgrepDiscovery = {
26
35
  name: 'semgrep',
27
- defaultGenericPrompt: 'generic-instructions.md',
36
+ defaultGenericPrompt: DEFAULT_GENERIC_PROMPT,
28
37
  needsInstructions: true,
29
38
  async discover(check, repoPath, _options) {
30
39
  const checkTarget = check.checkTarget;
@@ -1 +1 @@
1
- {"version":3,"file":"semgrep-discovery.js","sourceRoot":"","sources":["../../src/discoveries/semgrep-discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAIzC,MAAM,GAAG,GAAG,mBAAmB,CAAC;AAEhC,SAAS,2BAA2B,CAAC,IAAY,EAAE,SAAiB,EAAE,OAAe;IACnF,OAAO;;;UAGC,IAAI;WACH,SAAS,IAAI,OAAO;;;;;;;CAO9B,CAAC;AACF,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAoB;IAC/C,IAAI,EAAE,SAAS;IACf,oBAAoB,EAAE,yBAAyB;IAC/C,iBAAiB,EAAE,IAAI;IAEvB,KAAK,CAAC,QAAQ,CACZ,KAAoB,EACpB,QAAgB,EAChB,QAA2B;QAE3B,MAAM,WAAW,GAAG,KAAK,CAAC,WAAY,CAAC;QAEvC,QAAQ,CAAC,GAAG,EAAE,8BAA8B,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAExD,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC;YACpC,cAAc,EAAE,QAAQ;YACxB,KAAK,EAAE,WAAW,CAAC,KAAK;YACxB,MAAM,EAAE,WAAW,CAAC,MAAM;SAC3B,CAAC,CAAC;QAEH,IAAI,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;QACvC,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAEtC,QAAQ,CAAC,GAAG,EAAE,cAAc,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;QAEtD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YACnC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,WAAW,GAAG,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG;YAC9C,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,gBAAgB,EAAE,2BAA2B,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC;SAC7F,CAAC,CAAC,CAAC;IACN,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"semgrep-discovery.js","sourceRoot":"","sources":["../../src/discoveries/semgrep-discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAIxD,MAAM,GAAG,GAAG,mBAAmB,CAAC;AAEhC,SAAS,2BAA2B,CAAC,IAAY,EAAE,SAAiB,EAAE,OAAe;IACnF,OAAO;;;UAGC,IAAI;WACH,SAAS,IAAI,OAAO;;;;;;;;;;;;;;;CAe9B,CAAC;AACF,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAoB;IAC/C,IAAI,EAAE,SAAS;IACf,oBAAoB,EAAE,sBAAsB;IAC5C,iBAAiB,EAAE,IAAI;IAEvB,KAAK,CAAC,QAAQ,CACZ,KAAoB,EACpB,QAAgB,EAChB,QAA2B;QAE3B,MAAM,WAAW,GAAG,KAAK,CAAC,WAAY,CAAC;QAEvC,QAAQ,CAAC,GAAG,EAAE,8BAA8B,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAExD,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC;YACpC,cAAc,EAAE,QAAQ;YACxB,KAAK,EAAE,WAAW,CAAC,KAAK;YACxB,MAAM,EAAE,WAAW,CAAC,MAAM;SAC3B,CAAC,CAAC;QAEH,IAAI,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;QACvC,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAEtC,QAAQ,CAAC,GAAG,EAAE,cAAc,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;QAEtD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YACnC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,WAAW,GAAG,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG;YAC9C,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,gBAAgB,EAAE,2BAA2B,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC;SAC7F,CAAC,CAAC,CAAC;IACN,CAAC;CACF,CAAC"}
@@ -21,8 +21,8 @@ export interface DiscoveredTarget {
21
21
  label: string;
22
22
  /** Extra context appended to prompt per target (e.g. call graph for openant, finding details for sarif). */
23
23
  promptEnrichment?: string;
24
- /** Discovery-specific AI provider options (e.g. maxTurns for openant). */
25
- aiOptions?: {
24
+ /** Discovery-specific agent provider options (e.g. maxTurns for openant). */
25
+ agentOptions?: {
26
26
  maxTurns?: number;
27
27
  };
28
28
  /** Message from the discovery tool (e.g. Semgrep finding description). */
@@ -71,4 +71,10 @@ export declare function getRegisteredDiscoveries(): string[];
71
71
  * Clear all registered discoveries. For testing only.
72
72
  */
73
73
  export declare function clearDiscoveryRegistry(): void;
74
+ /**
75
+ * Remove a single discovery by name. Returns true if the entry existed.
76
+ * Intended for tests that want to register a one-off discovery and clean
77
+ * it up without disturbing the standard registrations.
78
+ */
79
+ export declare function unregisterDiscovery(name: string): boolean;
74
80
  //# sourceMappingURL=discovery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAKhD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,4GAA4G;IAC5G,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,0EAA0E;IAC1E,SAAS,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClC,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qCAAqC;IACrC,cAAc,EAAE,MAAM,CAAC;CACxB;AAID;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,wEAAwE;IACxE,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC;;;OAGG;IACH,QAAQ,CACN,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;CAChC;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI,CAElE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAS1D;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,EAAE,CAEnD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAKhD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,4GAA4G;IAC5G,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6EAA6E;IAC7E,YAAY,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qCAAqC;IACrC,cAAc,EAAE,MAAM,CAAC;CACxB;AAID;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,wEAAwE;IACxE,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC;;;OAGG;IACH,QAAQ,CACN,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;CAChC;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI,CAElE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAS1D;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,EAAE,CAEnD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD"}
package/dist/discovery.js CHANGED
@@ -38,4 +38,12 @@ export function getRegisteredDiscoveries() {
38
38
  export function clearDiscoveryRegistry() {
39
39
  discoveryRegistry.clear();
40
40
  }
41
+ /**
42
+ * Remove a single discovery by name. Returns true if the entry existed.
43
+ * Intended for tests that want to register a one-off discovery and clean
44
+ * it up without disturbing the standard registrations.
45
+ */
46
+ export function unregisterDiscovery(name) {
47
+ return discoveryRegistry.delete(name);
48
+ }
41
49
  //# sourceMappingURL=discovery.js.map