replicas-cli 0.2.728 → 0.2.730

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 (2) hide show
  1. package/dist/index.cjs +51 -41
  2. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -22513,10 +22513,15 @@ var TEAM_PLAN = PLANS.team;
22513
22513
  var ENTERPRISE_PLAN = PLANS.enterprise;
22514
22514
 
22515
22515
  // ../shared/src/analytics/types.ts
22516
+ var credentialAccountSchema = external_exports.object({
22517
+ ownerName: external_exports.string().optional(),
22518
+ email: external_exports.string().optional()
22519
+ });
22516
22520
  var agentCredentialSnapshotSchema = external_exports.object({
22517
22521
  method: external_exports.enum(CREDENTIAL_METHOD),
22518
22522
  scope: external_exports.enum(CREDENTIAL_SCOPE),
22519
- revision: external_exports.string().optional()
22523
+ revision: external_exports.string().optional(),
22524
+ account: credentialAccountSchema.optional()
22520
22525
  });
22521
22526
  function isAuthMethod(value) {
22522
22527
  return typeof value === "string" && Object.values(CREDENTIAL_METHOD).some((method) => method === value);
@@ -22528,7 +22533,7 @@ function isCredentialScope(value) {
22528
22533
  // ../shared/src/workspace-credentials.ts
22529
22534
  var WORKSPACE_CREDENTIAL_PROVIDERS = ["claude", "codex"];
22530
22535
  var workspaceCredentialProviderSchema = external_exports.enum(WORKSPACE_CREDENTIAL_PROVIDERS);
22531
- var workspaceCredentialSelectionSchema = agentCredentialSnapshotSchema.omit({ revision: true });
22536
+ var workspaceCredentialSelectionSchema = agentCredentialSnapshotSchema.omit({ revision: true, account: true });
22532
22537
  var createWorkspaceCredentialSchema = workspaceCredentialSelectionSchema.extend({
22533
22538
  provider: external_exports.enum(VALID_CODING_AGENT_PROVIDERS)
22534
22539
  }).refine(({ provider, method }) => agentCredentialMethods(provider).includes(method), {
@@ -22916,6 +22921,8 @@ var CHAT_INTERRUPTED_EVENT_TYPE = "replicas-interrupted";
22916
22921
  var AUTH_FALLBACK_EVENT_TYPE = "auth-fallback";
22917
22922
  function coerceAuthFallbackPayload(payload) {
22918
22923
  const { provider, reason, exhaustedMethod, exhaustedScope, candidateMethod, candidateScope, status, detail } = payload;
22924
+ const exhaustedAccount = credentialAccountSchema.safeParse(payload.exhaustedAccount).data;
22925
+ const candidateAccount = credentialAccountSchema.safeParse(payload.candidateAccount).data;
22919
22926
  if (typeof provider !== "string" || !isValidCodingAgentProvider(provider) || reason !== "rate_limit" && reason !== "out_of_credits" || !isAuthMethod(exhaustedMethod) || !isAuthMethod(candidateMethod) || !isCredentialScope(candidateScope) || status !== "switched" && status !== "failed") {
22920
22927
  return null;
22921
22928
  }
@@ -22924,8 +22931,10 @@ function coerceAuthFallbackPayload(payload) {
22924
22931
  reason,
22925
22932
  exhaustedMethod,
22926
22933
  ...isCredentialScope(exhaustedScope) ? { exhaustedScope } : {},
22934
+ ...exhaustedAccount ? { exhaustedAccount } : {},
22927
22935
  candidateMethod,
22928
22936
  candidateScope,
22937
+ ...candidateAccount ? { candidateAccount } : {},
22929
22938
  status,
22930
22939
  ...typeof detail === "string" && detail ? { detail } : {}
22931
22940
  };
@@ -23736,7 +23745,7 @@ gh pr review 123 --request-changes --body "Changes needed"
23736
23745
 
23737
23746
  ## Media in GitHub workflows
23738
23747
 
23739
- Media delivery is owned by \`references/MEDIA.md\`. Read its GitHub section before adding screenshots, recordings, diagrams, or HTML reports to a pull request, issue, review comment, or commit; it covers public Forge embeds for images and recording previews, organization-only HTML links, and the required **View in Replicas** link.
23748
+ Media delivery is owned by \`references/MEDIA.md\`. Read its GitHub section before adding screenshots, recordings, diagrams, or HTML reports to a pull request, issue, review comment, or commit; it covers the public links every image upload prints, recording previews, organization-only HTML links, and the required **View in Replicas** link.
23740
23749
  `;
23741
23750
  var GITHUB_ABILITY = {
23742
23751
  label: "GitHub",
@@ -23947,11 +23956,11 @@ If none of these apply, don't upload.
23947
23956
 
23948
23957
  \`replicas media upload\` is always the first delivery action. When the current task has an external destination, every other delivery step follows only after that command succeeds. For every file:
23949
23958
 
23950
- 1. First, run \`replicas media upload\` with the original file. Do not begin any destination upload until the command succeeds. This creates the canonical dashboard copy and prints a chat embed plus a per-file dashboard link. With public access, the printed Forge embed is the chat embed and is also safe to use on GitHub.
23959
+ 1. First, run \`replicas media upload\` with the original file. Do not begin any destination upload until the command succeeds. This creates the canonical dashboard copy and prints an embed plus a per-file dashboard link. Every image gets a public link, so its printed embed works in chat and on GitHub.
23951
23960
  2. Include the printed embed line in the Replicas chat reply, followed by **View in Canvas** using the matching per-file dashboard URL. HTML uses its printed page link instead of an image embed.
23952
- 3. Identify every destination in the task and use its inline representation from the table below. Slack, Linear, and GitLab require an upload of the same original bytes; GitHub uses the public Forge embed.
23961
+ 3. Identify every destination in the task and use its inline representation from the table below. Slack, Linear, and GitLab require an upload of the same original bytes; GitHub uses the image's printed public embed.
23953
23962
  4. Put the **View in Replicas** dashboard link next to the destination embed as a secondary link.
23954
- 5. Check each destination response. If its upload or Forge share fails, say so explicitly and keep the dashboard link; never claim that a dashboard link is an inline embed.
23963
+ 5. Check each destination response. If its upload or public link fails, say so explicitly and keep the dashboard link; never claim that a dashboard link is an inline embed.
23955
23964
 
23956
23965
  | Destination | Required file delivery | Inline result |
23957
23966
  |---|---|---|
@@ -23959,7 +23968,7 @@ If none of these apply, don't upload.
23959
23968
  | Slack | \`files.getUploadURLExternal\` \u2192 raw-byte POST \u2192 \`files.completeUploadExternal\` | Uploaded file in the channel or thread |
23960
23969
  | Linear | \`fileUpload\` mutation \u2192 presigned upload \u2192 issue/comment mutation | Returned \`assetUrl\` in Markdown |
23961
23970
  | GitLab | Project \`/uploads\` endpoint with the original bytes | Returned GitLab Markdown |
23962
- | GitHub | Replicas public Forge share for an image or recording poster | Printed Forge embed, linked to the recording when needed |
23971
+ | GitHub | Printed public embed for an image or recording poster | Printed embed, linked to the recording when needed |
23963
23972
 
23964
23973
  The dashboard link is the subtitle and jump-back path. It is never a substitute for the destination embed.
23965
23974
 
@@ -23989,8 +23998,8 @@ Names are normalized to hyphen-case (spaces become hyphens, e.g. \`Login page\`
23989
23998
 
23990
23999
  For each media file, the CLI prints an embed line and a dashboard link:
23991
24000
 
23992
- 1. Default and organization access print \`Replicas chat embed: ![filename](<api-url>)\`; this authenticated URL renders inline in Replicas chat **only** \u2014 see below.
23993
- 2. Public access (\`--access public\` or \`--share\`) prints \`![filename](<public-url>)\` as the Forge embed instead. This is the public, stable bearer URL to paste into GitHub when sharing is authorized.
24001
+ 1. Images always print \`![filename](<public-url>)\`. This public, stable link works in Replicas chat, GitHub, and anywhere else Markdown images render. No flag is needed.
24002
+ 2. Video and audio print \`Replicas chat embed: ![filename](<api-url>)\` by default; this authenticated URL renders inline in Replicas chat **only** \u2014 see below. \`--access public\` prints a public embed instead.
23994
24003
  3. \`View in Replicas: <deep-link>\` is a per-file dashboard URL of the form \`https://app.replicas.dev/workspaces/<workspace-id>?media=<media-id>\` that opens directly to that specific file.
23995
24004
 
23996
24005
  Match each "View in Replicas" line to the embed line directly above it \u2014 that's the deep link for that file.
@@ -24005,13 +24014,13 @@ replicas media upload recap.html --name "Visual recap" --access organization
24005
24014
 
24006
24015
  The printed \`Forge link (organization only)\` opens a dedicated page. Signed-in organization members go straight to it; signed-out members sign in and return to the page.
24007
24016
 
24008
- Use public access only when the media must render without Replicas authentication:
24017
+ Video and audio stay private unless they must play without Replicas sign-in; then pass \`--access public\` (alias \`--share\`):
24009
24018
 
24010
24019
  \`\`\`bash
24011
- replicas media upload screenshot.png --name "Login page" --access public
24020
+ replicas media upload demo.mp4 --name "Checkout demo" --access public
24012
24021
  \`\`\`
24013
24022
 
24014
- \`--share\` remains an alias for \`--access public\`. Public access prints the raw \`Forge embed\` Markdown instead of the authenticated chat-only embed for image, video, or audio media, backed by an opt-in bearer URL. Anyone with that unguessable URL can view the asset until it is rotated or revoked. HTML pages only support organization access. Use \`replicas media share <media-id>\` to rotate a public media URL and \`replicas media revoke <media-id>\` to revoke it.
24023
+ Public links are unguessable bearer URLs: anyone with the link can view the file until it is rotated or revoked. HTML pages only support organization access. Reuse the link printed at upload. \`replicas media share <media-id>\` issues a new link and breaks the old one everywhere it is embedded, and \`replicas media revoke <media-id>\` removes public access.
24015
24024
 
24016
24025
  Permanently delete an upload with \`replicas media delete <media-id>\`. The backend only permits deletion when the media belongs to the current workspace; media from another workspace returns not found.
24017
24026
 
@@ -24019,14 +24028,14 @@ Permanently delete an upload with \`replicas media delete <media-id>\`. The back
24019
24028
 
24020
24029
  | URL | What it is | Where it's allowed |
24021
24030
  |---|---|---|
24022
- | \`https://api.replicas.dev/v1/media/<id>\` (inside \`![\u2026](\u2026)\`) | Authenticated API redirect to a presigned blob \u2014 requires the Replicas chat session | **Only** in the Replicas chat reply. Nowhere else. |
24031
+ | \`https://api.replicas.dev/v1/media/<id>\` (inside \`![\u2026](\u2026)\`) | Authenticated API redirect printed for private video, audio, and HTML \u2014 requires the Replicas chat session | **Only** in the Replicas chat reply. Nowhere else. |
24023
24032
  | \`https://replicas.dev/organizations/<organization-id>/media/<media-id>\` | Organization-only page printed by \`--access organization\` | Pull requests and other places where every viewer belongs to the Replicas organization. |
24024
- | \`https://api.replicas.dev/v1/media/public/<id>/<token>\` | Opt-in public bearer URL printed by \`--access public\` or \`--share\` | The Replicas chat reply and GitHub embeds, for image, video, or audio media. |
24033
+ | \`https://api.replicas.dev/v1/media/public/<id>/<token>\` | Public bearer URL printed for every image, and for video or audio with \`--access public\` | The Replicas chat reply and GitHub embeds. |
24025
24034
  | \`https://app.replicas.dev/workspaces/<workspace-id>?media=<media-id>\` | Authenticated dashboard deep link that opens the media file in the workspace | Everywhere external: Slack, GitHub, GitLab, Linear, PR bodies, comments, emails. |
24026
24035
 
24027
24036
  ### NEVER link the API redirect URL outside the Replicas chat reply
24028
24037
 
24029
- The \`api.replicas.dev/v1/media/<id>\` URL is **not public**. It's an authenticated redirect that only resolves to a presigned download when the Replicas chat session token is present. Anywhere else (Slack, Linear, GitHub, a browser tab the user opens directly, a customer copy-pasting from chat) it returns \`{"error":"Missing authorization token"}\` and renders as a broken image.
24038
+ The \`api.replicas.dev/v1/media/<id>\` URL is **not public**. Image uploads never print it; if you have one for an image from an older upload, run \`replicas media share <media-id>\` to get a public link. It's an authenticated redirect that only resolves to a presigned download when the Replicas chat session token is present. Anywhere else (Slack, Linear, GitHub, a browser tab the user opens directly, a customer copy-pasting from chat) it returns \`{"error":"Missing authorization token"}\` and renders as a broken image.
24030
24039
 
24031
24040
  This rule has no exceptions:
24032
24041
  - \u274C Never paste it in a Slack message \u2014 upload the actual bytes via the 3-step \`files.getUploadURLExternal\` \u2192 POST bytes \u2192 \`files.completeUploadExternal\` flow instead (see below).
@@ -24060,12 +24069,12 @@ After (or alongside) the embeds, include a \`[View in Canvas](<deep-link>)\` hyp
24060
24069
 
24061
24070
  After \`replicas media upload\` succeeds, external delivery has two required follow-up steps for every file:
24062
24071
 
24063
- 1. **Use the destination's inline representation:** upload the raw bytes to Slack, Linear, or GitLab; embed a public Forge share on GitHub.
24072
+ 1. **Use the destination's inline representation:** upload the raw bytes to Slack, Linear, or GitLab; embed the image's printed public link on GitHub.
24064
24073
  2. **Link the Replicas dashboard deep link** (\`?media=<id>\` form) so the user can jump straight to the file in the workspace.
24065
24074
 
24066
24075
  A dashboard link alone is not enough. An embed without the dashboard link is not enough. Do both.
24067
24076
 
24068
- Slack, Linear, and GitLab receive the original bytes through their native upload APIs. GitHub uses a Replicas public Forge share for screenshots and recording previews.
24077
+ Slack, Linear, and GitLab receive the original bytes through their native upload APIs. GitHub uses the printed public link for screenshots and recording previews.
24069
24078
 
24070
24079
  ### Slack \u2014 embed natively via the 3-step external file upload flow
24071
24080
 
@@ -24166,19 +24175,17 @@ The same flow works for issue bodies (use \`issueCreate\` / \`issueUpdate\` with
24166
24175
 
24167
24176
  Never paste the \`api.replicas.dev/v1/media/<id>\` URL into a Linear body or comment \u2014 it will render as a broken image to anyone outside your Replicas chat.
24168
24177
 
24169
- ### GitHub: inline images and recording previews via Forge
24170
-
24171
- Replicas authenticates GitHub with GitHub App tokens, which native GitHub CLI attachment uploads do not support. Do not use \`gh --attach\` for media. Use a public Forge share for images in PR descriptions, issues, and comments.
24178
+ ### GitHub: inline images and recording previews
24172
24179
 
24173
- Create a public share only for a public repository or after explicit consent to publish media from a private repository. If sharing is not authorized, keep the media private and include its **View in Replicas** link, explaining that inline GitHub images require a public share.
24180
+ Replicas authenticates GitHub with GitHub App tokens, which GitHub's attachment upload rejects, so \`gh --attach\` does not work. Use the public link every image upload prints, in public and private repositories alike, for PR descriptions, issues, and comments.
24174
24181
 
24175
- 1. Upload the image with public access. This creates both the Replicas dashboard copy and the Forge share:
24182
+ 1. Upload the image:
24176
24183
 
24177
24184
  \`\`\`bash
24178
- replicas media upload /tmp/screenshot.png --name "PR screenshot" --access public
24185
+ replicas media upload /tmp/screenshot.png --name "PR screenshot"
24179
24186
  \`\`\`
24180
24187
 
24181
- 2. Copy the printed \`![filename](<public-url>)\` Forge embed into the body file, followed by the matching **View in Replicas** link. Use the printed public URL verbatim; never use a local file path, the authenticated API URL, or an expiring storage URL.
24188
+ 2. Copy the printed \`![filename](<public-url>)\` line verbatim into the body file, followed by the matching **View in Replicas** link. Never use a local file path, a \`/v1/media/<id>\` URL, a Linear \`assetUrl\`, or an expiring storage URL.
24182
24189
  3. Create or update the PR using the body file:
24183
24190
 
24184
24191
  \`\`\`bash
@@ -24187,13 +24194,13 @@ gh pr edit 456 --body-file /tmp/pr-body.md
24187
24194
  gh pr comment 456 --body-file /tmp/comment.md
24188
24195
  \`\`\`
24189
24196
 
24190
- GitHub does not reliably render external videos as inline players. For a recording preview, upload the MP4 normally, generate a poster with \`ffmpeg -i /tmp/demo.mp4 -frames:v 1 /tmp/demo-poster.png\`, upload the poster with \`--access public\`, and link its Forge embed to the recording's **View in Replicas** URL:
24197
+ Videos stay private, and GitHub does not play external videos inline. Upload the MP4 normally, generate a poster with \`ffmpeg -i /tmp/demo.mp4 -frames:v 1 /tmp/demo-poster.png\`, upload the poster like any image, and link its printed embed to the recording's **View in Replicas** URL:
24191
24198
 
24192
24199
  \`\`\`markdown
24193
24200
  [![Demo recording](<public-poster-url>)](<recording-dashboard-url>)
24194
24201
  \`\`\`
24195
24202
 
24196
- Public forge shares are unauthenticated bearer capabilities. Revoke with \`replicas media revoke <media-id>\` **only** when the user asks or the media should intentionally stop rendering; never as routine post-task cleanup, since revoking breaks every embed already posted on the PR.
24203
+ Public links are unauthenticated bearer capabilities. Revoke with \`replicas media revoke <media-id>\` **only** when the user asks or the media should intentionally stop rendering; never as routine post-task cleanup, since revoking breaks every embed already posted on the PR.
24197
24204
 
24198
24205
  For a self-contained HTML report, upload it with \`--access organization\` and put the printed \`Forge link\` Markdown in the PR body or comment. GitHub cannot render the page inline, so use the normal link rather than image syntax. HTML pages cannot be shared publicly.
24199
24206
 
@@ -24203,7 +24210,7 @@ Do **not** commit screenshots to the repo, use placeholder URLs, expose the auth
24203
24210
 
24204
24211
  GitLab supports native project Markdown uploads. For a GitLab destination, always upload the media to Replicas first, then POST the same original file to the repository's \`/projects/:id/uploads\` API using the workspace GitLab credential. Insert the returned \`markdown\` value into the merge request body or comment and include the Replicas dashboard link. Image uploads render inline; MP4, MOV, and WebM uploads render as inline video players.
24205
24212
 
24206
- Do not use a Replicas public forge share for GitLab when the native project upload succeeds; native uploads preserve project access controls.
24213
+ Do not use a Replicas public link for GitLab when the native project upload succeeds; native uploads preserve project access controls.
24207
24214
 
24208
24215
  ## Recording defaults
24209
24216
 
@@ -24245,7 +24252,7 @@ replicas media upload chart-a.svg chart-b.svg --name "Latency chart" --name "Err
24245
24252
  - \`--kind <image|video|audio|html>\` \u2014 override auto-detection
24246
24253
  - \`--name <name>\`: required display name shown in the dashboard, one per file in order
24247
24254
  - \`--session-id <id>\` \u2014 associate the upload with a specific session
24248
- - \`--access organization|public\`: create an organization-only link, or a public bearer URL for non-HTML media
24255
+ - \`--access organization|public\`: for video, audio, and HTML, create an organization-only link or a public bearer URL (video and audio only). Images are always public
24249
24256
  - \`--share\`: alias for \`--access public\`; not supported for HTML
24250
24257
  `;
24251
24258
  var MEDIA_ABILITY = {
@@ -27254,7 +27261,7 @@ var headlessFilesystemAgentResultSchema = external_exports.object({
27254
27261
  });
27255
27262
 
27256
27263
  // ../shared/src/cli-version.ts
27257
- var CLI_VERSION = "0.2.728";
27264
+ var CLI_VERSION = "0.2.730";
27258
27265
 
27259
27266
  // ../shared/src/version.ts
27260
27267
  function compareVersions(v1, v2) {
@@ -31333,38 +31340,41 @@ async function mediaUploadCommand(filePaths, options) {
31333
31340
  if (publicAccess && kinds.some((kind) => !isPublicMediaKind(kind))) {
31334
31341
  throw new Error("HTML pages only support organization access. Use --access organization.");
31335
31342
  }
31343
+ const shared = kinds.map((kind) => publicAccess || kind === MEDIA_KIND.IMAGE);
31336
31344
  const results = await Promise.allSettled(
31337
31345
  filePaths.map((filePath, i) => uploadOne(filePath, names[i], kinds[i], options))
31338
31346
  );
31339
- const shareResults = publicAccess ? await Promise.allSettled(
31347
+ const shareResults = await Promise.allSettled(
31340
31348
  results.map(
31341
- (result) => result.status === "fulfilled" ? shareMedia(result.value.media.id) : Promise.resolve(null)
31349
+ (result, i) => result.status === "fulfilled" && shared[i] ? shareMedia(result.value.media.id) : Promise.resolve(null)
31342
31350
  )
31343
- ) : [];
31351
+ );
31344
31352
  const config3 = readAgentConfig();
31345
31353
  const failures = [];
31346
31354
  for (let i = 0; i < results.length; i++) {
31347
31355
  const result = results[i];
31348
31356
  if (result.status === "fulfilled") {
31349
31357
  const { fileName, media } = result.value;
31350
- const shareResult = publicAccess ? shareResults[i] : void 0;
31358
+ const shareResult = shareResults[i];
31351
31359
  const publicUrl = shareResult?.status === "fulfilled" ? shareResult.value ?? void 0 : void 0;
31352
- if (publicAccess) {
31360
+ if (shared[i]) {
31353
31361
  if (!publicUrl) {
31354
- const error51 = shareResult?.status === "rejected" ? shareResult.reason : new Error("Missing public share URL");
31362
+ const reason = shareResult?.status === "rejected" ? shareResult.reason : new Error("Missing public share URL");
31355
31363
  failures.push({
31356
31364
  filePath: filePaths[i],
31357
31365
  operation: "share",
31358
- error: error51 instanceof Error ? error51 : new Error(String(error51))
31366
+ error: new Error(
31367
+ `${reason instanceof Error ? reason.message : String(reason)}. Uploaded as ${media.id}; retry with \`replicas media share ${media.id}\``
31368
+ )
31359
31369
  });
31360
31370
  }
31361
31371
  }
31362
31372
  if (media.kind === MEDIA_KIND.HTML) {
31363
31373
  console.log(`HTML page: [${fileName}](${MONOLITH_URL}/v1/media/${media.id})`);
31364
- } else if (!publicAccess || publicUrl) {
31374
+ } else if (!shared[i] || publicUrl) {
31365
31375
  console.log(formatMediaEmbed(fileName, media.id, publicUrl));
31366
31376
  }
31367
- if (options.access === "organization") {
31377
+ if (options.access === "organization" && !shared[i]) {
31368
31378
  console.log(
31369
31379
  `Forge link (organization only): [View ${options.name?.[i] ?? fileName}](${getOrganizationMediaUrl(media.organization_id, media.id)})`
31370
31380
  );
@@ -31405,7 +31415,7 @@ async function mediaListCommand(options) {
31405
31415
  const query = qs.toString() ? `?${qs.toString()}` : "";
31406
31416
  const { media } = await agentFetch(`/v1/engine/media${query}`);
31407
31417
  for (const m of media) {
31408
- console.log(`${MONOLITH_URL}/v1/media/${m.id} ${m.kind} ${m.size} ${m.created_at}`);
31418
+ console.log(`${m.id} ${m.kind} ${m.display_name ?? ""} ${m.size} ${m.created_at}`);
31409
31419
  }
31410
31420
  }
31411
31421
 
@@ -32978,7 +32988,7 @@ if (isAgentMode()) {
32978
32988
  "Required human-facing display name shown in the dashboard. Pass one --name per file, in order.",
32979
32989
  (value, previous) => [...previous, value],
32980
32990
  []
32981
- ).option("--access <access>", "Link access: organization (sign-in required) or public (non-HTML bearer URL)").option("--share", "Alias for --access public; not supported for HTML").action(async (files, options) => {
32991
+ ).option("--access <access>", "Link access for video, audio, and HTML: organization (sign-in required) or public (video and audio only). Images always get a public link").option("--share", "Alias for --access public; not supported for HTML").action(async (files, options) => {
32982
32992
  try {
32983
32993
  await mediaUploadCommand(files, options);
32984
32994
  } catch (error51) {
@@ -32990,7 +33000,7 @@ if (isAgentMode()) {
32990
33000
  process.exit(1);
32991
33001
  }
32992
33002
  });
32993
- media.command("share <mediaId>").description("Create or rotate a public forge URL for uploaded image, video, or audio media").action(async (mediaId) => {
33003
+ media.command("share <mediaId>").description("Rotate an image's public forge URL, or create one for video or audio media").action(async (mediaId) => {
32994
33004
  try {
32995
33005
  await mediaShareCommand(mediaId);
32996
33006
  } catch (error51) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replicas-cli",
3
- "version": "0.2.728",
3
+ "version": "0.2.730",
4
4
  "description": "CLI for managing Replicas workspaces - SSH into cloud dev environments with automatic port forwarding",
5
5
  "main": "dist/index.cjs",
6
6
  "bin": {