spl-pay-per-suite 1.1.4 → 1.1.7
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/README.md +24 -10
- package/package.json +40 -21
- package/src/index.mjs +2 -0
- package/src/mcp-server.mjs +51 -22
- package/src/quote.mjs +46 -47
package/README.md
CHANGED
|
@@ -2,19 +2,31 @@
|
|
|
2
2
|
|
|
3
3
|
**SPL Pay Per Suite** — freemium quotes, Stripe (humans) + x402 (agents). Library, CLI, and MCP.
|
|
4
4
|
|
|
5
|
-
## Pricing (
|
|
5
|
+
## Pricing (canonical · matches live API)
|
|
6
6
|
|
|
7
7
|
| Tier | Rule |
|
|
8
8
|
|------|------|
|
|
9
|
-
| **Free** | First **
|
|
10
|
-
| **Usage** |
|
|
11
|
-
| **Min paid** |
|
|
9
|
+
| **Free** | First **100 GB per job** — $0 |
|
|
10
|
+
| **Usage** | Next 100 paid GB: **$0.05 / GB** · then **$0.04 / GB** |
|
|
11
|
+
| **Min paid** | **$0.05** once over free |
|
|
12
|
+
| **Ref** | Under typical first paid cloud egress (~$0.09/GB) |
|
|
12
13
|
|
|
13
14
|
**Try Gate is retired.** Evaluate on free suite — not a $9 chip-in.
|
|
14
15
|
|
|
15
|
-
|
|
16
|
+
### Standing license SKUs (not suite metered)
|
|
16
17
|
|
|
17
|
-
|
|
18
|
+
| SKU | USD |
|
|
19
|
+
|-----|----:|
|
|
20
|
+
| CDDG:Split | 199 |
|
|
21
|
+
| ZRW N00b / Pro / L33t | 79 / 249 / 699 |
|
|
22
|
+
| blackjack · shard-zip · shard-tsdb · slid-phi · support | 199 |
|
|
23
|
+
| consulting | 250 |
|
|
24
|
+
| sponsor / donate | 29 / 29.99 |
|
|
25
|
+
| GAO entry | 1 |
|
|
26
|
+
|
|
27
|
+
Canonical table: [`docs/NPM_PRICING.md`](../../docs/NPM_PRICING.md) · Catalog: [GET /api/x402-products](https://slidphilabs.fly.dev/api/x402-products)
|
|
28
|
+
|
|
29
|
+
Live suite: [slidphilabs.fly.dev/pps](https://slidphilabs.fly.dev/pps) · Discovery: [GET /api/agent](https://slidphilabs.fly.dev/api/agent)
|
|
18
30
|
|
|
19
31
|
## Install
|
|
20
32
|
|
|
@@ -29,11 +41,11 @@ npx spl-pay-per-suite quote --bytes 500000000
|
|
|
29
41
|
```js
|
|
30
42
|
import { computeQuote } from "spl-pay-per-suite";
|
|
31
43
|
|
|
32
|
-
computeQuote({ product: "auto", op: "compress", bytes:
|
|
33
|
-
// → free: true
|
|
44
|
+
computeQuote({ product: "auto", op: "compress", bytes: 50 * 1024 ** 3 });
|
|
45
|
+
// → free: true (under 100 GB)
|
|
34
46
|
|
|
35
|
-
computeQuote({ product: "auto", op: "compress", bytes:
|
|
36
|
-
// → free: false
|
|
47
|
+
computeQuote({ product: "auto", op: "compress", bytes: 110 * 1024 ** 3 });
|
|
48
|
+
// → free: false · ~$0.50 class (10 GB × 5¢)
|
|
37
49
|
```
|
|
38
50
|
|
|
39
51
|
## MCP
|
|
@@ -45,6 +57,8 @@ npx spl-pay-per-suite mcp
|
|
|
45
57
|
|
|
46
58
|
Tools: `spl_pps_info`, `spl_pps_quote`, `spl_pps_checkout`, `spl_pps_submit_job`, `spl_pps_classify`, `spl_pps_x402_*`.
|
|
47
59
|
|
|
60
|
+
`spl_pps_info` returns the same suite rates as the live quote engine (`SUITE_PRICING`).
|
|
61
|
+
|
|
48
62
|
## IP Guard
|
|
49
63
|
|
|
50
64
|
Quotes and commerce rails only — no private compression process or engines in this package.
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "spl-pay-per-suite",
|
|
3
|
-
"version": "1.1.
|
|
4
|
-
"description": "SPL Pay Per Suite
|
|
3
|
+
"version": "1.1.7",
|
|
4
|
+
"description": "SPL Pay Per Suite \u2014 freemium (free first 100 GB \u00b7 then ~5\u00a2/GB then ~4\u00a2/GB), Stripe + x402. Library, CLI, MCP. Try Gate retired.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/index.mjs",
|
|
7
7
|
"exports": {
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
],
|
|
53
53
|
"author": "Slid Phi Labs",
|
|
54
54
|
"license": "SEE LICENSE IN LICENSE",
|
|
55
|
-
"homepage": "https://
|
|
55
|
+
"homepage": "https://slidphilabs.fly.dev",
|
|
56
56
|
"repository": {
|
|
57
57
|
"type": "git",
|
|
58
58
|
"url": "git+https://github.com/ceedot-rock/SlidPhiLabs.git",
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
},
|
|
64
64
|
"funding": {
|
|
65
65
|
"type": "individual",
|
|
66
|
-
"url": "https://
|
|
66
|
+
"url": "https://slidphilabs.fly.dev/pay"
|
|
67
67
|
},
|
|
68
68
|
"agentic": {
|
|
69
69
|
"modules": {
|
|
@@ -78,33 +78,36 @@
|
|
|
78
78
|
]
|
|
79
79
|
},
|
|
80
80
|
"commerce": "x402",
|
|
81
|
-
"discovery": "https://
|
|
82
|
-
"catalog": "https://
|
|
83
|
-
"web_codec": "https://
|
|
84
|
-
"site": "https://
|
|
85
|
-
"llms_txt": "https://
|
|
86
|
-
"agents_json": "https://
|
|
87
|
-
"one_liner": "Free first
|
|
81
|
+
"discovery": "https://slidphilabs.fly.dev/api/agent",
|
|
82
|
+
"catalog": "https://slidphilabs.fly.dev/api/x402-products",
|
|
83
|
+
"web_codec": "https://slidphilabs.fly.dev/api/web-codec",
|
|
84
|
+
"site": "https://slidphilabs.fly.dev",
|
|
85
|
+
"llms_txt": "https://slidphilabs.fly.dev/llms.txt",
|
|
86
|
+
"agents_json": "https://slidphilabs.fly.dev/agents.json",
|
|
87
|
+
"one_liner": "Free first 100 GB suite \u00b7 then ~5\u00a2/GB then ~4\u00a2/GB. Pay: https://slidphilabs.fly.dev/pay \u00b7 GET https://slidphilabs.fly.dev/api/agent",
|
|
88
88
|
"agent_platform": {
|
|
89
89
|
"cuni": "https://cuni-studio.fly.dev/",
|
|
90
90
|
"agent_rider": "https://agentrider.vercel.app/",
|
|
91
91
|
"quikgater": "https://github.com/ceedot-rock/quikgater"
|
|
92
92
|
},
|
|
93
|
-
"suite": "https://
|
|
93
|
+
"suite": "https://slidphilabs.fly.dev/pps",
|
|
94
94
|
"suite_pricing": {
|
|
95
|
-
"free_cap_gb":
|
|
96
|
-
"min_paid_usd":
|
|
97
|
-
"usd_per_gb_after_free": 0.
|
|
98
|
-
"usd_per_gb_bulk": 0.
|
|
95
|
+
"free_cap_gb": 100,
|
|
96
|
+
"min_paid_usd": 0.05,
|
|
97
|
+
"usd_per_gb_after_free": 0.05,
|
|
98
|
+
"usd_per_gb_bulk": 0.04,
|
|
99
|
+
"first_paid_egress_ref_usd": 0.09,
|
|
99
100
|
"try_gate": "retired",
|
|
100
|
-
"model": "
|
|
101
|
+
"model": "freemium_suite_v4_undercut"
|
|
101
102
|
},
|
|
102
|
-
"welcome": "https://
|
|
103
|
-
"platform_json": "https://
|
|
103
|
+
"welcome": "https://slidphilabs.fly.dev/api/welcome",
|
|
104
|
+
"platform_json": "https://slidphilabs.fly.dev/platform.json",
|
|
105
|
+
"pay_ui": "https://slidphilabs.fly.dev/pay",
|
|
106
|
+
"team_mesh": "https://spl-team-mesh.fly.dev"
|
|
104
107
|
},
|
|
105
108
|
"x402": {
|
|
106
|
-
"discovery": "https://
|
|
107
|
-
"catalog": "https://
|
|
109
|
+
"discovery": "https://slidphilabs.fly.dev/api/agent",
|
|
110
|
+
"catalog": "https://slidphilabs.fly.dev/api/x402-products",
|
|
108
111
|
"networks": [
|
|
109
112
|
"solana-mainnet-beta",
|
|
110
113
|
"eip155:8453"
|
|
@@ -113,5 +116,21 @@
|
|
|
113
116
|
},
|
|
114
117
|
"bugs": {
|
|
115
118
|
"url": "https://www.slidphilabs.com"
|
|
119
|
+
},
|
|
120
|
+
"pricing": {
|
|
121
|
+
"sku": "suite",
|
|
122
|
+
"amount_usd": "metered",
|
|
123
|
+
"currency": "usd",
|
|
124
|
+
"buy": "https://slidphilabs.fly.dev/pps",
|
|
125
|
+
"checkout": "https://slidphilabs.fly.dev/api/checkout",
|
|
126
|
+
"access": "https://slidphilabs.fly.dev/access?product=suite",
|
|
127
|
+
"catalog": "https://slidphilabs.fly.dev/api/x402-products",
|
|
128
|
+
"pay_ui": "https://slidphilabs.fly.dev/pay",
|
|
129
|
+
"doc": "https://slidphilabs.fly.dev/pps",
|
|
130
|
+
"suite_pricing": {
|
|
131
|
+
"free_cap_gb": 100,
|
|
132
|
+
"usd_per_gb_after_free": 0.05,
|
|
133
|
+
"usd_per_gb_bulk": 0.04
|
|
134
|
+
}
|
|
116
135
|
}
|
|
117
136
|
}
|
package/src/index.mjs
CHANGED
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
MIN_CENTS,
|
|
19
19
|
MAX_CENTS,
|
|
20
20
|
MAX_BYTES,
|
|
21
|
+
SUITE_PRICING,
|
|
21
22
|
} from "./quote.mjs";
|
|
22
23
|
|
|
23
24
|
export {
|
|
@@ -36,6 +37,7 @@ export {
|
|
|
36
37
|
MIN_CENTS,
|
|
37
38
|
MAX_CENTS,
|
|
38
39
|
MAX_BYTES,
|
|
40
|
+
SUITE_PRICING,
|
|
39
41
|
};
|
|
40
42
|
|
|
41
43
|
export const SERVICE_NAME = "SPL Pay Per Suite";
|
package/src/mcp-server.mjs
CHANGED
|
@@ -38,25 +38,31 @@ import {
|
|
|
38
38
|
OP_MULT,
|
|
39
39
|
FREE_BYTES,
|
|
40
40
|
MIN_PAID_CENTS,
|
|
41
|
+
SUITE_PRICING,
|
|
41
42
|
} from "./index.mjs";
|
|
42
43
|
|
|
44
|
+
const SUITE_LINE =
|
|
45
|
+
"Free first 100 GB per job · then ~5¢/GB (4¢ after 100 paid GB) · min $0.05 · under ~9¢ cloud egress. Try Gate retired.";
|
|
46
|
+
|
|
43
47
|
const TOOLS = [
|
|
44
48
|
{
|
|
45
49
|
name: "spl_pps_info",
|
|
46
50
|
description:
|
|
47
|
-
"SPL Pay Per Suite overview:
|
|
51
|
+
"SPL Pay Per Suite overview: " +
|
|
52
|
+
SUITE_LINE +
|
|
53
|
+
" Stripe (humans) + x402 (agents). Standing SKUs: CDDG $199 · ZRW $79/$249/$699 · blackjack/shards/slid-phi/support $199 · consulting $250.",
|
|
48
54
|
inputSchema: { type: "object", properties: {} },
|
|
49
55
|
},
|
|
50
56
|
{
|
|
51
57
|
name: "spl_pps_x402_info",
|
|
52
58
|
description:
|
|
53
|
-
"Agentic commerce discovery: standing product catalog + freemium suite jobs (free under
|
|
59
|
+
"Agentic commerce discovery: standing product catalog + freemium suite jobs (free under 100 GB), headers, flow. Stripe remains for humans.",
|
|
54
60
|
inputSchema: { type: "object", properties: {} },
|
|
55
61
|
},
|
|
56
62
|
{
|
|
57
63
|
name: "spl_pps_x402_catalog",
|
|
58
64
|
description:
|
|
59
|
-
"List standing Slid Phi Labs license products agents can buy via x402 (CDDG:Split, ZRW tiers, Blackjack
|
|
65
|
+
"List standing Slid Phi Labs license products agents can buy via x402 (CDDG:Split $199, ZRW tiers $79/$249/$699, Blackjack/shards/slid-phi/support $199, consulting $250, etc.). Freemium suite for eval.",
|
|
60
66
|
inputSchema: { type: "object", properties: {} },
|
|
61
67
|
},
|
|
62
68
|
{
|
|
@@ -69,7 +75,7 @@ const TOOLS = [
|
|
|
69
75
|
sku: {
|
|
70
76
|
type: "string",
|
|
71
77
|
description:
|
|
72
|
-
"cddg-split | zrw-n00b | zrw-pro | zrw-l33t | blackjack | shard-zip | shard-tsdb | slid-phi | support-integration | consulting | sponsor | donate",
|
|
78
|
+
"cddg-split($199) | zrw-n00b($79) | zrw-pro($249) | zrw-l33t($699) | blackjack($199) | shard-zip($199) | shard-tsdb($199) | slid-phi($199) | support-integration($199) | consulting($250) | sponsor($29) | donate($29.99) | gao-entry($1)",
|
|
73
79
|
},
|
|
74
80
|
email: { type: "string" },
|
|
75
81
|
note: { type: "string" },
|
|
@@ -82,14 +88,17 @@ const TOOLS = [
|
|
|
82
88
|
{
|
|
83
89
|
name: "spl_pps_x402_requirements",
|
|
84
90
|
description:
|
|
85
|
-
"Probe POST /api/x402-suite. Free under
|
|
91
|
+
"Probe POST /api/x402-suite. Free under 100 GB (no pay). Over free → 402 accepts[] for usage (~5¢/GB then 4¢ · min $0.05).",
|
|
86
92
|
inputSchema: {
|
|
87
93
|
type: "object",
|
|
88
94
|
properties: {
|
|
89
95
|
product: { type: "string" },
|
|
90
96
|
dataClass: { type: "string" },
|
|
91
97
|
op: { type: "string" },
|
|
92
|
-
bytes: {
|
|
98
|
+
bytes: {
|
|
99
|
+
type: "number",
|
|
100
|
+
description: "Payload bytes (≤100 GiB free; over free requires payment)",
|
|
101
|
+
},
|
|
93
102
|
email: { type: "string" },
|
|
94
103
|
note: { type: "string" },
|
|
95
104
|
},
|
|
@@ -98,7 +107,7 @@ const TOOLS = [
|
|
|
98
107
|
{
|
|
99
108
|
name: "spl_pps_x402_submit",
|
|
100
109
|
description:
|
|
101
|
-
"Submit freemium suite job via x402. Under
|
|
110
|
+
"Submit freemium suite job via x402. Under 100 GB free (no paymentHeader). Over free: pass paymentHeader after paying, or devBypass for staging.",
|
|
102
111
|
inputSchema: {
|
|
103
112
|
type: "object",
|
|
104
113
|
properties: {
|
|
@@ -109,7 +118,10 @@ const TOOLS = [
|
|
|
109
118
|
email: { type: "string" },
|
|
110
119
|
note: { type: "string" },
|
|
111
120
|
fileName: { type: "string" },
|
|
112
|
-
paymentHeader: {
|
|
121
|
+
paymentHeader: {
|
|
122
|
+
type: "string",
|
|
123
|
+
description: "Base64 X-PAYMENT proof (only if over free 100 GB cap)",
|
|
124
|
+
},
|
|
113
125
|
devBypass: { type: "boolean", description: "Staging only if server allows" },
|
|
114
126
|
},
|
|
115
127
|
},
|
|
@@ -117,7 +129,7 @@ const TOOLS = [
|
|
|
117
129
|
{
|
|
118
130
|
name: "spl_pps_quote",
|
|
119
131
|
description:
|
|
120
|
-
"Instant freemium quote: free first
|
|
132
|
+
"Instant freemium quote: free first 100 GB ($0), then ~5¢/GB (4¢ bulk) · min $0.05. Inputs: product, dataClass, op, bytes. Returns free flag + USD amount.",
|
|
121
133
|
inputSchema: {
|
|
122
134
|
type: "object",
|
|
123
135
|
properties: {
|
|
@@ -131,7 +143,10 @@ const TOOLS = [
|
|
|
131
143
|
"zeros | ramp | walk | mixed_ints | timeseries | json_series | binary | unknown",
|
|
132
144
|
},
|
|
133
145
|
op: { type: "string", description: "compress | decompress | roundtrip" },
|
|
134
|
-
bytes: {
|
|
146
|
+
bytes: {
|
|
147
|
+
type: "number",
|
|
148
|
+
description: "Payload size in bytes (≤100 GiB = free)",
|
|
149
|
+
},
|
|
135
150
|
remote: { type: "boolean", description: "If true, use live site API" },
|
|
136
151
|
},
|
|
137
152
|
},
|
|
@@ -139,7 +154,7 @@ const TOOLS = [
|
|
|
139
154
|
{
|
|
140
155
|
name: "spl_pps_checkout",
|
|
141
156
|
description:
|
|
142
|
-
"Checkout for suite quote. Under
|
|
157
|
+
"Checkout for suite quote. Under 100 GB returns free_showcase (no Stripe). Over free returns Stripe Checkout URL.",
|
|
143
158
|
inputSchema: {
|
|
144
159
|
type: "object",
|
|
145
160
|
properties: {
|
|
@@ -154,7 +169,7 @@ const TOOLS = [
|
|
|
154
169
|
{
|
|
155
170
|
name: "spl_pps_submit_job",
|
|
156
171
|
description:
|
|
157
|
-
"Submit a Pay Per Suite job (free under
|
|
172
|
+
"Submit a Pay Per Suite job (free under 100 GB after free_showcase, or after paid). Lab runs best tool and emails results. Requires email.",
|
|
158
173
|
inputSchema: {
|
|
159
174
|
type: "object",
|
|
160
175
|
properties: {
|
|
@@ -180,7 +195,10 @@ const TOOLS = [
|
|
|
180
195
|
inputSchema: {
|
|
181
196
|
type: "object",
|
|
182
197
|
properties: {
|
|
183
|
-
sample_base64: {
|
|
198
|
+
sample_base64: {
|
|
199
|
+
type: "string",
|
|
200
|
+
description: "Base64 of file head (≤8KB recommended)",
|
|
201
|
+
},
|
|
184
202
|
},
|
|
185
203
|
required: ["sample_base64"],
|
|
186
204
|
},
|
|
@@ -200,15 +218,23 @@ async function callTool(name, args = {}) {
|
|
|
200
218
|
return {
|
|
201
219
|
service: SERVICE_NAME,
|
|
202
220
|
site: SITE_PPS,
|
|
203
|
-
pricing: {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
221
|
+
pricing: { ...SUITE_PRICING, free_cap_bytes: FREE_BYTES, min_paid_cents: MIN_PAID_CENTS },
|
|
222
|
+
standing_skus_usd: {
|
|
223
|
+
"cddg-split": 199,
|
|
224
|
+
"zrw-n00b": 79,
|
|
225
|
+
"zrw-pro": 249,
|
|
226
|
+
"zrw-l33t": 699,
|
|
227
|
+
blackjack: 199,
|
|
228
|
+
"shard-zip": 199,
|
|
229
|
+
"shard-tsdb": 199,
|
|
230
|
+
"slid-phi": 199,
|
|
231
|
+
"support-integration": 199,
|
|
232
|
+
consulting: 250,
|
|
233
|
+
sponsor: 29,
|
|
234
|
+
donate: 29.99,
|
|
235
|
+
"gao-entry": 1,
|
|
211
236
|
},
|
|
237
|
+
catalog: X402_PRODUCTS_URL,
|
|
212
238
|
pay_human: STRIPE_PAYMENT_LINK,
|
|
213
239
|
pay_agent_products: X402_PRODUCTS_URL,
|
|
214
240
|
pay_agent_jobs: X402_SUITE_URL,
|
|
@@ -218,7 +244,10 @@ async function callTool(name, args = {}) {
|
|
|
218
244
|
ops: Object.keys(OP_MULT),
|
|
219
245
|
npm: "spl-pay-per-suite",
|
|
220
246
|
cli: "npx spl-pay-per-suite quote|pay|job|x402|catalog|buy",
|
|
221
|
-
discovery: "https://
|
|
247
|
+
discovery: "https://slidphilabs.fly.dev/api/agent",
|
|
248
|
+
pay_ui: "https://slidphilabs.fly.dev/pay",
|
|
249
|
+
canonical_doc: "docs/NPM_PRICING.md",
|
|
250
|
+
one_liner: SUITE_LINE,
|
|
222
251
|
};
|
|
223
252
|
case "spl_pps_x402_info":
|
|
224
253
|
return agentDiscovery();
|
package/src/quote.mjs
CHANGED
|
@@ -1,24 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* SPL Pay Per Suite — local quote (matches site
|
|
3
|
-
* Free first
|
|
4
|
-
*
|
|
2
|
+
* SPL Pay Per Suite — local quote (matches site).
|
|
3
|
+
* Free first 100 GiB (equal when competitor free-tier size is $0).
|
|
4
|
+
* Over free: under first paid egress (~$0.09/GB) at ~5¢/GB.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
export const
|
|
8
|
-
export const MAX_BYTES = 100 * 1024 * 1024 * 1024;
|
|
6
|
+
export const FREE_BYTES = 100 * 1024 * 1024 * 1024;
|
|
7
|
+
export const MAX_BYTES = 1024 * 1024 * 1024 * 1024;
|
|
9
8
|
export const MAX_CENTS = 1_000_000;
|
|
10
|
-
export const MIN_PAID_CENTS =
|
|
11
|
-
/** @deprecated free tier can be $0 */
|
|
9
|
+
export const MIN_PAID_CENTS = 5;
|
|
12
10
|
export const MIN_CENTS = 0;
|
|
13
11
|
|
|
12
|
+
/** Canonical suite rates — MCP, package.json, site, API must match */
|
|
13
|
+
export const SUITE_PRICING = {
|
|
14
|
+
model: "freemium_suite_v4_undercut",
|
|
15
|
+
free_cap_gb: 100,
|
|
16
|
+
free_cap_bytes: FREE_BYTES,
|
|
17
|
+
usd_per_gb_after_free: 0.05,
|
|
18
|
+
usd_per_gb_first_100: 0.05,
|
|
19
|
+
usd_per_gb_bulk: 0.04,
|
|
20
|
+
min_paid_usd: 0.05,
|
|
21
|
+
min_paid_cents: MIN_PAID_CENTS,
|
|
22
|
+
first_paid_egress_ref_usd: 0.09,
|
|
23
|
+
try_gate: "retired",
|
|
24
|
+
human_one_liner:
|
|
25
|
+
"Free first 100 GB per job · then ~5¢/GB (4¢ after 100 paid GB) · min $0.05 · under ~9¢ cloud egress",
|
|
26
|
+
};
|
|
27
|
+
|
|
14
28
|
export const PRODUCT_ADD_CENTS = {
|
|
15
|
-
auto: 0,
|
|
16
|
-
|
|
17
|
-
"cddg-split": 100,
|
|
18
|
-
blackjack: 0,
|
|
19
|
-
"shard-zip": 0,
|
|
20
|
-
"shard-tsdb": 0,
|
|
21
|
-
"slid-phi": 0,
|
|
29
|
+
auto: 0, zrw: 0, "cddg-split": 25, blackjack: 0,
|
|
30
|
+
"shard-zip": 0, "shard-tsdb": 0, "slid-phi": 0,
|
|
22
31
|
};
|
|
23
32
|
export const PRODUCT_BASE = PRODUCT_ADD_CENTS;
|
|
24
33
|
|
|
@@ -33,15 +42,17 @@ export const OP_MULT = {
|
|
|
33
42
|
export const STRIPE_PAYMENT_LINK =
|
|
34
43
|
process.env.SPL_PPS_PAYMENT_LINK ||
|
|
35
44
|
"https://buy.stripe.com/aFa00k4B70OYetL0O46wE0g";
|
|
36
|
-
export const SITE_PPS =
|
|
37
|
-
|
|
45
|
+
export const SITE_PPS =
|
|
46
|
+
process.env.SPL_PPS_SITE || "https://slidphilabs.fly.dev/pps";
|
|
47
|
+
export const API_BASE =
|
|
48
|
+
process.env.SPL_PPS_API || "https://slidphilabs.fly.dev";
|
|
38
49
|
|
|
39
50
|
export function usageFeeCents(billableBytes) {
|
|
40
51
|
const b = Math.max(0, Number(billableBytes) || 0);
|
|
41
52
|
if (b <= 0) return 0;
|
|
42
53
|
const gb = b / (1024 * 1024 * 1024);
|
|
43
|
-
if (gb <=
|
|
44
|
-
return Math.round(
|
|
54
|
+
if (gb <= 100) return Math.round(gb * 5);
|
|
55
|
+
return Math.round(100 * 5 + (gb - 100) * 4);
|
|
45
56
|
}
|
|
46
57
|
|
|
47
58
|
export function computeQuote({
|
|
@@ -58,62 +69,50 @@ export function computeQuote({
|
|
|
58
69
|
const billable = Math.max(0, b - free_bytes);
|
|
59
70
|
const free = billable <= 0;
|
|
60
71
|
const rates = {
|
|
61
|
-
free_cap_gb:
|
|
62
|
-
min_paid_usd:
|
|
63
|
-
|
|
64
|
-
|
|
72
|
+
free_cap_gb: 100,
|
|
73
|
+
min_paid_usd: 0.05,
|
|
74
|
+
usd_per_gb_first_100: 0.05,
|
|
75
|
+
usd_per_gb_after_100: 0.04,
|
|
76
|
+
first_paid_egress_ref: 0.09,
|
|
65
77
|
};
|
|
66
78
|
|
|
67
79
|
if (free) {
|
|
68
80
|
return {
|
|
69
|
-
ok: true,
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
amount_cents: 0,
|
|
73
|
-
amount_display: "0.00",
|
|
74
|
-
free: true,
|
|
75
|
-
tier: "free_showcase",
|
|
76
|
-
message: "Free showcase — first 1 GB $0. Over free: from $2 min · ~3¢/GB.",
|
|
81
|
+
ok: true, service: "SPL Pay Per Suite", currency: "usd",
|
|
82
|
+
amount_cents: 0, amount_display: "0.00", free: true, tier: "free_match",
|
|
83
|
+
message: "Free through 100 GB (equal when competitor free-tier size is $0).",
|
|
77
84
|
breakdown: {
|
|
78
85
|
product: prod, product_add_cents: 0, product_base_cents: 0,
|
|
79
|
-
free_bytes, free_gb:
|
|
86
|
+
free_bytes, free_gb: 100, billable_bytes: 0, usage_cents: 0, size_cents: 0,
|
|
80
87
|
data_class: cls, data_multiplier: DATA_MULT[cls],
|
|
81
88
|
op: operation, op_multiplier: OP_MULT[operation],
|
|
82
89
|
bytes: b, mb: +(b/1024/1024).toFixed(4), gb: +(b/1024/1024/1024).toFixed(6),
|
|
83
90
|
min_cents: 0, min_paid_cents: MIN_PAID_CENTS, max_cents: MAX_CENTS, rates,
|
|
84
91
|
},
|
|
85
|
-
pay_url: STRIPE_PAYMENT_LINK,
|
|
86
|
-
suite_url: SITE_PPS,
|
|
92
|
+
pay_url: STRIPE_PAYMENT_LINK, suite_url: SITE_PPS,
|
|
87
93
|
};
|
|
88
94
|
}
|
|
89
|
-
|
|
90
95
|
const usage = usageFeeCents(billable);
|
|
91
96
|
const add = PRODUCT_ADD_CENTS[prod] || 0;
|
|
92
97
|
const raw = Math.round((usage + add) * DATA_MULT[cls] * OP_MULT[operation]);
|
|
93
98
|
const cents = Math.min(MAX_CENTS, Math.max(MIN_PAID_CENTS, raw));
|
|
94
99
|
return {
|
|
95
|
-
ok: true,
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
amount_display: (cents / 100).toFixed(2),
|
|
100
|
-
free: false,
|
|
101
|
-
tier: "usage",
|
|
102
|
-
message: "Usage — free 1 GB, then from $2 min · ~3¢/GB (2¢ after 50 GB over free).",
|
|
100
|
+
ok: true, service: "SPL Pay Per Suite", currency: "usd",
|
|
101
|
+
amount_cents: cents, amount_display: (cents / 100).toFixed(2),
|
|
102
|
+
free: false, tier: "usage_undercut",
|
|
103
|
+
message: "Over free: ~5¢/GB (under first paid egress ~9¢/GB).",
|
|
103
104
|
breakdown: {
|
|
104
105
|
product: prod, product_add_cents: add, product_base_cents: add,
|
|
105
|
-
free_bytes, free_gb:
|
|
106
|
+
free_bytes, free_gb: 100, billable_bytes: billable, usage_cents: usage, size_cents: usage,
|
|
106
107
|
data_class: cls, data_multiplier: DATA_MULT[cls],
|
|
107
108
|
op: operation, op_multiplier: OP_MULT[operation],
|
|
108
109
|
bytes: b, mb: +(b/1024/1024).toFixed(4), gb: +(b/1024/1024/1024).toFixed(6),
|
|
109
110
|
min_cents: MIN_PAID_CENTS, min_paid_cents: MIN_PAID_CENTS, max_cents: MAX_CENTS, rates,
|
|
110
111
|
},
|
|
111
|
-
pay_url: STRIPE_PAYMENT_LINK,
|
|
112
|
-
suite_url: SITE_PPS,
|
|
112
|
+
pay_url: STRIPE_PAYMENT_LINK, suite_url: SITE_PPS,
|
|
113
113
|
};
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
-
|
|
117
116
|
export function classifyBytes(buf) {
|
|
118
117
|
if (!buf || !buf.length) return { dataClass: "unknown", tool: "auto", confidence: 0 };
|
|
119
118
|
const u8 = buf instanceof Uint8Array ? buf : new Uint8Array(buf);
|