@oxygen-agent/cli 1.1010.721 → 1.1010.905

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.
Files changed (100) hide show
  1. package/README.md +1 -1
  2. package/dist/auto-update.d.ts +129 -0
  3. package/dist/auto-update.js +392 -0
  4. package/dist/command-manifest.js +14 -0
  5. package/dist/credentials.d.ts +2 -0
  6. package/dist/credentials.js +6 -3
  7. package/dist/functions-commands.js +1 -1
  8. package/dist/http-client.js +28 -4
  9. package/dist/index.js +583 -145
  10. package/dist/run-wait.d.ts +3 -1
  11. package/dist/run-wait.js +19 -5
  12. package/dist/streamed-file-import.d.ts +58 -0
  13. package/dist/streamed-file-import.js +115 -0
  14. package/dist/update.d.ts +29 -0
  15. package/dist/update.js +62 -16
  16. package/dist/workflow-plan-limit-notices.d.ts +8 -0
  17. package/dist/workflow-plan-limit-notices.js +28 -0
  18. package/node_modules/@oxygen/cli-ugc/dist/commands.js +3 -3
  19. package/node_modules/@oxygen/shared/dist/billing-anchors.d.ts +17 -0
  20. package/node_modules/@oxygen/shared/dist/billing-anchors.js +27 -0
  21. package/node_modules/@oxygen/shared/dist/billing.d.ts +191 -35
  22. package/node_modules/@oxygen/shared/dist/billing.js +333 -42
  23. package/node_modules/@oxygen/shared/dist/capability-discovery.js +55 -5
  24. package/node_modules/@oxygen/shared/dist/copilot-skills.generated.d.ts +2 -2
  25. package/node_modules/@oxygen/shared/dist/copilot-skills.generated.js +2 -2
  26. package/node_modules/@oxygen/shared/dist/cost-estimate-view.d.ts +50 -0
  27. package/node_modules/@oxygen/shared/dist/cost-estimate-view.js +90 -0
  28. package/node_modules/@oxygen/shared/dist/cost-estimate.d.ts +167 -0
  29. package/node_modules/@oxygen/shared/dist/cost-estimate.js +361 -0
  30. package/node_modules/@oxygen/shared/dist/credit-gate.d.ts +26 -0
  31. package/node_modules/@oxygen/shared/dist/credit-gate.js +65 -0
  32. package/node_modules/@oxygen/shared/dist/email-deliverability-policy.d.ts +51 -0
  33. package/node_modules/@oxygen/shared/dist/email-deliverability-policy.js +101 -0
  34. package/node_modules/@oxygen/shared/dist/email-hard-bounce.d.ts +3 -1
  35. package/node_modules/@oxygen/shared/dist/email-hard-bounce.js +3 -3
  36. package/node_modules/@oxygen/shared/dist/error-redaction.d.ts +1 -1
  37. package/node_modules/@oxygen/shared/dist/error-redaction.js +1 -1
  38. package/node_modules/@oxygen/shared/dist/feature-gates.d.ts +4 -0
  39. package/node_modules/@oxygen/shared/dist/feature-gates.js +5 -0
  40. package/node_modules/@oxygen/shared/dist/file-import.d.ts +13 -1
  41. package/node_modules/@oxygen/shared/dist/file-import.js +33 -6
  42. package/node_modules/@oxygen/shared/dist/hosted-ai.d.ts +73 -3
  43. package/node_modules/@oxygen/shared/dist/hosted-ai.js +246 -24
  44. package/node_modules/@oxygen/shared/dist/import-limits.d.ts +25 -1
  45. package/node_modules/@oxygen/shared/dist/import-limits.js +35 -2
  46. package/node_modules/@oxygen/shared/dist/index.d.ts +2 -22
  47. package/node_modules/@oxygen/shared/dist/index.js +2 -42
  48. package/node_modules/@oxygen/shared/dist/object-storage.d.ts +9 -0
  49. package/node_modules/@oxygen/shared/dist/object-storage.js +17 -0
  50. package/node_modules/@oxygen/shared/dist/operational-telemetry.d.ts +41 -0
  51. package/node_modules/@oxygen/shared/dist/operational-telemetry.js +55 -0
  52. package/node_modules/@oxygen/shared/dist/plan-band.d.ts +117 -1
  53. package/node_modules/@oxygen/shared/dist/plan-band.js +175 -10
  54. package/node_modules/@oxygen/shared/dist/plan-capabilities.d.ts +77 -7
  55. package/node_modules/@oxygen/shared/dist/plan-capabilities.js +87 -7
  56. package/node_modules/@oxygen/shared/dist/plan-limits-view.d.ts +219 -0
  57. package/node_modules/@oxygen/shared/dist/plan-limits-view.js +330 -0
  58. package/node_modules/@oxygen/shared/dist/plan-limits.d.ts +204 -6
  59. package/node_modules/@oxygen/shared/dist/plan-limits.js +197 -15
  60. package/node_modules/@oxygen/shared/dist/pricing-sheet.d.ts +80 -36
  61. package/node_modules/@oxygen/shared/dist/pricing-sheet.js +80 -31
  62. package/node_modules/@oxygen/shared/dist/pricing-snapshot.generated.d.ts +38 -20
  63. package/node_modules/@oxygen/shared/dist/pricing-snapshot.generated.js +47 -34
  64. package/node_modules/@oxygen/shared/dist/provider-http-error.d.ts +10 -0
  65. package/node_modules/@oxygen/shared/dist/provider-http-error.js +27 -0
  66. package/node_modules/@oxygen/shared/dist/repricing.d.ts +127 -0
  67. package/node_modules/@oxygen/shared/dist/repricing.js +407 -6
  68. package/node_modules/@oxygen/shared/dist/semver.d.ts +21 -0
  69. package/node_modules/@oxygen/shared/dist/semver.js +41 -0
  70. package/node_modules/@oxygen/shared/dist/sending-limits.d.ts +5 -7
  71. package/node_modules/@oxygen/shared/dist/sending-limits.js +10 -16
  72. package/node_modules/@oxygen/shared/dist/sending-seats.d.ts +18 -15
  73. package/node_modules/@oxygen/shared/dist/sending-seats.js +22 -17
  74. package/node_modules/@oxygen/shared/dist/spend-safety.d.ts +57 -8
  75. package/node_modules/@oxygen/shared/dist/spend-safety.js +64 -11
  76. package/node_modules/@oxygen/shared/dist/stripe-price-catalog.d.ts +15 -7
  77. package/node_modules/@oxygen/shared/dist/stripe-price-catalog.js +18 -5
  78. package/node_modules/@oxygen/shared/dist/table-capacity.d.ts +34 -5
  79. package/node_modules/@oxygen/shared/dist/table-capacity.js +25 -8
  80. package/node_modules/@oxygen/shared/dist/telemetry-export-observer.d.ts +6 -0
  81. package/node_modules/@oxygen/shared/dist/telemetry-export-observer.js +13 -5
  82. package/node_modules/@oxygen/shared/dist/telemetry-resource.d.ts +40 -0
  83. package/node_modules/@oxygen/shared/dist/telemetry-resource.js +35 -0
  84. package/node_modules/@oxygen/shared/dist/telemetry.js +5 -0
  85. package/node_modules/@oxygen/shared/dist/ugc.d.ts +15 -0
  86. package/node_modules/@oxygen/shared/dist/ugc.js +29 -0
  87. package/node_modules/@oxygen/shared/dist/version.d.ts +1 -3
  88. package/node_modules/@oxygen/shared/dist/version.generated.d.ts +1 -1
  89. package/node_modules/@oxygen/shared/dist/version.generated.js +1 -1
  90. package/node_modules/@oxygen/shared/dist/version.js +14 -27
  91. package/node_modules/@oxygen/shared/dist/workspace-file-storage.d.ts +5 -0
  92. package/node_modules/@oxygen/shared/dist/workspace-file-storage.js +5 -0
  93. package/node_modules/@oxygen/workflows/dist/graph/manifest-schema.d.ts +3 -3
  94. package/node_modules/@oxygen/workflows/dist/graph/types.d.ts +15 -1
  95. package/node_modules/@oxygen/workflows/dist/graph/types.js +15 -1
  96. package/node_modules/@oxygen/workflows/dist/index.d.ts +45 -0
  97. package/node_modules/@oxygen/workflows/dist/index.js +152 -2
  98. package/node_modules/@oxygen/workflows/dist/usage-estimate.d.ts +10 -1
  99. package/node_modules/@oxygen/workflows/dist/usage-estimate.js +33 -29
  100. package/package.json +1 -1
@@ -34,22 +34,42 @@
34
34
  * loadPricingBook() instead of importing this file, so a staff re-price at
35
35
  * /admin/costs takes effect without a deploy.
36
36
  */
37
+ import { type RepricingOptions } from "./repricing.js";
37
38
  export { creditsToUsd, usdToCredits } from "./pricing-snapshot.generated.js";
38
39
  export declare const PRICING_SHEET_VERIFIED = "2026-07";
39
40
  export declare const PRICING_CREDITS_PER_USD = 100;
40
- /** On-demand top-up price per 100 credits (USD); subscriptions pay $1.00. */
41
- export declare const TOPUP_USD_PER_100 = 1.25;
41
+ /**
42
+ * On-demand top-up price per 100 credits (USD) right now; subscriptions pay
43
+ * $1.00. It rises $1.25 → $1.30 at the 2026-09 repricing's instant (S10), so a
44
+ * page resolves it on the server and passes the number to client components,
45
+ * which cannot read the switch. Same value as `creditTopupUsdCentsPer100() / 100`
46
+ * from `@oxygen/shared/billing`.
47
+ */
48
+ export declare function topupUsdPer100(options?: RepricingOptions): number;
49
+ /**
50
+ * How marketing copy quotes the top-up rate per 100 credits: `inForce` is the
51
+ * rate charged now ("$1.25"); `scheduled` names the rate and date it moves to
52
+ * ("$1.30 from October 27, 2026") only while the repricing date is set and still
53
+ * ahead, so nothing is announced before an operator sets it.
54
+ */
55
+ export declare function topupRateCopy(options?: RepricingOptions): {
56
+ inForce: string;
57
+ scheduled: string | null;
58
+ };
42
59
  export declare const SENDING_SEAT_USD_CENTS: {
43
60
  readonly linkedin: 3000;
44
61
  readonly whatsapp: 3000;
45
62
  readonly phone_number: 1000;
46
63
  readonly email_sender: 100;
47
64
  };
48
- export declare const MANAGED_INBOX_USD_CENTS = 400;
49
- export declare const SENDING_DOMAIN_USD_CENTS = 1250;
50
65
  export declare const SUBSCRIPTION_USD_PER_100 = 1;
51
66
  /**
52
- * AI column runs, honest 5× of modeled tier COGS.
67
+ * AI column runs per tier (Fast / Balanced / Max), re-priced 2026-09-26 with the
68
+ * model refresh (Philipp: Clay-level quality, 30-50% under Clay, >= 5x markup,
69
+ * Max excepted). Calibrated production mean COGS per row is $0.0013 / $0.0079 /
70
+ * $0.098, so the markups are ~11x / ~5.1x / ~2.5x; Max at 2.5x is an explicit
71
+ * founder exception ("gpt-6 sol @ 2.5x markup"). Evidence and method:
72
+ * packages/shared/src/hosted-ai.ts.
53
73
  *
54
74
  * RESOLVER-DERIVED, not seed-derived: the canonical values live in
55
75
  * packages/integrations/src/cogs-rates.ts and are served per-workspace from
@@ -59,7 +79,7 @@ export declare const SUBSCRIPTION_USD_PER_100 = 1;
59
79
  */
60
80
  export declare const AI_COLUMN_CREDITS: {
61
81
  readonly low: 1.5;
62
- readonly medium: 7.5;
82
+ readonly medium: 4;
63
83
  readonly high: 25;
64
84
  };
65
85
  /**
@@ -103,6 +123,15 @@ export declare const AI_COLUMN_WEB_SEARCH_RESERVED_CREDITS = 4.6;
103
123
  * ~$0.01 of action per row; OXYGEN credits are $0.01. Every figure must also keep
104
124
  * >= 5x over the loop's modelled COGS. Pinned against the live estimator by
105
125
  * @oxygen/integrations pricing-sheet-conformance.test.ts.
126
+ *
127
+ * Per-turn cost basis after the 2026-09-26 model refresh (UNMEASURED for the
128
+ * loop -- measure on dev via Langfuse after deploy). One calibrated single call
129
+ * costs $0.0013 on Fast (gpt-6-luna) and $0.0079 on Balanced (deepseek-v4.1-flash,
130
+ * reasoning off); a loop turn re-sends its growing evidence, so it costs at
131
+ * least that. At 5x the standard leg (4.3 cr = $0.043) covers ~$0.0086 of model
132
+ * spend, about 6.6 Fast single-call equivalents; the deep leg (7.6 cr = $0.076)
133
+ * covers ~$0.0152, about 1.9 Balanced single-call equivalents. Deep is the one
134
+ * likely under 5x once a loop runs more than two turns.
106
135
  */
107
136
  export declare const RESEARCH_DEPTH_MODEL_CREDITS: {
108
137
  readonly standard: 4.3;
@@ -130,7 +159,7 @@ export declare const RESEARCH_DEPTH_GROUNDING_CREDITS: {
130
159
  };
131
160
  readonly deep: {
132
161
  readonly typical: 2.4;
133
- readonly reserved: 19.8;
162
+ readonly reserved: 17.4;
134
163
  };
135
164
  };
136
165
  /** Typical per-row totals at each depth's default tier (founder-ratified 2026-09-26). */
@@ -139,40 +168,49 @@ export declare const RESEARCH_DEPTH_TYPICAL_ROW_CREDITS: {
139
168
  readonly standard: 5.5;
140
169
  readonly deep: 10;
141
170
  };
142
- /** Workflow/automation actions (steps, tool calls, row writes) — capacity guard. */
143
- export declare const AUTOMATION_ACTION_CREDITS = 0.001;
144
171
  /**
145
- * Managed email inboxes: founder-ratified flat price (2026-07-25), superseding
146
- * the earlier dynamic vendor-COGS × 1.25 range. Kept as an object (min/typical/max
147
- * all equal) rather than a bare number so existing callers that destructure any
148
- * of the three fields need no shape change.
172
+ * Workflow steps are priced through the 2026-09 repricing switch, so this sheet
173
+ * carries no flat number for them: the price in force is
174
+ * `automationStepCredits()` (`@oxygen/shared/billing`), resolved on the server.
175
+ * The definition is re-exported for surfaces that show what the step costs
176
+ * before and after the switch. Row writes inside a run are free.
177
+ */
178
+ export { AUTOMATION_STEP_CREDITS_REPRICING } from "./repricing.js";
179
+ /**
180
+ * The flat mailbox line of a managed Google inbox after the 2026-09 repricing
181
+ * (400, decision 3.1, slice S32). Its 100-credit mailbox connection, warm-up
182
+ * included, bills beside it: 500 all-in. The all-in price waits for the S07
183
+ * switch, so a surface that quotes it uses `managedInboxAllInCredits()` from
184
+ * `@oxygen/shared/repricing`, resolved on the server. Kept as an object
185
+ * (min/typical/max all equal) so callers that destructure any field need no
186
+ * shape change.
149
187
  */
150
- export declare const MANAGED_INBOX_MARKUP = 1.25;
151
188
  export declare const MANAGED_INBOX_CREDITS_PER_MONTH: {
152
- readonly min: 300;
153
- readonly typical: 300;
154
- readonly max: 300;
189
+ readonly min: 400;
190
+ readonly typical: 400;
191
+ readonly max: 400;
155
192
  };
156
193
  /**
157
- * VOICE (the call channel). Marked up 5×, not the 1.25× infra rule the inbox and
158
- * domain rails use: a phone number carries ongoing reputation work (warm-up,
159
- * rotation, cap enforcement, health) that a mailbox rail does not, and the
160
- * per-minute rate is small enough that a 1.25× markup would not cover it.
194
+ * VOICE (the call channel). One price per connected minute, 5 credits ($0.05),
195
+ * with answering-machine detection folded in (repricing 2026-09, decision 7.3;
196
+ * it was 9 a minute plus 3.8 per connected call). A call nobody answered is free.
161
197
  *
162
- * A browser-softphone call bills TWO Twilio legs, which is easy to miss:
198
+ * A browser-softphone call bills TWO Twilio legs, which is easy to miss when
199
+ * checking the margin:
163
200
  * browser/app (the rep's WebRTC leg) $0.0040 / min
164
201
  * outbound to a US local/mobile $0.0140 / min
165
202
  * ─────────────
166
- * $0.0180 / min
167
- * Costing only the outbound leg undercharges every call by 29%.
203
+ * $0.0180 / min → 5 credits is ~2.8×
204
+ * Costing only the outbound leg understates the cost of every call by 29%.
168
205
  */
169
- export declare const VOICE_MARKUP = 5;
170
206
  export declare const VOICE_NUMBER_CREDITS_PER_MONTH = 1000;
171
- export declare const VOICE_CREDITS_PER_MINUTE = 9;
172
- export declare const VOICE_CREDITS_PER_AMD_CALL = 3.8;
173
- /** Managed domains: registrar at-cost × 1.25 (≈ a $10.44 .com → ~13,050 credits/yr). */
174
- export declare const MANAGED_DOMAIN_MARKUP = 1.25;
175
- export declare const MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL = 1305;
207
+ export declare const VOICE_CREDITS_PER_MINUTE = 5;
208
+ /**
209
+ * Sending domain bought through OXYGEN: InboxKit's cost passed through at 1.0x, a year at
210
+ * a time, renewed yearly at the vendor's renewal cost (repricing 2026-09, decision 3.3).
211
+ * Representative: a .com is 1,250 credits a year; the charge is the exact domain's price.
212
+ */
213
+ export declare const SENDING_DOMAIN_CREDITS_PER_YEAR_TYPICAL = 1250;
176
214
  /**
177
215
  * Inbox deliverability (EmailGuard placement seat). A flat monthly price per
178
216
  * SUBSCRIBED inbox covering continuous deliverability monitoring (blacklist,
@@ -182,14 +220,20 @@ export declare const MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL = 1305;
182
220
  *
183
221
  * THE ALLOWANCE IS LOAD-BEARING, not a perk. Placement COGS is per TEST
184
222
  * ($0.1327 on EmailGuard's Agency plan), not per inbox, so an unbounded seat
185
- * inverts its own margin: at $1.00/inbox-month the EIGHTH test in a cycle is
186
- * already sold at a loss. Two included tests cost $0.265 against $1.00 of
187
- * revenue — a ~73% margin — and everything past them bills
223
+ * inverts its own margin: at $1.00/inbox-month the EIGHTH test in a cycle was
224
+ * already sold at a loss. Two included tests cost $0.265 against $1.35 of
225
+ * revenue at the 2026-09 price, and everything past them bills
188
226
  * PLACEMENT_TEST_OVERAGE_CREDITS. Orgs on their own EmailGuard key (BYOK) pay 0.
227
+ *
228
+ * These two prices are the RATIFIED list prices from the 2026-09 repricing
229
+ * (135 and 66, slice S30). The rises wait for the S07 effective-date switch, so
230
+ * a surface that quotes or bills uses `deliverabilitySeatCredits()` and
231
+ * `placementTestCredits()` from `@oxygen/shared/repricing` (100 and 16.6 until
232
+ * the switch's instant), never these constants.
189
233
  */
190
- export declare const DELIVERABILITY_SEAT_CREDITS_PER_MONTH = 100;
234
+ export declare const DELIVERABILITY_SEAT_CREDITS_PER_MONTH = 135;
191
235
  export declare const DELIVERABILITY_INCLUDED_TESTS_PER_INBOX = 2;
192
- export declare const PLACEMENT_TEST_OVERAGE_CREDITS = 16.6;
236
+ export declare const PLACEMENT_TEST_OVERAGE_CREDITS = 66;
193
237
  /**
194
238
  * LinkedIn accounts: founder decision (2026-07-25) — a PURE seat model. The
195
239
  * flat monthly connection fee per connected account is the WHOLE LinkedIn
@@ -247,7 +291,7 @@ export declare const ENRICHMENT_CREDITS: {
247
291
  readonly phone_find_typical: 99;
248
292
  readonly company_enrich_typical: 9.9;
249
293
  readonly web_search: 0.5;
250
- readonly page_scrape: 4;
294
+ readonly page_scrape: 1.6;
251
295
  readonly linkedin_profile_scrape: 1;
252
296
  };
253
297
  /** Editable calculator default: blended credits per fully-enriched row. */
@@ -34,21 +34,46 @@
34
34
  * loadPricingBook() instead of importing this file, so a staff re-price at
35
35
  * /admin/costs takes effect without a deploy.
36
36
  */
37
- import { AUTOMATION_ACTION_CREDITS as SNAPSHOT_AUTOMATION_ACTION_CREDITS, CREDITS_PER_USD as SNAPSHOT_CREDITS_PER_USD, DELIVERABILITY_INCLUDED_TESTS_PER_INBOX as SNAPSHOT_DELIVERABILITY_INCLUDED_TESTS_PER_INBOX, DELIVERABILITY_SEAT_CREDITS_PER_MONTH as SNAPSHOT_DELIVERABILITY_SEAT_CREDITS_PER_MONTH, EGRESS_IP_CREDITS_PER_MONTH as SNAPSHOT_EGRESS_IP_CREDITS_PER_MONTH, MANAGED_INBOX_USD_CENTS as SNAPSHOT_MANAGED_INBOX_USD_CENTS, SENDING_DOMAIN_USD_CENTS as SNAPSHOT_SENDING_DOMAIN_USD_CENTS, SENDING_SEAT_USD_CENTS as SNAPSHOT_SENDING_SEAT_USD_CENTS, ENRICHMENT_CREDITS_PER_ROW_TYPICAL as SNAPSHOT_ENRICHMENT_CREDITS_PER_ROW_TYPICAL, LINKEDIN_ACCOUNT_CREDITS_PER_MONTH as SNAPSHOT_LINKEDIN_ACCOUNT_CREDITS_PER_MONTH, LINKEDIN_ACTION_CREDITS as SNAPSHOT_LINKEDIN_ACTION_CREDITS, LINKEDIN_TYPICAL_ACTIONS_CREDITS_PER_MONTH as SNAPSHOT_LINKEDIN_TYPICAL_ACTIONS_CREDITS_PER_MONTH, MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL as SNAPSHOT_MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL, MANAGED_DOMAIN_MARKUP as SNAPSHOT_MANAGED_DOMAIN_MARKUP, MANAGED_INBOX_CREDITS_PER_MONTH as SNAPSHOT_MANAGED_INBOX_CREDITS_PER_MONTH, MANAGED_INBOX_MARKUP as SNAPSHOT_MANAGED_INBOX_MARKUP, PLACEMENT_TEST_OVERAGE_CREDITS as SNAPSHOT_PLACEMENT_TEST_OVERAGE_CREDITS, PRICE_SHEET_VERIFIED as SNAPSHOT_PRICE_SHEET_VERIFIED, SEND_CREDITS as SNAPSHOT_SEND_CREDITS, SUBSCRIPTION_USD_PER_100 as SNAPSHOT_SUBSCRIPTION_USD_PER_100, TOPUP_USD_PER_100 as SNAPSHOT_TOPUP_USD_PER_100, VOICE_CREDITS_PER_AMD_CALL as SNAPSHOT_VOICE_CREDITS_PER_AMD_CALL, VOICE_CREDITS_PER_MINUTE as SNAPSHOT_VOICE_CREDITS_PER_MINUTE, VOICE_MARKUP as SNAPSHOT_VOICE_MARKUP, VOICE_NUMBER_CREDITS_PER_MONTH as SNAPSHOT_VOICE_NUMBER_CREDITS_PER_MONTH, WHATSAPP_ACCOUNT_CREDITS_PER_MONTH as SNAPSHOT_WHATSAPP_ACCOUNT_CREDITS_PER_MONTH, X_ACCOUNT_CREDITS_PER_MONTH as SNAPSHOT_X_ACCOUNT_CREDITS_PER_MONTH, } from "./pricing-snapshot.generated.js";
37
+ import { CREDITS_PER_USD as SNAPSHOT_CREDITS_PER_USD, DELIVERABILITY_INCLUDED_TESTS_PER_INBOX as SNAPSHOT_DELIVERABILITY_INCLUDED_TESTS_PER_INBOX, DELIVERABILITY_SEAT_CREDITS_PER_MONTH as SNAPSHOT_DELIVERABILITY_SEAT_CREDITS_PER_MONTH, EGRESS_IP_CREDITS_PER_MONTH as SNAPSHOT_EGRESS_IP_CREDITS_PER_MONTH, SENDING_SEAT_USD_CENTS as SNAPSHOT_SENDING_SEAT_USD_CENTS, ENRICHMENT_CREDITS_PER_ROW_TYPICAL as SNAPSHOT_ENRICHMENT_CREDITS_PER_ROW_TYPICAL, LINKEDIN_ACCOUNT_CREDITS_PER_MONTH as SNAPSHOT_LINKEDIN_ACCOUNT_CREDITS_PER_MONTH, LINKEDIN_ACTION_CREDITS as SNAPSHOT_LINKEDIN_ACTION_CREDITS, LINKEDIN_TYPICAL_ACTIONS_CREDITS_PER_MONTH as SNAPSHOT_LINKEDIN_TYPICAL_ACTIONS_CREDITS_PER_MONTH, MANAGED_INBOX_CREDITS_PER_MONTH as SNAPSHOT_MANAGED_INBOX_CREDITS_PER_MONTH, PLACEMENT_TEST_OVERAGE_CREDITS as SNAPSHOT_PLACEMENT_TEST_OVERAGE_CREDITS, PRICE_SHEET_VERIFIED as SNAPSHOT_PRICE_SHEET_VERIFIED, SEND_CREDITS as SNAPSHOT_SEND_CREDITS, SENDING_DOMAIN_CREDITS_PER_YEAR_TYPICAL as SNAPSHOT_SENDING_DOMAIN_CREDITS_PER_YEAR_TYPICAL, SUBSCRIPTION_USD_PER_100 as SNAPSHOT_SUBSCRIPTION_USD_PER_100, VOICE_CREDITS_PER_MINUTE as SNAPSHOT_VOICE_CREDITS_PER_MINUTE, VOICE_NUMBER_CREDITS_PER_MONTH as SNAPSHOT_VOICE_NUMBER_CREDITS_PER_MONTH, WHATSAPP_ACCOUNT_CREDITS_PER_MONTH as SNAPSHOT_WHATSAPP_ACCOUNT_CREDITS_PER_MONTH, X_ACCOUNT_CREDITS_PER_MONTH as SNAPSHOT_X_ACCOUNT_CREDITS_PER_MONTH, } from "./pricing-snapshot.generated.js";
38
+ import { formatRepricingDate, repricedValue, scheduledRepricedValue, TOPUP_RATE_REPRICING, } from "./repricing.js";
38
39
  export { creditsToUsd, usdToCredits } from "./pricing-snapshot.generated.js";
39
40
  export const PRICING_SHEET_VERIFIED = SNAPSHOT_PRICE_SHEET_VERIFIED;
40
41
  export const PRICING_CREDITS_PER_USD = SNAPSHOT_CREDITS_PER_USD;
41
- /** On-demand top-up price per 100 credits (USD); subscriptions pay $1.00. */
42
- export const TOPUP_USD_PER_100 = SNAPSHOT_TOPUP_USD_PER_100;
42
+ /**
43
+ * On-demand top-up price per 100 credits (USD) right now; subscriptions pay
44
+ * $1.00. It rises $1.25 → $1.30 at the 2026-09 repricing's instant (S10), so a
45
+ * page resolves it on the server and passes the number to client components,
46
+ * which cannot read the switch. Same value as `creditTopupUsdCentsPer100() / 100`
47
+ * from `@oxygen/shared/billing`.
48
+ */
49
+ export function topupUsdPer100(options = {}) {
50
+ return repricedValue(TOPUP_RATE_REPRICING, options) / 100;
51
+ }
52
+ /**
53
+ * How marketing copy quotes the top-up rate per 100 credits: `inForce` is the
54
+ * rate charged now ("$1.25"); `scheduled` names the rate and date it moves to
55
+ * ("$1.30 from October 27, 2026") only while the repricing date is set and still
56
+ * ahead, so nothing is announced before an operator sets it.
57
+ */
58
+ export function topupRateCopy(options = {}) {
59
+ const next = scheduledRepricedValue(TOPUP_RATE_REPRICING, options);
60
+ return {
61
+ inForce: `$${topupUsdPer100(options).toFixed(2)}`,
62
+ scheduled: next ? `$${(next.value / 100).toFixed(2)} from ${formatRepricingDate(next.effectiveAt)}` : null,
63
+ };
64
+ }
43
65
  // Dollar-priced CAPACITY, re-exported on the client-safe subpath so the pricing
44
66
  // calculator and the marketing sections quote the same numbers the product
45
67
  // charges. These are not credits and must never be converted as if they were.
46
68
  export const SENDING_SEAT_USD_CENTS = SNAPSHOT_SENDING_SEAT_USD_CENTS;
47
- export const MANAGED_INBOX_USD_CENTS = SNAPSHOT_MANAGED_INBOX_USD_CENTS;
48
- export const SENDING_DOMAIN_USD_CENTS = SNAPSHOT_SENDING_DOMAIN_USD_CENTS;
49
69
  export const SUBSCRIPTION_USD_PER_100 = SNAPSHOT_SUBSCRIPTION_USD_PER_100;
50
70
  /**
51
- * AI column runs, honest 5× of modeled tier COGS.
71
+ * AI column runs per tier (Fast / Balanced / Max), re-priced 2026-09-26 with the
72
+ * model refresh (Philipp: Clay-level quality, 30-50% under Clay, >= 5x markup,
73
+ * Max excepted). Calibrated production mean COGS per row is $0.0013 / $0.0079 /
74
+ * $0.098, so the markups are ~11x / ~5.1x / ~2.5x; Max at 2.5x is an explicit
75
+ * founder exception ("gpt-6 sol @ 2.5x markup"). Evidence and method:
76
+ * packages/shared/src/hosted-ai.ts.
52
77
  *
53
78
  * RESOLVER-DERIVED, not seed-derived: the canonical values live in
54
79
  * packages/integrations/src/cogs-rates.ts and are served per-workspace from
@@ -56,7 +81,7 @@ export const SUBSCRIPTION_USD_PER_100 = SNAPSHOT_SUBSCRIPTION_USD_PER_100;
56
81
  * against the live estimator, so a tier re-price fails a test rather than
57
82
  * quietly mispricing the page.
58
83
  */
59
- export const AI_COLUMN_CREDITS = { low: 1.5, medium: 7.5, high: 25 };
84
+ export const AI_COLUMN_CREDITS = { low: 1.5, medium: 4, high: 25 };
60
85
  /**
61
86
  * Web-search grounding, billed per PROVIDER CALL on top of the model — not a flat
62
87
  * adder.
@@ -98,6 +123,15 @@ export const AI_COLUMN_WEB_SEARCH_RESERVED_CREDITS = 4.6;
98
123
  * ~$0.01 of action per row; OXYGEN credits are $0.01. Every figure must also keep
99
124
  * >= 5x over the loop's modelled COGS. Pinned against the live estimator by
100
125
  * @oxygen/integrations pricing-sheet-conformance.test.ts.
126
+ *
127
+ * Per-turn cost basis after the 2026-09-26 model refresh (UNMEASURED for the
128
+ * loop -- measure on dev via Langfuse after deploy). One calibrated single call
129
+ * costs $0.0013 on Fast (gpt-6-luna) and $0.0079 on Balanced (deepseek-v4.1-flash,
130
+ * reasoning off); a loop turn re-sends its growing evidence, so it costs at
131
+ * least that. At 5x the standard leg (4.3 cr = $0.043) covers ~$0.0086 of model
132
+ * spend, about 6.6 Fast single-call equivalents; the deep leg (7.6 cr = $0.076)
133
+ * covers ~$0.0152, about 1.9 Balanced single-call equivalents. Deep is the one
134
+ * likely under 5x once a loop runs more than two turns.
101
135
  */
102
136
  export const RESEARCH_DEPTH_MODEL_CREDITS = { standard: 4.3, deep: 7.6 };
103
137
  /** The tier whose model each loop depth runs on, whatever tier the column stores. */
@@ -114,44 +148,53 @@ export const RESEARCH_DEPTH_MODEL_TIER = { standard: "low", deep: "medium" };
114
148
  */
115
149
  export const RESEARCH_DEPTH_GROUNDING_CREDITS = {
116
150
  standard: { typical: 1.2, reserved: 7.4 },
117
- deep: { typical: 2.4, reserved: 19.8 },
151
+ deep: { typical: 2.4, reserved: 17.4 },
118
152
  };
119
153
  /** Typical per-row totals at each depth's default tier (founder-ratified 2026-09-26). */
120
154
  export const RESEARCH_DEPTH_TYPICAL_ROW_CREDITS = { quick: 2.1, standard: 5.5, deep: 10 };
121
- /** Workflow/automation actions (steps, tool calls, row writes) — capacity guard. */
122
- export const AUTOMATION_ACTION_CREDITS = SNAPSHOT_AUTOMATION_ACTION_CREDITS;
123
155
  /**
124
- * Managed email inboxes: founder-ratified flat price (2026-07-25), superseding
125
- * the earlier dynamic vendor-COGS × 1.25 range. Kept as an object (min/typical/max
126
- * all equal) rather than a bare number so existing callers that destructure any
127
- * of the three fields need no shape change.
156
+ * Workflow steps are priced through the 2026-09 repricing switch, so this sheet
157
+ * carries no flat number for them: the price in force is
158
+ * `automationStepCredits()` (`@oxygen/shared/billing`), resolved on the server.
159
+ * The definition is re-exported for surfaces that show what the step costs
160
+ * before and after the switch. Row writes inside a run are free.
161
+ */
162
+ export { AUTOMATION_STEP_CREDITS_REPRICING } from "./repricing.js";
163
+ /**
164
+ * The flat mailbox line of a managed Google inbox after the 2026-09 repricing
165
+ * (400, decision 3.1, slice S32). Its 100-credit mailbox connection, warm-up
166
+ * included, bills beside it: 500 all-in. The all-in price waits for the S07
167
+ * switch, so a surface that quotes it uses `managedInboxAllInCredits()` from
168
+ * `@oxygen/shared/repricing`, resolved on the server. Kept as an object
169
+ * (min/typical/max all equal) so callers that destructure any field need no
170
+ * shape change.
128
171
  */
129
- export const MANAGED_INBOX_MARKUP = SNAPSHOT_MANAGED_INBOX_MARKUP;
130
172
  export const MANAGED_INBOX_CREDITS_PER_MONTH = {
131
173
  min: SNAPSHOT_MANAGED_INBOX_CREDITS_PER_MONTH,
132
174
  typical: SNAPSHOT_MANAGED_INBOX_CREDITS_PER_MONTH,
133
175
  max: SNAPSHOT_MANAGED_INBOX_CREDITS_PER_MONTH,
134
176
  };
135
177
  /**
136
- * VOICE (the call channel). Marked up 5×, not the 1.25× infra rule the inbox and
137
- * domain rails use: a phone number carries ongoing reputation work (warm-up,
138
- * rotation, cap enforcement, health) that a mailbox rail does not, and the
139
- * per-minute rate is small enough that a 1.25× markup would not cover it.
178
+ * VOICE (the call channel). One price per connected minute, 5 credits ($0.05),
179
+ * with answering-machine detection folded in (repricing 2026-09, decision 7.3;
180
+ * it was 9 a minute plus 3.8 per connected call). A call nobody answered is free.
140
181
  *
141
- * A browser-softphone call bills TWO Twilio legs, which is easy to miss:
182
+ * A browser-softphone call bills TWO Twilio legs, which is easy to miss when
183
+ * checking the margin:
142
184
  * browser/app (the rep's WebRTC leg) $0.0040 / min
143
185
  * outbound to a US local/mobile $0.0140 / min
144
186
  * ─────────────
145
- * $0.0180 / min
146
- * Costing only the outbound leg undercharges every call by 29%.
187
+ * $0.0180 / min → 5 credits is ~2.8×
188
+ * Costing only the outbound leg understates the cost of every call by 29%.
147
189
  */
148
- export const VOICE_MARKUP = SNAPSHOT_VOICE_MARKUP;
149
190
  export const VOICE_NUMBER_CREDITS_PER_MONTH = SNAPSHOT_VOICE_NUMBER_CREDITS_PER_MONTH;
150
191
  export const VOICE_CREDITS_PER_MINUTE = SNAPSHOT_VOICE_CREDITS_PER_MINUTE;
151
- export const VOICE_CREDITS_PER_AMD_CALL = SNAPSHOT_VOICE_CREDITS_PER_AMD_CALL;
152
- /** Managed domains: registrar at-cost × 1.25 (≈ a $10.44 .com → ~13,050 credits/yr). */
153
- export const MANAGED_DOMAIN_MARKUP = SNAPSHOT_MANAGED_DOMAIN_MARKUP;
154
- export const MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL = SNAPSHOT_MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL;
192
+ /**
193
+ * Sending domain bought through OXYGEN: InboxKit's cost passed through at 1.0x, a year at
194
+ * a time, renewed yearly at the vendor's renewal cost (repricing 2026-09, decision 3.3).
195
+ * Representative: a .com is 1,250 credits a year; the charge is the exact domain's price.
196
+ */
197
+ export const SENDING_DOMAIN_CREDITS_PER_YEAR_TYPICAL = SNAPSHOT_SENDING_DOMAIN_CREDITS_PER_YEAR_TYPICAL;
155
198
  /**
156
199
  * Inbox deliverability (EmailGuard placement seat). A flat monthly price per
157
200
  * SUBSCRIBED inbox covering continuous deliverability monitoring (blacklist,
@@ -161,10 +204,16 @@ export const MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL = SNAPSHOT_MANAGED_DOMAIN_C
161
204
  *
162
205
  * THE ALLOWANCE IS LOAD-BEARING, not a perk. Placement COGS is per TEST
163
206
  * ($0.1327 on EmailGuard's Agency plan), not per inbox, so an unbounded seat
164
- * inverts its own margin: at $1.00/inbox-month the EIGHTH test in a cycle is
165
- * already sold at a loss. Two included tests cost $0.265 against $1.00 of
166
- * revenue — a ~73% margin — and everything past them bills
207
+ * inverts its own margin: at $1.00/inbox-month the EIGHTH test in a cycle was
208
+ * already sold at a loss. Two included tests cost $0.265 against $1.35 of
209
+ * revenue at the 2026-09 price, and everything past them bills
167
210
  * PLACEMENT_TEST_OVERAGE_CREDITS. Orgs on their own EmailGuard key (BYOK) pay 0.
211
+ *
212
+ * These two prices are the RATIFIED list prices from the 2026-09 repricing
213
+ * (135 and 66, slice S30). The rises wait for the S07 effective-date switch, so
214
+ * a surface that quotes or bills uses `deliverabilitySeatCredits()` and
215
+ * `placementTestCredits()` from `@oxygen/shared/repricing` (100 and 16.6 until
216
+ * the switch's instant), never these constants.
168
217
  */
169
218
  export const DELIVERABILITY_SEAT_CREDITS_PER_MONTH = SNAPSHOT_DELIVERABILITY_SEAT_CREDITS_PER_MONTH;
170
219
  export const DELIVERABILITY_INCLUDED_TESTS_PER_INBOX = SNAPSHOT_DELIVERABILITY_INCLUDED_TESTS_PER_INBOX;
@@ -222,7 +271,7 @@ export const ENRICHMENT_CREDITS = {
222
271
  phone_find_typical: 99, // Prospeo/Findymail-class mobile
223
272
  company_enrich_typical: 9.9,
224
273
  web_search: 0.5, // Serper
225
- page_scrape: 4, // Firecrawl (wedge price)
274
+ page_scrape: 1.6, // Firecrawl, 5x of $0.0032 (repricing 2026-09, S44)
226
275
  linkedin_profile_scrape: 1, // Managed profile credit at $0.002 COGS, exactly 5x
227
276
  };
228
277
  /** Editable calculator default: blended credits per fully-enriched row. */
@@ -4,15 +4,14 @@ export declare const PRICE_SHEET_VERIFIED = "2026-07";
4
4
  export declare const CREDITS_PER_USD = 100;
5
5
  /** The divisor in the markup formula; exact inverse of CREDITS_PER_USD. */
6
6
  export declare const CREDIT_USD_VALUE = 0.01;
7
- /** On-demand top-up, in USD cents per 100 credits. */
8
- export declare const TOPUP_USD_CENTS_PER_100_CREDITS = 125;
9
- /** On-demand top-up price per 100 credits, in USD. */
10
- export declare const TOPUP_USD_PER_100 = 1.25;
11
- /** Subscription credits convert at face value, making them exactly 20% cheaper. */
7
+ /**
8
+ * On-demand top-up after the 2026-09 repricing, in USD cents per 100 credits.
9
+ * Never read directly to sell credits: creditTopupUsdCentsPer100() in billing.ts
10
+ * holds the previous rate until OXYGEN_REPRICING_2026_09_EFFECTIVE_AT passes.
11
+ */
12
+ export declare const TOPUP_USD_CENTS_PER_100_CREDITS = 130;
13
+ /** Face value of a subscription credit, cheaper than any top-up; the $499+ plans' volume bonus lowers the effective rate further. */
12
14
  export declare const SUBSCRIPTION_USD_PER_100 = 1;
13
- export declare const MANAGED_INBOX_MARKUP = 1.25;
14
- export declare const MANAGED_DOMAIN_MARKUP = 1.25;
15
- export declare const VOICE_MARKUP = 5;
16
15
  /** Applied to actual provider inference cost at settle time. */
17
16
  export declare const COPILOT_CREDIT_MARKUP_MULTIPLIER = 5;
18
17
  export declare const LINKEDIN_ACCOUNT_CREDITS_PER_MONTH = 3400;
@@ -20,15 +19,18 @@ export declare const WHATSAPP_ACCOUNT_CREDITS_PER_MONTH = 3000;
20
19
  export declare const X_ACCOUNT_CREDITS_PER_MONTH = 1000;
21
20
  export declare const EGRESS_IP_CREDITS_PER_MONTH = 2500;
22
21
  export declare const SENDING_MAILBOX_CREDITS_PER_MONTH = 100;
23
- export declare const MANAGED_INBOX_CREDITS_PER_MONTH = 300;
24
- export declare const MAILBOX_WARMUP_CREDITS_PER_MONTH = 100;
25
- export declare const DELIVERABILITY_SEAT_CREDITS_PER_MONTH = 100;
22
+ export declare const MANAGED_INBOX_CREDITS_PER_MONTH = 400;
23
+ export declare const MAILBOX_WARMUP_CREDITS_PER_MONTH = 0;
24
+ export declare const DELIVERABILITY_SEAT_CREDITS_PER_MONTH = 135;
26
25
  /** Included inbox-placement tests per subscribed inbox per cycle. */
27
26
  export declare const DELIVERABILITY_INCLUDED_TESTS_PER_INBOX = 2;
28
27
  /** A placement test beyond the included allowance. */
29
- export declare const PLACEMENT_TEST_OVERAGE_CREDITS = 16.6;
30
- /** Representative, not billed: a typical .com at MANAGED_DOMAIN_MARKUP. */
31
- export declare const MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL = 1305;
28
+ export declare const PLACEMENT_TEST_OVERAGE_CREDITS = 66;
29
+ /**
30
+ * Representative, not billed: a .com at InboxKit's cost (1.0x), charged at purchase
31
+ * and again at each yearly renewal. The charged price is the vendor's live price.
32
+ */
33
+ export declare const SENDING_DOMAIN_CREDITS_PER_YEAR_TYPICAL = 1250;
32
34
  export declare const SENDING_SEAT_USD_CENTS: {
33
35
  readonly linkedin: 3000;
34
36
  readonly whatsapp: 3000;
@@ -36,13 +38,29 @@ export declare const SENDING_SEAT_USD_CENTS: {
36
38
  readonly email_sender: 100;
37
39
  };
38
40
  export type SendingSeatKey = keyof typeof SENDING_SEAT_USD_CENTS;
39
- export declare const MANAGED_INBOX_USD_CENTS = 400;
40
- export declare const SENDING_DOMAIN_USD_CENTS = 1250;
41
41
  export declare const VOICE_NUMBER_CREDITS_PER_MONTH = 1000;
42
- export declare const VOICE_CREDITS_PER_MINUTE = 9;
43
- export declare const VOICE_CREDITS_PER_AMD_CALL = 3.8;
44
- /** Workflow steps, tool calls and row writes — a capacity guard, not a margin line. */
45
- export declare const AUTOMATION_ACTION_CREDITS = 0.001;
42
+ /** Per connected minute; answering-machine detection is included (repricing 2026-09, decision 7.3). */
43
+ export declare const VOICE_CREDITS_PER_MINUTE = 5;
44
+ /**
45
+ * Price of one workflow step after the 2026-09 repricing; row writes are free.
46
+ * Never read directly for billing: automationStepCredits() in billing.ts holds
47
+ * the previous price until OXYGEN_REPRICING_2026_09_EFFECTIVE_AT passes.
48
+ */
49
+ export declare const AUTOMATION_ACTION_CREDITS = 0.05;
50
+ /**
51
+ * Platform fee on one provider call made with the customer's own API key
52
+ * (BYOK), after the 2026-09 repricing. Never read directly for billing:
53
+ * byokPlatformFeeCredits() in billing.ts holds 0 until
54
+ * OXYGEN_REPRICING_2026_09_EFFECTIVE_AT passes.
55
+ */
56
+ export declare const BYOK_PLATFORM_FEE_CREDITS = 0.05;
57
+ /**
58
+ * Flat price of one LinkedIn URL found by the default LinkedIn-URL waterfall,
59
+ * after the 2026-09 repricing; a miss costs nothing. Never read directly for
60
+ * billing: linkedinUrlFoundCredits() in repricing.ts applies it only once
61
+ * OXYGEN_REPRICING_2026_09_EFFECTIVE_AT passes.
62
+ */
63
+ export declare const LINKEDIN_URL_FOUND_CREDITS = 5;
46
64
  /** Email, LinkedIn and WhatsApp sends are free; the pool pays for seats and inboxes. */
47
65
  export declare const SEND_CREDITS = 0;
48
66
  /** Every LinkedIn action is 0 under the pure seat model. */
@@ -19,16 +19,15 @@ export const PRICE_SHEET_VERIFIED = "2026-07";
19
19
  export const CREDITS_PER_USD = 100;
20
20
  /** The divisor in the markup formula; exact inverse of CREDITS_PER_USD. */
21
21
  export const CREDIT_USD_VALUE = 0.01;
22
- /** On-demand top-up, in USD cents per 100 credits. */
23
- export const TOPUP_USD_CENTS_PER_100_CREDITS = 125;
24
- /** On-demand top-up price per 100 credits, in USD. */
25
- export const TOPUP_USD_PER_100 = 1.25;
26
- /** Subscription credits convert at face value, making them exactly 20% cheaper. */
22
+ /**
23
+ * On-demand top-up after the 2026-09 repricing, in USD cents per 100 credits.
24
+ * Never read directly to sell credits: creditTopupUsdCentsPer100() in billing.ts
25
+ * holds the previous rate until OXYGEN_REPRICING_2026_09_EFFECTIVE_AT passes.
26
+ */
27
+ export const TOPUP_USD_CENTS_PER_100_CREDITS = 130;
28
+ /** Face value of a subscription credit, cheaper than any top-up; the $499+ plans' volume bonus lowers the effective rate further. */
27
29
  export const SUBSCRIPTION_USD_PER_100 = 1;
28
30
  // --- markups ----------------------------------------------------------------
29
- export const MANAGED_INBOX_MARKUP = 1.25;
30
- export const MANAGED_DOMAIN_MARKUP = 1.25;
31
- export const VOICE_MARKUP = 5;
32
31
  /** Applied to actual provider inference cost at settle time. */
33
32
  export const COPILOT_CREDIT_MARKUP_MULTIPLIER = 5;
34
33
  // --- seats and recurring charges --------------------------------------------
@@ -42,15 +41,18 @@ export const WHATSAPP_ACCOUNT_CREDITS_PER_MONTH = 3_000;
42
41
  export const X_ACCOUNT_CREDITS_PER_MONTH = 1_000;
43
42
  export const EGRESS_IP_CREDITS_PER_MONTH = 2_500;
44
43
  export const SENDING_MAILBOX_CREDITS_PER_MONTH = 100;
45
- export const MANAGED_INBOX_CREDITS_PER_MONTH = 300;
46
- export const MAILBOX_WARMUP_CREDITS_PER_MONTH = 100;
47
- export const DELIVERABILITY_SEAT_CREDITS_PER_MONTH = 100;
44
+ export const MANAGED_INBOX_CREDITS_PER_MONTH = 400;
45
+ export const MAILBOX_WARMUP_CREDITS_PER_MONTH = 0;
46
+ export const DELIVERABILITY_SEAT_CREDITS_PER_MONTH = 135;
48
47
  /** Included inbox-placement tests per subscribed inbox per cycle. */
49
48
  export const DELIVERABILITY_INCLUDED_TESTS_PER_INBOX = 2;
50
49
  /** A placement test beyond the included allowance. */
51
- export const PLACEMENT_TEST_OVERAGE_CREDITS = 16.6;
52
- /** Representative, not billed: a typical .com at MANAGED_DOMAIN_MARKUP. */
53
- export const MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL = 1_305;
50
+ export const PLACEMENT_TEST_OVERAGE_CREDITS = 66;
51
+ /**
52
+ * Representative, not billed: a .com at InboxKit's cost (1.0x), charged at purchase
53
+ * and again at each yearly renewal. The charged price is the vendor's live price.
54
+ */
55
+ export const SENDING_DOMAIN_CREDITS_PER_YEAR_TYPICAL = 1_250;
54
56
  // --- sending seats (USD, Stripe-billed) --------------------------------------
55
57
  //
56
58
  // The seat model (OXP-15). These are DOLLARS, not credits, and they do not
@@ -66,26 +68,37 @@ export const SENDING_SEAT_USD_CENTS = {
66
68
  phone_number: 1_000,
67
69
  email_sender: 100,
68
70
  };
69
- // --- email infrastructure (USD, Stripe-billed) -------------------------------
71
+ // --- email infrastructure ---------------------------------------------------
70
72
  //
71
- // Sold in dollars as real Stripe products, not credits. MANAGED_INBOX is ALL-IN:
72
- // it already contains the sending seat and warm-up, so a customer never assembles
73
- // a working mailbox out of parts and can never end up holding a mailbox with no
74
- // seat to send from. A customer bringing their OWN mailbox pays the $1
75
- // email_sender seat instead.
76
- //
77
- // The domain is FLAT rather than cost x 1.25. That is only safe because the
78
- // below-cost guard refuses any quote whose line price falls under live vendor
79
- // cost, so an expensive TLD is refused rather than silently sold at a loss.
80
- export const MANAGED_INBOX_USD_CENTS = 400;
81
- export const SENDING_DOMAIN_USD_CENTS = 1_250;
73
+ // No longer sold in dollars. A managed inbox is priced in credits (repricing
74
+ // 2026-09, S32): MANAGED_INBOX_CREDITS_PER_MONTH for a Google mailbox plus the
75
+ // SENDING_MAILBOX_CREDITS_PER_MONTH connection, warm-up included. Domains are
76
+ // bought in credits at InboxKit's cost (S33, SENDING_DOMAIN_CREDITS_PER_YEAR_TYPICAL).
82
77
  // --- voice ------------------------------------------------------------------
83
78
  export const VOICE_NUMBER_CREDITS_PER_MONTH = 1_000;
84
- export const VOICE_CREDITS_PER_MINUTE = 9;
85
- export const VOICE_CREDITS_PER_AMD_CALL = 3.8;
79
+ /** Per connected minute; answering-machine detection is included (repricing 2026-09, decision 7.3). */
80
+ export const VOICE_CREDITS_PER_MINUTE = 5;
86
81
  // --- per-action -------------------------------------------------------------
87
- /** Workflow steps, tool calls and row writes — a capacity guard, not a margin line. */
88
- export const AUTOMATION_ACTION_CREDITS = 0.001;
82
+ /**
83
+ * Price of one workflow step after the 2026-09 repricing; row writes are free.
84
+ * Never read directly for billing: automationStepCredits() in billing.ts holds
85
+ * the previous price until OXYGEN_REPRICING_2026_09_EFFECTIVE_AT passes.
86
+ */
87
+ export const AUTOMATION_ACTION_CREDITS = 0.05;
88
+ /**
89
+ * Platform fee on one provider call made with the customer's own API key
90
+ * (BYOK), after the 2026-09 repricing. Never read directly for billing:
91
+ * byokPlatformFeeCredits() in billing.ts holds 0 until
92
+ * OXYGEN_REPRICING_2026_09_EFFECTIVE_AT passes.
93
+ */
94
+ export const BYOK_PLATFORM_FEE_CREDITS = 0.05;
95
+ /**
96
+ * Flat price of one LinkedIn URL found by the default LinkedIn-URL waterfall,
97
+ * after the 2026-09 repricing; a miss costs nothing. Never read directly for
98
+ * billing: linkedinUrlFoundCredits() in repricing.ts applies it only once
99
+ * OXYGEN_REPRICING_2026_09_EFFECTIVE_AT passes.
100
+ */
101
+ export const LINKEDIN_URL_FOUND_CREDITS = 5;
89
102
  /** Email, LinkedIn and WhatsApp sends are free; the pool pays for seats and inboxes. */
90
103
  export const SEND_CREDITS = 0;
91
104
  /** Every LinkedIn action is 0 under the pure seat model. */
@@ -103,12 +116,12 @@ export const ENRICHMENT_CREDITS_PER_ROW_TYPICAL = 10;
103
116
  export const LINKEDIN_TYPICAL_ACTIONS_CREDITS_PER_MONTH = 0;
104
117
  export const PRICING_PLAN_SNAPSHOT = [
105
118
  { planKey: "free", tier: "free", isLegacy: false, monthlyPriceCents: 0, monthlyCredits: 0, weeklyCreditsLimit: null, rolloverCap: null, byokEnabled: false },
106
- { planKey: "oxygen_49", tier: "oxygen", isLegacy: false, monthlyPriceCents: 4_900, monthlyCredits: 4_900, weeklyCreditsLimit: null, rolloverCap: 4_900, byokEnabled: true },
119
+ { planKey: "oxygen_49", tier: "oxygen", isLegacy: false, monthlyPriceCents: 4_900, monthlyCredits: 4_900, weeklyCreditsLimit: null, rolloverCap: 4_900, byokEnabled: false },
107
120
  { planKey: "oxygen_99", tier: "oxygen", isLegacy: false, monthlyPriceCents: 9_900, monthlyCredits: 9_900, weeklyCreditsLimit: null, rolloverCap: 9_900, byokEnabled: true },
108
121
  { planKey: "oxygen_199", tier: "oxygen", isLegacy: false, monthlyPriceCents: 19_900, monthlyCredits: 19_900, weeklyCreditsLimit: null, rolloverCap: 19_900, byokEnabled: true },
109
- { planKey: "oxygen_499", tier: "oxygen", isLegacy: false, monthlyPriceCents: 49_900, monthlyCredits: 49_900, weeklyCreditsLimit: null, rolloverCap: 49_900, byokEnabled: true },
110
- { planKey: "oxygen_999", tier: "oxygen", isLegacy: false, monthlyPriceCents: 99_900, monthlyCredits: 99_900, weeklyCreditsLimit: null, rolloverCap: 99_900, byokEnabled: true },
111
- { planKey: "oxygen_1999", tier: "oxygen", isLegacy: false, monthlyPriceCents: 199_900, monthlyCredits: 199_900, weeklyCreditsLimit: null, rolloverCap: 199_900, byokEnabled: true },
122
+ { planKey: "oxygen_499", tier: "oxygen", isLegacy: false, monthlyPriceCents: 49_900, monthlyCredits: 52_395, weeklyCreditsLimit: null, rolloverCap: 52_395, byokEnabled: true },
123
+ { planKey: "oxygen_999", tier: "oxygen", isLegacy: false, monthlyPriceCents: 99_900, monthlyCredits: 109_890, weeklyCreditsLimit: null, rolloverCap: 109_890, byokEnabled: true },
124
+ { planKey: "oxygen_1999", tier: "oxygen", isLegacy: false, monthlyPriceCents: 199_900, monthlyCredits: 229_885, weeklyCreditsLimit: null, rolloverCap: 229_885, byokEnabled: true },
112
125
  { planKey: "scale", tier: "scale", isLegacy: false, monthlyPriceCents: null, monthlyCredits: 1_000_000, weeklyCreditsLimit: null, rolloverCap: 1_000_000, byokEnabled: true },
113
126
  { planKey: "enterprise", tier: "enterprise", isLegacy: false, monthlyPriceCents: null, monthlyCredits: null, weeklyCreditsLimit: null, rolloverCap: null, byokEnabled: true },
114
127
  { planKey: "starter", tier: "starter", isLegacy: true, monthlyPriceCents: 9_900, monthlyCredits: 9_900, weeklyCreditsLimit: null, rolloverCap: 9_900, byokEnabled: true },
@@ -0,0 +1,10 @@
1
+ export declare const PROVIDER_HTTP_ERROR: unique symbol;
2
+ export type ProviderHttpError = Error & {
3
+ status: number;
4
+ retryable?: unknown;
5
+ body?: unknown;
6
+ };
7
+ /** True for an Error whose class is a provider HTTP error, whatever its numeric status. */
8
+ export declare function hasProviderHttpErrorIdentity(error: Error): boolean;
9
+ /** A provider HTTP error with a finite numeric status, ready to classify. */
10
+ export declare function isProviderHttpError(error: unknown): error is ProviderHttpError;
@@ -0,0 +1,27 @@
1
+ // A provider client error that carries the vendor's HTTP status.
2
+ //
3
+ // Surfaces that shape a failure for a customer (the /api/cli/* envelope, the
4
+ // operation-event projection) map these to provider_request_failed (4xx),
5
+ // provider_rate_limit (429) or provider_unavailable (5xx / retryable), and log the
6
+ // vendor's words to Axiom instead of showing them. They used to recognise such an
7
+ // error by its class NAME alone (`*ApiError`, `*AccessError`), so a client whose
8
+ // class was named anything else fell through to a 500 `unexpected_error`: on
9
+ // 2026-09-26 PredictLeads answered a 400 naming the invalid financing type, and the
10
+ // customer's agent was told "OXYGEN's server is erroring". The brand makes the
11
+ // contract explicit; the name rule stays so every class that works today keeps
12
+ // working.
13
+ export const PROVIDER_HTTP_ERROR = Symbol.for("oxygen.provider_http_error");
14
+ /** True for an Error whose class is a provider HTTP error, whatever its numeric status. */
15
+ export function hasProviderHttpErrorIdentity(error) {
16
+ if (error[PROVIDER_HTTP_ERROR] === true)
17
+ return true;
18
+ const name = error.name || "";
19
+ return name.endsWith("ApiError") || name.endsWith("AccessError");
20
+ }
21
+ /** A provider HTTP error with a finite numeric status, ready to classify. */
22
+ export function isProviderHttpError(error) {
23
+ if (!(error instanceof Error) || !hasProviderHttpErrorIdentity(error))
24
+ return false;
25
+ const status = error.status;
26
+ return typeof status === "number" && Number.isFinite(status);
27
+ }