heron-ai 0.1.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.
- package/LICENSE +21 -0
- package/README.md +423 -0
- package/dist/bin/heron.d.ts +3 -0
- package/dist/bin/heron.d.ts.map +1 -0
- package/dist/bin/heron.js +198 -0
- package/dist/bin/heron.js.map +1 -0
- package/dist/src/analysis/analyzer.d.ts +14 -0
- package/dist/src/analysis/analyzer.d.ts.map +1 -0
- package/dist/src/analysis/analyzer.js +130 -0
- package/dist/src/analysis/analyzer.js.map +1 -0
- package/dist/src/analysis/risk-scorer.d.ts +20 -0
- package/dist/src/analysis/risk-scorer.d.ts.map +1 -0
- package/dist/src/analysis/risk-scorer.js +143 -0
- package/dist/src/analysis/risk-scorer.js.map +1 -0
- package/dist/src/config/loader.d.ts +15 -0
- package/dist/src/config/loader.d.ts.map +1 -0
- package/dist/src/config/loader.js +39 -0
- package/dist/src/config/loader.js.map +1 -0
- package/dist/src/config/schema.d.ts +146 -0
- package/dist/src/config/schema.d.ts.map +1 -0
- package/dist/src/config/schema.js +27 -0
- package/dist/src/config/schema.js.map +1 -0
- package/dist/src/connectors/http-connector.d.ts +17 -0
- package/dist/src/connectors/http-connector.d.ts.map +1 -0
- package/dist/src/connectors/http-connector.js +56 -0
- package/dist/src/connectors/http-connector.js.map +1 -0
- package/dist/src/connectors/index.d.ts +5 -0
- package/dist/src/connectors/index.d.ts.map +1 -0
- package/dist/src/connectors/index.js +13 -0
- package/dist/src/connectors/index.js.map +1 -0
- package/dist/src/connectors/interactive-connector.d.ts +13 -0
- package/dist/src/connectors/interactive-connector.d.ts.map +1 -0
- package/dist/src/connectors/interactive-connector.js +44 -0
- package/dist/src/connectors/interactive-connector.js.map +1 -0
- package/dist/src/connectors/types.d.ts +15 -0
- package/dist/src/connectors/types.d.ts.map +1 -0
- package/dist/src/connectors/types.js +2 -0
- package/dist/src/connectors/types.js.map +1 -0
- package/dist/src/index.d.ts +12 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +60 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/interview/interviewer.d.ts +19 -0
- package/dist/src/interview/interviewer.d.ts.map +1 -0
- package/dist/src/interview/interviewer.js +68 -0
- package/dist/src/interview/interviewer.js.map +1 -0
- package/dist/src/interview/protocol.d.ts +38 -0
- package/dist/src/interview/protocol.d.ts.map +1 -0
- package/dist/src/interview/protocol.js +290 -0
- package/dist/src/interview/protocol.js.map +1 -0
- package/dist/src/interview/questions.d.ts +20 -0
- package/dist/src/interview/questions.d.ts.map +1 -0
- package/dist/src/interview/questions.js +131 -0
- package/dist/src/interview/questions.js.map +1 -0
- package/dist/src/llm/client.d.ts +13 -0
- package/dist/src/llm/client.d.ts.map +1 -0
- package/dist/src/llm/client.js +128 -0
- package/dist/src/llm/client.js.map +1 -0
- package/dist/src/llm/prompts.d.ts +13 -0
- package/dist/src/llm/prompts.d.ts.map +1 -0
- package/dist/src/llm/prompts.js +192 -0
- package/dist/src/llm/prompts.js.map +1 -0
- package/dist/src/report/generator.d.ts +23 -0
- package/dist/src/report/generator.d.ts.map +1 -0
- package/dist/src/report/generator.js +304 -0
- package/dist/src/report/generator.js.map +1 -0
- package/dist/src/report/templates.d.ts +3 -0
- package/dist/src/report/templates.d.ts.map +1 -0
- package/dist/src/report/templates.js +386 -0
- package/dist/src/report/templates.js.map +1 -0
- package/dist/src/report/types.d.ts +954 -0
- package/dist/src/report/types.d.ts.map +1 -0
- package/dist/src/report/types.js +161 -0
- package/dist/src/report/types.js.map +1 -0
- package/dist/src/server/index.d.ts +17 -0
- package/dist/src/server/index.d.ts.map +1 -0
- package/dist/src/server/index.js +650 -0
- package/dist/src/server/index.js.map +1 -0
- package/dist/src/server/sessions.d.ts +68 -0
- package/dist/src/server/sessions.d.ts.map +1 -0
- package/dist/src/server/sessions.js +268 -0
- package/dist/src/server/sessions.js.map +1 -0
- package/dist/src/util/id.d.ts +2 -0
- package/dist/src/util/id.d.ts.map +1 -0
- package/dist/src/util/id.js +5 -0
- package/dist/src/util/id.js.map +1 -0
- package/dist/src/util/logger.d.ts +9 -0
- package/dist/src/util/logger.d.ts.map +1 -0
- package/dist/src/util/logger.js +32 -0
- package/dist/src/util/logger.js.map +1 -0
- package/heron.example.yaml +46 -0
- package/package.json +40 -0
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
/** Filter out interview/orchestration platforms that aren't real business systems */
|
|
2
|
+
function isBusinessSystem(s) {
|
|
3
|
+
const id = s.systemId.toLowerCase();
|
|
4
|
+
if (/\bheron\b/.test(id))
|
|
5
|
+
return false;
|
|
6
|
+
if (/internal\s*(orchestrat|api|platform)/.test(id))
|
|
7
|
+
return false;
|
|
8
|
+
if (/interview\s*(platform|endpoint|api)/.test(id))
|
|
9
|
+
return false;
|
|
10
|
+
if (/audit\s*(platform|endpoint|api)/.test(id))
|
|
11
|
+
return false;
|
|
12
|
+
// Platform session token with no real scopes = orchestration layer
|
|
13
|
+
if (/platform.?session.?token/i.test(id) && s.scopesRequested.length === 0)
|
|
14
|
+
return false;
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
export function renderMarkdownReport(report) {
|
|
18
|
+
const sections = [
|
|
19
|
+
renderHeader(report),
|
|
20
|
+
renderScopeAndMethodology(report),
|
|
21
|
+
renderSummary(report),
|
|
22
|
+
renderAgentProfile(report),
|
|
23
|
+
renderFindings(report.risks),
|
|
24
|
+
renderSystems(report.systems),
|
|
25
|
+
renderPositiveFindings(report),
|
|
26
|
+
renderVerdict(report),
|
|
27
|
+
report.regulatoryCompliance ? renderRegulatoryCompliance(report.regulatoryCompliance) : null,
|
|
28
|
+
report.dataQuality ? renderDataQuality(report.dataQuality) : null,
|
|
29
|
+
renderTranscript(report.transcript),
|
|
30
|
+
renderDisclaimer(),
|
|
31
|
+
];
|
|
32
|
+
return sections.filter(Boolean).join('\n\n---\n\n');
|
|
33
|
+
}
|
|
34
|
+
// ─── Header ──────────────────────────────────────────────────────────────────
|
|
35
|
+
function renderHeader(report) {
|
|
36
|
+
const riskIcon = report.overallRiskLevel === 'critical' || report.overallRiskLevel === 'high' ? '!!' : '';
|
|
37
|
+
const dqPart = report.dataQuality ? ` | **Data Quality**: ${report.dataQuality.score}/100` : '';
|
|
38
|
+
// Regulatory one-liner
|
|
39
|
+
let regLine = '';
|
|
40
|
+
if (report.regulatoryCompliance) {
|
|
41
|
+
const rc = report.regulatoryCompliance;
|
|
42
|
+
const regParts = [];
|
|
43
|
+
const summarizeJurisdiction = (flags) => {
|
|
44
|
+
if (flags.some(f => f.severity === 'action-required'))
|
|
45
|
+
return 'Action Required';
|
|
46
|
+
if (flags.some(f => f.severity === 'clarification-needed'))
|
|
47
|
+
return 'Needs Clarification';
|
|
48
|
+
if (flags.some(f => f.severity === 'warning'))
|
|
49
|
+
return 'Review';
|
|
50
|
+
return 'Clear';
|
|
51
|
+
};
|
|
52
|
+
regParts.push(`EU: ${summarizeJurisdiction(rc.eu)}`);
|
|
53
|
+
regParts.push(`US: ${summarizeJurisdiction(rc.us)}`);
|
|
54
|
+
regParts.push(`UK: ${summarizeJurisdiction(rc.uk)}`);
|
|
55
|
+
regLine = `\n**Regulatory**: ${regParts.join(' | ')}`;
|
|
56
|
+
}
|
|
57
|
+
return `# Agent Access Audit Report
|
|
58
|
+
|
|
59
|
+
**Generated**: ${report.metadata.date} | **Agent**: ${report.metadata.target} | **Risk Level**: ${report.overallRiskLevel.toUpperCase()} ${riskIcon}${dqPart}${regLine}`;
|
|
60
|
+
}
|
|
61
|
+
// ─── Scope & Methodology ────────────────────────────────────────────────────
|
|
62
|
+
function renderScopeAndMethodology(report) {
|
|
63
|
+
return `## Scope & Methodology
|
|
64
|
+
|
|
65
|
+
**Assessment type**: Automated structured interview
|
|
66
|
+
|
|
67
|
+
**Method**: Heron conducted a ${report.metadata.questionsAsked}-question interview covering agent purpose, data access, permissions, write operations, and operational frequency. **Duration**: ${Math.round(report.metadata.interviewDuration / 1000)}s.
|
|
68
|
+
|
|
69
|
+
**Limitations**: This assessment is based solely on the agent's self-reported information. No runtime analysis, code review, or network traffic inspection was performed. Findings should be verified against actual system configurations.`;
|
|
70
|
+
}
|
|
71
|
+
// ─── Data Quality Badge ──────────────────────────────────────────────────────
|
|
72
|
+
function renderDataQuality(dq) {
|
|
73
|
+
const provided = dq.fieldsProvided.length;
|
|
74
|
+
const total = provided + dq.fieldsMissing.length;
|
|
75
|
+
const qualityLabel = dq.score >= 70 ? 'Good' : dq.score >= 40 ? 'Partial' : 'Poor';
|
|
76
|
+
const fieldDescriptions = {
|
|
77
|
+
systemId: 'External systems connected (name, API type, auth)',
|
|
78
|
+
scopesRequested: 'Permissions/scopes granted to the agent',
|
|
79
|
+
dataSensitivity: 'Data classification (PII, financial, etc.)',
|
|
80
|
+
blastRadius: 'Scope of impact if something goes wrong',
|
|
81
|
+
frequencyAndVolume: 'How often it runs, API calls per run',
|
|
82
|
+
writeOperations: 'What the agent creates, modifies, or deletes',
|
|
83
|
+
reversibility: 'Whether write operations can be undone',
|
|
84
|
+
};
|
|
85
|
+
const rows = [
|
|
86
|
+
...dq.fieldsProvided.map(f => `| ${f} | ${fieldDescriptions[f] ?? ''} | Provided |`),
|
|
87
|
+
...dq.fieldsMissing.map(f => `| ${f} | ${fieldDescriptions[f] ?? ''} | **NOT PROVIDED** |`),
|
|
88
|
+
];
|
|
89
|
+
let warning = '';
|
|
90
|
+
if (dq.repeatedAnswers > 0) {
|
|
91
|
+
warning = `\n\n> **Warning**: ${dq.repeatedAnswers} of ${dq.totalQuestions} answers were repeated/canned responses. Data in this report may be incomplete.`;
|
|
92
|
+
}
|
|
93
|
+
return `## Data Quality: ${qualityLabel} (${provided}/${total} fields) ${warning}
|
|
94
|
+
|
|
95
|
+
| Field | What it measures | Status |
|
|
96
|
+
|-------|-----------------|--------|
|
|
97
|
+
${rows.join('\n')}`;
|
|
98
|
+
}
|
|
99
|
+
// ─── Summary ─────────────────────────────────────────────────────────────────
|
|
100
|
+
function renderSummary(report) {
|
|
101
|
+
// Dashboard: finding counts by severity
|
|
102
|
+
const allRisks = report.risks;
|
|
103
|
+
const countBySeverity = (sev) => allRisks.filter(r => r.severity === sev).length;
|
|
104
|
+
const critical = countBySeverity('critical');
|
|
105
|
+
const high = countBySeverity('high');
|
|
106
|
+
const medium = countBySeverity('medium');
|
|
107
|
+
const low = countBySeverity('low');
|
|
108
|
+
const findingsParts = [];
|
|
109
|
+
if (critical > 0)
|
|
110
|
+
findingsParts.push(`${critical} Critical`);
|
|
111
|
+
if (high > 0)
|
|
112
|
+
findingsParts.push(`${high} High`);
|
|
113
|
+
if (medium > 0)
|
|
114
|
+
findingsParts.push(`${medium} Medium`);
|
|
115
|
+
if (low > 0)
|
|
116
|
+
findingsParts.push(`${low} Low`);
|
|
117
|
+
if (findingsParts.length === 0)
|
|
118
|
+
findingsParts.push('None');
|
|
119
|
+
const systemCount = report.systems.filter(isBusinessSystem).length;
|
|
120
|
+
const dashboard = `| Risk | Systems | Findings |
|
|
121
|
+
|------|---------|----------|
|
|
122
|
+
| **${report.overallRiskLevel.toUpperCase()}** | ${systemCount} | ${findingsParts.join(', ')} |`;
|
|
123
|
+
return `## Executive Summary
|
|
124
|
+
|
|
125
|
+
${dashboard}
|
|
126
|
+
|
|
127
|
+
${report.summary}`;
|
|
128
|
+
}
|
|
129
|
+
// ─── Agent Profile ───────────────────────────────────────────────────────────
|
|
130
|
+
function renderAgentProfile(report) {
|
|
131
|
+
const lines = [`- **Purpose**: ${report.agentPurpose}`];
|
|
132
|
+
if (report.agentTrigger)
|
|
133
|
+
lines.push(`- **Trigger**: ${report.agentTrigger}`);
|
|
134
|
+
if (report.agentOwner && report.agentOwner !== 'NOT PROVIDED') {
|
|
135
|
+
lines.push(`- **Owner**: ${report.agentOwner}`);
|
|
136
|
+
}
|
|
137
|
+
// Frequency from first system if available
|
|
138
|
+
const freq = report.systems[0]?.frequencyAndVolume;
|
|
139
|
+
if (freq && freq !== 'NOT PROVIDED')
|
|
140
|
+
lines.push(`- **Frequency**: ${freq}`);
|
|
141
|
+
return `## Agent Profile
|
|
142
|
+
|
|
143
|
+
${lines.join('\n')}`;
|
|
144
|
+
}
|
|
145
|
+
// ─── Per-System Cards ────────────────────────────────────────────────────────
|
|
146
|
+
function renderSystems(systems) {
|
|
147
|
+
const businessSystems = systems.filter(isBusinessSystem);
|
|
148
|
+
if (businessSystems.length === 0) {
|
|
149
|
+
return `## Systems & Access
|
|
150
|
+
|
|
151
|
+
No systems were identified in the interview.`;
|
|
152
|
+
}
|
|
153
|
+
const cards = businessSystems.map(renderSystemCard).join('\n\n');
|
|
154
|
+
return `## Systems & Access
|
|
155
|
+
|
|
156
|
+
${cards}`;
|
|
157
|
+
}
|
|
158
|
+
function computeSystemRisk(sys) {
|
|
159
|
+
let score = 0;
|
|
160
|
+
// Blast radius
|
|
161
|
+
const brScores = { 'single-record': 0, 'single-user': 1, 'team-scope': 2, 'org-wide': 3, 'cross-tenant': 4 };
|
|
162
|
+
score += brScores[sys.blastRadius] ?? 1;
|
|
163
|
+
// Excessive scopes
|
|
164
|
+
if (sys.scopesDelta.length > 0)
|
|
165
|
+
score += 1;
|
|
166
|
+
// Irreversible writes
|
|
167
|
+
if (sys.writeOperations.some(w => !w.reversible))
|
|
168
|
+
score += 2;
|
|
169
|
+
// Data sensitivity
|
|
170
|
+
if (/pii|personal|health|financial|credit/i.test(sys.dataSensitivity))
|
|
171
|
+
score += 1;
|
|
172
|
+
if (score >= 5)
|
|
173
|
+
return 'HIGH';
|
|
174
|
+
if (score >= 3)
|
|
175
|
+
return 'MEDIUM';
|
|
176
|
+
return 'LOW';
|
|
177
|
+
}
|
|
178
|
+
function renderSystemCard(sys) {
|
|
179
|
+
const rows = [];
|
|
180
|
+
const risk = computeSystemRisk(sys);
|
|
181
|
+
// Scopes
|
|
182
|
+
const scopes = sys.scopesRequested.filter(s => s !== 'NOT PROVIDED');
|
|
183
|
+
rows.push(`| **Scopes granted** | ${scopes.length > 0 ? scopes.join(', ') : '*NOT PROVIDED*'} |`);
|
|
184
|
+
const needed = sys.scopesNeeded.filter(s => s !== 'NOT PROVIDED');
|
|
185
|
+
if (needed.length > 0) {
|
|
186
|
+
rows.push(`| **Scopes needed** | ${needed.join(', ')} |`);
|
|
187
|
+
}
|
|
188
|
+
const excessive = sys.scopesDelta;
|
|
189
|
+
if (excessive.length > 0) {
|
|
190
|
+
rows.push(`| **Excessive** | ${excessive.join(', ')} |`);
|
|
191
|
+
}
|
|
192
|
+
// Data sensitivity
|
|
193
|
+
if (sys.dataSensitivity && sys.dataSensitivity !== 'NOT PROVIDED') {
|
|
194
|
+
rows.push(`| **Data** | ${sys.dataSensitivity} |`);
|
|
195
|
+
}
|
|
196
|
+
// Blast radius
|
|
197
|
+
rows.push(`| **Blast radius** | ${sys.blastRadius} |`);
|
|
198
|
+
// Frequency
|
|
199
|
+
if (sys.frequencyAndVolume && sys.frequencyAndVolume !== 'NOT PROVIDED') {
|
|
200
|
+
rows.push(`| **Frequency** | ${sys.frequencyAndVolume} |`);
|
|
201
|
+
}
|
|
202
|
+
// Write operations — inline in card
|
|
203
|
+
if (sys.writeOperations.length > 0) {
|
|
204
|
+
const writesSummary = sys.writeOperations.map(w => {
|
|
205
|
+
const rev = w.reversible ? 'reversible' : '**irreversible**';
|
|
206
|
+
return `${w.operation} → ${w.target} (${rev}, ${w.volumePerDay})`;
|
|
207
|
+
}).join('; ');
|
|
208
|
+
rows.push(`| **Writes** | ${writesSummary} |`);
|
|
209
|
+
}
|
|
210
|
+
return `### ${sys.systemId} — Risk: ${risk}
|
|
211
|
+
|
|
212
|
+
| | |
|
|
213
|
+
|---|---|
|
|
214
|
+
${rows.join('\n')}`;
|
|
215
|
+
}
|
|
216
|
+
// ─── Findings ───────────────────────────────────────────────────────────────
|
|
217
|
+
function renderFindings(risks) {
|
|
218
|
+
const allRisks = [...risks];
|
|
219
|
+
const sorted = allRisks
|
|
220
|
+
.sort((a, b) => severityOrder(b.severity) - severityOrder(a.severity));
|
|
221
|
+
const rows = sorted.map((r, i) => {
|
|
222
|
+
const id = `HERON-${String(i + 1).padStart(3, '0')}`;
|
|
223
|
+
const remediation = r.mitigation ?? '—';
|
|
224
|
+
return `| ${id} | ${r.severity.toUpperCase()} | ${r.title} | ${r.description} | ${remediation} |`;
|
|
225
|
+
}).join('\n');
|
|
226
|
+
return `## Findings
|
|
227
|
+
|
|
228
|
+
| ID | Severity | Finding | Description | Recommendation |
|
|
229
|
+
|----|----------|---------|-------------|----------------|
|
|
230
|
+
${rows}`;
|
|
231
|
+
}
|
|
232
|
+
// ─── Positive Findings ─────────────────────────────────────────────────────
|
|
233
|
+
function renderPositiveFindings(report) {
|
|
234
|
+
const positives = [];
|
|
235
|
+
const systems = report.systems.filter(isBusinessSystem);
|
|
236
|
+
// All writes reversible
|
|
237
|
+
const allWrites = systems.flatMap(s => s.writeOperations);
|
|
238
|
+
if (allWrites.length > 0 && allWrites.every(w => w.reversible)) {
|
|
239
|
+
positives.push('All write operations are reversible');
|
|
240
|
+
}
|
|
241
|
+
// No excessive scopes
|
|
242
|
+
const totalExcessive = systems.reduce((n, s) => n + s.scopesDelta.length, 0);
|
|
243
|
+
if (totalExcessive === 0 && systems.length > 0) {
|
|
244
|
+
positives.push('No excessive permissions detected — follows least-privilege principle');
|
|
245
|
+
}
|
|
246
|
+
// Limited blast radius
|
|
247
|
+
if (systems.length > 0 && systems.every(s => s.blastRadius === 'single-user' || s.blastRadius === 'single-record')) {
|
|
248
|
+
positives.push('Blast radius limited to single user/record');
|
|
249
|
+
}
|
|
250
|
+
// Approval required on writes
|
|
251
|
+
if (allWrites.length > 0 && allWrites.some(w => w.approvalRequired)) {
|
|
252
|
+
positives.push('Some write operations require approval before execution');
|
|
253
|
+
}
|
|
254
|
+
// Low frequency
|
|
255
|
+
const freqText = systems.map(s => s.frequencyAndVolume).join(' ');
|
|
256
|
+
if (/\b(1|2|once|twice)\b.*\b(week|month)\b/i.test(freqText)) {
|
|
257
|
+
positives.push('Low execution frequency reduces operational risk');
|
|
258
|
+
}
|
|
259
|
+
// No decisions about people
|
|
260
|
+
if (report.makesDecisionsAboutPeople === false) {
|
|
261
|
+
positives.push('Does not make automated decisions about people');
|
|
262
|
+
}
|
|
263
|
+
if (positives.length === 0)
|
|
264
|
+
return '';
|
|
265
|
+
return `## What's Working Well
|
|
266
|
+
|
|
267
|
+
${positives.map(p => `- ✓ ${p}`).join('\n')}`;
|
|
268
|
+
}
|
|
269
|
+
// ─── Verdict (merged Recommendation + Recommendations) ───────────────────────
|
|
270
|
+
function renderVerdict(report) {
|
|
271
|
+
// Never allow bare APPROVE for self-reported interview — always at least "WITH CONDITIONS"
|
|
272
|
+
let verdict = report.recommendation ?? 'APPROVE WITH CONDITIONS';
|
|
273
|
+
if (verdict === 'APPROVE') {
|
|
274
|
+
verdict = 'APPROVE WITH CONDITIONS';
|
|
275
|
+
}
|
|
276
|
+
const recs = report.recommendations;
|
|
277
|
+
// Ensure standard condition is always present
|
|
278
|
+
const standardCondition = 'Verify self-reported claims against actual system configurations before granting production access';
|
|
279
|
+
const allRecs = recs.some(r => /verify.*self.reported|verify.*claim/i.test(r))
|
|
280
|
+
? recs
|
|
281
|
+
: [standardCondition, ...recs];
|
|
282
|
+
let body = `**${verdict}**`;
|
|
283
|
+
if (allRecs.length > 0) {
|
|
284
|
+
body += '\n\n' + allRecs.map((r, i) => `${i + 1}. ${r}`).join('\n');
|
|
285
|
+
}
|
|
286
|
+
// Permissions delta — grouped by system
|
|
287
|
+
const excessiveBySystem = new Map();
|
|
288
|
+
const missingBySystem = new Map();
|
|
289
|
+
for (const sys of report.systems) {
|
|
290
|
+
if (!isBusinessSystem(sys))
|
|
291
|
+
continue;
|
|
292
|
+
for (const scope of sys.scopesDelta) {
|
|
293
|
+
if (scope !== 'NOT PROVIDED') {
|
|
294
|
+
if (!excessiveBySystem.has(sys.systemId))
|
|
295
|
+
excessiveBySystem.set(sys.systemId, []);
|
|
296
|
+
excessiveBySystem.get(sys.systemId).push(scope);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
for (const scope of sys.scopesNeeded) {
|
|
300
|
+
if (!sys.scopesRequested.includes(scope) && scope !== 'NOT PROVIDED') {
|
|
301
|
+
if (!missingBySystem.has(sys.systemId))
|
|
302
|
+
missingBySystem.set(sys.systemId, []);
|
|
303
|
+
missingBySystem.get(sys.systemId).push(scope);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
if (excessiveBySystem.size > 0 || missingBySystem.size > 0) {
|
|
308
|
+
body += '\n\n**Permissions delta**:\n';
|
|
309
|
+
if (excessiveBySystem.size > 0) {
|
|
310
|
+
body += '\n*Excessive (can be revoked):*\n';
|
|
311
|
+
for (const [system, scopes] of excessiveBySystem) {
|
|
312
|
+
body += `- **${system}**: ${scopes.join('; ')}\n`;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
if (missingBySystem.size > 0) {
|
|
316
|
+
body += '\n*Minimum needed:*\n';
|
|
317
|
+
for (const [system, scopes] of missingBySystem) {
|
|
318
|
+
body += `- **${system}**: ${scopes.join('; ')}\n`;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return `## Verdict & Recommendations
|
|
323
|
+
|
|
324
|
+
${body}`;
|
|
325
|
+
}
|
|
326
|
+
// ─── Transcript ──────────────────────────────────────────────────────────────
|
|
327
|
+
function renderTranscript(transcript) {
|
|
328
|
+
const items = transcript
|
|
329
|
+
.map((qa, i) => `### Q${i + 1} [${qa.category}]\n\n**Q:** ${qa.question}\n\n**A:** ${qa.answer}`)
|
|
330
|
+
.join('\n\n');
|
|
331
|
+
return `## Interview Transcript
|
|
332
|
+
|
|
333
|
+
<details>
|
|
334
|
+
<summary>Full transcript (${transcript.length} questions)</summary>
|
|
335
|
+
|
|
336
|
+
${items}
|
|
337
|
+
|
|
338
|
+
</details>`;
|
|
339
|
+
}
|
|
340
|
+
// ─── Regulatory Compliance ──────────────────────────────────────────────────
|
|
341
|
+
function renderRegulatoryCompliance(compliance) {
|
|
342
|
+
const renderFlags = (flags) => {
|
|
343
|
+
if (flags.length === 0)
|
|
344
|
+
return 'No specific flags identified.';
|
|
345
|
+
return flags.map(f => {
|
|
346
|
+
const labels = {
|
|
347
|
+
'action-required': ' `ACTION REQUIRED`',
|
|
348
|
+
'warning': ' `REVIEW`',
|
|
349
|
+
'clarification-needed': ' `NEEDS CLARIFICATION`',
|
|
350
|
+
};
|
|
351
|
+
const label = labels[f.severity] ?? '';
|
|
352
|
+
return `- **${f.framework}**${label}\n ${f.description}`;
|
|
353
|
+
}).join('\n\n');
|
|
354
|
+
};
|
|
355
|
+
return `## Regulatory Compliance
|
|
356
|
+
|
|
357
|
+
> This section highlights potential regulatory implications based on interview data. It is advisory — consult qualified legal counsel for compliance decisions.
|
|
358
|
+
|
|
359
|
+
### EU (EU AI Act + GDPR)
|
|
360
|
+
|
|
361
|
+
${renderFlags(compliance.eu)}
|
|
362
|
+
|
|
363
|
+
### US (SOC 2 + State AI Laws)
|
|
364
|
+
|
|
365
|
+
${renderFlags(compliance.us)}
|
|
366
|
+
|
|
367
|
+
### UK (UK GDPR + ICO Guidance)
|
|
368
|
+
|
|
369
|
+
${renderFlags(compliance.uk)}`;
|
|
370
|
+
}
|
|
371
|
+
// ─── Disclaimer ─────────────────────────────────────────────────────────────
|
|
372
|
+
function renderDisclaimer() {
|
|
373
|
+
return `---
|
|
374
|
+
|
|
375
|
+
*This report was generated automatically by [Heron](https://github.com/jonydony/Heron), an open-source AI agent auditor. It is based on the agent's self-reported information obtained through a structured interview. This is not a formal security audit, penetration test, or compliance certification. Claims have not been independently verified against tool manifests, runtime behavior, or system configurations. Findings should be independently verified before making access control decisions.*`;
|
|
376
|
+
}
|
|
377
|
+
function severityOrder(severity) {
|
|
378
|
+
switch (severity) {
|
|
379
|
+
case 'critical': return 4;
|
|
380
|
+
case 'high': return 3;
|
|
381
|
+
case 'medium': return 2;
|
|
382
|
+
case 'low': return 1;
|
|
383
|
+
default: return 0;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/report/templates.ts"],"names":[],"mappings":"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"}
|