@oxygen-agent/cli 1.1011.97 → 1.1011.288

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 (58) hide show
  1. package/README.md +1 -1
  2. package/dist/admin-primary-providers-render.js +25 -5
  3. package/dist/column-run-notices.d.ts +16 -0
  4. package/dist/column-run-notices.js +57 -0
  5. package/dist/command-manifest.js +10 -1
  6. package/dist/help.d.ts +27 -1
  7. package/dist/help.js +112 -29
  8. package/dist/http-client.js +8 -0
  9. package/dist/index.js +348 -127
  10. package/node_modules/@oxygen/cli-ugc/dist/commands.js +20 -69
  11. package/node_modules/@oxygen/shared/dist/byok-connect.d.ts +6 -4
  12. package/node_modules/@oxygen/shared/dist/byok-connect.js +11 -4
  13. package/node_modules/@oxygen/shared/dist/capability-discovery.d.ts +127 -1
  14. package/node_modules/@oxygen/shared/dist/capability-discovery.js +286 -24
  15. package/node_modules/@oxygen/shared/dist/collab.d.ts +1 -1
  16. package/node_modules/@oxygen/shared/dist/collab.js +12 -0
  17. package/node_modules/@oxygen/shared/dist/column-decision.js +7 -3
  18. package/node_modules/@oxygen/shared/dist/column-output-fields.js +45 -3
  19. package/node_modules/@oxygen/shared/dist/company-enrichment-fields.d.ts +20 -13
  20. package/node_modules/@oxygen/shared/dist/company-enrichment-fields.js +29 -13
  21. package/node_modules/@oxygen/shared/dist/contracts/sender-limits.js +1 -1
  22. package/node_modules/@oxygen/shared/dist/copilot-skills.generated.d.ts +2 -2
  23. package/node_modules/@oxygen/shared/dist/copilot-skills.generated.js +2 -2
  24. package/node_modules/@oxygen/shared/dist/credit-guidance.js +12 -1
  25. package/node_modules/@oxygen/shared/dist/enrichment-intents.d.ts +37 -0
  26. package/node_modules/@oxygen/shared/dist/enrichment-intents.js +79 -44
  27. package/node_modules/@oxygen/shared/dist/linkedin-url.d.ts +7 -0
  28. package/node_modules/@oxygen/shared/dist/linkedin-url.js +9 -0
  29. package/node_modules/@oxygen/shared/dist/log.d.ts +1 -0
  30. package/node_modules/@oxygen/shared/dist/log.js +15 -0
  31. package/node_modules/@oxygen/shared/dist/operational-telemetry.d.ts +1 -0
  32. package/node_modules/@oxygen/shared/dist/operational-telemetry.js +6 -2
  33. package/node_modules/@oxygen/shared/dist/otlp-log-sink.d.ts +7 -3
  34. package/node_modules/@oxygen/shared/dist/otlp-log-sink.js +22 -1
  35. package/node_modules/@oxygen/shared/dist/plan-limits.d.ts +3 -7
  36. package/node_modules/@oxygen/shared/dist/plan-limits.js +2 -14
  37. package/node_modules/@oxygen/shared/dist/sending-schedule.d.ts +39 -0
  38. package/node_modules/@oxygen/shared/dist/sending-schedule.js +41 -0
  39. package/node_modules/@oxygen/shared/dist/sequence-lifecycle.d.ts +19 -0
  40. package/node_modules/@oxygen/shared/dist/sequence-lifecycle.js +20 -0
  41. package/node_modules/@oxygen/shared/dist/sequence-sender-variables.d.ts +35 -0
  42. package/node_modules/@oxygen/shared/dist/sequence-sender-variables.js +63 -0
  43. package/node_modules/@oxygen/shared/dist/sequences.d.ts +13 -7
  44. package/node_modules/@oxygen/shared/dist/sequences.js +26 -0
  45. package/node_modules/@oxygen/shared/dist/signup-lead-payload.d.ts +2 -0
  46. package/node_modules/@oxygen/shared/dist/signup-lead-payload.js +5 -0
  47. package/node_modules/@oxygen/shared/dist/social-post-metrics-series.js +1 -15
  48. package/node_modules/@oxygen/shared/dist/standard-webhooks.d.ts +51 -0
  49. package/node_modules/@oxygen/shared/dist/standard-webhooks.js +124 -0
  50. package/node_modules/@oxygen/shared/dist/tags.d.ts +1 -1
  51. package/node_modules/@oxygen/shared/dist/tags.js +13 -1
  52. package/node_modules/@oxygen/shared/dist/ugc.d.ts +11 -7
  53. package/node_modules/@oxygen/shared/dist/ugc.js +14 -6
  54. package/node_modules/@oxygen/shared/dist/version.generated.d.ts +1 -1
  55. package/node_modules/@oxygen/shared/dist/version.generated.js +1 -1
  56. package/node_modules/@oxygen/shared/dist/zoned-time.d.ts +39 -0
  57. package/node_modules/@oxygen/shared/dist/zoned-time.js +81 -0
  58. package/package.json +1 -1
@@ -9,10 +9,10 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
9
9
  memberships: "Active programs this creator workspace has joined, each with your deal (posting_target), this period's progress and your published posts. Your own numbers only. Read these before choosing a program for a personal post.",
10
10
  applications: "Applications to public programs: the ones you sent as a creator, or the ones your program received as a brand.",
11
11
  profile: "Your creator profile: the topics you post about, who follows you and your LinkedIn profile URL (used when you apply), readable by the brands whose programs you joined. Name, picture and headline come from your connected LinkedIn account.",
12
- posts: "Enrolled program posts: enroll existing posts, draft from a topic, edit, schedule, record creator or brand approval, and schedule one-off comments on program posts.",
12
+ posts: "Enrolled program posts: enroll existing posts, draft from a topic, edit, schedule, record the creator's approval (or the organizer's, if the creator delegated it), and schedule one-off comments on program posts. Brands cannot require approval of creator posts.",
13
13
  analytics: "Stored daily program and creator performance.",
14
14
  knowledge: "Master Knowledge pages shared live with a program.",
15
- voice: "Creator voice profiles and imports.",
15
+ voice: "A program creator's voice: profile and LinkedIn history import. The workspace's own writing voice, learned from its sent messages, is `knowledge synthesize --kind voice`.",
16
16
  sponsorship: "Seat and credit sponsorship per participation.",
17
17
  amplification: "Bounded, approval-gated amplification of enrolled posts.",
18
18
  "peer-amplification": "Creator-owned consent, sender, voice, caps and immutable receipts for engaging with peer posts in one program.",
@@ -216,8 +216,8 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
216
216
  view: "calendar",
217
217
  description: "Read the program's enrolled post calendar in a bounded UTC date range (up to 42 days). Stored data only, 0 credits.",
218
218
  fields: [
219
- ["date_from", "Start ISO instant, inclusive.", true],
220
- ["date_to", "End ISO instant, exclusive.", true],
219
+ ["date_from", "Start, inclusive: an ISO instant, or YYYY-MM-DD for that day's 00:00 UTC.", true],
220
+ ["date_to", "End, exclusive: an ISO instant, or YYYY-MM-DD for that day's 00:00 UTC, so that day itself is left out.", true],
221
221
  [
222
222
  "calendar_cursor",
223
223
  "Calendar next_cursor from the previous page.",
@@ -289,7 +289,7 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
289
289
  {
290
290
  action: "program_create",
291
291
  command: "programs create",
292
- description: "Create a master UGC program from its product link. The name defaults to the site's name and its icon is fetched from the site. Free: 0 credits, no provider call.",
292
+ description: "Create a master UGC program from its product link; the name and icon come from the site. Creators approve their own posts; brands cannot require approval. Free: 0 credits, no provider call.",
293
293
  fields: [
294
294
  {
295
295
  name: "product_url",
@@ -300,13 +300,13 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
300
300
  {
301
301
  name: "name",
302
302
  kind: "string",
303
- description: "Program name; defaults to the product site's name, else its domain.",
303
+ description: 'The brand creators post about; invitations read "post about <name>" (e.g. Acme, not "Acme Creator Program"). Defaults to the product site\'s name, else its domain.',
304
304
  required: false,
305
305
  },
306
306
  {
307
307
  name: "brief",
308
308
  kind: "string",
309
- description: "Short creator brief (up to 1,200 characters): what the product is, who it is for, key facts and the call to action. Drafts are grounded in it; share longer guidance as a wiki page with --knowledge-slugs.",
309
+ description: "Creator brief (up to 4,000 characters): what the product is, who it is for, key facts and the call to action. Drafts are grounded in it; share longer guidance as a wiki page with --knowledge-slugs.",
310
310
  required: false,
311
311
  },
312
312
  {
@@ -321,12 +321,6 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
321
321
  description: "Selected live master wiki slugs shared with creators; empty array clears sharing.",
322
322
  required: false,
323
323
  },
324
- {
325
- name: "brand_approval_required",
326
- kind: "boolean",
327
- description: "Require a separate brand approval before publishing.",
328
- required: false,
329
- },
330
324
  {
331
325
  name: "posting_target",
332
326
  kind: "posting_target",
@@ -355,7 +349,7 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
355
349
  {
356
350
  name: "name",
357
351
  kind: "string",
358
- description: "Program name.",
352
+ description: 'The brand creators post about; invitations read "post about <name>".',
359
353
  required: false,
360
354
  },
361
355
  {
@@ -367,7 +361,7 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
367
361
  {
368
362
  name: "brief",
369
363
  kind: "string",
370
- description: "Short creator brief (up to 1,200 characters); an empty string clears it.",
364
+ description: "Creator brief (up to 4,000 characters); an empty string clears it.",
371
365
  required: false,
372
366
  },
373
367
  {
@@ -382,12 +376,6 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
382
376
  description: "Selected live master wiki slugs shared with creators; empty array clears sharing.",
383
377
  required: false,
384
378
  },
385
- {
386
- name: "brand_approval_required",
387
- kind: "boolean",
388
- description: "Require a separate brand approval before publishing.",
389
- required: false,
390
- },
391
379
  {
392
380
  name: "posting_target",
393
381
  kind: "posting_target",
@@ -445,7 +433,7 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
445
433
  {
446
434
  action: "program_duplicate",
447
435
  command: "programs duplicate",
448
- description: "Copy a program's settings, shared knowledge, brand review and posting target into a new active program. Free: 0 credits. Never copies creators, invitations, posts or sponsorship.",
436
+ description: "Copy a program's settings, shared knowledge and posting target into a new active program. Free: 0 credits. Never copies creators, invitations, posts or sponsorship.",
449
437
  fields: [
450
438
  {
451
439
  name: "program_id",
@@ -456,7 +444,7 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
456
444
  {
457
445
  name: "name",
458
446
  kind: "string",
459
- description: 'Name of the copy; defaults to "<name> (copy)".',
447
+ description: 'Name of the copy; defaults to the source program\'s name. Creators read it: invitations say "post about <name>".',
460
448
  required: false,
461
449
  },
462
450
  ],
@@ -483,7 +471,7 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
483
471
  {
484
472
  action: "invite_create",
485
473
  command: "creators invite",
486
- description: "Preview an invitation email (0 credits) for one creator (--email) or up to 50 at once (--emails); send with --approved --preview-token from that preview and the same recipients. Use --link-only to create links without email.",
474
+ description: "Preview an invitation email (0 credits) for one creator (--email) or up to 50 at once (--emails); send with --approved --preview-token from that preview and the same recipients. Use --link-only to create links without email. Placeholder addresses (example.com, .test, .invalid) are refused on every path, --link-only included, and nothing is created. The default email names the program and carries the join link, not the brief or posting target; add those with --email-message. A refused email ends ugc_invitation_email_not_sent; the created invitation and its link are in error.details.",
487
475
  fields: [
488
476
  {
489
477
  name: "program_id",
@@ -558,7 +546,7 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
558
546
  {
559
547
  action: "application_decide",
560
548
  command: "creators decline",
561
- description: "Decline a pending application to your program. No email is sent. Free: 0 credits.",
549
+ description: "Decline a pending application to your program. No email is sent, and the applicant cannot apply to this program again (you can still invite them). Free: 0 credits.",
562
550
  fixed: { decision: "decline" },
563
551
  fields: [
564
552
  { name: "program_id", kind: "string", description: "Program ID.", required: true },
@@ -624,7 +612,7 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
624
612
  {
625
613
  action: "invite_send",
626
614
  command: "creators send-invite",
627
- description: "Preview email for an existing pending invitation; send or resend with --approved --preview-token. Replaces the old link, keeps its expiry. Sent means provider accepted, not inbox delivery.",
615
+ description: "Preview email for an existing pending invitation; send or resend with --approved --preview-token. Replaces the old link, keeps its expiry. Sent means provider accepted, not inbox delivery. A refused email ends ugc_invitation_email_not_sent; the invitation and its link are in error.details.",
628
616
  fields: [
629
617
  {
630
618
  name: "program_id",
@@ -703,15 +691,15 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
703
691
  {
704
692
  name: "linkedin_url",
705
693
  kind: "string",
706
- description: "Creator LinkedIn profile URL.",
707
- required: true,
694
+ description: "Your LinkedIn profile URL; passing it also saves it to your profile. Omit to use the one on your profile (ugc profile get); if neither exists, ask the person rather than guess.",
695
+ required: false,
708
696
  },
709
697
  ],
710
698
  },
711
699
  {
712
700
  action: "participation_update",
713
701
  command: "creators update",
714
- description: "Connect an existing LinkedIn sender, change approval authority, or leave the entire program. Revocation stops future sharing and program actions; your posts stay in your workspace and the organizer retains previously shared history. This workspace cannot currently rejoin the same program. To remove one post while staying, use ugc posts remove.",
702
+ description: "Connect an existing LinkedIn sender, change approval authority, or leave the entire program. Revocation stops future sharing and program actions; your posts stay in your workspace and the organizer retains previously shared history. Neither this workspace nor the same LinkedIn profile from another workspace can rejoin the same program. To remove one post while staying, use ugc posts remove.",
715
703
  fields: [
716
704
  {
717
705
  name: "participation_id",
@@ -879,7 +867,7 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
879
867
  {
880
868
  name: "approve",
881
869
  kind: "boolean",
882
- description: "Your own post: true approves exactly what this saves, so it schedules without a separate posts approve. Signed-in creator only; brand review still applies.",
870
+ description: "Your own post: true approves exactly what this saves, so it schedules without a separate posts approve. Signed-in creator only.",
883
871
  required: false,
884
872
  },
885
873
  ],
@@ -887,7 +875,7 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
887
875
  {
888
876
  action: "post_approve",
889
877
  command: "posts approve",
890
- description: "Record creator or explicitly delegated operator approval of the current post.",
878
+ description: "Record the creator's approval of the current post, or the organizer's if the creator delegated it.",
891
879
  fields: [
892
880
  {
893
881
  name: "program_id",
@@ -921,43 +909,6 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
921
909
  },
922
910
  ],
923
911
  },
924
- {
925
- action: "brand_approve",
926
- command: "posts brand-approve",
927
- description: "Record separate master brand approval of the current post.",
928
- fields: [
929
- {
930
- name: "program_id",
931
- kind: "string",
932
- description: "Program ID.",
933
- required: true,
934
- },
935
- {
936
- name: "post_id",
937
- kind: "string",
938
- description: "Canonical post ID.",
939
- required: true,
940
- },
941
- {
942
- name: "enrollment_version",
943
- kind: "number",
944
- description: "Exact enrollment version returned by posts list; always send it so brand approval binds the current enrollment.",
945
- required: true,
946
- },
947
- {
948
- name: "source_revision",
949
- kind: "string",
950
- description: "Exact reviewed content fingerprint returned by posts list.",
951
- required: true,
952
- },
953
- {
954
- name: "approved",
955
- kind: "boolean",
956
- description: "Explicit authorization of the exact preview or approval. Never inferred.",
957
- required: true,
958
- },
959
- ],
960
- },
961
912
  {
962
913
  action: "voice_import",
963
914
  command: "voice import",
@@ -1023,7 +974,7 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
1023
974
  {
1024
975
  action: "sponsorship_cancel",
1025
976
  command: "sponsorship cancel",
1026
- description: "Preview stopping renewal for one program sponsorship. Confirm with --approved and a signed-in master admin. The paid period stays; a credit sponsorship stops without a card provider call.",
977
+ description: "Preview stopping one program sponsorship. Confirm with --approved and a signed-in master admin. A paid sponsorship keeps its period (renewal: stops_at_paid_through); an unpaid one ends at once and its checkout closes (renewal: stops_now). A credit sponsorship stops without a card provider call.",
1027
978
  fields: [
1028
979
  {
1029
980
  name: "program_id",
@@ -4,11 +4,13 @@
4
4
  *
5
5
  * WHY THIS EXISTS. `native_provider.execution.supports_byok` says a TOOL can run on
6
6
  * a customer's own key. It does not say the customer has any way to give us one.
7
- * Those are two different facts, and 9 of the 42 byok-capable native providers
7
+ * Those are two different facts, and 7 of the 42 byok-capable native providers
8
8
  * have the first without the second:
9
9
  *
10
- * apify builtwith dropleads lusha openwebninja peopledatalabs
11
- * rocketreach theirstack wiza
10
+ * apify builtwith dropleads openwebninja peopledatalabs theirstack wiza
11
+ *
12
+ * (Nine until 2026-09-29, when lusha and rocketreach gained native connect forms:
13
+ * D57 had left them runnable only on a customer key nobody could connect.)
12
14
  *
13
15
  * For those, `oxygen integrations connect <id> --api-key` does not reach
14
16
  * `connectViaApiKey` at all. With no native catalog definition,
@@ -18,7 +20,7 @@
18
20
  * `resolveOptionalApiKeyCredentials` finds nothing and the call falls back to the
19
21
  * MANAGED key — the very key that was out of credits. The command appears to work,
20
22
  * changes nothing, and the customer is back where they started with no error. The
21
- * connect route now refuses each of those nine with a typed `byok_connect_unavailable`
23
+ * connect route now refuses each of those seven with a typed `byok_connect_unavailable`
22
24
  * rather than a silent Composio "success"; they stay OFF this list until one gains a
23
25
  * real native connect form.
24
26
  *
@@ -4,11 +4,13 @@
4
4
  *
5
5
  * WHY THIS EXISTS. `native_provider.execution.supports_byok` says a TOOL can run on
6
6
  * a customer's own key. It does not say the customer has any way to give us one.
7
- * Those are two different facts, and 9 of the 42 byok-capable native providers
7
+ * Those are two different facts, and 7 of the 42 byok-capable native providers
8
8
  * have the first without the second:
9
9
  *
10
- * apify builtwith dropleads lusha openwebninja peopledatalabs
11
- * rocketreach theirstack wiza
10
+ * apify builtwith dropleads openwebninja peopledatalabs theirstack wiza
11
+ *
12
+ * (Nine until 2026-09-29, when lusha and rocketreach gained native connect forms:
13
+ * D57 had left them runnable only on a customer key nobody could connect.)
12
14
  *
13
15
  * For those, `oxygen integrations connect <id> --api-key` does not reach
14
16
  * `connectViaApiKey` at all. With no native catalog definition,
@@ -18,7 +20,7 @@
18
20
  * `resolveOptionalApiKeyCredentials` finds nothing and the call falls back to the
19
21
  * MANAGED key — the very key that was out of credits. The command appears to work,
20
22
  * changes nothing, and the customer is back where they started with no error. The
21
- * connect route now refuses each of those nine with a typed `byok_connect_unavailable`
23
+ * connect route now refuses each of those seven with a typed `byok_connect_unavailable`
22
24
  * rather than a silent Composio "success"; they stay OFF this list until one gains a
23
25
  * real native connect form.
24
26
  *
@@ -63,6 +65,10 @@ export const NATIVE_API_KEY_CONNECT_INTEGRATION_IDS = new Set([
63
65
  "icypeas",
64
66
  "leadmagic",
65
67
  "linkup",
68
+ // lusha / rocketreach (D61, 2026-09-29): native api-key connect forms in catalog.ts,
69
+ // validated on each vendor's free account read. D57 left both runnable only on
70
+ // the workspace's own key, which nothing could store until then.
71
+ "lusha",
66
72
  "millionverifier",
67
73
  // Connects through saveMoltsetsConnection rather than the generic save, but that
68
74
  // service calls saveApiKeyIntegrationConnection with secretKind "api_key" like the
@@ -75,6 +81,7 @@ export const NATIVE_API_KEY_CONNECT_INTEGRATION_IDS = new Set([
75
81
  "pipedrive",
76
82
  "predictleads",
77
83
  "prospeo",
84
+ "rocketreach",
78
85
  "scalelist",
79
86
  // scrapeli / up2data (2026-09-25): the company-followers and LinkedIn post lanes
80
87
  // offer "Bring your own API key"; both connect forms live in catalog.ts.
@@ -30,6 +30,13 @@ export type CapabilityRouteMatch = {
30
30
  * intent is that narrow; `recommendedCommands[0]` is the same command.
31
31
  */
32
32
  exactCommand?: string;
33
+ /**
34
+ * The same invocation as an MCP tool call, for a client with tools and no
35
+ * shell. The MCP surface serves it in place of `exactCommand`: an MCP agent
36
+ * handed a CLI command had to translate it, and one reported it as coming
37
+ * from "the docs" (blind user eval, 2026-09-29).
38
+ */
39
+ exactMcpCall?: CapabilityMcpCall;
33
40
  /**
34
41
  * The opinionated enrichment catalogue row a data-type ask resolves to
35
42
  * ("get the funding round" -> enrich_company:funding). Present only when
@@ -45,18 +52,137 @@ export type CapabilityRouteMatch = {
45
52
  tools: string[];
46
53
  commands: string[];
47
54
  exactCommand: string;
55
+ /** The same read as an MCP call, served on MCP in place of `exactCommand`. */
56
+ exactMcpCall: CapabilityMcpCall;
48
57
  };
49
58
  };
50
59
  export type PrimitiveRouteMatch = CapabilityRouteMatch & {
51
60
  card: PrimitiveRouteCard;
52
61
  };
62
+ /** One MCP tool call with placeholder arguments, e.g. `"<sequence>"`. */
63
+ export type CapabilityMcpCall = {
64
+ tool: string;
65
+ arguments: Record<string, unknown>;
66
+ };
67
+ /** Which surface reads a serialized route: the MCP one gets tool calls, not CLI commands. */
68
+ export type CapabilityRouteSurface = "cli" | "mcp";
53
69
  export declare const OXYGEN_CAPABILITY_ROUTES: readonly CapabilityRouteCard[];
54
70
  export declare const OXYGEN_PRIMITIVE_ROUTES: readonly PrimitiveRouteCard[];
55
71
  export declare function getCapabilityRoute(id: string): CapabilityRouteCard | null;
56
72
  export declare function getCapabilityRouteMatch(id: string): CapabilityRouteMatch | null;
57
73
  export declare function inferCapabilityRoute(query: string): CapabilityRouteMatch | null;
74
+ /**
75
+ * The MCP tool a catalogue row's `find` command maps to, named by its command
76
+ * words alone: "find company --domain <domain> --fields funding,..." once became
77
+ * the tool "oxygen_find_company_domain_<domain>_fields_...", which does not
78
+ * exist (funding, hiring-signal and revenue rows, 2026-09-29).
79
+ */
80
+ export declare function catalogueFindTool(row: EnrichmentIntentTaxonomyEntry): string | null;
58
81
  export declare function inferPrimitiveRoute(query: string): PrimitiveRouteMatch | null;
59
- export declare function serializeCapabilityRoute(route: CapabilityRouteMatch | null): Record<string, unknown> | null;
82
+ export declare function serializeCapabilityRoute(route: CapabilityRouteMatch | null, surface?: CapabilityRouteSurface): Record<string, unknown> | null;
83
+ /** One schedule for every channel of a Sequence, the same as Launch's Sending schedule. */
84
+ export declare const SEQUENCE_SENDING_SCHEDULE_COMMAND = "oxygen sequences update <sequence> --schedule-timezone <IANA zone> --schedule-days mon-fri --schedule-hours-start 09:00 --schedule-hours-end 17:00 --json";
85
+ /** Launch's unsubscribe switch: the visible link and the one-click headers together. */
86
+ export declare const SEQUENCE_UNSUBSCRIBE_COMMAND = "oxygen sequences update <sequence> --include-unsubscribe --json";
87
+ /**
88
+ * Every exact CLI command a route hands out, as the MCP tool call that sends the
89
+ * same request. The MCP surface serves these in place of the command: an MCP
90
+ * agent handed a CLI command had to translate it (blind user eval, 2026-09-29).
91
+ * Each was traced to the same `/api/cli/*` request as its command; the
92
+ * mcp-server test proves every tool exists and declares every argument.
93
+ * Factories, so a caller can edit the object it gets.
94
+ */
95
+ export declare const CAPABILITY_ROUTE_MCP_CALLS: {
96
+ sequenceSendingSchedule: () => {
97
+ tool: string;
98
+ arguments: {
99
+ sequence: string;
100
+ sending_schedule: {
101
+ timezone: string;
102
+ days: number[];
103
+ start: string;
104
+ end: string;
105
+ };
106
+ };
107
+ };
108
+ sequenceUnsubscribe: () => {
109
+ tool: string;
110
+ arguments: {
111
+ sequence: string;
112
+ include_unsubscribe: boolean;
113
+ };
114
+ };
115
+ ugcProgramCreate: () => {
116
+ tool: string;
117
+ arguments: {
118
+ product_url: string;
119
+ };
120
+ };
121
+ publishingFirstComment: () => {
122
+ tool: string;
123
+ arguments: {
124
+ content_text: string;
125
+ publish_at: string;
126
+ sender_account_id: string;
127
+ content: {
128
+ first_comment: string;
129
+ };
130
+ };
131
+ };
132
+ companyUrlRecovery: () => {
133
+ tool: string;
134
+ arguments: {
135
+ prompt: string;
136
+ source_intent: string;
137
+ };
138
+ };
139
+ companyPageFollowers: () => {
140
+ tool: string;
141
+ arguments: {
142
+ action: string;
143
+ company_url: string;
144
+ records: number;
145
+ };
146
+ };
147
+ localBusinessScrape: () => {
148
+ tool: string;
149
+ arguments: {
150
+ action: string;
151
+ source: string;
152
+ filters: {
153
+ q: string;
154
+ };
155
+ };
156
+ };
157
+ senderConnect: () => {
158
+ tool: string;
159
+ arguments: {
160
+ country: string;
161
+ };
162
+ };
163
+ rowClassification: () => {
164
+ tool: string;
165
+ arguments: {
166
+ family: string;
167
+ };
168
+ };
169
+ linkedinKeywordPosts: () => {
170
+ tool: string;
171
+ arguments: {
172
+ action: string;
173
+ filters: {
174
+ keywords: string[];
175
+ all_keywords: string[];
176
+ exclude_keywords: string[];
177
+ ai_filter: string;
178
+ };
179
+ };
180
+ };
181
+ };
182
+ /** The catalogue row's `enrichment catalog --intent <id>` as an MCP call. */
183
+ export declare function catalogueIntentMcpCall(intentId: string): CapabilityMcpCall;
184
+ /** A post's first comment is set with the post; `publishing posts update` takes the same flag. */
185
+ export declare const PUBLISHING_FIRST_COMMENT_COMMAND = "oxygen publishing posts create --publish-at <iso> --sender <sender_id> --text \"<post>\" --first-comment \"<comment, e.g. the link>\" --json";
60
186
  export declare const COMPANY_PAGE_FOLLOWERS_COMMAND = "oxygen tables followers check --company <linkedin company page URL> --records <n> --json";
61
187
  /** The exact `companies search plan` invocation for the url_recovery intent. */
62
188
  export declare const COMPANY_URL_RECOVERY_COMMAND = "oxygen companies search plan --prompt \"Find the websites for these companies: <company names>\" --source-intent url_recovery";