Files
rm-circle-team-router/suite-tools.js
T
martbost f05d5a2746 Founder Desk (L8): weekly campaign pack + Suite API
Completes the ladder — no tier is a placeholder now.

Every tier below builds one thing at a time, which is right for someone
still finding their words. At the top the constraint is different: these are
people running organisations who don't have an afternoon to spend clicking.
So one pass produces five social posts across five different angles, three
outreach messages (first approach, follow-up, pyramid-scheme answer), an
email, and three text ads — all carrying their link, all in the member's own
voice profile if they have one.

Partial failures are reported rather than hidden: if the engine can't finish
a section the pack says which, instead of quietly handing over a short week.

API access is real, not a label: a personal key over
GET /me, GET /team, POST /generate. Keys are stored hashed and shown exactly
once, compared in constant time, and every call goes through the same meters
and compliance rules as the web tools.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-28 11:09:48 -05:00

67 lines
3.1 KiB
JavaScript

// One source of truth for "what does this level unlock in the Circle Suite",
// shared by the Telegram feeds, the X/Twitter payout posts, and anywhere else
// that congratulates an upgrade.
//
// Two honesty rules baked in:
// 1. `live:false` tiers are NEVER announced. We do not congratulate someone
// for unlocking software that does not exist yet.
// 2. The whole feature is gated on config.suiteToolsInAlerts, so nothing goes
// public while the Suite is still in team beta. Flip it on at launch.
'use strict';
const LEVEL_TOOLS = {
1: { name: 'Scintilla', live: true, short: 'the Launch Kit and the Traffic Desk — promo center, printable handouts with your QR, the Circle Method course, your dashboard, the AI coach, and banners or text ads on our own ad network' },
2: { name: 'Ascensus', live: true, short: 'the Copy Engine and Page Builder — an AI copywriter for your posts and DMs, plus your own hosted invitation page' },
3: { name: 'Fabrica', live: true, short: 'the Email Engine and Video Maker — full sequences in the team voice, and the promo videos rendered with your own end card' },
4: { name: 'Culmen', live: true, short: 'your Voice Profile — the Copy Engine and Email Engine start writing the way you actually talk' },
5: { name: 'Apex', live: true, short: 'the Split Tester, and your ad allowance jumps to 50,000 impressions a month' },
6: { name: 'Fastigium', live: true, short: 'the Funnel Factory — a separate hosted landing page for every audience you talk to' },
7: { name: 'Vertex', live: true, short: 'Leader Ops — your whole organisation triaged live from the contract, plus a coaching plan to teach forward' },
8: { name: 'Corona', live: true, short: 'the Founder Desk — a whole week of promotion built in one pass, plus API access to the Suite' }
};
// Very short form for character-limited surfaces (X/Twitter).
const TERSE = {
1: 'the Launch Kit + Traffic Desk',
2: 'the Copy Engine + Page Builder',
3: 'the Email Engine + Video Maker',
4: 'your own Voice Profile',
5: 'the Split Tester + 50k impressions',
6: 'the Funnel Factory',
7: 'Leader Ops',
8: 'the Founder Desk'
};
function levelNumber(level, levelName) {
const n = Number(level);
if (n >= 1 && n <= 8) return n;
if (levelName) {
for (const k of Object.keys(LEVEL_TOOLS)) {
if (LEVEL_TOOLS[k].name.toLowerCase() === String(levelName).toLowerCase()) return Number(k);
}
}
return 0;
}
function enabled(cfg) { return !!(cfg && cfg.suiteToolsInAlerts); }
// Full sentence fragment, or '' when we shouldn't say anything.
function unlockText(level, levelName, cfg) {
if (!enabled(cfg)) return '';
const n = levelNumber(level, levelName);
const t = LEVEL_TOOLS[n];
if (!t || !t.live) return '';
return t.short;
}
// Terse form for tweets, or '' when we shouldn't say anything.
function unlockTerse(level, levelName, cfg) {
if (!enabled(cfg)) return '';
const n = levelNumber(level, levelName);
const t = LEVEL_TOOLS[n];
if (!t || !t.live) return '';
return TERSE[n] || '';
}
module.exports = { LEVEL_TOOLS, unlockText, unlockTerse, levelNumber, enabled };