@oxygen-agent/cli 1.1010.650 → 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 (114) 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 +15 -1
  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/inbox-needs-reply-notice.d.ts +12 -0
  10. package/dist/inbox-needs-reply-notice.js +51 -0
  11. package/dist/index.js +756 -177
  12. package/dist/run-wait.d.ts +3 -1
  13. package/dist/run-wait.js +19 -5
  14. package/dist/skills.js +48 -22
  15. package/dist/streamed-file-import.d.ts +58 -0
  16. package/dist/streamed-file-import.js +115 -0
  17. package/dist/update.d.ts +29 -0
  18. package/dist/update.js +62 -16
  19. package/dist/workflow-plan-limit-notices.d.ts +8 -0
  20. package/dist/workflow-plan-limit-notices.js +28 -0
  21. package/node_modules/@oxygen/cli-ugc/dist/commands.js +3 -3
  22. package/node_modules/@oxygen/shared/dist/billing-anchors.d.ts +50 -2
  23. package/node_modules/@oxygen/shared/dist/billing-anchors.js +94 -2
  24. package/node_modules/@oxygen/shared/dist/billing.d.ts +247 -37
  25. package/node_modules/@oxygen/shared/dist/billing.js +418 -45
  26. package/node_modules/@oxygen/shared/dist/capability-discovery.js +66 -6
  27. package/node_modules/@oxygen/shared/dist/copilot-skills.generated.d.ts +6 -6
  28. package/node_modules/@oxygen/shared/dist/copilot-skills.generated.js +6 -6
  29. package/node_modules/@oxygen/shared/dist/cost-estimate-view.d.ts +50 -0
  30. package/node_modules/@oxygen/shared/dist/cost-estimate-view.js +90 -0
  31. package/node_modules/@oxygen/shared/dist/cost-estimate.d.ts +167 -0
  32. package/node_modules/@oxygen/shared/dist/cost-estimate.js +361 -0
  33. package/node_modules/@oxygen/shared/dist/credit-gate.d.ts +26 -0
  34. package/node_modules/@oxygen/shared/dist/credit-gate.js +65 -0
  35. package/node_modules/@oxygen/shared/dist/email-deliverability-policy.d.ts +51 -0
  36. package/node_modules/@oxygen/shared/dist/email-deliverability-policy.js +101 -0
  37. package/node_modules/@oxygen/shared/dist/email-hard-bounce.d.ts +27 -0
  38. package/node_modules/@oxygen/shared/dist/email-hard-bounce.js +27 -0
  39. package/node_modules/@oxygen/shared/dist/error-redaction.d.ts +1 -1
  40. package/node_modules/@oxygen/shared/dist/error-redaction.js +1 -1
  41. package/node_modules/@oxygen/shared/dist/feature-gates.d.ts +10 -1
  42. package/node_modules/@oxygen/shared/dist/feature-gates.js +12 -1
  43. package/node_modules/@oxygen/shared/dist/file-import.d.ts +13 -1
  44. package/node_modules/@oxygen/shared/dist/file-import.js +33 -6
  45. package/node_modules/@oxygen/shared/dist/hosted-ai.d.ts +73 -3
  46. package/node_modules/@oxygen/shared/dist/hosted-ai.js +246 -24
  47. package/node_modules/@oxygen/shared/dist/import-limits.d.ts +25 -1
  48. package/node_modules/@oxygen/shared/dist/import-limits.js +35 -2
  49. package/node_modules/@oxygen/shared/dist/index.d.ts +4 -23
  50. package/node_modules/@oxygen/shared/dist/index.js +4 -43
  51. package/node_modules/@oxygen/shared/dist/linkedin-sequences.d.ts +114 -0
  52. package/node_modules/@oxygen/shared/dist/linkedin-sequences.js +150 -0
  53. package/node_modules/@oxygen/shared/dist/object-storage.d.ts +9 -0
  54. package/node_modules/@oxygen/shared/dist/object-storage.js +17 -0
  55. package/node_modules/@oxygen/shared/dist/operational-telemetry.d.ts +41 -0
  56. package/node_modules/@oxygen/shared/dist/operational-telemetry.js +55 -0
  57. package/node_modules/@oxygen/shared/dist/otlp-log-sink.js +19 -2
  58. package/node_modules/@oxygen/shared/dist/plan-band.d.ts +234 -0
  59. package/node_modules/@oxygen/shared/dist/plan-band.js +312 -0
  60. package/node_modules/@oxygen/shared/dist/plan-capabilities.d.ts +77 -7
  61. package/node_modules/@oxygen/shared/dist/plan-capabilities.js +87 -7
  62. package/node_modules/@oxygen/shared/dist/plan-limits-view.d.ts +219 -0
  63. package/node_modules/@oxygen/shared/dist/plan-limits-view.js +330 -0
  64. package/node_modules/@oxygen/shared/dist/plan-limits.d.ts +335 -126
  65. package/node_modules/@oxygen/shared/dist/plan-limits.js +277 -86
  66. package/node_modules/@oxygen/shared/dist/pricing-sheet.d.ts +158 -49
  67. package/node_modules/@oxygen/shared/dist/pricing-sheet.js +139 -41
  68. package/node_modules/@oxygen/shared/dist/pricing-snapshot.generated.d.ts +42 -23
  69. package/node_modules/@oxygen/shared/dist/pricing-snapshot.generated.js +56 -37
  70. package/node_modules/@oxygen/shared/dist/process-resource.d.ts +4 -0
  71. package/node_modules/@oxygen/shared/dist/process-resource.js +25 -0
  72. package/node_modules/@oxygen/shared/dist/provider-http-error.d.ts +10 -0
  73. package/node_modules/@oxygen/shared/dist/provider-http-error.js +27 -0
  74. package/node_modules/@oxygen/shared/dist/repricing.d.ts +257 -0
  75. package/node_modules/@oxygen/shared/dist/repricing.js +721 -0
  76. package/node_modules/@oxygen/shared/dist/semver.d.ts +21 -0
  77. package/node_modules/@oxygen/shared/dist/semver.js +41 -0
  78. package/node_modules/@oxygen/shared/dist/sending-limits.d.ts +30 -0
  79. package/node_modules/@oxygen/shared/dist/sending-limits.js +43 -0
  80. package/node_modules/@oxygen/shared/dist/sending-seats.d.ts +18 -15
  81. package/node_modules/@oxygen/shared/dist/sending-seats.js +22 -17
  82. package/node_modules/@oxygen/shared/dist/sequence-failures.js +4 -1
  83. package/node_modules/@oxygen/shared/dist/spend-safety.d.ts +57 -8
  84. package/node_modules/@oxygen/shared/dist/spend-safety.js +64 -11
  85. package/node_modules/@oxygen/shared/dist/stripe-price-catalog.d.ts +33 -1
  86. package/node_modules/@oxygen/shared/dist/stripe-price-catalog.js +71 -1
  87. package/node_modules/@oxygen/shared/dist/table-capacity.d.ts +68 -10
  88. package/node_modules/@oxygen/shared/dist/table-capacity.js +85 -4
  89. package/node_modules/@oxygen/shared/dist/telemetry-export-observer.d.ts +6 -0
  90. package/node_modules/@oxygen/shared/dist/telemetry-export-observer.js +13 -5
  91. package/node_modules/@oxygen/shared/dist/telemetry-resource.d.ts +40 -0
  92. package/node_modules/@oxygen/shared/dist/telemetry-resource.js +35 -0
  93. package/node_modules/@oxygen/shared/dist/telemetry.d.ts +9 -0
  94. package/node_modules/@oxygen/shared/dist/telemetry.js +41 -2
  95. package/node_modules/@oxygen/shared/dist/trace-context.d.ts +29 -0
  96. package/node_modules/@oxygen/shared/dist/trace-context.js +88 -0
  97. package/node_modules/@oxygen/shared/dist/ugc.d.ts +15 -0
  98. package/node_modules/@oxygen/shared/dist/ugc.js +29 -0
  99. package/node_modules/@oxygen/shared/dist/version.d.ts +1 -3
  100. package/node_modules/@oxygen/shared/dist/version.generated.d.ts +1 -1
  101. package/node_modules/@oxygen/shared/dist/version.generated.js +1 -1
  102. package/node_modules/@oxygen/shared/dist/version.js +14 -27
  103. package/node_modules/@oxygen/shared/dist/workspace-file-storage.d.ts +5 -0
  104. package/node_modules/@oxygen/shared/dist/workspace-file-storage.js +5 -0
  105. package/node_modules/@oxygen/workflows/dist/graph/manifest-schema.d.ts +3 -3
  106. package/node_modules/@oxygen/workflows/dist/graph/types.d.ts +15 -1
  107. package/node_modules/@oxygen/workflows/dist/graph/types.js +15 -1
  108. package/node_modules/@oxygen/workflows/dist/index.d.ts +45 -0
  109. package/node_modules/@oxygen/workflows/dist/index.js +152 -2
  110. package/node_modules/@oxygen/workflows/dist/usage-estimate.d.ts +10 -1
  111. package/node_modules/@oxygen/workflows/dist/usage-estimate.js +33 -29
  112. package/package.json +1 -1
  113. package/node_modules/@oxygen/shared/dist/email-warmup-readiness.d.ts +0 -64
  114. package/node_modules/@oxygen/shared/dist/email-warmup-readiness.js +0 -90
@@ -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
  /**
@@ -72,53 +92,125 @@ export declare const AI_COLUMN_CREDITS: {
72
92
  * never read.
73
93
  *
74
94
  * The figures below describe the DEFAULT research column, which since D53 discovers
75
- * then reads: `serper.search` (0.5) finds the URLs, then one additive
76
- * `exa.contents` read (0.5) turns the top result's ~160-char SERP teaser into real
77
- * page text. So a typical row spends 1 and a preview reserves 4.5, because the
78
- * ceiling must also cover the `exa.search` fallback (3.5) firing when serper finds
79
- * nothing. The read carries no fallback of its own — a read miss leaves the row
80
- * grounded on the snippets it already has.
95
+ * then reads: `serper.search` (0.5) finds the URLs, then an additive read turns the
96
+ * top result's ~160-char SERP teaser into real page text. The read tries OXYGEN's
97
+ * own `web.page_fetch` (0.1) first and `exa.contents` (0.5) only when the native
98
+ * fetch cannot read the page. So a typical row spends 0.6 and a preview reserves
99
+ * 4.6: the ceiling covers the `exa.search` fallback (3.5) firing when serper finds
100
+ * nothing plus both read lanes. A read miss leaves the row grounded on the snippets
101
+ * it already has.
81
102
  *
82
103
  * Both numbers are RESOLVER-DERIVED and pinned by pricing-sheet-conformance.test.ts
83
104
  * against the shipped default, so a re-price or a lane change fails a test rather
84
105
  * than quietly mispricing this page. Do not hand-edit them.
85
106
  */
86
- export declare const AI_COLUMN_WEB_SEARCH_TYPICAL_CREDITS = 1;
87
- export declare const AI_COLUMN_WEB_SEARCH_RESERVED_CREDITS = 4.5;
88
- /** Workflow/automation actions (steps, tool calls, row writes) — capacity guard. */
89
- export declare const AUTOMATION_ACTION_CREDITS = 0.001;
107
+ export declare const AI_COLUMN_WEB_SEARCH_TYPICAL_CREDITS = 0.6;
108
+ export declare const AI_COLUMN_WEB_SEARCH_RESERVED_CREDITS = 4.6;
109
+ /**
110
+ * Research depth (Claygent parity). `quick` is the single grounded pass priced
111
+ * above (the column's tier price plus AI_COLUMN_WEB_SEARCH_*; 2.1 typical at the
112
+ * Fast tier). A `standard` or `deep` row runs a bounded agent loop — several model
113
+ * turns over a growing evidence list — on a model the DEPTH fixes (standard on the
114
+ * Fast tier, deep on Balanced; the column's own tier applies to quick only), so its
115
+ * model leg is one flat price per row, reserved once:
116
+ *
117
+ * standard: 4.3 + 1.2 tools = 5.5 typical
118
+ * deep: 7.6 + 2.4 tools = 10 typical
119
+ *
120
+ * Founder-ratified 2026-09-26: 30-50% under Clay, >=5x markup. The Clay comparison
121
+ * it was set against: Clay web research bills per row in Data Credits — GPT-5 Nano
122
+ * 0.5 DC, Mini/Flash 1 DC, Claygent Neon 2 DC, Argon 3 DC — at >= $0.05 per DC plus
123
+ * ~$0.01 of action per row; OXYGEN credits are $0.01. Every figure must also keep
124
+ * >= 5x over the loop's modelled COGS. Pinned against the live estimator by
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.
135
+ */
136
+ export declare const RESEARCH_DEPTH_MODEL_CREDITS: {
137
+ readonly standard: 4.3;
138
+ readonly deep: 7.6;
139
+ };
140
+ /** The tier whose model each loop depth runs on, whatever tier the column stores. */
141
+ export declare const RESEARCH_DEPTH_MODEL_TIER: {
142
+ readonly standard: "low";
143
+ readonly deep: "medium";
144
+ };
145
+ /**
146
+ * The tool half of a standard/deep row. `typical` is the ratified planning shape —
147
+ * standard: 2 serper searches + 2 native page reads; deep: 3 serper searches + 4
148
+ * native reads + 1 exa.contents fallback read. `reserved` is every budgeted tool
149
+ * call at its dearest lane — each web_search, the row's shared exa.search pool
150
+ * (standard 1, deep 2: the zero-result fallback and semantic_search draw on it),
151
+ * each read's full ladder, deep's one Firecrawl read and site crawls. Deep's
152
+ * company-news call is opt-in (a news lead-lane column) and adds its own price to
153
+ * the reserve only there. Resolver-derived, pinned like the above.
154
+ */
155
+ export declare const RESEARCH_DEPTH_GROUNDING_CREDITS: {
156
+ readonly standard: {
157
+ readonly typical: 1.2;
158
+ readonly reserved: 7.4;
159
+ };
160
+ readonly deep: {
161
+ readonly typical: 2.4;
162
+ readonly reserved: 17.4;
163
+ };
164
+ };
165
+ /** Typical per-row totals at each depth's default tier (founder-ratified 2026-09-26). */
166
+ export declare const RESEARCH_DEPTH_TYPICAL_ROW_CREDITS: {
167
+ readonly quick: 2.1;
168
+ readonly standard: 5.5;
169
+ readonly deep: 10;
170
+ };
171
+ /**
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";
90
179
  /**
91
- * Managed email inboxes: founder-ratified flat price (2026-07-25), superseding
92
- * the earlier dynamic vendor-COGS × 1.25 range. Kept as an object (min/typical/max
93
- * all equal) rather than a bare number so existing callers that destructure any
94
- * of the three fields need no shape change.
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.
95
187
  */
96
- export declare const MANAGED_INBOX_MARKUP = 1.25;
97
188
  export declare const MANAGED_INBOX_CREDITS_PER_MONTH: {
98
- readonly min: 300;
99
- readonly typical: 300;
100
- readonly max: 300;
189
+ readonly min: 400;
190
+ readonly typical: 400;
191
+ readonly max: 400;
101
192
  };
102
193
  /**
103
- * VOICE (the call channel). Marked up 5×, not the 1.25× infra rule the inbox and
104
- * domain rails use: a phone number carries ongoing reputation work (warm-up,
105
- * rotation, cap enforcement, health) that a mailbox rail does not, and the
106
- * 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.
107
197
  *
108
- * 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:
109
200
  * browser/app (the rep's WebRTC leg) $0.0040 / min
110
201
  * outbound to a US local/mobile $0.0140 / min
111
202
  * ─────────────
112
- * $0.0180 / min
113
- * 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%.
114
205
  */
115
- export declare const VOICE_MARKUP = 5;
116
- export declare const VOICE_NUMBER_CREDITS_PER_MONTH = 500;
117
- export declare const VOICE_CREDITS_PER_MINUTE = 9;
118
- export declare const VOICE_CREDITS_PER_AMD_CALL = 3.8;
119
- /** Managed domains: registrar at-cost × 1.25 (≈ a $10.44 .com → ~13,050 credits/yr). */
120
- export declare const MANAGED_DOMAIN_MARKUP = 1.25;
121
- export declare const MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL = 1305;
206
+ export declare const VOICE_NUMBER_CREDITS_PER_MONTH = 1000;
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;
122
214
  /**
123
215
  * Inbox deliverability (EmailGuard placement seat). A flat monthly price per
124
216
  * SUBSCRIBED inbox covering continuous deliverability monitoring (blacklist,
@@ -128,22 +220,32 @@ export declare const MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL = 1305;
128
220
  *
129
221
  * THE ALLOWANCE IS LOAD-BEARING, not a perk. Placement COGS is per TEST
130
222
  * ($0.1327 on EmailGuard's Agency plan), not per inbox, so an unbounded seat
131
- * inverts its own margin: at $1.00/inbox-month the EIGHTH test in a cycle is
132
- * already sold at a loss. Two included tests cost $0.265 against $1.00 of
133
- * 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
134
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.
135
233
  */
136
- export declare const DELIVERABILITY_SEAT_CREDITS_PER_MONTH = 100;
234
+ export declare const DELIVERABILITY_SEAT_CREDITS_PER_MONTH = 135;
137
235
  export declare const DELIVERABILITY_INCLUDED_TESTS_PER_INBOX = 2;
138
- export declare const PLACEMENT_TEST_OVERAGE_CREDITS = 16.6;
236
+ export declare const PLACEMENT_TEST_OVERAGE_CREDITS = 66;
139
237
  /**
140
238
  * LinkedIn accounts: founder decision (2026-07-25) — a PURE seat model. The
141
239
  * flat monthly connection fee per connected account is the WHOLE LinkedIn
142
240
  * price; every per-action charge is 0. Per-MESSAGE sends on email and WhatsApp
143
241
  * stay 0 too — but a connected WhatsApp NUMBER carries its own monthly
144
242
  * connection fee, see WHATSAPP_ACCOUNT_CREDITS_PER_MONTH.
243
+ *
244
+ * The value is the seeded price after the 2026-09 repricing (3,400, decision
245
+ * 2.1). The price in force before its effective-date switch is lower: resolve
246
+ * it with repricedChargeCredits from `@oxygen/shared/repricing` on the server.
145
247
  */
146
- export declare const LINKEDIN_ACCOUNT_CREDITS_PER_MONTH = 1000;
248
+ export declare const LINKEDIN_ACCOUNT_CREDITS_PER_MONTH = 3400;
147
249
  export declare const LINKEDIN_ACTION_CREDITS: {
148
250
  readonly visit_profile: 0;
149
251
  readonly invite: 0;
@@ -156,11 +258,18 @@ export declare const LINKEDIN_ACTION_CREDITS: {
156
258
  export declare const LINKEDIN_TYPICAL_ACTIONS_CREDITS_PER_MONTH = 0;
157
259
  /**
158
260
  * WhatsApp numbers: flat monthly connection fee per connected number, the same
159
- * seat shape as LinkedIn. Billed off the rolling-30d peak, so a number connected
160
- * part-way through a month still bills the full cycle. WhatsApp message sends
161
- * themselves remain 0 credits.
261
+ * seat shape as LinkedIn. WhatsApp message sends themselves remain 0 credits.
262
+ * Seeded at the 2026-09 repricing's price (3,000, decision 2.3); resolve the
263
+ * price in force with repricedChargeCredits.
264
+ */
265
+ export declare const WHATSAPP_ACCOUNT_CREDITS_PER_MONTH = 3000;
266
+ /**
267
+ * X accounts: monthly credit reservation per connected account (2026-09
268
+ * repricing, decision 2.2). Like the LinkedIn and WhatsApp constants above this
269
+ * is the seeded, post-repricing price; show the price in force with
270
+ * repricedChargeCredits from `@oxygen/shared/repricing`.
162
271
  */
163
- export declare const WHATSAPP_ACCOUNT_CREDITS_PER_MONTH = 1000;
272
+ export declare const X_ACCOUNT_CREDITS_PER_MONTH = 1000;
164
273
  /** Dedicated egress IP add-on. */
165
274
  export declare const EGRESS_IP_CREDITS_PER_MONTH = 2500;
166
275
  /**
@@ -182,7 +291,7 @@ export declare const ENRICHMENT_CREDITS: {
182
291
  readonly phone_find_typical: 99;
183
292
  readonly company_enrich_typical: 9.9;
184
293
  readonly web_search: 0.5;
185
- readonly page_scrape: 4;
294
+ readonly page_scrape: 1.6;
186
295
  readonly linkedin_profile_scrape: 1;
187
296
  };
188
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, } 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.
@@ -67,53 +92,109 @@ export const AI_COLUMN_CREDITS = { low: 1.5, medium: 7.5, high: 25 };
67
92
  * never read.
68
93
  *
69
94
  * The figures below describe the DEFAULT research column, which since D53 discovers
70
- * then reads: `serper.search` (0.5) finds the URLs, then one additive
71
- * `exa.contents` read (0.5) turns the top result's ~160-char SERP teaser into real
72
- * page text. So a typical row spends 1 and a preview reserves 4.5, because the
73
- * ceiling must also cover the `exa.search` fallback (3.5) firing when serper finds
74
- * nothing. The read carries no fallback of its own — a read miss leaves the row
75
- * grounded on the snippets it already has.
95
+ * then reads: `serper.search` (0.5) finds the URLs, then an additive read turns the
96
+ * top result's ~160-char SERP teaser into real page text. The read tries OXYGEN's
97
+ * own `web.page_fetch` (0.1) first and `exa.contents` (0.5) only when the native
98
+ * fetch cannot read the page. So a typical row spends 0.6 and a preview reserves
99
+ * 4.6: the ceiling covers the `exa.search` fallback (3.5) firing when serper finds
100
+ * nothing plus both read lanes. A read miss leaves the row grounded on the snippets
101
+ * it already has.
76
102
  *
77
103
  * Both numbers are RESOLVER-DERIVED and pinned by pricing-sheet-conformance.test.ts
78
104
  * against the shipped default, so a re-price or a lane change fails a test rather
79
105
  * than quietly mispricing this page. Do not hand-edit them.
80
106
  */
81
- export const AI_COLUMN_WEB_SEARCH_TYPICAL_CREDITS = 1;
82
- export const AI_COLUMN_WEB_SEARCH_RESERVED_CREDITS = 4.5;
83
- /** Workflow/automation actions (steps, tool calls, row writes) — capacity guard. */
84
- export const AUTOMATION_ACTION_CREDITS = SNAPSHOT_AUTOMATION_ACTION_CREDITS;
107
+ export const AI_COLUMN_WEB_SEARCH_TYPICAL_CREDITS = 0.6;
108
+ export const AI_COLUMN_WEB_SEARCH_RESERVED_CREDITS = 4.6;
109
+ /**
110
+ * Research depth (Claygent parity). `quick` is the single grounded pass priced
111
+ * above (the column's tier price plus AI_COLUMN_WEB_SEARCH_*; 2.1 typical at the
112
+ * Fast tier). A `standard` or `deep` row runs a bounded agent loop — several model
113
+ * turns over a growing evidence list — on a model the DEPTH fixes (standard on the
114
+ * Fast tier, deep on Balanced; the column's own tier applies to quick only), so its
115
+ * model leg is one flat price per row, reserved once:
116
+ *
117
+ * standard: 4.3 + 1.2 tools = 5.5 typical
118
+ * deep: 7.6 + 2.4 tools = 10 typical
119
+ *
120
+ * Founder-ratified 2026-09-26: 30-50% under Clay, >=5x markup. The Clay comparison
121
+ * it was set against: Clay web research bills per row in Data Credits — GPT-5 Nano
122
+ * 0.5 DC, Mini/Flash 1 DC, Claygent Neon 2 DC, Argon 3 DC — at >= $0.05 per DC plus
123
+ * ~$0.01 of action per row; OXYGEN credits are $0.01. Every figure must also keep
124
+ * >= 5x over the loop's modelled COGS. Pinned against the live estimator by
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.
135
+ */
136
+ export const RESEARCH_DEPTH_MODEL_CREDITS = { standard: 4.3, deep: 7.6 };
137
+ /** The tier whose model each loop depth runs on, whatever tier the column stores. */
138
+ export const RESEARCH_DEPTH_MODEL_TIER = { standard: "low", deep: "medium" };
139
+ /**
140
+ * The tool half of a standard/deep row. `typical` is the ratified planning shape —
141
+ * standard: 2 serper searches + 2 native page reads; deep: 3 serper searches + 4
142
+ * native reads + 1 exa.contents fallback read. `reserved` is every budgeted tool
143
+ * call at its dearest lane — each web_search, the row's shared exa.search pool
144
+ * (standard 1, deep 2: the zero-result fallback and semantic_search draw on it),
145
+ * each read's full ladder, deep's one Firecrawl read and site crawls. Deep's
146
+ * company-news call is opt-in (a news lead-lane column) and adds its own price to
147
+ * the reserve only there. Resolver-derived, pinned like the above.
148
+ */
149
+ export const RESEARCH_DEPTH_GROUNDING_CREDITS = {
150
+ standard: { typical: 1.2, reserved: 7.4 },
151
+ deep: { typical: 2.4, reserved: 17.4 },
152
+ };
153
+ /** Typical per-row totals at each depth's default tier (founder-ratified 2026-09-26). */
154
+ export const RESEARCH_DEPTH_TYPICAL_ROW_CREDITS = { quick: 2.1, standard: 5.5, deep: 10 };
85
155
  /**
86
- * Managed email inboxes: founder-ratified flat price (2026-07-25), superseding
87
- * the earlier dynamic vendor-COGS × 1.25 range. Kept as an object (min/typical/max
88
- * all equal) rather than a bare number so existing callers that destructure any
89
- * 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.
90
171
  */
91
- export const MANAGED_INBOX_MARKUP = SNAPSHOT_MANAGED_INBOX_MARKUP;
92
172
  export const MANAGED_INBOX_CREDITS_PER_MONTH = {
93
173
  min: SNAPSHOT_MANAGED_INBOX_CREDITS_PER_MONTH,
94
174
  typical: SNAPSHOT_MANAGED_INBOX_CREDITS_PER_MONTH,
95
175
  max: SNAPSHOT_MANAGED_INBOX_CREDITS_PER_MONTH,
96
176
  };
97
177
  /**
98
- * VOICE (the call channel). Marked up 5×, not the 1.25× infra rule the inbox and
99
- * domain rails use: a phone number carries ongoing reputation work (warm-up,
100
- * rotation, cap enforcement, health) that a mailbox rail does not, and the
101
- * 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.
102
181
  *
103
- * 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:
104
184
  * browser/app (the rep's WebRTC leg) $0.0040 / min
105
185
  * outbound to a US local/mobile $0.0140 / min
106
186
  * ─────────────
107
- * $0.0180 / min
108
- * 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%.
109
189
  */
110
- export const VOICE_MARKUP = SNAPSHOT_VOICE_MARKUP;
111
190
  export const VOICE_NUMBER_CREDITS_PER_MONTH = SNAPSHOT_VOICE_NUMBER_CREDITS_PER_MONTH;
112
191
  export const VOICE_CREDITS_PER_MINUTE = SNAPSHOT_VOICE_CREDITS_PER_MINUTE;
113
- export const VOICE_CREDITS_PER_AMD_CALL = SNAPSHOT_VOICE_CREDITS_PER_AMD_CALL;
114
- /** Managed domains: registrar at-cost × 1.25 (≈ a $10.44 .com → ~13,050 credits/yr). */
115
- export const MANAGED_DOMAIN_MARKUP = SNAPSHOT_MANAGED_DOMAIN_MARKUP;
116
- 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;
117
198
  /**
118
199
  * Inbox deliverability (EmailGuard placement seat). A flat monthly price per
119
200
  * SUBSCRIBED inbox covering continuous deliverability monitoring (blacklist,
@@ -123,10 +204,16 @@ export const MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL = SNAPSHOT_MANAGED_DOMAIN_C
123
204
  *
124
205
  * THE ALLOWANCE IS LOAD-BEARING, not a perk. Placement COGS is per TEST
125
206
  * ($0.1327 on EmailGuard's Agency plan), not per inbox, so an unbounded seat
126
- * inverts its own margin: at $1.00/inbox-month the EIGHTH test in a cycle is
127
- * already sold at a loss. Two included tests cost $0.265 against $1.00 of
128
- * 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
129
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.
130
217
  */
131
218
  export const DELIVERABILITY_SEAT_CREDITS_PER_MONTH = SNAPSHOT_DELIVERABILITY_SEAT_CREDITS_PER_MONTH;
132
219
  export const DELIVERABILITY_INCLUDED_TESTS_PER_INBOX = SNAPSHOT_DELIVERABILITY_INCLUDED_TESTS_PER_INBOX;
@@ -137,17 +224,28 @@ export const PLACEMENT_TEST_OVERAGE_CREDITS = SNAPSHOT_PLACEMENT_TEST_OVERAGE_CR
137
224
  * price; every per-action charge is 0. Per-MESSAGE sends on email and WhatsApp
138
225
  * stay 0 too — but a connected WhatsApp NUMBER carries its own monthly
139
226
  * connection fee, see WHATSAPP_ACCOUNT_CREDITS_PER_MONTH.
227
+ *
228
+ * The value is the seeded price after the 2026-09 repricing (3,400, decision
229
+ * 2.1). The price in force before its effective-date switch is lower: resolve
230
+ * it with repricedChargeCredits from `@oxygen/shared/repricing` on the server.
140
231
  */
141
232
  export const LINKEDIN_ACCOUNT_CREDITS_PER_MONTH = SNAPSHOT_LINKEDIN_ACCOUNT_CREDITS_PER_MONTH;
142
233
  export const LINKEDIN_ACTION_CREDITS = SNAPSHOT_LINKEDIN_ACTION_CREDITS;
143
234
  export const LINKEDIN_TYPICAL_ACTIONS_CREDITS_PER_MONTH = SNAPSHOT_LINKEDIN_TYPICAL_ACTIONS_CREDITS_PER_MONTH;
144
235
  /**
145
236
  * WhatsApp numbers: flat monthly connection fee per connected number, the same
146
- * seat shape as LinkedIn. Billed off the rolling-30d peak, so a number connected
147
- * part-way through a month still bills the full cycle. WhatsApp message sends
148
- * themselves remain 0 credits.
237
+ * seat shape as LinkedIn. WhatsApp message sends themselves remain 0 credits.
238
+ * Seeded at the 2026-09 repricing's price (3,000, decision 2.3); resolve the
239
+ * price in force with repricedChargeCredits.
149
240
  */
150
241
  export const WHATSAPP_ACCOUNT_CREDITS_PER_MONTH = SNAPSHOT_WHATSAPP_ACCOUNT_CREDITS_PER_MONTH;
242
+ /**
243
+ * X accounts: monthly credit reservation per connected account (2026-09
244
+ * repricing, decision 2.2). Like the LinkedIn and WhatsApp constants above this
245
+ * is the seeded, post-repricing price; show the price in force with
246
+ * repricedChargeCredits from `@oxygen/shared/repricing`.
247
+ */
248
+ export const X_ACCOUNT_CREDITS_PER_MONTH = SNAPSHOT_X_ACCOUNT_CREDITS_PER_MONTH;
151
249
  /** Dedicated egress IP add-on. */
152
250
  export const EGRESS_IP_CREDITS_PER_MONTH = SNAPSHOT_EGRESS_IP_CREDITS_PER_MONTH;
153
251
  /**
@@ -173,7 +271,7 @@ export const ENRICHMENT_CREDITS = {
173
271
  phone_find_typical: 99, // Prospeo/Findymail-class mobile
174
272
  company_enrich_typical: 9.9,
175
273
  web_search: 0.5, // Serper
176
- page_scrape: 4, // Firecrawl (wedge price)
274
+ page_scrape: 1.6, // Firecrawl, 5x of $0.0032 (repricing 2026-09, S44)
177
275
  linkedin_profile_scrape: 1, // Managed profile credit at $0.002 COGS, exactly 5x
178
276
  };
179
277
  /** Editable calculator default: blended credits per fully-enriched row. */