@oxygen-agent/cli 1.851.1 → 1.853.1
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
package/dist/index.js
CHANGED
|
@@ -8395,6 +8395,26 @@ fixed scan; watermark_cursor starts a later bounded replay. Consumers must retai
|
|
|
8395
8395
|
.action(async (options) => {
|
|
8396
8396
|
await handleAsyncAction("billing commitments", options, () => requestOxygen("/api/cli/billing/commitments"));
|
|
8397
8397
|
}))
|
|
8398
|
+
.addCommand(new Command("seats")
|
|
8399
|
+
.description("Show sending capacity per channel: how many seats are purchased, how many are grandfathered, how many senders are connected, and how many are left. Sending seats are what let you CONNECT a sender — a LinkedIn account, WhatsApp number, phone number, or email mailbox — and they are billed in dollars on their own subscription, separate from your plan and separate from credits. You do not need a plan to buy seats. A grandfathered value of null means unlimited for that channel. Email mailbox allocation is not counted here because mailboxes are tenant-scoped. Read-only, 0 Oxygen credits.")
|
|
8400
|
+
.option("--json", "Print a JSON envelope.")
|
|
8401
|
+
.action(async (options) => {
|
|
8402
|
+
await handleAsyncAction("billing seats", options, () => requestOxygen("/api/cli/billing/seats"));
|
|
8403
|
+
})
|
|
8404
|
+
.addCommand(new Command("set")
|
|
8405
|
+
.description("Set how many sending seats of one channel this workspace holds. The quantity is ABSOLUTE, not a delta: `--quantity 3` means you end up with three, so a retried command cannot buy extra. Increasing charges the card pro rata immediately; decreasing credits you pro rata. Reducing below the number of senders you have connected is REFUSED and names how many to disconnect first, because an orphaned sender is one you keep paying a provider for while Oxygen has stopped honouring it. Charges real money.")
|
|
8406
|
+
.requiredOption("--seat-key <kind>", "linkedin, whatsapp, phone_number, or email_sender.")
|
|
8407
|
+
.requiredOption("--quantity <n>", "Total seats to hold for this channel, 0 or more.")
|
|
8408
|
+
.option("--json", "Print a JSON envelope.")
|
|
8409
|
+
.action(async (options) => {
|
|
8410
|
+
await handleAsyncAction("billing seats set", options, () => requestOxygen("/api/cli/billing/seats", {
|
|
8411
|
+
method: "POST",
|
|
8412
|
+
body: {
|
|
8413
|
+
seat_key: readOption(options.seatKey),
|
|
8414
|
+
quantity: readPositiveNumberOrZero(options.quantity),
|
|
8415
|
+
},
|
|
8416
|
+
}));
|
|
8417
|
+
})))
|
|
8398
8418
|
.addCommand(new Command("invoices")
|
|
8399
8419
|
.description("List every invoice Stripe has issued for this workspace, newest first, each with a direct PDF link. Covers ALL charges, not just the plan — sending seats, managed inboxes, and credit top-ups appear here too, which is why this works on the free tier: a workspace with no plan can still be a paying customer. A workspace billed through another organization sees an empty list and shared_billing=true; switch to the billing owner to read its invoices. pdf_url and hosted_url are Stripe's own links. Read-only, 0 Oxygen credits.")
|
|
8400
8420
|
.option("--json", "Print a JSON envelope.")
|
|
@@ -12231,7 +12251,7 @@ fixed scan; watermark_cursor starts a later bounded replay. Consumers must retai
|
|
|
12231
12251
|
});
|
|
12232
12252
|
})))
|
|
12233
12253
|
.addCommand(new Command("analytics")
|
|
12234
|
-
.description("Show organization-level sequencer analytics, per-sequence funnels, and native email attribution under analytics.emailAttribution: byMailbox, byDomain, and explicit unattributed facts. Provider-owned campaigns appear only after their telemetry is normalized into Oxygen's native Sequence ledgers. Also reports whether the reply → CRM automation is armed, with a link to the workflow.")
|
|
12254
|
+
.description("Show organization-level sequencer analytics, per-sequence funnels, and native email attribution under analytics.emailAttribution: byMailbox, byDomain, and explicit unattributed facts. With --sequence, analytics.senderPerformance groups channel-conditional counts and rates by sending person across their campaign accounts. Provider-owned campaigns appear only after their telemetry is normalized into Oxygen's native Sequence ledgers. Also reports whether the reply → CRM automation is armed, with a link to the workflow.")
|
|
12235
12255
|
.option("--range <range>", "Preset range: 7d, 14d, 28d, 30d, 90d, 180d, 365d, or all. Defaults to 14d. `all` starts at the oldest campaign in scope.")
|
|
12236
12256
|
.option("--from <date>", "Custom start date (YYYY-MM-DD). Windows up to five years are accepted.")
|
|
12237
12257
|
.option("--to <date>", "Custom end date (YYYY-MM-DD).")
|
|
@@ -23043,6 +23063,24 @@ options) {
|
|
|
23043
23063
|
...(hasRandomize ? { randomize_daily_caps: options.randomizeCaps } : {}),
|
|
23044
23064
|
};
|
|
23045
23065
|
}
|
|
23066
|
+
/**
|
|
23067
|
+
* A whole seat count. Unlike readPositiveNumber, ZERO IS VALID and meaningful:
|
|
23068
|
+
* `--quantity 0` is how a customer gives back every seat of a channel, and
|
|
23069
|
+
* rejecting it would leave the only way to stop paying being a support ticket.
|
|
23070
|
+
*/
|
|
23071
|
+
function readPositiveNumberOrZero(value) {
|
|
23072
|
+
const trimmed = value?.trim();
|
|
23073
|
+
if (!trimmed)
|
|
23074
|
+
return undefined;
|
|
23075
|
+
const parsed = Number(trimmed);
|
|
23076
|
+
if (!Number.isInteger(parsed) || parsed < 0) {
|
|
23077
|
+
throw new OxygenError("invalid_number", "Expected a whole number of 0 or more.", {
|
|
23078
|
+
details: { value },
|
|
23079
|
+
exitCode: 1,
|
|
23080
|
+
});
|
|
23081
|
+
}
|
|
23082
|
+
return parsed;
|
|
23083
|
+
}
|
|
23046
23084
|
function readPositiveNumber(value) {
|
|
23047
23085
|
const trimmed = value?.trim();
|
|
23048
23086
|
if (!trimmed)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const OXYGEN_VERSION = "1.
|
|
1
|
+
export declare const OXYGEN_VERSION = "1.853.1";
|
|
2
2
|
export declare const OXYGEN_MINIMUM_CLI_VERSION = "1.181.0";
|
|
3
3
|
export declare const MANAGED_INBOX_MINIMUM_CLI_VERSION = "1.326.2";
|
|
4
4
|
export declare const SUPPORT_AGENT_REPLY_MINIMUM_CLI_VERSION = "1.747.0";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export const OXYGEN_VERSION = "1.
|
|
1
|
+
export const OXYGEN_VERSION = "1.853.1";
|
|
2
2
|
// The GLOBAL CLI compatibility floor: the oldest CLI allowed to call any
|
|
3
3
|
// operational route. Raising it hard-rejects every older CLI from the entire
|
|
4
4
|
// product, so it obeys one law, enforced by scripts/ci/cli-min-version-gate.mjs:
|