thumbgate 1.4.6 โ 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/.well-known/mcp/server-card.json +1 -1
- package/README.md +11 -0
- package/adapters/README.md +1 -1
- package/adapters/claude/.mcp.json +2 -2
- package/adapters/codex/config.toml +2 -2
- package/adapters/mcp/server-stdio.js +1 -1
- package/adapters/opencode/opencode.json +1 -1
- package/package.json +1 -1
- package/public/index.html +40 -11
- package/public/lessons.html +2 -2
- package/scripts/billing.js +8 -2
- package/scripts/commercial-offer.js +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "thumbgate-marketplace",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"owner": {
|
|
5
5
|
"name": "Igor Ganapolsky",
|
|
6
6
|
"email": "ig5973700@gmail.com"
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"source": "npm",
|
|
14
14
|
"package": "thumbgate"
|
|
15
15
|
},
|
|
16
|
-
"version": "1.
|
|
16
|
+
"version": "1.5.0",
|
|
17
17
|
"author": {
|
|
18
18
|
"name": "Igor Ganapolsky"
|
|
19
19
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "thumbgate",
|
|
3
3
|
"description": "Type ๐ or ๐ on any agent action. ThumbGate captures it, distills a lesson, and blocks the pattern from repeating. One thumbs-down = the agent physically cannot make that mistake again. 33 pre-action gates, budget enforcement, self-protection, and NIST/SOC2 compliance tags.",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.5.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Igor Ganapolsky"
|
|
7
7
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "thumbgate",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"description": "ThumbGate โ ๐๐ feedback that teaches your AI agent. Thumbs down a mistake, it never happens again.",
|
|
5
5
|
"homepage": "https://github.com/IgorGanapolsky/thumbgate",
|
|
6
6
|
"transport": "stdio",
|
package/README.md
CHANGED
|
@@ -18,6 +18,17 @@ ThumbGate checks risky commands, file edits, deploys, API calls, and other agent
|
|
|
18
18
|
|
|
19
19
|
**Running Codex?** **[Download the standalone Codex plugin bundle](https://github.com/IgorGanapolsky/ThumbGate/releases/latest/download/thumbgate-codex-plugin.zip)** ยท **[Codex install guide](plugins/codex-profile/INSTALL.md)**
|
|
20
20
|
|
|
21
|
+
## First-dollar activation path
|
|
22
|
+
|
|
23
|
+
If someone is not already bought into ThumbGate, do not lead with architecture. Lead with one repeated mistake.
|
|
24
|
+
|
|
25
|
+
1. **Show the pain:** open the **[ThumbGate GPT](https://thumbgate-production.up.railway.app/go/gpt?utm_source=github&utm_medium=readme&utm_campaign=first_dollar_activation&cta_id=readme_first_dollar_open_gpt&cta_placement=readme_first_dollar)** and paste the bad answer, risky command, deploy, PR action, or agent plan before it runs again.
|
|
26
|
+
2. **Capture the lesson:** type `thumbs down:` or `thumbs up:` with one concrete sentence. Native ChatGPT rating buttons are not the ThumbGate capture path; typed feedback is.
|
|
27
|
+
3. **Enforce the repeat:** run `npx thumbgate init` where the agent executes so the lesson can become a Pre-Action Gate instead of another reminder.
|
|
28
|
+
4. **Upgrade only after proof:** Solo Pro is for the dashboard, DPO export, proof-ready evidence, and higher capture limits after one real blocked repeat. Team starts with the Workflow Hardening Sprint around one repeated failure, one owner, and one proof review.
|
|
29
|
+
|
|
30
|
+
The buying question is simple: **what repeated AI mistake would be worth blocking before the next tool call?**
|
|
31
|
+
|
|
21
32
|
## ThumbGate GPT: start here
|
|
22
33
|
|
|
23
34
|
**Use ThumbGate in ChatGPT now:** **[Open the live ThumbGate GPT](https://thumbgate-production.up.railway.app/go/gpt?utm_source=github&utm_medium=readme&utm_campaign=gpt_intro&cta_id=readme_intro_open_gpt&cta_placement=readme_intro)**, paste the action your AI agent wants to run, and ask whether to allow, block, or checkpoint it before the mistake becomes expensive.
|
package/adapters/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
- `chatgpt/openapi.yaml`: import into GPT Actions.
|
|
4
4
|
- `gemini/function-declarations.json`: Gemini function-calling definitions.
|
|
5
5
|
- `mcp/server-stdio.js`: underlying local MCP stdio server implementation.
|
|
6
|
-
- `claude/.mcp.json`: example Claude Code MCP config using `npx --yes --package thumbgate@1.
|
|
6
|
+
- `claude/.mcp.json`: example Claude Code MCP config using `npx --yes --package thumbgate@1.5.0 thumbgate serve`.
|
|
7
7
|
- `codex/config.toml`: example Codex MCP profile section using the same version-pinned portable launcher.
|
|
8
8
|
- `amp/skills/thumbgate-feedback/SKILL.md`: Amp skill template.
|
|
9
9
|
- `opencode/opencode.json`: portable OpenCode MCP profile using the same version-pinned portable launcher.
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
"mcpServers": {
|
|
3
3
|
"thumbgate": {
|
|
4
4
|
"command": "npx",
|
|
5
|
-
"args": ["--yes", "--package", "thumbgate@1.
|
|
5
|
+
"args": ["--yes", "--package", "thumbgate@1.5.0", "thumbgate", "serve"]
|
|
6
6
|
}
|
|
7
7
|
},
|
|
8
8
|
"hooks": {
|
|
9
9
|
"preToolUse": {
|
|
10
10
|
"command": "npx",
|
|
11
|
-
"args": ["--yes", "--package", "thumbgate@1.
|
|
11
|
+
"args": ["--yes", "--package", "thumbgate@1.5.0", "thumbgate", "gate-check"]
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# Codex MCP profile (copy into ~/.codex/config.toml or merge section)
|
|
2
2
|
[mcp_servers.thumbgate]
|
|
3
3
|
command = "npx"
|
|
4
|
-
args = ["--yes", "--package", "thumbgate@1.
|
|
4
|
+
args = ["--yes", "--package", "thumbgate@1.5.0", "thumbgate", "serve"]
|
|
5
5
|
|
|
6
6
|
# Hard PreToolUse hook for Codex
|
|
7
7
|
[hooks.pre_tool_use]
|
|
8
8
|
command = "npx"
|
|
9
|
-
args = ["--yes", "--package", "thumbgate@1.
|
|
9
|
+
args = ["--yes", "--package", "thumbgate@1.5.0", "thumbgate", "gate-check"]
|
|
@@ -124,7 +124,7 @@ const {
|
|
|
124
124
|
finalizeSession: finalizeFeedbackSession,
|
|
125
125
|
} = require('../../scripts/feedback-session');
|
|
126
126
|
|
|
127
|
-
const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.
|
|
127
|
+
const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.5.0' };
|
|
128
128
|
const COMMERCE_CATEGORIES = [
|
|
129
129
|
'product_recommendation',
|
|
130
130
|
'brand_compliance',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "thumbgate",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"description": "Self-improving agent governance: type thumbs-up or thumbs-down on any AI agent action. ThumbGate turns every mistake into a prevention rule and blocks the pattern from repeating. One thumbs-down, never again. 33 pre-action gates, budget enforcement, and self-protection for Claude Code, Cursor, Codex, Gemini CLI, and Amp.",
|
|
5
5
|
"homepage": "https://thumbgate-production.up.railway.app",
|
|
6
6
|
"repository": {
|
package/public/index.html
CHANGED
|
@@ -298,6 +298,14 @@ __GA_BOOTSTRAP__
|
|
|
298
298
|
.hero-install .cmd { color: var(--cyan); }
|
|
299
299
|
.hero-install .copy-hint { font-size: 11px; color: var(--text-muted); font-family: var(--font); margin-left: 8px; }
|
|
300
300
|
.hero-install .copied { color: var(--green); }
|
|
301
|
+
.first-gate-card { max-width: 820px; margin: 0 auto 28px; text-align: left; border: 1px solid rgba(34,211,238,0.28); background: linear-gradient(135deg, rgba(34,211,238,0.08) 0%, rgba(74,222,128,0.06) 100%); border-radius: 14px; padding: 22px; box-shadow: 0 18px 60px rgba(0,0,0,0.22); }
|
|
302
|
+
.first-gate-card h2 { font-size: clamp(22px, 3vw, 30px); line-height: 1.15; margin-bottom: 8px; letter-spacing: -0.025em; }
|
|
303
|
+
.first-gate-card p { max-width: none; margin: 0 0 16px; color: var(--text-muted); font-size: 15px; }
|
|
304
|
+
.first-gate-steps { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; margin-top: 16px; }
|
|
305
|
+
.first-gate-step { border: 1px solid var(--border); border-radius: 10px; background: rgba(10,10,11,0.62); padding: 14px; }
|
|
306
|
+
.first-gate-step strong { display: block; color: var(--cyan); margin-bottom: 6px; }
|
|
307
|
+
.first-gate-step p { font-size: 13px; line-height: 1.5; margin: 0; }
|
|
308
|
+
.first-gate-example { font-family: var(--mono); color: var(--green); background: rgba(74,222,128,0.08); border: 1px solid rgba(74,222,128,0.24); border-radius: 8px; padding: 10px 12px; font-size: 12px; margin-top: 12px; overflow-x: auto; }
|
|
301
309
|
|
|
302
310
|
/* SOCIAL PROOF BAR */
|
|
303
311
|
.proof-bar { display: flex; justify-content: center; flex-wrap: wrap; gap: 24px; font-size: 13px; color: var(--text-muted); padding: 0 0 8px; }
|
|
@@ -447,6 +455,7 @@ __GA_BOOTSTRAP__
|
|
|
447
455
|
@media (max-width: 700px) {
|
|
448
456
|
.steps { grid-template-columns: 1fr; }
|
|
449
457
|
.compatibility-grid { grid-template-columns: 1fr; }
|
|
458
|
+
.first-gate-steps { grid-template-columns: 1fr; }
|
|
450
459
|
.gpt-steps { grid-template-columns: 1fr; }
|
|
451
460
|
.seo-grid { grid-template-columns: 1fr; }
|
|
452
461
|
.pricing-grid { grid-template-columns: 1fr; }
|
|
@@ -497,9 +506,9 @@ __GA_BOOTSTRAP__
|
|
|
497
506
|
<section class="hero">
|
|
498
507
|
<div class="container">
|
|
499
508
|
<div class="hero-thumbs">๐๐</div>
|
|
500
|
-
<div class="hero-badge">โ
|
|
501
|
-
<h1>Stop AI
|
|
502
|
-
<p style="font-size:18px;color:var(--text-muted);max-width:
|
|
509
|
+
<div class="hero-badge">โ Block your first repeated AI mistake in 5 minutes</div>
|
|
510
|
+
<h1>Stop the same AI mistake<br>before it runs again.</h1>
|
|
511
|
+
<p style="font-size:18px;color:var(--text-muted);max-width:660px;margin:0 auto 20px;line-height:1.6;">Open the ThumbGate GPT, paste the answer or action that went wrong, then type a concrete <code>thumbs down:</code> or <code>thumbs up:</code> lesson.<br><strong style="color:var(--text)">Install locally with <code>npx thumbgate init</code> when you want that lesson enforced before the next agent tool call.</strong></p>
|
|
503
512
|
<div class="hero-signals">
|
|
504
513
|
<div class="signal-pill signal-down">๐ Prevent expensive mistakes: force-pushes, destructive SQL, bad deploys</div>
|
|
505
514
|
<div class="signal-pill signal-up">โ
Fix it once, then block the repeat before the next tool call</div>
|
|
@@ -520,6 +529,26 @@ __GA_BOOTSTRAP__
|
|
|
520
529
|
</div>
|
|
521
530
|
<p style="font-size:13px;color:var(--text-muted);margin:16px auto 0;max-width:660px;">No, you do not have to chat inside the GPT forever. The GPT is advice and checkpointing; local hooks do the hard blocking for Claude Code, Cursor, Codex, Gemini, Amp, OpenCode, and MCP-compatible agents.</p>
|
|
522
531
|
<p style="font-size:13px;color:var(--text-muted);margin:8px auto 28px;max-width:560px;">Free local CLI proves the enforcement loop on one machine. Pro adds personal enforcement proof, the gate debugger, DPO export, and a dashboard. Team shares the gates across seats. <a href="#pricing" style="color:var(--cyan);text-decoration:none;">See all plans โ</a></p>
|
|
532
|
+
<div class="first-gate-card" id="first-gate">
|
|
533
|
+
<div class="section-label" style="text-align:left;margin-bottom:8px;">First-Dollar Activation Path</div>
|
|
534
|
+
<h2>Prove one blocked repeat before asking anyone to buy.</h2>
|
|
535
|
+
<p>The fastest path to revenue is not another feature. It is one person proving ThumbGate prevents one repeated mistake they already care about.</p>
|
|
536
|
+
<div class="first-gate-steps">
|
|
537
|
+
<div class="first-gate-step">
|
|
538
|
+
<strong>1. Open the GPT</strong>
|
|
539
|
+
<p>Paste the bad answer, command, deploy, PR action, or agent plan before it runs again.</p>
|
|
540
|
+
</div>
|
|
541
|
+
<div class="first-gate-step">
|
|
542
|
+
<strong>2. Type the signal</strong>
|
|
543
|
+
<p>Use <code>thumbs down:</code> for the mistake or <code>thumbs up:</code> for the pattern worth repeating. Native ChatGPT rating buttons are not the ThumbGate capture path.</p>
|
|
544
|
+
</div>
|
|
545
|
+
<div class="first-gate-step">
|
|
546
|
+
<strong>3. Enforce the lesson</strong>
|
|
547
|
+
<p>Run <code>npx thumbgate init</code>. Upgrade to Pro when you need the dashboard, proof, exports, or more captures.</p>
|
|
548
|
+
</div>
|
|
549
|
+
</div>
|
|
550
|
+
<div class="first-gate-example">thumbs down: the answer ignored my request for exact files and tests; next time include file paths, commands, and verification evidence.</div>
|
|
551
|
+
</div>
|
|
523
552
|
<div class="proof-bar">
|
|
524
553
|
<a href="/guide" rel="noopener">CLI-first setup guide โ</a>
|
|
525
554
|
<span class="dot"></span>
|
|
@@ -564,8 +593,8 @@ __GA_BOOTSTRAP__
|
|
|
564
593
|
<div class="container">
|
|
565
594
|
<div class="gpt-panel">
|
|
566
595
|
<div class="section-label" style="text-align:left;">ChatGPT Entry Point ยท Live ThumbGate GPT for ChatGPT</div>
|
|
567
|
-
<h2>Open the GPT.
|
|
568
|
-
<p>ThumbGate should meet users where they already ask AI for help. The live GPT is the lowest-friction way to
|
|
596
|
+
<h2>Open the GPT. Give typed thumbs feedback. Turn the lesson into a gate.</h2>
|
|
597
|
+
<p>ThumbGate should meet users where they already ask AI for help. The live GPT is the lowest-friction way to capture a useful thumbs-up/down lesson, check a risky action, and prove the enforcement loop before installing anything.</p>
|
|
569
598
|
<div class="gpt-steps">
|
|
570
599
|
<div class="gpt-step">
|
|
571
600
|
<strong>1. Try the live GPT</strong>
|
|
@@ -573,7 +602,7 @@ __GA_BOOTSTRAP__
|
|
|
573
602
|
</div>
|
|
574
603
|
<div class="gpt-step">
|
|
575
604
|
<strong>2. Save the signal</strong>
|
|
576
|
-
<p>Reply with <code>thumbs up:</code> or <code>thumbs down:</code> plus one concrete sentence.
|
|
605
|
+
<p>Reply in chat with <code>thumbs up:</code> or <code>thumbs down:</code> plus one concrete sentence. Do not rely on ChatGPT's native rating buttons for ThumbGate memory.</p>
|
|
577
606
|
</div>
|
|
578
607
|
<div class="gpt-step">
|
|
579
608
|
<strong>3. Enforce locally</strong>
|
|
@@ -584,7 +613,7 @@ __GA_BOOTSTRAP__
|
|
|
584
613
|
<a href="/go/gpt?utm_source=website&utm_medium=gpt_section&utm_campaign=chatgpt_gpt&cta_id=gpt_path_open_gpt&cta_placement=gpt_section" class="btn-gpt-page" target="_blank" rel="noopener" onclick="posthog.capture('gpt_path_cta_click',{cta:'open_gpt'})">Open ThumbGate GPT</a>
|
|
585
614
|
<a href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/adapters/chatgpt/INSTALL.md" class="btn-free" target="_blank" rel="noopener" style="display:inline-flex;align-items:center;padding:12px 20px;border-radius:8px;">ChatGPT Actions setup</a>
|
|
586
615
|
</div>
|
|
587
|
-
<p class="gpt-note"><strong>Plain English rule:</strong> ChatGPT is the discovery and memory surface for advice, checkpointing, and typed feedback capture. The hard Reliability Gateway still runs in the local agent or CI lane.</p>
|
|
616
|
+
<p class="gpt-note"><strong>Plain English rule:</strong> ChatGPT is the discovery and memory surface for advice, checkpointing, and typed feedback capture. One typed signal becomes one remembered rule. The hard Reliability Gateway still runs in the local agent or CI lane.</p>
|
|
588
617
|
</div>
|
|
589
618
|
</div>
|
|
590
619
|
</section>
|
|
@@ -722,7 +751,7 @@ __GA_BOOTSTRAP__
|
|
|
722
751
|
<!-- HOW IT WORKS -->
|
|
723
752
|
<section class="how-it-works" id="how-it-works">
|
|
724
753
|
<div class="container">
|
|
725
|
-
<div class="section-label">New in v1.
|
|
754
|
+
<div class="section-label">New in v1.5.0</div>
|
|
726
755
|
<h2 class="section-title">Three steps to stop repeated AI failures</h2>
|
|
727
756
|
<div class="steps">
|
|
728
757
|
<div class="step">
|
|
@@ -872,7 +901,7 @@ __GA_BOOTSTRAP__
|
|
|
872
901
|
<div class="tier" style="color:var(--cyan);">Free</div>
|
|
873
902
|
<div class="price">$0</div>
|
|
874
903
|
<div class="price-sub">Forever free ยท CLI-first local enforcement for one developer</div>
|
|
875
|
-
<p style="font-size:13px;color:#aaa;margin-bottom:16px;">For solo developers who want to stop the same agent mistake from showing up twice and prove
|
|
904
|
+
<p style="font-size:13px;color:#aaa;margin-bottom:16px;">For solo developers who want to stop the same agent mistake from showing up twice and prove one blocked repeat before a team rollout conversation exists.</p>
|
|
876
905
|
<ul>
|
|
877
906
|
<li>3 feedback captures/day ยท 5 lesson searches/day ยท unlimited recall</li>
|
|
878
907
|
<li>5 auto-promoted gates plus the core safety policy</li>
|
|
@@ -920,7 +949,7 @@ __GA_BOOTSTRAP__
|
|
|
920
949
|
</ul>
|
|
921
950
|
<div class="trial-badge" style="background:var(--cyan);color:#000;display:inline-block;padding:4px 12px;border-radius:12px;font-size:12px;font-weight:700;margin-bottom:12px;">7-DAY FREE TRIAL</div>
|
|
922
951
|
<a href="/go/pro?utm_source=website&utm_medium=pricing_card&utm_campaign=pro_upgrade&cta_id=pricing_pro_upgrade&cta_placement=pricing&plan_id=pro&landing_path=%2F" class="btn-pro" onclick="posthog.capture('pricing_cta_click',{cta:'pro_upgrade',plan:'pro'})" style="display:block;width:100%;text-align:center;padding:12px;font-size:15px;">Upgrade to Pro โ $19/mo</a>
|
|
923
|
-
<p style="font-size:11px;color:#666;margin-top:8px;">Start with the free CLI. Upgrade when you hit the 3 captures/day limit
|
|
952
|
+
<p style="font-size:11px;color:#666;margin-top:8px;">Start with the free CLI. Upgrade after one real blocked repeat when you hit the 3 captures/day limit or need dashboard proof, DPO export, and export-ready evidence.</p>
|
|
924
953
|
</div>
|
|
925
954
|
<div class="price-card team">
|
|
926
955
|
<div class="tier">Team</div>
|
|
@@ -1068,7 +1097,7 @@ __GA_BOOTSTRAP__
|
|
|
1068
1097
|
<a href="https://www.linkedin.com/in/igorganapolsky" target="_blank" rel="noopener">LinkedIn</a>
|
|
1069
1098
|
<a href="/blog">Blog</a>
|
|
1070
1099
|
</div>
|
|
1071
|
-
<span class="footer-copy">ยฉ 2026 Max Smith KDP LLC ยท MIT License ยท v1.
|
|
1100
|
+
<span class="footer-copy">ยฉ 2026 Max Smith KDP LLC ยท MIT License ยท v1.5.0</span>
|
|
1072
1101
|
</div>
|
|
1073
1102
|
</footer>
|
|
1074
1103
|
|
package/public/lessons.html
CHANGED
|
@@ -817,8 +817,8 @@ function renderUpgradeWall(containerId) {
|
|
|
817
817
|
'<div style="text-align:center;background:rgba(10,10,15,0.92);border:1px solid #333;border-radius:12px;padding:28px 36px;">' +
|
|
818
818
|
'<div style="font-size:20px;font-weight:700;color:#fff;margin-bottom:8px;">Unlock your full lessons</div>' +
|
|
819
819
|
'<div style="color:#aaa;margin-bottom:16px;">Pro shows your real prevention rules, timeline, and insights.</div>' +
|
|
820
|
-
'<a href="https://buy.stripe.com/
|
|
821
|
-
'style="display:inline-block;background:#b85c2d;color:#fff;padding:10px 24px;border-radius:8px;text-decoration:none;font-weight:700;">
|
|
820
|
+
'<a href="https://buy.stripe.com/7sYcN5bmIf5IcSd8qf3sI0a" target="_blank" rel="noopener" ' +
|
|
821
|
+
'style="display:inline-block;background:#b85c2d;color:#fff;padding:10px 24px;border-radius:8px;text-decoration:none;font-weight:700;">Start 7-day free trial</a>' +
|
|
822
822
|
'<div style="color:#666;font-size:12px;margin-top:10px;">npx thumbgate pro --activate --key=YOUR_KEY</div>' +
|
|
823
823
|
'</div></div>';
|
|
824
824
|
el.appendChild(wall);
|
package/scripts/billing.js
CHANGED
|
@@ -2292,8 +2292,14 @@ async function handleWebhook(rawBody, signature) {
|
|
|
2292
2292
|
if (LOCAL_MODE()) return { handled: false, reason: 'local_mode' };
|
|
2293
2293
|
let event;
|
|
2294
2294
|
try {
|
|
2295
|
-
|
|
2296
|
-
|
|
2295
|
+
if (CONFIG.STRIPE_WEBHOOK_SECRET) {
|
|
2296
|
+
const stripe = getStripeClient();
|
|
2297
|
+
event = stripe.webhooks.constructEvent(rawBody, signature, CONFIG.STRIPE_WEBHOOK_SECRET);
|
|
2298
|
+
} else {
|
|
2299
|
+
// No webhook secret configured โ signature was already checked by verifyWebhookSignature
|
|
2300
|
+
// (which is also lenient when no secret). Parse the raw body directly.
|
|
2301
|
+
event = JSON.parse(rawBody.toString('utf-8'));
|
|
2302
|
+
}
|
|
2297
2303
|
} catch (err) {
|
|
2298
2304
|
return { handled: false, reason: 'invalid_signature', error: err.message };
|
|
2299
2305
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const PRO_MONTHLY_PAYMENT_LINK = 'https://buy.stripe.com/
|
|
3
|
+
const PRO_MONTHLY_PAYMENT_LINK = 'https://buy.stripe.com/7sYcN5bmIf5IcSd8qf3sI0a';
|
|
4
4
|
const PRO_ANNUAL_PAYMENT_LINK = 'https://buy.stripe.com/3cI8wPfCYaPs2dzdKz3sI07';
|
|
5
5
|
|
|
6
6
|
const PRO_MONTHLY_PRICE_ID = 'price_1THQY7GGBpd520QYHoS7RG0J';
|