thumbgate 1.27.12 โ 1.27.14
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/.claude-plugin/plugin.json +1 -1
- package/.well-known/llms.txt +2 -1
- package/.well-known/mcp/server-card.json +1 -1
- package/README.md +2 -4
- package/adapters/claude/.mcp.json +2 -2
- package/adapters/mcp/server-stdio.js +1 -1
- package/adapters/opencode/opencode.json +1 -1
- package/adapters/policy-engine/ethicore-guardian-client.js +68 -0
- package/adapters/policy-engine/thumbgate-policy-engine-adapter.js +260 -0
- package/bin/cli.js +78 -259
- package/config/gate-templates.json +0 -228
- package/config/gates/claim-verification.json +0 -18
- package/package.json +35 -25
- package/public/assets/brand/thumbgate-logo-transparent.svg +22 -0
- package/public/assets/brand/thumbgate-mark-inline-v3.svg +19 -0
- package/public/assets/brand/thumbgate-mark.svg +11 -5
- package/public/blog.html +0 -30
- package/public/brand/thumbgate-mark.svg +9 -5
- package/public/chatgpt-app.html +2 -2
- package/public/compare.html +2 -1
- package/public/dashboard.html +1 -1
- package/public/federal.html +1 -1
- package/public/index.html +95 -216
- package/public/learn.html +59 -35
- package/public/lessons.html +1 -1
- package/public/numbers.html +2 -2
- package/public/pro.html +7 -7
- package/scripts/agent-readiness.js +142 -0
- package/scripts/aws-blocks-guardrails.js +228 -0
- package/scripts/cli-schema.js +22 -10
- package/scripts/dashboard-chat.js +2 -1
- package/scripts/document-intake.js +1 -49
- package/scripts/durability/step.js +3 -3
- package/scripts/gate-stats.js +5 -11
- package/scripts/gates-engine.js +0 -49
- package/scripts/gemini-embedding-policy.js +2 -1
- package/scripts/hook-stop-anti-claim.js +116 -184
- package/scripts/hosted-config.js +0 -12
- package/scripts/lesson-search.js +1 -15
- package/scripts/llm-client.js +187 -5
- package/scripts/plausible-domain-config.js +3 -1
- package/scripts/seo-gsd.js +240 -1
- package/scripts/tool-registry.js +2 -2
- package/scripts/vector-store.js +44 -0
- package/scripts/workspace-evolver.js +62 -2
- package/src/api/server.js +340 -131
- package/public/assets/brand/thumbgate-mark-inline.svg +0 -15
- package/public/compare/adopt-ai.html +0 -219
- package/public/compare/agentix-labs.html +0 -197
- package/public/compare/ai-experience-orchestration.html +0 -216
- package/public/compare/anthropic-claude-for-legal.html +0 -260
- package/public/compare/anthropic-containment.html +0 -280
- package/public/compare/arcade.html +0 -175
- package/public/compare/arcjet.html +0 -239
- package/public/compare/bumblebee.html +0 -307
- package/public/compare/claude-code-hooks.html +0 -294
- package/public/compare/databricks-unity-ai-gateway.html +0 -215
- package/public/compare/fallow.html +0 -351
- package/public/compare/heidi.html +0 -233
- package/public/compare/mem0.html +0 -342
- package/public/compare/oak-and-sparrow-gatekeeper.html +0 -289
- package/public/compare/rein.html +0 -236
- package/public/compare/sigmashake.html +0 -256
- package/public/compare/speclock.html +0 -342
- package/public/guides/agent-harness-optimization.html +0 -342
- package/public/guides/agentic-web-governance.html +0 -406
- package/public/guides/ai-agent-governance-sprint.html +0 -415
- package/public/guides/ai-agent-pre-action-approval-gates.html +0 -401
- package/public/guides/ai-agent-workflow-migration-checklist.html +0 -392
- package/public/guides/ai-deployment-readiness.html +0 -415
- package/public/guides/ai-mode-ads-agent-governance.html +0 -401
- package/public/guides/ai-search-topical-presence.html +0 -342
- package/public/guides/autoresearch-agent-safety.html +0 -342
- package/public/guides/background-agent-governance.html +0 -358
- package/public/guides/best-tools-stop-ai-agents-breaking-production.html +0 -363
- package/public/guides/browser-automation-safety.html +0 -342
- package/public/guides/chatgpt-ads-trust.html +0 -353
- package/public/guides/claude-code-feedback.html +0 -339
- package/public/guides/claude-code-prevent-repeated-mistakes.html +0 -161
- package/public/guides/claude-code-skills-guardrails.html +0 -343
- package/public/guides/claude-desktop.html +0 -356
- package/public/guides/code-knowledge-graph-guardrails.html +0 -365
- package/public/guides/codex-cli-guardrails.html +0 -339
- package/public/guides/cursor-agent-guardrails.html +0 -339
- package/public/guides/cursor-prevent-repeated-mistakes.html +0 -161
- package/public/guides/database-agent-safety.html +0 -406
- package/public/guides/deepseek-v4-runtime-guardrails.html +0 -346
- package/public/guides/developer-machine-supply-chain-guardrails.html +0 -358
- package/public/guides/gcp-mcp-guardrails.html +0 -147
- package/public/guides/gemini-cli-feedback-memory.html +0 -339
- package/public/guides/gpt-5-5-model-evaluation.html +0 -358
- package/public/guides/internal-ai-engineering-stack-guardrails.html +0 -348
- package/public/guides/long-running-agent-context-management.html +0 -346
- package/public/guides/mcp-tool-governance.html +0 -401
- package/public/guides/multica-thumbgate-setup.html +0 -134
- package/public/guides/native-messaging-host-security.html +0 -342
- package/public/guides/policy-engine-pre-action-gates.html +0 -346
- package/public/guides/pre-action-checks.html +0 -342
- package/public/guides/pretooluse-hooks-vs-advisory-prompt-rules.html +0 -342
- package/public/guides/prompt-tricks-to-workflow-rules.html +0 -365
- package/public/guides/proxy-pointer-rag-guardrails.html +0 -352
- package/public/guides/rag-precision-tuning-guardrails.html +0 -352
- package/public/guides/reasoning-compression-guardrails.html +0 -346
- package/public/guides/relational-knowledge-ai-recommendations.html +0 -342
- package/public/guides/roo-code-alternative-cline.html +0 -339
- package/public/guides/semantic-programmatic-seo-guardrails.html +0 -352
- package/public/guides/seo-agent-skills-guardrails.html +0 -344
- package/public/guides/stop-repeated-ai-agent-mistakes.html +0 -342
- package/public/learn/ac-dc-runtime-enforcement.html +0 -277
- package/public/learn/agent-harness-pattern.html +0 -181
- package/public/learn/agent-identity-connector-governance.html +0 -146
- package/public/learn/agent-swarms-shared-gates.html +0 -173
- package/public/learn/agentic-enterprise-context-brain.html +0 -117
- package/public/learn/agentic-os-team-governance.html +0 -146
- package/public/learn/ai-agent-governance.html +0 -158
- package/public/learn/ai-agent-persistent-memory.html +0 -211
- package/public/learn/anthropomorphic-claim-gates.html +0 -180
- package/public/learn/background-agent-control-layer.html +0 -184
- package/public/learn/claude-code-goal-with-rubrics.html +0 -205
- package/public/learn/codex-role-plugins-need-governance.html +0 -125
- package/public/learn/cost-aware-agent-gate-routing.html +0 -173
- package/public/learn/databricks-unity-ai-gateway-runtime-governance.html +0 -157
- package/public/learn/deterministic-agent-workflows.html +0 -185
- package/public/learn/feedback-loop-vs-decision-layer.html +0 -283
- package/public/learn/from-prototype-to-production.html +0 -223
- package/public/learn/learn.css +0 -51
- package/public/learn/mcp-pre-action-checks-explained.html +0 -172
- package/public/learn/pretix-stripe-connect-marketplaces.html +0 -161
- package/public/learn/regulated-agent-execution-boundary.html +0 -196
- package/public/learn/spec-driven-development.html +0 -168
- package/public/learn/stop-ai-agent-force-push.html +0 -134
- package/public/learn/vibe-coding-safety-net.html +0 -142
- package/scripts/reddit-browser-notification-watch.js +0 -230
package/public/index.html
CHANGED
|
@@ -20,7 +20,7 @@ __GOOGLE_SITE_VERIFICATION_META__
|
|
|
20
20
|
<meta property="og:image" content="https://thumbgate.ai/og.png">
|
|
21
21
|
<meta name="twitter:card" content="summary_large_image">
|
|
22
22
|
<meta name="twitter:image" content="https://thumbgate.ai/og.png">
|
|
23
|
-
<meta name="thumbgate-version" content="1.27.
|
|
23
|
+
<meta name="thumbgate-version" content="1.27.8">
|
|
24
24
|
<meta name="keywords" content="ThumbGate, thumbgate, AI agent orchestration, AI experience orchestration, agentic development cycle, AC/DC framework, Guide Generate Verify Solve, agent enforcement layer, save LLM tokens, reduce Claude API cost, reduce OpenAI cost, AI agent token savings, prevent LLM retries, prevent hallucination retries, stop AI token waste, pre-action checks, agent governance, Claude Code, Cursor, Codex, Gemini, Amp, Cline, OpenCode, workflow hardening, context engineering, AI authenticity, brand authenticity AI">
|
|
25
25
|
<link rel="canonical" href="__APP_ORIGIN__/">
|
|
26
26
|
<link rel="alternate" type="text/markdown" title="ThumbGate LLM context" href="__APP_ORIGIN__/llm-context.md">
|
|
@@ -337,7 +337,7 @@ __GA_BOOTSTRAP__
|
|
|
337
337
|
"name": "How does ThumbGate reduce host blast radius for high-risk local runs?",
|
|
338
338
|
"acceptedAnswer": {
|
|
339
339
|
"@type": "Answer",
|
|
340
|
-
"text": "ThumbGate combines pre-action checks with execution guidance. Workflow Sentinel predicts risky local actions before they execute, and high-risk runs can be routed into Docker Sandboxes instead of running directly on the host.
|
|
340
|
+
"text": "ThumbGate combines pre-action checks with execution guidance. Workflow Sentinel predicts risky local actions before they execute, and high-risk runs can be routed into Docker Sandboxes instead of running directly on the host. Enterprise workflows also have a signed hosted sandbox lane for isolated automation dispatch."
|
|
341
341
|
}
|
|
342
342
|
},
|
|
343
343
|
{
|
|
@@ -411,10 +411,9 @@ __GA_BOOTSTRAP__
|
|
|
411
411
|
/* NAV */
|
|
412
412
|
nav { position: sticky; top: 0; z-index: 50; background: rgba(10,10,11,0.85); backdrop-filter: blur(12px); border-bottom: 1px solid var(--border); padding: 14px 0; }
|
|
413
413
|
nav .container { display: flex; justify-content: space-between; align-items: center; }
|
|
414
|
-
.nav-logo {
|
|
415
|
-
.nav-logo .logo-mark { width:
|
|
416
|
-
.nav-logo .logo-text {
|
|
417
|
-
.nav-logo span { color: var(--cyan); }
|
|
414
|
+
.nav-logo { color: var(--text); text-decoration: none; display: inline-flex; align-items: center; flex: 0 0 auto; }
|
|
415
|
+
.nav-logo .logo-mark { width: 220px; height: 66px; display: block; flex: 0 0 auto; object-fit: contain; }
|
|
416
|
+
.nav-logo .logo-text { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; }
|
|
418
417
|
.nav-links { display: flex; gap: 24px; align-items: center; }
|
|
419
418
|
.nav-links a { color: var(--text-muted); text-decoration: none; font-size: 13px; transition: color 0.15s; }
|
|
420
419
|
.nav-links a:hover { color: var(--text); }
|
|
@@ -430,32 +429,6 @@ __GA_BOOTSTRAP__
|
|
|
430
429
|
.hero p { font-size: 17px; color: var(--text-muted); max-width: 620px; margin: 0 auto 28px; line-height: 1.6; }
|
|
431
430
|
.hero-lede { font-size: clamp(18px, 2vw, 21px) !important; max-width: 760px !important; color: var(--text-muted); }
|
|
432
431
|
.hero-proof-card { max-width: 720px; margin: 0 auto 28px; padding: 20px 22px; border: 1px solid rgba(34,211,238,0.24); border-radius: 8px; background: #090d12; box-shadow: 0 20px 80px rgba(0,0,0,0.35); font-family: var(--mono); text-align: left; }
|
|
433
|
-
.interactive-gate-demo { max-width: 980px; margin: 0 auto 28px; text-align: left; border: 1px solid rgba(34,211,238,0.24); border-radius: 14px; background: linear-gradient(180deg, rgba(17,17,19,0.98) 0%, rgba(10,16,18,0.98) 100%); box-shadow: 0 20px 80px rgba(0,0,0,0.28); overflow: hidden; }
|
|
434
|
-
.interactive-gate-head { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 18px 20px; border-bottom: 1px solid var(--border); }
|
|
435
|
-
.interactive-gate-head h2 { margin: 0; font-size: clamp(20px, 3vw, 28px); line-height: 1.15; letter-spacing: -0.025em; }
|
|
436
|
-
.interactive-gate-head p { max-width: 480px; margin: 0; font-size: 13px; line-height: 1.5; color: var(--text-muted); text-align: right; }
|
|
437
|
-
.interactive-gate-body { display: grid; grid-template-columns: minmax(210px, 0.9fr) minmax(0, 1.35fr); gap: 0; }
|
|
438
|
-
.action-picker { border-right: 1px solid var(--border); padding: 16px; display: grid; gap: 10px; align-content: start; }
|
|
439
|
-
.action-picker button { width: 100%; text-align: left; border: 1px solid var(--border); border-radius: 8px; background: rgba(10,10,11,0.82); color: var(--text); padding: 12px 14px; font: inherit; cursor: pointer; transition: border-color 0.15s, background 0.15s, transform 0.15s; }
|
|
440
|
-
.action-picker button:hover, .action-picker button:focus-visible { border-color: rgba(34,211,238,0.55); outline: none; transform: translateY(-1px); }
|
|
441
|
-
.action-picker button[aria-pressed="true"] { border-color: rgba(34,211,238,0.72); background: rgba(34,211,238,0.1); }
|
|
442
|
-
.action-picker strong { display: block; font-size: 13px; line-height: 1.25; margin-bottom: 4px; }
|
|
443
|
-
.action-picker span { display: block; color: var(--text-muted); font-size: 12px; line-height: 1.35; }
|
|
444
|
-
.gate-visual { padding: 18px; }
|
|
445
|
-
.gate-flow { display: grid; grid-template-columns: 1fr auto 1fr auto 1fr; align-items: stretch; gap: 10px; margin-bottom: 16px; }
|
|
446
|
-
.gate-node { border: 1px solid var(--border); border-radius: 10px; background: rgba(10,10,11,0.72); padding: 14px; min-height: 112px; }
|
|
447
|
-
.gate-node-label { color: var(--text-muted); font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; margin-bottom: 8px; font-weight: 800; }
|
|
448
|
-
.gate-node-value { font-family: var(--mono); font-size: 13px; line-height: 1.5; color: var(--text); overflow-wrap: anywhere; }
|
|
449
|
-
.gate-node.blocked { border-color: rgba(248,113,113,0.42); background: rgba(248,113,113,0.08); }
|
|
450
|
-
.gate-node.allowed { border-color: rgba(74,222,128,0.42); background: rgba(74,222,128,0.08); }
|
|
451
|
-
.gate-arrow { align-self: center; color: var(--cyan); font-weight: 900; font-size: 20px; }
|
|
452
|
-
.gate-result { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; }
|
|
453
|
-
.gate-metric { border: 1px solid var(--border); border-radius: 8px; padding: 12px; background: rgba(10,10,11,0.58); }
|
|
454
|
-
.gate-metric span { display: block; color: var(--text-muted); font-size: 11px; text-transform: uppercase; letter-spacing: 0.08em; margin-bottom: 4px; }
|
|
455
|
-
.gate-metric strong { display: block; color: var(--text); font-size: 16px; }
|
|
456
|
-
.gate-metric.block strong { color: var(--red); }
|
|
457
|
-
.gate-metric.allow strong { color: var(--green); }
|
|
458
|
-
.gate-caption { margin: 12px 0 0; color: var(--text-muted); font-size: 12px; line-height: 1.5; }
|
|
459
432
|
.terminal-row { padding: 8px 0; font-size: 14px; line-height: 1.45; border-bottom: 1px solid rgba(255,255,255,0.06); }
|
|
460
433
|
.terminal-row:last-child { border-bottom: 0; }
|
|
461
434
|
.terminal-row.muted { color: var(--text-muted); }
|
|
@@ -473,13 +446,20 @@ __GA_BOOTSTRAP__
|
|
|
473
446
|
.hero-actions { display: flex; justify-content: center; align-items: center; flex-wrap: wrap; gap: 12px; margin: 0 auto 16px; max-width: 900px; }
|
|
474
447
|
.hero-actions a, .hero-actions .hero-install { min-height: 48px; border-radius: 8px; }
|
|
475
448
|
.hero-actions .hero-install { margin-bottom: 0; font-size: 18px; padding: 14px 22px; border: 1px solid rgba(34,211,238,0.55); background: rgba(34,211,238,0.07); box-shadow: none; }
|
|
476
|
-
.hero-actions .btn-install-hero { font-size:
|
|
449
|
+
.hero-actions .btn-install-hero { font-size: 17px; padding: 14px 24px; font-weight: 800; background: var(--cyan); color: var(--bg); border: 1px solid rgba(34,211,238,0.65); box-shadow: 0 0 0 1px rgba(34,211,238,0.28), 0 12px 32px rgba(34,211,238,0.18); }
|
|
477
450
|
.hero-actions .hero-diagnostic { font-size: 16px; padding: 14px 22px; background: var(--green); color: #06120a; font-weight: 800; box-shadow: none; }
|
|
478
451
|
.offer-router{max-width:940px;margin:18px auto 22px;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;text-align:left}
|
|
479
452
|
.offer-route{border:1px solid rgba(34,211,238,.18);background:rgba(17,17,19,.72);border-radius:8px;padding:14px}
|
|
480
453
|
.offer-route strong{display:block;color:var(--text);font-size:14px;margin-bottom:6px}.offer-route p{margin:0 0 10px;color:var(--text-muted);font-size:13px}
|
|
481
454
|
.offer-route a,.offer-route button{color:var(--cyan);font-weight:800;font-size:13px;text-decoration:none;background:transparent;border:0;padding:0;cursor:pointer}.offer-route.primary{background:rgba(34,211,238,.07)}
|
|
455
|
+
.repeat-proof-strip { max-width: 760px; margin: 0 auto 24px; display: grid; grid-template-columns: 1fr auto 1fr; gap: 10px; align-items: stretch; text-align: left; }
|
|
456
|
+
.repeat-proof-step { border: 1px solid rgba(34,211,238,0.18); background: rgba(17,17,19,0.76); border-radius: 8px; padding: 12px 14px; min-height: 74px; }
|
|
457
|
+
.repeat-proof-step strong { display: block; color: var(--text); font-size: 13px; margin-bottom: 4px; }
|
|
458
|
+
.repeat-proof-step code { display: block; color: var(--text-muted); font-family: var(--mono); font-size: 12px; line-height: 1.45; white-space: normal; }
|
|
459
|
+
.repeat-proof-step.blocked { border-color: rgba(248,113,113,0.34); background: rgba(248,113,113,0.08); }
|
|
460
|
+
.repeat-proof-arrow { display: flex; align-items: center; justify-content: center; color: var(--cyan); font-weight: 800; }
|
|
482
461
|
.btn-pro-page { display: inline-flex; align-items: center; justify-content: center; padding: 11px 18px; background: var(--cyan); color: var(--bg); border-radius: 999px; text-decoration: none; font-size: 14px; font-weight: 700; box-shadow: 0 0 0 1px rgba(34,211,238,0.28), 0 12px 32px rgba(34,211,238,0.18); transition: opacity 0.15s, transform 0.15s; }
|
|
462
|
+
.btn-pro-page.hero-secondary { background: rgba(17,17,19,0.72); color: var(--cyan); border: 1px solid rgba(34,211,238,0.32); box-shadow: none; }
|
|
483
463
|
.btn-pro-page:hover { opacity: 0.9; transform: translateY(-1px); }
|
|
484
464
|
.btn-gpt-page { display: inline-flex; align-items: center; justify-content: center; padding: 14px 32px; background: var(--green); color: #06120a; border-radius: 8px; text-decoration: none; font-size: 16px; font-weight: 800; box-shadow: 0 0 0 1px rgba(74,222,128,0.32), 0 12px 32px rgba(74,222,128,0.18); transition: opacity 0.15s, transform 0.15s; }
|
|
485
465
|
.btn-gpt-page:hover { opacity: 0.92; transform: translateY(-1px); }
|
|
@@ -729,16 +709,11 @@ __GA_BOOTSTRAP__
|
|
|
729
709
|
.team-intake-recovery a { width: 100%; }
|
|
730
710
|
.team-form { grid-template-columns: 1fr; }
|
|
731
711
|
.hero { padding: 72px 0 56px; }
|
|
732
|
-
.interactive-gate-head { display: block; }
|
|
733
|
-
.interactive-gate-head p { text-align: left; margin-top: 8px; }
|
|
734
|
-
.interactive-gate-body { grid-template-columns: 1fr; }
|
|
735
|
-
.action-picker { border-right: 0; border-bottom: 1px solid var(--border); }
|
|
736
|
-
.gate-flow { grid-template-columns: 1fr; }
|
|
737
|
-
.gate-arrow { transform: rotate(90deg); justify-self: center; }
|
|
738
|
-
.gate-result { grid-template-columns: 1fr; }
|
|
739
712
|
.hero-actions { flex-direction: column; }
|
|
740
713
|
.hero-actions a { width: 100%; }
|
|
741
714
|
.offer-router { grid-template-columns: 1fr; }
|
|
715
|
+
.repeat-proof-strip { grid-template-columns: 1fr; }
|
|
716
|
+
.repeat-proof-arrow { min-height: 20px; }
|
|
742
717
|
.hero-paid-actions { justify-content: center; }
|
|
743
718
|
.hero-paid-actions a { width: 100%; }
|
|
744
719
|
.nav-links a:not(.nav-cta) { display: none; }
|
|
@@ -763,7 +738,7 @@ __GA_BOOTSTRAP__
|
|
|
763
738
|
<!-- NAV -->
|
|
764
739
|
<nav>
|
|
765
740
|
<div class="container">
|
|
766
|
-
<a href="/" class="nav-logo"><img src="/assets/brand/thumbgate-
|
|
741
|
+
<a href="/" class="nav-logo" aria-label="ThumbGate home"><img src="/assets/brand/thumbgate-logo-transparent.svg?v=20260623-transparent-wordmark-nav" alt="" class="logo-mark" width="220" height="66"><span class="logo-text">ThumbGate</span></a>
|
|
767
742
|
<div class="nav-links">
|
|
768
743
|
<a href="#how-it-works">How It Works</a>
|
|
769
744
|
<a href="/pricing">Pricing</a>
|
|
@@ -788,102 +763,54 @@ __GA_BOOTSTRAP__
|
|
|
788
763
|
<!-- HERO -->
|
|
789
764
|
<section class="hero">
|
|
790
765
|
<div class="container">
|
|
791
|
-
<div class="hero-badge"
|
|
792
|
-
<h1>Stop AI
|
|
793
|
-
<p class="hero-lede">
|
|
794
|
-
|
|
795
|
-
<div class="hero-signals" aria-label="
|
|
796
|
-
<a class="signal-pill signal-down" href="#
|
|
797
|
-
<a class="signal-pill" href="#
|
|
798
|
-
<a class="signal-pill" href="#
|
|
799
|
-
<a class="signal-pill signal-up" href="#pricing">
|
|
766
|
+
<div class="hero-badge">For AI coders who already corrected the same agent twice</div>
|
|
767
|
+
<h1>Stop repeated AI agent mistakes before they run again.</h1>
|
|
768
|
+
<p class="hero-lede">ThumbGate turns one thumbs-down into a local pre-action check. If Claude Code, Cursor, Codex, Gemini CLI, or another MCP-capable agent tries the same unsafe command, edit, deploy, retry loop, or API call again, ThumbGate blocks it before execution and records why.</p>
|
|
769
|
+
|
|
770
|
+
<div class="hero-signals" aria-label="Repeated agent mistakes ThumbGate stops">
|
|
771
|
+
<a class="signal-pill signal-down" href="#first-check">Repeated command</a>
|
|
772
|
+
<a class="signal-pill" href="#first-check">Runaway retry loop</a>
|
|
773
|
+
<a class="signal-pill" href="#first-check">Rejected edit returns</a>
|
|
774
|
+
<a class="signal-pill signal-up" href="#pricing">Upgrade after proof</a>
|
|
800
775
|
</div>
|
|
801
776
|
|
|
802
|
-
<div class="
|
|
803
|
-
<
|
|
777
|
+
<div class="repeat-proof-strip" aria-label="ThumbGate thumbs-down to blocked repeat example">
|
|
778
|
+
<div class="repeat-proof-step">
|
|
779
|
+
<strong>1. You reject it once</strong>
|
|
780
|
+
<code>thumbs down: never force-push main without explicit approval</code>
|
|
781
|
+
</div>
|
|
782
|
+
<div class="repeat-proof-arrow">โ</div>
|
|
783
|
+
<div class="repeat-proof-step blocked">
|
|
784
|
+
<strong>2. The repeat is stopped</strong>
|
|
785
|
+
<code>agent: git push --force origin main<br>BLOCKED before execution</code>
|
|
786
|
+
</div>
|
|
804
787
|
</div>
|
|
805
788
|
|
|
806
|
-
<div class="
|
|
807
|
-
<
|
|
808
|
-
<h2>Click an agent action. See the gate fire before execution.</h2>
|
|
809
|
-
<p>This is the part dashboards miss: ThumbGate checks the proposed tool call while it is still only intent, then records the receipt.</p>
|
|
810
|
-
</div>
|
|
811
|
-
<div class="interactive-gate-body">
|
|
812
|
-
<div class="action-picker" role="group" aria-label="Choose an AI agent action to simulate">
|
|
813
|
-
<button type="button" data-demo-action="forcePush" aria-pressed="true">
|
|
814
|
-
<strong>Force-push main</strong>
|
|
815
|
-
<span>Known repeated failure from a thumbs-down</span>
|
|
816
|
-
</button>
|
|
817
|
-
<button type="button" data-demo-action="secretPaste" aria-pressed="false">
|
|
818
|
-
<strong>Paste an API key</strong>
|
|
819
|
-
<span>Public LLM prompt with secret-shaped data</span>
|
|
820
|
-
</button>
|
|
821
|
-
<button type="button" data-demo-action="safeTest" aria-pressed="false">
|
|
822
|
-
<strong>Run tests</strong>
|
|
823
|
-
<span>Safe local verification command</span>
|
|
824
|
-
</button>
|
|
825
|
-
<button type="button" data-demo-action="deployNoProof" aria-pressed="false">
|
|
826
|
-
<strong>Deploy without proof</strong>
|
|
827
|
-
<span>Risky production action missing receipts</span>
|
|
828
|
-
</button>
|
|
829
|
-
</div>
|
|
830
|
-
<div class="gate-visual">
|
|
831
|
-
<div class="gate-flow" aria-live="polite">
|
|
832
|
-
<div class="gate-node">
|
|
833
|
-
<div class="gate-node-label">Agent Intent</div>
|
|
834
|
-
<div class="gate-node-value" data-demo-command>git push --force origin main</div>
|
|
835
|
-
</div>
|
|
836
|
-
<div class="gate-arrow" aria-hidden="true">โ</div>
|
|
837
|
-
<div class="gate-node">
|
|
838
|
-
<div class="gate-node-label">PreToolUse Gate</div>
|
|
839
|
-
<div class="gate-node-value" data-demo-rule>Rule: never force-push protected branches</div>
|
|
840
|
-
</div>
|
|
841
|
-
<div class="gate-arrow" aria-hidden="true">โ</div>
|
|
842
|
-
<div class="gate-node blocked" data-demo-decision-node>
|
|
843
|
-
<div class="gate-node-label">Decision</div>
|
|
844
|
-
<div class="gate-node-value" data-demo-decision>BLOCK before execution</div>
|
|
845
|
-
</div>
|
|
846
|
-
</div>
|
|
847
|
-
<div class="gate-result">
|
|
848
|
-
<div class="gate-metric block" data-demo-status-card>
|
|
849
|
-
<span>Status</span>
|
|
850
|
-
<strong data-demo-status>Blocked</strong>
|
|
851
|
-
</div>
|
|
852
|
-
<div class="gate-metric">
|
|
853
|
-
<span>Repeat Tokens</span>
|
|
854
|
-
<strong data-demo-tokens>0 spent</strong>
|
|
855
|
-
</div>
|
|
856
|
-
<div class="gate-metric">
|
|
857
|
-
<span>Receipt</span>
|
|
858
|
-
<strong data-demo-receipt>tg_427_force_push</strong>
|
|
859
|
-
</div>
|
|
860
|
-
</div>
|
|
861
|
-
<p class="gate-caption" data-demo-caption>The agent receives a concrete refusal and chooses a safer plan. The audit trail keeps the rule, source feedback, timestamp, and proposed command.</p>
|
|
862
|
-
</div>
|
|
863
|
-
</div>
|
|
789
|
+
<div class="hero-proof-card" aria-label="ThumbGate blocking dangerous AI agent commands in real time">
|
|
790
|
+
<img src="/media/thumbgate-demo.gif" alt="ThumbGate blocking an AI agent's rm -rf, git push --force, and chmod 777 in real time, while letting safe commands through" style="width:100%;display:block;border-radius:8px;" loading="lazy" />
|
|
864
791
|
</div>
|
|
865
792
|
|
|
866
793
|
<div class="hero-actions">
|
|
867
|
-
<a href="/
|
|
868
|
-
<a href="
|
|
869
|
-
<a href="
|
|
794
|
+
<a href="/go/install?utm_source=website&utm_medium=hero_cta&utm_campaign=install_free&cta_id=hero_install_cli&cta_placement=hero" onclick="event.preventDefault(); navigator.clipboard.writeText('npx thumbgate init'); this.textContent='Copied โ โ paste in your repo'; setTimeout(()=>{this.textContent='Install Free CLI'},2000); try{posthog.capture('hero_install_click',{cta:'install_cli'})}catch(_){}" class="btn-free btn-install-hero" title="Click to copy: npx thumbgate init">Install Free CLI</a>
|
|
795
|
+
<a href="/checkout/pro?utm_source=website&utm_medium=hero_cta&utm_campaign=pro_upgrade&cta_id=hero_start_pro&cta_placement=hero&plan_id=pro&landing_path=%2F" data-revenue-cta data-cta-id="hero_start_pro" data-cta-placement="hero" data-tier="pro" data-plan-id="pro" data-price="19" onclick="trackRevenueCta(this);try{posthog.capture('hero_pro_checkout_click',{cta:'hero_start_pro',tier:'pro',price:19})}catch(_){}" class="btn-pro-page hero-pro hero-pro-primary hero-secondary">Upgrade after one blocked repeat</a>
|
|
796
|
+
<a href="#workflow-sprint-intake" onclick="try{posthog.capture('hero_sprint_click',{cta:'sprint_intake'})}catch(_){};sendFirstPartyTelemetry('hero_sprint_intake_started',{ctaId:'hero_workflow_sprint',ctaPlacement:'hero',offer:'workflow_sprint'});" class="btn-pro-page hero-pro hero-secondary">Team workflow intake โ</a>
|
|
870
797
|
</div>
|
|
871
798
|
|
|
872
799
|
<div class="offer-router" aria-label="Choose the right ThumbGate path">
|
|
873
800
|
<div class="offer-route primary">
|
|
874
|
-
<strong>
|
|
875
|
-
<p>
|
|
876
|
-
<
|
|
801
|
+
<strong>Start here: Free CLI</strong>
|
|
802
|
+
<p>2 captures/day, 3 active rules. Enough to prove one blocked repeat in your repo.</p>
|
|
803
|
+
<button data-router-install onclick="copyInstall(this)"><span class="copy-hint">Copy npx thumbgate init</span></button>
|
|
877
804
|
</div>
|
|
878
805
|
<div class="offer-route">
|
|
879
|
-
<strong>
|
|
880
|
-
<p>
|
|
881
|
-
<a href="
|
|
806
|
+
<strong>After it blocks a repeat: Pro</strong>
|
|
807
|
+
<p>Unlimited rules, recall, sync, dashboard proof, and exports for one operator.</p>
|
|
808
|
+
<a href="/checkout/pro?utm_source=website&utm_medium=offer_router&cta_id=router_start_pro&cta_placement=offer_router&plan_id=pro" data-revenue-cta data-cta-id="router_start_pro" data-cta-placement="offer_router" data-tier="pro" data-plan-id="pro" data-price="19" onclick="trackRevenueCta(this);">Upgrade to Pro โ</a>
|
|
882
809
|
</div>
|
|
883
810
|
<div class="offer-route">
|
|
884
|
-
<strong>
|
|
885
|
-
<p>
|
|
886
|
-
<
|
|
811
|
+
<strong>Team has the same failure: intake</strong>
|
|
812
|
+
<p>One repeated workflow, one owner, one proof plan before a wider rollout.</p>
|
|
813
|
+
<a href="#workflow-sprint-intake" onclick="sendFirstPartyTelemetry('workflow_sprint_intake_started',{ctaId:'router_workflow_sprint',ctaPlacement:'offer_router',offer:'workflow_sprint'});">Send workflow first โ</a>
|
|
887
814
|
</div>
|
|
888
815
|
</div>
|
|
889
816
|
|
|
@@ -1187,6 +1114,21 @@ __GA_BOOTSTRAP__
|
|
|
1187
1114
|
<p>Claude Code, Codex, Gemini CLI, Amp, and OpenCode all use the same gateway and memory model. Any MCP-compatible agent gets pre-action checks, feedback memory, and enforcement out of the box.</p>
|
|
1188
1115
|
<div class="card-arrow">Open the setup guide โ</div>
|
|
1189
1116
|
</a>
|
|
1117
|
+
<a class="compat-card seo-card" href="/guides/hermes-agent-guardrails" rel="noopener">
|
|
1118
|
+
<h3>โค Hermes Agent guardrails</h3>
|
|
1119
|
+
<p>Hermes-style agents bring persistent memory, generated skills, messaging gateways, scheduled automations, and sandboxed execution. ThumbGate adds the safer self-evolution loop: propose rule and skill changes from failures, then gate them with evidence before anything overwrites stable instructions or repeats an expensive action.</p>
|
|
1120
|
+
<div class="card-arrow">Read the Hermes guardrails guide โ</div>
|
|
1121
|
+
</a>
|
|
1122
|
+
<a class="compat-card seo-card" href="/guides/vllm-serving-guardrails" rel="noopener">
|
|
1123
|
+
<h3>vLLM serving guardrails</h3>
|
|
1124
|
+
<p>vLLM makes self-hosted inference cheaper and faster with PagedAttention, continuous batching, chunked prefill, prefix caching, and optimized kernels. ThumbGate gates the routing change with latency, cache-isolation, benchmark, and rollback proof before agent traffic moves.</p>
|
|
1125
|
+
<div class="card-arrow">Read the vLLM guardrails guide โ</div>
|
|
1126
|
+
</a>
|
|
1127
|
+
<a class="compat-card seo-card" href="/guides/agent-context-governance" rel="noopener">
|
|
1128
|
+
<h3>Context and tool governance</h3>
|
|
1129
|
+
<p>Long-running agents need cleaner working context, approved model routes, isolated execution, tool lockdown, direct pushback, and evidence before high-risk actions. ThumbGate turns those controls into local pre-action gates.</p>
|
|
1130
|
+
<div class="card-arrow">Read the context governance guide โ</div>
|
|
1131
|
+
</a>
|
|
1190
1132
|
<a class="compat-card seo-card" href="/guides/gcp-mcp-guardrails" rel="noopener">
|
|
1191
1133
|
<h3>โ๏ธ Google Data Agent Kit</h3>
|
|
1192
1134
|
<p>Cloud Next 2026 shipped BigQuery, Spanner, AlloyDB, and Cloud SQL as MCP tool calls into Claude Code, Codex, and Gemini CLI. ThumbGate checks the destructive ones โ DROP on prod datasets, unscoped DELETEs, IAM escalation โ before they fire.</p>
|
|
@@ -1237,7 +1179,7 @@ __GA_BOOTSTRAP__
|
|
|
1237
1179
|
<p>Every block explains why: which pattern matched, what evidence triggered it, and whether the rule came from your own corrections.</p>
|
|
1238
1180
|
</div>
|
|
1239
1181
|
<div class="agent-card">
|
|
1240
|
-
<h3>๐ Org Dashboard
|
|
1182
|
+
<h3>๐ Org Dashboard</h3>
|
|
1241
1183
|
<p>See which agents are creating review churn, which checks are saving time, and where rollout risk is still concentrated across the shared workflow.</p>
|
|
1242
1184
|
</div>
|
|
1243
1185
|
<div class="agent-card">
|
|
@@ -1260,6 +1202,28 @@ __GA_BOOTSTRAP__
|
|
|
1260
1202
|
</div>
|
|
1261
1203
|
</section>
|
|
1262
1204
|
|
|
1205
|
+
<section class="compatibility" id="governance-not-logging">
|
|
1206
|
+
<div class="container">
|
|
1207
|
+
<div class="section-label">Governance, Not Logging</div>
|
|
1208
|
+
<h2 class="section-title">Logs describe the damage. ThumbGate blocks the risky action before it runs.</h2>
|
|
1209
|
+
<p style="color:var(--text-dim);max-width:820px;margin:0 auto 22px;">Self-governance is an operator writing local rules and keeping local logs. ThumbGate starts there, then turns each correction into a pre-action decision: allow, block, require evidence, or route for approval before the tool call touches code, data, money, or customers.</p>
|
|
1210
|
+
<div class="agent-grid">
|
|
1211
|
+
<div class="agent-card">
|
|
1212
|
+
<h3>Pre-action enforcement</h3>
|
|
1213
|
+
<p>The rule is evaluated at the execution boundary, not after the fact. Repeated failures are stopped before shell commands, PR actions, deploys, refunds, or production writes run.</p>
|
|
1214
|
+
</div>
|
|
1215
|
+
<div class="agent-card">
|
|
1216
|
+
<h3>Reviewable decision trail</h3>
|
|
1217
|
+
<p>Each event records the rule, source lesson, policy version, actor, action, evidence requirement, and reason so reviewers can inspect the decision instead of trusting an agent summary.</p>
|
|
1218
|
+
</div>
|
|
1219
|
+
<div class="agent-card">
|
|
1220
|
+
<h3>Enterprise governance mode</h3>
|
|
1221
|
+
<p>Org-owned policies, reviewer approvals, signed evidence bundles, and export paths turn local corrections into shared controls without giving the agent unilateral authority over the rules.</p>
|
|
1222
|
+
</div>
|
|
1223
|
+
</div>
|
|
1224
|
+
</div>
|
|
1225
|
+
</section>
|
|
1226
|
+
|
|
1263
1227
|
<section class="compatibility" id="orchestration-layer">
|
|
1264
1228
|
<div class="container">
|
|
1265
1229
|
<div class="section-label">Positioning</div>
|
|
@@ -1323,6 +1287,7 @@ __GA_BOOTSTRAP__
|
|
|
1323
1287
|
<a href="/guides/relational-knowledge-ai-recommendations">Relational knowledge</a>
|
|
1324
1288
|
<a href="/guides/claude-code-feedback">Claude Code feedback</a>
|
|
1325
1289
|
<a href="/guides/autoresearch-agent-safety">Autoresearch safety</a>
|
|
1290
|
+
<a href="/guides/aws-blocks-agent-guardrails">AWS Blocks guardrails</a>
|
|
1326
1291
|
</div>
|
|
1327
1292
|
</div>
|
|
1328
1293
|
</div>
|
|
@@ -1345,7 +1310,7 @@ __GA_BOOTSTRAP__
|
|
|
1345
1310
|
</div>
|
|
1346
1311
|
<div class="autoresearch-card">
|
|
1347
1312
|
<h3>Ship into CI</h3>
|
|
1348
|
-
<p>Start with templates for <code>npm test</code>, Playwright duration, bundle size, lint, and CI failures, then add
|
|
1313
|
+
<p>Start with templates for <code>npm test</code>, Playwright duration, bundle size, lint, and CI failures, then add shared workflow checks for team-owned releases.</p>
|
|
1349
1314
|
</div>
|
|
1350
1315
|
</div>
|
|
1351
1316
|
<div class="autoresearch-cta">
|
|
@@ -1381,8 +1346,9 @@ __GA_BOOTSTRAP__
|
|
|
1381
1346
|
<!-- HOW IT WORKS -->
|
|
1382
1347
|
<section class="how-it-works" id="how-it-works">
|
|
1383
1348
|
<div class="container">
|
|
1384
|
-
<div class="section-label">
|
|
1349
|
+
<div class="section-label">Self-improving enforcement</div>
|
|
1385
1350
|
<h2 class="section-title">Three steps to stop repeated AI failures</h2>
|
|
1351
|
+
<p class="section-sub" style="max-width:720px;margin:6px auto 22px;text-align:center;color:var(--text-muted);font-size:clamp(16px,1.6vw,18px);">Self-improving โ but for safety, not capability: every <code>๐</code> compiles into a hard rule, and each rule regression-tests itself against your history, so it blocks the repeat and never the safe action.</p>
|
|
1386
1352
|
<div class="steps">
|
|
1387
1353
|
<div class="step">
|
|
1388
1354
|
<div class="step-num">1</div>
|
|
@@ -1587,7 +1553,7 @@ __GA_BOOTSTRAP__
|
|
|
1587
1553
|
<li><strong>Audit-ready enforcement proof</strong> โ Personal local dashboard for the individual operator with auditable block history</li>
|
|
1588
1554
|
<li><strong>Ship hardened agents to production</strong> โ Model Hardening Advisor plus HuggingFace dataset export</li>
|
|
1589
1555
|
<li><strong>Hand a PR with proof</strong> โ Review-ready workflow support and proof-ready lesson bundles a reviewer can verify in 30 seconds</li>
|
|
1590
|
-
<li><strong>Hand off without re-onboarding</strong> โ
|
|
1556
|
+
<li><strong>Hand off without re-onboarding</strong> โ Lesson export/import for handoff or migration</li>
|
|
1591
1557
|
</ul>
|
|
1592
1558
|
<div style="margin:12px 0 16px;padding:12px;border:1px solid rgba(34,211,238,0.25);border-radius:8px;background:rgba(34,211,238,0.06);">
|
|
1593
1559
|
<div style="font-size:12px;color:var(--text-muted);margin-bottom:4px;">What your Pro dashboard looks like</div>
|
|
@@ -1765,7 +1731,7 @@ __GA_BOOTSTRAP__
|
|
|
1765
1731
|
</div>
|
|
1766
1732
|
<div class="faq-item">
|
|
1767
1733
|
<button class="faq-q" type="button" aria-expanded="false" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">How do we keep high-risk autonomous runs off the host?</button>
|
|
1768
|
-
<div class="faq-a">ThumbGate is the control plane, not just a prompt layer. Workflow Sentinel predicts blast radius before execution, and risky local autonomy can be routed into Docker Sandboxes instead of running directly on the host.
|
|
1734
|
+
<div class="faq-a">ThumbGate is the control plane, not just a prompt layer. Workflow Sentinel predicts blast radius before execution, and risky local autonomy can be routed into Docker Sandboxes instead of running directly on the host. Enterprise workflows also have a signed hosted sandbox lane for isolated dispatch when local repo access is not required.</div>
|
|
1769
1735
|
</div>
|
|
1770
1736
|
<div class="faq-item">
|
|
1771
1737
|
<div class="faq-q" role="button" tabindex="0" aria-expanded="false" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">How do we trust a new package release?</div>
|
|
@@ -1849,7 +1815,7 @@ __GA_BOOTSTRAP__
|
|
|
1849
1815
|
<a href="https://www.linkedin.com/in/igorganapolsky" target="_blank" rel="noopener">LinkedIn</a>
|
|
1850
1816
|
<a href="/blog">Blog</a>
|
|
1851
1817
|
</div>
|
|
1852
|
-
<span class="footer-copy">ยฉ 2026 ThumbGate ยท MIT License ยท npm v1.27.
|
|
1818
|
+
<span class="footer-copy">ยฉ 2026 ThumbGate ยท MIT License ยท npm v1.27.8</span>
|
|
1853
1819
|
</div>
|
|
1854
1820
|
</footer>
|
|
1855
1821
|
|
|
@@ -2045,93 +2011,6 @@ function copyInstall(el) {
|
|
|
2045
2011
|
});
|
|
2046
2012
|
}
|
|
2047
2013
|
|
|
2048
|
-
function initializeGateDemo() {
|
|
2049
|
-
var root = document.querySelector('[data-gate-demo]');
|
|
2050
|
-
if (!root) return;
|
|
2051
|
-
var scenarios = {
|
|
2052
|
-
forcePush: {
|
|
2053
|
-
command: 'git push --force origin main',
|
|
2054
|
-
rule: 'Rule: never force-push protected branches',
|
|
2055
|
-
decision: 'BLOCK before execution',
|
|
2056
|
-
status: 'Blocked',
|
|
2057
|
-
statusClass: 'block',
|
|
2058
|
-
nodeClass: 'blocked',
|
|
2059
|
-
tokens: '0 spent',
|
|
2060
|
-
receipt: 'tg_427_force_push',
|
|
2061
|
-
caption: 'The agent receives a concrete refusal and chooses a safer plan. The audit trail keeps the rule, source feedback, timestamp, and proposed command.'
|
|
2062
|
-
},
|
|
2063
|
-
secretPaste: {
|
|
2064
|
-
command: 'paste STRIPE_SECRET_KEY into a public LLM prompt',
|
|
2065
|
-
rule: 'Rule: sanitize secrets before external AI tools',
|
|
2066
|
-
decision: 'BLOCK before data leaves the machine',
|
|
2067
|
-
status: 'Blocked',
|
|
2068
|
-
statusClass: 'block',
|
|
2069
|
-
nodeClass: 'blocked',
|
|
2070
|
-
tokens: '0 spent',
|
|
2071
|
-
receipt: 'tg_618_secret_prompt',
|
|
2072
|
-
caption: 'ThumbGate treats public prompt submission as an external action. Redact, tokenize, or route through a private endpoint before retrying.'
|
|
2073
|
-
},
|
|
2074
|
-
safeTest: {
|
|
2075
|
-
command: 'npm test -- --runInBand',
|
|
2076
|
-
rule: 'Rule: local verification is allowed',
|
|
2077
|
-
decision: 'ALLOW and log receipt',
|
|
2078
|
-
status: 'Allowed',
|
|
2079
|
-
statusClass: 'allow',
|
|
2080
|
-
nodeClass: 'allowed',
|
|
2081
|
-
tokens: 'normal',
|
|
2082
|
-
receipt: 'tg_102_test_ok',
|
|
2083
|
-
caption: 'Safe verification commands keep moving. ThumbGate records the action so later claims can cite what actually ran.'
|
|
2084
|
-
},
|
|
2085
|
-
deployNoProof: {
|
|
2086
|
-
command: 'railway deploy --production',
|
|
2087
|
-
rule: 'Rule: production deploy requires test, rollback, owner',
|
|
2088
|
-
decision: 'PAUSE for proof before execution',
|
|
2089
|
-
status: 'Needs proof',
|
|
2090
|
-
statusClass: 'block',
|
|
2091
|
-
nodeClass: 'blocked',
|
|
2092
|
-
tokens: 'retry avoided',
|
|
2093
|
-
receipt: 'tg_511_deploy_gate',
|
|
2094
|
-
caption: 'The deploy is not rejected forever; it is held until the agent shows the proof packet: tests, rollback path, owner, and target environment.'
|
|
2095
|
-
}
|
|
2096
|
-
};
|
|
2097
|
-
var fields = {
|
|
2098
|
-
command: root.querySelector('[data-demo-command]'),
|
|
2099
|
-
rule: root.querySelector('[data-demo-rule]'),
|
|
2100
|
-
decision: root.querySelector('[data-demo-decision]'),
|
|
2101
|
-
decisionNode: root.querySelector('[data-demo-decision-node]'),
|
|
2102
|
-
statusCard: root.querySelector('[data-demo-status-card]'),
|
|
2103
|
-
status: root.querySelector('[data-demo-status]'),
|
|
2104
|
-
tokens: root.querySelector('[data-demo-tokens]'),
|
|
2105
|
-
receipt: root.querySelector('[data-demo-receipt]'),
|
|
2106
|
-
caption: root.querySelector('[data-demo-caption]')
|
|
2107
|
-
};
|
|
2108
|
-
function render(key) {
|
|
2109
|
-
var next = scenarios[key] || scenarios.forcePush;
|
|
2110
|
-
fields.command.textContent = next.command;
|
|
2111
|
-
fields.rule.textContent = next.rule;
|
|
2112
|
-
fields.decision.textContent = next.decision;
|
|
2113
|
-
fields.status.textContent = next.status;
|
|
2114
|
-
fields.tokens.textContent = next.tokens;
|
|
2115
|
-
fields.receipt.textContent = next.receipt;
|
|
2116
|
-
fields.caption.textContent = next.caption;
|
|
2117
|
-
fields.decisionNode.classList.remove('blocked', 'allowed');
|
|
2118
|
-
fields.decisionNode.classList.add(next.nodeClass);
|
|
2119
|
-
fields.statusCard.classList.remove('block', 'allow');
|
|
2120
|
-
fields.statusCard.classList.add(next.statusClass);
|
|
2121
|
-
root.querySelectorAll('[data-demo-action]').forEach(function(button) {
|
|
2122
|
-
button.setAttribute('aria-pressed', button.getAttribute('data-demo-action') === key ? 'true' : 'false');
|
|
2123
|
-
});
|
|
2124
|
-
if (typeof plausible === 'function') plausible('interactive_gate_demo', { props: { scenario: key, status: next.status } });
|
|
2125
|
-
}
|
|
2126
|
-
root.querySelectorAll('[data-demo-action]').forEach(function(button) {
|
|
2127
|
-
button.addEventListener('click', function() {
|
|
2128
|
-
render(button.getAttribute('data-demo-action'));
|
|
2129
|
-
});
|
|
2130
|
-
});
|
|
2131
|
-
}
|
|
2132
|
-
|
|
2133
|
-
initializeGateDemo();
|
|
2134
|
-
|
|
2135
2014
|
/* โโ Plausible custom event tracking โโ */
|
|
2136
2015
|
(function() {
|
|
2137
2016
|
|
|
@@ -2181,7 +2060,7 @@ initializeGateDemo();
|
|
|
2181
2060
|
trackClick('.btn-demo-link', 'demo_click', { source: 'homepage' });
|
|
2182
2061
|
trackClick('.nav-cta:not([data-revenue-cta])', 'chatgpt_gpt_click', { tier: 'free', source: 'nav' });
|
|
2183
2062
|
|
|
2184
|
-
/* Pricing CTA conversion tracking โ fires on every Get Started / Pro /
|
|
2063
|
+
/* Pricing CTA conversion tracking โ fires on every Get Started / Pro / Enterprise button click
|
|
2185
2064
|
with section context so we can distinguish pricing section vs final CTA section clicks */
|
|
2186
2065
|
document.querySelectorAll('.btn-pro, .btn-gpt-page, .btn-pro-page, .btn-install-hero, .btn-install-link, .btn-team, .btn-free, .btn-demo-link, .nav-cta').forEach(function(el) {
|
|
2187
2066
|
el.addEventListener('click', function() {
|