@oxygen-agent/cli 1.1011.1091 → 1.1013.15
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 +1 -1
- package/dist/command-manifest.d.ts +3 -1
- package/dist/command-manifest.js +11 -0
- package/dist/customer-operation-commands.js +7 -3
- package/dist/diagnostic-upload-main.d.ts +1 -0
- package/dist/diagnostic-upload-main.js +2 -0
- package/dist/diagnostic-uploader.d.ts +3 -0
- package/dist/diagnostic-uploader.js +68 -0
- package/dist/diagnostics.d.ts +22 -0
- package/dist/diagnostics.js +219 -0
- package/dist/http-client.d.ts +7 -0
- package/dist/http-client.js +12 -2
- package/dist/index.js +72 -34
- package/dist/transcript.js +1 -1
- package/node_modules/@oxygen/formula/dist/expression.js +16 -0
- package/node_modules/@oxygen/shared/dist/attempt-provenance.d.ts +8 -0
- package/node_modules/@oxygen/shared/dist/attempt-provenance.js +15 -0
- package/node_modules/@oxygen/shared/dist/byok-connect.js +2 -0
- package/node_modules/@oxygen/shared/dist/capability-discovery.d.ts +2 -1
- package/node_modules/@oxygen/shared/dist/capability-discovery.js +28 -4
- package/node_modules/@oxygen/shared/dist/contracts/browser-operations.js +3 -3
- package/node_modules/@oxygen/shared/dist/contracts/customer-operations.js +3 -3
- package/node_modules/@oxygen/shared/dist/contracts/geo.d.ts +2 -0
- package/node_modules/@oxygen/shared/dist/contracts/geo.js +160 -0
- package/node_modules/@oxygen/shared/dist/contracts/operations.d.ts +1 -0
- package/node_modules/@oxygen/shared/dist/contracts/operations.js +4 -3
- package/node_modules/@oxygen/shared/dist/contracts/table-row-removal.d.ts +8 -0
- package/node_modules/@oxygen/shared/dist/contracts/table-row-removal.js +10 -4
- package/node_modules/@oxygen/shared/dist/cost-estimate.d.ts +6 -0
- package/node_modules/@oxygen/shared/dist/cost-estimate.js +23 -8
- package/node_modules/@oxygen/shared/dist/diagnostic-context.d.ts +3 -0
- package/node_modules/@oxygen/shared/dist/diagnostic-context.js +17 -0
- package/node_modules/@oxygen/shared/dist/diagnostic-credentials.d.ts +4 -0
- package/node_modules/@oxygen/shared/dist/diagnostic-credentials.js +12 -0
- package/node_modules/@oxygen/shared/dist/diagnostic-lock.d.ts +2 -0
- package/node_modules/@oxygen/shared/dist/diagnostic-lock.js +60 -0
- package/node_modules/@oxygen/shared/dist/diagnostic-receipt.d.ts +6 -0
- package/node_modules/@oxygen/shared/dist/diagnostic-receipt.js +22 -0
- package/node_modules/@oxygen/shared/dist/diagnostic-storage-lock.d.ts +2 -0
- package/node_modules/@oxygen/shared/dist/diagnostic-storage-lock.js +39 -0
- package/node_modules/@oxygen/shared/dist/diagnostic-storage.d.ts +31 -0
- package/node_modules/@oxygen/shared/dist/diagnostic-storage.js +233 -0
- package/node_modules/@oxygen/shared/dist/diagnostics.d.ts +49 -0
- package/node_modules/@oxygen/shared/dist/diagnostics.js +253 -0
- package/node_modules/@oxygen/shared/dist/enrichment-intents.js +2 -1
- package/node_modules/@oxygen/shared/dist/external-effect-arming.d.ts +54 -0
- package/node_modules/@oxygen/shared/dist/external-effect-arming.js +90 -0
- package/node_modules/@oxygen/shared/dist/geo.d.ts +264 -0
- package/node_modules/@oxygen/shared/dist/geo.js +342 -0
- package/node_modules/@oxygen/shared/dist/linkedin-countries.d.ts +9 -0
- package/node_modules/@oxygen/shared/dist/linkedin-countries.js +1 -1
- package/node_modules/@oxygen/shared/dist/managed-email-branding.d.ts +15 -0
- package/node_modules/@oxygen/shared/dist/managed-email-branding.js +81 -0
- package/node_modules/@oxygen/shared/dist/onboarding-first-leads.d.ts +19 -0
- package/node_modules/@oxygen/shared/dist/onboarding-first-leads.js +25 -0
- package/node_modules/@oxygen/shared/dist/otlp-log-sink.d.ts +1 -1
- package/node_modules/@oxygen/shared/dist/otlp-log-sink.js +4 -0
- package/node_modules/@oxygen/shared/dist/pricing-sheet.d.ts +20 -24
- package/node_modules/@oxygen/shared/dist/pricing-sheet.js +15 -16
- package/node_modules/@oxygen/shared/dist/pricing-snapshot.generated.d.ts +3 -3
- package/node_modules/@oxygen/shared/dist/pricing-snapshot.generated.js +3 -3
- package/node_modules/@oxygen/shared/dist/product-analytics-events.d.ts +2 -0
- package/node_modules/@oxygen/shared/dist/product-analytics-events.js +2 -0
- package/node_modules/@oxygen/shared/dist/product-doctrine.js +6 -5
- package/node_modules/@oxygen/shared/dist/recipes.d.ts +1 -1
- package/node_modules/@oxygen/shared/dist/recipes.js +1 -0
- package/node_modules/@oxygen/shared/dist/repricing.d.ts +4 -14
- package/node_modules/@oxygen/shared/dist/repricing.js +25 -64
- package/node_modules/@oxygen/shared/dist/research-depth.d.ts +11 -0
- package/node_modules/@oxygen/shared/dist/research-depth.js +7 -0
- package/node_modules/@oxygen/shared/dist/version.d.ts +2 -1
- package/node_modules/@oxygen/shared/dist/version.generated.d.ts +1 -1
- package/node_modules/@oxygen/shared/dist/version.generated.js +1 -1
- package/node_modules/@oxygen/shared/dist/version.js +4 -1
- package/node_modules/@oxygen/shared/dist/whatsapp-sender-limits.d.ts +46 -0
- package/node_modules/@oxygen/shared/dist/whatsapp-sender-limits.js +51 -1
- package/node_modules/@oxygen/shared/package.json +10 -0
- package/package.json +1 -1
|
@@ -134,8 +134,7 @@ export const AI_COLUMN_WEB_SEARCH_RESERVED_CREDITS = 4.6;
|
|
|
134
134
|
* likely under 5x once a loop runs more than two turns.
|
|
135
135
|
*/
|
|
136
136
|
export const RESEARCH_DEPTH_MODEL_CREDITS = { standard: 4.3, deep: 7.6 };
|
|
137
|
-
/** The tier whose model each loop depth runs on
|
|
138
|
-
export const RESEARCH_DEPTH_MODEL_TIER = { standard: "low", deep: "medium" };
|
|
137
|
+
/** The tier whose model each loop depth runs on lives in ./research-depth.ts: a routing fact, not a price. */
|
|
139
138
|
/**
|
|
140
139
|
* The tool half of a standard/deep row. `typical` is the ratified planning shape —
|
|
141
140
|
* standard: 2 serper searches + 2 native page reads; deep: 3 serper searches + 4
|
|
@@ -161,13 +160,13 @@ export const RESEARCH_DEPTH_TYPICAL_ROW_CREDITS = { quick: 2.1, standard: 5.5, d
|
|
|
161
160
|
*/
|
|
162
161
|
export { AUTOMATION_STEP_CREDITS_REPRICING } from "./repricing.js";
|
|
163
162
|
/**
|
|
164
|
-
* The flat mailbox line of a managed Google
|
|
165
|
-
*
|
|
166
|
-
* included, bills beside it:
|
|
167
|
-
*
|
|
168
|
-
*
|
|
169
|
-
* (min/typical/max all equal) so callers that destructure any field need
|
|
170
|
-
* shape change.
|
|
163
|
+
* The flat mailbox line of a managed Google or Microsoft 365 inbox: 300 (founder,
|
|
164
|
+
* 2026-10-07; repricing decision 3.1 had set 400 for Google alone). Its 100-credit
|
|
165
|
+
* mailbox connection, warm-up included, bills beside it: 400 all-in, which
|
|
166
|
+
* `managedInboxAllInCredits()` from `@oxygen/shared/repricing` quotes. The price
|
|
167
|
+
* charged is the pricing book's row; this is its committed default. Kept as an
|
|
168
|
+
* object (min/typical/max all equal) so callers that destructure any field need
|
|
169
|
+
* no shape change.
|
|
171
170
|
*/
|
|
172
171
|
export const MANAGED_INBOX_CREDITS_PER_MONTH = {
|
|
173
172
|
min: SNAPSHOT_MANAGED_INBOX_CREDITS_PER_MONTH,
|
|
@@ -205,15 +204,15 @@ export const SENDING_DOMAIN_CREDITS_PER_YEAR_TYPICAL = SNAPSHOT_SENDING_DOMAIN_C
|
|
|
205
204
|
* THE ALLOWANCE IS LOAD-BEARING, not a perk. Placement COGS is per TEST
|
|
206
205
|
* ($0.1327 on EmailGuard's Agency plan), not per inbox, so an unbounded seat
|
|
207
206
|
* 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.
|
|
209
|
-
* revenue at
|
|
207
|
+
* already sold at a loss. Two included tests cost $0.265 against $1.00 of
|
|
208
|
+
* revenue at today's price, and everything past them bills
|
|
210
209
|
* PLACEMENT_TEST_OVERAGE_CREDITS. Orgs on their own EmailGuard key (BYOK) pay 0.
|
|
211
210
|
*
|
|
212
|
-
*
|
|
213
|
-
*
|
|
214
|
-
* a surface that quotes or bills uses
|
|
215
|
-
* `
|
|
216
|
-
* the switch's instant)
|
|
211
|
+
* Monitoring is 100 credits per inbox-month (founder, 2026-10-07; the 2026-09
|
|
212
|
+
* repricing had set 135). The extra test is the RATIFIED 66 (slice S30), whose rise
|
|
213
|
+
* waits for the S07 effective-date switch, so a surface that quotes or bills uses
|
|
214
|
+
* `deliverabilitySeatCredits()` and `placementTestCredits()` from
|
|
215
|
+
* `@oxygen/shared/repricing` (16.6 for the test until the switch's instant).
|
|
217
216
|
*/
|
|
218
217
|
export const DELIVERABILITY_SEAT_CREDITS_PER_MONTH = SNAPSHOT_DELIVERABILITY_SEAT_CREDITS_PER_MONTH;
|
|
219
218
|
export const DELIVERABILITY_INCLUDED_TESTS_PER_INBOX = SNAPSHOT_DELIVERABILITY_INCLUDED_TESTS_PER_INBOX;
|
|
@@ -15,13 +15,13 @@ export declare const SUBSCRIPTION_USD_PER_100 = 1;
|
|
|
15
15
|
/** Applied to actual provider inference cost at settle time. */
|
|
16
16
|
export declare const COPILOT_CREDIT_MARKUP_MULTIPLIER = 5;
|
|
17
17
|
export declare const LINKEDIN_ACCOUNT_CREDITS_PER_MONTH = 3400;
|
|
18
|
-
export declare const WHATSAPP_ACCOUNT_CREDITS_PER_MONTH =
|
|
18
|
+
export declare const WHATSAPP_ACCOUNT_CREDITS_PER_MONTH = 3400;
|
|
19
19
|
export declare const X_ACCOUNT_CREDITS_PER_MONTH = 1000;
|
|
20
20
|
export declare const EGRESS_IP_CREDITS_PER_MONTH = 2500;
|
|
21
21
|
export declare const SENDING_MAILBOX_CREDITS_PER_MONTH = 100;
|
|
22
|
-
export declare const MANAGED_INBOX_CREDITS_PER_MONTH =
|
|
22
|
+
export declare const MANAGED_INBOX_CREDITS_PER_MONTH = 300;
|
|
23
23
|
export declare const MAILBOX_WARMUP_CREDITS_PER_MONTH = 0;
|
|
24
|
-
export declare const DELIVERABILITY_SEAT_CREDITS_PER_MONTH =
|
|
24
|
+
export declare const DELIVERABILITY_SEAT_CREDITS_PER_MONTH = 100;
|
|
25
25
|
/** Included inbox-placement tests per subscribed inbox per cycle. */
|
|
26
26
|
export declare const DELIVERABILITY_INCLUDED_TESTS_PER_INBOX = 2;
|
|
27
27
|
/** A placement test beyond the included allowance. */
|
|
@@ -37,13 +37,13 @@ export const COPILOT_CREDIT_MARKUP_MULTIPLIER = 5;
|
|
|
37
37
|
// force is lower; a surface that shows or charges one resolves it with
|
|
38
38
|
// repricedChargeCredits (@oxygen/shared/repricing), never from this literal alone.
|
|
39
39
|
export const LINKEDIN_ACCOUNT_CREDITS_PER_MONTH = 3_400;
|
|
40
|
-
export const WHATSAPP_ACCOUNT_CREDITS_PER_MONTH =
|
|
40
|
+
export const WHATSAPP_ACCOUNT_CREDITS_PER_MONTH = 3_400;
|
|
41
41
|
export const X_ACCOUNT_CREDITS_PER_MONTH = 1_000;
|
|
42
42
|
export const EGRESS_IP_CREDITS_PER_MONTH = 2_500;
|
|
43
43
|
export const SENDING_MAILBOX_CREDITS_PER_MONTH = 100;
|
|
44
|
-
export const MANAGED_INBOX_CREDITS_PER_MONTH =
|
|
44
|
+
export const MANAGED_INBOX_CREDITS_PER_MONTH = 300;
|
|
45
45
|
export const MAILBOX_WARMUP_CREDITS_PER_MONTH = 0;
|
|
46
|
-
export const DELIVERABILITY_SEAT_CREDITS_PER_MONTH =
|
|
46
|
+
export const DELIVERABILITY_SEAT_CREDITS_PER_MONTH = 100;
|
|
47
47
|
/** Included inbox-placement tests per subscribed inbox per cycle. */
|
|
48
48
|
export const DELIVERABILITY_INCLUDED_TESTS_PER_INBOX = 2;
|
|
49
49
|
/** A placement test beyond the included allowance. */
|
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
* set, so adding one is a deliberate edit there too.
|
|
16
16
|
*/
|
|
17
17
|
export declare const PRODUCT_EVENTS: {
|
|
18
|
+
/** Internal diagnostic receipt, never counted as an additional customer action. */
|
|
19
|
+
readonly DIAGNOSTIC_CAPTURE: "diagnostic_capture";
|
|
18
20
|
/** Acquisition. */
|
|
19
21
|
readonly USER_SIGNED_UP: "user_signed_up";
|
|
20
22
|
readonly WORKSPACE_CREATED: "workspace_created";
|
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
* set, so adding one is a deliberate edit there too.
|
|
16
16
|
*/
|
|
17
17
|
export const PRODUCT_EVENTS = {
|
|
18
|
+
/** Internal diagnostic receipt, never counted as an additional customer action. */
|
|
19
|
+
DIAGNOSTIC_CAPTURE: "diagnostic_capture",
|
|
18
20
|
/** Acquisition. */
|
|
19
21
|
USER_SIGNED_UP: "user_signed_up",
|
|
20
22
|
WORKSPACE_CREATED: "workspace_created",
|
|
@@ -49,22 +49,23 @@ function rosterLines(routes) {
|
|
|
49
49
|
* a grown or shrunk route array and watching the output follow.
|
|
50
50
|
*/
|
|
51
51
|
export function renderOxygenProductDoctrine(routes = OXYGEN_PRIMITIVE_ROUTES) {
|
|
52
|
-
return `OXYGEN is hosted revenue infrastructure for B2B startups; OXYGEN OS
|
|
52
|
+
return `OXYGEN is hosted revenue infrastructure for B2B startups; OXYGEN OS has five layers. Control (CLI, MCP, web, desktop, Copilot) calls one contract, owns no state; External holds integrations. Between them, the ${routes.length} primitives, each owns its facts:
|
|
53
53
|
|
|
54
54
|
${rosterLines(routes)}
|
|
55
55
|
|
|
56
|
-
Use native primitives
|
|
56
|
+
Use native primitives: state, approvals, costs, provenance and runs stay inspectable; never rebuild one with scripts, cron, files, or a second engine.
|
|
57
57
|
|
|
58
58
|
Ownership law — one owner per fact, no primitive re-implements another:
|
|
59
59
|
|
|
60
|
+
- Geo owns AI-search prompts, answers, citations and experiments; staff/dev pilot only.
|
|
60
61
|
- Records hold canonical truth; Tables hold disposable work promoted onto Records — a row is a candidate, not canon. Tables own typed rows, formulas, AI and tool columns, waterfalls, cell state, and provenance; simple row dependencies stay chained Table columns, not Workflows.
|
|
61
62
|
- Interaction state, not recipient count, owns LinkedIn routing: net-new outreach is Sequences even for one recipient and one step; a reply in an existing thread or one direct email is Messages, holding conversation content, stored once. Cadence, enrollment, sender rotation, suppression, and reply-stop are Sequences.
|
|
62
|
-
- Signals hold durable typed events
|
|
63
|
+
- Signals hold durable typed events; they record what happened, and acting on one is Workflows or Sequences; an inbound reply is both, a reaction only a Signal.
|
|
63
64
|
- Deterministic scheduled, cron, webhook, event, branching, waiting, retrying, or approval-gated orchestration belongs to hosted OXYGEN Workflows: schema → lint → apply → call, and local files are authoring inputs only. Adaptive goals, persistent threads, and checkpoints belong to governed Agents, owning first-class runs and calling Workflows as child actions; neither compiles into the other nor is a store — a draft is Messages, a note Records activity, and Workflow outreach enrolls into an active, bounded Sequence and never sends raw provider messages.
|
|
64
65
|
- Posts hold broadcast artifacts and engagement telemetry; Publishing owns approval-gated scheduling, dispatch, retries, and provenance; Ads owns competitor ad intelligence; Tags are the cross-primitive label vocabulary; Dashboards curates native reporting; Observability is the read lens over runs, costs, and failures, never a second engine.
|
|
65
|
-
-
|
|
66
|
+
- Knowledge Graph describes customer kinds (ICP, personas, offers, rubrics, voice); Records holds the companies and people they describe. Store durable knowledge there, not chat memory: read pages, cite their slugs, search before minting a near-duplicate, file durable findings back. Canonical voice and positioning stay proposal-gated. Pinned canonical context is auto-applied to AI copy; if reported missing, say so rather than write off-voice. Recipes package motions that read it, advisory only.
|
|
66
67
|
|
|
67
|
-
Paid provider work and external writes require a preview on a small sample, exact scope, approval, and a hard credit or action ceiling. Never infer spend authority from tool authority.
|
|
68
|
+
Paid provider work and external writes require a preview on a small sample, exact scope, approval, and a hard credit or action ceiling. Never infer spend authority from tool authority. Show deep-links, costs, failures, retries and approval needs; name missing context, never guess.`;
|
|
68
69
|
}
|
|
69
70
|
/** The rendered doctrine for the shipped primitive roster. */
|
|
70
71
|
export const OXYGEN_PRODUCT_DOCTRINE = renderOxygenProductDoctrine();
|
|
@@ -9,7 +9,7 @@ export declare const RECIPE_STATUSES: readonly ["draft", "beta", "stable", "depr
|
|
|
9
9
|
export type RecipeStatus = typeof RECIPE_STATUSES[number];
|
|
10
10
|
export declare const RECIPE_BENCHMARK_BASES: readonly ["estimate", "observed"];
|
|
11
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", "tags", "sequences", "publishing", "workflows", "agents", "observability"];
|
|
12
|
+
export declare const RECIPE_PRIMITIVES: readonly ["knowledge-graph", "recipes", "records", "tables", "messages", "posts", "signals", "dashboards", "geo", "ads", "tags", "sequences", "publishing", "workflows", "agents", "observability"];
|
|
13
13
|
export type RecipePrimitive = typeof RECIPE_PRIMITIVES[number];
|
|
14
14
|
export declare const RECIPE_PREREQUISITE_KINDS: readonly ["sender", "mailbox", "domain", "integration", "knowledge", "asset", "plan", "data"];
|
|
15
15
|
export type RecipePrerequisiteKind = typeof RECIPE_PREREQUISITE_KINDS[number];
|
|
@@ -118,28 +118,18 @@ export declare const AUTOMATION_STEP_CREDITS_REPRICING: RepricedValue<0.001 | 0.
|
|
|
118
118
|
* approved ceiling, so it starts with the price and not before.
|
|
119
119
|
*/
|
|
120
120
|
export declare const AUTOMATION_STEPS_COUNT_TOWARD_RUN_CAP_REPRICING: RepricedValue<boolean>;
|
|
121
|
-
/**
|
|
122
|
-
|
|
123
|
-
* cycle's placement-test allowance, 100 -> 135 credits a month. Existing
|
|
124
|
-
* subscriptions pay the price in force at each renewal.
|
|
125
|
-
*/
|
|
126
|
-
export declare const DELIVERABILITY_SEAT_REPRICING: RepricedValue<100 | 135>;
|
|
121
|
+
/** EmailGuard monitoring per subscribed inbox-month, in credits, including its placement tests. */
|
|
122
|
+
export declare function deliverabilitySeatCredits(): number;
|
|
127
123
|
/**
|
|
128
124
|
* S30 (decision 3.6; flat literal, proposal P-29): one managed placement test
|
|
129
125
|
* past an inbox's included allowance, or on an inbox with no monitoring
|
|
130
126
|
* subscription, 16.6 -> 66 credits. Tests on your own EmailGuard key stay 0.
|
|
131
127
|
*/
|
|
132
128
|
export declare const PLACEMENT_TEST_REPRICING: RepricedValue<16.6 | 66>;
|
|
133
|
-
/** EmailGuard monitoring per subscribed inbox-month, in credits, at the price in force. */
|
|
134
|
-
export declare function deliverabilitySeatCredits(options?: RepricingOptions): number;
|
|
135
129
|
/** One managed placement test beyond the included allowance, in credits, at the price in force. */
|
|
136
130
|
export declare function placementTestCredits(options?: RepricingOptions): number;
|
|
137
|
-
/**
|
|
138
|
-
export declare
|
|
139
|
-
/** What a managed Google inbox costs a month, all-in: mailbox, connection and warm-up. */
|
|
140
|
-
export declare const MANAGED_INBOX_ALL_IN_REPRICING: RepricedValue<number>;
|
|
141
|
-
/** A managed Google inbox's monthly credits, all-in, at the switch state (marketing and docs). */
|
|
142
|
-
export declare function managedInboxAllInCredits(options?: RepricingOptions): number;
|
|
131
|
+
/** A managed inbox's committed monthly credits, all-in: the flat mailbox line plus its connection. */
|
|
132
|
+
export declare function managedInboxAllInCredits(): number;
|
|
143
133
|
/**
|
|
144
134
|
* S41 (decision 6.3): a provider call made with the customer's own API key
|
|
145
135
|
* (BYOK) pays a 0.05-credit platform fee, up from nothing. The vendor still
|
|
@@ -240,7 +240,8 @@ export const S20_RESERVATION_PRICE_RISES = [
|
|
|
240
240
|
unit: "credits_per_number_per_month",
|
|
241
241
|
description: "Monthly credit reservation for a connected WhatsApp number.",
|
|
242
242
|
before: 1_000,
|
|
243
|
-
|
|
243
|
+
// Decision 2.3 set 3,000; the founder made it 3,400, a LinkedIn account's price (2026-10-07).
|
|
244
|
+
after: 3_400,
|
|
244
245
|
}),
|
|
245
246
|
defineRepricedValue({
|
|
246
247
|
key: "seat.phone_number",
|
|
@@ -286,25 +287,16 @@ export const AUTOMATION_STEPS_COUNT_TOWARD_RUN_CAP_REPRICING = defineRepricedVal
|
|
|
286
287
|
before: false,
|
|
287
288
|
after: true,
|
|
288
289
|
});
|
|
289
|
-
// ---- S30 (
|
|
290
|
-
//
|
|
291
|
-
//
|
|
292
|
-
// `
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
key: "commitment.deliverability_unit",
|
|
300
|
-
kind: "price",
|
|
301
|
-
slice: "S30",
|
|
302
|
-
decision: "3.5",
|
|
303
|
-
unit: "credits_per_inbox_per_month",
|
|
304
|
-
description: "EmailGuard monitoring per subscribed inbox, including its included placement tests each cycle.",
|
|
305
|
-
before: 100,
|
|
306
|
-
after: SNAPSHOT_DELIVERABILITY_SEAT_CREDITS,
|
|
307
|
-
});
|
|
290
|
+
// ---- S30 (decision 3.6): the extra placement test on the 5x markup. -------
|
|
291
|
+
// The key is the pricing-seed charge key, so the seed row and the snapshot carry
|
|
292
|
+
// the new price, `after` reads it from the snapshot (one definition), and
|
|
293
|
+
// `repricedValue` holds the old price until the instant. EmailGuard monitoring
|
|
294
|
+
// itself rose 100 -> 135 here (decision 3.5) until the founder set it back to a
|
|
295
|
+
// round 100 on 2026-10-07, so nothing about it moves at the switch any more.
|
|
296
|
+
/** EmailGuard monitoring per subscribed inbox-month, in credits, including its placement tests. */
|
|
297
|
+
export function deliverabilitySeatCredits() {
|
|
298
|
+
return SNAPSHOT_DELIVERABILITY_SEAT_CREDITS;
|
|
299
|
+
}
|
|
308
300
|
/**
|
|
309
301
|
* S30 (decision 3.6; flat literal, proposal P-29): one managed placement test
|
|
310
302
|
* past an inbox's included allowance, or on an inbox with no monitoring
|
|
@@ -320,51 +312,23 @@ export const PLACEMENT_TEST_REPRICING = defineRepricedValue({
|
|
|
320
312
|
before: 16.6,
|
|
321
313
|
after: SNAPSHOT_PLACEMENT_TEST_CREDITS,
|
|
322
314
|
});
|
|
323
|
-
/** EmailGuard monitoring per subscribed inbox-month, in credits, at the price in force. */
|
|
324
|
-
export function deliverabilitySeatCredits(options = {}) {
|
|
325
|
-
return repricedValue(DELIVERABILITY_SEAT_REPRICING, options);
|
|
326
|
-
}
|
|
327
315
|
/** One managed placement test beyond the included allowance, in credits, at the price in force. */
|
|
328
316
|
export function placementTestCredits(options = {}) {
|
|
329
317
|
return repricedValue(PLACEMENT_TEST_REPRICING, options);
|
|
330
318
|
}
|
|
331
|
-
// ---- S32
|
|
332
|
-
//
|
|
333
|
-
//
|
|
334
|
-
//
|
|
335
|
-
//
|
|
336
|
-
//
|
|
337
|
-
//
|
|
338
|
-
//
|
|
339
|
-
//
|
|
340
|
-
//
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
export const MANAGED_MAILBOX_REPRICING = defineRepricedValue({
|
|
345
|
-
key: "commitment.managed_mailbox",
|
|
346
|
-
kind: "price",
|
|
347
|
-
slice: "S32",
|
|
348
|
-
decision: "3.1",
|
|
349
|
-
unit: "credits_per_inbox_per_month",
|
|
350
|
-
description: "The mailbox line of a managed Google inbox, a flat price. Its 100-credit mailbox connection, with warm-up included, is billed beside it.",
|
|
351
|
-
before: 300,
|
|
352
|
-
after: SNAPSHOT_MANAGED_MAILBOX_CREDITS,
|
|
353
|
-
});
|
|
354
|
-
/** What a managed Google inbox costs a month, all-in: mailbox, connection and warm-up. */
|
|
355
|
-
export const MANAGED_INBOX_ALL_IN_REPRICING = defineRepricedValue({
|
|
356
|
-
key: "managed_inbox.google_all_in_credits",
|
|
357
|
-
kind: "price",
|
|
358
|
-
slice: "S32",
|
|
359
|
-
decision: "3.1",
|
|
360
|
-
unit: "credits_per_inbox_per_month",
|
|
361
|
-
description: "A managed Google inbox, all-in: the mailbox plus its mailbox connection, warm-up included. Inbox placement is an optional add-on.",
|
|
362
|
-
before: 400,
|
|
363
|
-
after: SNAPSHOT_MANAGED_MAILBOX_CREDITS + SNAPSHOT_SENDING_MAILBOX_CREDITS,
|
|
364
|
-
});
|
|
365
|
-
/** A managed Google inbox's monthly credits, all-in, at the switch state (marketing and docs). */
|
|
366
|
-
export function managedInboxAllInCredits(options = {}) {
|
|
367
|
-
return repricedValue(MANAGED_INBOX_ALL_IN_REPRICING, options);
|
|
319
|
+
// ---- S32: a managed inbox, all-in. --------------------------------------
|
|
320
|
+
// Once the all-in price applies (`isManagedInboxAllInPriceActive` in
|
|
321
|
+
// @oxygen/integrations: the 2026-09 switch AND credit commitments billing
|
|
322
|
+
// `sending_mailbox` and `managed_mailbox`), a Google or Microsoft 365 mailbox sells
|
|
323
|
+
// at the pricing book's flat `commitment.managed_mailbox` line and an Azure tenant at
|
|
324
|
+
// its flat `commitment.managed_azure_tenant` (founder, 2026-10-07: one inbox price,
|
|
325
|
+
// a round tenant price). Each inbox also holds the 100-credit mailbox connection,
|
|
326
|
+
// warm-up included. Before it, a mailbox was priced from vendor cost and warm-up
|
|
327
|
+
// billed beside it: 300 + 100 for Google at the $2.50 contracted cost, the same 400
|
|
328
|
+
// a month, so nothing about the all-in total moves at the switch.
|
|
329
|
+
/** A managed inbox's committed monthly credits, all-in: the flat mailbox line plus its connection. */
|
|
330
|
+
export function managedInboxAllInCredits() {
|
|
331
|
+
return SNAPSHOT_MANAGED_MAILBOX_CREDITS + SNAPSHOT_SENDING_MAILBOX_CREDITS;
|
|
368
332
|
}
|
|
369
333
|
/**
|
|
370
334
|
* S41 (decision 6.3): a provider call made with the customer's own API key
|
|
@@ -611,10 +575,7 @@ export const REPRICING_2026_09_SCHEDULE = [
|
|
|
611
575
|
TOPUP_RATE_REPRICING,
|
|
612
576
|
...storageCutEntries(),
|
|
613
577
|
...S20_RESERVATION_PRICE_RISES,
|
|
614
|
-
DELIVERABILITY_SEAT_REPRICING,
|
|
615
578
|
PLACEMENT_TEST_REPRICING,
|
|
616
|
-
MANAGED_MAILBOX_REPRICING,
|
|
617
|
-
MANAGED_INBOX_ALL_IN_REPRICING,
|
|
618
579
|
EMAIL_MAILBOX_DAILY_CAP_MAXIMUM,
|
|
619
580
|
EMAIL_MAILBOX_OLD_DEFAULT_DAILY_CAP,
|
|
620
581
|
AUTOMATION_STEP_CREDITS_REPRICING,
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The model tier each AI-column research-loop depth runs on, whatever tier the
|
|
3
|
+
* column stores. A routing fact, not a price: the credits a depth costs come from
|
|
4
|
+
* the pricing book (OXP-1.22.25 retires the committed price sheet), so this lives
|
|
5
|
+
* apart from every price.
|
|
6
|
+
*/
|
|
7
|
+
export declare const RESEARCH_DEPTH_MODEL_TIER: {
|
|
8
|
+
readonly standard: "low";
|
|
9
|
+
readonly deep: "medium";
|
|
10
|
+
};
|
|
11
|
+
export type ResearchLoopDepth = keyof typeof RESEARCH_DEPTH_MODEL_TIER;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The model tier each AI-column research-loop depth runs on, whatever tier the
|
|
3
|
+
* column stores. A routing fact, not a price: the credits a depth costs come from
|
|
4
|
+
* the pricing book (OXP-1.22.25 retires the committed price sheet), so this lives
|
|
5
|
+
* apart from every price.
|
|
6
|
+
*/
|
|
7
|
+
export const RESEARCH_DEPTH_MODEL_TIER = { standard: "low", deep: "medium" };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const OXYGEN_BUILD_VERSION = "1.
|
|
1
|
+
export declare const OXYGEN_BUILD_VERSION = "1.1013.15";
|
|
@@ -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.
|
|
2
|
+
export const OXYGEN_BUILD_VERSION = "1.1013.15";
|
|
@@ -49,4 +49,7 @@ export const OXYGEN_VERSION = OXYGEN_BUILD_VERSION;
|
|
|
49
49
|
// Since 2026-09-28 the release-preparation step advances this literal to the
|
|
50
50
|
// highest CLI version published on npm for at least 30 days. It never lowers
|
|
51
51
|
// the floor. The source change lands on dev before the next production release.
|
|
52
|
-
export const OXYGEN_MINIMUM_CLI_VERSION = "1.
|
|
52
|
+
export const OXYGEN_MINIMUM_CLI_VERSION = "1.922.14";
|
|
53
|
+
// The internal GEO export first gains required pagination in this dev version.
|
|
54
|
+
// Earlier pilot clients would save a partial file without its continuation.
|
|
55
|
+
export const GEO_EXPORT_MINIMUM_CLI_VERSION = "1.1013.0";
|
|
@@ -30,6 +30,52 @@ export declare const WHATSAPP_SENDER_LIMIT_MAXIMUMS: {
|
|
|
30
30
|
readonly min_action_spacing_seconds: 3600;
|
|
31
31
|
readonly action_spacing_jitter_seconds: 1800;
|
|
32
32
|
};
|
|
33
|
+
/** OXYGEN policy, not a provider-published guarantee of account safety. */
|
|
34
|
+
export declare const WHATSAPP_WARMUP_RAMP: ReadonlyArray<{
|
|
35
|
+
throughDay: number;
|
|
36
|
+
cap: number;
|
|
37
|
+
}>;
|
|
38
|
+
export declare const WHATSAPP_WARMUP_FULL_CAP: 40;
|
|
39
|
+
export declare const WHATSAPP_CONNECTION_COOLDOWN_MS: number;
|
|
40
|
+
export declare const WHATSAPP_WARMUP_DAY_BASIS: "elapsed_24_hour_periods";
|
|
41
|
+
export declare function whatsAppRampCapForDay(day: number): number;
|
|
42
|
+
export declare function whatsAppWarmupDay(anchor: Date | null, now?: Date): number;
|
|
43
|
+
/** Poll timestamps never advance this clock; legacy mirrors retain their creation time. */
|
|
44
|
+
export declare function whatsAppConnectionCooldown(sender: {
|
|
45
|
+
metadata?: Record<string, unknown> | null;
|
|
46
|
+
createdAt?: Date | string | null;
|
|
47
|
+
}, now?: Date): {
|
|
48
|
+
session_connected_at: string | null;
|
|
49
|
+
outreach_resume_at: string | null;
|
|
50
|
+
blocked: boolean;
|
|
51
|
+
};
|
|
52
|
+
/** Stored reads expose the same elapsed-day policy that dispatch enforces. */
|
|
53
|
+
export declare function whatsAppWarmupStatus(sender: {
|
|
54
|
+
warmupStartedAt: Date | null;
|
|
55
|
+
limitOverrides?: Partial<Record<WhatsAppSenderLimitKey, unknown>> | null;
|
|
56
|
+
metadata?: Record<string, unknown> | null;
|
|
57
|
+
createdAt?: Date | string | null;
|
|
58
|
+
}, now?: Date): {
|
|
59
|
+
session_connected_at: string | null;
|
|
60
|
+
outreach_resume_at: string | null;
|
|
61
|
+
blocked: boolean;
|
|
62
|
+
warmup_started_at: string | null;
|
|
63
|
+
warmup_day: number;
|
|
64
|
+
day_basis: "elapsed_24_hour_periods";
|
|
65
|
+
ramp_cap_today: number;
|
|
66
|
+
configured_daily_cap: number;
|
|
67
|
+
effective_daily_cap: number;
|
|
68
|
+
ramp: ({
|
|
69
|
+
from_day: number;
|
|
70
|
+
through_day: number;
|
|
71
|
+
messages_per_day: number;
|
|
72
|
+
} | {
|
|
73
|
+
from_day: number;
|
|
74
|
+
through_day: null;
|
|
75
|
+
messages_per_day: number;
|
|
76
|
+
})[];
|
|
77
|
+
connection_cooldown_hours: number;
|
|
78
|
+
};
|
|
33
79
|
/** What each WhatsApp limit counts, for MCP and CLI help. */
|
|
34
80
|
export declare const WHATSAPP_SENDER_LIMIT_NOTES: Record<WhatsAppSenderLimitKey, string>;
|
|
35
81
|
/**
|
|
@@ -38,9 +38,59 @@ export const WHATSAPP_SENDER_LIMIT_MAXIMUMS = {
|
|
|
38
38
|
min_action_spacing_seconds: 3600,
|
|
39
39
|
action_spacing_jitter_seconds: 1800,
|
|
40
40
|
};
|
|
41
|
+
/** OXYGEN policy, not a provider-published guarantee of account safety. */
|
|
42
|
+
export const WHATSAPP_WARMUP_RAMP = [
|
|
43
|
+
{ throughDay: 2, cap: 5 },
|
|
44
|
+
{ throughDay: 6, cap: 10 },
|
|
45
|
+
{ throughDay: 13, cap: 15 },
|
|
46
|
+
];
|
|
47
|
+
export const WHATSAPP_WARMUP_FULL_CAP = WHATSAPP_SENDER_LIMIT_MAXIMUMS.messages_per_day;
|
|
48
|
+
export const WHATSAPP_CONNECTION_COOLDOWN_MS = 24 * 60 * 60 * 1000;
|
|
49
|
+
export const WHATSAPP_WARMUP_DAY_BASIS = "elapsed_24_hour_periods";
|
|
50
|
+
export function whatsAppRampCapForDay(day) {
|
|
51
|
+
return WHATSAPP_WARMUP_RAMP.find((step) => day <= step.throughDay)?.cap ?? WHATSAPP_WARMUP_FULL_CAP;
|
|
52
|
+
}
|
|
53
|
+
export function whatsAppWarmupDay(anchor, now = new Date()) {
|
|
54
|
+
if (!anchor || !Number.isFinite(anchor.getTime()))
|
|
55
|
+
return 0;
|
|
56
|
+
return Math.max(0, Math.floor((now.getTime() - anchor.getTime()) / WHATSAPP_CONNECTION_COOLDOWN_MS));
|
|
57
|
+
}
|
|
58
|
+
/** Poll timestamps never advance this clock; legacy mirrors retain their creation time. */
|
|
59
|
+
export function whatsAppConnectionCooldown(sender, now = new Date()) {
|
|
60
|
+
const raw = sender.metadata?.whatsapp_session_connected_at ?? sender.createdAt;
|
|
61
|
+
const at = raw instanceof Date ? raw : typeof raw === "string" ? new Date(raw) : null;
|
|
62
|
+
if (!at || !Number.isFinite(at.getTime())) {
|
|
63
|
+
return { session_connected_at: null, outreach_resume_at: null, blocked: true };
|
|
64
|
+
}
|
|
65
|
+
const resume = new Date(at.getTime() + WHATSAPP_CONNECTION_COOLDOWN_MS);
|
|
66
|
+
return { session_connected_at: at.toISOString(), outreach_resume_at: resume.toISOString(), blocked: now < resume };
|
|
67
|
+
}
|
|
68
|
+
/** Stored reads expose the same elapsed-day policy that dispatch enforces. */
|
|
69
|
+
export function whatsAppWarmupStatus(sender, now = new Date()) {
|
|
70
|
+
const day = whatsAppWarmupDay(sender.warmupStartedAt, now);
|
|
71
|
+
const configured = resolveWhatsAppSenderLimits(sender.limitOverrides).messages_per_day;
|
|
72
|
+
const ramp = whatsAppRampCapForDay(day);
|
|
73
|
+
return {
|
|
74
|
+
warmup_started_at: sender.warmupStartedAt && Number.isFinite(sender.warmupStartedAt.getTime()) ? sender.warmupStartedAt.toISOString() : null,
|
|
75
|
+
warmup_day: day,
|
|
76
|
+
day_basis: WHATSAPP_WARMUP_DAY_BASIS,
|
|
77
|
+
ramp_cap_today: ramp,
|
|
78
|
+
configured_daily_cap: configured,
|
|
79
|
+
effective_daily_cap: Math.min(configured, ramp),
|
|
80
|
+
ramp: [
|
|
81
|
+
...WHATSAPP_WARMUP_RAMP.map((step, index) => ({
|
|
82
|
+
from_day: index === 0 ? 0 : WHATSAPP_WARMUP_RAMP[index - 1].throughDay + 1,
|
|
83
|
+
through_day: step.throughDay, messages_per_day: Math.min(configured, step.cap),
|
|
84
|
+
})),
|
|
85
|
+
{ from_day: 14, through_day: null, messages_per_day: configured },
|
|
86
|
+
],
|
|
87
|
+
connection_cooldown_hours: 24,
|
|
88
|
+
...whatsAppConnectionCooldown(sender, now),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
41
91
|
/** What each WhatsApp limit counts, for MCP and CLI help. */
|
|
42
92
|
export const WHATSAPP_SENDER_LIMIT_NOTES = {
|
|
43
|
-
messages_per_day: "Daily WhatsApp messages across direct warm traffic and opted-in Sequence actions
|
|
93
|
+
messages_per_day: "Daily WhatsApp messages across direct warm traffic and opted-in Sequence actions. Ramp: days 0–2: 5; 3–6: 10; 7–13: 15; 14+: configured cap (20 default, 40 maximum). New outreach waits 24 hours after connection or reconnection.",
|
|
44
94
|
likes_per_day: "Daily reactions.",
|
|
45
95
|
messages_reads_per_day: "Chat and message-history reads.",
|
|
46
96
|
relations_reads_per_day: "Chat-list reads.",
|
|
@@ -6,6 +6,11 @@
|
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
8
8
|
"exports": {
|
|
9
|
+
"./external-write-policy": {
|
|
10
|
+
"types": "./dist/external-write-policy.d.ts",
|
|
11
|
+
"import": "./dist/external-write-policy.js",
|
|
12
|
+
"default": "./dist/external-write-policy.js"
|
|
13
|
+
},
|
|
9
14
|
"./knowledge-vault-markdown": {
|
|
10
15
|
"types": "./dist/knowledge-vault-markdown.d.ts",
|
|
11
16
|
"import": "./dist/knowledge-vault-markdown.js",
|
|
@@ -196,6 +201,11 @@
|
|
|
196
201
|
"import": "./dist/pricing-sheet.js",
|
|
197
202
|
"default": "./dist/pricing-sheet.js"
|
|
198
203
|
},
|
|
204
|
+
"./research-depth": {
|
|
205
|
+
"types": "./dist/research-depth.d.ts",
|
|
206
|
+
"import": "./dist/research-depth.js",
|
|
207
|
+
"default": "./dist/research-depth.js"
|
|
208
|
+
},
|
|
199
209
|
"./copilot-plan": {
|
|
200
210
|
"types": "./dist/copilot-plan.d.ts",
|
|
201
211
|
"import": "./dist/copilot-plan.js",
|