@owasp-aghast/aghast 0.8.0-beta.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 (178) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +127 -0
  3. package/assets/img/aghastowaspcaption.png +0 -0
  4. package/assets/txt/logo.txt +52 -0
  5. package/config/pricing.json +42 -0
  6. package/config/prompts/false-positive-validation.md +78 -0
  7. package/config/prompts/general-vuln-discovery.md +99 -0
  8. package/config/prompts/generic-instructions.md +59 -0
  9. package/config/prompts/test-cheaper-instructions.md +57 -0
  10. package/dist/budget.d.ts +62 -0
  11. package/dist/budget.d.ts.map +1 -0
  12. package/dist/budget.js +137 -0
  13. package/dist/budget.js.map +1 -0
  14. package/dist/build-config.d.ts +15 -0
  15. package/dist/build-config.d.ts.map +1 -0
  16. package/dist/build-config.js +568 -0
  17. package/dist/build-config.js.map +1 -0
  18. package/dist/check-library.d.ts +88 -0
  19. package/dist/check-library.d.ts.map +1 -0
  20. package/dist/check-library.js +461 -0
  21. package/dist/check-library.js.map +1 -0
  22. package/dist/check-types.d.ts +35 -0
  23. package/dist/check-types.d.ts.map +1 -0
  24. package/dist/check-types.js +66 -0
  25. package/dist/check-types.js.map +1 -0
  26. package/dist/claude-code-provider.d.ts +29 -0
  27. package/dist/claude-code-provider.d.ts.map +1 -0
  28. package/dist/claude-code-provider.js +347 -0
  29. package/dist/claude-code-provider.js.map +1 -0
  30. package/dist/cli.d.ts +13 -0
  31. package/dist/cli.d.ts.map +1 -0
  32. package/dist/cli.js +109 -0
  33. package/dist/cli.js.map +1 -0
  34. package/dist/colors.d.ts +7 -0
  35. package/dist/colors.d.ts.map +1 -0
  36. package/dist/colors.js +18 -0
  37. package/dist/colors.js.map +1 -0
  38. package/dist/cost-calculator.d.ts +80 -0
  39. package/dist/cost-calculator.d.ts.map +1 -0
  40. package/dist/cost-calculator.js +226 -0
  41. package/dist/cost-calculator.js.map +1 -0
  42. package/dist/defaults.d.ts +21 -0
  43. package/dist/defaults.d.ts.map +1 -0
  44. package/dist/defaults.js +21 -0
  45. package/dist/defaults.js.map +1 -0
  46. package/dist/diff-filter.d.ts +50 -0
  47. package/dist/diff-filter.d.ts.map +1 -0
  48. package/dist/diff-filter.js +130 -0
  49. package/dist/diff-filter.js.map +1 -0
  50. package/dist/diff-parser.d.ts +40 -0
  51. package/dist/diff-parser.d.ts.map +1 -0
  52. package/dist/diff-parser.js +112 -0
  53. package/dist/diff-parser.js.map +1 -0
  54. package/dist/diff-unit-matcher.d.ts +53 -0
  55. package/dist/diff-unit-matcher.d.ts.map +1 -0
  56. package/dist/diff-unit-matcher.js +156 -0
  57. package/dist/diff-unit-matcher.js.map +1 -0
  58. package/dist/discoveries/openant-discovery.d.ts +10 -0
  59. package/dist/discoveries/openant-discovery.d.ts.map +1 -0
  60. package/dist/discoveries/openant-discovery.js +56 -0
  61. package/dist/discoveries/openant-discovery.js.map +1 -0
  62. package/dist/discoveries/sarif-discovery.d.ts +9 -0
  63. package/dist/discoveries/sarif-discovery.d.ts.map +1 -0
  64. package/dist/discoveries/sarif-discovery.js +56 -0
  65. package/dist/discoveries/sarif-discovery.js.map +1 -0
  66. package/dist/discoveries/semgrep-discovery.d.ts +9 -0
  67. package/dist/discoveries/semgrep-discovery.d.ts.map +1 -0
  68. package/dist/discoveries/semgrep-discovery.js +61 -0
  69. package/dist/discoveries/semgrep-discovery.js.map +1 -0
  70. package/dist/discovery.d.ts +100 -0
  71. package/dist/discovery.d.ts.map +1 -0
  72. package/dist/discovery.js +49 -0
  73. package/dist/discovery.js.map +1 -0
  74. package/dist/error-codes.d.ts +46 -0
  75. package/dist/error-codes.d.ts.map +1 -0
  76. package/dist/error-codes.js +70 -0
  77. package/dist/error-codes.js.map +1 -0
  78. package/dist/formatters/index.d.ts +10 -0
  79. package/dist/formatters/index.d.ts.map +1 -0
  80. package/dist/formatters/index.js +23 -0
  81. package/dist/formatters/index.js.map +1 -0
  82. package/dist/formatters/json-formatter.d.ts +11 -0
  83. package/dist/formatters/json-formatter.d.ts.map +1 -0
  84. package/dist/formatters/json-formatter.js +11 -0
  85. package/dist/formatters/json-formatter.js.map +1 -0
  86. package/dist/formatters/sarif-formatter.d.ts +18 -0
  87. package/dist/formatters/sarif-formatter.d.ts.map +1 -0
  88. package/dist/formatters/sarif-formatter.js +103 -0
  89. package/dist/formatters/sarif-formatter.js.map +1 -0
  90. package/dist/formatters/types.d.ts +11 -0
  91. package/dist/formatters/types.d.ts.map +1 -0
  92. package/dist/formatters/types.js +6 -0
  93. package/dist/formatters/types.js.map +1 -0
  94. package/dist/index.d.ts +7 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +754 -0
  97. package/dist/index.js.map +1 -0
  98. package/dist/logging.d.ts +140 -0
  99. package/dist/logging.d.ts.map +1 -0
  100. package/dist/logging.js +344 -0
  101. package/dist/logging.js.map +1 -0
  102. package/dist/mock-agent-provider.d.ts +24 -0
  103. package/dist/mock-agent-provider.d.ts.map +1 -0
  104. package/dist/mock-agent-provider.js +38 -0
  105. package/dist/mock-agent-provider.js.map +1 -0
  106. package/dist/mock-ai-provider.d.ts +21 -0
  107. package/dist/mock-ai-provider.d.ts.map +1 -0
  108. package/dist/mock-ai-provider.js +31 -0
  109. package/dist/mock-ai-provider.js.map +1 -0
  110. package/dist/new-check.d.ts +13 -0
  111. package/dist/new-check.d.ts.map +1 -0
  112. package/dist/new-check.js +515 -0
  113. package/dist/new-check.js.map +1 -0
  114. package/dist/openant-loader.d.ts +105 -0
  115. package/dist/openant-loader.d.ts.map +1 -0
  116. package/dist/openant-loader.js +135 -0
  117. package/dist/openant-loader.js.map +1 -0
  118. package/dist/openant-runner.d.ts +30 -0
  119. package/dist/openant-runner.d.ts.map +1 -0
  120. package/dist/openant-runner.js +113 -0
  121. package/dist/openant-runner.js.map +1 -0
  122. package/dist/opencode-provider.d.ts +63 -0
  123. package/dist/opencode-provider.d.ts.map +1 -0
  124. package/dist/opencode-provider.js +719 -0
  125. package/dist/opencode-provider.js.map +1 -0
  126. package/dist/prompt-template.d.ts +12 -0
  127. package/dist/prompt-template.d.ts.map +1 -0
  128. package/dist/prompt-template.js +36 -0
  129. package/dist/prompt-template.js.map +1 -0
  130. package/dist/provider-registry.d.ts +15 -0
  131. package/dist/provider-registry.d.ts.map +1 -0
  132. package/dist/provider-registry.js +29 -0
  133. package/dist/provider-registry.js.map +1 -0
  134. package/dist/provider-utils.d.ts +52 -0
  135. package/dist/provider-utils.d.ts.map +1 -0
  136. package/dist/provider-utils.js +40 -0
  137. package/dist/provider-utils.js.map +1 -0
  138. package/dist/repository-analyzer.d.ts +68 -0
  139. package/dist/repository-analyzer.d.ts.map +1 -0
  140. package/dist/repository-analyzer.js +238 -0
  141. package/dist/repository-analyzer.js.map +1 -0
  142. package/dist/response-parser.d.ts +14 -0
  143. package/dist/response-parser.d.ts.map +1 -0
  144. package/dist/response-parser.js +111 -0
  145. package/dist/response-parser.js.map +1 -0
  146. package/dist/runtime-config.d.ts +15 -0
  147. package/dist/runtime-config.d.ts.map +1 -0
  148. package/dist/runtime-config.js +187 -0
  149. package/dist/runtime-config.js.map +1 -0
  150. package/dist/sarif-parser.d.ts +20 -0
  151. package/dist/sarif-parser.d.ts.map +1 -0
  152. package/dist/sarif-parser.js +76 -0
  153. package/dist/sarif-parser.js.map +1 -0
  154. package/dist/scan-history.d.ts +82 -0
  155. package/dist/scan-history.d.ts.map +1 -0
  156. package/dist/scan-history.js +127 -0
  157. package/dist/scan-history.js.map +1 -0
  158. package/dist/scan-runner.d.ts +122 -0
  159. package/dist/scan-runner.d.ts.map +1 -0
  160. package/dist/scan-runner.js +928 -0
  161. package/dist/scan-runner.js.map +1 -0
  162. package/dist/semgrep-runner.d.ts +25 -0
  163. package/dist/semgrep-runner.d.ts.map +1 -0
  164. package/dist/semgrep-runner.js +100 -0
  165. package/dist/semgrep-runner.js.map +1 -0
  166. package/dist/snippet-extractor.d.ts +25 -0
  167. package/dist/snippet-extractor.d.ts.map +1 -0
  168. package/dist/snippet-extractor.js +56 -0
  169. package/dist/snippet-extractor.js.map +1 -0
  170. package/dist/stats.d.ts +11 -0
  171. package/dist/stats.d.ts.map +1 -0
  172. package/dist/stats.js +197 -0
  173. package/dist/stats.js.map +1 -0
  174. package/dist/types.d.ts +321 -0
  175. package/dist/types.d.ts.map +1 -0
  176. package/dist/types.js +19 -0
  177. package/dist/types.js.map +1 -0
  178. package/package.json +61 -0
package/dist/budget.js ADDED
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Budget controls: per-scan and per-period token/cost limits.
3
+ *
4
+ * `checkBudget` is called before each AI invocation in the scan runner with
5
+ * the current accumulated cost. It returns one of:
6
+ * - `continue` — under the warn threshold, proceed silently.
7
+ * - `warn` — at or above the warn threshold but below the abort threshold.
8
+ * - `abort` — at or above the abort threshold; the scan should stop.
9
+ *
10
+ * Period limits are computed against historical scan records (from
11
+ * scan-history.ts) plus the in-flight scan's accumulated cost.
12
+ */
13
+ const DEFAULT_WARN_AT = 0.8;
14
+ const DEFAULT_ABORT_AT = 1.0;
15
+ /**
16
+ * Compute the start of the current budget window for `now`.
17
+ */
18
+ function windowStart(now, window) {
19
+ const d = new Date(now);
20
+ d.setUTCHours(0, 0, 0, 0);
21
+ if (window === 'day')
22
+ return d;
23
+ if (window === 'week') {
24
+ // ISO-style week: start on Monday (UTC).
25
+ const day = d.getUTCDay(); // 0=Sun..6=Sat
26
+ const offset = (day + 6) % 7; // days since Monday
27
+ d.setUTCDate(d.getUTCDate() - offset);
28
+ return d;
29
+ }
30
+ // month
31
+ d.setUTCDate(1);
32
+ return d;
33
+ }
34
+ /**
35
+ * Sum costs of historical records whose startedAt falls within [start, now].
36
+ *
37
+ * The upper bound on `now` matters because clock-skewed CI machines can write
38
+ * history records dated in the future. Without an upper bound, those records
39
+ * would count toward every period until "now" surpasses them.
40
+ */
41
+ function sumHistoryWithinWindow(history, start, now) {
42
+ const startIso = start.toISOString();
43
+ const nowIso = now.toISOString();
44
+ let total = 0;
45
+ for (const r of history) {
46
+ if (r.startedAt >= startIso && r.startedAt <= nowIso) {
47
+ total += r.totalCost;
48
+ }
49
+ }
50
+ return total;
51
+ }
52
+ /**
53
+ * Evaluate the current scan against the configured budget limits.
54
+ */
55
+ export function checkBudget(input, limits) {
56
+ if (!limits || (!limits.perScan && !limits.perPeriod)) {
57
+ return { ok: true, action: 'continue' };
58
+ }
59
+ const warnAt = limits.thresholds?.warnAt ?? DEFAULT_WARN_AT;
60
+ const abortAt = limits.thresholds?.abortAt ?? DEFAULT_ABORT_AT;
61
+ let worst = { ok: true, action: 'continue' };
62
+ const escalate = (status) => {
63
+ if (status.action === 'abort' || (status.action === 'warn' && worst.action === 'continue')) {
64
+ worst = status;
65
+ }
66
+ };
67
+ // Per-scan token limit
68
+ if (limits.perScan?.maxTokens !== undefined && limits.perScan.maxTokens > 0) {
69
+ const ratio = input.currentScanTokens / limits.perScan.maxTokens;
70
+ if (ratio >= abortAt) {
71
+ escalate({
72
+ ok: false,
73
+ action: 'abort',
74
+ reason: `Per-scan token limit reached: ${input.currentScanTokens} / ${limits.perScan.maxTokens}`,
75
+ });
76
+ }
77
+ else if (ratio >= warnAt) {
78
+ escalate({
79
+ ok: true,
80
+ action: 'warn',
81
+ reason: `Per-scan token usage at ${(ratio * 100).toFixed(0)}% of limit (${input.currentScanTokens} / ${limits.perScan.maxTokens})`,
82
+ });
83
+ }
84
+ }
85
+ // Per-scan cost limit
86
+ if (limits.perScan?.maxCostUsd !== undefined && limits.perScan.maxCostUsd > 0) {
87
+ const ratio = input.currentScanCostUsd / limits.perScan.maxCostUsd;
88
+ if (ratio >= abortAt) {
89
+ escalate({
90
+ ok: false,
91
+ action: 'abort',
92
+ reason: `Per-scan cost limit reached: ${input.currentScanCostUsd.toFixed(4)} / ${limits.perScan.maxCostUsd} USD`,
93
+ });
94
+ }
95
+ else if (ratio >= warnAt) {
96
+ escalate({
97
+ ok: true,
98
+ action: 'warn',
99
+ reason: `Per-scan cost at ${(ratio * 100).toFixed(0)}% of limit (${input.currentScanCostUsd.toFixed(4)} / ${limits.perScan.maxCostUsd} USD)`,
100
+ });
101
+ }
102
+ }
103
+ // Per-period cost limit
104
+ if (limits.perPeriod && limits.perPeriod.maxCostUsd > 0) {
105
+ const now = input.now ?? new Date();
106
+ const start = windowStart(now, limits.perPeriod.window);
107
+ const historical = sumHistoryWithinWindow(input.history ?? [], start, now);
108
+ const total = historical + input.currentScanCostUsd;
109
+ const ratio = total / limits.perPeriod.maxCostUsd;
110
+ if (ratio >= abortAt) {
111
+ escalate({
112
+ ok: false,
113
+ action: 'abort',
114
+ reason: `Per-${limits.perPeriod.window} cost limit reached: ${total.toFixed(4)} / ${limits.perPeriod.maxCostUsd} USD`,
115
+ });
116
+ }
117
+ else if (ratio >= warnAt) {
118
+ escalate({
119
+ ok: true,
120
+ action: 'warn',
121
+ reason: `Per-${limits.perPeriod.window} cost at ${(ratio * 100).toFixed(0)}% of limit (${total.toFixed(4)} / ${limits.perPeriod.maxCostUsd} USD)`,
122
+ });
123
+ }
124
+ }
125
+ return worst;
126
+ }
127
+ /**
128
+ * Sentinel error thrown by the scan runner when a budget abort fires mid-scan.
129
+ * Distinct class so callers can detect budget aborts vs other failures.
130
+ */
131
+ export class BudgetExceededError extends Error {
132
+ constructor(message) {
133
+ super(message);
134
+ this.name = 'BudgetExceededError';
135
+ }
136
+ }
137
+ //# sourceMappingURL=budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.js","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * CLI utility for building / editing a runtime-config.json file.
3
+ *
4
+ * Interactive by default; flag-only mode skips prompts. If a config file
5
+ * already exists, its values are loaded and used as defaults — only the
6
+ * fields you change (or pass as flags) are updated.
7
+ *
8
+ * Usage:
9
+ * aghast build-config --config-dir <path> # interactive, file at <path>/runtime-config.json
10
+ * aghast build-config --runtime-config <file> # interactive, write to explicit file
11
+ * aghast build-config --config-dir <path> --provider claude-code --model sonnet # non-interactive
12
+ * aghast build-config --config-dir <path> --non-interactive # accept all current/defaults
13
+ */
14
+ export declare function runBuildConfig(args: string[]): Promise<void>;
15
+ //# sourceMappingURL=build-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-config.d.ts","sourceRoot":"","sources":["../src/build-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA4XH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkOlE"}