@oxygen-agent/cli 1.1010.721 → 1.1010.950
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/auto-update.d.ts +129 -0
- package/dist/auto-update.js +392 -0
- package/dist/command-manifest.js +14 -0
- package/dist/contract-flags.d.ts +42 -0
- package/dist/contract-flags.js +220 -0
- package/dist/credentials.d.ts +2 -0
- package/dist/credentials.js +6 -3
- package/dist/functions-commands.js +1 -1
- package/dist/http-client.js +28 -4
- package/dist/index.js +622 -325
- package/dist/run-wait.d.ts +3 -1
- package/dist/run-wait.js +19 -5
- package/dist/sender-limits-flags.d.ts +14 -0
- package/dist/sender-limits-flags.js +157 -0
- package/dist/streamed-file-import.d.ts +58 -0
- package/dist/streamed-file-import.js +115 -0
- package/dist/ugc-commands.js +16 -2
- package/dist/update.d.ts +29 -0
- package/dist/update.js +62 -16
- package/dist/workflow-plan-limit-notices.d.ts +8 -0
- package/dist/workflow-plan-limit-notices.js +28 -0
- package/node_modules/@oxygen/cli-ugc/dist/commands.js +6 -6
- package/node_modules/@oxygen/cli-ugc/dist/field-parser.d.ts +4 -0
- package/node_modules/@oxygen/cli-ugc/dist/field-parser.js +20 -8
- package/node_modules/@oxygen/cli-ugc/dist/index.d.ts +1 -0
- package/node_modules/@oxygen/cli-ugc/dist/index.js +1 -0
- package/node_modules/@oxygen/shared/dist/billing-anchors.d.ts +17 -0
- package/node_modules/@oxygen/shared/dist/billing-anchors.js +27 -0
- package/node_modules/@oxygen/shared/dist/billing.d.ts +191 -35
- package/node_modules/@oxygen/shared/dist/billing.js +333 -42
- package/node_modules/@oxygen/shared/dist/capability-discovery.js +55 -5
- package/node_modules/@oxygen/shared/dist/contracts/operations.d.ts +39 -0
- package/node_modules/@oxygen/shared/dist/contracts/operations.js +11 -0
- package/node_modules/@oxygen/shared/dist/contracts/schema.d.ts +186 -0
- package/node_modules/@oxygen/shared/dist/contracts/schema.js +260 -0
- package/node_modules/@oxygen/shared/dist/contracts/sender-limits.d.ts +67 -0
- package/node_modules/@oxygen/shared/dist/contracts/sender-limits.js +88 -0
- package/node_modules/@oxygen/shared/dist/copilot-skills.generated.d.ts +2 -2
- package/node_modules/@oxygen/shared/dist/copilot-skills.generated.js +2 -2
- package/node_modules/@oxygen/shared/dist/cost-estimate-view.d.ts +50 -0
- package/node_modules/@oxygen/shared/dist/cost-estimate-view.js +90 -0
- package/node_modules/@oxygen/shared/dist/cost-estimate.d.ts +167 -0
- package/node_modules/@oxygen/shared/dist/cost-estimate.js +361 -0
- package/node_modules/@oxygen/shared/dist/credit-gate.d.ts +26 -0
- package/node_modules/@oxygen/shared/dist/credit-gate.js +65 -0
- package/node_modules/@oxygen/shared/dist/email-deliverability-policy.d.ts +51 -0
- package/node_modules/@oxygen/shared/dist/email-deliverability-policy.js +101 -0
- package/node_modules/@oxygen/shared/dist/email-hard-bounce.d.ts +3 -1
- package/node_modules/@oxygen/shared/dist/email-hard-bounce.js +3 -3
- package/node_modules/@oxygen/shared/dist/error-redaction.d.ts +1 -1
- package/node_modules/@oxygen/shared/dist/error-redaction.js +1 -1
- package/node_modules/@oxygen/shared/dist/feature-gates.d.ts +4 -0
- package/node_modules/@oxygen/shared/dist/feature-gates.js +5 -0
- package/node_modules/@oxygen/shared/dist/file-import.d.ts +13 -1
- package/node_modules/@oxygen/shared/dist/file-import.js +33 -6
- package/node_modules/@oxygen/shared/dist/hosted-ai.d.ts +73 -3
- package/node_modules/@oxygen/shared/dist/hosted-ai.js +246 -24
- package/node_modules/@oxygen/shared/dist/import-limits.d.ts +25 -1
- package/node_modules/@oxygen/shared/dist/import-limits.js +35 -2
- package/node_modules/@oxygen/shared/dist/index.d.ts +2 -22
- package/node_modules/@oxygen/shared/dist/index.js +2 -42
- package/node_modules/@oxygen/shared/dist/linkedin-sequences.d.ts +11 -0
- package/node_modules/@oxygen/shared/dist/linkedin-sequences.js +41 -0
- package/node_modules/@oxygen/shared/dist/object-storage.d.ts +9 -0
- package/node_modules/@oxygen/shared/dist/object-storage.js +17 -0
- package/node_modules/@oxygen/shared/dist/operational-telemetry.d.ts +41 -0
- package/node_modules/@oxygen/shared/dist/operational-telemetry.js +55 -0
- package/node_modules/@oxygen/shared/dist/plan-band.d.ts +117 -1
- package/node_modules/@oxygen/shared/dist/plan-band.js +175 -10
- package/node_modules/@oxygen/shared/dist/plan-capabilities.d.ts +77 -7
- package/node_modules/@oxygen/shared/dist/plan-capabilities.js +87 -7
- package/node_modules/@oxygen/shared/dist/plan-limits-view.d.ts +219 -0
- package/node_modules/@oxygen/shared/dist/plan-limits-view.js +330 -0
- package/node_modules/@oxygen/shared/dist/plan-limits.d.ts +204 -6
- package/node_modules/@oxygen/shared/dist/plan-limits.js +197 -15
- package/node_modules/@oxygen/shared/dist/pricing-sheet.d.ts +80 -36
- package/node_modules/@oxygen/shared/dist/pricing-sheet.js +80 -31
- package/node_modules/@oxygen/shared/dist/pricing-snapshot.generated.d.ts +38 -20
- package/node_modules/@oxygen/shared/dist/pricing-snapshot.generated.js +47 -34
- package/node_modules/@oxygen/shared/dist/product-briefing-rules.js +4 -2
- package/node_modules/@oxygen/shared/dist/provider-http-error.d.ts +10 -0
- package/node_modules/@oxygen/shared/dist/provider-http-error.js +27 -0
- package/node_modules/@oxygen/shared/dist/repricing.d.ts +127 -0
- package/node_modules/@oxygen/shared/dist/repricing.js +407 -6
- package/node_modules/@oxygen/shared/dist/semver.d.ts +21 -0
- package/node_modules/@oxygen/shared/dist/semver.js +41 -0
- package/node_modules/@oxygen/shared/dist/sending-limits.d.ts +5 -7
- package/node_modules/@oxygen/shared/dist/sending-limits.js +10 -16
- package/node_modules/@oxygen/shared/dist/sending-seats.d.ts +18 -15
- package/node_modules/@oxygen/shared/dist/sending-seats.js +22 -17
- package/node_modules/@oxygen/shared/dist/spend-safety.d.ts +57 -8
- package/node_modules/@oxygen/shared/dist/spend-safety.js +64 -11
- package/node_modules/@oxygen/shared/dist/stripe-price-catalog.d.ts +15 -7
- package/node_modules/@oxygen/shared/dist/stripe-price-catalog.js +18 -5
- package/node_modules/@oxygen/shared/dist/table-capacity.d.ts +35 -5
- package/node_modules/@oxygen/shared/dist/table-capacity.js +40 -8
- package/node_modules/@oxygen/shared/dist/telemetry-export-observer.d.ts +6 -0
- package/node_modules/@oxygen/shared/dist/telemetry-export-observer.js +13 -5
- package/node_modules/@oxygen/shared/dist/telemetry-resource.d.ts +40 -0
- package/node_modules/@oxygen/shared/dist/telemetry-resource.js +35 -0
- package/node_modules/@oxygen/shared/dist/telemetry.js +5 -0
- package/node_modules/@oxygen/shared/dist/ugc.d.ts +15 -0
- package/node_modules/@oxygen/shared/dist/ugc.js +29 -0
- package/node_modules/@oxygen/shared/dist/version.d.ts +1 -3
- 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 +17 -27
- package/node_modules/@oxygen/shared/dist/workspace-file-storage.d.ts +5 -0
- package/node_modules/@oxygen/shared/dist/workspace-file-storage.js +5 -0
- package/node_modules/@oxygen/workflows/dist/graph/manifest-schema.d.ts +3 -3
- package/node_modules/@oxygen/workflows/dist/graph/types.d.ts +15 -1
- package/node_modules/@oxygen/workflows/dist/graph/types.js +15 -1
- package/node_modules/@oxygen/workflows/dist/index.d.ts +45 -0
- package/node_modules/@oxygen/workflows/dist/index.js +152 -2
- package/node_modules/@oxygen/workflows/dist/usage-estimate.d.ts +10 -1
- package/node_modules/@oxygen/workflows/dist/usage-estimate.js +33 -29
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { findRepricedValue, repricedValue } from "./repricing.js";
|
|
1
|
+
import { findRepricedValue, readRepricingSwitch, repricedValue, } from "./repricing.js";
|
|
2
2
|
const GIB = 1024 ** 3;
|
|
3
3
|
/**
|
|
4
4
|
* The envelope every workspace had before storage scaled with plan size, and
|
|
@@ -43,11 +43,26 @@ export const PLAN_BAND_TABLE_CAPACITY_TARGETS = Object.freeze({
|
|
|
43
43
|
"1999": ladderRow(10_000_000, 100_000_000, 120),
|
|
44
44
|
});
|
|
45
45
|
/**
|
|
46
|
-
*
|
|
47
|
-
* rows per Table
|
|
48
|
-
*
|
|
46
|
+
* Rows per Table above today's 3,000,000 ship only after a capacity test at 5M
|
|
47
|
+
* and 10M rows per Table. The workspace totals of these bands (rows and
|
|
48
|
+
* database) are already in force (decision F.1, 2026-09-27, amending L1, which
|
|
49
|
+
* had gated both); shipping a band's rows per Table is removing it from this list.
|
|
49
50
|
*/
|
|
50
|
-
export const
|
|
51
|
+
export const PLAN_BANDS_AWAITING_TABLE_ROW_CAPACITY_TEST = Object.freeze(["999", "1999"]);
|
|
52
|
+
/**
|
|
53
|
+
* The capacity test itself runs on the self-hosted dev deployment, which
|
|
54
|
+
* therefore applies the awaiting bands' full ladder: a 10,000,000-row Table
|
|
55
|
+
* cannot be measured behind a 3,000,000-row limit. Every other deployment,
|
|
56
|
+
* production included, keeps the list above. The exact selector is compared
|
|
57
|
+
* (not `resolveDeployEnv`, which throws on a typo) so a malformed value keeps
|
|
58
|
+
* the production answer instead of failing a limits read.
|
|
59
|
+
*/
|
|
60
|
+
function awaitsTableRowCapacityTest(band, options) {
|
|
61
|
+
if (!PLAN_BANDS_AWAITING_TABLE_ROW_CAPACITY_TEST.includes(band))
|
|
62
|
+
return false;
|
|
63
|
+
const env = options.env ?? process.env;
|
|
64
|
+
return env.OXYGEN_DEPLOY_ENV?.trim().toLowerCase() !== "selfhost-dev";
|
|
65
|
+
}
|
|
51
66
|
const STORAGE_FIELDS = [
|
|
52
67
|
["tableRowLimit", "table_row_limit"],
|
|
53
68
|
["workspaceRowLimit", "workspace_row_limit"],
|
|
@@ -60,13 +75,16 @@ const STORAGE_FIELDS = [
|
|
|
60
75
|
* - A limit that tightens (free, $49, $99) is a scheduled 2026-09 repricing value
|
|
61
76
|
* (`storage.<band>.*` in `REPRICING_2026_09_SCHEDULE`): today's envelope until
|
|
62
77
|
* the effective-date switch, the ratified ladder from it on.
|
|
63
|
-
* - A band awaiting the capacity test
|
|
78
|
+
* - A band awaiting the rows-per-Table capacity test has its ladder workspace
|
|
79
|
+
* totals and keeps today's rows per Table, except on the self-hosted dev
|
|
80
|
+
* deployment, where the test runs.
|
|
64
81
|
* - Every other band is already at its ladder value.
|
|
65
82
|
*/
|
|
66
83
|
export function resolveWorkspaceTableCapacity(band, options = {}) {
|
|
67
|
-
if (PLAN_BANDS_AWAITING_CAPACITY_TEST.includes(band))
|
|
68
|
-
return WORKSPACE_TABLE_CAPACITY;
|
|
69
84
|
const target = PLAN_BAND_TABLE_CAPACITY_TARGETS[band];
|
|
85
|
+
if (awaitsTableRowCapacityTest(band, options)) {
|
|
86
|
+
return Object.freeze({ ...target, tableRowLimit: WORKSPACE_TABLE_CAPACITY.tableRowLimit });
|
|
87
|
+
}
|
|
70
88
|
const resolved = { ...target };
|
|
71
89
|
for (const [field, key] of STORAGE_FIELDS) {
|
|
72
90
|
const scheduled = findRepricedValue(`storage.${band}.${key}`);
|
|
@@ -76,3 +94,17 @@ export function resolveWorkspaceTableCapacity(band, options = {}) {
|
|
|
76
94
|
}
|
|
77
95
|
return Object.freeze(resolved);
|
|
78
96
|
}
|
|
97
|
+
export function describeWorkspaceTableCapacityStatus(band, options = {}) {
|
|
98
|
+
if (awaitsTableRowCapacityTest(band, options)) {
|
|
99
|
+
return { status: "awaiting_capacity_test", effectiveAt: null, target: PLAN_BAND_TABLE_CAPACITY_TARGETS[band] };
|
|
100
|
+
}
|
|
101
|
+
const state = readRepricingSwitch(options);
|
|
102
|
+
if (state.status === "scheduled") {
|
|
103
|
+
const current = resolveWorkspaceTableCapacity(band, options);
|
|
104
|
+
const target = resolveWorkspaceTableCapacity(band, { ...options, now: state.effectiveAt });
|
|
105
|
+
if (STORAGE_FIELDS.some(([field]) => current[field] !== target[field])) {
|
|
106
|
+
return { status: "scheduled", effectiveAt: state.effectiveAt, target };
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return { status: "in_force", effectiveAt: null, target: null };
|
|
110
|
+
}
|
|
@@ -46,6 +46,12 @@ export type TelemetryExportObserverOptions = {
|
|
|
46
46
|
windowMs?: number | undefined;
|
|
47
47
|
now?: (() => number) | undefined;
|
|
48
48
|
};
|
|
49
|
+
/**
|
|
50
|
+
* Copies the optional reader-facing exporter methods (FORWARDED_METHODS) from
|
|
51
|
+
* `inner` onto `wrapper`, bound to `inner`. Every exporter wrapper in this
|
|
52
|
+
* package uses it, so a method the SDK starts probing is added in one place.
|
|
53
|
+
*/
|
|
54
|
+
export declare function forwardExporterMethods(inner: object, wrapper: Record<string, unknown>): void;
|
|
49
55
|
/** Origin + path only: never query strings, fragments or URL credentials. */
|
|
50
56
|
export declare function telemetryEndpointForLog(endpoint: string): string;
|
|
51
57
|
/**
|
|
@@ -12,6 +12,18 @@ const FORWARDED_METHODS = [
|
|
|
12
12
|
"selectAggregationTemporality",
|
|
13
13
|
"selectAggregation",
|
|
14
14
|
];
|
|
15
|
+
/**
|
|
16
|
+
* Copies the optional reader-facing exporter methods (FORWARDED_METHODS) from
|
|
17
|
+
* `inner` onto `wrapper`, bound to `inner`. Every exporter wrapper in this
|
|
18
|
+
* package uses it, so a method the SDK starts probing is added in one place.
|
|
19
|
+
*/
|
|
20
|
+
export function forwardExporterMethods(inner, wrapper) {
|
|
21
|
+
for (const method of FORWARDED_METHODS) {
|
|
22
|
+
const fn = inner[method];
|
|
23
|
+
if (typeof fn === "function")
|
|
24
|
+
wrapper[method] = fn.bind(inner);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
15
27
|
/** Origin + path only: never query strings, fragments or URL credentials. */
|
|
16
28
|
export function telemetryEndpointForLog(endpoint) {
|
|
17
29
|
try {
|
|
@@ -187,11 +199,7 @@ export function observeTelemetryExporter(inner, options) {
|
|
|
187
199
|
return inner.shutdown();
|
|
188
200
|
},
|
|
189
201
|
};
|
|
190
|
-
|
|
191
|
-
const fn = inner[method];
|
|
192
|
-
if (typeof fn === "function")
|
|
193
|
-
observed[method] = fn.bind(inner);
|
|
194
|
-
}
|
|
202
|
+
forwardExporterMethods(inner, observed);
|
|
195
203
|
return observed;
|
|
196
204
|
}
|
|
197
205
|
const DROPPED_SPANS_MESSAGE = /^Dropped (\d+) spans because maxQueueSize reached$/;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which OTel resource each telemetry destination of this process receives.
|
|
3
|
+
*
|
|
4
|
+
* A process has ONE TracerProvider / MeterProvider and therefore one resource,
|
|
5
|
+
* but up to two destinations: Axiom (the managed-era store, whose dashboards and
|
|
6
|
+
* monitors filter on `deployment.environment == 'production'`) and the opt-in
|
|
7
|
+
* OTLP collector (DEV1 SigNoz, whose production receiver keeps only
|
|
8
|
+
* `deployment.environment == 'prod'` rows and whose dev receiver only `dev`).
|
|
9
|
+
*
|
|
10
|
+
* Production is the one tier where the two labels disagree, so production is the
|
|
11
|
+
* one tier that splits: the SDK resource stays exactly what a production process
|
|
12
|
+
* without a collector exports (the Axiom label, resource auto-detection on), and
|
|
13
|
+
* the collector's exporters swap in `collectorAttributes` — declared attributes
|
|
14
|
+
* only, never detected ones, because Node's process detector copies argv
|
|
15
|
+
* verbatim. Every other tier (dev, shadow, managed) keeps its single shared
|
|
16
|
+
* resource exactly as before.
|
|
17
|
+
*/
|
|
18
|
+
export type TelemetryResourcePlan = {
|
|
19
|
+
/** The SDK resource's `deployment.environment`: what Axiom receives. */
|
|
20
|
+
deploymentEnvironment: string;
|
|
21
|
+
/** The SDK resource attributes. */
|
|
22
|
+
resourceAttributes: Record<string, string>;
|
|
23
|
+
/** False when the collector shares the SDK resource, so nothing is detected into it. */
|
|
24
|
+
autoDetectResources: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Set only when the collector must see a different resource than Axiom: the
|
|
27
|
+
* declared attributes plus the process identity, labelled with the tier.
|
|
28
|
+
*/
|
|
29
|
+
collectorAttributes: Record<string, string> | null;
|
|
30
|
+
};
|
|
31
|
+
export type TelemetryResourcePlanInput = {
|
|
32
|
+
/** Every resource attribute except `deployment.environment`. */
|
|
33
|
+
declared: Record<string, string>;
|
|
34
|
+
/** The surface's managed fallback chain, used when OXYGEN_DEPLOY_ENV is unset. */
|
|
35
|
+
managedEnvironment: string;
|
|
36
|
+
/** True when OXYGEN_OTLP_ENDPOINT is configured for this process. */
|
|
37
|
+
collectorConfigured: boolean;
|
|
38
|
+
env?: NodeJS.ProcessEnv;
|
|
39
|
+
};
|
|
40
|
+
export declare function planTelemetryResource({ declared, managedEnvironment, collectorConfigured, env, }: TelemetryResourcePlanInput): TelemetryResourcePlan;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { deployEnvTelemetryEnvironment, resolveDeployEnv } from "./deploy-env.js";
|
|
2
|
+
import { processResourceIdentity } from "./process-resource.js";
|
|
3
|
+
export function planTelemetryResource({ declared, managedEnvironment, collectorConfigured, env = process.env, }) {
|
|
4
|
+
// The label a process without a collector has always exported: `production`
|
|
5
|
+
// on selfhost-prod, `development` on shadow/dev, the managed chain otherwise.
|
|
6
|
+
const axiomEnvironment = deployEnvTelemetryEnvironment(env) ?? managedEnvironment;
|
|
7
|
+
const withEnvironment = (environment, attributes) => ({
|
|
8
|
+
...attributes,
|
|
9
|
+
"deployment.environment": environment,
|
|
10
|
+
});
|
|
11
|
+
if (!collectorConfigured) {
|
|
12
|
+
return {
|
|
13
|
+
deploymentEnvironment: axiomEnvironment,
|
|
14
|
+
resourceAttributes: withEnvironment(axiomEnvironment, declared),
|
|
15
|
+
autoDetectResources: true,
|
|
16
|
+
collectorAttributes: null,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
const collectorEnvironment = env.OXYGEN_DEPLOY_ENV?.trim() ? resolveDeployEnv(env).tier : axiomEnvironment;
|
|
20
|
+
const collectorAttributes = withEnvironment(collectorEnvironment, { ...processResourceIdentity(), ...declared });
|
|
21
|
+
if (collectorEnvironment === "prod") {
|
|
22
|
+
return {
|
|
23
|
+
deploymentEnvironment: axiomEnvironment,
|
|
24
|
+
resourceAttributes: withEnvironment(axiomEnvironment, declared),
|
|
25
|
+
autoDetectResources: true,
|
|
26
|
+
collectorAttributes,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
deploymentEnvironment: collectorEnvironment,
|
|
31
|
+
resourceAttributes: collectorAttributes,
|
|
32
|
+
autoDetectResources: false,
|
|
33
|
+
collectorAttributes: null,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
@@ -226,6 +226,11 @@ const METRIC_SAFE_ATTRIBUTE_KEYS = new Set([
|
|
|
226
226
|
"worker.cycle.slow",
|
|
227
227
|
"table_action.lane",
|
|
228
228
|
"tenant.ticket_reason",
|
|
229
|
+
// oxygen.worker.tenant_queue_wait_ms: the ticket's narrow scope
|
|
230
|
+
// (copilot | publishing | none) and the tenant's plan band (the seven bands
|
|
231
|
+
// plus "unresolved"), which the worker-share target is read by. Closed enums.
|
|
232
|
+
"tenant.wake_kind",
|
|
233
|
+
"tenant.plan_band",
|
|
229
234
|
"queue.stalled",
|
|
230
235
|
// BullMQ execution queue dimensions (oxygen.worker.queue.*). `queue.lane` is
|
|
231
236
|
// the closed EXECUTION_LANES enum, `queue.role` the lane or "relay",
|
|
@@ -150,3 +150,18 @@ export type UgcVoiceImport = {
|
|
|
150
150
|
};
|
|
151
151
|
export declare const UGC_MONTHLY_CREATOR_CREDITS = 10000;
|
|
152
152
|
export declare const UGC_SPONSORED_LINKEDIN_SEATS = 1;
|
|
153
|
+
/**
|
|
154
|
+
* One label for a sponsor's row (`view=sponsorship`) on every surface, the web
|
|
155
|
+
* Creators tab and the MCP widget alike: a card sponsorship waiting on its
|
|
156
|
+
* checkout reads differently from one waiting on the provider, and a stopped
|
|
157
|
+
* renewal says so while its paid period runs.
|
|
158
|
+
*/
|
|
159
|
+
export declare function ugcSponsorshipStatusLabel(row: {
|
|
160
|
+
status: string;
|
|
161
|
+
checkout_url?: string | null;
|
|
162
|
+
cancellation_pending?: boolean;
|
|
163
|
+
}): string;
|
|
164
|
+
/** What confirming a credit-sponsorship quote does for one creator (`participants[].state`). */
|
|
165
|
+
export declare const UGC_SPONSORSHIP_PLAN_LABELS: Readonly<Record<string, string>>;
|
|
166
|
+
/** When a new credit sponsorship's reservation starts (`participants[].reservation_starts`). */
|
|
167
|
+
export declare const UGC_RESERVATION_START_LABELS: Readonly<Record<string, string>>;
|
|
@@ -10,3 +10,32 @@ export function ugcPostingTarget(program) {
|
|
|
10
10
|
}
|
|
11
11
|
export const UGC_MONTHLY_CREATOR_CREDITS = 10_000;
|
|
12
12
|
export const UGC_SPONSORED_LINKEDIN_SEATS = 1;
|
|
13
|
+
/**
|
|
14
|
+
* One label for a sponsor's row (`view=sponsorship`) on every surface, the web
|
|
15
|
+
* Creators tab and the MCP widget alike: a card sponsorship waiting on its
|
|
16
|
+
* checkout reads differently from one waiting on the provider, and a stopped
|
|
17
|
+
* renewal says so while its paid period runs.
|
|
18
|
+
*/
|
|
19
|
+
export function ugcSponsorshipStatusLabel(row) {
|
|
20
|
+
if (row.cancellation_pending)
|
|
21
|
+
return "Renewal stopping";
|
|
22
|
+
if (row.status === "active")
|
|
23
|
+
return "Sponsored";
|
|
24
|
+
if (row.status === "pending")
|
|
25
|
+
return row.checkout_url ? "Checkout open" : "Pending";
|
|
26
|
+
if (row.status === "cancelled")
|
|
27
|
+
return "Renewal stopped";
|
|
28
|
+
return "Not sponsored";
|
|
29
|
+
}
|
|
30
|
+
/** What confirming a credit-sponsorship quote does for one creator (`participants[].state`). */
|
|
31
|
+
export const UGC_SPONSORSHIP_PLAN_LABELS = {
|
|
32
|
+
new: "Starts",
|
|
33
|
+
already_active: "Already sponsored",
|
|
34
|
+
stripe_period_running: "Moves to credits when the card period ends",
|
|
35
|
+
checkout_open: "Card checkout still open; cancel it first",
|
|
36
|
+
};
|
|
37
|
+
/** When a new credit sponsorship's reservation starts (`participants[].reservation_starts`). */
|
|
38
|
+
export const UGC_RESERVATION_START_LABELS = {
|
|
39
|
+
now: "Now",
|
|
40
|
+
when_linkedin_connects: "When they connect LinkedIn",
|
|
41
|
+
};
|
|
@@ -1,4 +1,2 @@
|
|
|
1
1
|
export declare const OXYGEN_VERSION: string;
|
|
2
|
-
export declare const OXYGEN_MINIMUM_CLI_VERSION = "1.
|
|
3
|
-
export declare const MANAGED_INBOX_MINIMUM_CLI_VERSION = "1.326.2";
|
|
4
|
-
export declare const SUPPORT_AGENT_REPLY_MINIMUM_CLI_VERSION = "1.747.0";
|
|
2
|
+
export declare const OXYGEN_MINIMUM_CLI_VERSION = "1.906.0";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const OXYGEN_BUILD_VERSION = "1.1010.
|
|
1
|
+
export declare const OXYGEN_BUILD_VERSION = "1.1010.950";
|
|
@@ -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.1010.
|
|
2
|
+
export const OXYGEN_BUILD_VERSION = "1.1010.950";
|
|
@@ -26,7 +26,8 @@ export const OXYGEN_VERSION = OXYGEN_BUILD_VERSION;
|
|
|
26
26
|
// So floors LAG one release: publish the CLI in release N, raise the floor to it in
|
|
27
27
|
// release N+1. And a contract change that breaks ONE surface belongs on that
|
|
28
28
|
// surface — pass `minimumCliVersion` to requireCliIdentity/requireCliOrWebIdentity
|
|
29
|
-
// (
|
|
29
|
+
// (declare it here as <SURFACE>_MINIMUM_CLI_VERSION, above the global floor; the
|
|
30
|
+
// release gate checks it too). A per-route floor fails one command
|
|
30
31
|
// safely; a global floor fails the whole product. OXY-4091.
|
|
31
32
|
//
|
|
32
33
|
// 1.328.1: paid table action runs and background columns run require
|
|
@@ -34,29 +35,18 @@ export const OXYGEN_VERSION = OXYGEN_BUILD_VERSION;
|
|
|
34
35
|
// 1.328.1: LinkedIn → Sequencer rename moved the CLI/API/MCP surface
|
|
35
36
|
// (oxygen sequences|inbox|senders, /api/cli/{sequences,inbox,senders}) and
|
|
36
37
|
// removed the old /api/cli/linkedin/* routes — older CLIs would 404.
|
|
37
|
-
|
|
38
|
-
//
|
|
39
|
-
//
|
|
40
|
-
//
|
|
41
|
-
//
|
|
42
|
-
//
|
|
43
|
-
//
|
|
44
|
-
//
|
|
45
|
-
//
|
|
46
|
-
//
|
|
47
|
-
//
|
|
48
|
-
//
|
|
49
|
-
//
|
|
50
|
-
//
|
|
51
|
-
|
|
52
|
-
// contract move.) Do NOT raise the global OXYGEN_MINIMUM_CLI_VERSION for this.
|
|
53
|
-
export const MANAGED_INBOX_MINIMUM_CLI_VERSION = "1.326.2";
|
|
54
|
-
// Per-surface floor for guarded Plain agent reply + Done. CLI 1.747.0 is the
|
|
55
|
-
// first client that declares --agent, binds the latest customer-visible
|
|
56
|
-
// conversation-head message and
|
|
57
|
-
// body-authenticated preview token, carries the live agent_done_token into the
|
|
58
|
-
// separate Done confirmation, and never falls through to the retired resolve
|
|
59
|
-
// shape. This floor MUST remain dormant in production until 1.747.0 has been
|
|
60
|
-
// published by the preceding release per OXY-4091; the live feature gate is the
|
|
61
|
-
// rollout boundary that preserves that two-phase ordering.
|
|
62
|
-
export const SUPPORT_AGENT_REPLY_MINIMUM_CLI_VERSION = "1.747.0";
|
|
38
|
+
// 1.906.0 (2026-09-27): the floor had sat at 1.181.0, below both of those
|
|
39
|
+
// breaks, so CLIs that could no longer run paid actions or reach the Sequencer
|
|
40
|
+
// were still admitted. 1.906.0 has been the npm `latest` since 2026-08-29, far
|
|
41
|
+
// behind today's latest, so the lag rule holds. Measured before the raise
|
|
42
|
+
// (PostHog `cli_command_run`, PROD, 14 days): 9 of 87 active organizations
|
|
43
|
+
// were newest on an older CLI; each gets `cli_update_required` and one
|
|
44
|
+
// `oxygen update` away from working. CLIs that ship packages/cli/src/auto-update.ts
|
|
45
|
+
// update themselves on that rejection and re-run the command, so later raises
|
|
46
|
+
// stop costing a manual step — the lag rule still applies unchanged. The raise
|
|
47
|
+
// also retired both per-route floors, managed inboxes (1.326.2) and the guarded
|
|
48
|
+
// support agent reply (1.747.0): below the global floor they could refuse no one.
|
|
49
|
+
// Since 2026-09-28 the release-preparation step advances this literal to the
|
|
50
|
+
// highest CLI version published on npm for at least 30 days. It never lowers
|
|
51
|
+
// the floor. The source change lands on dev before the next production release.
|
|
52
|
+
export const OXYGEN_MINIMUM_CLI_VERSION = "1.906.0";
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
export declare const WORKSPACE_VISUAL_SOURCE_MAX_BYTES = 1500000;
|
|
2
2
|
export declare const WORKSPACE_VISUAL_BINARY_MAX_BYTES: number;
|
|
3
|
+
/**
|
|
4
|
+
* Retained workspace files (CRM record attachments). Table-import staging is not
|
|
5
|
+
* a workspace file and never reads these two ceilings: it stages under
|
|
6
|
+
* `imports/` through `presignImportUpload` up to the plan's import file limit.
|
|
7
|
+
*/
|
|
3
8
|
export declare const WORKSPACE_OPAQUE_FILE_MAX_BYTES: number;
|
|
4
9
|
/** Platform abuse guard shared by every plan, not a storage entitlement. */
|
|
5
10
|
export declare const WORKSPACE_RETAINED_FILES_MAX_BYTES: number;
|
|
@@ -6,6 +6,11 @@ import { OxygenError } from "./cli-result.js";
|
|
|
6
6
|
import { resolveObjectStorageClient } from "./object-storage.js";
|
|
7
7
|
export const WORKSPACE_VISUAL_SOURCE_MAX_BYTES = 1_500_000;
|
|
8
8
|
export const WORKSPACE_VISUAL_BINARY_MAX_BYTES = 50 * 1024 * 1024;
|
|
9
|
+
/**
|
|
10
|
+
* Retained workspace files (CRM record attachments). Table-import staging is not
|
|
11
|
+
* a workspace file and never reads these two ceilings: it stages under
|
|
12
|
+
* `imports/` through `presignImportUpload` up to the plan's import file limit.
|
|
13
|
+
*/
|
|
9
14
|
export const WORKSPACE_OPAQUE_FILE_MAX_BYTES = 100 * 1024 * 1024;
|
|
10
15
|
/** Platform abuse guard shared by every plan, not a storage entitlement. */
|
|
11
16
|
export const WORKSPACE_RETAINED_FILES_MAX_BYTES = 1024 * 1024 * 1024;
|
|
@@ -121,7 +121,7 @@ export declare const workflowCodeV1Schema: {
|
|
|
121
121
|
readonly timeout_ms: {
|
|
122
122
|
readonly type: "integer";
|
|
123
123
|
readonly minimum: 10;
|
|
124
|
-
readonly maximum:
|
|
124
|
+
readonly maximum: 30000;
|
|
125
125
|
readonly default: 1000;
|
|
126
126
|
};
|
|
127
127
|
readonly max_input_bytes: {
|
|
@@ -779,7 +779,7 @@ export declare const workflowGraphManifestSchema: {
|
|
|
779
779
|
readonly timeout_ms: {
|
|
780
780
|
readonly type: "integer";
|
|
781
781
|
readonly minimum: 10;
|
|
782
|
-
readonly maximum:
|
|
782
|
+
readonly maximum: 30000;
|
|
783
783
|
readonly default: 1000;
|
|
784
784
|
};
|
|
785
785
|
readonly max_input_bytes: {
|
|
@@ -1569,7 +1569,7 @@ export declare const portableWorkflowDefinitionSchema: {
|
|
|
1569
1569
|
readonly timeout_ms: {
|
|
1570
1570
|
readonly type: "integer";
|
|
1571
1571
|
readonly minimum: 10;
|
|
1572
|
-
readonly maximum:
|
|
1572
|
+
readonly maximum: 30000;
|
|
1573
1573
|
readonly default: 1000;
|
|
1574
1574
|
};
|
|
1575
1575
|
readonly max_input_bytes: {
|
|
@@ -162,8 +162,22 @@ export declare const WORKFLOW_CODE_V1_RUNTIME = "oxygen-js-v1";
|
|
|
162
162
|
export declare const WORKFLOW_CODE_V1_MAX_SOURCE_BYTES: number;
|
|
163
163
|
export declare const WORKFLOW_CODE_V1_MAX_INPUTS = 100;
|
|
164
164
|
export declare const WORKFLOW_CODE_V1_MIN_TIMEOUT_MS = 10;
|
|
165
|
-
|
|
165
|
+
/**
|
|
166
|
+
* The longest a typed Code node may declare (`limits.timeout_ms`): 30 s on every
|
|
167
|
+
* plan (repricing 2026-09, decision L4.3, up from 10 s). It applies to this
|
|
168
|
+
* sandboxed microVM runtime only; the legacy synchronous `run_source` path keeps
|
|
169
|
+
* its own lower ceiling (`PURE_WORKFLOW_FUNCTION_MAX_TIMEOUT_MS`, proposal P-49).
|
|
170
|
+
*/
|
|
171
|
+
export declare const WORKFLOW_CODE_V1_MAX_TIMEOUT_MS = 30000;
|
|
166
172
|
export declare const WORKFLOW_CODE_V1_DEFAULT_TIMEOUT_MS = 1000;
|
|
173
|
+
/**
|
|
174
|
+
* The wall-clock budget of one workflow run attempt on every plan: 30 minutes
|
|
175
|
+
* (repricing 2026-09, decision L4.3, up from 10). An attempt that reaches it is
|
|
176
|
+
* stopped and resumed from its durable checkpoints, not failed. The worker's
|
|
177
|
+
* default recipe timeout reads this; a deployment may still pin a lower value
|
|
178
|
+
* with `OXYGEN_WORKER_RECIPE_TIMEOUT_MS`.
|
|
179
|
+
*/
|
|
180
|
+
export declare const WORKFLOW_RUN_ATTEMPT_TIMEOUT_MS: number;
|
|
167
181
|
export declare const WORKFLOW_CODE_V1_MIN_INPUT_BYTES = 1000;
|
|
168
182
|
export declare const WORKFLOW_CODE_V1_MAX_INPUT_BYTES = 2000000;
|
|
169
183
|
export declare const WORKFLOW_CODE_V1_DEFAULT_INPUT_BYTES = 250000;
|
|
@@ -90,8 +90,22 @@ export const WORKFLOW_CODE_V1_RUNTIME = "oxygen-js-v1";
|
|
|
90
90
|
export const WORKFLOW_CODE_V1_MAX_SOURCE_BYTES = 64 * 1_024;
|
|
91
91
|
export const WORKFLOW_CODE_V1_MAX_INPUTS = 100;
|
|
92
92
|
export const WORKFLOW_CODE_V1_MIN_TIMEOUT_MS = 10;
|
|
93
|
-
|
|
93
|
+
/**
|
|
94
|
+
* The longest a typed Code node may declare (`limits.timeout_ms`): 30 s on every
|
|
95
|
+
* plan (repricing 2026-09, decision L4.3, up from 10 s). It applies to this
|
|
96
|
+
* sandboxed microVM runtime only; the legacy synchronous `run_source` path keeps
|
|
97
|
+
* its own lower ceiling (`PURE_WORKFLOW_FUNCTION_MAX_TIMEOUT_MS`, proposal P-49).
|
|
98
|
+
*/
|
|
99
|
+
export const WORKFLOW_CODE_V1_MAX_TIMEOUT_MS = 30_000;
|
|
94
100
|
export const WORKFLOW_CODE_V1_DEFAULT_TIMEOUT_MS = 1_000;
|
|
101
|
+
/**
|
|
102
|
+
* The wall-clock budget of one workflow run attempt on every plan: 30 minutes
|
|
103
|
+
* (repricing 2026-09, decision L4.3, up from 10). An attempt that reaches it is
|
|
104
|
+
* stopped and resumed from its durable checkpoints, not failed. The worker's
|
|
105
|
+
* default recipe timeout reads this; a deployment may still pin a lower value
|
|
106
|
+
* with `OXYGEN_WORKER_RECIPE_TIMEOUT_MS`.
|
|
107
|
+
*/
|
|
108
|
+
export const WORKFLOW_RUN_ATTEMPT_TIMEOUT_MS = 30 * 60 * 1000;
|
|
95
109
|
export const WORKFLOW_CODE_V1_MIN_INPUT_BYTES = 1_000;
|
|
96
110
|
export const WORKFLOW_CODE_V1_MAX_INPUT_BYTES = 2_000_000;
|
|
97
111
|
export const WORKFLOW_CODE_V1_DEFAULT_INPUT_BYTES = 250_000;
|
|
@@ -341,6 +341,43 @@ export declare function nextCronRunAfter(input: {
|
|
|
341
341
|
timezone?: string | null;
|
|
342
342
|
after?: Date;
|
|
343
343
|
}): Date;
|
|
344
|
+
/**
|
|
345
|
+
* The first slot of `cron` strictly after `after` that is also at least
|
|
346
|
+
* `minIntervalMinutes` after `lastFireAt`. This is how a plan's minimum cron
|
|
347
|
+
* interval (repricing 2026-09, decision L4.2) is enforced at fire time: a
|
|
348
|
+
* schedule that fires closer together than the plan allows keeps running, only
|
|
349
|
+
* slower, and is never deleted (proposal P-47). With no last fire or a minimum
|
|
350
|
+
* of one minute or less it is exactly `nextCronRunAfter`.
|
|
351
|
+
*/
|
|
352
|
+
export declare function nextCronRunAfterMinInterval(input: {
|
|
353
|
+
cron: string;
|
|
354
|
+
timezone?: string | null;
|
|
355
|
+
after: Date;
|
|
356
|
+
lastFireAt?: Date | null;
|
|
357
|
+
minIntervalMinutes?: number | null;
|
|
358
|
+
}): Date;
|
|
359
|
+
/**
|
|
360
|
+
* The smallest gap in minutes between two consecutive fires of `cron`, which is
|
|
361
|
+
* what a plan's minimum cron interval is checked against (repricing 2026-09,
|
|
362
|
+
* decision L4.2). It is the smallest gap, never the average: `0,5 9 * * *`
|
|
363
|
+
* fires once a day on average but twice five minutes apart, so its gap is 5.
|
|
364
|
+
*
|
|
365
|
+
* Gaps are measured in real time in `timezone`. A daylight-saving change can
|
|
366
|
+
* bring two fires closer than their wall-clock times suggest (01:55 and 03:05
|
|
367
|
+
* are ten minutes apart on the night the clock skips from 02:00 to 03:00, and
|
|
368
|
+
* a repeated hour can fire 01:45 and then 01:00 again), so the fires around
|
|
369
|
+
* each change in the coming year are simulated as well.
|
|
370
|
+
*
|
|
371
|
+
* Returns null when the schedule never fires twice within the scan (for
|
|
372
|
+
* example `0 9 29 2 *` fires once every few years and has no meaningful gap
|
|
373
|
+
* for a minimum to bind). Throws on an unparseable expression, like
|
|
374
|
+
* `nextCronRunAfter`.
|
|
375
|
+
*/
|
|
376
|
+
export declare function minCronGapMinutes(input: {
|
|
377
|
+
cron: string;
|
|
378
|
+
timezone?: string | null;
|
|
379
|
+
now?: Date;
|
|
380
|
+
}): number | null;
|
|
344
381
|
export declare function transformStep(input: {
|
|
345
382
|
id: string;
|
|
346
383
|
description?: string;
|
|
@@ -449,6 +486,14 @@ export declare function assertRecipeBundleSafe(bundle: string): void;
|
|
|
449
486
|
export declare function lintRecipeBundleSafety(bundle: string, path?: string): WorkflowLintIssue[];
|
|
450
487
|
/** Comment/string-aware author feedback for the stricter oxygen-js-v1 runtime. */
|
|
451
488
|
export declare function lintWorkflowCodeSourceSafety(source: string, path?: string): WorkflowLintIssue[];
|
|
489
|
+
/**
|
|
490
|
+
* The ceiling of the legacy synchronous `node:vm` path below. It stays at 10 s
|
|
491
|
+
* (and its callers pass 1 s) when the typed Code node rose to 30 s (repricing
|
|
492
|
+
* 2026-09, decision L4.3; proposal P-49): this path runs on the worker's own
|
|
493
|
+
* event loop, so a long synchronous script would stall every other job and its
|
|
494
|
+
* queue lock renewal. The typed Code node runs in a separate microVM instead.
|
|
495
|
+
*/
|
|
496
|
+
export declare const PURE_WORKFLOW_FUNCTION_MAX_TIMEOUT_MS = 10000;
|
|
452
497
|
export declare function runPureWorkflowFunction(input: {
|
|
453
498
|
source: string;
|
|
454
499
|
context: Record<string, unknown>;
|