@oxygen-agent/cli 1.1014.1035 → 1.1014.1087

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.
Files changed (59) hide show
  1. package/README.md +1 -1
  2. package/dist/command-manifest.js +1 -0
  3. package/dist/commands/deliverability.js +2 -0
  4. package/dist/commands/sequences.js +30 -2
  5. package/dist/credentials.js +1 -1
  6. package/dist/customer-operation-commands.js +62 -3
  7. package/dist/help.js +1 -1
  8. package/dist/index.d.ts +0 -97
  9. package/dist/index.js +0 -98
  10. package/dist/workspace-placement-commands.d.ts +3 -0
  11. package/dist/workspace-placement-commands.js +32 -0
  12. package/node_modules/@oxygen/shared/dist/agent-sessions.js +1 -1
  13. package/node_modules/@oxygen/shared/dist/agents-enabled.js +5 -2
  14. package/node_modules/@oxygen/shared/dist/capability-discovery.js +23 -5
  15. package/node_modules/@oxygen/shared/dist/contracts/agent-sessions.js +1 -1
  16. package/node_modules/@oxygen/shared/dist/contracts/customer-operations.js +1 -1
  17. package/node_modules/@oxygen/shared/dist/contracts/guided-activation.js +5 -5
  18. package/node_modules/@oxygen/shared/dist/contracts/guided-company-files.d.ts +30 -0
  19. package/node_modules/@oxygen/shared/dist/contracts/guided-company-files.js +53 -0
  20. package/node_modules/@oxygen/shared/dist/contracts/guided-first-sourcing.d.ts +120 -0
  21. package/node_modules/@oxygen/shared/dist/contracts/guided-first-sourcing.js +48 -0
  22. package/node_modules/@oxygen/shared/dist/contracts/guided-onboarding-journey.d.ts +267 -0
  23. package/node_modules/@oxygen/shared/dist/contracts/guided-onboarding-journey.js +63 -0
  24. package/node_modules/@oxygen/shared/dist/contracts/operations.d.ts +6 -0
  25. package/node_modules/@oxygen/shared/dist/contracts/operations.js +9 -4
  26. package/node_modules/@oxygen/shared/dist/contracts/table-query-raw.d.ts +2 -0
  27. package/node_modules/@oxygen/shared/dist/contracts/table-query-raw.js +3 -0
  28. package/node_modules/@oxygen/shared/dist/contracts/teammates.js +7 -7
  29. package/node_modules/@oxygen/shared/dist/email-tracking-token.d.ts +2 -0
  30. package/node_modules/@oxygen/shared/dist/email-tracking-token.js +1 -0
  31. package/node_modules/@oxygen/shared/dist/file-import.d.ts +46 -0
  32. package/node_modules/@oxygen/shared/dist/file-import.js +138 -0
  33. package/node_modules/@oxygen/shared/dist/guided-activation.d.ts +8 -0
  34. package/node_modules/@oxygen/shared/dist/guided-company-files.d.ts +13 -0
  35. package/node_modules/@oxygen/shared/dist/guided-company-files.js +14 -0
  36. package/node_modules/@oxygen/shared/dist/guided-first-sourcing.d.ts +116 -0
  37. package/node_modules/@oxygen/shared/dist/guided-first-sourcing.js +11 -0
  38. package/node_modules/@oxygen/shared/dist/guided-onboarding-answers.d.ts +4 -0
  39. package/node_modules/@oxygen/shared/dist/guided-onboarding-answers.js +42 -0
  40. package/node_modules/@oxygen/shared/dist/guided-onboarding-company-context.d.ts +22 -0
  41. package/node_modules/@oxygen/shared/dist/guided-onboarding-company-context.js +38 -0
  42. package/node_modules/@oxygen/shared/dist/guided-onboarding-journey.d.ts +147 -0
  43. package/node_modules/@oxygen/shared/dist/guided-onboarding-journey.fixture.d.ts +12 -0
  44. package/node_modules/@oxygen/shared/dist/guided-onboarding-journey.fixture.js +83 -0
  45. package/node_modules/@oxygen/shared/dist/guided-onboarding-journey.js +44 -0
  46. package/node_modules/@oxygen/shared/dist/guided-onboarding-prospects.d.ts +7 -0
  47. package/node_modules/@oxygen/shared/dist/guided-onboarding-prospects.js +13 -0
  48. package/node_modules/@oxygen/shared/dist/guided-onboarding-signals.d.ts +4 -0
  49. package/node_modules/@oxygen/shared/dist/guided-onboarding-signals.js +34 -0
  50. package/node_modules/@oxygen/shared/dist/guided-trial-billing.d.ts +26 -0
  51. package/node_modules/@oxygen/shared/dist/guided-trial-billing.js +19 -0
  52. package/node_modules/@oxygen/shared/dist/user-capability-routing.js +78 -0
  53. package/node_modules/@oxygen/shared/dist/version.generated.d.ts +1 -1
  54. package/node_modules/@oxygen/shared/dist/version.generated.js +1 -1
  55. package/node_modules/@oxygen/shared/dist/workspace-placement-view.d.ts +149 -0
  56. package/node_modules/@oxygen/shared/dist/workspace-placement-view.js +101 -0
  57. package/node_modules/@oxygen/shared/dist/workspace-placement.d.ts +77 -0
  58. package/node_modules/@oxygen/shared/dist/workspace-placement.js +94 -0
  59. package/package.json +1 -1
@@ -39,8 +39,8 @@ export const GUIDED_ACTIVATION_OPERATIONS = [
39
39
  cli: { path: ["onboarding", "activation", "status"], summary: "Resume your guided onboarding and native resource links. Enabled genuine dev only; current non-client workspace members." },
40
40
  mcp: { name: "oxygen_onboarding_activation_status", title: "Oxygen: Onboarding status", description: "Read your resumable guided onboarding and native links. Enabled genuine dev only; current non-client workspace members.", pack: "agents" }, mutates: false, spends: false },
41
41
  { id: "onboarding.activation.start", route: "/api/cli/onboarding/activation", method: "POST", contract: GUIDED_ACTIVATION_START_CONTRACT,
42
- cli: { path: ["onboarding", "activation", "start"], summary: "Prepare your activation and private Oxygent chat. Free; no message send or outreach." },
43
- mcp: { name: "oxygen_onboarding_activation_start", title: "Oxygen: Start onboarding record", description: "Prepare your activation with operating_path own_agent or oxygent. The oxygent path binds its native workspace Agent and creator-private chat. Free; no turn, inference, provider or outreach dispatch. Enabled genuine dev only; current non-client workspace members.", pack: "agents" }, mutates: true, spends: false },
42
+ cli: { path: ["onboarding", "activation", "start"], summary: "Prepare your creator-only activation and Oxygent chat: Workspace shared, Personal creator-only. Free; no send or outreach." },
43
+ mcp: { name: "oxygen_onboarding_activation_start", title: "Oxygen: Start onboarding record", description: "Prepare your creator-only activation with operating_path own_agent or oxygent. Oxygent binds its native Agent/chat: Workspace shared, Personal creator-only. Free; no turn, inference, provider or outreach dispatch. Enabled genuine dev only; current non-client workspace members.", pack: "agents" }, mutates: true, spends: false },
44
44
  { id: "onboarding.activation.get", route: "/api/cli/onboarding/activation/{activationId}", method: "GET", parameters: ["activationId"], contract: obj({}),
45
45
  cli: { path: ["onboarding", "activation", "get"], summary: "Read your activation by ID and its native resource links." },
46
46
  mcp: { name: "oxygen_onboarding_activation_get", title: "Oxygen: Read onboarding record", description: "Read your activation by activationId. Only its creator can read it. Enabled genuine dev only; current non-client workspace members.", pack: "agents" }, mutates: false, spends: false },
@@ -51,9 +51,9 @@ export const GUIDED_ACTIVATION_OPERATIONS = [
51
51
  cli: { path: ["onboarding", "activation", "first-leads"], summary: "Create or resume the activation-owned First leads Table. Free; no discovery, enrichment or outreach." },
52
52
  mcp: { name: "oxygen_onboarding_activation_first_leads", title: "Oxygen: First leads Table", description: "Create or resume one native First leads Table for your activationId. Free; no discovery, enrichment, enrollment or outreach. Use native search/ingestion separately.", pack: "agents" }, mutates: true, spends: false },
53
53
  { id: "onboarding.activation.routines_preview", route: "/api/cli/onboarding/activation/{activationId}/routines/preview", method: "POST", parameters: ["activationId"], contract: GUIDED_ACTIVATION_ROUTINES_PREVIEW_CONTRACT,
54
- cli: { path: ["onboarding", "activation", "routines-preview"], summary: "Review two explicitly configured draft routines, exact native source scope and caps. Arms no schedule." },
55
- mcp: { name: "oxygen_onboarding_activation_routines_preview", title: "Oxygen: Review daily routines", description: "Build native scan/briefing drafts and exact previews for activationId. Requires confirmed IANA timezone, both local times, source_ids and caps. Native Table sources quote zero; original ingestion sources need a current quote. Arms no schedule.", pack: "agents" }, mutates: true, spends: false },
54
+ cli: { path: ["onboarding", "activation", "routines-preview"], summary: "Save two routine draft configurations; review exact native source scope and caps. Arms no schedule." },
55
+ mcp: { name: "oxygen_onboarding_activation_routines_preview", title: "Oxygen: Review daily routines", description: "Save scan/briefing draft configuration and exact previews for activationId. Requires confirmed IANA timezone, both local times, source_ids and caps. Native Table sources quote zero; original ingestion sources need a current quote. Arms no schedule.", pack: "agents" }, mutates: true, spends: false },
56
56
  { id: "onboarding.activation.routine_activate", route: "/api/cli/onboarding/activation/{activationId}/routines/activate", method: "POST", parameters: ["activationId"], contract: GUIDED_ACTIVATION_ROUTINE_ACTIVATE_CONTRACT,
57
57
  cli: { path: ["onboarding", "activation", "routine-activate"], summary: "Activate one exact routine preview at its native revision. Requires approval or valid current creator-chat auto-approve authority." },
58
- mcp: { name: "oxygen_onboarding_activation_routine_activate", title: "Oxygen: Activate daily routine", description: "Activate one lead_scan or morning_briefing at exact native revision and preview_token. Requires approved=true or current auto-approve authority in the creator's bound private chat. Schedules are independent and remain capped; no automatic enrollment.", pack: "agents" }, mutates: true, spends: true },
58
+ mcp: { name: "oxygen_onboarding_activation_routine_activate", title: "Oxygen: Activate daily routine", description: "Activate lead_scan or morning_briefing at exact revision/preview_token. Requires approved=true or current creator auto-approve authority in the bound chat. Workspace shared; Personal creator-only. Separate capped schedules; no automatic enrollment.", pack: "agents" }, mutates: true, spends: true },
59
59
  ];
@@ -0,0 +1,30 @@
1
+ import { type ContractIssue } from "./schema.js";
2
+ import type { OperationSpec } from "./operations.js";
3
+ export declare const GUIDED_COMPANY_FILE_UPLOAD_CONTRACT: import("./schema.js").ContractObject<{
4
+ readonly revision: {
5
+ type: "integer";
6
+ description?: string;
7
+ minimum?: number;
8
+ maximum?: number;
9
+ "x-clamp"?: true;
10
+ };
11
+ readonly upload_id: import("./schema.js").StringProperty;
12
+ readonly sha256: import("./schema.js").StringProperty;
13
+ readonly size_bytes: {
14
+ type: "integer";
15
+ description?: string;
16
+ minimum?: number;
17
+ maximum?: number;
18
+ "x-clamp"?: true;
19
+ };
20
+ readonly file_name: import("./schema.js").StringProperty;
21
+ readonly content_type: {
22
+ type: "string";
23
+ enum: readonly ("application/pdf" | "text/markdown" | "text/plain")[];
24
+ description?: string;
25
+ };
26
+ readonly content_base64: import("./schema.js").StringProperty;
27
+ }, "content_base64" | "content_type" | "file_name" | "revision" | "sha256" | "size_bytes" | "upload_id">;
28
+ /** Raw wire values are never trimmed or renamed; the native owner verifies original SHA/bytes. */
29
+ export declare function guidedCompanyFileUploadInputIssues(args: Readonly<Record<string, unknown>>): readonly ContractIssue[];
30
+ export declare const GUIDED_COMPANY_FILE_UPLOAD_OPERATION: OperationSpec;
@@ -0,0 +1,53 @@
1
+ import { GUIDED_COMPANY_FILE_CONTENT_TYPES, GUIDED_COMPANY_FILE_LIMITS, guidedCompanyFileByteLimit } from "../guided-company-files.js";
2
+ import { enumOf, int, obj, str } from "./schema.js";
3
+ const uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/iu;
4
+ export const GUIDED_COMPANY_FILE_UPLOAD_CONTRACT = obj({
5
+ revision: int({ minimum: 1 }), upload_id: str({ pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" }),
6
+ sha256: str({ pattern: "^[0-9a-f]{64}$" }), size_bytes: int({ minimum: 1, maximum: GUIDED_COMPANY_FILE_LIMITS.pdfBytes }),
7
+ file_name: str({ minLength: 1, maxLength: GUIDED_COMPANY_FILE_LIMITS.nameBytes }),
8
+ content_type: enumOf(GUIDED_COMPANY_FILE_CONTENT_TYPES),
9
+ content_base64: str({ minLength: 4, maxLength: 4 * Math.ceil(GUIDED_COMPANY_FILE_LIMITS.pdfBytes / 3) }),
10
+ }, { required: ["revision", "upload_id", "sha256", "size_bytes", "file_name", "content_type", "content_base64"] });
11
+ /** Raw wire values are never trimmed or renamed; the native owner verifies original SHA/bytes. */
12
+ export function guidedCompanyFileUploadInputIssues(args) {
13
+ const issues = [];
14
+ const issue = (path, message) => issues.push({ path, message });
15
+ for (const key of ["activationId", "upload_id"])
16
+ if (typeof args[key] !== "string" || !uuid.test(args[key]))
17
+ issue(key, "Use a native UUID.");
18
+ const name = args.file_name;
19
+ if (typeof name !== "string" || !name.trim() || /[\\/\u0000-\u001f\u007f]/u.test(name) || new TextEncoder().encode(name).length > GUIDED_COMPANY_FILE_LIMITS.nameBytes)
20
+ issue("file_name", "Use a filename without paths or controls, at most 255 UTF-8 bytes.");
21
+ const type = args.content_type;
22
+ if (!GUIDED_COMPANY_FILE_CONTENT_TYPES.includes(type))
23
+ issue("content_type", "Use UTF-8 text, Markdown or PDF.");
24
+ else if (typeof args.size_bytes !== "number" || args.size_bytes > guidedCompanyFileByteLimit(type))
25
+ issue("size_bytes", "Use at most 1500000 text bytes or 5242880 PDF bytes.");
26
+ const encoded = args.content_base64;
27
+ if (typeof encoded !== "string" || !encoded || encoded.length % 4 !== 0 || /[^A-Za-z0-9+/=]/u.test(encoded) || !/^[^=]*={0,2}$/u.test(encoded))
28
+ issue("content_base64", "Use canonical non-empty base64 file bytes.");
29
+ else {
30
+ try {
31
+ const decoded = atob(encoded);
32
+ if (btoa(decoded) !== encoded)
33
+ issue("content_base64", "Use canonical base64 without altered padding bits.");
34
+ if (decoded.length !== args.size_bytes)
35
+ issue("size_bytes", "size_bytes must equal the original decoded byte length.");
36
+ }
37
+ catch {
38
+ issue("content_base64", "Use valid base64 file bytes.");
39
+ }
40
+ }
41
+ return issues;
42
+ }
43
+ export const GUIDED_COMPANY_FILE_UPLOAD_OPERATION = {
44
+ id: "onboarding.company_files.upload", route: "/api/cli/onboarding/activation/{activationId}/company-files", method: "POST",
45
+ parameters: ["activationId"], contract: GUIDED_COMPANY_FILE_UPLOAD_CONTRACT, inputCheck: guidedCompanyFileUploadInputIssues,
46
+ multipart: { contentField: "content_base64", nameField: "file_name", typeField: "content_type", fileField: "file",
47
+ fileMetadata: { sha256Field: "sha256", sizeBytesField: "size_bytes" } },
48
+ cli: { path: ["onboarding", "company-files", "upload"], summary: "Upload an optional company source file for your private DEV onboarding activation." },
49
+ mcp: { name: "oxygen_onboarding_company_files_upload", title: "Oxygen: Upload onboarding company file", pack: "agents",
50
+ description: "Current creator and revision only, genuine enabled DEV: upload UTF-8 text/Markdown up to 1500000 bytes or PDF up to 5242880 bytes. Supply original filename, MIME, size and SHA-256 plus stable upload_id UUID; exact retries reuse the native file. PDF retains original bytes with text unavailable. No account connection, parser, model or message send.",
51
+ annotations: { destructiveHint: false, openWorldHint: true, idempotentHint: true } },
52
+ mutates: true, spends: false,
53
+ };
@@ -0,0 +1,120 @@
1
+ import { type ContractIssue } from "./schema.js";
2
+ import type { OperationSpec } from "./operations.js";
3
+ /** Matches the actual native people-search and page safety ceilings. */
4
+ export declare const GUIDED_FIRST_SOURCING_LIMITS: {
5
+ readonly targetCount: 50000;
6
+ readonly maxPages: 1000;
7
+ };
8
+ export declare const GUIDED_FIRST_SOURCING_BOUNDS_CONTRACT: import("./schema.js").ContractObject<{
9
+ readonly targetCount: {
10
+ type: "integer";
11
+ description?: string;
12
+ minimum?: number;
13
+ maximum?: number;
14
+ "x-clamp"?: true;
15
+ };
16
+ readonly maxPages: {
17
+ type: "integer";
18
+ description?: string;
19
+ minimum?: number;
20
+ maximum?: number;
21
+ "x-clamp"?: true;
22
+ };
23
+ readonly maxCredits: {
24
+ readonly type: "number";
25
+ readonly description?: string;
26
+ readonly minimum?: number;
27
+ readonly maximum?: number;
28
+ readonly "x-clamp"?: true;
29
+ readonly exclusiveMinimum: 0;
30
+ };
31
+ }, "maxCredits" | "maxPages" | "targetCount">;
32
+ export declare const GUIDED_FIRST_SOURCING_PREVIEW_CONTRACT: import("./schema.js").ContractObject<{
33
+ revision: {
34
+ type: "integer";
35
+ description?: string;
36
+ minimum?: number;
37
+ maximum?: number;
38
+ "x-clamp"?: true;
39
+ };
40
+ bounds: import("./schema.js").ContractObject<{
41
+ readonly targetCount: {
42
+ type: "integer";
43
+ description?: string;
44
+ minimum?: number;
45
+ maximum?: number;
46
+ "x-clamp"?: true;
47
+ };
48
+ readonly maxPages: {
49
+ type: "integer";
50
+ description?: string;
51
+ minimum?: number;
52
+ maximum?: number;
53
+ "x-clamp"?: true;
54
+ };
55
+ readonly maxCredits: {
56
+ readonly type: "number";
57
+ readonly description?: string;
58
+ readonly minimum?: number;
59
+ readonly maximum?: number;
60
+ readonly "x-clamp"?: true;
61
+ readonly exclusiveMinimum: 0;
62
+ };
63
+ }, "maxCredits" | "maxPages" | "targetCount">;
64
+ }, "bounds" | "revision">;
65
+ export declare const GUIDED_FIRST_SOURCING_RUN_CONTRACT: import("./schema.js").ContractObject<{
66
+ readonly revision: {
67
+ type: "integer";
68
+ description?: string;
69
+ minimum?: number;
70
+ maximum?: number;
71
+ "x-clamp"?: true;
72
+ };
73
+ readonly bounds: import("./schema.js").ContractObject<{
74
+ readonly targetCount: {
75
+ type: "integer";
76
+ description?: string;
77
+ minimum?: number;
78
+ maximum?: number;
79
+ "x-clamp"?: true;
80
+ };
81
+ readonly maxPages: {
82
+ type: "integer";
83
+ description?: string;
84
+ minimum?: number;
85
+ maximum?: number;
86
+ "x-clamp"?: true;
87
+ };
88
+ readonly maxCredits: {
89
+ readonly type: "number";
90
+ readonly description?: string;
91
+ readonly minimum?: number;
92
+ readonly maximum?: number;
93
+ readonly "x-clamp"?: true;
94
+ readonly exclusiveMinimum: 0;
95
+ };
96
+ }, "maxCredits" | "maxPages" | "targetCount">;
97
+ readonly previewId: import("./schema.js").StringProperty;
98
+ readonly previewDigest: import("./schema.js").StringProperty;
99
+ readonly approved: import("./schema.js").BooleanProperty;
100
+ }, "approved" | "bounds" | "previewDigest" | "previewId" | "revision">;
101
+ export declare const GUIDED_FIRST_SOURCING_GET_CONTRACT: import("./schema.js").ContractObject<{
102
+ readonly revision: {
103
+ type: "integer";
104
+ description?: string;
105
+ minimum?: number;
106
+ maximum?: number;
107
+ "x-clamp"?: true;
108
+ };
109
+ readonly generation: {
110
+ type: "integer";
111
+ description?: string;
112
+ minimum?: number;
113
+ maximum?: number;
114
+ "x-clamp"?: true;
115
+ };
116
+ readonly timezoneHint: import("./schema.js").StringProperty;
117
+ }, never>;
118
+ export declare function guidedFirstSourcingGetInputIssues(args: Readonly<Record<string, unknown>>): readonly ContractIssue[];
119
+ export type GuidedFirstSourcingAction = "get" | "preview" | "run";
120
+ export declare const GUIDED_FIRST_SOURCING_OPERATIONS: readonly OperationSpec[];
@@ -0,0 +1,48 @@
1
+ import { bool, int, num, obj, str } from "./schema.js";
2
+ import { isValidTimeZone } from "../zoned-time.js";
3
+ /** Matches the actual native people-search and page safety ceilings. */
4
+ export const GUIDED_FIRST_SOURCING_LIMITS = { targetCount: 50000, maxPages: 1000 };
5
+ export const GUIDED_FIRST_SOURCING_BOUNDS_CONTRACT = obj({
6
+ targetCount: int({ minimum: 1, maximum: GUIDED_FIRST_SOURCING_LIMITS.targetCount }),
7
+ maxPages: int({ minimum: 1, maximum: GUIDED_FIRST_SOURCING_LIMITS.maxPages }),
8
+ maxCredits: { ...num(), exclusiveMinimum: 0 },
9
+ }, { required: ["targetCount", "maxPages", "maxCredits"] });
10
+ const request = { revision: int({ minimum: 1 }), bounds: GUIDED_FIRST_SOURCING_BOUNDS_CONTRACT };
11
+ export const GUIDED_FIRST_SOURCING_PREVIEW_CONTRACT = obj(request, { required: ["revision", "bounds"] });
12
+ export const GUIDED_FIRST_SOURCING_RUN_CONTRACT = obj({ ...request,
13
+ previewId: str({ minLength: 36, maxLength: 36, pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" }),
14
+ previewDigest: str({ minLength: 64, maxLength: 64, pattern: "^[a-f0-9]{64}$" }), approved: bool(),
15
+ }, { required: ["revision", "bounds", "previewId", "previewDigest", "approved"] });
16
+ export const GUIDED_FIRST_SOURCING_GET_CONTRACT = obj({
17
+ revision: int({ minimum: 1, maximum: Number.MAX_SAFE_INTEGER }),
18
+ generation: int({ minimum: 1, maximum: Number.MAX_SAFE_INTEGER }),
19
+ timezoneHint: str({ minLength: 1, maxLength: 80, description: "Provisional saved/browser IANA hint for current nightly defaults; never confirms a schedule." }),
20
+ });
21
+ export function guidedFirstSourcingGetInputIssues(args) {
22
+ const fields = ["revision", "generation", "timezoneHint"];
23
+ if (!fields.some(field => args[field] !== undefined))
24
+ return [];
25
+ const issues = fields.filter(field => args[field] === undefined).map(path => ({ path,
26
+ message: "Supply revision, generation and timezoneHint together to read current routine defaults." }));
27
+ if (typeof args.timezoneHint !== "string" || args.timezoneHint !== args.timezoneHint.trim() || !isValidTimeZone(args.timezoneHint)) {
28
+ issues.push({ path: "timezoneHint", message: "Use a valid customer/browser IANA timezone suggestion; no schedule is confirmed." });
29
+ }
30
+ return issues;
31
+ }
32
+ const base = "/api/cli/onboarding/activation/{activationId}/first-sourcing";
33
+ export const GUIDED_FIRST_SOURCING_OPERATIONS = [
34
+ { id: "onboarding.first_sourcing.get", route: base, method: "GET", contract: GUIDED_FIRST_SOURCING_GET_CONTRACT, inputCheck: guidedFirstSourcingGetInputIssues, parameters: ["activationId"],
35
+ cli: { path: ["onboarding", "first-sourcing", "get"], summary: "Read first sourcing; optionally quote current nightly defaults with revision, generation and timezoneHint." },
36
+ mcp: { name: "oxygen_onboarding_first_sourcing_get", title: "Oxygen: Read first sourcing", pack: "agents",
37
+ description: "Read the current creator-private DEV source, native ingestion receipt and actual settled continuation. No sourcing provider call or new sourcing; historical approval cannot authorize another pull. Verifies native billing and may reconcile an earned grant. Optional revision, generation and provisional IANA timezoneHint together return current native nightly defaults after the source transaction; no draft, schedule confirmation or approval.", annotations: { openWorldHint: true } }, mutates: true, spends: false },
38
+ { id: "onboarding.first_sourcing.preview", route: `${base}/preview`, method: "POST", parameters: ["activationId"], contract: GUIDED_FIRST_SOURCING_PREVIEW_CONTRACT,
39
+ cli: { path: ["onboarding", "first-sourcing", "preview"], summary: "Review a bounded native first pull into First leads; no provider search." },
40
+ mcp: { name: "oxygen_onboarding_first_sourcing_preview", title: "Oxygen: Preview first sourcing", pack: "agents",
41
+ description: "Current creator and revision, confirmed company, saved audience and eligible trial/paid billing required. Bounds contain targetCount, maxPages and maxCredits. Creates/reuses the native First leads Table and persists a managed source quote. Returns previewId/digest; no provider search, model or outreach.",
42
+ annotations: { openWorldHint: true, destructiveHint: false } }, mutates: true, spends: false },
43
+ { id: "onboarding.first_sourcing.run", route: `${base}/run`, method: "POST", parameters: ["activationId"], contract: GUIDED_FIRST_SOURCING_RUN_CONTRACT,
44
+ cli: { path: ["onboarding", "first-sourcing", "run"], summary: "Approve the exact stored preview and caps; enqueue or recover the same native first-source run." },
45
+ mcp: { name: "oxygen_onboarding_first_sourcing_run", title: "Oxygen: Run first sourcing", pack: "agents",
46
+ description: "approved=true plus stored previewId/previewDigest, current revision and identical bounds authorize the reviewed managed people source into the activation's First leads Table. Current native admission, billing, quote and worker fences apply. Retry/Back/Restart with the same actual source recovers its native run. No model, enrollment or outreach.",
47
+ annotations: { openWorldHint: true, destructiveHint: false, idempotentHint: true } }, mutates: true, spends: true },
48
+ ];
@@ -0,0 +1,267 @@
1
+ /** Hiring roles remain strings. Technology identity includes its relationship. */
2
+ export declare const GUIDED_ONBOARDING_SIGNALS_CONTRACT: import("./schema.js").ContractObject<{
3
+ readonly hiring: import("./schema.js").ContractObject<{
4
+ readonly mode: {
5
+ type: "string";
6
+ enum: readonly ("none" | "selected")[];
7
+ description?: string;
8
+ };
9
+ readonly values: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
10
+ }, "mode" | "values">;
11
+ readonly technology: import("./schema.js").ContractObject<{
12
+ readonly mode: {
13
+ type: "string";
14
+ enum: readonly ("none" | "selected")[];
15
+ description?: string;
16
+ };
17
+ readonly values: import("./schema.js").ArrayProperty<import("./schema.js").ContractObject<{
18
+ readonly name: import("./schema.js").StringProperty;
19
+ readonly relationship: {
20
+ type: "string";
21
+ enum: readonly ("integrates_with" | "replaces" | "uses")[];
22
+ description?: string;
23
+ };
24
+ }, "name" | "relationship">>;
25
+ }, "mode" | "values">;
26
+ }, "hiring" | "technology">;
27
+ export declare const GUIDED_ONBOARDING_ANSWERS_CONTRACT: import("./schema.js").ContractObject<{
28
+ readonly company_context: import("./schema.js").ContractObject<{
29
+ readonly website: {
30
+ oneOf: [import("./schema.js").StringProperty, import("./schema.js").NullProperty];
31
+ description?: string;
32
+ };
33
+ readonly name: import("./schema.js").StringProperty;
34
+ readonly description: import("./schema.js").StringProperty;
35
+ readonly context_links: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
36
+ readonly file_ids: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
37
+ }, "context_links" | "description" | "file_ids" | "name" | "website">;
38
+ readonly company_review: import("./schema.js").ContractObject<{
39
+ readonly statement: import("./schema.js").StringProperty;
40
+ readonly profile_revision: import("./schema.js").StringProperty;
41
+ }, "profile_revision" | "statement">;
42
+ readonly audience_company_size: import("./schema.js").ContractObject<{
43
+ readonly values: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
44
+ }, "values">;
45
+ readonly audience_markets: import("./schema.js").ContractObject<{
46
+ readonly values: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
47
+ }, "values">;
48
+ readonly audience_industries: import("./schema.js").ContractObject<{
49
+ readonly values: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
50
+ }, "values">;
51
+ readonly audience_personas: import("./schema.js").ContractObject<{
52
+ readonly values: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
53
+ }, "values">;
54
+ readonly signals: import("./schema.js").ContractObject<{
55
+ readonly hiring: import("./schema.js").ContractObject<{
56
+ readonly mode: {
57
+ type: "string";
58
+ enum: readonly ("none" | "selected")[];
59
+ description?: string;
60
+ };
61
+ readonly values: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
62
+ }, "mode" | "values">;
63
+ readonly technology: import("./schema.js").ContractObject<{
64
+ readonly mode: {
65
+ type: "string";
66
+ enum: readonly ("none" | "selected")[];
67
+ description?: string;
68
+ };
69
+ readonly values: import("./schema.js").ArrayProperty<import("./schema.js").ContractObject<{
70
+ readonly name: import("./schema.js").StringProperty;
71
+ readonly relationship: {
72
+ type: "string";
73
+ enum: readonly ("integrates_with" | "replaces" | "uses")[];
74
+ description?: string;
75
+ };
76
+ }, "name" | "relationship">>;
77
+ }, "mode" | "values">;
78
+ }, "hiring" | "technology">;
79
+ readonly prospects: import("./schema.js").ContractObject<{
80
+ readonly decision: {
81
+ type: "string";
82
+ enum: readonly ("continue" | "refine")[];
83
+ description?: string;
84
+ };
85
+ readonly feedback: import("./schema.js").StringProperty;
86
+ }, "decision" | "feedback">;
87
+ readonly linkedin: import("./schema.js").ContractObject<{
88
+ readonly choice: {
89
+ type: "string";
90
+ enum: readonly ("connect" | "skip")[];
91
+ description?: string;
92
+ };
93
+ }, "choice">;
94
+ readonly sequence: import("./schema.js").ContractObject<{
95
+ readonly decision: {
96
+ type: "string";
97
+ enum: readonly ("keep_draft" | "review")[];
98
+ description?: string;
99
+ };
100
+ }, "decision">;
101
+ readonly tour: import("./schema.js").ContractObject<{
102
+ readonly visited: import("./schema.js").ArrayProperty<{
103
+ type: "string";
104
+ enum: readonly ("leads" | "overview" | "sequence" | "sourcing")[];
105
+ description?: string;
106
+ }>;
107
+ }, "visited">;
108
+ }, never>;
109
+ export declare const GUIDED_ONBOARDING_MUTATION_CONTRACT: import("./schema.js").ContractObject<{
110
+ revision: {
111
+ type: "integer";
112
+ description?: string;
113
+ minimum?: number;
114
+ maximum?: number;
115
+ "x-clamp"?: true;
116
+ };
117
+ mutation_id: import("./schema.js").StringProperty;
118
+ }, "mutation_id" | "revision">;
119
+ export declare const GUIDED_ONBOARDING_ADVANCE_CONTRACT: import("./schema.js").ContractObject<{
120
+ readonly revision: {
121
+ type: "integer";
122
+ description?: string;
123
+ minimum?: number;
124
+ maximum?: number;
125
+ "x-clamp"?: true;
126
+ };
127
+ readonly mutation_id: import("./schema.js").StringProperty;
128
+ readonly step: {
129
+ type: "string";
130
+ enum: readonly ("audience_company_size" | "audience_industries" | "audience_markets" | "audience_personas" | "campaign" | "company_context" | "company_research" | "company_review" | "complete" | "daily_rhythm" | "linkedin" | "prospects" | "routines" | "sequence" | "signals" | "tour" | "trial" | "welcome")[];
131
+ description?: string;
132
+ };
133
+ }, "mutation_id" | "revision" | "step">;
134
+ export declare const GUIDED_ONBOARDING_SAVE_CONTRACT: import("./schema.js").ContractObject<{
135
+ readonly revision: {
136
+ type: "integer";
137
+ description?: string;
138
+ minimum?: number;
139
+ maximum?: number;
140
+ "x-clamp"?: true;
141
+ };
142
+ readonly mutation_id: import("./schema.js").StringProperty;
143
+ readonly step: {
144
+ type: "string";
145
+ enum: readonly ("audience_company_size" | "audience_industries" | "audience_markets" | "audience_personas" | "campaign" | "company_context" | "company_research" | "company_review" | "complete" | "daily_rhythm" | "linkedin" | "prospects" | "routines" | "sequence" | "signals" | "tour" | "trial" | "welcome")[];
146
+ description?: string;
147
+ };
148
+ readonly answers: import("./schema.js").ContractObject<{
149
+ readonly company_context: import("./schema.js").ContractObject<{
150
+ readonly website: {
151
+ oneOf: [import("./schema.js").StringProperty, import("./schema.js").NullProperty];
152
+ description?: string;
153
+ };
154
+ readonly name: import("./schema.js").StringProperty;
155
+ readonly description: import("./schema.js").StringProperty;
156
+ readonly context_links: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
157
+ readonly file_ids: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
158
+ }, "context_links" | "description" | "file_ids" | "name" | "website">;
159
+ readonly company_review: import("./schema.js").ContractObject<{
160
+ readonly statement: import("./schema.js").StringProperty;
161
+ readonly profile_revision: import("./schema.js").StringProperty;
162
+ }, "profile_revision" | "statement">;
163
+ readonly audience_company_size: import("./schema.js").ContractObject<{
164
+ readonly values: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
165
+ }, "values">;
166
+ readonly audience_markets: import("./schema.js").ContractObject<{
167
+ readonly values: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
168
+ }, "values">;
169
+ readonly audience_industries: import("./schema.js").ContractObject<{
170
+ readonly values: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
171
+ }, "values">;
172
+ readonly audience_personas: import("./schema.js").ContractObject<{
173
+ readonly values: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
174
+ }, "values">;
175
+ readonly signals: import("./schema.js").ContractObject<{
176
+ readonly hiring: import("./schema.js").ContractObject<{
177
+ readonly mode: {
178
+ type: "string";
179
+ enum: readonly ("none" | "selected")[];
180
+ description?: string;
181
+ };
182
+ readonly values: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
183
+ }, "mode" | "values">;
184
+ readonly technology: import("./schema.js").ContractObject<{
185
+ readonly mode: {
186
+ type: "string";
187
+ enum: readonly ("none" | "selected")[];
188
+ description?: string;
189
+ };
190
+ readonly values: import("./schema.js").ArrayProperty<import("./schema.js").ContractObject<{
191
+ readonly name: import("./schema.js").StringProperty;
192
+ readonly relationship: {
193
+ type: "string";
194
+ enum: readonly ("integrates_with" | "replaces" | "uses")[];
195
+ description?: string;
196
+ };
197
+ }, "name" | "relationship">>;
198
+ }, "mode" | "values">;
199
+ }, "hiring" | "technology">;
200
+ readonly prospects: import("./schema.js").ContractObject<{
201
+ readonly decision: {
202
+ type: "string";
203
+ enum: readonly ("continue" | "refine")[];
204
+ description?: string;
205
+ };
206
+ readonly feedback: import("./schema.js").StringProperty;
207
+ }, "decision" | "feedback">;
208
+ readonly linkedin: import("./schema.js").ContractObject<{
209
+ readonly choice: {
210
+ type: "string";
211
+ enum: readonly ("connect" | "skip")[];
212
+ description?: string;
213
+ };
214
+ }, "choice">;
215
+ readonly sequence: import("./schema.js").ContractObject<{
216
+ readonly decision: {
217
+ type: "string";
218
+ enum: readonly ("keep_draft" | "review")[];
219
+ description?: string;
220
+ };
221
+ }, "decision">;
222
+ readonly tour: import("./schema.js").ContractObject<{
223
+ readonly visited: import("./schema.js").ArrayProperty<{
224
+ type: "string";
225
+ enum: readonly ("leads" | "overview" | "sequence" | "sourcing")[];
226
+ description?: string;
227
+ }>;
228
+ }, "visited">;
229
+ }, never>;
230
+ readonly advance: import("./schema.js").BooleanProperty;
231
+ }, "answers" | "mutation_id" | "revision" | "step">;
232
+ export declare const GUIDED_ONBOARDING_NAVIGATION_CONTRACT: import("./schema.js").ContractObject<{
233
+ readonly revision: {
234
+ type: "integer";
235
+ description?: string;
236
+ minimum?: number;
237
+ maximum?: number;
238
+ "x-clamp"?: true;
239
+ };
240
+ readonly mutation_id: import("./schema.js").StringProperty;
241
+ readonly step: {
242
+ type: "string";
243
+ enum: readonly ("audience_company_size" | "audience_industries" | "audience_markets" | "audience_personas" | "campaign" | "company_context" | "company_research" | "company_review" | "complete" | "daily_rhythm" | "linkedin" | "prospects" | "routines" | "sequence" | "signals" | "tour" | "trial" | "welcome")[];
244
+ description?: string;
245
+ };
246
+ readonly paused: import("./schema.js").BooleanProperty;
247
+ readonly tour_active_stop: {
248
+ type: "string";
249
+ enum: readonly ("leads" | "overview" | "sequence" | "sourcing")[];
250
+ description?: string;
251
+ };
252
+ }, "mutation_id" | "paused" | "revision" | "step">;
253
+ export declare const GUIDED_ONBOARDING_CHECKOUT_CONTRACT: import("./schema.js").ContractObject<{
254
+ readonly revision: {
255
+ type: "integer";
256
+ description?: string;
257
+ minimum?: number;
258
+ maximum?: number;
259
+ "x-clamp"?: true;
260
+ };
261
+ readonly mutation_id: import("./schema.js").StringProperty;
262
+ readonly approved: import("./schema.js").BooleanProperty;
263
+ }, "approved" | "mutation_id" | "revision">;
264
+ export declare const GUIDED_ONBOARDING_JOURNEY_ACTIONS: readonly ["get", "save", "advance", "back", "restart", "billing", "checkout", "navigation", "prospects_preview"];
265
+ export type GuidedOnboardingJourneyAction = typeof GUIDED_ONBOARDING_JOURNEY_ACTIONS[number];
266
+ import type { OperationSpec } from "./operations.js";
267
+ export declare const GUIDED_ONBOARDING_JOURNEY_OPERATIONS: readonly OperationSpec[];
@@ -0,0 +1,63 @@
1
+ import { arr, bool, enumOf, int, obj, str } from "./schema.js";
2
+ import { GUIDED_ONBOARDING_COMPANY_CONTEXT_CONTRACT } from "../guided-onboarding-company-context.js";
3
+ import { GUIDED_ONBOARDING_STEPS, GUIDED_ONBOARDING_TECHNOLOGY_RELATIONSHIPS } from "../guided-onboarding-journey.js";
4
+ const mode = () => enumOf(["none", "selected"]);
5
+ const name = () => str({ minLength: 1, maxLength: 160 });
6
+ /** Hiring roles remain strings. Technology identity includes its relationship. */
7
+ export const GUIDED_ONBOARDING_SIGNALS_CONTRACT = obj({
8
+ hiring: obj({ mode: mode(), values: arr(name(), { maxItems: 40 }) }, { required: ["mode", "values"] }),
9
+ technology: obj({
10
+ mode: mode(),
11
+ values: arr(obj({ name: name(), relationship: enumOf(GUIDED_ONBOARDING_TECHNOLOGY_RELATIONSHIPS) }, { required: ["name", "relationship"] }), { maxItems: 40 }),
12
+ }, { required: ["mode", "values"] }),
13
+ }, { required: ["hiring", "technology"] });
14
+ const choice = () => obj({ values: arr(name(), { minItems: 1, maxItems: 40 }) }, { required: ["values"] });
15
+ export const GUIDED_ONBOARDING_ANSWERS_CONTRACT = obj({
16
+ company_context: GUIDED_ONBOARDING_COMPANY_CONTEXT_CONTRACT,
17
+ company_review: obj({ statement: str({ minLength: 1, maxLength: 12000 }), profile_revision: str({ minLength: 1, maxLength: 160 }) }, { required: ["statement", "profile_revision"] }),
18
+ audience_company_size: choice(), audience_markets: choice(), audience_industries: choice(), audience_personas: choice(),
19
+ signals: GUIDED_ONBOARDING_SIGNALS_CONTRACT,
20
+ prospects: obj({ decision: enumOf(["continue", "refine"]), feedback: str({ maxLength: 4000 }) }, { required: ["decision", "feedback"] }),
21
+ linkedin: obj({ choice: enumOf(["connect", "skip"]) }, { required: ["choice"] }),
22
+ sequence: obj({ decision: enumOf(["review", "keep_draft"]) }, { required: ["decision"] }),
23
+ tour: obj({ visited: arr(enumOf(["overview", "leads", "sourcing", "sequence"]), { maxItems: 4 }) }, { required: ["visited"] }),
24
+ });
25
+ const mutation = { revision: int({ minimum: 1 }), mutation_id: str({ minLength: 1, maxLength: 160, pattern: "^[a-zA-Z0-9_.:-]+$" }) };
26
+ export const GUIDED_ONBOARDING_MUTATION_CONTRACT = obj(mutation, { required: ["revision", "mutation_id"] });
27
+ export const GUIDED_ONBOARDING_ADVANCE_CONTRACT = obj({ ...mutation, step: enumOf(GUIDED_ONBOARDING_STEPS) }, { required: ["revision", "mutation_id", "step"] });
28
+ export const GUIDED_ONBOARDING_SAVE_CONTRACT = obj({ ...mutation, step: enumOf(GUIDED_ONBOARDING_STEPS),
29
+ answers: GUIDED_ONBOARDING_ANSWERS_CONTRACT, advance: bool({ description: "Save and advance in one native transaction after checking this step. No provider action or implicit activation." }) }, { required: ["revision", "mutation_id", "step", "answers"] });
30
+ export const GUIDED_ONBOARDING_NAVIGATION_CONTRACT = obj({ ...mutation, step: enumOf(GUIDED_ONBOARDING_STEPS), paused: bool(),
31
+ tour_active_stop: enumOf(["overview", "leads", "sourcing", "sequence"]) }, { required: ["revision", "mutation_id", "step", "paused"] });
32
+ export const GUIDED_ONBOARDING_CHECKOUT_CONTRACT = obj({ ...mutation, approved: bool() }, { required: ["revision", "mutation_id", "approved"] });
33
+ export const GUIDED_ONBOARDING_JOURNEY_ACTIONS = ["get", "save", "advance", "back", "restart", "billing", "checkout", "navigation", "prospects_preview"];
34
+ const base = "/api/cli/onboarding/activation/{activationId}/journey";
35
+ export const GUIDED_ONBOARDING_JOURNEY_OPERATIONS = [
36
+ { id: "onboarding.journey.get", route: base, method: "GET", contract: obj({}), parameters: ["activationId"],
37
+ cli: { path: ["onboarding", "journey", "get"], summary: "Read your private resumable onboarding answers and native progress." },
38
+ mcp: { name: "oxygen_onboarding_journey_get", title: "Oxygen: Read onboarding journey", description: "Read your activationId journey and saved answers. Creator-private; enabled genuine DEV only. No research, model call or message send.", pack: "agents" }, mutates: false, spends: false },
39
+ { id: "onboarding.journey.save", route: base, method: "POST", parameters: ["activationId"], contract: GUIDED_ONBOARDING_SAVE_CONTRACT,
40
+ cli: { path: ["onboarding", "journey", "save"], summary: "Save reviewed answers and optionally advance atomically. Free; no model, send or routine execution." },
41
+ mcp: { name: "oxygen_onboarding_journey_save", title: "Oxygen: Onboarding save", description: "Creator-private DEV onboarding save for activationId. Requires current revision and stable mutation_id. Save accepts only current step answers; company context prepares native sources and records existing bounded research consent. Advance checks native readiness and billing. No paid turn, synchronous research, outreach or routine activation.", pack: "agents", annotations: { destructiveHint: false, openWorldHint: false, idempotentHint: true } }, mutates: true, spends: false },
42
+ { id: "onboarding.journey.advance", route: `${base}/advance`, method: "POST", parameters: ["activationId"], contract: GUIDED_ONBOARDING_ADVANCE_CONTRACT,
43
+ cli: { path: ["onboarding", "journey", "advance"], summary: "Advance after native readiness checks. Free; no model, send or routine execution." },
44
+ mcp: { name: "oxygen_onboarding_journey_advance", title: "Oxygen: Onboarding advance", description: "Creator-private DEV onboarding advance for activationId. Requires current revision and stable mutation_id. Save accepts only current step answers; advance checks native readiness and billing. Restart preserves resources and consumed funding. No paid turn, research, outreach or routine activation.", pack: "agents", annotations: { destructiveHint: false, openWorldHint: false, idempotentHint: true } }, mutates: true, spends: false },
45
+ { id: "onboarding.journey.back", route: `${base}/back`, method: "POST", parameters: ["activationId"], contract: GUIDED_ONBOARDING_MUTATION_CONTRACT,
46
+ cli: { path: ["onboarding", "journey", "back"], summary: "Return to the previous step with saved answers. Free; no model, send or routine execution." },
47
+ mcp: { name: "oxygen_onboarding_journey_back", title: "Oxygen: Onboarding back", description: "Creator-private DEV onboarding back for activationId. Requires current revision and stable mutation_id. Save accepts only current step answers; advance checks native readiness and billing. Restart preserves resources and consumed funding. No paid turn, research, outreach or routine activation.", pack: "agents", annotations: { destructiveHint: false, openWorldHint: false, idempotentHint: true } }, mutates: true, spends: false },
48
+ { id: "onboarding.journey.restart", route: `${base}/restart`, method: "POST", parameters: ["activationId"], contract: GUIDED_ONBOARDING_MUTATION_CONTRACT,
49
+ cli: { path: ["onboarding", "journey", "restart"], summary: "Restart progress, preserving Knowledge, chats, campaigns and billing. Free; no model, send or routine execution." },
50
+ mcp: { name: "oxygen_onboarding_journey_restart", title: "Oxygen: Onboarding restart", description: "Creator-private DEV onboarding restart for activationId. Requires current revision and stable mutation_id. Save accepts only current step answers; advance checks native readiness and billing. Restart preserves resources and consumed funding. No paid turn, research, outreach or routine activation.", pack: "agents", annotations: { destructiveHint: false, openWorldHint: false, idempotentHint: true } }, mutates: true, spends: false },
51
+ { id: "onboarding.journey.prospects_preview", route: `${base}/prospects/preview`, method: "POST", parameters: ["activationId"], contract: GUIDED_ONBOARDING_MUTATION_CONTRACT,
52
+ cli: { path: ["onboarding", "journey", "prospects-preview"], summary: "Preview up to five real people for saved targeting through the native free source; persist inspectable native results." },
53
+ mcp: { name: "oxygen_onboarding_journey_prospects_preview", title: "Oxygen: Preview onboarding prospects", description: "At the prospects step, use current revision and stable mutation_id to preview up to five people from saved targeting. Native free source read and manual preview Table writes; cached retries, no paid fallback, inference, enrollment or outreach. Unsupported criteria remain explicit diagnostics, never verified fit.", pack: "agents", annotations: { openWorldHint: true, destructiveHint: false, idempotentHint: true } }, mutates: true, spends: false },
54
+ { id: "onboarding.journey.navigation", route: `${base}/navigation`, method: "POST", parameters: ["activationId"], contract: GUIDED_ONBOARDING_NAVIGATION_CONTRACT,
55
+ cli: { path: ["onboarding", "journey", "navigation"], summary: "Save pause/resume and exact tour position, retaining the current journey step and visited history." },
56
+ mcp: { name: "oxygen_onboarding_journey_navigation", title: "Oxygen: Save onboarding position", description: "Persist paused and optional tour_active_stop at current step/revision with stable mutation_id. Position is separate from visited history. No step advance, research, send or routine activation.", pack: "agents" }, mutates: true, spends: false },
57
+ { id: "onboarding.journey.billing", route: `${base}/billing`, method: "GET", contract: obj({}), parameters: ["activationId"],
58
+ cli: { path: ["onboarding", "journey", "billing"], summary: "Read native trial eligibility; may reconcile an already-earned trial credit grant." },
59
+ mcp: { name: "oxygen_onboarding_journey_billing", title: "Oxygen: Onboarding billing", description: "Read native TEST trial/paid eligibility for your activationId. May reconcile an already-earned native credit grant, so this is a mutating call. No new subscription or charge; errors remain errors.", pack: "agents", annotations: { openWorldHint: true } }, mutates: true, spends: false },
60
+ { id: "onboarding.journey.checkout", route: `${base}/checkout`, method: "POST", contract: GUIDED_ONBOARDING_CHECKOUT_CONTRACT, parameters: ["activationId"],
61
+ cli: { path: ["onboarding", "journey", "checkout"], summary: "Open approved DEV TEST Checkout as current workspace admin/owner, or reuse existing eligible billing." },
62
+ mcp: { name: "oxygen_onboarding_journey_checkout", title: "Oxygen: Onboarding test Checkout", description: "Current DEV admin/owner only: approved=true, revision and stable mutation_id open card-required TEST Checkout, $0 for seven days then $49/month, once-only 2000 trial credits. Reuses eligible existing paid/trial. No live Stripe fallback or early charge.", pack: "agents", annotations: { openWorldHint: true } }, mutates: true, spends: false },
63
+ ];