opmsec 0.1.3 → 0.1.5
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/.env.example +1 -0
- package/.husky/pre-commit +1 -0
- package/README.md +71 -275
- package/bun.lock +5 -5
- package/docs/architecture/agents.mdx +11 -59
- package/docs/architecture/benchmarks.mdx +20 -46
- package/docs/architecture/overview.mdx +31 -38
- package/docs/architecture/scanner.mdx +11 -37
- package/docs/cli/audit.mdx +9 -12
- package/docs/cli/check.mdx +12 -26
- package/docs/cli/fix.mdx +10 -30
- package/docs/cli/info.mdx +12 -19
- package/docs/cli/install.mdx +27 -39
- package/docs/cli/push.mdx +40 -57
- package/docs/cli/register-agent.mdx +21 -53
- package/docs/cli/view.mdx +12 -29
- package/docs/concepts/ens-records.mdx +44 -0
- package/docs/concepts/multi-agent-consensus.mdx +18 -36
- package/docs/concepts/on-chain-registry.mdx +22 -49
- package/docs/concepts/security-model.mdx +20 -52
- package/docs/concepts/zk-agent-verification.mdx +26 -64
- package/docs/contract/events.mdx +13 -74
- package/docs/contract/functions.mdx +40 -126
- package/docs/contract/overview.mdx +17 -36
- package/docs/introduction.mdx +22 -25
- package/docs/mint.json +3 -2
- package/docs/quickstart.mdx +34 -70
- package/docs/system-design.png +0 -0
- package/package.json +7 -6
- package/packages/cli/src/commands/author-view.tsx +87 -2
- package/packages/cli/src/commands/check.tsx +18 -5
- package/packages/cli/src/commands/fix.tsx +25 -12
- package/packages/cli/src/commands/info.tsx +92 -4
- package/packages/cli/src/commands/install.tsx +327 -23
- package/packages/cli/src/commands/push.tsx +112 -0
- package/packages/cli/src/commands/register-agent.tsx +72 -31
- package/packages/cli/src/index.tsx +7 -5
- package/packages/cli/src/services/ens-records.ts +525 -0
- package/packages/cli/src/services/version.ts +156 -5
- package/packages/core/src/benchmarks.ts +116 -0
- package/packages/core/src/constants.ts +18 -6
- package/packages/core/src/model-rankings.ts +40 -15
- package/packages/core/src/types.ts +10 -0
- package/packages/core/src/utils.ts +136 -1
- package/packages/scanner/src/index.ts +2 -1
- package/packages/scanner/src/queue/memory-queue.ts +7 -2
- package/packages/scanner/src/services/benchmark-runner.ts +86 -1
- package/packages/scanner/src/services/fileverse.ts +61 -12
- package/packages/scanner/src/services/openrouter.ts +18 -7
- package/packages/web/.next/BUILD_ID +1 -0
- package/packages/web/.next/app-path-routes-manifest.json +4 -0
- package/packages/web/.next/diagnostics/build-diagnostics.json +6 -0
- package/packages/web/.next/diagnostics/framework.json +1 -0
- package/packages/web/.next/export-marker.json +6 -0
- package/packages/web/.next/images-manifest.json +58 -0
- package/packages/web/.next/next-minimal-server.js.nft.json +1 -0
- package/packages/web/.next/next-server.js.nft.json +1 -0
- package/packages/web/.next/prerender-manifest.json +54 -4
- package/packages/web/.next/required-server-files.json +320 -0
- package/packages/web/.next/routes-manifest.json +53 -1
- package/packages/web/.next/server/app/_not-found/page.js +2 -0
- package/packages/web/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/packages/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
- package/packages/web/.next/server/app/_not-found.html +1 -0
- package/packages/web/.next/server/app/_not-found.meta +8 -0
- package/packages/web/.next/server/app/_not-found.rsc +18 -0
- package/packages/web/.next/server/app/index.html +6 -0
- package/packages/web/.next/server/app/index.meta +7 -0
- package/packages/web/.next/server/app/index.rsc +22 -0
- package/packages/web/.next/server/app/page.js +24 -24
- package/packages/web/.next/server/app/page.js.nft.json +1 -0
- package/packages/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/packages/web/.next/server/chunks/611.js +6 -0
- package/packages/web/.next/server/chunks/778.js +30 -0
- package/packages/web/.next/server/functions-config-manifest.json +4 -0
- package/packages/web/.next/server/interception-route-rewrite-manifest.js +1 -1
- package/packages/web/.next/server/next-font-manifest.js +1 -1
- package/packages/web/.next/server/next-font-manifest.json +1 -1
- package/packages/web/.next/server/pages/404.html +1 -0
- package/packages/web/.next/server/pages/500.html +1 -0
- package/packages/web/.next/server/pages/_app.js +1 -0
- package/packages/web/.next/server/pages/_app.js.nft.json +1 -0
- package/packages/web/.next/server/pages/_document.js +1 -0
- package/packages/web/.next/server/pages/_document.js.nft.json +1 -0
- package/packages/web/.next/server/pages/_error.js +19 -0
- package/packages/web/.next/server/pages/_error.js.nft.json +1 -0
- package/packages/web/.next/server/webpack-runtime.js +2 -2
- package/packages/web/.next/static/0esGzFBCzREfVwijEGDfL/_buildManifest.js +1 -0
- package/packages/web/.next/static/0esGzFBCzREfVwijEGDfL/_ssgManifest.js +1 -0
- package/packages/web/.next/static/chunks/174-5b5efcb3b8efcc01.js +1 -0
- package/packages/web/.next/static/chunks/255-0dc49b7a6e8e5c05.js +1 -0
- package/packages/web/.next/static/chunks/4bd1b696-382748cc942d8a14.js +1 -0
- package/packages/web/.next/static/chunks/app/_not-found/page-0da542be7eb33a64.js +1 -0
- package/packages/web/.next/static/chunks/app/layout-de8e841104500505.js +1 -0
- package/packages/web/.next/static/chunks/app/layout.js +37 -7
- package/packages/web/.next/static/chunks/app/page-7e086379698b9fb0.js +1 -0
- package/packages/web/.next/static/chunks/app/page.js +297 -1
- package/packages/web/.next/static/chunks/framework-ac73abd125e371fe.js +1 -0
- package/packages/web/.next/static/chunks/main-4e8d71b5ef7ee7e3.js +1 -0
- package/packages/web/.next/static/chunks/main-app-dd261207182e5a23.js +1 -0
- package/packages/web/.next/static/chunks/pages/_app-7d307437aca18ad4.js +1 -0
- package/packages/web/.next/static/chunks/pages/_error-cb2a52f75f2162e2.js +1 -0
- package/packages/web/.next/static/chunks/webpack-0dcd67569eb46132.js +1 -0
- package/packages/web/.next/static/chunks/webpack.js +2 -2
- package/packages/web/.next/static/css/102562cf2d0ae9b0.css +3 -0
- package/packages/web/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
- package/packages/web/.next/static/media/747892c23ea88013-s.woff2 +0 -0
- package/packages/web/.next/static/media/8d697b304b401681-s.woff2 +0 -0
- package/packages/web/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
- package/packages/web/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
- package/packages/web/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
- package/packages/web/.next/static/webpack/16f18baa938a434c.webpack.hot-update.json +1 -0
- package/packages/web/.next/static/webpack/5fe9fe8578f9c3d2.webpack.hot-update.json +1 -0
- package/packages/web/.next/static/webpack/73c7d02260cc80e4.webpack.hot-update.json +1 -0
- package/packages/web/.next/static/webpack/a2d85d19aa028de1.webpack.hot-update.json +1 -0
- package/packages/web/.next/static/webpack/app/{layout.73e341375c8d429e.hot-update.js → layout.16f18baa938a434c.hot-update.js} +1 -1
- package/packages/web/.next/static/webpack/app/{layout.6fee6306e0f98869.hot-update.js → layout.5fe9fe8578f9c3d2.hot-update.js} +1 -1
- package/packages/web/.next/static/webpack/app/layout.653e365406c0d9ac.hot-update.js +22 -0
- package/packages/web/.next/static/webpack/app/layout.6800169a899e3a8b.hot-update.js +22 -0
- package/packages/web/.next/static/webpack/app/layout.73c7d02260cc80e4.hot-update.js +22 -0
- package/packages/web/.next/static/webpack/app/layout.a2d85d19aa028de1.hot-update.js +22 -0
- package/packages/web/.next/static/webpack/app/page.653e365406c0d9ac.hot-update.js +22 -0
- package/packages/web/.next/static/webpack/app/page.6800169a899e3a8b.hot-update.js +22 -0
- package/packages/web/.next/static/webpack/app/page.73c7d02260cc80e4.hot-update.js +22 -0
- package/packages/web/.next/static/webpack/app/page.a2d85d19aa028de1.hot-update.js +22 -0
- package/packages/web/.next/static/webpack/{webpack.6fee6306e0f98869.hot-update.js → webpack.16f18baa938a434c.hot-update.js} +2 -2
- package/packages/web/.next/static/webpack/{webpack.73e341375c8d429e.hot-update.js → webpack.5fe9fe8578f9c3d2.hot-update.js} +2 -2
- package/packages/web/.next/static/webpack/webpack.653e365406c0d9ac.hot-update.js +12 -0
- package/packages/web/.next/static/webpack/webpack.6800169a899e3a8b.hot-update.js +12 -0
- package/packages/web/.next/static/webpack/webpack.73c7d02260cc80e4.hot-update.js +12 -0
- package/packages/web/.next/static/webpack/webpack.a2d85d19aa028de1.hot-update.js +12 -0
- package/packages/web/.next/trace +2 -5
- package/packages/web/app/globals.css +197 -51
- package/packages/web/app/layout.tsx +6 -3
- package/packages/web/app/page.tsx +791 -309
- package/packages/web/bun.lock +66 -105
- package/packages/web/next.config.ts +8 -1
- package/packages/web/package.json +5 -2
- package/packages/web/postcss.config.mjs +2 -2
- package/packages/web/public/apple-icon.png +1 -0
- package/packages/web/public/dependency-bottleneck.png +0 -0
- package/packages/web/public/icon-dark-32x32.png +1 -0
- package/packages/web/public/icon-light-32x32.png +1 -0
- package/packages/web/public/icon.svg +1 -0
- package/packages/web/public/nextjs-cve-announcement.png +0 -0
- package/packages/web/public/phantomraven-npm-attack.png +0 -0
- package/packages/web/public/placeholder-logo.png +1 -0
- package/packages/web/public/placeholder-logo.svg +1 -0
- package/packages/web/public/placeholder-user.jpg +1 -0
- package/packages/web/public/placeholder.jpg +1 -0
- package/packages/web/public/placeholder.svg +1 -0
- package/packages/web/public/react-cve-meme.png +0 -0
- package/packages/web/public/wallet-drain-exploit.png +0 -0
- package/packages/web/styles/globals.css +125 -0
- package/packages/web/.next/server/vendor-chunks/@swc.js +0 -55
- package/packages/web/.next/server/vendor-chunks/next.js +0 -3010
- package/packages/web/.next/static/chunks/app-pages-internals.js +0 -182
- package/packages/web/.next/static/chunks/main-app.js +0 -1882
- package/packages/web/.next/static/css/app/layout.css +0 -1237
- package/packages/web/.next/static/webpack/633457081244afec._.hot-update.json +0 -1
- package/packages/web/.next/static/webpack/app/page.6fee6306e0f98869.hot-update.js +0 -22
- package/packages/web/.next/static/webpack/app/page.73e341375c8d429e.hot-update.js +0 -22
- package/packages/web/tailwind.config.ts +0 -48
- /package/packages/web/.next/static/chunks/{polyfills.js → polyfills-42372ed130431b0a.js} +0 -0
- /package/packages/web/.next/static/webpack/{6fee6306e0f98869.webpack.hot-update.json → 653e365406c0d9ac.webpack.hot-update.json} +0 -0
- /package/packages/web/.next/static/webpack/{73e341375c8d429e.webpack.hot-update.json → 6800169a899e3a8b.webpack.hot-update.json} +0 -0
|
@@ -1,358 +1,840 @@
|
|
|
1
|
-
|
|
1
|
+
"use client"
|
|
2
2
|
|
|
3
|
-
import { useEffect, useState } from
|
|
3
|
+
import { useEffect, useState } from "react"
|
|
4
|
+
import { Copy, Check } from "lucide-react"
|
|
5
|
+
import Image from "next/image"
|
|
4
6
|
|
|
5
|
-
const DOCS_URL =
|
|
6
|
-
const GITHUB_URL =
|
|
7
|
-
const NPM_URL =
|
|
8
|
-
const CONTRACT =
|
|
7
|
+
const DOCS_URL = process.env.NEXT_PUBLIC_DOCS_URL || "https://docs.opm.dev";
|
|
8
|
+
const GITHUB_URL = "https://github.com/dhananjaypai08/opm";
|
|
9
|
+
const NPM_URL = "https://www.npmjs.com/package/opmsec";
|
|
10
|
+
const CONTRACT = "0x16684391fc9bf48246B08Afe16d1a57BFa181d48";
|
|
9
11
|
const BASESCAN = `https://sepolia.basescan.org/address/${CONTRACT}`;
|
|
10
12
|
|
|
11
|
-
function
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
)
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function Nav() {
|
|
22
|
-
const [scrolled, setScrolled] = useState(false);
|
|
23
|
-
useEffect(() => {
|
|
24
|
-
const handler = () => setScrolled(window.scrollY > 20);
|
|
25
|
-
window.addEventListener('scroll', handler, { passive: true });
|
|
26
|
-
return () => window.removeEventListener('scroll', handler);
|
|
27
|
-
}, []);
|
|
28
|
-
|
|
29
|
-
return (
|
|
30
|
-
<nav className={`fixed top-0 left-0 right-0 z-40 transition-all duration-300 ${scrolled ? 'bg-bg/80 backdrop-blur-xl border-b border-border' : ''}`}>
|
|
31
|
-
<div className="max-w-6xl mx-auto px-6 h-16 flex items-center justify-between">
|
|
32
|
-
<a href="/" className="flex items-center gap-2.5 hover:opacity-80 transition-opacity">
|
|
33
|
-
<Logo size={24} />
|
|
34
|
-
<span className="text-lg font-semibold tracking-tight">opm</span>
|
|
35
|
-
<span className="text-[10px] font-mono text-muted bg-surface px-1.5 py-0.5 rounded border border-border">v0.1.3</span>
|
|
36
|
-
</a>
|
|
37
|
-
<div className="flex items-center gap-8">
|
|
38
|
-
<a href="#features" className="text-sm text-muted hover:text-accent transition-colors">Features</a>
|
|
39
|
-
<a href="#architecture" className="text-sm text-muted hover:text-accent transition-colors">Architecture</a>
|
|
40
|
-
<a href="#cli" className="text-sm text-muted hover:text-accent transition-colors">CLI</a>
|
|
41
|
-
<a href={DOCS_URL} target="_blank" rel="noopener" className="text-sm text-muted hover:text-accent transition-colors">Docs</a>
|
|
42
|
-
<a href={GITHUB_URL} target="_blank" rel="noopener" className="text-sm text-muted hover:text-accent transition-colors">GitHub</a>
|
|
43
|
-
<a href={BASESCAN} target="_blank" rel="noopener" className="text-sm font-mono text-muted hover:text-accent transition-colors flex items-center gap-1.5">
|
|
44
|
-
<span className="w-1.5 h-1.5 rounded-full bg-green-500 animate-pulse" />
|
|
45
|
-
Base Sepolia
|
|
46
|
-
</a>
|
|
47
|
-
</div>
|
|
48
|
-
</div>
|
|
49
|
-
</nav>
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function Hero() {
|
|
54
|
-
return (
|
|
55
|
-
<section className="relative min-h-screen flex items-center justify-center grid-bg overflow-hidden">
|
|
56
|
-
<div className="absolute inset-0">
|
|
57
|
-
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[800px] h-[800px] rounded-full bg-gradient-radial from-white/[0.02] to-transparent animate-glow-pulse" />
|
|
58
|
-
</div>
|
|
59
|
-
|
|
60
|
-
<div className="relative z-10 max-w-4xl mx-auto px-6 text-center">
|
|
61
|
-
<div className="animate-fade-in">
|
|
62
|
-
<div className="inline-flex items-center gap-2 text-xs font-mono text-muted mb-8 px-3 py-1.5 rounded-full border border-border bg-surface/50">
|
|
63
|
-
<span className="w-1.5 h-1.5 rounded-full bg-green-500" />
|
|
64
|
-
Secured by multi-agent consensus on Base L2
|
|
65
|
-
</div>
|
|
66
|
-
</div>
|
|
67
|
-
|
|
68
|
-
<h1 className="text-6xl md:text-8xl font-bold tracking-tighter leading-[0.9] mb-6 animate-slide-up" style={{ animationDelay: '0.1s', animationFillMode: 'backwards' }}>
|
|
69
|
-
On-chain<br />
|
|
70
|
-
<span className="text-transparent bg-clip-text bg-gradient-to-r from-white via-white/90 to-white/40">
|
|
71
|
-
Package Security
|
|
72
|
-
</span>
|
|
73
|
-
</h1>
|
|
74
|
-
|
|
75
|
-
<p className="text-lg md:text-xl text-muted max-w-2xl mx-auto mb-12 leading-relaxed animate-slide-up" style={{ animationDelay: '0.3s', animationFillMode: 'backwards' }}>
|
|
76
|
-
Cryptographic attestation, multi-model AI auditing, and immutable risk scoring for every npm package. All verified on-chain.
|
|
77
|
-
</p>
|
|
78
|
-
|
|
79
|
-
<div className="flex flex-col sm:flex-row items-center justify-center gap-4 animate-slide-up" style={{ animationDelay: '0.5s', animationFillMode: 'backwards' }}>
|
|
80
|
-
<div className="group relative">
|
|
81
|
-
<div className="absolute -inset-0.5 bg-gradient-to-r from-white/20 to-white/5 rounded-lg opacity-0 group-hover:opacity-100 transition-opacity blur-sm" />
|
|
82
|
-
<code className="relative flex items-center gap-3 bg-surface border border-border rounded-lg px-5 py-3 font-mono text-sm cursor-pointer hover:border-border-light transition-colors">
|
|
83
|
-
<span className="text-muted">$</span>
|
|
84
|
-
<span>npm i -g opmsec</span>
|
|
85
|
-
<span className="text-muted/50">|</span>
|
|
86
|
-
<span className="text-muted text-xs">then: opm install {'<pkg>'}</span>
|
|
87
|
-
</code>
|
|
88
|
-
</div>
|
|
89
|
-
<a href={DOCS_URL} target="_blank" rel="noopener" className="px-5 py-3 text-sm font-medium text-bg bg-accent rounded-lg hover:bg-white transition-colors">
|
|
90
|
-
Read the docs
|
|
91
|
-
</a>
|
|
92
|
-
</div>
|
|
93
|
-
</div>
|
|
13
|
+
export default function OPMTerminal() {
|
|
14
|
+
const [currentCommand, setCurrentCommand] = useState(0)
|
|
15
|
+
const [showCursor, setShowCursor] = useState(true)
|
|
16
|
+
const [matrixChars, setMatrixChars] = useState<string[]>([])
|
|
17
|
+
const [terminalLines, setTerminalLines] = useState<string[]>([])
|
|
18
|
+
const [currentTyping, setCurrentTyping] = useState("")
|
|
19
|
+
const [isExecuting, setIsExecuting] = useState(false)
|
|
20
|
+
const [copiedStates, setCopiedStates] = useState<{ [key: string]: boolean }>({})
|
|
94
21
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
}
|
|
22
|
+
const copyToClipboard = async (text: string, key: string) => {
|
|
23
|
+
try {
|
|
24
|
+
await navigator.clipboard.writeText(text)
|
|
25
|
+
setCopiedStates((prev) => ({ ...prev, [key]: true }))
|
|
26
|
+
setTimeout(() => {
|
|
27
|
+
setCopiedStates((prev) => ({ ...prev, [key]: false }))
|
|
28
|
+
}, 2000)
|
|
29
|
+
} catch (err) {
|
|
30
|
+
console.error("Failed to copy text: ", err)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
99
33
|
|
|
100
|
-
|
|
101
|
-
const features = [
|
|
102
|
-
{
|
|
103
|
-
title: 'Multi-Agent Consensus',
|
|
104
|
-
description: 'Three independent LLMs (Claude, Gemini, DeepSeek) analyze every package in parallel. Risk scores are intelligence-weighted using live Artificial Analysis benchmarks.',
|
|
105
|
-
detail: 'No single model failure point. Weighted aggregate scoring with model intelligence and coding indices.',
|
|
106
|
-
icon: '⬡',
|
|
107
|
-
},
|
|
108
|
-
{
|
|
109
|
-
title: 'Cryptographic Attestation',
|
|
110
|
-
description: 'Every package is checksummed, signed with the author\'s wallet, and registered on Base L2. Signatures are verified at install time.',
|
|
111
|
-
detail: 'SHA-256 checksum, ECDSA signature, on-chain registration. Tamper-evident by design.',
|
|
112
|
-
icon: '◈',
|
|
113
|
-
},
|
|
34
|
+
const terminalSequences = [
|
|
114
35
|
{
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
36
|
+
command: "opm install package-name@djpai.eth",
|
|
37
|
+
outputs: [
|
|
38
|
+
"🔍 Resolving djpai.eth → 0x3a9f...c4e2",
|
|
39
|
+
"📦 package-name@1.2.0 — on-chain score: 12 (LOW)",
|
|
40
|
+
"✅ Signature verified · checksum matched",
|
|
41
|
+
"🛡️ Installed securely via OPM",
|
|
42
|
+
],
|
|
119
43
|
},
|
|
120
44
|
{
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
45
|
+
command: "opm push",
|
|
46
|
+
outputs: [
|
|
47
|
+
"📝 Signing with author wallet...",
|
|
48
|
+
"🤖 Agent 1 (Claude) scanning... risk: 8",
|
|
49
|
+
"🤖 Agent 2 (Gemini) scanning... risk: 11",
|
|
50
|
+
"🤖 Agent 3 (DeepSeek) scanning... risk: 6",
|
|
51
|
+
"⛓ Registered on Base Sepolia ✓",
|
|
52
|
+
],
|
|
125
53
|
},
|
|
126
54
|
{
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
55
|
+
command: "opm register-agent --name sentinel --model gpt-5.4",
|
|
56
|
+
outputs: [
|
|
57
|
+
"🧪 Batch benchmark (10 cases, single call)...",
|
|
58
|
+
"✅ Accuracy: 10/10 (100%)",
|
|
59
|
+
"🔐 ZK proof generated & verified",
|
|
60
|
+
"⛓ Agent registered on-chain ✓",
|
|
61
|
+
],
|
|
131
62
|
},
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
63
|
+
]
|
|
64
|
+
|
|
65
|
+
const heroAsciiText = `
|
|
66
|
+
██████╗ ██████╗ ███╗ ███╗
|
|
67
|
+
██╔═══██╗██╔══██╗████╗ ████║
|
|
68
|
+
██║ ██║██████╔╝██╔████╔██║
|
|
69
|
+
██║ ██║██╔═══╝ ██║╚██╔╝██║
|
|
70
|
+
╚██████╔╝██║ ██║ ╚═╝ ██║
|
|
71
|
+
╚═════╝ ╚═╝ ╚═╝ ╚═╝`.trim()
|
|
72
|
+
|
|
73
|
+
useEffect(() => {
|
|
74
|
+
const chars = "OPM01010101ABCDEF█▓▒░▄▀■□▪▫⛓🔐".split("")
|
|
75
|
+
const newMatrixChars = Array.from({ length: 100 }, () => chars[Math.floor(Math.random() * chars.length)])
|
|
76
|
+
setMatrixChars(newMatrixChars)
|
|
77
|
+
|
|
78
|
+
const interval = setInterval(() => {
|
|
79
|
+
setMatrixChars((prev) => prev.map(() => chars[Math.floor(Math.random() * chars.length)]))
|
|
80
|
+
}, 1500)
|
|
81
|
+
|
|
82
|
+
return () => clearInterval(interval)
|
|
83
|
+
}, [])
|
|
84
|
+
|
|
85
|
+
useEffect(() => {
|
|
86
|
+
const interval = setInterval(() => {
|
|
87
|
+
setShowCursor((prev) => !prev)
|
|
88
|
+
}, 500)
|
|
89
|
+
return () => clearInterval(interval)
|
|
90
|
+
}, [])
|
|
91
|
+
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
const sequence = terminalSequences[currentCommand]
|
|
94
|
+
const timeouts: NodeJS.Timeout[] = []
|
|
95
|
+
|
|
96
|
+
const runSequence = async () => {
|
|
97
|
+
setTerminalLines([])
|
|
98
|
+
setCurrentTyping("")
|
|
99
|
+
setIsExecuting(false)
|
|
100
|
+
|
|
101
|
+
const command = sequence.command
|
|
102
|
+
for (let i = 0; i <= command.length; i++) {
|
|
103
|
+
timeouts.push(
|
|
104
|
+
setTimeout(() => {
|
|
105
|
+
setCurrentTyping(command.slice(0, i))
|
|
106
|
+
}, i * 50),
|
|
107
|
+
)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
timeouts.push(
|
|
111
|
+
setTimeout(() => {
|
|
112
|
+
setIsExecuting(true)
|
|
113
|
+
setCurrentTyping("")
|
|
114
|
+
setTerminalLines((prev) => [...prev, `user@dev:~/project$ ${command}`])
|
|
115
|
+
}, command.length * 50 + 500),
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
sequence.outputs.forEach((output, index) => {
|
|
119
|
+
timeouts.push(
|
|
120
|
+
setTimeout(() => {
|
|
121
|
+
setTerminalLines((prev) => [...prev, output])
|
|
122
|
+
}, command.length * 50 + 1000 + index * 800),
|
|
123
|
+
)
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
timeouts.push(
|
|
127
|
+
setTimeout(() => {
|
|
128
|
+
setCurrentCommand((prev) => (prev + 1) % terminalSequences.length)
|
|
129
|
+
}, command.length * 50 + 1000 + sequence.outputs.length * 800 + 2000),
|
|
130
|
+
)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
runSequence()
|
|
134
|
+
return () => { timeouts.forEach(clearTimeout) }
|
|
135
|
+
}, [currentCommand])
|
|
139
136
|
|
|
140
137
|
return (
|
|
141
|
-
<
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
<
|
|
146
|
-
|
|
147
|
-
|
|
138
|
+
<div className="min-h-screen bg-black text-white font-mono overflow-hidden relative">
|
|
139
|
+
{/* Nav */}
|
|
140
|
+
<nav className="border-b border-gray-800 bg-gray-950/95 backdrop-blur-sm p-4 relative z-10 sticky top-0">
|
|
141
|
+
<div className="flex items-center justify-between max-w-7xl mx-auto">
|
|
142
|
+
<div className="flex items-center gap-6">
|
|
143
|
+
<div className="flex items-center gap-3">
|
|
144
|
+
<div className="flex gap-2">
|
|
145
|
+
<div className="w-3 h-3 bg-red-500 hover:bg-red-400 transition-colors cursor-pointer"></div>
|
|
146
|
+
<div className="w-3 h-3 bg-yellow-500 hover:bg-yellow-400 transition-colors cursor-pointer"></div>
|
|
147
|
+
<div className="w-3 h-3 bg-green-500 hover:bg-green-400 transition-colors cursor-pointer"></div>
|
|
148
|
+
</div>
|
|
149
|
+
<div className="flex items-center gap-2">
|
|
150
|
+
<span className="text-white font-bold text-lg">OPM</span>
|
|
151
|
+
<span className="text-gray-400 text-sm">on-chain package manager</span>
|
|
152
|
+
</div>
|
|
153
|
+
</div>
|
|
154
|
+
|
|
155
|
+
<div className="hidden md:flex items-center gap-8 ml-8">
|
|
156
|
+
<a href="#why" className="text-gray-400 hover:text-white transition-colors cursor-pointer relative group">
|
|
157
|
+
<span>Why OPM?</span>
|
|
158
|
+
<div className="absolute bottom-0 left-0 w-0 h-0.5 bg-white transition-all duration-300 group-hover:w-full"></div>
|
|
159
|
+
</a>
|
|
160
|
+
<a href="#features" className="text-gray-400 hover:text-white transition-colors cursor-pointer relative group">
|
|
161
|
+
<span>Features</span>
|
|
162
|
+
<div className="absolute bottom-0 left-0 w-0 h-0.5 bg-white transition-all duration-300 group-hover:w-full"></div>
|
|
163
|
+
</a>
|
|
164
|
+
<a href="#agents" className="text-gray-400 hover:text-white transition-colors cursor-pointer relative group">
|
|
165
|
+
<span>AI Agents</span>
|
|
166
|
+
<div className="absolute bottom-0 left-0 w-0 h-0.5 bg-white transition-all duration-300 group-hover:w-full"></div>
|
|
167
|
+
</a>
|
|
168
|
+
<a href="#cli" className="text-gray-400 hover:text-white transition-colors cursor-pointer relative group">
|
|
169
|
+
<span>CLI</span>
|
|
170
|
+
<div className="absolute bottom-0 left-0 w-0 h-0.5 bg-white transition-all duration-300 group-hover:w-full"></div>
|
|
171
|
+
</a>
|
|
172
|
+
<a href={DOCS_URL} target="_blank" rel="noopener" className="text-gray-400 hover:text-white transition-colors cursor-pointer relative group">
|
|
173
|
+
<span>Docs</span>
|
|
174
|
+
<div className="absolute bottom-0 left-0 w-0 h-0.5 bg-white transition-all duration-300 group-hover:w-full"></div>
|
|
175
|
+
</a>
|
|
176
|
+
<a href={BASESCAN} target="_blank" rel="noopener" className="text-gray-400 hover:text-white transition-colors cursor-pointer relative group flex items-center gap-1.5">
|
|
177
|
+
<span className="w-1.5 h-1.5 rounded-full bg-green-500 animate-pulse" />
|
|
178
|
+
<span>Base Sepolia</span>
|
|
179
|
+
<div className="absolute bottom-0 left-0 w-0 h-0.5 bg-white transition-all duration-300 group-hover:w-full"></div>
|
|
180
|
+
</a>
|
|
181
|
+
</div>
|
|
182
|
+
</div>
|
|
183
|
+
|
|
184
|
+
<div className="flex items-center gap-4">
|
|
185
|
+
<div className="hidden sm:flex items-center gap-2 text-gray-500 text-xs">
|
|
186
|
+
<div className="w-2 h-2 bg-green-500 rounded-full animate-pulse"></div>
|
|
187
|
+
<span>v0.1.3</span>
|
|
188
|
+
</div>
|
|
189
|
+
|
|
190
|
+
<div
|
|
191
|
+
className="group relative cursor-pointer"
|
|
192
|
+
onClick={() => copyToClipboard("npm install -g opmsec", "nav-install")}
|
|
193
|
+
>
|
|
194
|
+
<div className="absolute inset-0 border border-gray-600 bg-gray-900/20 transition-all duration-300 group-hover:border-white group-hover:shadow-lg group-hover:shadow-white/20"></div>
|
|
195
|
+
<div className="relative border border-gray-400 bg-transparent text-white font-medium px-6 py-2 text-sm transition-all duration-300 group-hover:border-white group-hover:bg-gray-900/30 transform translate-x-0.5 translate-y-0.5 group-hover:translate-x-0 group-hover:translate-y-0">
|
|
196
|
+
<div className="flex items-center gap-2">
|
|
197
|
+
{copiedStates["nav-install"] ? (
|
|
198
|
+
<Check className="w-4 h-4 text-green-400" />
|
|
199
|
+
) : (
|
|
200
|
+
<Copy className="w-4 h-4 text-gray-400" />
|
|
201
|
+
)}
|
|
202
|
+
<span className="text-gray-400">$</span>
|
|
203
|
+
<span>Install</span>
|
|
204
|
+
</div>
|
|
205
|
+
</div>
|
|
206
|
+
</div>
|
|
207
|
+
</div>
|
|
148
208
|
</div>
|
|
209
|
+
</nav>
|
|
149
210
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
<p className="text-xs font-mono text-muted/60 leading-relaxed">{f.detail}</p>
|
|
211
|
+
{/* Matrix background */}
|
|
212
|
+
<div className="fixed inset-0 opacity-10 pointer-events-none">
|
|
213
|
+
<div className="grid grid-cols-25 gap-1 h-full">
|
|
214
|
+
{matrixChars.map((char, i) => (
|
|
215
|
+
<div key={i} className="text-gray-500 text-xs animate-pulse">
|
|
216
|
+
{char}
|
|
157
217
|
</div>
|
|
158
218
|
))}
|
|
159
219
|
</div>
|
|
160
220
|
</div>
|
|
161
|
-
</section>
|
|
162
|
-
);
|
|
163
|
-
}
|
|
164
221
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
Verification pipeline
|
|
173
|
-
</h2>
|
|
174
|
-
</div>
|
|
222
|
+
{/* Hero */}
|
|
223
|
+
<section className="relative px-6 py-20 lg:px-12">
|
|
224
|
+
<div className="max-w-7xl mx-auto">
|
|
225
|
+
<div className="text-center mb-16">
|
|
226
|
+
<div className="mb-8">
|
|
227
|
+
<pre className="text-white text-[10px] sm:text-sm md:text-xl lg:text-2xl font-bold leading-tight inline-block tracking-wide drop-shadow-[0_0_12px_rgba(255,255,255,0.3)]">{heroAsciiText}</pre>
|
|
228
|
+
</div>
|
|
175
229
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
230
|
+
<h1 className="text-4xl lg:text-6xl font-bold mb-6 leading-tight">
|
|
231
|
+
On-chain<br />
|
|
232
|
+
<span className="bg-gradient-to-r from-white to-gray-400 bg-clip-text text-transparent">Package Security</span>
|
|
233
|
+
</h1>
|
|
234
|
+
|
|
235
|
+
<p className="text-lg text-gray-300 leading-relaxed max-w-3xl mx-auto mb-8">
|
|
236
|
+
Cryptographic attestation via ECDSA-signed manifests, multi-model AI auditing through
|
|
237
|
+
intelligence-weighted LLM consensus, and immutable risk scoring anchored to Base L2.
|
|
238
|
+
Zero-knowledge agent verification. Tamper-evident by design.
|
|
239
|
+
</p>
|
|
240
|
+
|
|
241
|
+
<div className="flex flex-col sm:flex-row gap-6 justify-center items-center">
|
|
242
|
+
<div
|
|
243
|
+
className="group relative cursor-pointer w-full sm:w-auto"
|
|
244
|
+
onClick={() => copyToClipboard("npm install -g opmsec", "hero-install")}
|
|
245
|
+
>
|
|
246
|
+
<div className="absolute inset-0 border border-gray-600 bg-gray-900/20 transition-all duration-300 group-hover:border-white group-hover:shadow-lg group-hover:shadow-white/20"></div>
|
|
247
|
+
<div className="relative border border-white bg-white text-black font-bold px-6 sm:px-10 py-4 text-base sm:text-lg transition-all duration-300 group-hover:bg-gray-100 group-hover:text-black transform translate-x-1 translate-y-1 group-hover:translate-x-0 group-hover:translate-y-0 text-center">
|
|
248
|
+
<div className="flex items-center justify-center gap-2 sm:gap-3">
|
|
249
|
+
{copiedStates["hero-install"] ? (
|
|
250
|
+
<Check className="w-4 h-4 sm:w-5 sm:h-5 text-green-600" />
|
|
251
|
+
) : (
|
|
252
|
+
<Copy className="w-4 h-4 sm:w-5 sm:h-5 text-gray-600" />
|
|
253
|
+
)}
|
|
254
|
+
<span className="text-gray-600 text-sm sm:text-base">$</span>
|
|
255
|
+
<span className="text-sm sm:text-base">npm install -g opmsec</span>
|
|
256
|
+
</div>
|
|
190
257
|
</div>
|
|
191
|
-
{i < 4 && (
|
|
192
|
-
<div className="hidden md:block absolute top-1/2 -right-2.5 w-5 h-px bg-border" />
|
|
193
|
-
)}
|
|
194
258
|
</div>
|
|
195
|
-
|
|
259
|
+
|
|
260
|
+
<a href={DOCS_URL} target="_blank" rel="noopener" className="group relative cursor-pointer w-full sm:w-auto">
|
|
261
|
+
<div className="absolute inset-0 border-2 border-dashed border-gray-600 bg-gray-900/20 transition-all duration-300 group-hover:border-white group-hover:shadow-lg group-hover:shadow-white/20"></div>
|
|
262
|
+
<div className="relative border-2 border-dashed border-gray-400 bg-transparent text-white font-bold px-10 py-4 text-lg transition-all duration-300 group-hover:border-white group-hover:bg-gray-900/30 transform translate-x-1 translate-y-1 group-hover:translate-x-0 group-hover:translate-y-0">
|
|
263
|
+
<div className="flex items-center gap-3">
|
|
264
|
+
<span className="text-gray-400">→</span>
|
|
265
|
+
<span>Read the Docs</span>
|
|
266
|
+
</div>
|
|
267
|
+
</div>
|
|
268
|
+
</a>
|
|
269
|
+
</div>
|
|
196
270
|
</div>
|
|
197
|
-
</div>
|
|
198
271
|
|
|
199
|
-
|
|
200
|
-
<div className="
|
|
201
|
-
<
|
|
202
|
-
|
|
203
|
-
|
|
272
|
+
{/* Live terminal */}
|
|
273
|
+
<div className="max-w-4xl mx-auto">
|
|
274
|
+
<div className="bg-gray-950 border border-gray-700 shadow-2xl backdrop-blur-sm">
|
|
275
|
+
<div className="flex items-center justify-between px-6 py-4 bg-gray-900 border-b border-gray-700">
|
|
276
|
+
<div className="flex items-center gap-3">
|
|
277
|
+
<div className="flex gap-2">
|
|
278
|
+
<div className="w-3 h-3 bg-red-500 hover:bg-red-400 transition-colors cursor-pointer"></div>
|
|
279
|
+
<div className="w-3 h-3 bg-yellow-500 hover:bg-yellow-400 transition-colors cursor-pointer"></div>
|
|
280
|
+
<div className="w-3 h-3 bg-green-500 hover:bg-green-400 transition-colors cursor-pointer"></div>
|
|
281
|
+
</div>
|
|
282
|
+
<span className="text-gray-400 text-sm">opm-terminal</span>
|
|
283
|
+
</div>
|
|
284
|
+
<div className="flex items-center gap-2">
|
|
285
|
+
<div className="w-2 h-2 bg-green-500 rounded-full animate-pulse"></div>
|
|
286
|
+
<span className="text-gray-500 text-xs">LIVE</span>
|
|
287
|
+
</div>
|
|
288
|
+
</div>
|
|
289
|
+
|
|
290
|
+
<div className="p-6 min-h-[300px] bg-black">
|
|
291
|
+
<div className="space-y-2 text-sm">
|
|
292
|
+
{terminalLines.map((line, index) => (
|
|
293
|
+
<div
|
|
294
|
+
key={index}
|
|
295
|
+
className={`${line.startsWith("user@dev") ? "text-white" : "text-gray-300"} ${line.includes("✅") || line.includes("✓") ? "text-green-400" : ""}`}
|
|
296
|
+
>
|
|
297
|
+
{line}
|
|
298
|
+
</div>
|
|
299
|
+
))}
|
|
300
|
+
|
|
301
|
+
{!isExecuting && (
|
|
302
|
+
<div className="text-white">
|
|
303
|
+
<span className="text-green-400">user@dev</span>
|
|
304
|
+
<span className="text-gray-500">:</span>
|
|
305
|
+
<span className="text-blue-400">~/project</span>
|
|
306
|
+
<span className="text-white">$ </span>
|
|
307
|
+
<span className="text-white">{currentTyping}</span>
|
|
308
|
+
<span className={`text-white ${showCursor ? "opacity-100" : "opacity-0"} transition-opacity`}>█</span>
|
|
309
|
+
</div>
|
|
310
|
+
)}
|
|
311
|
+
|
|
312
|
+
{isExecuting && (
|
|
313
|
+
<div className="flex items-center gap-2 text-gray-400">
|
|
314
|
+
<div className="flex gap-1">
|
|
315
|
+
<div className="w-1 h-1 bg-gray-400 rounded-full animate-bounce"></div>
|
|
316
|
+
<div className="w-1 h-1 bg-gray-400 rounded-full animate-bounce" style={{ animationDelay: "0.1s" }}></div>
|
|
317
|
+
<div className="w-1 h-1 bg-gray-400 rounded-full animate-bounce" style={{ animationDelay: "0.2s" }}></div>
|
|
318
|
+
</div>
|
|
319
|
+
<span className="text-xs">Processing...</span>
|
|
320
|
+
</div>
|
|
321
|
+
)}
|
|
322
|
+
</div>
|
|
323
|
+
|
|
324
|
+
<div className="mt-6 pt-4 border-t border-gray-800 flex justify-between text-xs text-gray-500">
|
|
325
|
+
<div className="flex items-center gap-4">
|
|
326
|
+
<span className="text-gray-500">Commands:</span>
|
|
327
|
+
<span className="text-white">{currentCommand + 1}/{terminalSequences.length}</span>
|
|
328
|
+
</div>
|
|
329
|
+
<div className="flex items-center gap-4">
|
|
330
|
+
<span className="text-gray-500">Agents:</span>
|
|
331
|
+
<span className="text-gray-500">3 Active</span>
|
|
332
|
+
</div>
|
|
333
|
+
<div className="flex items-center gap-4">
|
|
334
|
+
<span className="text-gray-500">Chain:</span>
|
|
335
|
+
<span className="text-gray-500">Base Sepolia</span>
|
|
336
|
+
</div>
|
|
337
|
+
</div>
|
|
338
|
+
</div>
|
|
339
|
+
</div>
|
|
204
340
|
</div>
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
<
|
|
341
|
+
|
|
342
|
+
{/* CLI heading below terminal */}
|
|
343
|
+
<div className="text-center mt-12 mb-10 max-w-4xl mx-auto">
|
|
344
|
+
<h2 className="text-3xl lg:text-4xl font-bold mb-4">Every command, security-first.</h2>
|
|
345
|
+
<p className="text-lg text-gray-400 max-w-3xl mx-auto">
|
|
346
|
+
Drop-in replacement for npm. Every operation gains cryptographic verification, AI-powered auditing, and on-chain attestation transparently.
|
|
347
|
+
</p>
|
|
209
348
|
</div>
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
349
|
+
|
|
350
|
+
{/* Command cards below terminal */}
|
|
351
|
+
<div className="grid grid-cols-1 md:grid-cols-3 gap-6 max-w-4xl mx-auto mt-10">
|
|
352
|
+
{[
|
|
353
|
+
{ num: "01", title: "Push", desc: "ECDSA-sign package manifest, dispatch to 3 independent LLM agents for parallel static analysis, aggregate weighted risk scores, register immutable attestation on Base L2", cmd: "opm push" },
|
|
354
|
+
{ num: "02", title: "Install", desc: "Resolve ENS identity, verify ECDSA signature against on-chain registry, validate SHA-256 checksum, cross-reference OSV CVE database before extraction", cmd: "opm install <pkg>" },
|
|
355
|
+
{ num: "03", title: "Check", desc: "Traverse full dependency DAG, run Levenshtein-distance typosquat detection against top 10k packages, OSV CVE lookup, upload report to Fileverse (IPFS)", cmd: "opm check" },
|
|
356
|
+
].map((card) => (
|
|
357
|
+
<div key={card.num} className="group relative h-full">
|
|
358
|
+
<div className="absolute inset-0 bg-gradient-to-br from-gray-800 to-gray-900 transform rotate-1 group-hover:rotate-2 transition-transform duration-300"></div>
|
|
359
|
+
<div className="relative bg-black border border-gray-700 p-6 h-full flex flex-col justify-between hover:border-white transition-all duration-300 group-hover:shadow-xl group-hover:shadow-white/10">
|
|
360
|
+
<div className="text-center flex-1 flex flex-col justify-between">
|
|
361
|
+
<div>
|
|
362
|
+
<div className="w-12 h-12 mx-auto mb-4 bg-gray-900 border border-gray-600 flex items-center justify-center group-hover:border-white transition-colors group-hover:bg-gray-800">
|
|
363
|
+
<span className="text-lg font-mono text-white group-hover:text-gray-100">{card.num}</span>
|
|
364
|
+
</div>
|
|
365
|
+
<h3 className="text-lg font-bold mb-3 text-white group-hover:text-gray-100">{card.title}</h3>
|
|
366
|
+
<p className="text-gray-400 mb-4 group-hover:text-gray-300 text-sm leading-relaxed">{card.desc}</p>
|
|
367
|
+
</div>
|
|
368
|
+
<div
|
|
369
|
+
className="bg-gray-900 border border-gray-700 p-2.5 font-mono text-xs text-left group-hover:border-gray-500 transition-colors group-hover:bg-gray-800 cursor-pointer flex items-center justify-between"
|
|
370
|
+
onClick={() => copyToClipboard(card.cmd, `${card.num}-cmd`)}
|
|
371
|
+
>
|
|
372
|
+
<div className="flex items-center gap-2">
|
|
373
|
+
<span className="text-gray-500">$ </span>
|
|
374
|
+
<span className="text-white group-hover:text-gray-100">{card.cmd}</span>
|
|
375
|
+
</div>
|
|
376
|
+
{copiedStates[`${card.num}-cmd`] ? (
|
|
377
|
+
<Check className="w-3 h-3 text-green-400" />
|
|
378
|
+
) : (
|
|
379
|
+
<Copy className="w-3 h-3 text-gray-400 hover:text-white transition-colors" />
|
|
380
|
+
)}
|
|
381
|
+
</div>
|
|
382
|
+
</div>
|
|
383
|
+
</div>
|
|
384
|
+
</div>
|
|
385
|
+
))}
|
|
214
386
|
</div>
|
|
215
387
|
</div>
|
|
216
|
-
</
|
|
217
|
-
</section>
|
|
218
|
-
);
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
function CLISection() {
|
|
222
|
-
const commands = [
|
|
223
|
-
{ cmd: 'opm push', desc: 'Sign, scan with 3 AI agents, publish, register on-chain' },
|
|
224
|
-
{ cmd: 'opm install <pkg>', desc: 'Install with signature + on-chain + CVE verification' },
|
|
225
|
-
{ cmd: 'opm check', desc: 'Scan all deps: typosquats, CVEs, AI analysis, Fileverse report' },
|
|
226
|
-
{ cmd: 'opm fix', desc: 'Auto-fix typosquats and vulnerable versions' },
|
|
227
|
-
{ cmd: 'opm audit', desc: 'On-chain + CVE audit for entire dependency tree' },
|
|
228
|
-
{ cmd: 'opm info <pkg>', desc: 'On-chain metadata, agent scores, safest version' },
|
|
229
|
-
{ cmd: 'opm register-agent', desc: 'Register a new security agent (ZK-verified)' },
|
|
230
|
-
{ cmd: 'opm view <name.eth>', desc: 'ENS author profile, reputation, published packages' },
|
|
231
|
-
];
|
|
388
|
+
</section>
|
|
232
389
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
<
|
|
240
|
-
|
|
390
|
+
{/* Why OPM — Real incidents */}
|
|
391
|
+
<section className="px-6 py-24 lg:px-12 border-t border-gray-800 relative overflow-hidden" id="why">
|
|
392
|
+
<div className="absolute inset-0 bg-gradient-to-b from-red-950/10 via-transparent to-transparent pointer-events-none" />
|
|
393
|
+
|
|
394
|
+
<div className="max-w-7xl mx-auto relative z-10">
|
|
395
|
+
<div className="text-center mb-8">
|
|
396
|
+
<div className="inline-flex items-center gap-2 px-4 py-1.5 border border-red-900/60 bg-red-950/30 text-red-400 text-xs font-mono tracking-widest uppercase mb-6">
|
|
397
|
+
<span className="w-1.5 h-1.5 rounded-full bg-red-500 animate-pulse" />
|
|
398
|
+
Active Threat Landscape
|
|
399
|
+
</div>
|
|
400
|
+
<h2 className="text-4xl lg:text-6xl font-bold mb-6 leading-tight">
|
|
401
|
+
This is happening<br />
|
|
402
|
+
<span className="text-red-400">right now.</span>
|
|
241
403
|
</h2>
|
|
242
|
-
<p className="text-
|
|
243
|
-
|
|
404
|
+
<p className="text-lg text-gray-400 max-w-2xl mx-auto">
|
|
405
|
+
Supply chain attacks on npm aren't theoretical. Developers are losing money, shipping CVEs, and installing malware — every single week.
|
|
244
406
|
</p>
|
|
245
|
-
<a href={DOCS_URL} target="_blank" rel="noopener" className="inline-flex items-center gap-2 text-sm font-medium px-4 py-2 border border-border rounded-lg hover:bg-surface transition-colors">
|
|
246
|
-
Full CLI documentation
|
|
247
|
-
</a>
|
|
248
407
|
</div>
|
|
249
408
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
409
|
+
{/* Stats bar */}
|
|
410
|
+
<div className="grid grid-cols-2 md:grid-cols-4 gap-px bg-gray-800 max-w-4xl mx-auto mb-16">
|
|
411
|
+
{[
|
|
412
|
+
{ num: "6,847", label: "Malicious packages", sub: "removed from npm in 2025" },
|
|
413
|
+
{ num: "$15M+", label: "Developer losses", sub: "from wallet drainer packages" },
|
|
414
|
+
{ num: "23%", label: "Projects affected", sub: "by known CVEs in deps" },
|
|
415
|
+
{ num: "4 hrs", label: "Avg time to detect", sub: "a supply chain attack" },
|
|
416
|
+
].map((stat, i) => (
|
|
417
|
+
<div key={i} className="bg-black p-6 text-center group hover:bg-gray-950 transition-colors">
|
|
418
|
+
<p className="text-2xl lg:text-3xl font-bold text-white mb-1 group-hover:text-red-400 transition-colors">{stat.num}</p>
|
|
419
|
+
<p className="text-sm text-gray-300 font-medium">{stat.label}</p>
|
|
420
|
+
<p className="text-xs text-gray-600 mt-1">{stat.sub}</p>
|
|
421
|
+
</div>
|
|
422
|
+
))}
|
|
423
|
+
</div>
|
|
424
|
+
|
|
425
|
+
{/* Incident cards */}
|
|
426
|
+
<div className="grid grid-cols-1 md:grid-cols-12 gap-4 max-w-6xl mx-auto">
|
|
427
|
+
{/* Large card — PhantomRaven attack */}
|
|
428
|
+
<div className="md:col-span-7 group relative">
|
|
429
|
+
<div className="absolute inset-0 bg-red-950/20 transform rotate-[0.5deg] group-hover:rotate-0 transition-transform duration-500" />
|
|
430
|
+
<div className="relative bg-gray-950 border border-gray-800 group-hover:border-red-900/50 transition-all duration-500 overflow-hidden">
|
|
431
|
+
<div className="px-4 py-2.5 bg-gray-900 border-b border-gray-800 flex items-center justify-between">
|
|
432
|
+
<div className="flex items-center gap-2">
|
|
433
|
+
<span className="w-2 h-2 rounded-full bg-red-500" />
|
|
434
|
+
<span className="text-xs text-gray-400 font-mono">cyberpress.org — March 2026</span>
|
|
435
|
+
</div>
|
|
436
|
+
<span className="text-[10px] text-red-400 font-mono tracking-wider uppercase">Supply Chain Attack</span>
|
|
437
|
+
</div>
|
|
438
|
+
<div className="relative aspect-[16/9] overflow-hidden">
|
|
439
|
+
<Image
|
|
440
|
+
src="/phantomraven-npm-attack.png"
|
|
441
|
+
alt="PhantomRaven malware targeting npm supply chain"
|
|
442
|
+
fill
|
|
443
|
+
className="object-cover object-top opacity-90 group-hover:opacity-100 group-hover:scale-[1.02] transition-all duration-700"
|
|
444
|
+
/>
|
|
445
|
+
<div className="absolute inset-0 bg-gradient-to-t from-gray-950 via-transparent to-transparent" />
|
|
446
|
+
</div>
|
|
447
|
+
<div className="p-5">
|
|
448
|
+
<h3 className="text-lg font-bold text-white mb-1">PhantomRaven Targets npm Supply Chain</h3>
|
|
449
|
+
<p className="text-sm text-gray-400">Malware campaign targeting developer secrets through typosquatted packages. Thousands of downloads before detection.</p>
|
|
450
|
+
</div>
|
|
451
|
+
</div>
|
|
452
|
+
</div>
|
|
453
|
+
|
|
454
|
+
{/* Right column — stacked */}
|
|
455
|
+
<div className="md:col-span-5 flex flex-col gap-4">
|
|
456
|
+
{/* Wallet drain */}
|
|
457
|
+
<div className="group relative flex-1">
|
|
458
|
+
<div className="relative bg-gray-950 border border-gray-800 group-hover:border-red-900/50 transition-all duration-500 overflow-hidden h-full">
|
|
459
|
+
<div className="px-4 py-2.5 bg-gray-900 border-b border-gray-800 flex items-center justify-between">
|
|
460
|
+
<div className="flex items-center gap-2">
|
|
461
|
+
<span className="w-2 h-2 rounded-full bg-red-500" />
|
|
462
|
+
<span className="text-xs text-gray-400 font-mono">@imanishbarnwal</span>
|
|
463
|
+
</div>
|
|
464
|
+
<span className="text-[10px] text-red-400 font-mono tracking-wider uppercase">Funds Lost</span>
|
|
465
|
+
</div>
|
|
466
|
+
<div className="relative aspect-[16/10] overflow-hidden">
|
|
467
|
+
<Image
|
|
468
|
+
src="/wallet-drain-exploit.png"
|
|
469
|
+
alt="Developer lost money from silent dev environment exploit"
|
|
470
|
+
fill
|
|
471
|
+
className="object-cover object-top opacity-90 group-hover:opacity-100 group-hover:scale-[1.02] transition-all duration-700"
|
|
472
|
+
/>
|
|
473
|
+
<div className="absolute inset-0 bg-gradient-to-t from-gray-950 via-transparent to-transparent" />
|
|
474
|
+
</div>
|
|
475
|
+
<div className="p-4">
|
|
476
|
+
<p className="text-sm text-gray-300 font-medium">“I lost a significant amount of money due to a silent, zero-interaction dev environment exploit.”</p>
|
|
477
|
+
</div>
|
|
478
|
+
</div>
|
|
479
|
+
</div>
|
|
480
|
+
</div>
|
|
481
|
+
|
|
482
|
+
{/* Bottom row — 3 cards */}
|
|
483
|
+
<div className="md:col-span-4 group relative">
|
|
484
|
+
<div className="relative bg-gray-950 border border-gray-800 group-hover:border-orange-900/50 transition-all duration-500 overflow-hidden">
|
|
485
|
+
<div className="px-4 py-2.5 bg-gray-900 border-b border-gray-800 flex items-center justify-between">
|
|
486
|
+
<div className="flex items-center gap-2">
|
|
487
|
+
<span className="w-2 h-2 rounded-full bg-orange-500" />
|
|
488
|
+
<span className="text-xs text-gray-400 font-mono">@nextjs — 213K views</span>
|
|
489
|
+
</div>
|
|
490
|
+
<span className="text-[10px] text-orange-400 font-mono tracking-wider uppercase">CVE</span>
|
|
491
|
+
</div>
|
|
492
|
+
<div className="relative aspect-[4/3] overflow-hidden">
|
|
493
|
+
<Image
|
|
494
|
+
src="/nextjs-cve-announcement.png"
|
|
495
|
+
alt="Next.js critical CVE-2025-66478 announcement"
|
|
496
|
+
fill
|
|
497
|
+
className="object-cover object-top opacity-90 group-hover:opacity-100 group-hover:scale-[1.02] transition-all duration-700"
|
|
498
|
+
/>
|
|
499
|
+
<div className="absolute inset-0 bg-gradient-to-t from-gray-950 via-transparent to-transparent" />
|
|
500
|
+
</div>
|
|
501
|
+
<div className="p-4">
|
|
502
|
+
<p className="text-xs text-gray-400">Critical vulnerability in React Server Components affecting Next.js. 213K+ views.</p>
|
|
503
|
+
</div>
|
|
504
|
+
</div>
|
|
505
|
+
</div>
|
|
506
|
+
|
|
507
|
+
<div className="md:col-span-4 group relative">
|
|
508
|
+
<div className="relative bg-gray-950 border border-gray-800 group-hover:border-yellow-900/50 transition-all duration-500 overflow-hidden">
|
|
509
|
+
<div className="px-4 py-2.5 bg-gray-900 border-b border-gray-800 flex items-center justify-between">
|
|
510
|
+
<div className="flex items-center gap-2">
|
|
511
|
+
<span className="w-2 h-2 rounded-full bg-yellow-500" />
|
|
512
|
+
<span className="text-xs text-gray-400 font-mono">@trashh_dev</span>
|
|
513
|
+
</div>
|
|
514
|
+
<span className="text-[10px] text-yellow-400 font-mono tracking-wider uppercase">React CVE</span>
|
|
515
|
+
</div>
|
|
516
|
+
<div className="relative aspect-[4/3] overflow-hidden">
|
|
517
|
+
<Image
|
|
518
|
+
src="/react-cve-meme.png"
|
|
519
|
+
alt="Developer reaction to React CVE announcement"
|
|
520
|
+
fill
|
|
521
|
+
className="object-cover object-top opacity-90 group-hover:opacity-100 group-hover:scale-[1.02] transition-all duration-700"
|
|
522
|
+
/>
|
|
523
|
+
<div className="absolute inset-0 bg-gradient-to-t from-gray-950 via-transparent to-transparent" />
|
|
524
|
+
</div>
|
|
525
|
+
<div className="p-4">
|
|
526
|
+
<p className="text-xs text-gray-400">How developers react to yet another critical CVE in their dependency tree.</p>
|
|
527
|
+
</div>
|
|
528
|
+
</div>
|
|
256
529
|
</div>
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
<div>
|
|
262
|
-
<span className="
|
|
263
|
-
<span className="text-
|
|
530
|
+
|
|
531
|
+
<div className="md:col-span-4 group relative">
|
|
532
|
+
<div className="relative bg-gray-950 border border-gray-800 group-hover:border-gray-600 transition-all duration-500 overflow-hidden">
|
|
533
|
+
<div className="px-4 py-2.5 bg-gray-900 border-b border-gray-800 flex items-center justify-between">
|
|
534
|
+
<div className="flex items-center gap-2">
|
|
535
|
+
<span className="w-2 h-2 rounded-full bg-blue-500" />
|
|
536
|
+
<span className="text-xs text-gray-400 font-mono">@arsh_goyal</span>
|
|
264
537
|
</div>
|
|
538
|
+
<span className="text-[10px] text-gray-400 font-mono tracking-wider uppercase">Reality Check</span>
|
|
539
|
+
</div>
|
|
540
|
+
<div className="relative aspect-[4/3] overflow-hidden">
|
|
541
|
+
<Image
|
|
542
|
+
src="/dependency-bottleneck.png"
|
|
543
|
+
alt="Dependency management is the bottleneck"
|
|
544
|
+
fill
|
|
545
|
+
className="object-cover object-top opacity-90 group-hover:opacity-100 group-hover:scale-[1.02] transition-all duration-700"
|
|
546
|
+
/>
|
|
547
|
+
<div className="absolute inset-0 bg-gradient-to-t from-gray-950 via-transparent to-transparent" />
|
|
265
548
|
</div>
|
|
266
|
-
|
|
549
|
+
<div className="p-4">
|
|
550
|
+
<p className="text-xs text-gray-400">“Code generation isn't the bottleneck anymore. Dependency management is.”</p>
|
|
551
|
+
</div>
|
|
552
|
+
</div>
|
|
553
|
+
</div>
|
|
554
|
+
</div>
|
|
555
|
+
|
|
556
|
+
{/* CTA after incidents */}
|
|
557
|
+
<div className="text-center mt-16">
|
|
558
|
+
<div className="inline-flex flex-col items-center gap-4">
|
|
559
|
+
<p className="text-lg text-gray-400">
|
|
560
|
+
OPM catches these before they reach your <span className="text-white font-mono">node_modules</span>.
|
|
561
|
+
</p>
|
|
562
|
+
<div className="flex items-center gap-3 text-sm font-mono text-gray-500">
|
|
563
|
+
<span className="text-green-400">$</span>
|
|
564
|
+
<span className="text-white">npm install -g opmsec</span>
|
|
565
|
+
<span className="text-gray-600">&&</span>
|
|
566
|
+
<span className="text-white">opm install</span>
|
|
567
|
+
</div>
|
|
267
568
|
</div>
|
|
268
569
|
</div>
|
|
269
570
|
</div>
|
|
270
|
-
</
|
|
271
|
-
</section>
|
|
272
|
-
);
|
|
273
|
-
}
|
|
571
|
+
</section>
|
|
274
572
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
573
|
+
{/* Features */}
|
|
574
|
+
<section className="px-6 py-20 lg:px-12 border-t border-gray-800" id="features">
|
|
575
|
+
<div className="max-w-7xl mx-auto">
|
|
576
|
+
<div className="text-center mb-16">
|
|
577
|
+
<h2 className="text-4xl lg:text-5xl font-bold mb-6">Security Primitives</h2>
|
|
578
|
+
<p className="text-xl text-gray-400">Defense in depth, by default.</p>
|
|
579
|
+
</div>
|
|
580
|
+
|
|
581
|
+
<div className="max-w-4xl mx-auto">
|
|
582
|
+
<div className="bg-gray-950 border border-gray-800 shadow-2xl">
|
|
583
|
+
<div className="flex items-center justify-between px-6 py-4 bg-gray-900 border-b border-gray-700">
|
|
584
|
+
<div className="flex items-center gap-3">
|
|
585
|
+
<div className="flex gap-2">
|
|
586
|
+
<div className="w-3 h-3 bg-red-500"></div>
|
|
587
|
+
<div className="w-3 h-3 bg-yellow-500"></div>
|
|
588
|
+
<div className="w-3 h-3 bg-green-500"></div>
|
|
589
|
+
</div>
|
|
590
|
+
<span className="text-gray-400 text-sm">opm features --list</span>
|
|
591
|
+
</div>
|
|
592
|
+
<div className="flex items-center gap-2">
|
|
593
|
+
<div className="w-2 h-2 bg-green-500 rounded-full animate-pulse"></div>
|
|
594
|
+
<span className="text-gray-500 text-xs">6 ACTIVE</span>
|
|
595
|
+
</div>
|
|
596
|
+
</div>
|
|
597
|
+
|
|
598
|
+
<div className="p-6 bg-black">
|
|
599
|
+
<div className="text-sm text-gray-400 mb-4">$ opm features --scan</div>
|
|
600
|
+
|
|
601
|
+
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 font-mono text-sm mb-6">
|
|
602
|
+
{[
|
|
603
|
+
{ name: "multi-agent-consensus", status: "✓", desc: "N-of-M parallel LLM dispatch with intelligence-weighted aggregation via Artificial Analysis benchmarks. No single-model failure point." },
|
|
604
|
+
{ name: "cryptographic-attestation", status: "✓", desc: "SHA-256 content-addressable checksums + secp256k1 ECDSA signatures. Tamper-evident supply chain attestation." },
|
|
605
|
+
{ name: "zk-agent-verification", status: "✓", desc: "Hash-commitment ZK scheme with circom circuit reference. Accuracy proven without revealing labeled test data." },
|
|
606
|
+
{ name: "on-chain-registry", status: "✓", desc: "OPMRegistry.sol: authorizedAgents, packages, versionData, AgentScores mappings. Fully queryable immutable state." },
|
|
607
|
+
{ name: "cve-typosquat-detection", status: "✓", desc: "OSV advisory database integration + Levenshtein-distance analysis against top 10k npm packages. Dependency confusion detection." },
|
|
608
|
+
{ name: "drop-in-npm-replacement", status: "✓", desc: "Transparent npm CLI interop: install, audit, check, push, fix — each operation layered with cryptographic verification." },
|
|
609
|
+
].map((f) => (
|
|
610
|
+
<div
|
|
611
|
+
key={f.name}
|
|
612
|
+
className="flex items-center justify-between py-2 px-3 hover:bg-gray-900 cursor-pointer group transition-all duration-200 border border-transparent hover:border-gray-700"
|
|
613
|
+
>
|
|
614
|
+
<div className="flex items-center gap-3">
|
|
615
|
+
<span className="text-green-400 group-hover:text-white transition-colors w-4">{f.status}</span>
|
|
616
|
+
<span className="text-white group-hover:text-gray-200 transition-colors">{f.name}</span>
|
|
617
|
+
</div>
|
|
618
|
+
<div className="opacity-0 group-hover:opacity-100 transition-opacity text-gray-500 text-xs max-w-[250px] text-right">
|
|
619
|
+
{f.desc}
|
|
620
|
+
</div>
|
|
621
|
+
</div>
|
|
622
|
+
))}
|
|
623
|
+
</div>
|
|
624
|
+
|
|
625
|
+
<div className="pt-4 border-t border-gray-800">
|
|
626
|
+
<div className="flex items-center gap-4 text-xs text-gray-500 justify-center">
|
|
627
|
+
<div className="flex items-center gap-2">
|
|
628
|
+
<div className="w-2 h-2 bg-green-500 rounded-full"></div>
|
|
629
|
+
<span>6 Active</span>
|
|
630
|
+
</div>
|
|
631
|
+
<div className="flex items-center gap-2">
|
|
632
|
+
<div className="w-2 h-2 bg-green-500 rounded-full animate-pulse"></div>
|
|
633
|
+
<span>Zero config</span>
|
|
634
|
+
</div>
|
|
635
|
+
</div>
|
|
636
|
+
</div>
|
|
637
|
+
</div>
|
|
297
638
|
</div>
|
|
298
|
-
|
|
639
|
+
</div>
|
|
299
640
|
</div>
|
|
641
|
+
</section>
|
|
300
642
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
className="
|
|
307
|
-
>
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
643
|
+
{/* AI Agents */}
|
|
644
|
+
<section className="px-6 py-20 lg:px-12 border-t border-gray-800" id="agents">
|
|
645
|
+
<div className="max-w-7xl mx-auto">
|
|
646
|
+
<div className="text-center mb-16">
|
|
647
|
+
<h2 className="text-4xl lg:text-5xl font-bold mb-6">Multi-Agent Consensus</h2>
|
|
648
|
+
<p className="text-xl text-gray-400">N-of-M heterogeneous LLM ensemble with intelligence-weighted scoring derived from live Artificial Analysis quality and coding indices. Byzantine fault-tolerant by design.</p>
|
|
649
|
+
</div>
|
|
650
|
+
|
|
651
|
+
<div className="max-w-4xl mx-auto">
|
|
652
|
+
<div className="bg-gray-950 border border-gray-800 shadow-2xl">
|
|
653
|
+
<div className="flex items-center justify-between px-6 py-4 bg-gray-900 border-b border-gray-700">
|
|
654
|
+
<div className="flex items-center gap-3">
|
|
655
|
+
<div className="flex gap-2">
|
|
656
|
+
<div className="w-3 h-3 bg-red-500"></div>
|
|
657
|
+
<div className="w-3 h-3 bg-yellow-500"></div>
|
|
658
|
+
<div className="w-3 h-3 bg-green-500"></div>
|
|
659
|
+
</div>
|
|
660
|
+
<span className="text-gray-400 text-sm">opm agents --status</span>
|
|
661
|
+
</div>
|
|
662
|
+
<div className="flex items-center gap-2">
|
|
663
|
+
<div className="w-2 h-2 bg-green-500 rounded-full animate-pulse"></div>
|
|
664
|
+
<span className="text-gray-500 text-xs">3 AUTHORIZED</span>
|
|
665
|
+
</div>
|
|
666
|
+
</div>
|
|
667
|
+
|
|
668
|
+
<div className="p-6 bg-black">
|
|
669
|
+
<div className="text-sm text-gray-400 mb-4">$ opm agents --list</div>
|
|
670
|
+
|
|
671
|
+
<div className="space-y-2 font-mono text-sm">
|
|
672
|
+
{[
|
|
673
|
+
{ id: "1", name: "claude-opus-4.6", provider: "anthropic", role: "Primary scanner", color: "text-green-400" },
|
|
674
|
+
{ id: "2", name: "gemini-3.1-pro", provider: "google", role: "Secondary analysis", color: "text-green-400" },
|
|
675
|
+
{ id: "3", name: "deepseek-v3.2", provider: "deepseek", role: "Tertiary verification", color: "text-green-400" },
|
|
676
|
+
].map((agent) => (
|
|
677
|
+
<div
|
|
678
|
+
key={agent.id}
|
|
679
|
+
className="flex items-center justify-between py-2 px-4 hover:bg-gray-900 cursor-pointer group transition-all duration-200 border border-transparent hover:border-gray-700"
|
|
680
|
+
>
|
|
681
|
+
<div className="flex items-center gap-4">
|
|
682
|
+
<span className="text-gray-500 w-6">[{agent.id}]</span>
|
|
683
|
+
<span className={`${agent.color} group-hover:text-white transition-colors`}>●</span>
|
|
684
|
+
<span className="text-white group-hover:text-gray-200 transition-colors">{agent.name}</span>
|
|
685
|
+
<span className="text-gray-500 text-xs">({agent.provider})</span>
|
|
686
|
+
</div>
|
|
687
|
+
<div className="opacity-0 group-hover:opacity-100 transition-opacity text-gray-500 text-xs">
|
|
688
|
+
{agent.role}
|
|
689
|
+
</div>
|
|
690
|
+
</div>
|
|
691
|
+
))}
|
|
692
|
+
</div>
|
|
693
|
+
|
|
694
|
+
<div className="mt-6 pt-4 border-t border-gray-800">
|
|
695
|
+
<div className="flex flex-col md:flex-row justify-between items-start md:items-center gap-4">
|
|
696
|
+
<div className="text-sm text-gray-400">
|
|
697
|
+
<div className="font-mono text-xs text-gray-500 space-y-1">
|
|
698
|
+
<div>$ opm register-agent --name my-agent --model gpt-5.4</div>
|
|
699
|
+
<div>$ opm info express # View agent scores</div>
|
|
700
|
+
</div>
|
|
701
|
+
</div>
|
|
702
|
+
|
|
703
|
+
<div className="flex items-center gap-6 text-xs text-gray-500">
|
|
704
|
+
<div className="flex items-center gap-2">
|
|
705
|
+
<div className="w-2 h-2 bg-green-500 rounded-full"></div>
|
|
706
|
+
<span>3 Active</span>
|
|
707
|
+
</div>
|
|
708
|
+
<div className="flex items-center gap-2">
|
|
709
|
+
<div className="w-2 h-2 bg-gray-500 rounded-full animate-pulse"></div>
|
|
710
|
+
<span>ZK-verified</span>
|
|
711
|
+
</div>
|
|
712
|
+
</div>
|
|
713
|
+
</div>
|
|
714
|
+
</div>
|
|
715
|
+
</div>
|
|
716
|
+
</div>
|
|
717
|
+
|
|
718
|
+
<div className="mt-6 text-center">
|
|
719
|
+
<div className="inline-flex items-center gap-2 text-gray-400 text-sm">
|
|
720
|
+
<span className="text-green-400">●</span>
|
|
721
|
+
<span>Permissionless registration • 100% benchmark accuracy required • Scores on-chain</span>
|
|
722
|
+
</div>
|
|
723
|
+
</div>
|
|
724
|
+
</div>
|
|
319
725
|
</div>
|
|
320
|
-
</
|
|
321
|
-
</section>
|
|
322
|
-
);
|
|
323
|
-
}
|
|
726
|
+
</section>
|
|
324
727
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
<
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
728
|
+
{/* Pipeline */}
|
|
729
|
+
<section className="px-6 py-16 lg:px-12 border-t border-gray-800" id="pipeline">
|
|
730
|
+
<div className="max-w-7xl mx-auto">
|
|
731
|
+
<div className="text-center mb-12">
|
|
732
|
+
<h2 className="text-3xl lg:text-4xl font-bold mb-4">Verification Pipeline</h2>
|
|
733
|
+
<p className="text-lg text-gray-400 max-w-2xl mx-auto">
|
|
734
|
+
Five-stage cryptographic attestation pipeline: from ECDSA signing through multi-agent consensus to on-chain settlement. Every package is verified before extraction to node_modules.
|
|
735
|
+
</p>
|
|
736
|
+
</div>
|
|
737
|
+
|
|
738
|
+
<div className="max-w-4xl mx-auto">
|
|
739
|
+
<div className="bg-gray-950 border border-gray-800 shadow-xl">
|
|
740
|
+
<div className="flex items-center justify-between px-6 py-3 bg-gray-900 border-b border-gray-700">
|
|
741
|
+
<div className="flex items-center gap-3">
|
|
742
|
+
<div className="flex gap-2">
|
|
743
|
+
<div className="w-3 h-3 bg-red-500"></div>
|
|
744
|
+
<div className="w-3 h-3 bg-yellow-500"></div>
|
|
745
|
+
<div className="w-3 h-3 bg-green-500"></div>
|
|
746
|
+
</div>
|
|
747
|
+
<span className="text-gray-400 text-sm">opm pipeline --visualize</span>
|
|
748
|
+
</div>
|
|
749
|
+
</div>
|
|
750
|
+
|
|
751
|
+
<div className="p-6 bg-black">
|
|
752
|
+
<div className="grid grid-cols-1 md:grid-cols-5 gap-4 font-mono text-sm">
|
|
753
|
+
{[
|
|
754
|
+
{ step: "01", title: "Pack & Sign", desc: "SHA-256 content-addressable checksum + secp256k1 ECDSA signature via author wallet" },
|
|
755
|
+
{ step: "02", title: "Multi-Agent Scan", desc: "Parallel dispatch to N heterogeneous LLMs; each submits independent risk vector" },
|
|
756
|
+
{ step: "03", title: "Weighted Consensus", desc: "Intelligence-weighted aggregate via Artificial Analysis quality + coding indices" },
|
|
757
|
+
{ step: "04", title: "On-chain Registry", desc: "Package metadata, agent scores, Fileverse report URI settled on Base Sepolia L2" },
|
|
758
|
+
{ step: "05", title: "Install Verify", desc: "ECDSA signature + on-chain score lookup + OSV CVE cross-reference at extraction time" },
|
|
759
|
+
].map((s, i) => (
|
|
760
|
+
<div key={i} className="relative group">
|
|
761
|
+
<div className="border border-gray-700 p-4 hover:border-white transition-all duration-300 group-hover:bg-gray-900">
|
|
762
|
+
<span className="text-xs text-gray-500 block mb-2">{s.step}</span>
|
|
763
|
+
<h3 className="text-sm font-semibold mb-1 text-white">{s.title}</h3>
|
|
764
|
+
<p className="text-xs text-gray-500">{s.desc}</p>
|
|
765
|
+
</div>
|
|
766
|
+
{i < 4 && (
|
|
767
|
+
<div className="hidden md:block absolute top-1/2 -right-2.5 w-5 h-px bg-gray-700" />
|
|
768
|
+
)}
|
|
769
|
+
</div>
|
|
770
|
+
))}
|
|
771
|
+
</div>
|
|
772
|
+
</div>
|
|
773
|
+
</div>
|
|
774
|
+
</div>
|
|
339
775
|
</div>
|
|
340
|
-
|
|
341
|
-
</div>
|
|
342
|
-
</footer>
|
|
343
|
-
);
|
|
344
|
-
}
|
|
776
|
+
</section>
|
|
345
777
|
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
778
|
+
{/* Contract info */}
|
|
779
|
+
<section className="px-6 py-16 lg:px-12 border-t border-gray-800">
|
|
780
|
+
<div className="max-w-4xl mx-auto text-center">
|
|
781
|
+
<h2 className="text-3xl font-bold mb-4">Fully on-chain. Fully verifiable.</h2>
|
|
782
|
+
<p className="text-gray-400 mb-8">OPMRegistry.sol deployed on Base Sepolia L2. Every package registration, agent score submission, ZK-verified agent authorization, and ENS-resolved author profile is an immutable on-chain record. Fully queryable, fully verifiable.</p>
|
|
783
|
+
|
|
784
|
+
<div className="grid grid-cols-2 md:grid-cols-4 gap-px bg-gray-800 mb-8">
|
|
785
|
+
{[
|
|
786
|
+
{ label: "Packages", desc: "Registered" },
|
|
787
|
+
{ label: "Agent Scores", desc: "Submitted" },
|
|
788
|
+
{ label: "Authors", desc: "Verified" },
|
|
789
|
+
{ label: "Reports", desc: "On IPFS" },
|
|
790
|
+
].map((s, i) => (
|
|
791
|
+
<div key={i} className="bg-black p-6">
|
|
792
|
+
<p className="text-xs text-gray-500 mb-1">{s.desc}</p>
|
|
793
|
+
<p className="text-sm font-semibold">{s.label}</p>
|
|
794
|
+
</div>
|
|
795
|
+
))}
|
|
796
|
+
</div>
|
|
797
|
+
|
|
798
|
+
<div className="inline-flex items-center gap-4">
|
|
799
|
+
<a
|
|
800
|
+
href={BASESCAN}
|
|
801
|
+
target="_blank"
|
|
802
|
+
rel="noopener"
|
|
803
|
+
className="flex items-center gap-2 text-sm font-mono text-gray-400 hover:text-white transition-colors px-4 py-2 border border-gray-700 hover:border-white"
|
|
804
|
+
>
|
|
805
|
+
<span className="w-2 h-2 rounded-full bg-green-500"></span>
|
|
806
|
+
View on BaseScan
|
|
807
|
+
</a>
|
|
808
|
+
<a
|
|
809
|
+
href={`${GITHUB_URL}/blob/main/packages/contracts/contracts/OPMRegistry.sol`}
|
|
810
|
+
target="_blank"
|
|
811
|
+
rel="noopener"
|
|
812
|
+
className="flex items-center gap-2 text-sm text-gray-400 hover:text-white transition-colors px-4 py-2 border border-gray-700 hover:border-white"
|
|
813
|
+
>
|
|
814
|
+
Source Code
|
|
815
|
+
</a>
|
|
816
|
+
</div>
|
|
817
|
+
</div>
|
|
818
|
+
</section>
|
|
819
|
+
|
|
820
|
+
{/* Footer */}
|
|
821
|
+
<footer className="border-t border-gray-800 px-6 py-12 lg:px-12 bg-gray-950">
|
|
822
|
+
<div className="max-w-7xl mx-auto">
|
|
823
|
+
<div className="flex flex-col md:flex-row items-center justify-between gap-6">
|
|
824
|
+
<div className="flex items-center gap-2.5">
|
|
825
|
+
<span className="font-bold">OPM</span>
|
|
826
|
+
<span className="text-xs text-gray-500">On-chain Package Manager</span>
|
|
827
|
+
</div>
|
|
828
|
+
<div className="flex items-center gap-6 text-sm text-gray-500">
|
|
829
|
+
<a href={DOCS_URL} target="_blank" rel="noopener" className="hover:text-white transition-colors">Docs</a>
|
|
830
|
+
<a href={GITHUB_URL} target="_blank" rel="noopener" className="hover:text-white transition-colors">GitHub</a>
|
|
831
|
+
<a href={NPM_URL} target="_blank" rel="noopener" className="hover:text-white transition-colors">npm</a>
|
|
832
|
+
<a href={BASESCAN} target="_blank" rel="noopener" className="hover:text-white transition-colors">Contract</a>
|
|
833
|
+
</div>
|
|
834
|
+
<p className="text-xs text-gray-700">MIT License</p>
|
|
835
|
+
</div>
|
|
836
|
+
</div>
|
|
837
|
+
</footer>
|
|
838
|
+
</div>
|
|
839
|
+
)
|
|
840
|
+
}
|