Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
388 changes: 388 additions & 0 deletions compliance-firewall-agent/app/deployment-modes/page.tsx

Large diffs are not rendered by default.

14 changes: 7 additions & 7 deletions compliance-firewall-agent/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -106,35 +106,35 @@ const globalJsonLd = [
name: "Free",
price: "0",
priceCurrency: "USD",
description: "Free tier — up to 1,000 prompts/month, basic compliance scanning",
description: "Free tier — up to 1,000 prompts/month, CMMC self-assessment, SPRS calculator, 110-control gap analysis",
},
{
"@type": "Offer",
name: "Pro",
price: "199",
priceCurrency: "USD",
description: "Pro — 50K scans/month, SOC 2 + HIPAA coverage, PDF reports",
description: "Pro — AI gateway (50K scans/mo), 10 seats, SSP generation, SOC 2 + HIPAA coverage, priority support",
},
{
"@type": "Offer",
name: "Growth",
price: "499",
priceCurrency: "USD",
description: "Growth — unlimited scans, C3PAO coordination, SSO & RBAC",
description: "Growth — unlimited scans, 25 seats, PDF compliance reports, C3PAO coordination, SSO & RBAC",
},
{
"@type": "Offer",
name: "Enterprise",
price: "999",
priceCurrency: "USD",
description: "Enterprise — custom detection rules, air-gap support, SLA 99.99%",
description: "Enterprise — unlimited seats, on-prem / air-gapped deployment, dedicated CSM, custom detection rules, SLA 99.99%",
},
{
"@type": "Offer",
name: "Federal",
price: "2499",
name: "Audit Pack",
price: "999",
priceCurrency: "USD",
description: "Federalmulti-tenant agency deployments, SLA, custom integrations",
description: "One-timeSSP + POA&M + 14 NIST 800-171 policy templates + 1-hour Registered Practitioner review",
},
],
featureList: [
Expand Down
538 changes: 372 additions & 166 deletions compliance-firewall-agent/app/security/page.tsx

Large diffs are not rendered by default.

12 changes: 12 additions & 0 deletions compliance-firewall-agent/app/sitemap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,18 @@ export default function sitemap(): MetadataRoute.Sitemap {
changeFrequency: "weekly",
priority: 0.9,
},
{
url: `${baseUrl}/security`,
lastModified: new Date(),
changeFrequency: "monthly",
priority: 0.85,
},
{
url: `${baseUrl}/deployment-modes`,
lastModified: new Date(),
changeFrequency: "monthly",
priority: 0.85,
},
{
url: `${baseUrl}/terms`,
lastModified: new Date(),
Expand Down
79 changes: 66 additions & 13 deletions compliance-firewall-agent/components/GlobalChat.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
"use client";

import { useState, useRef, useEffect, useCallback } from "react";
import { X, Send } from "lucide-react";
import { X, Send, Sparkles } from "lucide-react";
import ReactMarkdown from "react-markdown";
import { Logo } from "@/components/Logo";

const QUICK_ACTIONS = [
"How does CMMC Level 2 work?",
"What can you detect?",
"How do I install Hound Shield?",
"What is SPRS scoring?",
"What can Hound Shield detect?",
"How do I install it?",
"What is CUI?",
"Pricing?",
];

const HOUNDSHIELD_SYSTEM =
Expand All @@ -29,7 +33,7 @@ const HOUNDSHIELD_SYSTEM =
"Contact: info@houndshield.com. Docs: houndshield.com/docs.";

const GREETING =
"Hi! I'm Brain AI — powered by Hound Shield. I can help with CMMC Level 2 compliance, CUI detection, SPRS scoring, and anything about AI security for defense contractors. Ask me anything!";
"Hi! I'm **Brain AI** — Hound Shield's CMMC compliance assistant.\n\nI can answer instantly (no LLM needed) about:\n\n- **CMMC Level 2** controls, SPRS scoring, C3PAO assessment\n- **CUI / PHI / PII** detection — what we block and why\n- **HIPAA** Safe Harbor identifiers\n- **SOC 2** Trust Services criteria\n- **Installation** — the one-URL change\n- **Pricing** and deployment modes\n\nTry a quick action below, or just ask.";

type Message = { role: "user" | "bot"; text: string };

Expand Down Expand Up @@ -197,7 +201,8 @@ export function GlobalChat() {
...prev,
{
role: "bot",
text: "Something went wrong connecting to Brain AI. Try asking about CMMC, SPRS, CUI, or installation — those work offline!",
text:
"Brain AI hit a network error. CMMC, SPRS, CUI, HIPAA, SOC 2, installation, and pricing all answer **offline** from local knowledge — try one of those, or retry your question.",
},
]);
}
Expand Down Expand Up @@ -267,31 +272,71 @@ export function GlobalChat() {
{/* Messages */}
<div
ref={msgsRef}
className="flex flex-col gap-2.5 px-3.5 py-3.5 max-h-[300px] overflow-y-auto"
className="flex flex-col gap-2.5 px-3.5 py-3.5 max-h-[360px] overflow-y-auto"
>
{messages.map((msg, i) => (
<div
key={i}
className={`max-w-[88%] px-3.5 py-2.5 rounded-2xl text-[13px] leading-relaxed whitespace-pre-wrap ${
className={`max-w-[92%] px-3.5 py-2.5 rounded-2xl text-[13px] leading-relaxed ${
msg.role === "user"
? "self-end bg-indigo-500 text-white rounded-br-sm"
: "self-start bg-white/[0.05] text-white/85 border border-white/[0.07] rounded-bl-sm"
? "self-end bg-indigo-500 text-white rounded-br-sm whitespace-pre-wrap"
: "self-start bg-white/[0.05] text-white/85 border border-white/[0.07] rounded-bl-sm prose-chat"
}`}
>
{msg.text}
{msg.role === "user" ? (
msg.text
) : (
<ReactMarkdown
components={{
a: ({ href, children }) => (
<a
href={href}
target="_blank"
rel="noopener noreferrer"
className="text-indigo-300 underline decoration-indigo-400/40 hover:decoration-indigo-300"
>
{children}
</a>
),
code: ({ children }) => (
<code className="px-1.5 py-0.5 rounded bg-black/40 text-indigo-200 text-[12px] font-mono break-all">
{children}
</code>
),
pre: ({ children }) => (
<pre className="my-2 p-2.5 rounded-lg bg-black/40 border border-white/[0.06] text-[12px] font-mono overflow-x-auto whitespace-pre-wrap break-all">
{children}
</pre>
),
ul: ({ children }) => (
<ul className="list-disc pl-4 my-1.5 space-y-1">{children}</ul>
),
ol: ({ children }) => (
<ol className="list-decimal pl-4 my-1.5 space-y-1">{children}</ol>
),
strong: ({ children }) => (
<strong className="font-semibold text-white">{children}</strong>
),
p: ({ children }) => <p className="my-1.5 first:mt-0 last:mb-0">{children}</p>,
}}
>
{msg.text}
</ReactMarkdown>
)}
</div>
))}
{isTyping && <TypingDots />}
</div>

{/* Quick Actions */}
{showQuickActions && messages.length > 0 && (
{/* Quick Actions — always visible while open */}
{showQuickActions && (
<div className="flex flex-wrap gap-1.5 px-3 py-2 border-t border-white/[0.04]">
{QUICK_ACTIONS.map((action) => (
<button
key={action}
onClick={() => sendMessage(action)}
className="text-[11px] px-2.5 py-1.5 rounded-full cursor-pointer transition-all text-indigo-300 hover:bg-indigo-500/25"
disabled={isTyping}
className="text-[11px] px-2.5 py-1.5 rounded-full cursor-pointer transition-all text-indigo-300 hover:bg-indigo-500/25 disabled:opacity-40 disabled:pointer-events-none"
style={{
background: "rgba(99,102,241,0.1)",
border: "1px solid rgba(99,102,241,0.25)",
Expand All @@ -303,6 +348,14 @@ export function GlobalChat() {
</div>
)}

{/* Capability badge — explains it works without LLM key */}
<div className="flex items-center gap-1.5 px-3.5 py-1.5 border-t border-white/[0.04] bg-white/[0.015]">
<Sparkles className="w-3 h-3 text-indigo-300/70" />
<span className="text-[10px] text-white/40">
Local CMMC knowledge · works offline
</span>
</div>

{/* Input */}
<form
onSubmit={(e) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ exports[`HeroSection > matches snapshot 1`] = `
<span
class="text-xs font-mono text-amber-400"
>
170
168
days until CMMC Phase 2 enforcement (Nov 10, 2026)
</span>
</div>
Expand Down
18 changes: 12 additions & 6 deletions compliance-firewall-agent/components/layout/FooterV3.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,18 @@ const FOOTER_LINKS = {
{ label: 'Roadmap', href: '/roadmap' },
],
Compliance: [
{ label: 'CMMC Level 2', href: '/features' },
{ label: 'HIPAA', href: '/hipaa' },
{ label: 'SOC 2', href: '/features' },
{ label: 'NIST 800-171', href: '/features' },
{ label: 'DFARS 7012', href: '/features' },
{ label: 'CMMC Level 2', href: '/features' },
{ label: 'HIPAA', href: '/hipaa' },
{ label: 'SOC 2', href: '/features' },
{ label: 'NIST 800-171', href: '/features' },
{ label: 'Deployment modes', href: '/deployment-modes' },
],
Resources: [
{ label: 'Documentation', href: '/docs' },
{ label: 'Security', href: '/security' },
{ label: 'Blog', href: '/blog' },
{ label: 'Partners', href: '/partners' },
{ label: 'Contact', href: '/contact' },
{ label: 'About', href: '/about' },
],
}

Expand Down Expand Up @@ -110,6 +110,9 @@ export function FooterV3({ dark = false }: FooterV3Props) {
<Link href="/terms" className="text-xs text-slate-600 hover:text-slate-400 transition-colors font-[var(--font-body)]">
Terms
</Link>
<Link href="/security" className="text-xs text-slate-600 hover:text-slate-400 transition-colors font-[var(--font-body)]">
Security
</Link>
</div>
</div>
</div>
Expand Down Expand Up @@ -188,6 +191,9 @@ export function FooterV3({ dark = false }: FooterV3Props) {
<Link href="/terms" className="text-xs text-[var(--hs-ink-tertiary)] hover:text-[var(--hs-ink)] transition-colors font-[var(--font-body)]">
Terms
</Link>
<Link href="/security" className="text-xs text-[var(--hs-ink-tertiary)] hover:text-[var(--hs-ink)] transition-colors font-[var(--font-body)]">
Security
</Link>
</div>
</div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion compliance-firewall-agent/lib/blog/posts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ const posts: BlogPost[] = [

<h2>The Technical Solution: Local AI Proxy</h2>
<p>HoundShield intercepts every AI API call before it leaves your network. It runs pattern matching against 200+ CUI indicators (CAGE codes, contract numbers, classification markings, clearance levels, PHI markers) in under 10ms. Blocked requests never reach the external AI service. Every decision creates an immutable log entry.</p>
<p>Setup is one line: point your AI tool's API base URL to your Kaelus endpoint instead of api.openai.com. No code changes. No agent installation on every machine. One network-level change covers your entire organization.</p>
<p>Setup is one line: point your AI tool's API base URL to your HoundShield endpoint instead of api.openai.com. No code changes. No agent installation on every machine. One network-level change covers your entire organization.</p>
`,
},
{
Expand Down
Loading