@oxygen-agent/cli 1.310.2 → 1.334.3

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 (30) hide show
  1. package/README.md +1 -1
  2. package/dist/command-manifest.js +26 -10
  3. package/dist/help.js +7 -0
  4. package/dist/index.d.ts +1 -0
  5. package/dist/index.js +2077 -134
  6. package/dist/runtime.js +13 -3
  7. package/dist/skills.js +192 -32
  8. package/node_modules/@oxygen/recipe-sdk/dist/index.d.ts +2 -0
  9. package/node_modules/@oxygen/shared/dist/billing.d.ts +52 -29
  10. package/node_modules/@oxygen/shared/dist/billing.js +77 -55
  11. package/node_modules/@oxygen/shared/dist/index.d.ts +4 -0
  12. package/node_modules/@oxygen/shared/dist/index.js +4 -0
  13. package/node_modules/@oxygen/shared/dist/pricing-sheet.d.ts +84 -0
  14. package/node_modules/@oxygen/shared/dist/pricing-sheet.js +82 -0
  15. package/node_modules/@oxygen/shared/dist/recipes.d.ts +19 -0
  16. package/node_modules/@oxygen/shared/dist/recipes.js +90 -0
  17. package/node_modules/@oxygen/shared/dist/sequences.d.ts +61 -15
  18. package/node_modules/@oxygen/shared/dist/sequences.js +134 -23
  19. package/node_modules/@oxygen/shared/dist/sql-error.d.ts +25 -0
  20. package/node_modules/@oxygen/shared/dist/sql-error.js +46 -0
  21. package/node_modules/@oxygen/shared/dist/version.d.ts +2 -2
  22. package/node_modules/@oxygen/shared/dist/version.js +13 -11
  23. package/node_modules/@oxygen/shared/dist/workflow-mcp-tools.d.ts +4 -0
  24. package/node_modules/@oxygen/shared/dist/workflow-mcp-tools.js +18 -0
  25. package/node_modules/@oxygen/shared/dist/workflow-status-change.d.ts +61 -0
  26. package/node_modules/@oxygen/shared/dist/workflow-status-change.js +124 -0
  27. package/node_modules/@oxygen/shared/dist/workspace-agents.d.ts +65 -0
  28. package/node_modules/@oxygen/shared/dist/workspace-agents.js +67 -0
  29. package/node_modules/@oxygen/workflows/dist/index.js +86 -2
  30. package/package.json +1 -1
@@ -2,21 +2,43 @@ export const WEEKLY_USAGE_WINDOW_DAYS = 7;
2
2
  export const BILLING_CURRENCIES = ["usd"];
3
3
  export const DEFAULT_BILLING_CURRENCY = "usd";
4
4
  export const CONTACT_SALES_URL = "https://cal.com/tim-scheuer-mxbib9/45";
5
+ // One Oxygen credit is worth $0.001 of managed work: $1 = 1,000 credits.
6
+ // Subscription plans convert at face value — every subscription dollar grants
7
+ // exactly 1,000 credits — while on-demand top-up packs price the same credit
8
+ // at $1.25 per 1,000, making subscription credits exactly 20% cheaper than
9
+ // credits bought on demand.
10
+ export const CREDITS_PER_USD = 1_000;
11
+ export const TOPUP_USD_CENTS_PER_1K_CREDITS = 125;
12
+ // Workflow/automation actions (steps, tool calls, row writes, retries) draw
13
+ // from the same credit pool at a flat capacity-guard rate — the old separate
14
+ // monthly action allowance + USD overage meter economy is retired (2026-07-14).
15
+ export const AUTOMATION_ACTION_CREDITS = 0.01;
16
+ export const CREDIT_TOPUP_PACKS = [
17
+ { id: "10", usdCents: 1_000, credits: 8_000 },
18
+ { id: "25", usdCents: 2_500, credits: 20_000 },
19
+ { id: "100", usdCents: 10_000, credits: 80_000 },
20
+ { id: "250", usdCents: 25_000, credits: 200_000 },
21
+ ];
22
+ export function resolveCreditTopupPack(id) {
23
+ if (!id)
24
+ return null;
25
+ return CREDIT_TOPUP_PACKS.find((pack) => pack.id === id) ?? null;
26
+ }
5
27
  // Card-required free trial: every new signup starts a Stripe trial on the Starter
6
28
  // plan, gets TRIAL_CREDIT_GRANT credits (a value-demonstration budget sized to the
7
29
  // guided first outcome — NOT the full plan allowance), and converts to paid on
8
30
  // credit exhaustion or when the trial clock elapses, whichever comes first.
9
31
  export const TRIAL_PERIOD_DAYS = 7;
10
- export const TRIAL_CREDIT_GRANT = 1_000;
32
+ export const TRIAL_CREDIT_GRANT = 20_000;
11
33
  export const BASE_PRICING_PLANS = {
12
34
  free: {
13
35
  tier: "free",
14
36
  name: "Free",
15
37
  monthlyPriceCents: 0,
16
- monthlyCredits: 500,
17
- weeklyCreditsLimit: 500,
18
- rolloverCap: 500,
19
- monthlyAutomationActions: 10_000,
38
+ monthlyCredits: 10_000,
39
+ weeklyCreditsLimit: 10_000,
40
+ rolloverCap: 10_000,
41
+ monthlyAutomationActions: null,
20
42
  automationOverageCentsPerMillion: null,
21
43
  automationOverageEnabledDefault: false,
22
44
  byokEnabled: false,
@@ -24,7 +46,7 @@ export const BASE_PRICING_PLANS = {
24
46
  ctaLabel: "Start free",
25
47
  features: [
26
48
  "$10 in credits every month",
27
- "10,000 automation actions / month",
49
+ "Automation actions at 0.01 credits each",
28
50
  "All integrations",
29
51
  "Workflows",
30
52
  "No card required",
@@ -34,20 +56,20 @@ export const BASE_PRICING_PLANS = {
34
56
  tier: "starter",
35
57
  name: "Starter",
36
58
  monthlyPriceCents: 9_900,
37
- monthlyCredits: 5_000,
38
- weeklyCreditsLimit: 2_000,
39
- rolloverCap: 5_000,
40
- monthlyAutomationActions: 250_000,
41
- automationOverageCentsPerMillion: 1_000,
59
+ monthlyCredits: 99_000,
60
+ weeklyCreditsLimit: 40_000,
61
+ rolloverCap: 99_000,
62
+ monthlyAutomationActions: null,
63
+ automationOverageCentsPerMillion: null,
42
64
  automationOverageEnabledDefault: false,
43
65
  byokEnabled: true,
44
66
  description: "For founders running focused managed enrichment and AI columns.",
45
67
  ctaLabel: "Choose Starter",
46
68
  features: [
69
+ "99,000 credits every month",
47
70
  "All integrations",
48
- "250,000 automation actions / month",
71
+ "Workflows — automation actions at 0.01 credits each",
49
72
  "Bring your own keys",
50
- "Workflows",
51
73
  "Standard support",
52
74
  ],
53
75
  },
@@ -55,11 +77,11 @@ export const BASE_PRICING_PLANS = {
55
77
  tier: "pro",
56
78
  name: "Pro",
57
79
  monthlyPriceCents: 24_900,
58
- monthlyCredits: 12_500,
59
- weeklyCreditsLimit: 5_000,
60
- rolloverCap: 12_500,
61
- monthlyAutomationActions: 2_000_000,
62
- automationOverageCentsPerMillion: 1_000,
80
+ monthlyCredits: 249_000,
81
+ weeklyCreditsLimit: 100_000,
82
+ rolloverCap: 249_000,
83
+ monthlyAutomationActions: null,
84
+ automationOverageCentsPerMillion: null,
63
85
  automationOverageEnabledDefault: false,
64
86
  byokEnabled: true,
65
87
  description: "For recurring GTM enrichment and AI-column workflows on managed credits.",
@@ -67,10 +89,10 @@ export const BASE_PRICING_PLANS = {
67
89
  highlighted: true,
68
90
  ctaLabel: "Choose Pro",
69
91
  features: [
92
+ "249,000 credits every month",
70
93
  "All integrations",
71
- "2,000,000 automation actions / month",
94
+ "Workflows — automation actions at 0.01 credits each",
72
95
  "Bring your own keys",
73
- "Workflows",
74
96
  "Standard support",
75
97
  ],
76
98
  },
@@ -78,20 +100,20 @@ export const BASE_PRICING_PLANS = {
78
100
  tier: "team",
79
101
  name: "Team",
80
102
  monthlyPriceCents: 74_900,
81
- monthlyCredits: 37_500,
82
- weeklyCreditsLimit: 15_000,
83
- rolloverCap: 37_500,
84
- monthlyAutomationActions: 10_000_000,
85
- automationOverageCentsPerMillion: 500,
103
+ monthlyCredits: 749_000,
104
+ weeklyCreditsLimit: 300_000,
105
+ rolloverCap: 749_000,
106
+ monthlyAutomationActions: null,
107
+ automationOverageCentsPerMillion: null,
86
108
  automationOverageEnabledDefault: false,
87
109
  byokEnabled: true,
88
110
  description: "For small GTM teams and agencies running shared workflows with their own AI keys.",
89
111
  ctaLabel: "Choose Team",
90
112
  features: [
113
+ "749,000 credits every month",
91
114
  "All integrations",
92
- "10,000,000 automation actions / month",
115
+ "Workflows — automation actions at 0.01 credits each",
93
116
  "Bring your own keys",
94
- "Workflows",
95
117
  "Premium support",
96
118
  ],
97
119
  },
@@ -99,10 +121,10 @@ export const BASE_PRICING_PLANS = {
99
121
  tier: "scale",
100
122
  name: "Scale",
101
123
  monthlyPriceCents: null,
102
- monthlyCredits: 500_000,
103
- weeklyCreditsLimit: 500_000,
104
- rolloverCap: 500_000,
105
- monthlyAutomationActions: 50_000_000,
124
+ monthlyCredits: 10_000_000,
125
+ weeklyCreditsLimit: 10_000_000,
126
+ rolloverCap: 10_000_000,
127
+ monthlyAutomationActions: null,
106
128
  automationOverageCentsPerMillion: null,
107
129
  automationOverageEnabledDefault: false,
108
130
  byokEnabled: true,
@@ -110,8 +132,8 @@ export const BASE_PRICING_PLANS = {
110
132
  ctaLabel: "Contact sales",
111
133
  contactHref: CONTACT_SALES_URL,
112
134
  features: [
113
- "500,000+ managed credits / month",
114
- "50,000,000+ automation actions / month",
135
+ "10,000,000+ managed credits / month",
136
+ "Automation actions at 0.01 credits each",
115
137
  "Phone number enrichment on managed credits",
116
138
  "Custom provider routing and BYOK policies",
117
139
  "Dedicated onboarding",
@@ -164,69 +186,69 @@ const LEGACY_PRICING_PLAN_OVERRIDES = {
164
186
  ...BASE_PRICING_PLANS.starter,
165
187
  name: "Legacy Launch",
166
188
  monthlyPriceCents: 5_000,
167
- monthlyCredits: 10_000,
168
- weeklyCreditsLimit: 10_000,
169
- rolloverCap: 10_000,
189
+ monthlyCredits: 200_000,
190
+ weeklyCreditsLimit: 200_000,
191
+ rolloverCap: 200_000,
170
192
  description: "Legacy Launch plan.",
171
193
  },
172
194
  starter_50: {
173
195
  ...BASE_PRICING_PLANS.starter,
174
196
  name: "Legacy Starter",
175
197
  monthlyPriceCents: 5_000,
176
- monthlyCredits: 10_000,
177
- weeklyCreditsLimit: 10_000,
178
- rolloverCap: 10_000,
198
+ monthlyCredits: 200_000,
199
+ weeklyCreditsLimit: 200_000,
200
+ rolloverCap: 200_000,
179
201
  description: "Legacy Starter plan.",
180
202
  },
181
203
  pro_149: {
182
204
  ...BASE_PRICING_PLANS.pro,
183
205
  name: "Legacy Pro",
184
206
  monthlyPriceCents: 14_900,
185
- monthlyCredits: 50_000,
186
- weeklyCreditsLimit: 50_000,
187
- rolloverCap: 50_000,
207
+ monthlyCredits: 1_000_000,
208
+ weeklyCreditsLimit: 1_000_000,
209
+ rolloverCap: 1_000_000,
188
210
  description: "Legacy Pro plan.",
189
211
  },
190
212
  team_399: {
191
213
  ...BASE_PRICING_PLANS.team,
192
214
  name: "Legacy Team",
193
215
  monthlyPriceCents: 39_900,
194
- monthlyCredits: 150_000,
195
- weeklyCreditsLimit: 150_000,
196
- rolloverCap: 150_000,
216
+ monthlyCredits: 3_000_000,
217
+ weeklyCreditsLimit: 3_000_000,
218
+ rolloverCap: 3_000_000,
197
219
  description: "Legacy Team plan.",
198
220
  },
199
221
  growth_250: {
200
222
  ...BASE_PRICING_PLANS.pro,
201
223
  monthlyPriceCents: 25_000,
202
- monthlyCredits: 12_500,
203
- weeklyCreditsLimit: 5_000,
204
- rolloverCap: 12_500,
224
+ monthlyCredits: 250_000,
225
+ weeklyCreditsLimit: 100_000,
226
+ rolloverCap: 250_000,
205
227
  description: "Legacy Growth plan.",
206
228
  },
207
229
  scale_750: {
208
230
  ...BASE_PRICING_PLANS.team,
209
231
  name: "Legacy Scale",
210
232
  monthlyPriceCents: 75_000,
211
- monthlyCredits: 37_500,
212
- weeklyCreditsLimit: 15_000,
213
- rolloverCap: 37_500,
233
+ monthlyCredits: 750_000,
234
+ weeklyCreditsLimit: 300_000,
235
+ rolloverCap: 750_000,
214
236
  description: "Legacy Scale plan.",
215
237
  },
216
238
  starter_legacy: {
217
239
  ...BASE_PRICING_PLANS.starter,
218
240
  monthlyPriceCents: null,
219
- monthlyCredits: 10_000,
241
+ monthlyCredits: 200_000,
220
242
  weeklyCreditsLimit: BASE_PRICING_PLANS.starter.weeklyCreditsLimit,
221
- rolloverCap: 10_000,
243
+ rolloverCap: 200_000,
222
244
  description: "Legacy Starter plan.",
223
245
  },
224
246
  scale_legacy: {
225
247
  ...BASE_PRICING_PLANS.scale,
226
248
  monthlyPriceCents: null,
227
- monthlyCredits: 60_000,
249
+ monthlyCredits: 1_200_000,
228
250
  weeklyCreditsLimit: BASE_PRICING_PLANS.scale.weeklyCreditsLimit,
229
- rolloverCap: 120_000,
251
+ rolloverCap: 2_400_000,
230
252
  description: "Legacy Scale plan.",
231
253
  },
232
254
  };
@@ -1,5 +1,6 @@
1
1
  export { MANAGED_INBOX_MINIMUM_CLI_VERSION, OXYGEN_MINIMUM_CLI_VERSION, OXYGEN_VERSION, } from "./version.js";
2
2
  export { WORKFLOW_TRIGGER_AUTO_PAUSE_METADATA_KEYS, clearWorkflowTriggerAutoPauseMetadata, } from "./workflow-trigger-metadata.js";
3
+ export { WORKFLOW_STATUS_CHANGE_METADATA_KEY, type WorkflowStatusChange, type WorkflowStatusChangeActor, type WorkflowStatusChangeSource, describeWorkflowStatusChange, formatWorkflowStatusChangeTimestamp, parseWorkflowStatusChange, readWorkflowStatusChange, } from "./workflow-status-change.js";
3
4
  export * from "./billing.js";
4
5
  export * from "./budget-scopes.js";
5
6
  export * from "./cell-format.js";
@@ -20,6 +21,7 @@ export * from "./linkedin-post-url.js";
20
21
  export * from "./linkedin-url.js";
21
22
  export * from "./linkedin-sequences.js";
22
23
  export * from "./networks.js";
24
+ export * from "./recipes.js";
23
25
  export * from "./sequence-template.js";
24
26
  export * from "./sequences.js";
25
27
  export * from "./log.js";
@@ -31,6 +33,8 @@ export * from "./tenant-database-secret.js";
31
33
  export * from "./timing.js";
32
34
  export * from "./type-guards.js";
33
35
  export * from "./worker-failures-queue.js";
36
+ export * from "./workflow-mcp-tools.js";
37
+ export * from "./workspace-agents.js";
34
38
  export declare const MAX_ROW_LOOP_WRITE_ROWS = 500;
35
39
  export type SemanticVersion = {
36
40
  major: number;
@@ -1,5 +1,6 @@
1
1
  export { MANAGED_INBOX_MINIMUM_CLI_VERSION, OXYGEN_MINIMUM_CLI_VERSION, OXYGEN_VERSION, } from "./version.js";
2
2
  export { WORKFLOW_TRIGGER_AUTO_PAUSE_METADATA_KEYS, clearWorkflowTriggerAutoPauseMetadata, } from "./workflow-trigger-metadata.js";
3
+ export { WORKFLOW_STATUS_CHANGE_METADATA_KEY, describeWorkflowStatusChange, formatWorkflowStatusChangeTimestamp, parseWorkflowStatusChange, readWorkflowStatusChange, } from "./workflow-status-change.js";
3
4
  export * from "./billing.js";
4
5
  export * from "./budget-scopes.js";
5
6
  export * from "./cell-format.js";
@@ -20,6 +21,7 @@ export * from "./linkedin-post-url.js";
20
21
  export * from "./linkedin-url.js";
21
22
  export * from "./linkedin-sequences.js";
22
23
  export * from "./networks.js";
24
+ export * from "./recipes.js";
23
25
  export * from "./sequence-template.js";
24
26
  export * from "./sequences.js";
25
27
  export * from "./log.js";
@@ -31,6 +33,8 @@ export * from "./tenant-database-secret.js";
31
33
  export * from "./timing.js";
32
34
  export * from "./type-guards.js";
33
35
  export * from "./worker-failures-queue.js";
36
+ export * from "./workflow-mcp-tools.js";
37
+ export * from "./workspace-agents.js";
34
38
  // Maximum rows a single row-loop write (insert/upsert/preview) may process. The
35
39
  // row-loop engine issues one DB round-trip per row, so a 500-row write already
36
40
  // approaches request timeouts (~50s observed in prod); larger batches must use
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Customer-facing credit price sheet — the single source for the /pricing
3
+ * page's "what credits buy" table, the pricing calculator, and docs.
4
+ *
5
+ * Pricing Model 2.0 (founder-ratified 2026-07-14): ONE credit pool pays for
6
+ * everything; 1 USD = 1,000 credits (CREDITS_PER_USD in ./billing.ts).
7
+ * Representative values here mirror the canonical billing sources — the
8
+ * enrichment/AI resolver seed (packages/integrations/src/cogs-rates.ts), the
9
+ * infra cost-plus rules (vendor COGS × 1.25), and the ratified LinkedIn
10
+ * prices — as DISPLAY constants. If a canonical price moves, move it here in
11
+ * the same change.
12
+ *
13
+ * Dependency-free on purpose: this module is imported by "use client"
14
+ * marketing components via the `@oxygen/shared/pricing-sheet` subpath, so it
15
+ * must never drag the shared barrel (async_hooks etc.) into a client bundle.
16
+ */
17
+ export declare const PRICING_SHEET_VERIFIED = "2026-07";
18
+ /** Mirror of CREDITS_PER_USD in ./billing.ts (kept literal: client-safe module). */
19
+ export declare const PRICING_CREDITS_PER_USD = 1000;
20
+ /** On-demand top-up price per 1,000 credits (USD); subscriptions pay $1.00. */
21
+ export declare const TOPUP_USD_PER_1K = 1.25;
22
+ export declare const SUBSCRIPTION_USD_PER_1K = 1;
23
+ /** AI column runs, honest 5× of modeled tier COGS. */
24
+ export declare const AI_COLUMN_CREDITS: {
25
+ readonly low: 15;
26
+ readonly medium: 75;
27
+ readonly high: 250;
28
+ };
29
+ export declare const AI_COLUMN_WEB_SEARCH_SURCHARGE_CREDITS = 25;
30
+ /** Workflow/automation actions (steps, tool calls, row writes) — capacity guard. */
31
+ export declare const AUTOMATION_ACTION_CREDITS = 0.01;
32
+ /**
33
+ * Managed email inboxes: dynamic vendor COGS × 1.25 per mailbox per month.
34
+ * The representative range reflects the current InboxKit rate card (incl. its
35
+ * native warmup network); the exact quote comes from the live rate card at
36
+ * order time.
37
+ */
38
+ export declare const MANAGED_INBOX_MARKUP = 1.25;
39
+ export declare const MANAGED_INBOX_CREDITS_PER_MONTH: {
40
+ readonly min: 3100;
41
+ readonly typical: 3750;
42
+ readonly max: 5000;
43
+ };
44
+ /** Managed domains: registrar at-cost × 1.25 (≈ a $10.44 .com → ~13,050 credits/yr). */
45
+ export declare const MANAGED_DOMAIN_MARKUP = 1.25;
46
+ export declare const MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL = 13050;
47
+ /**
48
+ * LinkedIn accounts (2026-07-14 decision): flat monthly connection fee per
49
+ * connected account plus per-action charges. Sends on email/WhatsApp stay 0.
50
+ */
51
+ export declare const LINKEDIN_ACCOUNT_CREDITS_PER_MONTH = 7000;
52
+ export declare const LINKEDIN_ACTION_CREDITS: {
53
+ readonly visit_profile: 1;
54
+ readonly invite: 4;
55
+ readonly message: 2;
56
+ readonly inmail: 4;
57
+ readonly follow: 1;
58
+ readonly like_post: 2;
59
+ readonly comment_post: 6;
60
+ };
61
+ /** Editable calculator default: a warmed account's typical monthly action mix. */
62
+ export declare const LINKEDIN_TYPICAL_ACTIONS_CREDITS_PER_MONTH = 1500;
63
+ /** Dedicated egress IP add-on. */
64
+ export declare const EGRESS_IP_CREDITS_PER_MONTH = 400000;
65
+ /** Email + WhatsApp sends cost nothing — the pool pays for inboxes, not sends. */
66
+ export declare const SEND_CREDITS = 0;
67
+ /**
68
+ * Representative enrichment prices (5× provider COGS via the resolver; the
69
+ * live per-operation table is served by /api/pricing/customer-credit-prices).
70
+ * "typical" = the cheap-first waterfall's common case, used by the calculator.
71
+ */
72
+ export declare const ENRICHMENT_CREDITS: {
73
+ readonly email_verify: 2;
74
+ readonly email_find_typical: 85;
75
+ readonly phone_find_typical: 990;
76
+ readonly company_enrich_typical: 99;
77
+ readonly web_search: 5;
78
+ readonly page_scrape: 40;
79
+ readonly linkedin_profile_scrape: 10;
80
+ };
81
+ /** Editable calculator default: blended credits per fully-enriched row. */
82
+ export declare const ENRICHMENT_CREDITS_PER_ROW_TYPICAL = 100;
83
+ export declare function creditsToUsd(credits: number): number;
84
+ export declare function usdToCredits(usd: number): number;
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Customer-facing credit price sheet — the single source for the /pricing
3
+ * page's "what credits buy" table, the pricing calculator, and docs.
4
+ *
5
+ * Pricing Model 2.0 (founder-ratified 2026-07-14): ONE credit pool pays for
6
+ * everything; 1 USD = 1,000 credits (CREDITS_PER_USD in ./billing.ts).
7
+ * Representative values here mirror the canonical billing sources — the
8
+ * enrichment/AI resolver seed (packages/integrations/src/cogs-rates.ts), the
9
+ * infra cost-plus rules (vendor COGS × 1.25), and the ratified LinkedIn
10
+ * prices — as DISPLAY constants. If a canonical price moves, move it here in
11
+ * the same change.
12
+ *
13
+ * Dependency-free on purpose: this module is imported by "use client"
14
+ * marketing components via the `@oxygen/shared/pricing-sheet` subpath, so it
15
+ * must never drag the shared barrel (async_hooks etc.) into a client bundle.
16
+ */
17
+ export const PRICING_SHEET_VERIFIED = "2026-07";
18
+ /** Mirror of CREDITS_PER_USD in ./billing.ts (kept literal: client-safe module). */
19
+ export const PRICING_CREDITS_PER_USD = 1_000;
20
+ /** On-demand top-up price per 1,000 credits (USD); subscriptions pay $1.00. */
21
+ export const TOPUP_USD_PER_1K = 1.25;
22
+ export const SUBSCRIPTION_USD_PER_1K = 1.0;
23
+ /** AI column runs, honest 5× of modeled tier COGS. */
24
+ export const AI_COLUMN_CREDITS = { low: 15, medium: 75, high: 250 };
25
+ export const AI_COLUMN_WEB_SEARCH_SURCHARGE_CREDITS = 25;
26
+ /** Workflow/automation actions (steps, tool calls, row writes) — capacity guard. */
27
+ export const AUTOMATION_ACTION_CREDITS = 0.01;
28
+ /**
29
+ * Managed email inboxes: dynamic vendor COGS × 1.25 per mailbox per month.
30
+ * The representative range reflects the current InboxKit rate card (incl. its
31
+ * native warmup network); the exact quote comes from the live rate card at
32
+ * order time.
33
+ */
34
+ export const MANAGED_INBOX_MARKUP = 1.25;
35
+ // Range reflects the live InboxKit rate card: Google mailboxes $2.48–3.99 by
36
+ // plan tier (×1.25 → 3,100–4,990 cr), Microsoft/Azure flat $5 (×1.25 → 6,250).
37
+ export const MANAGED_INBOX_CREDITS_PER_MONTH = { min: 3_100, typical: 3_750, max: 5_000 };
38
+ /** Managed domains: registrar at-cost × 1.25 (≈ a $10.44 .com → ~13,050 credits/yr). */
39
+ export const MANAGED_DOMAIN_MARKUP = 1.25;
40
+ export const MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL = 13_050;
41
+ /**
42
+ * LinkedIn accounts (2026-07-14 decision): flat monthly connection fee per
43
+ * connected account plus per-action charges. Sends on email/WhatsApp stay 0.
44
+ */
45
+ export const LINKEDIN_ACCOUNT_CREDITS_PER_MONTH = 7_000;
46
+ export const LINKEDIN_ACTION_CREDITS = {
47
+ visit_profile: 1,
48
+ invite: 4,
49
+ message: 2,
50
+ inmail: 4,
51
+ follow: 1,
52
+ like_post: 2,
53
+ comment_post: 6,
54
+ };
55
+ /** Editable calculator default: a warmed account's typical monthly action mix. */
56
+ export const LINKEDIN_TYPICAL_ACTIONS_CREDITS_PER_MONTH = 1_500;
57
+ /** Dedicated egress IP add-on. */
58
+ export const EGRESS_IP_CREDITS_PER_MONTH = 400_000;
59
+ /** Email + WhatsApp sends cost nothing — the pool pays for inboxes, not sends. */
60
+ export const SEND_CREDITS = 0;
61
+ /**
62
+ * Representative enrichment prices (5× provider COGS via the resolver; the
63
+ * live per-operation table is served by /api/pricing/customer-credit-prices).
64
+ * "typical" = the cheap-first waterfall's common case, used by the calculator.
65
+ */
66
+ export const ENRICHMENT_CREDITS = {
67
+ email_verify: 2, // MillionVerifier first pass
68
+ email_find_typical: 85, // Hunter-class finder; cheap waterfall steps run 10–99
69
+ phone_find_typical: 990, // Prospeo/Findymail-class mobile
70
+ company_enrich_typical: 99,
71
+ web_search: 5, // Serper
72
+ page_scrape: 40, // Firecrawl (wedge price)
73
+ linkedin_profile_scrape: 10, // HarvestAPI, per result
74
+ };
75
+ /** Editable calculator default: blended credits per fully-enriched row. */
76
+ export const ENRICHMENT_CREDITS_PER_ROW_TYPICAL = 100;
77
+ export function creditsToUsd(credits) {
78
+ return credits / PRICING_CREDITS_PER_USD;
79
+ }
80
+ export function usdToCredits(usd) {
81
+ return usd * PRICING_CREDITS_PER_USD;
82
+ }
@@ -0,0 +1,19 @@
1
+ export declare const RECIPE_CATEGORIES: readonly ["start-here", "pipeline-from-zero", "catch-warm-signals", "linkedin-engine", "convert-faster", "revenue-truth", "agency-scale"];
2
+ export type RecipeCategory = typeof RECIPE_CATEGORIES[number];
3
+ export declare const RECIPE_CATEGORY_QUESTIONS: Record<RecipeCategory, string>;
4
+ export declare const RECIPE_STAGES: readonly ["day-1", "day-7", "day-30", "ongoing"];
5
+ export type RecipeStage = typeof RECIPE_STAGES[number];
6
+ export declare const RECIPE_AUDIENCES: readonly ["founder", "gtm-operator", "agency-operator"];
7
+ export type RecipeAudience = typeof RECIPE_AUDIENCES[number];
8
+ export declare const RECIPE_STATUSES: readonly ["draft", "beta", "stable", "deprecated"];
9
+ export type RecipeStatus = typeof RECIPE_STATUSES[number];
10
+ export declare const RECIPE_BENCHMARK_BASES: readonly ["estimate", "observed"];
11
+ export type RecipeBenchmarkBasis = typeof RECIPE_BENCHMARK_BASES[number];
12
+ export declare const RECIPE_PRIMITIVES: readonly ["knowledge-graph", "recipes", "records", "tables", "messages", "posts", "signals", "dashboards", "ads", "sequences", "publishing", "workflows", "observability"];
13
+ export type RecipePrimitive = typeof RECIPE_PRIMITIVES[number];
14
+ export declare const RECIPE_PREREQUISITE_KINDS: readonly ["sender", "mailbox", "domain", "integration", "knowledge", "asset", "plan", "data"];
15
+ export type RecipePrerequisiteKind = typeof RECIPE_PREREQUISITE_KINDS[number];
16
+ export declare const RECIPE_BODY_SECTIONS: readonly ["The Play", "What You Get", "When To Run (And When Not To)", "Before You Start", "Steps", "Ready Assets", "Calibrate", "Troubleshooting", "Operator Notes", "Related"];
17
+ export declare const RECIPE_SLUG_PATTERN: RegExp;
18
+ export declare function recipeWikiSlug(recipeSlug: string): string;
19
+ export declare const RECIPE_TRIAL_SAFE_PILOT_CREDIT_CAP = 100;
@@ -0,0 +1,90 @@
1
+ // Recipes (Knowledge layer) shared constants — the single source of truth for
2
+ // the recipe catalog's controlled vocabularies across every surface (catalog
3
+ // parser/lint in apps/web, /api/cli/recipes routes, CLI, MCP tools, web
4
+ // gallery). A recipe is a versioned, advisory, business-case-driven GTM
5
+ // playbook served as skill markdown; these enums are the frontmatter contract
6
+ // (see docs/primitives/recipes.md). Keep additions deliberate: categories are
7
+ // the gallery's spine and expensive to rename once published.
8
+ // The seven business-case categories, each phrased from the founder question
9
+ // it answers. Order here is display order on every surface.
10
+ export const RECIPE_CATEGORIES = [
11
+ "start-here",
12
+ "pipeline-from-zero",
13
+ "catch-warm-signals",
14
+ "linkedin-engine",
15
+ "convert-faster",
16
+ "revenue-truth",
17
+ "agency-scale",
18
+ ];
19
+ export const RECIPE_CATEGORY_QUESTIONS = {
20
+ "start-here": "I just signed up — what do I actually do with this?",
21
+ "pipeline-from-zero": "I have no pipeline. Build me an outbound engine.",
22
+ "catch-warm-signals": "People already touch us or move in our market — turn that into pipeline.",
23
+ "linkedin-engine": "How do I grow a LinkedIn presence that produces leads, not likes?",
24
+ "convert-faster": "I get leads and replies but not meetings.",
25
+ "revenue-truth": "Keep my CRM clean, my funnel visible, my costs sane.",
26
+ "agency-scale": "I run this for clients — how do I scale across workspaces?",
27
+ };
28
+ // Journey stage: when in a workspace's life the play typically fires.
29
+ export const RECIPE_STAGES = ["day-1", "day-7", "day-30", "ongoing"];
30
+ export const RECIPE_AUDIENCES = [
31
+ "founder",
32
+ "gtm-operator",
33
+ "agency-operator",
34
+ ];
35
+ export const RECIPE_STATUSES = ["draft", "beta", "stable", "deprecated"];
36
+ // Whether a benchmark range is a labeled conservative estimate or observed
37
+ // Oxygen cohort data (with provenance). Estimates are the launch posture;
38
+ // observed values replace them as real usage accrues.
39
+ export const RECIPE_BENCHMARK_BASES = ["estimate", "observed"];
40
+ // The thirteen product primitives a recipe may exercise (five-layer model,
41
+ // ADR 0006/0008). Control surfaces and External integrations are not
42
+ // primitives and never appear here.
43
+ export const RECIPE_PRIMITIVES = [
44
+ "knowledge-graph",
45
+ "recipes",
46
+ "records",
47
+ "tables",
48
+ "messages",
49
+ "posts",
50
+ "signals",
51
+ "dashboards",
52
+ "ads",
53
+ "sequences",
54
+ "publishing",
55
+ "workflows",
56
+ "observability",
57
+ ];
58
+ export const RECIPE_PREREQUISITE_KINDS = [
59
+ "sender",
60
+ "mailbox",
61
+ "domain",
62
+ "integration",
63
+ "knowledge",
64
+ "asset",
65
+ "plan",
66
+ "data",
67
+ ];
68
+ // The ten body sections every recipe carries, in order. The catalog lint
69
+ // enforces exact H2 headings so the fleet of authors cannot drift.
70
+ export const RECIPE_BODY_SECTIONS = [
71
+ "The Play",
72
+ "What You Get",
73
+ "When To Run (And When Not To)",
74
+ "Before You Start",
75
+ "Steps",
76
+ "Ready Assets",
77
+ "Calibrate",
78
+ "Troubleshooting",
79
+ "Operator Notes",
80
+ "Related",
81
+ ];
82
+ export const RECIPE_SLUG_PATTERN = /^[a-z0-9][a-z0-9-]{0,119}$/;
83
+ // Wiki slug an install writes: slots into the starter wiki's seeded
84
+ // [[playbooks]] hub convention ([[playbook-outbound]] etc.).
85
+ export function recipeWikiSlug(recipeSlug) {
86
+ return `playbook-${recipeSlug}`;
87
+ }
88
+ // trial_safe recipes must keep their pilot path within 10% of the 7-day
89
+ // card-required trial's 1,000 managed credits.
90
+ export const RECIPE_TRIAL_SAFE_PILOT_CREDIT_CAP = 100;