@oxygen-agent/cli 1.1013.15 → 1.1013.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -34,4 +34,4 @@ oxygen update
34
34
 
35
35
  For product documentation, visit https://oxygen-agent.com/docs. For support, visit https://oxygen-agent.com.
36
36
 
37
- Version: 1.1013.15
37
+ Version: 1.1013.38
package/dist/index.js CHANGED
@@ -11928,7 +11928,7 @@ Examples:
11928
11928
  .command("admin")
11929
11929
  .description("Staff-only commands.")
11930
11930
  .addCommand(new Command("kpis")
11931
- .description("Show the company conversion funnel (visitors → signups → agent connected → CLI/MCP activation → paid, with step rates), self-reported signup-channel attribution, new and positive-paid MRR/ARR, and paid churn separated from trial loss. OXYGEN staff only; workspace admin role alone does not grant access.")
11931
+ .description("Show the company conversion funnel (visitors → signups → activation on any surface, web, CLI or MCP → paid, with step rates and agent connected beside it), self-reported signup-channel attribution, new and positive-paid MRR/ARR, and paid churn separated from trial loss. OXYGEN staff only; workspace admin role alone does not grant access.")
11932
11932
  .addOption(new Option("--range <range>", "Range for acquisition, the funnel's signup cohort, new revenue, and churn; current MRR/ARR and scheduled cancellations remain point-in-time.")
11933
11933
  .choices(["7d", "30d", "90d"])
11934
11934
  .default("30d"))
@@ -4,7 +4,7 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
4
4
  .command("ugc")
5
5
  .description("Manage UGC programs and independent creator participations: voice, posts, approvals, sponsorship and bounded amplification. Requires UGC availability. Start with memberships list in a creator workspace. See the oxygen-ugc skill; JSON reads return web_url for inspection.");
6
6
  const groupDescriptions = {
7
- programs: "Programs you operate or joined; discover public programs from other brands and apply to them. Lifecycle: create, update, duplicate (settings), archive (stops future work, keeps shared history, reversible with restore) and delete (permanent; only while no creator has ever joined).",
7
+ programs: "Programs you operate or joined; discover public programs from other brands and apply to or join them. Lifecycle: create, update, duplicate (settings), archive (stops future work, keeps shared history, reversible with restore) and delete (permanent; only while no creator has ever joined).",
8
8
  creators: "Creator participations: invite, set one creator's own posting deal, revoke an invite, accept in the creator workspace, connect a sender, change approval authority, or revoke.",
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.",
@@ -83,9 +83,15 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
83
83
  .action((options) => handle("ugc creators invitation", options, () => requestOxygen(`/api/cli/ugc?${new URLSearchParams({ view: "invitation", token: String(options.token) })}`)));
84
84
  group("programs")
85
85
  .command("discover")
86
- .description("Public programs from every brand on Oxygen that you can apply to, with each brand's deal and brief excerpt, and whether you already joined or applied. Free, read-only.")
86
+ .description("Public programs from every brand on Oxygen that you can apply to, with each brand's deal, brief excerpt and join_policy (automatic: you join at once; approval: the brand decides), and whether you already joined or applied. Free, read-only.")
87
+ .option("--program-id <id>", "Only this program, e.g. the id in a join link (…/ugc?join=<id>).")
87
88
  .option("--json", "Print a JSON envelope.")
88
- .action((options) => handle("ugc programs discover", options, () => requestOxygen("/api/cli/ugc?view=discover")));
89
+ .action((options) => handle("ugc programs discover", options, () => {
90
+ const query = new URLSearchParams({ view: "discover" });
91
+ if (options.programId)
92
+ query.set("program_id", String(options.programId));
93
+ return requestOxygen(`/api/cli/ugc?${query}`);
94
+ }));
89
95
  group("applications")
90
96
  .command("list")
91
97
  .description("Applications to public programs. Without --program-id: the ones this creator workspace sent, with status. With --program-id: the ones your program received (brand), pending first. Read-only.")
@@ -318,7 +324,13 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
318
324
  {
319
325
  name: "knowledge_slugs",
320
326
  kind: "array",
321
- description: "Selected live master wiki slugs shared with creators; empty array clears sharing.",
327
+ description: "Knowledge file slugs, skills included, shared live with creators and loaded into their AI context (up to 30); empty array clears sharing.",
328
+ required: false,
329
+ },
330
+ {
331
+ name: "knowledge_folder_ids",
332
+ kind: "array",
333
+ description: "Knowledge folder ids (from knowledge folders list) shared live with creators, skill folders included: files added to them later reach existing creators too (up to 10); empty array clears.",
322
334
  required: false,
323
335
  },
324
336
  {
@@ -330,7 +342,13 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
330
342
  {
331
343
  name: "visibility",
332
344
  kind: "string",
333
- description: "private (default: invitation only) or public (listed in every creator's Discover, where creators apply and you approve).",
345
+ description: "private (default: invitation only) or public (listed in every creator's Discover, where creators apply).",
346
+ required: false,
347
+ },
348
+ {
349
+ name: "join_policy",
350
+ kind: "string",
351
+ description: "Public programs only: approval (default: you approve each application) or automatic (creators join at once, from Discover or the program's join_url). automatic needs --visibility public.",
334
352
  required: false,
335
353
  },
336
354
  ],
@@ -373,7 +391,13 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
373
391
  {
374
392
  name: "knowledge_slugs",
375
393
  kind: "array",
376
- description: "Selected live master wiki slugs shared with creators; empty array clears sharing.",
394
+ description: "Knowledge file slugs, skills included, shared live with creators and loaded into their AI context (up to 30); empty array clears sharing.",
395
+ required: false,
396
+ },
397
+ {
398
+ name: "knowledge_folder_ids",
399
+ kind: "array",
400
+ description: "Knowledge folder ids (from knowledge folders list) shared live with creators, skill folders included: files added to them later reach existing creators too (up to 10); empty array clears.",
377
401
  required: false,
378
402
  },
379
403
  {
@@ -385,7 +409,13 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
385
409
  {
386
410
  name: "visibility",
387
411
  kind: "string",
388
- description: "private (default: invitation only) or public (listed in every creator's Discover, where creators apply and you approve).",
412
+ description: "private (invitation only; also turns automatic join off) or public (listed in every creator's Discover, where creators apply).",
413
+ required: false,
414
+ },
415
+ {
416
+ name: "join_policy",
417
+ kind: "string",
418
+ description: "approval (you approve each application) or automatic (creators join at once, from Discover or the program's join_url). automatic needs a public program. programs get shows join_policy and join_url.",
389
419
  required: false,
390
420
  },
391
421
  {
@@ -532,10 +562,10 @@ export function registerUgcCommands(program, { request: requestOxygen, handle })
532
562
  {
533
563
  action: "application_create",
534
564
  command: "programs apply",
535
- description: "Apply to a public program from programs discover, with a short note to the brand. The brand approves or declines; approval makes you a creator in the program and emails you. Free: 0 credits.",
565
+ description: "Join or apply to a public program from programs discover or a join link: with join_policy automatic you join at once (joined: true, with your participation); otherwise the brand approves or declines (joined: false), and approval makes you a creator and emails you. Free: 0 credits.",
536
566
  fields: [
537
- { name: "program_id", kind: "string", description: "Public program ID from programs discover.", required: true },
538
- { name: "message", kind: "string", description: "Your note to the brand (up to 600 characters).", required: true },
567
+ { name: "program_id", kind: "string", description: "Public program ID from programs discover or a join link (…/ugc?join=<id>).", required: true },
568
+ { name: "message", kind: "string", description: "Your note to the brand (up to 600 characters). Required unless the program's join_policy is automatic.", required: false },
539
569
  { name: "linkedin_url", kind: "string", 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.", required: false },
540
570
  ],
541
571
  },
@@ -0,0 +1,5 @@
1
+ /** A named column operation constrains execution; it never grants authority. */
2
+ export declare const COLUMN_OPERATION_HEADER = "X-Oxygen-Column-Operation";
3
+ export declare const COLUMN_OPERATIONS: readonly ["ai", "research", "formula", "enrichment", "bind", "lookup"];
4
+ export type ColumnOperation = typeof COLUMN_OPERATIONS[number];
5
+ export declare function isColumnOperation(value: unknown): value is ColumnOperation;
@@ -0,0 +1,6 @@
1
+ /** A named column operation constrains execution; it never grants authority. */
2
+ export const COLUMN_OPERATION_HEADER = "X-Oxygen-Column-Operation";
3
+ export const COLUMN_OPERATIONS = ["ai", "research", "formula", "enrichment", "bind", "lookup"];
4
+ export function isColumnOperation(value) {
5
+ return typeof value === "string" && COLUMN_OPERATIONS.includes(value);
6
+ }
@@ -27,6 +27,7 @@ const mcpOnly = { generated: { cli: false, mcp: true } };
27
27
  const cliOnly = { generated: { cli: true, mcp: false } };
28
28
  export const CUSTOMER_OPERATIONS = [
29
29
  operation("activation.state", "/api/cli/activation/state", "GET", "activation state", "oxygen_activation_state", "workspace", "Read this workspace's onboarding activation state and next available actions.", {}, [], mcpOnly),
30
+ operation("activation.checklist", "/api/cli/activation/checklist", "GET", "activation checklist", "oxygen_activation_checklist", "workspace", "Read this workspace's getting-started checklist: leads in a table, a first sequence, a connected sending account and a launched sequence, each with whether it is done and a link to do it; eligible says whether the sidebar shows it. Read-only, 0 credits."),
30
31
  operation("api_keys.list", "/api/cli/api-keys", "GET", "api-keys list", "oxygen_api_keys_list", "workspace", "List workspace API keys without revealing their tokens.", {}, [], mcpOnly),
31
32
  operation("api_keys.create", "/api/cli/api-keys", "POST", "api-keys create", "oxygen_api_keys_create", "workspace", "Create a workspace API key; requires the caller's personal user session. The token is returned once.", { name: text(), expires_at: text("ISO timestamp; omit for no expiry.") }, [], mcpOnly),
32
33
  operation("api_keys.revoke", "/api/cli/api-keys/{key_id}", "DELETE", "api-keys revoke", "oxygen_api_keys_revoke", "workspace", "Revoke a workspace API key; requires the caller's personal user session.", {}, [], mcpOnly),
@@ -13,6 +13,13 @@ export declare const FUTURE_SIGNUP_LIFECYCLE_PROJECTION_CONTRACT_VERSION: "futur
13
13
  export declare const FUTURE_SIGNUP_CRM_DESTINATION = "oxygen_company_crm";
14
14
  export declare const FUTURE_SIGNUP_ACTIVATION_COMMANDS: readonly ["agent create", "crm activity log", "crm assert", "crm object add-attr", "crm object create", "crm objects add-attr", "crm objects create", "crm relationships define", "crm relationships upsert", "knowledge page upsert", "publishing posts create", "sequences create", "tables create", "tables duplicate", "tables import-csv", "tables import-file", "tables import-staged", "tables import-url", "tables insert", "tables relate", "tables update", "tables upsert", "workflows apply"];
15
15
  export declare function isFutureSignupActivationCommand(command: string): boolean;
16
+ /**
17
+ * The browser resource routes (`/api/cli/tables/{table}/rows…`) report their own command
18
+ * names, and the web grid and record panel write through them. Each is the same creation as
19
+ * its flat twin in the set above, so it counts as that: in the first-record marker and in the
20
+ * staff KPI board's web activation.
21
+ */
22
+ export declare const FUTURE_SIGNUP_ACTIVATION_COMMAND_ALIASES: Readonly<Record<string, string>>;
16
23
  export declare function futureSignupJourneyId(clerkUserId: string): string;
17
24
  export declare function futureSignupFactId(clerkUserId: string): string;
18
25
  export declare function futureSignupOperationFactId(operationEventId: string): string;
@@ -42,6 +42,17 @@ const ACTIVATION_COMMAND_SET = new Set(FUTURE_SIGNUP_ACTIVATION_COMMANDS);
42
42
  export function isFutureSignupActivationCommand(command) {
43
43
  return ACTIVATION_COMMAND_SET.has(command.trim().toLowerCase());
44
44
  }
45
+ /**
46
+ * The browser resource routes (`/api/cli/tables/{table}/rows…`) report their own command
47
+ * names, and the web grid and record panel write through them. Each is the same creation as
48
+ * its flat twin in the set above, so it counts as that: in the first-record marker and in the
49
+ * staff KPI board's web activation.
50
+ */
51
+ export const FUTURE_SIGNUP_ACTIVATION_COMMAND_ALIASES = {
52
+ "tables rows insert": "tables insert",
53
+ "tables rows edit": "tables update",
54
+ "tables rows relationship-set": "tables relate",
55
+ };
45
56
  export function futureSignupJourneyId(clerkUserId) {
46
57
  return `future_signup:v1:clerk_user:${requiredId(clerkUserId, "clerkUserId")}`;
47
58
  }
@@ -41,3 +41,10 @@ export declare const KNOWLEDGE_STUB_MARKER = "Stub \u2014 fill me.";
41
41
  export declare const KNOWLEDGE_BOOTSTRAP_COMMAND = "oxygen knowledge bootstrap";
42
42
  export declare const KNOWLEDGE_BOOTSTRAP_AVAILABLE = true;
43
43
  export declare const RESERVED_KNOWLEDGE_FRONTMATTER_KEYS: readonly ["oxygen_page", "id", "slug", "type", "title", "status", "tags", "canonical", "summary", "revision", "updated_at", "web_url"];
44
+ /**
45
+ * A Knowledge folder is a skill when it holds the skill's entry file, named
46
+ * SKILL (the Agent Skills SKILL.md convention); its other files are the
47
+ * skill's supporting files. Shared by the program file picker and the reads
48
+ * that load a creator's program files.
49
+ */
50
+ export declare function isKnowledgeSkillEntryTitle(title: string): boolean;
@@ -159,3 +159,12 @@ export const RESERVED_KNOWLEDGE_FRONTMATTER_KEYS = [
159
159
  "updated_at",
160
160
  "web_url",
161
161
  ];
162
+ /**
163
+ * A Knowledge folder is a skill when it holds the skill's entry file, named
164
+ * SKILL (the Agent Skills SKILL.md convention); its other files are the
165
+ * skill's supporting files. Shared by the program file picker and the reads
166
+ * that load a creator's program files.
167
+ */
168
+ export function isKnowledgeSkillEntryTitle(title) {
169
+ return /^skill(\.md)?$/i.test(title.trim());
170
+ }
@@ -44,6 +44,13 @@ export declare const PRODUCT_EVENTS: {
44
44
  readonly FIRST_PLAY_STARTED: "first_play_started";
45
45
  readonly FIRST_PLAY_STEP_COMPLETED: "first_play_step_completed";
46
46
  readonly FIRST_PLAY_COMPLETED: "first_play_completed";
47
+ /**
48
+ * The getting-started checklist (2026-10-09): one event per workspace and step, the
49
+ * first time any surface's read sees it done, gated by a stamp on the organization
50
+ * (apps/web `lib/activation/getting-started.ts`). `step` is first_leads,
51
+ * first_sequence, first_account or first_launch.
52
+ */
53
+ readonly GETTING_STARTED_STEP_COMPLETED: "getting_started_step_completed";
47
54
  /**
48
55
  * Usage — what was ASKED for. `mcp_tool_called` used to sit here as the
49
56
  * second highest-volume event; it was REPLACED (not joined) by the reserved
@@ -44,6 +44,13 @@ export const PRODUCT_EVENTS = {
44
44
  FIRST_PLAY_STARTED: "first_play_started",
45
45
  FIRST_PLAY_STEP_COMPLETED: "first_play_step_completed",
46
46
  FIRST_PLAY_COMPLETED: "first_play_completed",
47
+ /**
48
+ * The getting-started checklist (2026-10-09): one event per workspace and step, the
49
+ * first time any surface's read sees it done, gated by a stamp on the organization
50
+ * (apps/web `lib/activation/getting-started.ts`). `step` is first_leads,
51
+ * first_sequence, first_account or first_launch.
52
+ */
53
+ GETTING_STARTED_STEP_COMPLETED: "getting_started_step_completed",
47
54
  /**
48
55
  * Usage — what was ASKED for. `mcp_tool_called` used to sit here as the
49
56
  * second highest-volume event; it was REPLACED (not joined) by the reserved
@@ -8,12 +8,26 @@ export type UgcPostingTarget = {
8
8
  };
9
9
  export declare const UGC_POSTING_TARGET_MAX = 100;
10
10
  export declare const UGC_POSTING_TARGET_PERIODS: readonly ["week", "month", "total"];
11
+ /**
12
+ * How creators get into a public program (Tim, 2026-10-09): the brand approves
13
+ * each application, or an application joins at once. Private programs are
14
+ * joined by invitation only, so they are always `approval`.
15
+ */
16
+ export declare const UGC_JOIN_POLICIES: readonly ["approval", "automatic"];
17
+ export type UgcJoinPolicy = (typeof UGC_JOIN_POLICIES)[number];
11
18
  /**
12
19
  * The operator-written creator brief: one page, not a document (Philipp, 2026-09-23;
13
20
  * raised from 1,200 on 2026-09-29, when a natural founder brief ran 1,298 and blind
14
21
  * operators either trimmed it or left the program without one).
15
22
  */
16
23
  export declare const UGC_PROGRAM_BRIEF_MAX_CHARS = 4000;
24
+ /**
25
+ * A creator's live, read-only handle on one file a program shares:
26
+ * `ugc:<programId>:<page id or slug>`. Every surface that lists or opens a
27
+ * shared file builds and reads it here, so web, worker and agents agree.
28
+ */
29
+ export declare function ugcKnowledgeReference(programId: string, key: string): string;
30
+ export declare function isUgcKnowledgeReference(value: string): boolean;
17
31
  /** The program's target as its API shape, or null when none is set. */
18
32
  export declare function ugcPostingTarget(program: {
19
33
  postingTargetCount?: number | null | undefined;
@@ -25,6 +39,8 @@ export type UgcProgram = {
25
39
  productUrl: string;
26
40
  description: string;
27
41
  knowledgePageSlugs: string[];
42
+ /** Folders shared live with creators (skills included); absent before migration 0482. */
43
+ knowledgeFolderIds?: string[];
28
44
  peerEngagementEnabled?: boolean;
29
45
  peerEngagementVersion?: number;
30
46
  peerEngagementEffectiveAt?: Date | null;
@@ -35,6 +51,8 @@ export type UgcProgram = {
35
51
  /** Posts each creator is expected to publish per period; both null when unset. */
36
52
  postingTargetCount?: number | null;
37
53
  postingTargetPeriod?: UgcPostingTargetPeriod | null;
54
+ /** How creators join while the program is public; older rows read as approval. */
55
+ joinPolicy?: UgcJoinPolicy;
38
56
  status: "active" | "archived";
39
57
  createdAt: Date;
40
58
  updatedAt: Date;
@@ -1,11 +1,29 @@
1
1
  export const UGC_POSTING_TARGET_MAX = 100;
2
2
  export const UGC_POSTING_TARGET_PERIODS = ["week", "month", "total"];
3
+ /**
4
+ * How creators get into a public program (Tim, 2026-10-09): the brand approves
5
+ * each application, or an application joins at once. Private programs are
6
+ * joined by invitation only, so they are always `approval`.
7
+ */
8
+ export const UGC_JOIN_POLICIES = ["approval", "automatic"];
3
9
  /**
4
10
  * The operator-written creator brief: one page, not a document (Philipp, 2026-09-23;
5
11
  * raised from 1,200 on 2026-09-29, when a natural founder brief ran 1,298 and blind
6
12
  * operators either trimmed it or left the program without one).
7
13
  */
8
14
  export const UGC_PROGRAM_BRIEF_MAX_CHARS = 4000;
15
+ const UGC_KNOWLEDGE_REFERENCE_PREFIX = "ugc:";
16
+ /**
17
+ * A creator's live, read-only handle on one file a program shares:
18
+ * `ugc:<programId>:<page id or slug>`. Every surface that lists or opens a
19
+ * shared file builds and reads it here, so web, worker and agents agree.
20
+ */
21
+ export function ugcKnowledgeReference(programId, key) {
22
+ return `${UGC_KNOWLEDGE_REFERENCE_PREFIX}${programId}:${key}`;
23
+ }
24
+ export function isUgcKnowledgeReference(value) {
25
+ return value.startsWith(UGC_KNOWLEDGE_REFERENCE_PREFIX);
26
+ }
9
27
  /** The program's target as its API shape, or null when none is set. */
10
28
  export function ugcPostingTarget(program) {
11
29
  return program.postingTargetCount && program.postingTargetPeriod
@@ -1 +1 @@
1
- export declare const OXYGEN_BUILD_VERSION = "1.1013.15";
1
+ export declare const OXYGEN_BUILD_VERSION = "1.1013.38";
@@ -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.1013.15";
2
+ export const OXYGEN_BUILD_VERSION = "1.1013.38";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oxygen-agent/cli",
3
- "version": "1.1013.15",
3
+ "version": "1.1013.38",
4
4
  "private": false,
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",