@oxygen-agent/cli 1.886.3 → 1.888.6

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.886.3
37
+ Version: 1.888.6
@@ -50,7 +50,7 @@ const MUTATING_VERBS = new Set([
50
50
  "migrate",
51
51
  "move", "note", "off", "onboard", "order", "pause", "pin", "priority", "provision",
52
52
  "publish", "purchase", "purge", "push", "react", "reconcile", "record", "recover-pending",
53
- "register", "reject", "relink", "remove", "rename", "reorder", "reply", "request",
53
+ "recover-capacity", "register", "reject", "relink", "remove", "rename", "reorder", "reply", "request",
54
54
  "replay", "rerun", "rescan", "resend", "reset", "resolve", "restore", "resume",
55
55
  "retry", "retype", "revoke", "rotate", "run", "save", "schedule",
56
56
  "seed", "select", "send", "set", "setup", "share", "snooze", "solve",
@@ -67,6 +67,9 @@ const MUTATING_VERBS = new Set([
67
67
  // zero-credit. Keep those exceptions exact so discovery never invents spend.
68
68
  const ZERO_CREDIT_APPROVAL_COMMANDS = new Set([
69
69
  "mailboxes delete",
70
+ // This approval only reopens exact fingerprint-bound tenant rows. It never
71
+ // calls the provider, dispatches an action, or touches the credit ledger.
72
+ "sequences recover-capacity",
70
73
  // Credential replacement is destructive but does not execute the graph,
71
74
  // call a provider, or spend Oxygen credits.
72
75
  "workflows webhooks rotate",
@@ -89,6 +92,7 @@ const PREVIEW_BY_DEFAULT_COMMANDS = new Set([
89
92
  "linkedin intent autoenroll",
90
93
  "mailboxes emailguard auto-enroll",
91
94
  "mailboxes delete",
95
+ "sequences recover-capacity",
92
96
  "support admin done",
93
97
  "support admin reply",
94
98
  // A bare call reads the Plain workspace and prints the plan; --apply writes.
package/dist/index.js CHANGED
@@ -2720,6 +2720,7 @@ export function createProgram() {
2720
2720
  query,
2721
2721
  route: serializeCapabilityRoute(inferUserCapabilityRoute(query)),
2722
2722
  hint: "Hydrate one exact CLI command with `oxygen commands get <exact-command> --json`, or one MCP tool with `oxygen_capabilities_schema`.",
2723
+ alternate_search_hint: `If this route does not fit the outcome, run \`oxygen skills search ${JSON.stringify(query)} --json\` for a narrower operational play.`,
2723
2724
  };
2724
2725
  });
2725
2726
  }))
@@ -12683,7 +12684,7 @@ fixed scan; watermark_cursor starts a later bounded replay. Consumers must retai
12683
12684
  }));
12684
12685
  }))
12685
12686
  .addCommand(new Command("delete")
12686
- .description("Permanently delete a sequence and everything it owns (enrollments, actions, sender links, schedules). Active sequences must be paused first. Runs without --approved to preview the blast radius; pass --approved to purge.")
12687
+ .description("Permanently delete a sequence and everything it owns (enrollments, actions, sender links, schedules). To stop dispatch without deleting, use `sequences pause`; active sequences must be paused first. Runs without --approved to preview the blast radius; pass --approved to purge. The current CLI does not create new archived sequences; legacy archived sequences remain readable and taggable.")
12687
12688
  .argument("<sequence>", "Sequence id or slug.")
12688
12689
  .option("--approved", "Confirm the previewed permanent deletion.")
12689
12690
  .option("--json", "Print a JSON envelope.")
@@ -12787,6 +12788,38 @@ fixed scan; watermark_cursor starts a later bounded replay. Consumers must retai
12787
12788
  : {}),
12788
12789
  },
12789
12790
  }));
12791
+ }))
12792
+ .addCommand(new Command("recover-capacity")
12793
+ .description("Preview definitive no-effect terminal provider-capacity failures, or recover the exact signed scope on a PAUSED Sequence. Recovery only restores local action/enrollment state; it never sends, calls a provider, spends credits, or resumes dispatch.")
12794
+ .argument("<sequence>", "Sequence id or slug. Preview may run while active; apply requires paused.")
12795
+ .option("--limit <n>", "Maximum capacity-failure rows to inspect (1-5000, default 500). A truncated preview cannot be approved.")
12796
+ .option("--approval-token <token>", "Exact unexpired token returned by the preview.")
12797
+ .option("--approved", "Apply the exact signed scope. Requires --approval-token; the Sequence remains paused.")
12798
+ .option("--json", "Print a JSON envelope.")
12799
+ .action(async (sequence, options) => {
12800
+ await handleAsyncAction("sequences recover-capacity", options, () => {
12801
+ const approvalToken = readOption(options.approvalToken);
12802
+ if (options.approved === true && !approvalToken) {
12803
+ throw new Error("--approval-token is required with --approved.");
12804
+ }
12805
+ if (options.approved !== true && approvalToken) {
12806
+ throw new Error("--approval-token may only be used with --approved.");
12807
+ }
12808
+ const limit = readOption(options.limit)
12809
+ ? readPositiveInt(options.limit)
12810
+ : undefined;
12811
+ if (limit !== undefined && limit > 5_000) {
12812
+ throw new Error("--limit must be between 1 and 5000.");
12813
+ }
12814
+ return requestOxygen(`/api/cli/sequences/${encodeURIComponent(sequence)}/recover-capacity`, {
12815
+ method: "POST",
12816
+ body: {
12817
+ approved: options.approved === true,
12818
+ ...(approvalToken ? { approval_token: approvalToken } : {}),
12819
+ ...(limit === undefined ? {} : { limit }),
12820
+ },
12821
+ });
12822
+ });
12790
12823
  }))
12791
12824
  .addCommand(new Command("stats")
12792
12825
  .description("Show the sequence funnel: enrolled, invites sent, connected, replied, with acceptance and reply rates.")
package/dist/skills.js CHANGED
@@ -208,6 +208,13 @@ options, runtime = {}) {
208
208
  const env = runtime.env ?? process.env;
209
209
  const platform = runtime.platform ?? process.platform;
210
210
  const spawn = runtime.spawnSync ?? wrapExecFileSync(runtime.execFileSync) ?? spawnSync;
211
+ const installLocations = resolveSkillInstallLocations(agents, options.project === true, env);
212
+ // The vendored installer writes immediately once spawned. Tell humans and
213
+ // agents the exact destination first so a default global install is never a
214
+ // surprise, while keeping stdout as one stable JSON envelope under --json.
215
+ process.stderr.write(`note: installing Oxygen skills (${options.project ? "project" : "global"}) into ${installLocations
216
+ .map((location) => `${location.agent}=${location.path}`)
217
+ .join(", ")}\n`);
211
218
  // A specific shortcut skill can declare prerequisite skills that its SKILL.md
212
219
  // invokes (e.g. oxygen-clay-migration → oxygen-gtm, whose recipes it lives in).
213
220
  // Installing it alone would leave those missing, so pull them in too. Best-
@@ -304,6 +311,7 @@ options, runtime = {}) {
304
311
  skill,
305
312
  ...(dependencySkills.length > 0 ? { dependency_skills: dependencySkills } : {}),
306
313
  scope: options.project ? "project" : "global",
314
+ install_locations: installLocations,
307
315
  output: outputs.join(""),
308
316
  // Truthful counts a caller (human or scripting agent) can trust at a
309
317
  // glance: a not-detected agent is never folded into `failed`.
@@ -316,6 +324,23 @@ options, runtime = {}) {
316
324
  summary: summarizeInstallOutcome(agents.length, skippedAgents.length, 0),
317
325
  };
318
326
  }
327
+ function resolveSkillInstallLocations(agents, project, env) {
328
+ const projectRoots = {
329
+ codex: resolve(".agents", "skills"),
330
+ "claude-code": resolve(".claude", "skills"),
331
+ cursor: resolve(".agents", "skills"),
332
+ };
333
+ const globalRoots = {
334
+ codex: join(env.CODEX_HOME?.trim() || join(homedir(), ".codex"), "skills"),
335
+ "claude-code": join(env.CLAUDE_CONFIG_DIR?.trim() || join(homedir(), ".claude"), "skills"),
336
+ cursor: join(homedir(), ".cursor", "skills"),
337
+ };
338
+ const roots = project ? projectRoots : globalRoots;
339
+ return agents.map((agent) => ({
340
+ agent,
341
+ path: roots[agent] ?? (project ? resolve(".agents", "skills") : join(homedir(), ".agents", "skills")),
342
+ }));
343
+ }
319
344
  /**
320
345
  * Stages the requested skill(s) into `dir` so the installer receives a local
321
346
  * filesystem path instead of the org-bound tokenized access URL. Keeping the URL
@@ -1,4 +1,4 @@
1
- export declare const OXYGEN_VERSION = "1.886.3";
1
+ export declare const OXYGEN_VERSION = "1.888.6";
2
2
  export declare const OXYGEN_MINIMUM_CLI_VERSION = "1.181.0";
3
3
  export declare const MANAGED_INBOX_MINIMUM_CLI_VERSION = "1.326.2";
4
4
  export declare const SUPPORT_AGENT_REPLY_MINIMUM_CLI_VERSION = "1.747.0";
@@ -1,4 +1,4 @@
1
- export const OXYGEN_VERSION = "1.886.3";
1
+ export const OXYGEN_VERSION = "1.888.6";
2
2
  // The GLOBAL CLI compatibility floor: the oldest CLI allowed to call any
3
3
  // operational route. Raising it hard-rejects every older CLI from the entire
4
4
  // product, so it obeys one law, enforced by scripts/ci/cli-min-version-gate.mjs:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oxygen-agent/cli",
3
- "version": "1.886.3",
3
+ "version": "1.888.6",
4
4
  "private": false,
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",