@oxygen-agent/cli 1.1014.118 → 1.1014.120

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -34,4 +34,4 @@ oxygen update
34
34
 
35
35
  For product documentation, visit https://oxygen-agent.com/docs. For support, visit https://oxygen-agent.com.
36
36
 
37
- Version: 1.1014.118
37
+ Version: 1.1014.120
package/dist/index.js CHANGED
@@ -1646,14 +1646,6 @@ function writeMaxCreditsHint(error) {
1646
1646
  if (reservation === null)
1647
1647
  return;
1648
1648
  const nextStep = readDetailsString(error.details, "next_step");
1649
- // A free workspace connecting LinkedIn is sent to the plan, not to a top-up (2026-10-11).
1650
- if (readDetailsString(error.details, "remedy") === "subscribe") {
1651
- const upgradeUrl = readDetailsString(error.details, "upgrade_url");
1652
- process.stderr.write(`hint: this connect reserves ${reservation} credits a month; subscribe to the Oxygen plan, then connect again\n`);
1653
- if (upgradeUrl)
1654
- process.stderr.write(`hint: choose a plan at ${upgradeUrl}\n`);
1655
- return;
1656
- }
1657
1649
  const topupUrl = readDetailsString(error.details, "topup_url");
1658
1650
  process.stderr.write(`hint: this connect reserves ${reservation} credits a month; add credits, then connect again\n`);
1659
1651
  if (nextStep)
@@ -363,7 +363,7 @@ export declare const BASE_PRICING_PLANS: {
363
363
  readonly monthlyAutomationActions: null;
364
364
  readonly automationOverageCentsPerMillion: null;
365
365
  readonly automationOverageEnabledDefault: false;
366
- readonly description: "Your CRM and tables — free forever. Credits pay for enrichment, AI and workflow steps; your own provider keys need a paid plan.";
366
+ readonly description: "Your CRM and tables — free forever. Credits pay for enrichment, AI and workflow steps; a LinkedIn account and your own provider keys need a paid plan.";
367
367
  readonly ctaLabel: "Upgrade";
368
368
  readonly features: readonly ["CRM, Tables, and Knowledge — unmetered; workflows pay per step", "Sequences: author, preview, and enroll", "Agents and Workspace Copilot", "Credits for enrichment and AI, topped up any time"];
369
369
  };
@@ -575,7 +575,7 @@ export const BASE_PRICING_PLANS = {
575
575
  // workspace may connect senders, publish and buy managed email on credits
576
576
  // (repricing 2026-09, S22). So it names only what needs a plan either way;
577
577
  // the gate-aware walls speak for the rest.
578
- description: "Your CRM and tables — free forever. Credits pay for enrichment, AI and workflow steps; your own provider keys need a paid plan.",
578
+ description: "Your CRM and tables — free forever. Credits pay for enrichment, AI and workflow steps; a LinkedIn account and your own provider keys need a paid plan.",
579
579
  ctaLabel: "Upgrade",
580
580
  features: [
581
581
  "CRM, Tables, and Knowledge — unmetered; workflows pay per step",
@@ -10,7 +10,7 @@ export declare const CREDIT_GATE_BILLING_KINDS: readonly ["sending_mailbox", "li
10
10
  export type CreditGateKind = (typeof CREDIT_GATE_BILLING_KINDS)[number];
11
11
  /**
12
12
  * The plan walls credits replace once the gate is in force (S22). The
13
- * reasoning, and the two capabilities that stay walled, live with the wall
13
+ * reasoning, and the three capabilities that stay walled, live with the wall
14
14
  * itself in `plan-capabilities.ts`; the list sits in this leaf so a client
15
15
  * bundle can ask the question without loading the plan catalog.
16
16
  */
@@ -7,7 +7,8 @@
7
7
  // on, a connect is admitted when the spendable balance covers the account's
8
8
  // first monthly credit reservation, refused with `insufficient_credits` when it
9
9
  // does not, and `billing seats` reports that seats are retired (S21). The plan
10
- // wall removal (S22) sits behind the same flag.
10
+ // wall removal (S22) sits behind the same flag; a LinkedIn account keeps its
11
+ // plan wall (`linkedin_connect`, founder 2026-10-12).
11
12
  //
12
13
  // WHY IT IS ITS OWN FLAG, AND WHY IT IS NOT ENOUGH ALONE. A balance check debits
13
14
  // nothing: while commitments are dark, a workspace holding 3,400 credits would
@@ -38,7 +39,7 @@ export const CREDIT_GATE_BILLING_KINDS = [
38
39
  ];
39
40
  /**
40
41
  * The plan walls credits replace once the gate is in force (S22). The
41
- * reasoning, and the two capabilities that stay walled, live with the wall
42
+ * reasoning, and the three capabilities that stay walled, live with the wall
42
43
  * itself in `plan-capabilities.ts`; the list sits in this leaf so a client
43
44
  * bundle can ask the question without loading the plan catalog.
44
45
  */
@@ -37,11 +37,16 @@
37
37
  * billed that way (the credit gate, `OXYGEN_CREDIT_GATE_ENABLED`) credits are the
38
38
  * only gate and the sending walls retire: `CREDIT_GATE_RETIRED_CAPABILITIES`.
39
39
  * Until the gate is in force everything above still holds.
40
+ *
41
+ * EXCEPT LINKEDIN (founder, current chat, 2026-10-12: "you can only connect a
42
+ * linkedin account on a plan"). `linkedin_connect` is not retired by the credit
43
+ * gate, so a free workspace is told to subscribe before any balance check,
44
+ * however many credits it holds.
40
45
  */
41
46
  import type { PlanTier, PricingPlanDefinition } from "./billing.js";
42
47
  import { CREDIT_GATE_RETIRED_CAPABILITIES, isCapabilityRetiredByCreditGate } from "./credit-gate.js";
43
48
  import { type RepricingOptions } from "./repricing.js";
44
- export declare const PLAN_GATED_CAPABILITIES: readonly ["sender_connect", "sequence_dispatch", "publishing_connect", "publishing_deliver", "managed_email_infrastructure", "byok_provider_keys"];
49
+ export declare const PLAN_GATED_CAPABILITIES: readonly ["sender_connect", "linkedin_connect", "sequence_dispatch", "publishing_connect", "publishing_deliver", "managed_email_infrastructure", "byok_provider_keys"];
45
50
  export type PlanGatedCapability = (typeof PLAN_GATED_CAPABILITIES)[number];
46
51
  /**
47
52
  * Every tier except `free` unblocks every gated capability.
@@ -75,7 +80,9 @@ export declare function isPlanGatedCapability(value: unknown): value is PlanGate
75
80
  * (`assertCreditGateArmed`). Until then every one of them stays walled exactly
76
81
  * as before.
77
82
  *
78
- * Two capabilities stay walled under the gate:
83
+ * Three capabilities stay walled under the gate:
84
+ * - `linkedin_connect`: a LinkedIn account connects only on a plan (founder,
85
+ * current chat, 2026-10-12), whatever the balance.
79
86
  * - `byok_provider_keys`: bringing your own keys needs a plan that includes it
80
87
  * ($99 or above from the repricing's effective date).
81
88
  * - `publishing_connect`: the only publishing connects that still reach it are
@@ -37,11 +37,17 @@
37
37
  * billed that way (the credit gate, `OXYGEN_CREDIT_GATE_ENABLED`) credits are the
38
38
  * only gate and the sending walls retire: `CREDIT_GATE_RETIRED_CAPABILITIES`.
39
39
  * Until the gate is in force everything above still holds.
40
+ *
41
+ * EXCEPT LINKEDIN (founder, current chat, 2026-10-12: "you can only connect a
42
+ * linkedin account on a plan"). `linkedin_connect` is not retired by the credit
43
+ * gate, so a free workspace is told to subscribe before any balance check,
44
+ * however many credits it holds.
40
45
  */
41
46
  import { CREDIT_GATE_RETIRED_CAPABILITIES, isCapabilityRetiredByCreditGate } from "./credit-gate.js";
42
47
  import { OXYGEN_49_BYOK_REPRICING, readRepricingSwitch, repricedValue, } from "./repricing.js";
43
48
  export const PLAN_GATED_CAPABILITIES = [
44
49
  "sender_connect",
50
+ "linkedin_connect",
45
51
  "sequence_dispatch",
46
52
  "publishing_connect",
47
53
  "publishing_deliver",
@@ -71,6 +77,11 @@ export const PLAN_GATED_CAPABILITY_COPY = {
71
77
  freeAlternative: "You can build and preview the whole motion on Free — sequences, steps, and enrollment all work. Connecting a mailbox, LinkedIn account, or WhatsApp number is what needs a plan.",
72
78
  deepLinkPath: "/settings/connections",
73
79
  },
80
+ linkedin_connect: {
81
+ label: "Connecting a LinkedIn account",
82
+ freeAlternative: "Leads, sequences and enrollment all work on Free. To connect a LinkedIn account, subscribe to the Oxygen plan; its monthly credits pay for the account.",
83
+ deepLinkPath: "/settings/connections",
84
+ },
74
85
  sequence_dispatch: {
75
86
  label: "Sending a sequence",
76
87
  freeAlternative: "Authoring, versioning, enrolling, and previewing a sequence are all free. Dispatching to real recipients is what needs a plan.",
@@ -113,7 +124,9 @@ export function isPlanGatedCapability(value) {
113
124
  * (`assertCreditGateArmed`). Until then every one of them stays walled exactly
114
125
  * as before.
115
126
  *
116
- * Two capabilities stay walled under the gate:
127
+ * Three capabilities stay walled under the gate:
128
+ * - `linkedin_connect`: a LinkedIn account connects only on a plan (founder,
129
+ * current chat, 2026-10-12), whatever the balance.
117
130
  * - `byok_provider_keys`: bringing your own keys needs a plan that includes it
118
131
  * ($99 or above from the repricing's effective date).
119
132
  * - `publishing_connect`: the only publishing connects that still reach it are
@@ -1 +1 @@
1
- export declare const OXYGEN_BUILD_VERSION = "1.1014.118";
1
+ export declare const OXYGEN_BUILD_VERSION = "1.1014.120";
@@ -1,2 +1,2 @@
1
1
  // GENERATED by scripts/ci/version-stamp.mjs from VERSION + git history. Do not edit; do not commit.
2
- export const OXYGEN_BUILD_VERSION = "1.1014.118";
2
+ export const OXYGEN_BUILD_VERSION = "1.1014.120";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oxygen-agent/cli",
3
- "version": "1.1014.118",
3
+ "version": "1.1014.120",
4
4
  "private": false,
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",