heron-ai 0.2.2 → 0.4.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 (85) hide show
  1. package/dist/bin/heron.js +31 -2
  2. package/dist/bin/heron.js.map +1 -1
  3. package/dist/src/analysis/analyzer.d.ts +1 -1
  4. package/dist/src/analysis/analyzer.d.ts.map +1 -1
  5. package/dist/src/analysis/analyzer.js +120 -6
  6. package/dist/src/analysis/analyzer.js.map +1 -1
  7. package/dist/src/analysis/risk-scorer.d.ts +32 -0
  8. package/dist/src/analysis/risk-scorer.d.ts.map +1 -1
  9. package/dist/src/analysis/risk-scorer.js +134 -0
  10. package/dist/src/analysis/risk-scorer.js.map +1 -1
  11. package/dist/src/commands/diff.d.ts +17 -0
  12. package/dist/src/commands/diff.d.ts.map +1 -0
  13. package/dist/src/commands/diff.js +63 -0
  14. package/dist/src/commands/diff.js.map +1 -0
  15. package/dist/src/compliance/control-mappings.d.ts +21 -0
  16. package/dist/src/compliance/control-mappings.d.ts.map +1 -0
  17. package/dist/src/compliance/control-mappings.js +182 -0
  18. package/dist/src/compliance/control-mappings.js.map +1 -0
  19. package/dist/src/compliance/frameworks.d.ts +24 -0
  20. package/dist/src/compliance/frameworks.d.ts.map +1 -0
  21. package/dist/src/compliance/frameworks.js +55 -0
  22. package/dist/src/compliance/frameworks.js.map +1 -0
  23. package/dist/src/compliance/index.d.ts +9 -0
  24. package/dist/src/compliance/index.d.ts.map +1 -0
  25. package/dist/src/compliance/index.js +8 -0
  26. package/dist/src/compliance/index.js.map +1 -0
  27. package/dist/src/compliance/mapper.d.ts +126 -0
  28. package/dist/src/compliance/mapper.d.ts.map +1 -0
  29. package/dist/src/compliance/mapper.js +443 -0
  30. package/dist/src/compliance/mapper.js.map +1 -0
  31. package/dist/src/compliance/types.d.ts +120 -0
  32. package/dist/src/compliance/types.d.ts.map +1 -0
  33. package/dist/src/compliance/types.js +99 -0
  34. package/dist/src/compliance/types.js.map +1 -0
  35. package/dist/src/diff/differ.d.ts +9 -0
  36. package/dist/src/diff/differ.d.ts.map +1 -0
  37. package/dist/src/diff/differ.js +52 -0
  38. package/dist/src/diff/differ.js.map +1 -0
  39. package/dist/src/interview/interviewer.d.ts +2 -0
  40. package/dist/src/interview/interviewer.d.ts.map +1 -1
  41. package/dist/src/interview/interviewer.js.map +1 -1
  42. package/dist/src/interview/protocol.d.ts.map +1 -1
  43. package/dist/src/interview/protocol.js +28 -5
  44. package/dist/src/interview/protocol.js.map +1 -1
  45. package/dist/src/interview/questions.d.ts.map +1 -1
  46. package/dist/src/interview/questions.js +55 -0
  47. package/dist/src/interview/questions.js.map +1 -1
  48. package/dist/src/llm/client.d.ts +26 -1
  49. package/dist/src/llm/client.d.ts.map +1 -1
  50. package/dist/src/llm/client.js +108 -15
  51. package/dist/src/llm/client.js.map +1 -1
  52. package/dist/src/llm/prompts.d.ts +27 -1
  53. package/dist/src/llm/prompts.d.ts.map +1 -1
  54. package/dist/src/llm/prompts.js +133 -1
  55. package/dist/src/llm/prompts.js.map +1 -1
  56. package/dist/src/report/generator.d.ts +1 -7
  57. package/dist/src/report/generator.d.ts.map +1 -1
  58. package/dist/src/report/generator.js +47 -236
  59. package/dist/src/report/generator.js.map +1 -1
  60. package/dist/src/report/templates.d.ts +2 -1
  61. package/dist/src/report/templates.d.ts.map +1 -1
  62. package/dist/src/report/templates.js +436 -84
  63. package/dist/src/report/templates.js.map +1 -1
  64. package/dist/src/report/types.d.ts +34 -19
  65. package/dist/src/report/types.d.ts.map +1 -1
  66. package/dist/src/report/types.js +8 -4
  67. package/dist/src/report/types.js.map +1 -1
  68. package/dist/src/server/index.d.ts +1 -1
  69. package/dist/src/server/index.d.ts.map +1 -1
  70. package/dist/src/server/index.js +212 -55
  71. package/dist/src/server/index.js.map +1 -1
  72. package/dist/src/server/sessions.d.ts +10 -0
  73. package/dist/src/server/sessions.d.ts.map +1 -1
  74. package/dist/src/server/sessions.js +73 -9
  75. package/dist/src/server/sessions.js.map +1 -1
  76. package/dist/src/util/provided.d.ts +49 -0
  77. package/dist/src/util/provided.d.ts.map +1 -0
  78. package/dist/src/util/provided.js +83 -0
  79. package/dist/src/util/provided.js.map +1 -0
  80. package/dist/src/util/systems.d.ts +15 -0
  81. package/dist/src/util/systems.d.ts.map +1 -0
  82. package/dist/src/util/systems.js +41 -0
  83. package/dist/src/util/systems.js.map +1 -0
  84. package/package.json +1 -1
  85. package/skills/heron-audit/bin/heron-update-check +13 -4
@@ -48,6 +48,18 @@ export async function startServer(config) {
48
48
  await handleGetReport(res, sessions, reportMatch[1]);
49
49
  return;
50
50
  }
51
+ // REST: POST compare (upload previous report for diff)
52
+ const postCompareMatch = url.pathname.match(/^\/api\/sessions\/([^/]+)\/compare$/);
53
+ if (postCompareMatch && req.method === 'POST') {
54
+ await handlePostCompare(req, res, sessions, postCompareMatch[1]);
55
+ return;
56
+ }
57
+ // HTML: compare page (rendered diff)
58
+ const comparePageMatch = url.pathname.match(/^\/sessions\/([^/]+)\/compare$/);
59
+ if (comparePageMatch && req.method === 'GET') {
60
+ await handleComparePage(res, sessions, comparePageMatch[1]);
61
+ return;
62
+ }
51
63
  // Favicon
52
64
  if (url.pathname === '/favicon.svg') {
53
65
  res.writeHead(200, { 'Content-Type': 'image/svg+xml', 'Cache-Control': 'public, max-age=86400' });
@@ -77,53 +89,56 @@ export async function startServer(config) {
77
89
  json(res, 500, { error: 'Internal server error' });
78
90
  }
79
91
  });
80
- server.listen(config.port, config.host, () => {
81
- const baseUrl = `http://localhost:${config.port}`;
82
- logger.raw('');
83
- logger.raw(` \x1b[1mHeron Server\x1b[0m`);
84
- logger.raw('');
85
- logger.raw(` Dashboard: ${baseUrl}`);
86
- logger.raw(` Agent URL: ${baseUrl}/v1/chat/completions`);
87
- logger.raw(` Reports: ${config.reportDir}`);
88
- logger.raw('');
89
- logger.raw(` \x1b[1mHow to connect an agent:\x1b[0m`);
90
- logger.raw('');
91
- logger.raw(' Option 1 — Paste this prompt into your agent\'s chat:');
92
- logger.raw('');
93
- logger.raw(' ┌──────────────────────────────────────────────────────────────────────');
94
- logger.raw(' │ I need you to complete a security access review for this project.');
95
- logger.raw(' │ Make sequential API calls to the Heron endpoint until it says');
96
- logger.raw(' │ "Interview complete".');
97
- logger.raw(' │');
98
- logger.raw(' │ Step 1 — Start the interview:');
99
- logger.raw(`POST ${baseUrl}/v1/chat/completions`);
100
- logger.raw('Body: {"model":"any","messages":[{"role":"user",');
101
- logger.raw(' │ "content":"Hi, I am ready to answer questions about this project."}]}');
102
- logger.raw(' │');
103
- logger.raw(' │ The response will contain a question and a session ID');
104
- logger.raw(' │ (in the text and in the "heron_session_id" JSON field).');
105
- logger.raw(' │');
106
- logger.raw(' │ Step 2 — Send each answer:');
107
- logger.raw(`POST ${baseUrl}/v1/chat/completions`);
108
- logger.raw('Body: {"model":"any","messages":[{"role":"user",');
109
- logger.raw(' │ "content":"YOUR ANSWER HERE"}],');
110
- logger.raw(' │ "heron_session_id":"SESSION_ID_FROM_STEP_1"}');
111
- logger.raw(' │');
112
- logger.raw(' │ Step 3 — Repeat step 2 with each new answer until the response');
113
- logger.raw(' │ says "Interview complete".');
114
- logger.raw(' │');
115
- logger.raw(' │ Important: answer about THIS specific project — what you actually');
116
- logger.raw(' │ do, what systems you connect to, what data you handle. Not general');
117
- logger.raw(' │ capabilities. Never reveal actual secret values just describe');
118
- logger.raw(' │ credential types.');
119
- logger.raw(' └──────────────────────────────────────────────────────────────────────');
120
- logger.raw('');
121
- logger.raw(' Option 2 — Set OPENAI_BASE_URL:');
122
- logger.raw('');
123
- logger.raw(` OPENAI_BASE_URL=${baseUrl}/v1 python your_agent.py`);
124
- logger.raw('');
125
- logger.success('Ready — waiting for agents to connect...');
126
- logger.raw('');
92
+ return new Promise((resolve) => {
93
+ server.listen(config.port, config.host, () => {
94
+ const baseUrl = `http://localhost:${config.port}`;
95
+ logger.raw('');
96
+ logger.raw(` \x1b[1mHeron Server\x1b[0m`);
97
+ logger.raw('');
98
+ logger.raw(` Dashboard: ${baseUrl}`);
99
+ logger.raw(` Agent URL: ${baseUrl}/v1/chat/completions`);
100
+ logger.raw(` Reports: ${config.reportDir}`);
101
+ logger.raw('');
102
+ logger.raw(` \x1b[1mHow to connect an agent:\x1b[0m`);
103
+ logger.raw('');
104
+ logger.raw(' Option 1 — Paste this prompt into your agent\'s chat:');
105
+ logger.raw('');
106
+ logger.raw(' ┌──────────────────────────────────────────────────────────────────────');
107
+ logger.raw(' │ I need you to complete a security access review for this project.');
108
+ logger.raw(' │ Make sequential API calls to the Heron endpoint until it says');
109
+ logger.raw(' │ "Interview complete".');
110
+ logger.raw(' │');
111
+ logger.raw('Step 1 — Start the interview:');
112
+ logger.raw(`POST ${baseUrl}/v1/chat/completions`);
113
+ logger.raw(' │ Body: {"model":"any","messages":[{"role":"user",');
114
+ logger.raw(' │ "content":"Hi, I am ready to answer questions about this project."}]}');
115
+ logger.raw(' │');
116
+ logger.raw(' │ The response will contain a question and a session ID');
117
+ logger.raw(' │ (in the text and in the "heron_session_id" JSON field).');
118
+ logger.raw(' │');
119
+ logger.raw('Step 2 — Send each answer:');
120
+ logger.raw(`POST ${baseUrl}/v1/chat/completions`);
121
+ logger.raw(' │ Body: {"model":"any","messages":[{"role":"user",');
122
+ logger.raw(' │ "content":"YOUR ANSWER HERE"}],');
123
+ logger.raw(' │ "heron_session_id":"SESSION_ID_FROM_STEP_1"}');
124
+ logger.raw(' │');
125
+ logger.raw(' │ Step 3 — Repeat step 2 with each new answer until the response');
126
+ logger.raw(' │ says "Interview complete".');
127
+ logger.raw(' │');
128
+ logger.raw(' │ Important: answer about THIS specific project what you actually');
129
+ logger.raw(' │ do, what systems you connect to, what data you handle. Not general');
130
+ logger.raw(' │ capabilities. Never reveal actual secret values — just describe');
131
+ logger.raw(' │ credential types.');
132
+ logger.raw(' └──────────────────────────────────────────────────────────────────────');
133
+ logger.raw('');
134
+ logger.raw(' Option 2 — Set OPENAI_BASE_URL:');
135
+ logger.raw('');
136
+ logger.raw(` OPENAI_BASE_URL=${baseUrl}/v1 python your_agent.py`);
137
+ logger.raw('');
138
+ logger.success('Ready — waiting for agents to connect...');
139
+ logger.raw('');
140
+ resolve(server);
141
+ });
127
142
  });
128
143
  }
129
144
  /** Extract session ID from assistant messages in conversation history */
@@ -239,6 +254,7 @@ async function handleListSessions(res, sessions) {
239
254
  createdAt: s.createdAt.toISOString(),
240
255
  updatedAt: s.updatedAt.toISOString(),
241
256
  riskLevel: s.reportJson?.overallRiskLevel ?? null,
257
+ hasDiff: sessions.hasDiff(s.id),
242
258
  }));
243
259
  json(res, 200, { sessions: list });
244
260
  }
@@ -336,7 +352,16 @@ const SHARED_CSS = `
336
352
  .report-rendered { background: #fff; border: 1px solid #e5e7eb; border-radius: 8px; padding: 32px; line-height: 1.6; }
337
353
  .report-rendered h1 { font-size: 1.5em; border-bottom: 2px solid #e5e7eb; padding-bottom: 8px; }
338
354
  .report-rendered h2 { font-size: 1.2em; margin-top: 28px; border-bottom: 1px solid #f0f0f0; padding-bottom: 6px; color: #1e293b; }
339
- .report-rendered table { margin: 12px 0; font-size: 0.9em; }
355
+ /*
356
+ Long unbreakable tokens in cells (e.g. an OAuth scope URL inside a
357
+ finding description) used to push the Description column wide enough
358
+ to squeeze the Finding column down to one word per line. table-layout
359
+ fixed allocates columns proportionally regardless of content; the
360
+ overflow-wrap rule lets long URLs break mid-word so they fit the
361
+ allocated width.
362
+ */
363
+ .report-rendered table { margin: 12px 0; font-size: 0.9em; table-layout: fixed; }
364
+ .report-rendered table th, .report-rendered table td { overflow-wrap: anywhere; word-break: break-word; vertical-align: top; }
340
365
  .report-rendered p { margin: 8px 0; }
341
366
  .report-rendered strong { color: #0f172a; }
342
367
  .report-rendered hr { border: none; border-top: 1px solid #e5e7eb; margin: 24px 0; }
@@ -367,17 +392,25 @@ function markdownToHtml(md) {
367
392
  let html = escapeHtml(md);
368
393
  // Horizontal rules
369
394
  html = html.replace(/^---$/gm, '<hr>');
370
- // Headers
395
+ // Headers (most specific first — #### before ### before ## before #)
396
+ html = html.replace(/^#### (.+)$/gm, '<h4>$1</h4>');
371
397
  html = html.replace(/^### (.+)$/gm, '<h3>$1</h3>');
372
398
  html = html.replace(/^## (.+)$/gm, '<h2>$1</h2>');
373
399
  html = html.replace(/^# (.+)$/gm, '<h1>$1</h1>');
374
400
  // Bold
375
401
  html = html.replace(/\*\*\[([A-Z]+)\]\s*(.+?)\*\*/g, '<strong>[$1] $2</strong>');
376
402
  html = html.replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>');
377
- // Details/summary
403
+ // Details/summary + safe inline tags inside them.
404
+ // The Top-3 + "Additional findings" block in templates.ts wraps the
405
+ // summary label in <strong>, e.g. "<summary><strong>Additional findings
406
+ // (2)</strong></summary>". escapeHtml() above turned the inner <strong>
407
+ // into &lt;strong&gt;, which used to leak into the rendered HTML as
408
+ // literal text. Unescape these inline tags too — they are the only HTML
409
+ // we ever emit from the markdown templates, so a global pass is safe.
378
410
  html = html.replace(/&lt;details&gt;/g, '<details>');
379
411
  html = html.replace(/&lt;\/details&gt;/g, '</details>');
380
- html = html.replace(/&lt;summary&gt;(.+?)&lt;\/summary&gt;/g, '<summary>$1</summary>');
412
+ html = html.replace(/&lt;summary&gt;([\s\S]+?)&lt;\/summary&gt;/g, '<summary>$1</summary>');
413
+ html = html.replace(/&lt;(\/?)(strong|em)&gt;/g, '<$1$2>');
381
414
  // Tables
382
415
  html = html.replace(/((?:^\|.+\|$\n?)+)/gm, (tableBlock) => {
383
416
  const rows = tableBlock.trim().split('\n').filter(r => !r.match(/^\|[\s\-:|]+\|$/));
@@ -445,6 +478,22 @@ async function handleSessionPage(req, res, sessions, id) {
445
478
  : session.status === 'error'
446
479
  ? `<h2>Report</h2><p class="error-msg">Error: ${escapeHtml(session.error ?? 'Unknown error')}</p>`
447
480
  : '';
481
+ const compareSection = session.status === 'complete' && session.report
482
+ ? sessions.hasDiff(id)
483
+ ? `<h2>Comparison</h2>
484
+ <p>This session has been compared against a previous report.</p>
485
+ <div class="report-actions">
486
+ <a href="/sessions/${id}/compare" class="btn">View diff</a>
487
+ <button onclick="document.getElementById('compare-upload').click()" class="btn btn-outline">Replace — upload a different previous report</button>
488
+ </div>
489
+ <input type="file" id="compare-upload" accept=".md,.markdown,text/markdown" style="display:none" onchange="uploadCompare(this)">`
490
+ : `<h2>Compare to previous report</h2>
491
+ <p>Upload an older Heron audit report (markdown) to see what changed.</p>
492
+ <div class="report-actions">
493
+ <button onclick="document.getElementById('compare-upload').click()" class="btn">📁 Upload previous report (.md)</button>
494
+ </div>
495
+ <input type="file" id="compare-upload" accept=".md,.markdown,text/markdown" style="display:none" onchange="uploadCompare(this)">`
496
+ : '';
448
497
  const html = `<!DOCTYPE html>
449
498
  <html>
450
499
  <head><title>Heron</title>${FAVICON_LINK}
@@ -458,6 +507,13 @@ async function handleSessionPage(req, res, sessions, id) {
458
507
  <h2>Session <code>${id}</code> <span class="badge badge-${session.status}" id="session-status">${session.status}</span> ${riskBadge}</h2>
459
508
  <div class="meta" id="session-meta">${session.questionsAsked} questions &middot; started ${session.createdAt.toISOString().slice(0, 19).replace('T', ' ')} UTC</div>
460
509
 
510
+ <!--
511
+ UI ordering (2026-04-25): Compare-to-previous-report sits ABOVE the
512
+ rendered report. The compare CTA is short and discoverable; if it
513
+ sat below the long report a reader would have to scroll past the
514
+ entire findings table to find the upload button.
515
+ -->
516
+ <div id="compare-section">${compareSection}</div>
461
517
  <div id="report-section">${reportSection}</div>
462
518
 
463
519
  <h2>Interview Transcript (<span id="qa-count">${transcript.length}</span> Q&amp;A)</h2>
@@ -484,6 +540,30 @@ async function handleSessionPage(req, res, sessions, id) {
484
540
  }, 3000);
485
541
  })();
486
542
  </script>` : ''}
543
+ ${session.status === 'complete' ? `<script>
544
+ function uploadCompare(input) {
545
+ var file = input.files[0];
546
+ if (!file) return;
547
+ if (file.size > 128 * 1024) {
548
+ alert('File too large (max 128 KB)');
549
+ input.value = '';
550
+ return;
551
+ }
552
+ var reader = new FileReader();
553
+ reader.onload = function(e) {
554
+ fetch('/api/sessions/${id}/compare', {
555
+ method: 'POST',
556
+ headers: { 'Content-Type': 'text/markdown' },
557
+ body: e.target.result,
558
+ }).then(function(r) {
559
+ if (r.redirected) { window.location = r.url; return; }
560
+ if (r.ok) { window.location = '/sessions/${id}/compare'; return; }
561
+ return r.json().then(function(d) { alert('Upload failed: ' + (d.error || 'unknown')); });
562
+ }).catch(function(err) { alert('Upload error: ' + err.message); });
563
+ };
564
+ reader.readAsText(file);
565
+ }
566
+ </script>` : ''}
487
567
  </body>
488
568
  </html>`;
489
569
  res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'X-Content-Type-Options': 'nosniff' });
@@ -508,13 +588,14 @@ async function handleLanding(res, sessions, host) {
508
588
  <div id="sessions-table">${activeSessions.length === 0
509
589
  ? '<div class="empty"><p>No sessions yet.</p><p>Connect an agent to <code>/v1/chat/completions</code> to start an interview.</p></div>'
510
590
  : `<table>
511
- <thead><tr><th>Session</th><th>Status</th><th>Questions</th><th>Risk</th><th>Started</th></tr></thead>
591
+ <thead><tr><th>Session</th><th>Status</th><th>Questions</th><th>Risk</th><th>Compare</th><th>Started</th></tr></thead>
512
592
  <tbody>
513
593
  ${activeSessions.map(s => `<tr data-id="${s.id}">
514
594
  <td><a href="/sessions/${s.id}"><code>${s.id}</code></a></td>
515
595
  <td><span class="badge badge-${s.status}">${s.status}</span></td>
516
596
  <td>${s.questionsAsked}</td>
517
597
  <td>${s.reportJson?.overallRiskLevel ? `<span class="risk risk-${s.reportJson.overallRiskLevel}">${s.reportJson.overallRiskLevel.toUpperCase()}</span>` : '—'}</td>
598
+ <td>${sessions.hasDiff(s.id) ? `<a href="/sessions/${s.id}/compare">compare</a>` : '—'}</td>
518
599
  <td>${s.createdAt.toISOString().slice(0, 19).replace('T', ' ')}</td>
519
600
  </tr>`).join('')}
520
601
  </tbody>
@@ -554,6 +635,8 @@ Important: answer about THIS specific project — what you actually do, what sys
554
635
  <tr><td><code>GET /api/sessions</code></td><td>List all sessions (JSON)</td></tr>
555
636
  <tr><td><code>GET /api/sessions/:id</code></td><td>Session details + transcript</td></tr>
556
637
  <tr><td><code>GET /api/sessions/:id/report</code></td><td>Download audit report (markdown)</td></tr>
638
+ <tr><td><code>POST /api/sessions/:id/compare</code></td><td>Upload previous report, generate diff</td></tr>
639
+ <tr><td><code>GET /sessions/:id/compare</code></td><td>View diff (HTML)</td></tr>
557
640
  </tbody>
558
641
  </table>
559
642
 
@@ -582,7 +665,7 @@ Important: answer about THIS specific project — what you actually do, what sys
582
665
  var hasActive = sessions.some(function(s) { return s.status === 'interviewing' || s.status === 'analyzing'; });
583
666
  var tbody = table.querySelector('tbody');
584
667
  if (!tbody) {
585
- table.innerHTML = '<table><thead><tr><th>Session</th><th>Status</th><th>Questions</th><th>Risk</th><th>Started</th></tr></thead><tbody></tbody></table>';
668
+ table.innerHTML = '<table><thead><tr><th>Session</th><th>Status</th><th>Questions</th><th>Risk</th><th>Compare</th><th>Started</th></tr></thead><tbody></tbody></table>';
586
669
  tbody = table.querySelector('tbody');
587
670
  }
588
671
  sessions.forEach(function(s) {
@@ -590,14 +673,15 @@ Important: answer about THIS specific project — what you actually do, what sys
590
673
  if (!row) {
591
674
  row = document.createElement('tr');
592
675
  row.setAttribute('data-id', s.id);
593
- row.innerHTML = '<td><a href="/sessions/' + s.id + '"><code>' + s.id + '</code></a></td><td></td><td></td><td></td><td></td>';
676
+ row.innerHTML = '<td><a href="/sessions/' + s.id + '"><code>' + s.id + '</code></a></td><td></td><td></td><td></td><td></td><td></td>';
594
677
  tbody.insertBefore(row, tbody.firstChild);
595
678
  }
596
679
  var cells = row.querySelectorAll('td');
597
680
  cells[1].innerHTML = '<span class="badge badge-' + s.status + '">' + s.status + '</span>';
598
681
  cells[2].textContent = s.questionsAsked;
599
682
  cells[3].innerHTML = s.riskLevel ? '<span class="risk risk-' + s.riskLevel + '">' + s.riskLevel.toUpperCase() + '</span>' : '\\u2014';
600
- cells[4].textContent = s.createdAt.slice(0,19).replace('T',' ');
683
+ cells[4].innerHTML = s.hasDiff ? '<a href="/sessions/' + s.id + '/compare">compare</a>' : '\\u2014';
684
+ cells[5].textContent = s.createdAt.slice(0,19).replace('T',' ');
601
685
  });
602
686
  if (!hasActive) clearInterval(polling);
603
687
  }).catch(function() {});
@@ -609,6 +693,79 @@ Important: answer about THIS specific project — what you actually do, what sys
609
693
  res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'X-Content-Type-Options': 'nosniff' });
610
694
  res.end(html);
611
695
  }
696
+ // ─── Compare handlers (AAP-32) ────────────────────────────────────────────
697
+ const MAX_COMPARE_BODY_BYTES = 128 * 1024;
698
+ async function handlePostCompare(req, res, sessions, sessionId) {
699
+ // Stream-read the body with size cap.
700
+ const chunks = [];
701
+ let total = 0;
702
+ let oversize = false;
703
+ for await (const chunk of req) {
704
+ const buf = chunk;
705
+ total += buf.length;
706
+ if (total > MAX_COMPARE_BODY_BYTES) {
707
+ oversize = true;
708
+ req.resume(); // drain remaining chunks so the socket can be reused
709
+ break;
710
+ }
711
+ chunks.push(buf);
712
+ }
713
+ if (oversize) {
714
+ json(res, 413, { error: `Upload exceeds ${MAX_COMPARE_BODY_BYTES} byte limit` });
715
+ return;
716
+ }
717
+ const uploaded = Buffer.concat(chunks).toString('utf-8');
718
+ if (!uploaded.trim()) {
719
+ json(res, 400, { error: 'Empty upload' });
720
+ return;
721
+ }
722
+ const session = sessions.getSession(sessionId);
723
+ if (!session) {
724
+ json(res, 404, { error: 'Session not found' });
725
+ return;
726
+ }
727
+ if (session.status !== 'complete' || !session.report) {
728
+ json(res, 409, { error: `Session ${sessionId} has no report yet (status: ${session.status})` });
729
+ return;
730
+ }
731
+ try {
732
+ await sessions.compareWithUpload(sessionId, uploaded);
733
+ res.writeHead(303, { Location: `/sessions/${sessionId}/compare` });
734
+ res.end();
735
+ }
736
+ catch (err) {
737
+ const msg = err instanceof Error ? err.message : String(err);
738
+ logger.error(`Compare failed for ${sessionId}: ${msg}`);
739
+ json(res, 500, { error: msg });
740
+ }
741
+ }
742
+ async function handleComparePage(res, sessions, sessionId) {
743
+ const diff = sessions.getDiffContent(sessionId);
744
+ if (!diff) {
745
+ json(res, 404, {
746
+ error: 'No diff exists for this session. Upload a previous report first.',
747
+ });
748
+ return;
749
+ }
750
+ const html = `<!DOCTYPE html>
751
+ <html>
752
+ <head><title>Diff — ${sessionId}</title>${FAVICON_LINK}
753
+ <style>${SHARED_CSS}</style>
754
+ </head>
755
+ <body>
756
+ <div class="header">${HERON_LOGO}<h1>Heron</h1></div>
757
+ <p style="margin: 0 0 24px 0;"><a href="/sessions/${sessionId}">&larr; Back to session ${sessionId}</a></p>
758
+ <h2>Report Comparison</h2>
759
+ <div class="report-rendered">${markdownToHtml(diff)}</div>
760
+ <div class="footer">Powered by <a href="https://github.com/theonaai/Heron">Heron</a> &mdash; open-source agent checkpoint</div>
761
+ </body>
762
+ </html>`;
763
+ res.writeHead(200, {
764
+ 'Content-Type': 'text/html; charset=utf-8',
765
+ 'X-Content-Type-Options': 'nosniff',
766
+ });
767
+ res.end(html);
768
+ }
612
769
  function escapeHtml(s) {
613
770
  return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
614
771
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"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"}
@@ -62,6 +62,16 @@ export declare class SessionManager {
62
62
  }>;
63
63
  getSession(id: string): Session | undefined;
64
64
  listSessions(): Session[];
65
+ /**
66
+ * Diff an uploaded markdown report against this session's current report.
67
+ * Writes `${reportDir}/${sessionId}-diff.md` and returns the diff markdown.
68
+ * Overwrites any previous diff for this session.
69
+ */
70
+ compareWithUpload(sessionId: string, uploadedMd: string): Promise<string>;
71
+ /** Cheap existence check used by landing page + session page. */
72
+ hasDiff(sessionId: string): boolean;
73
+ /** Read the saved diff markdown for a session, or null if none. */
74
+ getDiffContent(sessionId: string): string | null;
65
75
  private getNextQuestion;
66
76
  private finishSession;
67
77
  private logEvent;
@@ -1 +1 @@
1
- {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../../src/server/sessions.ts"],"names":[],"mappings":"AACA,OAAO,EAAiC,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAKjG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAInE,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;AAEhF,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,kBAAkB,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,OAAO,CAAC;IACjH,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,sEAAsE;IACtE,eAAe,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC1C,wEAAwE;IACxE,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;IACxC,kFAAkF;IAClF,aAAa,EAAE,OAAO,CAAC;IACvB,+DAA+D;IAC/D,aAAa,EAAE,iBAAiB,EAAE,CAAC;IACnC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,WAAW,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,uDAAuD;IACvD,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAqB;gBAE1B,SAAS,EAAE,SAAS,EAAE,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO;IAM7F,yDAAyD;IACzD,aAAa,IAAI;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE;IAkC5D,6EAA6E;IACvE,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;QAAE,IAAI,EAAE,KAAK,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,WAAW,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,SAAS,EAAE,IAAI,CAAA;KAAE,CAAC;IAiEzI,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI3C,YAAY,IAAI,OAAO,EAAE;YAKX,eAAe;YA4Bf,aAAa;IAmF3B,OAAO,CAAC,QAAQ;CAOjB"}
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../../src/server/sessions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiC,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAKjG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAKnE,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;AAEhF,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,kBAAkB,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,OAAO,CAAC;IACjH,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,sEAAsE;IACtE,eAAe,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC1C,wEAAwE;IACxE,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;IACxC,kFAAkF;IAClF,aAAa,EAAE,OAAO,CAAC;IACvB,+DAA+D;IAC/D,aAAa,EAAE,iBAAiB,EAAE,CAAC;IACnC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,WAAW,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,uDAAuD;IACvD,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAqB;gBAE1B,SAAS,EAAE,SAAS,EAAE,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO;IAM7F,yDAAyD;IACzD,aAAa,IAAI;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE;IAkC5D,6EAA6E;IACvE,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;QAAE,IAAI,EAAE,KAAK,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,WAAW,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,SAAS,EAAE,IAAI,CAAA;KAAE,CAAC;IAiEzI,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI3C,YAAY,IAAI,OAAO,EAAE;IAIzB;;;;OAIG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAqB/E,iEAAiE;IACjE,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAKnC,mEAAmE;IACnE,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;YAOlC,eAAe;YA4Bf,aAAa;IA8F3B,OAAO,CAAC,QAAQ;CAOjB"}
@@ -1,10 +1,13 @@
1
+ import { existsSync, writeFileSync, mkdirSync, readFileSync } from 'node:fs';
1
2
  import { generateId } from '../util/id.js';
2
3
  import { createProtocol, isStaleAnswer } from '../interview/protocol.js';
3
4
  import { analyzeTranscript } from '../analysis/analyzer.js';
4
- import { computeRiskScore } from '../analysis/risk-scorer.js';
5
- import { computeRegulatoryFlags } from '../report/generator.js';
5
+ import { computeRiskScore, applySeverityOverrides } from '../analysis/risk-scorer.js';
6
+ import { mapFindingsToRiskCategories } from '../compliance/mapper.js';
6
7
  import { renderMarkdownReport } from '../report/templates.js';
7
8
  import * as logger from '../util/logger.js';
9
+ import { diffReports } from '../diff/differ.js';
10
+ import { isProvided } from '../util/provided.js';
8
11
  /**
9
12
  * Manages interrogation sessions for server mode.
10
13
  * Each agent that connects gets its own session with its own interview state.
@@ -117,6 +120,42 @@ export class SessionManager {
117
120
  listSessions() {
118
121
  return Array.from(this.sessions.values());
119
122
  }
123
+ /**
124
+ * Diff an uploaded markdown report against this session's current report.
125
+ * Writes `${reportDir}/${sessionId}-diff.md` and returns the diff markdown.
126
+ * Overwrites any previous diff for this session.
127
+ */
128
+ async compareWithUpload(sessionId, uploadedMd) {
129
+ const session = this.sessions.get(sessionId);
130
+ if (!session)
131
+ throw new Error(`Session not found: ${sessionId}`);
132
+ if (session.status !== 'complete' || !session.report) {
133
+ throw new Error(`Session ${sessionId} has no report yet (status: ${session.status})`);
134
+ }
135
+ if (!this.reportDir) {
136
+ throw new Error('Server has no reportDir configured; cannot save diff');
137
+ }
138
+ const diff = await diffReports(uploadedMd, session.report, this.llmClient);
139
+ mkdirSync(this.reportDir, { recursive: true });
140
+ const diffPath = `${this.reportDir}/${sessionId}-diff.md`;
141
+ writeFileSync(diffPath, diff, 'utf-8');
142
+ return diff;
143
+ }
144
+ /** Cheap existence check used by landing page + session page. */
145
+ hasDiff(sessionId) {
146
+ if (!this.reportDir)
147
+ return false;
148
+ return existsSync(`${this.reportDir}/${sessionId}-diff.md`);
149
+ }
150
+ /** Read the saved diff markdown for a session, or null if none. */
151
+ getDiffContent(sessionId) {
152
+ if (!this.reportDir)
153
+ return null;
154
+ const path = `${this.reportDir}/${sessionId}-diff.md`;
155
+ if (!existsSync(path))
156
+ return null;
157
+ return readFileSync(path, 'utf-8');
158
+ }
120
159
  async getNextQuestion(session) {
121
160
  // Drain the question queue first (clean replacement for monkey-patching)
122
161
  if (session.questionQueue.length > 0) {
@@ -145,10 +184,17 @@ export class SessionManager {
145
184
  this.logEvent(session, 'analysis_start', {});
146
185
  try {
147
186
  const transcript = session.protocol.getTranscript();
148
- const dataQuality = computeDataQuality(transcript);
149
- const analysis = await analyzeTranscript(this.llmClient, transcript);
187
+ const analysis = await analyzeTranscript(this.llmClient, transcript, session.id);
188
+ analysis.risks = applySeverityOverrides(analysis.risks, analysis.systems, analysis.makesDecisionsAboutPeople);
189
+ // AAP-43 P1 #6: compute DQ AFTER analysis so we can penalize extracted NOT_PROVIDED
190
+ const dataQuality = computeDataQuality(transcript, analysis.systems);
150
191
  const riskScore = computeRiskScore(analysis.systems, analysis.risks);
151
- const regulatoryCompliance = computeRegulatoryFlags(analysis, transcript);
192
+ const compliance = mapFindingsToRiskCategories({
193
+ systems: analysis.systems,
194
+ transcript,
195
+ makesDecisionsAboutPeople: analysis.makesDecisionsAboutPeople,
196
+ decisionMakingDetails: analysis.decisionMakingDetails,
197
+ });
152
198
  const reportJson = {
153
199
  summary: analysis.summary,
154
200
  agentPurpose: analysis.agentPurpose,
@@ -165,7 +211,7 @@ export class SessionManager {
165
211
  dataQuality,
166
212
  makesDecisionsAboutPeople: analysis.makesDecisionsAboutPeople,
167
213
  decisionMakingDetails: analysis.decisionMakingDetails,
168
- regulatoryCompliance,
214
+ compliance,
169
215
  metadata: {
170
216
  date: session.createdAt.toISOString().split('T')[0],
171
217
  target: `session:${session.id}`,
@@ -224,7 +270,7 @@ export class SessionManager {
224
270
  }
225
271
  // ─── Data Quality Computation ────────────────────────────────────────────────
226
272
  /** Compute data quality metrics from the interview transcript */
227
- function computeDataQuality(transcript) {
273
+ function computeDataQuality(transcript, systems) {
228
274
  const totalQuestions = transcript.length;
229
275
  // Count repeated/canned answers
230
276
  const repeatedAnswers = transcript.filter(qa => qa.answer.startsWith('[REPEATED RESPONSE]')).length;
@@ -255,10 +301,28 @@ function computeDataQuality(transcript) {
255
301
  fieldsMissing.push(field);
256
302
  }
257
303
  }
258
- // Score: percentage of fields provided, penalized by repeats
304
+ // Score: percentage of fields provided, penalized by repeats + extraction gaps
259
305
  const fieldScore = (fieldsProvided.length / Object.keys(fieldChecks).length) * 100;
260
306
  const repeatPenalty = (repeatedAnswers / Math.max(totalQuestions, 1)) * 50;
261
- const score = Math.max(0, Math.min(100, Math.round(fieldScore - repeatPenalty)));
307
+ // AAP-43 P1 #6: penalty for NOT_PROVIDED fields in extracted systems
308
+ let notProvidedPenalty = 0;
309
+ if (systems) {
310
+ let gaps = 0;
311
+ for (const s of systems) {
312
+ if (!isProvided(s.dataSensitivity))
313
+ gaps++;
314
+ if (!isProvided(s.frequencyAndVolume))
315
+ gaps++;
316
+ if (s.scopesRequested.length === 0 || !s.scopesRequested.some(isProvided))
317
+ gaps++;
318
+ for (const w of s.writeOperations) {
319
+ if (!isProvided(w.volumePerDay))
320
+ gaps++;
321
+ }
322
+ }
323
+ notProvidedPenalty = Math.min(50, gaps * 8);
324
+ }
325
+ const score = Math.max(0, Math.min(100, Math.round(fieldScore - repeatPenalty - notProvidedPenalty)));
262
326
  return {
263
327
  score,
264
328
  uniqueAnswers,