@oxygen-agent/cli 1.1014.951 → 1.1014.985
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
|
@@ -68,34 +68,10 @@ function buildManagedInboxMailboxes(options, forms) {
|
|
|
68
68
|
mailboxes = locals.map((username) => ({ username }));
|
|
69
69
|
}
|
|
70
70
|
else if (forms.countPrefix && (count !== undefined || prefix)) {
|
|
71
|
-
|
|
72
|
-
throw new Error("--count and --prefix must be passed together (e.g. --count 3 --prefix ada).");
|
|
73
|
-
}
|
|
74
|
-
const base = prefix.toLowerCase();
|
|
75
|
-
if (senderProfileId) {
|
|
76
|
-
// With a sender the shorthand finally has a real identity behind it, so it
|
|
77
|
-
// generates usernames only — the placeholder names below are exactly what
|
|
78
|
-
// this flag exists to stop shipping.
|
|
79
|
-
mailboxes = Array.from({ length: count }, (_entry, index) => ({ username: `${base}${index + 1}` }));
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
// The vendor stamps a first/last name on every mailbox, so there is no
|
|
83
|
-
// name-less order shape to fall back on — the shorthand invents
|
|
84
|
-
// placeholders rather than pretending names are optional. Anyone who
|
|
85
|
-
// wants real human identities on the inboxes passes --sender (best),
|
|
86
|
-
// or --mailboxes/--file.
|
|
87
|
-
const label = `${base.charAt(0).toUpperCase()}${base.slice(1)}`;
|
|
88
|
-
mailboxes = Array.from({ length: count }, (_entry, index) => ({
|
|
89
|
-
username: `${base}${index + 1}`,
|
|
90
|
-
first_name: label,
|
|
91
|
-
last_name: String(index + 1),
|
|
92
|
-
}));
|
|
93
|
-
}
|
|
71
|
+
throw new OxygenError("natural_mailbox_names_required", "Choose natural addresses for the real sender, such as phil, philipp, philipph, philipp.hirte or p.hirte. --count/--prefix no longer generates numbered usernames or placeholder people. Use --locals <names> --sender <id>, or --mailboxes/--file with reviewed names; explicitly requested numeric addresses remain supported there.", { exitCode: 2, details: { next_step: "oxygen senders profiles list --json" } });
|
|
94
72
|
}
|
|
95
73
|
else {
|
|
96
74
|
const spellings = ["--mailboxes <json>", "--file <path>", "--locals <list> --sender <id>"];
|
|
97
|
-
if (forms.countPrefix)
|
|
98
|
-
spellings.push("--count <n> --prefix <base>");
|
|
99
75
|
throw new Error(`Provide ${spellings.join(", ")}.`);
|
|
100
76
|
}
|
|
101
77
|
if (!senderProfileId || !Array.isArray(mailboxes))
|
|
@@ -143,8 +119,8 @@ export function registerManagedInboxesFamily(program, handleAsyncAction) {
|
|
|
143
119
|
.option("--domain <domain>", "Sending domain (alternative to the positional argument).")
|
|
144
120
|
.requiredOption("--provider <provider>", "Mailbox PLATFORM: google, microsoft, or azure. (google/microsoft cap at 5 mailboxes per domain; azure allows 100.)")
|
|
145
121
|
.option("--vendor <vendor>", "Pin the vendor: inboxkit. Omit to let OXYGEN choose. A named vendor with no credential FAILS rather than falling back to another.")
|
|
146
|
-
.option("--sender <id>", "Sender profile id (from `oxygen senders profiles list`) that OWNS every mailbox in this order: its first name, last name, and profile picture are stamped on each one, so you never retype them. A sender profile is one person's sending identity — their LinkedIn/WhatsApp accounts and email inboxes under one name and photo. One sender can own several addresses on the same domain (see --locals). Any first_name/last_name/profile_picture_url in --mailboxes/--file is dropped for the sender's own values.")
|
|
147
|
-
.option("--locals <list>", "
|
|
122
|
+
.option("--sender <id>", "Sender profile id (from `oxygen senders profiles list`) that OWNS every mailbox in this order: its first name, last name, and profile picture are stamped on each one, so you never retype them. A sender profile is one person's sending identity — their LinkedIn/WhatsApp accounts and email inboxes under one name and photo. One sender can own several natural addresses on the same domain (see --locals); do not invent people or pad a requested count with numbered aliases. Any first_name/last_name/profile_picture_url in --mailboxes/--file is dropped for the sender's own values.")
|
|
123
|
+
.option("--locals <list>", "Natural local parts for the real sender; avoid numbered suffixes unless explicitly requested, e.g. `--locals talia,talia.rosen,t.rosen` on send.acme.com orders talia@, talia.rosen@, and t.rosen@ — all owned by that one person. Requires --sender, because a bare local part carries no name and the vendor's stamp is permanent.")
|
|
148
124
|
.option("--mailboxes <json>", "JSON array of mailboxes: [{\"username\",\"first_name\",\"last_name\",\"profile_picture_url\"}], or [{\"username\",\"sender_profile_id\"}] to take the identity from a sender profile per item (mix freely). profile_picture_url is optional and must be a PUBLIC, PERMANENT https URL — the vendor fetches it server-side at provisioning, so an expiring CDN link (e.g. a media.licdn.com URL with e=<epoch>) ships the mailbox faceless. Use `oxygen managed-inboxes upload-avatar <path>` to host one, or --sender / sender_profile_id, whose photo Oxygen already mirrors.")
|
|
149
125
|
.option("--file <path>", "Path to a JSON file { \"mailboxes\": [...] } (alternative to --mailboxes).")
|
|
150
126
|
.addOption(new Option("--preview", "Explicit read-only quote: connects nothing, buys nothing and charges nothing. Cannot be combined with purchase or DNS cleanup approval.").conflicts(["approved", "dnsCleanupApproved"]))
|
|
@@ -225,12 +201,12 @@ export function registerManagedInboxesFamily(program, handleAsyncAction) {
|
|
|
225
201
|
.description("Add mailboxes to a managed domain you ALREADY own — no new domain is registered and there is NO domain registration charge, only the extra inboxes' monthly rate (plus their add-ons). WITHOUT --approved this prints a priced PREVIEW with a quote_id and orders nothing; re-run with --approved --quote <id> to place the order. When the standing OXYGEN Warm-up add-on is enabled and available, preview and approved responses carry `warmup_activation` for only the exact newly added `mailboxes`, with `scope=warmup_only`; it is null when warmup is disabled or unavailable. For InboxKit, Google carries `transport=inboxkit_managed_google_handoff`; Microsoft/Azure carries `transport=inboxkit_sequencer_export`. Both carry `mailbox_credentials_required=false` and `native_send_oauth_separate=true`, so managed warm-up needs no customer-supplied OAuth or mailbox password. Google retrieves the existing managed credential only during activation and never persists or returns it; Microsoft/Azure uses native export. Native sending authorization is separate and may still be required before OXYGEN can send. Verify each exact address with `mailboxes oauth-health --json`; InboxKit's unattended Google domain approval usually lands within minutes and the worker keeps retrying, so a waiting row is not a reason to ask the customer to sign in. The quote authorizes automatic OXYGEN Warm-up activation after provisioning, so do not run a second warmup approval. Capped per domain by the platform the domain was bought on (5 google/microsoft, 100 azure) COUNTING the inboxes already on it. To register a NEW domain use `managed-inboxes subscribe` instead.")
|
|
226
202
|
.argument("[domain]", "A managed domain this workspace already owns (e.g. send.acme.com). May also be passed as --domain.")
|
|
227
203
|
.option("--domain <domain>", "The managed inbox domain (alternative to the positional argument).")
|
|
228
|
-
.option("--sender <id>", "Sender profile id (from `oxygen senders profiles list`) that OWNS every mailbox in this order: its first name, last name, and profile picture are stamped on each one, so you never retype them. A sender profile is one person's sending identity — their LinkedIn/WhatsApp accounts and email inboxes under one name and photo. One sender can own several addresses on the same domain (see --locals). Any first_name/last_name/profile_picture_url in --mailboxes/--file is dropped for the sender's own values.")
|
|
229
|
-
.option("--locals <list>", "
|
|
204
|
+
.option("--sender <id>", "Sender profile id (from `oxygen senders profiles list`) that OWNS every mailbox in this order: its first name, last name, and profile picture are stamped on each one, so you never retype them. A sender profile is one person's sending identity — their LinkedIn/WhatsApp accounts and email inboxes under one name and photo. One sender can own several natural addresses on the same domain (see --locals); do not invent people or pad a requested count with numbered aliases. Any first_name/last_name/profile_picture_url in --mailboxes/--file is dropped for the sender's own values.")
|
|
205
|
+
.option("--locals <list>", "Natural local parts for the real sender; avoid numbered suffixes unless explicitly requested, e.g. `--locals talia,talia.rosen,t.rosen` adds talia@, talia.rosen@, and t.rosen@ on this domain — all owned by that one person. Requires --sender, because a bare local part carries no name and the vendor's stamp is permanent.")
|
|
230
206
|
.option("--mailboxes <json>", "JSON array of mailboxes: [{\"username\",\"first_name\",\"last_name\",\"profile_picture_url\"}], or [{\"username\",\"sender_profile_id\"}] to take the identity from a sender profile per item (mix freely). The vendor stamps the names on each mailbox permanently, so real names belong here. profile_picture_url is optional and must be a PUBLIC, PERMANENT https URL the vendor can fetch at provisioning; `oxygen managed-inboxes upload-avatar <path>` returns one, and a sender profile's mirrored photo already is one.")
|
|
231
207
|
.option("--file <path>", "Path to a JSON file { \"mailboxes\": [...] } (alternative to --mailboxes).")
|
|
232
|
-
.
|
|
233
|
-
.
|
|
208
|
+
.addOption(new Option("--count <n>", "Retired: choose natural addresses with --locals and --sender.").hideHelp())
|
|
209
|
+
.addOption(new Option("--prefix <base>", "Retired: provide reviewed natural local parts through --locals or --mailboxes.").hideHelp())
|
|
234
210
|
.option("--approved", "Place the order (requires --quote). Without it, a priced preview is returned.")
|
|
235
211
|
.option("--quote <id>", "The quote_id from a fresh preview. Required with --approved.")
|
|
236
212
|
.option("--json", "Print a JSON envelope.")
|
package/dist/commands/people.js
CHANGED
|
@@ -98,6 +98,7 @@ function readPeopleSearchRunBody(options) {
|
|
|
98
98
|
...(options.mode ? { mode: options.mode } : {}),
|
|
99
99
|
...(maxCreditsNative !== undefined ? { max_credits: maxCreditsNative } : {}),
|
|
100
100
|
...(nativeTarget !== undefined ? { target_count: nativeTarget } : {}),
|
|
101
|
+
...(options.continue ? { continue: true } : {}),
|
|
101
102
|
...(options.approved ? { approved: true } : {}),
|
|
102
103
|
};
|
|
103
104
|
}
|
|
@@ -132,6 +133,7 @@ function readPeopleSearchRunBody(options) {
|
|
|
132
133
|
...(filters ? { filters } : {}),
|
|
133
134
|
// Free sizing is on by default when planning from a prompt; --no-estimate opts out.
|
|
134
135
|
...(prompt ? { estimate: options.estimate !== false } : {}),
|
|
136
|
+
...(options.continue ? { continue: true } : {}),
|
|
135
137
|
...(options.approved ? { approved: true } : {}),
|
|
136
138
|
};
|
|
137
139
|
}
|
|
@@ -312,6 +314,7 @@ export function registerPeopleFamily(program, handleAsyncAction) {
|
|
|
312
314
|
.option("--project <project>", "Folder (project) id or slug the created table lands in. Ignored with --table. Defaults to the workspace default folder.")
|
|
313
315
|
.option("--upsert-key <column>", "Column key used for live upsert. Must match the plan upsert key (linkedin_url).")
|
|
314
316
|
.option("--mode <mode>", "dry_run or live. Defaults to dry_run.")
|
|
317
|
+
.option("--continue", "With --table: start each search where the last run of the same search into that table stopped, instead of page one, so a repeated run finds new people. Refuses without spending once nothing is left.")
|
|
315
318
|
.option("--max-pages <n>", "Maximum provider pages to ingest. Defaults to the route estimate. With --from-table it means pages per company.")
|
|
316
319
|
.option("--max-credits <n>", "Required credit ceiling for live runs.")
|
|
317
320
|
.option("--target-count <n>", "How many people to source. Omit it to take every match, up to what one query reaches and a tenth of the spendable credits. Single-plan ceiling 50,000.")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const OXYGEN_BUILD_VERSION = "1.1014.
|
|
1
|
+
export declare const OXYGEN_BUILD_VERSION = "1.1014.985";
|
|
@@ -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.
|
|
2
|
+
export const OXYGEN_BUILD_VERSION = "1.1014.985";
|