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 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 (v2 freemium)
5
+ ## Pricing (canonical · matches live API)
6
6
 
7
7
  | Tier | Rule |
8
8
  |------|------|
9
- | **Free** | First **1 GiB per job** — $0 (showcase) |
10
- | **Usage** | Bytes over free: **~ $0.03/GB** (2¢/GB after 50 GB over free) |
11
- | **Min paid** | $2.00 once over free |
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
- License packages (CDDG:Split, ZRW tiers, etc.) remain separate fixed SKUs via catalog/x402.
16
+ ### Standing license SKUs (not suite metered)
16
17
 
17
- Live: [www.slidphilabs.com/pps](https://www.slidphilabs.com/pps) · Discovery: [GET /api/agent](https://www.slidphilabs.com/api/agent)
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: 100e6 });
33
- // → free: true, amount_cents: 0
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: 9e9 });
36
- // → free: false, ~$2.00 class
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",
4
- "description": "SPL Pay Per Suite freemium (free first 1 GB · then ~1.5¢/GB), Stripe + x402. Library, CLI, MCP. Try Gate retired.",
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://www.slidphilabs.com",
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://www.slidphilabs.com/api/agent"
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://www.slidphilabs.com/api/agent",
82
- "catalog": "https://www.slidphilabs.com/api/x402-products",
83
- "web_codec": "https://www.slidphilabs.com/api/web-codec",
84
- "site": "https://www.slidphilabs.com",
85
- "llms_txt": "https://www.slidphilabs.com/llms.txt",
86
- "agents_json": "https://www.slidphilabs.com/agents.json",
87
- "one_liner": "Free first 1 GB suite · then from $2 min · ~3¢/GB. GET https://www.slidphilabs.com/api/agent. Try Gate retired.",
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://www.slidphilabs.com/pps",
93
+ "suite": "https://slidphilabs.fly.dev/pps",
94
94
  "suite_pricing": {
95
- "free_cap_gb": 1,
96
- "min_paid_usd": 2,
97
- "usd_per_gb_after_free": 0.03,
98
- "usd_per_gb_bulk": 0.02,
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": "freemium_suite_v3_money"
101
+ "model": "freemium_suite_v4_undercut"
101
102
  },
102
- "welcome": "https://www.slidphilabs.com/api/welcome",
103
- "platform_json": "https://www.slidphilabs.com/platform.json"
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://www.slidphilabs.com/api/agent",
107
- "catalog": "https://www.slidphilabs.com/api/x402-products",
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";
@@ -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: freemium suite (free first 1 GB then ~3¢/GB · min $2), Stripe (humans) + x402 (agents), products, data classes, ops. Try Gate retired.",
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 1 GB), headers, flow. Stripe remains for humans.",
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, shards, support, etc.). No try-gate — use freemium suite for eval.",
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 1 GB (no pay). Over free → 402 accepts[] for usage pricing (~3¢/GB · min $2).",
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: { type: "number", description: "≤1GiB free; over free requires payment" },
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 1 GB free (no paymentHeader). Over free: pass paymentHeader after paying, or devBypass for staging.",
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: { type: "string", description: "Base64 X-PAYMENT proof (only if over free cap)" },
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 1 GB ($0), then ~3¢/GB · min $2. Inputs: product, dataClass, op, bytes. Returns free flag + USD amount.",
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: { type: "number", description: "Payload size in bytes (≤1GiB = free)" },
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 1 GB returns free_showcase (no Stripe). Over free returns Stripe Checkout URL.",
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 1 GB after free_showcase, or after paid). Lab runs best tool and emails results. Requires email.",
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: { type: "string", description: "Base64 of file head (≤8KB recommended)" },
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
- model: "freemium_suite_v2",
205
- free_cap_bytes: FREE_BYTES,
206
- free_cap_gb: 1,
207
- usd_per_gb_after_free: 0.03,
208
- usd_per_gb_bulk: 0.02,
209
- min_paid_cents: MIN_PAID_CENTS,
210
- try_gate: "retired",
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://www.slidphilabs.com/api/agent",
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 freemium money model).
3
- * Free first 1 GiB · over free: min $2 · ~3¢/GB (2¢ after 50 GB over free).
4
- * Try Gate retired.
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 FREE_BYTES = 1 * 1024 * 1024 * 1024;
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 = 200; // $2.00
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
- zrw: 0,
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 = process.env.SPL_PPS_SITE || "https://www.slidphilabs.com/pps";
37
- export const API_BASE = process.env.SPL_PPS_API || "https://www.slidphilabs.com";
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 <= 50) return Math.round(gb * 3);
44
- return Math.round(50 * 3 + (gb - 50) * 2);
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: 1,
62
- min_paid_usd: 2.0,
63
- usd_per_gb_first_50: 0.03,
64
- usd_per_gb_after_50: 0.02,
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
- service: "SPL Pay Per Suite",
71
- currency: "usd",
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: 1, billable_bytes: 0, usage_cents: 0, size_cents: 0,
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
- service: "SPL Pay Per Suite",
97
- currency: "usd",
98
- amount_cents: cents,
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: 1, billable_bytes: billable, usage_cents: usage, size_cents: usage,
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);