skydive-cli 0.4.0-beta.1112 → 0.4.0-beta.1141

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/dist/js/bin.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { C as ensureActiveOrganization, D as setActiveWorkspace, E as listWorkspaces, O as name, T as getSessionIdentity, a as installCrashHandler, k as version, t as maybeStartProfiling, u as brandHelpArt, w as getActiveWorkspaceId, x as themes } from "./profiler-DORuJUS8.mjs";
3
- import { A as getStoredApiKeyWorkspaceName, C as getLastSeenVersion, F as resolveManagementAuth, I as resolveSession, M as resolveAppUrl, N as resolveChatAuth, O as getShareMachineDefault, P as resolveConfig, R as saveConfig, S as getConfigPath, T as getPromptHistoryPath, V as setLastSeenVersion, _ as API_KEY_PREFIX, b as PREFERENCES, g as API_KEY_FAMILY_PREFIX, h as API_KEYS_URL, i as resolveAgent, j as getUpdateCheckDisabled, k as getStoredApiKeyId, v as DEFAULT_API_URL, w as getPreference, x as deleteConfig, z as saveSession } from "./print-CiaU2ygh.mjs";
2
+ import { C as ensureActiveOrganization, D as setActiveWorkspace, E as listWorkspaces, O as name, T as getSessionIdentity, a as installCrashHandler, k as version, t as maybeStartProfiling, u as brandHelpArt, w as getActiveWorkspaceId, x as themes } from "./profiler-C-hbIwXv.mjs";
3
+ import { A as getStoredApiKeyWorkspaceName, C as getLastSeenVersion, F as resolveManagementAuth, I as resolveSession, M as resolveAppUrl, N as resolveChatAuth, O as getShareMachineDefault, P as resolveConfig, R as saveConfig, S as getConfigPath, T as getPromptHistoryPath, V as setLastSeenVersion, _ as API_KEY_PREFIX, b as PREFERENCES, g as API_KEY_FAMILY_PREFIX, h as API_KEYS_URL, i as resolveAgent, j as getUpdateCheckDisabled, k as getStoredApiKeyId, v as DEFAULT_API_URL, w as getPreference, x as deleteConfig, z as saveSession } from "./print-CswnhVUN.mjs";
4
4
  import { n as printError, r as printTable, t as output } from "./output-DYzzdXYV.mjs";
5
5
  import { n as createRestClient, t as HttpError } from "./rest-CG7VpQ56.mjs";
6
6
  import "./billing-blocked-CwfG1BTR.mjs";
@@ -177,7 +177,7 @@ var SkydiveApiClient = class {
177
177
  if (body.error && typeof body.error === "string") message = body.error;
178
178
  else if (body.error?.message) message = body.error.message;
179
179
  } catch {}
180
- if (response.status === 401 && this.authKind === "session") message = `${message} your chat session may have expired. Run \`skydive auth login\`.`;
180
+ if (response.status === 401 && this.authKind === "session") message = `${message}. Your chat session may have expired. Run \`skydive auth login\`.`;
181
181
  return err({
182
182
  message,
183
183
  status: response.status
@@ -531,7 +531,7 @@ async function runBrowserLogin(argv) {
531
531
  appUrl,
532
532
  sessionToken
533
533
  })).unwrapOr(null);
534
- const keyName = identity?.activeWorkspaceName ? `CLI (${hostname()}) ${identity.activeWorkspaceName}` : `CLI (${hostname()})`;
534
+ const keyName = identity?.activeWorkspaceName ? `CLI (${hostname()}) for ${identity.activeWorkspaceName}` : `CLI (${hostname()})`;
535
535
  const replaced = await revokeKeysByName({
536
536
  appUrl,
537
537
  sessionToken,
@@ -1468,9 +1468,9 @@ function ensureBunAndReexec(onProgress) {
1468
1468
  */
1469
1469
  function buildImportSeedPrompt(projectDir) {
1470
1470
  return [
1471
- "I'm migrating from another coding agent import my setup from this machine.",
1471
+ "I'm migrating from another coding agent. Import my setup from this machine.",
1472
1472
  "",
1473
- `Use your import-config skill. I ran this from \`${projectDir}\`, so start there (and my home directory) when you inventory what I have. Show me the plan first what you'll bring over, where it lands in you, and anything you're leaving out (credentials especially) and wait for my OK before committing anything.`
1473
+ `Use your import-config skill. I ran this from \`${projectDir}\`, so start there (and my home directory) when you inventory what I have. Show me the plan first: what you'll bring over, where it lands in you, and anything you're leaving out (credentials especially). Then wait for my OK before committing anything.`
1474
1474
  ].join("\n");
1475
1475
  }
1476
1476
  const importCommand = {
@@ -1482,7 +1482,7 @@ const importCommand = {
1482
1482
  }).option("print", {
1483
1483
  alias: "p",
1484
1484
  type: "string",
1485
- describe: "Non-interactive: send the import request as a one-shot, print the agent's plan, and exit (drivable from scripts or another coding agent). An optional value adds extra instructions to the request. The agent still waits for approval continue the printed conversation with `skydive chat -p \"go ahead\" --resume <id> --share-machine`. Runs under Node."
1485
+ describe: "Non-interactive: send the import request as a one-shot, print the agent's plan, and exit (drivable from scripts or another coding agent). An optional value adds extra instructions to the request. The agent still waits for approval; continue the printed conversation with `skydive chat -p \"go ahead\" --resume <id> --share-machine`. Runs under Node."
1486
1486
  }).example("skydive import", "Import from the current directory").example("skydive import --agent kit", "Import into a specific agent, skipping the picker").example("skydive import -p --agent kit", "One-shot: print the agent's import plan and exit"),
1487
1487
  handler: async (argv) => {
1488
1488
  const appUrl = resolveAppUrl({ appUrl: argv["api-url"] });
@@ -1514,7 +1514,7 @@ const importCommand = {
1514
1514
  process.exit(1);
1515
1515
  }
1516
1516
  }
1517
- const { runChat } = await import("./boot-DDtm3bc5.mjs");
1517
+ const { runChat } = await import("./boot-D1iX9oW1.mjs");
1518
1518
  await runChat({
1519
1519
  appUrl,
1520
1520
  sessionToken: session.value.sessionToken,
@@ -1541,7 +1541,7 @@ async function runImportPrintMode({ argv, appUrl }) {
1541
1541
  printError(`${session.error.message} For non-interactive use, run \`skydive auth login --web\` first, or set SKYDIVE_SESSION_TOKEN.`);
1542
1542
  process.exit(1);
1543
1543
  }
1544
- const { connectMachineShare } = await import("./print-share-DlO5RSBt.mjs");
1544
+ const { connectMachineShare } = await import("./print-share-DCmeJC5e.mjs");
1545
1545
  const machineShare = await connectMachineShare({
1546
1546
  appUrl,
1547
1547
  sessionToken: session.value.sessionToken,
@@ -1549,7 +1549,7 @@ async function runImportPrintMode({ argv, appUrl }) {
1549
1549
  });
1550
1550
  const extra = (argv.print ?? "").trim();
1551
1551
  const prompt = buildImportSeedPrompt(process.cwd()) + (extra ? `\n\nAdditional instructions: ${extra}` : "");
1552
- const { runPrint } = await import("./print-vUf9stcK.mjs");
1552
+ const { runPrint } = await import("./print-LoJjA8FM.mjs");
1553
1553
  try {
1554
1554
  const result = await runPrint({
1555
1555
  appUrl,
@@ -1631,7 +1631,7 @@ const createCommand = {
1631
1631
  console.log(` Name: ${key.name}`);
1632
1632
  console.log(` Key: ${key.key}`);
1633
1633
  console.log("");
1634
- console.log(" Save this key it will not be shown again.");
1634
+ console.log(" Save this key. It will not be shown again.");
1635
1635
  }
1636
1636
  };
1637
1637
  const revokeCommand$1 = {
@@ -1704,7 +1704,7 @@ const setCommand$1 = {
1704
1704
  describe: "Secret name (uppercase letters, digits, underscores)"
1705
1705
  }).positional("value", {
1706
1706
  type: "string",
1707
- describe: "Secret value. If omitted, read from stdin keeps the value out of shell history."
1707
+ describe: "Secret value. If omitted, read from stdin, which keeps the value out of shell history."
1708
1708
  }),
1709
1709
  handler: async (argv) => {
1710
1710
  let value = argv.value;
@@ -1863,7 +1863,7 @@ const chatCommand = {
1863
1863
  builder: (y) => y.option("print", {
1864
1864
  alias: "p",
1865
1865
  type: "string",
1866
- describe: "Non-interactive: send one prompt, print the reply, and exit (like `claude -p`). Reads the prompt from stdin if given no value. Runs under Node no Bun required."
1866
+ describe: "Non-interactive: send one prompt, print the reply, and exit (like `claude -p`). Reads the prompt from stdin if given no value. Runs under Node; no Bun required."
1867
1867
  }).option("agent", {
1868
1868
  type: "string",
1869
1869
  describe: "Target agent, by id, slug, or name. With -p, the agent to send the one-shot prompt to. Without -p, pre-selects the agent and opens its conversation list, skipping the agent picker. Optional when the account has exactly one agent."
@@ -1926,7 +1926,7 @@ const chatCommand = {
1926
1926
  sessionToken: auth.value.token,
1927
1927
  agentSelector: argv.agent ?? null
1928
1928
  });
1929
- const { runChat } = await import("./boot-DDtm3bc5.mjs");
1929
+ const { runChat } = await import("./boot-D1iX9oW1.mjs");
1930
1930
  await runChat({
1931
1931
  appUrl: auth.value.appUrl,
1932
1932
  sessionToken: auth.value.token,
@@ -1973,7 +1973,7 @@ async function ensureAgentWorkspace({ appUrl, sessionToken, agentSelector }) {
1973
1973
  });
1974
1974
  if (resolution.kind === "active") return;
1975
1975
  if (resolution.kind === "switched") {
1976
- console.error(`Switched workspace to ${resolution.workspace.name} (${resolution.workspace.slug}) ${resolution.agentName} lives there.`);
1976
+ console.error(`Switched workspace to ${resolution.workspace.name} (${resolution.workspace.slug}). ${resolution.agentName} lives there.`);
1977
1977
  return;
1978
1978
  }
1979
1979
  if (resolution.kind === "list-failed") {
@@ -1984,7 +1984,7 @@ async function ensureAgentWorkspace({ appUrl, sessionToken, agentSelector }) {
1984
1984
  printError(`Agent found in workspace ${resolution.workspace.name}, but switching to it failed: ${resolution.message}. Run \`skydive workspace switch ${resolution.workspace.slug}\` and retry.`);
1985
1985
  process.exit(1);
1986
1986
  }
1987
- printError(`No agent with id ${agentSelector} in any workspace on this account. It may belong to a different account run \`skydive auth login\` with the right one or the agent may have been archived.`);
1987
+ printError(`No agent with id ${agentSelector} in any workspace on this account. It may belong to a different account (run \`skydive auth login\` with the right one), or the agent may have been archived.`);
1988
1988
  process.exit(1);
1989
1989
  }
1990
1990
  async function runPrintMode({ argv, appUrl }) {
@@ -1993,7 +1993,7 @@ async function runPrintMode({ argv, appUrl }) {
1993
1993
  printError(`${auth.error.message} For non-interactive use, run \`skydive auth login\` first, or set SKYDIVE_API_KEY / SKYDIVE_SESSION_TOKEN.`);
1994
1994
  process.exit(1);
1995
1995
  }
1996
- const { runPrint, readStdin } = await import("./print-vUf9stcK.mjs");
1996
+ const { runPrint, readStdin } = await import("./print-LoJjA8FM.mjs");
1997
1997
  await ensureAgentWorkspace({
1998
1998
  appUrl,
1999
1999
  sessionToken: auth.value.token,
@@ -2018,7 +2018,7 @@ async function runPrintMode({ argv, appUrl }) {
2018
2018
  process.exit(1);
2019
2019
  }
2020
2020
  } else {
2021
- const { connectMachineShare } = await import("./print-share-DlO5RSBt.mjs");
2021
+ const { connectMachineShare } = await import("./print-share-DCmeJC5e.mjs");
2022
2022
  machineShare = await connectMachineShare({
2023
2023
  appUrl: auth.value.appUrl,
2024
2024
  sessionToken: auth.value.token,
@@ -2082,7 +2082,7 @@ const getCommand$1 = {
2082
2082
  printError(`${auth.error.message} Run \`skydive auth login\` first, or set SKYDIVE_API_KEY / SKYDIVE_SESSION_TOKEN.`);
2083
2083
  process.exit(1);
2084
2084
  }
2085
- const { messageGet } = await import("./print-vUf9stcK.mjs");
2085
+ const { messageGet } = await import("./print-LoJjA8FM.mjs");
2086
2086
  try {
2087
2087
  const result = await messageGet({
2088
2088
  appUrl: auth.value.appUrl,
@@ -2285,7 +2285,7 @@ const switchCommand = {
2285
2285
  printError("The workspace picker needs the Bun runtime and it could not be set up automatically. Pass a workspace slug instead, or install Bun and retry.");
2286
2286
  process.exit(1);
2287
2287
  }
2288
- const { runWorkspacePicker } = await import("./boot-DDtm3bc5.mjs");
2288
+ const { runWorkspacePicker } = await import("./boot-D1iX9oW1.mjs");
2289
2289
  await runWorkspacePicker(session);
2290
2290
  return;
2291
2291
  }
@@ -2375,7 +2375,7 @@ const openCommand = {
2375
2375
  resolveCwd: () => cwd,
2376
2376
  onState: (state) => {
2377
2377
  if (state.status === "connected") signalConnected();
2378
- const line = state.status === "error" ? `portal: connection error: ${state.error ?? "unknown"} retrying` : `portal: ${state.status}`;
2378
+ const line = state.status === "error" ? `portal: connection error: ${state.error ?? "unknown"}; retrying` : `portal: ${state.status}`;
2379
2379
  if (line === lastLine) return;
2380
2380
  lastLine = line;
2381
2381
  if (state.status === "error") console.error(line);
@@ -2394,7 +2394,7 @@ const openCommand = {
2394
2394
  await client.grantAgent(agent.id);
2395
2395
  console.log(`portal: granted ${agent.name} access to this machine (persists until revoked)`);
2396
2396
  }
2397
- console.log(`portal: open granted agents can run commands on ${machineName} as your user, cwd ${cwd}. ctrl+c to close.`);
2397
+ console.log(`portal: open. granted agents can run commands on ${machineName} as your user, cwd ${cwd}. ctrl+c to close.`);
2398
2398
  await new Promise(() => {});
2399
2399
  }
2400
2400
  };
@@ -2420,7 +2420,7 @@ const grantCommand = {
2420
2420
  });
2421
2421
  return;
2422
2422
  }
2423
- console.log(`Granted ${agent.name} access to ${device?.friendlyName ?? friendlyName}. The agent can run commands here whenever its portal is open start with \`skydive portal open\`, or pass \`--share-machine\` on a \`chat -p\` run. Revoke with \`skydive portal revoke --agent ${agent.name}\`.`);
2423
+ console.log(`Granted ${agent.name} access to ${device?.friendlyName ?? friendlyName}. The agent can run commands here whenever its portal is open. Start with \`skydive portal open\`, or pass \`--share-machine\` on a \`chat -p\` run. Revoke with \`skydive portal revoke --agent ${agent.name}\`.`);
2424
2424
  }
2425
2425
  };
2426
2426
  const revokeCommand = {
@@ -2429,7 +2429,7 @@ const revokeCommand = {
2429
2429
  builder: agentOption,
2430
2430
  handler: async (argv) => {
2431
2431
  const { session, agent, device } = await resolveGrantTarget(argv);
2432
- if (!device) throw new Error(`this machine (${machineIdentity().machineName}) isn't registered with the portal there's nothing to revoke.`);
2432
+ if (!device) throw new Error(`this machine (${machineIdentity().machineName}) isn't registered with the portal, so there's nothing to revoke.`);
2433
2433
  await revokePortalAccess(session, {
2434
2434
  deviceId: device.id,
2435
2435
  agentId: agent.id
@@ -2637,7 +2637,7 @@ const sandboxCommand = {
2637
2637
  handler: async (argv) => {
2638
2638
  const session = requireSession(argv);
2639
2639
  const { createRestClient } = await import("./rest-DfpoRJ_Q.mjs");
2640
- const { resolveAgent } = await import("./print-vUf9stcK.mjs");
2640
+ const { resolveAgent } = await import("./print-LoJjA8FM.mjs");
2641
2641
  const client = createRestClient({
2642
2642
  appUrl: session.appUrl,
2643
2643
  sessionToken: session.sessionToken
@@ -2946,7 +2946,7 @@ async function downloadAndVerify(opts) {
2946
2946
  const bytes = new Uint8Array(await response.arrayBuffer());
2947
2947
  if (bytes.byteLength === 0) throw new UpdateError(`download from ${url} was empty`);
2948
2948
  const actual = sha256Hex(bytes);
2949
- if (actual !== opts.expectedSha256) throw new UpdateError(`sha256 mismatch (expected ${opts.expectedSha256}, got ${actual}) the download may be corrupt; re-run \`skydive update\``);
2949
+ if (actual !== opts.expectedSha256) throw new UpdateError(`sha256 mismatch (expected ${opts.expectedSha256}, got ${actual}). the download may be corrupt; re-run \`skydive update\``);
2950
2950
  return bytes;
2951
2951
  }
2952
2952
  /**
@@ -3321,7 +3321,7 @@ const updateCommand = {
3321
3321
  });
3322
3322
  return;
3323
3323
  }
3324
- throw new UpdateError(source === "binary" ? `couldn't reach the ${channel} release channel check your connection and try again.` : `couldn't reach the npm registry to look up the ${channel} release check your connection and try again.`);
3324
+ throw new UpdateError(source === "binary" ? `couldn't reach the ${channel} release channel; check your connection and try again.` : `couldn't reach the npm registry to look up the ${channel} release; check your connection and try again.`);
3325
3325
  }
3326
3326
  const plan = planUpdate({
3327
3327
  currentVersion,
@@ -3376,7 +3376,7 @@ const updateCommand = {
3376
3376
  return;
3377
3377
  }
3378
3378
  const selfPath = resolveSelfPath();
3379
- if (!selfPath) throw new UpdateError("couldn't determine this binary's path to replace it reinstall with the install script instead.");
3379
+ if (!selfPath) throw new UpdateError("couldn't determine this binary's path to replace it; reinstall with the install script instead.");
3380
3380
  console.log(describePlan(plan, channel, false));
3381
3381
  await applyBinary(selfPath, await downloadAndVerify({
3382
3382
  downloadBaseUrl: RELEASE_CDN_URL,
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { D as setActiveWorkspace, E as listWorkspaces, S as themesForMode, _ as themeForMode, a as installCrashHandler, b as themeVersion, c as MARK_CELLS, d as DEFAULT_THEME_ID, f as applyTheme, g as theme, h as noColorRequested, i as writeArtifact, l as WORDMARK, m as monoTheme, n as profilingEnabled, o as buildCrashReport, p as findTheme, r as record, s as writeCrashReport, v as themeMode, w as getActiveWorkspaceId, y as themeModeFromColorFgBg } from "./profiler-DORuJUS8.mjs";
3
- import { B as saveTheme, D as getSavedTheme, E as getReviewStateDir, L as resolveWebUrl, S as getConfigPath, c as cardActionErrorMessage, d as reconcileMaskedInput, f as resolveConnectUrl, i as resolveAgent, l as parseExternalOauthConnectParams, m as specKeyFor, p as parseConnectCard, s as MASK_CHAR, u as parseOauthConnectParams, v as DEFAULT_API_URL, y as DEFAULT_APP_URL } from "./print-CiaU2ygh.mjs";
2
+ import { D as setActiveWorkspace, E as listWorkspaces, S as themesForMode, _ as themeForMode, a as installCrashHandler, b as themeVersion, c as MARK_CELLS, d as DEFAULT_THEME_ID, f as applyTheme, g as theme, h as noColorRequested, i as writeArtifact, l as WORDMARK, m as monoTheme, n as profilingEnabled, o as buildCrashReport, p as findTheme, r as record, s as writeCrashReport, v as themeMode, w as getActiveWorkspaceId, y as themeModeFromColorFgBg } from "./profiler-C-hbIwXv.mjs";
3
+ import { B as saveTheme, D as getSavedTheme, E as getReviewStateDir, L as resolveWebUrl, S as getConfigPath, c as cardActionErrorMessage, d as reconcileMaskedInput, f as resolveConnectUrl, i as resolveAgent, l as parseExternalOauthConnectParams, m as specKeyFor, p as parseConnectCard, s as MASK_CHAR, u as parseOauthConnectParams, v as DEFAULT_API_URL, y as DEFAULT_APP_URL } from "./print-CswnhVUN.mjs";
4
4
  import { a as errorMessage, i as sendErrorMessage, n as createRestClient, o as isRecord, r as errorDetail, t as HttpError } from "./rest-CG7VpQ56.mjs";
5
5
  import { i as billingBlockedOutcomeFromSendResponse } from "./billing-blocked-CwfG1BTR.mjs";
6
6
  import { t as PortalClient } from "./client-DiaJZQG6.mjs";
@@ -168,7 +168,7 @@ const useStore = create((set, get) => ({
168
168
  async function resolveInitialScreen({ rest, agentSelector, conversationId, newConversation }) {
169
169
  if (conversationId) {
170
170
  const [conversation, agents] = await Promise.all([rest.getConversation({ conversationId }).catch((err) => {
171
- if (err instanceof HttpError && err.status === 404) throw new Error(`No conversation with id ${conversationId} it may have been deleted, or belong to another workspace.`);
171
+ if (err instanceof HttpError && err.status === 404) throw new Error(`No conversation with id ${conversationId}. It may have been deleted, or belong to another workspace.`);
172
172
  throw err;
173
173
  }), rest.listAgents({
174
174
  scope: "org",
@@ -5308,13 +5308,14 @@ const MAX_PR_CHIPS = 3;
5308
5308
  *
5309
5309
  * Caps at {@link MAX_PR_CHIPS} shown; any beyond that collapse into a trailing
5310
5310
  * `+N` so the footer row can't be flooded by a run that links many PRs. Shows
5311
- * the most recent (last-seen) PRs, since those are what's in play.
5311
+ * the most recent (last-seen) PRs, since those are what's in play, and renders
5312
+ * them newest-first (reverse chronological) so the freshest PR leads the chip.
5312
5313
  */
5313
5314
  function prLinksStyledText(prs) {
5314
5315
  const dot = fg(theme.dim ?? "#565f89");
5315
5316
  const label = fg(theme.muted ?? "#7a7a7a");
5316
5317
  const accent = fg(theme.accent ?? "#7aa2f7");
5317
- const shown = prs.slice(-MAX_PR_CHIPS);
5318
+ const shown = prs.slice(-MAX_PR_CHIPS).reverse();
5318
5319
  const overflow = prs.length - shown.length;
5319
5320
  const chunks = [dot("· "), label("PR ")];
5320
5321
  shown.forEach((pr, i) => {
@@ -5376,7 +5377,7 @@ function useCompaction({ rest, conversationId }) {
5376
5377
  }, [armIndicator, clearTimer]);
5377
5378
  const compactConversation = useCallback(() => {
5378
5379
  if (!rest || !conversationId) {
5379
- useStore.getState().showToast({ message: "nothing to compact yet send a message first" });
5380
+ useStore.getState().showToast({ message: "nothing to compact yet; send a message first" });
5380
5381
  return;
5381
5382
  }
5382
5383
  armIndicator();
@@ -5433,7 +5434,7 @@ function formatStatusInfo({ appUrl, workspaceName, agentName, conversationId, mo
5433
5434
  ["app", appUrl ?? "unknown"],
5434
5435
  ["workspace", workspaceName ?? "unknown"],
5435
5436
  ["agent", agentName],
5436
- ["conversation", conversationId ?? "new created when you send the first message"],
5437
+ ["conversation", conversationId ?? "new (created when you send the first message)"],
5437
5438
  ["model", model ?? "default"],
5438
5439
  ["local access", formatShare(share)]
5439
5440
  ];
@@ -5441,9 +5442,9 @@ function formatStatusInfo({ appUrl, workspaceName, agentName, conversationId, mo
5441
5442
  return rows.map(([label, value]) => `${label.padEnd(width)} ${value}`).join("\n");
5442
5443
  }
5443
5444
  function formatShare(share) {
5444
- if (share.status === "off") return "off ctrl+t to share this machine";
5445
+ if (share.status === "off") return "off (ctrl+t to share this machine)";
5445
5446
  if (share.status !== "connected") return share.status;
5446
- return share.grantedToAgent ? "shared this agent can run commands here" : "shared this agent is not granted";
5447
+ return share.grantedToAgent ? "shared (this agent can run commands here)" : "shared (this agent is not granted)";
5447
5448
  }
5448
5449
 
5449
5450
  //#endregion
@@ -6160,7 +6161,7 @@ function HelpModal({ onClose }) {
6160
6161
  children: [
6161
6162
  "… ",
6162
6163
  hidden,
6163
- " more search to narrow down"
6164
+ " more (search to narrow down)"
6164
6165
  ]
6165
6166
  }) : null]
6166
6167
  }),
@@ -6205,7 +6206,7 @@ function CompletionMenu({ items, highlight }) {
6205
6206
  },
6206
6207
  children: windowed.length === 0 ? /* @__PURE__ */ jsx("text", {
6207
6208
  fg: theme.muted,
6208
- children: "no matching command ↵ sends as a message"
6209
+ children: "no matching command (↵ sends as a message)"
6209
6210
  }) : windowed.map((item, i) => {
6210
6211
  const selected = start + i === highlight;
6211
6212
  return /* @__PURE__ */ jsxs("text", {
@@ -6672,7 +6673,7 @@ function FilterableModelList({ models, currentModel, modelLocked, agentId, onSel
6672
6673
  }),
6673
6674
  modelLocked ? /* @__PURE__ */ jsx("text", {
6674
6675
  fg: theme.warning,
6675
- children: "this agent is locked to a Google-compliant model changes will be rejected. disconnect Google to switch freely."
6676
+ children: "this agent is locked to a Google-compliant model; changes will be rejected. disconnect Google to switch freely."
6676
6677
  }) : null,
6677
6678
  /* @__PURE__ */ jsxs("box", {
6678
6679
  style: {
@@ -6813,7 +6814,7 @@ function ThemePreview() {
6813
6814
  /* @__PURE__ */ jsx("text", { children: " " }),
6814
6815
  /* @__PURE__ */ jsx("markdown", {
6815
6816
  content: [
6816
- "Wrapped it in exponential backoff three attempts, then it",
6817
+ "Wrapped it in exponential backoff: three attempts, then it",
6817
6818
  "throws the last error:",
6818
6819
  "",
6819
6820
  "```typescript",
@@ -6949,7 +6950,7 @@ function ThemePicker({ onClose }) {
6949
6950
  },
6950
6951
  children: /* @__PURE__ */ jsx("text", {
6951
6952
  fg: theme.muted,
6952
- children: "theme is pinned (NO_COLOR, --theme, or SKYDIVE_THEME) unset it to pick interactively."
6953
+ children: "theme is pinned (NO_COLOR, --theme, or SKYDIVE_THEME). unset it to pick interactively."
6953
6954
  })
6954
6955
  }),
6955
6956
  /* @__PURE__ */ jsx("text", {
@@ -6993,7 +6994,7 @@ function ThemePicker({ onClose }) {
6993
6994
  }),
6994
6995
  /* @__PURE__ */ jsxs("text", {
6995
6996
  fg: theme.muted,
6996
- children: [themeMode, " themes following the terminal background"]
6997
+ children: [themeMode, " themes (following the terminal background)"]
6997
6998
  }),
6998
6999
  placement === "right" ? /* @__PURE__ */ jsxs("box", {
6999
7000
  style: {
@@ -8711,7 +8712,7 @@ function ReviewPane({ agentId, conversationId, items, viewportWidth, viewportHei
8711
8712
  if (ok) {
8712
8713
  persist([]);
8713
8714
  setStatus("copied to clipboard");
8714
- } else setStatus("clipboard unavailable comments kept");
8715
+ } else setStatus("clipboard unavailable; comments kept");
8715
8716
  });
8716
8717
  return;
8717
8718
  }
@@ -10063,12 +10064,12 @@ function ChatScreen({ agent, conversation }) {
10063
10064
  if (autoGrantMachine && portalClient && portalStatus === "connected" && !portalClient.isGranted(agent.id)) try {
10064
10065
  await portalClient.grantAgent(agent.id);
10065
10066
  useStore.getState().showToast({
10066
- message: `Shared this machine with ${agent.name} for the import. The grant persists revoke anytime: skydive portal revoke --agent ${agent.name}`,
10067
+ message: `Shared this machine with ${agent.name} for the import. The grant persists. Revoke anytime: skydive portal revoke --agent ${agent.name}`,
10067
10068
  durationMs: 1e4
10068
10069
  });
10069
10070
  } catch (err) {
10070
10071
  useStore.getState().showToast({
10071
- message: `Couldn't grant machine access automatically (${errorMessage(err)}) the agent will ask in chat instead.`,
10072
+ message: `Couldn't grant machine access automatically (${errorMessage(err)}). The agent will ask in chat instead.`,
10072
10073
  variant: "warning"
10073
10074
  });
10074
10075
  }
@@ -10408,7 +10409,7 @@ function ChatScreen({ agent, conversation }) {
10408
10409
  setItems((prev) => [...prev, {
10409
10410
  kind: "error",
10410
10411
  id: crypto.randomUUID(),
10411
- text: `attachment limit reached (${maxAttachments}) ${fileName} skipped`
10412
+ text: `attachment limit reached (${maxAttachments}); ${fileName} skipped`
10412
10413
  }]);
10413
10414
  return;
10414
10415
  }
@@ -10534,7 +10535,7 @@ function ChatScreen({ agent, conversation }) {
10534
10535
  const openInBrowser = useCallback(() => {
10535
10536
  if (!appUrl) return;
10536
10537
  if (!conversationId) {
10537
- useStore.getState().showToast({ message: "no web page yet send a message to start the conversation" });
10538
+ useStore.getState().showToast({ message: "no web page yet; send a message to start the conversation" });
10538
10539
  return;
10539
10540
  }
10540
10541
  const url = `${resolveWebUrl(appUrl)}/c/${encodeURIComponent(conversationId)}`;
@@ -10544,7 +10545,7 @@ function ChatScreen({ agent, conversation }) {
10544
10545
  })).catch((err) => setItems((prev) => [...prev, {
10545
10546
  kind: "error",
10546
10547
  id: crypto.randomUUID(),
10547
- text: `couldn't open a browser visit ${url} (${errorMessage(err)})`
10548
+ text: `couldn't open a browser; visit ${url} (${errorMessage(err)})`
10548
10549
  }]));
10549
10550
  }, [appUrl, conversationId]);
10550
10551
  const forkAndContinue = useCallback(() => {
@@ -10590,7 +10591,7 @@ function ChatScreen({ agent, conversation }) {
10590
10591
  return;
10591
10592
  }
10592
10593
  if (!conversationId) {
10593
- useStore.getState().showToast({ message: "nothing to archive yet send a message to start this one" });
10594
+ useStore.getState().showToast({ message: "nothing to archive yet; send a message to start this one" });
10594
10595
  return;
10595
10596
  }
10596
10597
  if (!rest) return;
@@ -10600,7 +10601,7 @@ function ChatScreen({ agent, conversation }) {
10600
10601
  }).then(() => {
10601
10602
  useStore.getState().showToast({
10602
10603
  variant: "success",
10603
- message: "archived shift+tab in the picker shows it, ctrl+a restores"
10604
+ message: "archived (shift+tab in the picker shows it, ctrl+a restores)"
10604
10605
  });
10605
10606
  goTo({
10606
10607
  kind: "conversation-picker",
@@ -10608,7 +10609,7 @@ function ChatScreen({ agent, conversation }) {
10608
10609
  });
10609
10610
  }).catch((err) => useStore.getState().showToast({
10610
10611
  variant: "error",
10611
- message: err instanceof HttpError && err.status === 404 ? "can't archive this one it's already gone from your list" : `couldn't archive: ${errorMessage(err)}`
10612
+ message: err instanceof HttpError && err.status === 404 ? "can't archive this one; it's already gone from your list" : `couldn't archive: ${errorMessage(err)}`
10612
10613
  }));
10613
10614
  }, [
10614
10615
  grantPrompt,
@@ -10632,7 +10633,7 @@ function ChatScreen({ agent, conversation }) {
10632
10633
  return;
10633
10634
  }
10634
10635
  if (!conversationId) {
10635
- useStore.getState().showToast({ message: "nothing to rename yet send a message to start this one" });
10636
+ useStore.getState().showToast({ message: "nothing to rename yet; send a message to start this one" });
10636
10637
  return;
10637
10638
  }
10638
10639
  if (!rest) return;
@@ -10661,7 +10662,7 @@ function ChatScreen({ agent, conversation }) {
10661
10662
  const leaveForScreen = useCallback((next) => {
10662
10663
  const current = runRef.current;
10663
10664
  if (current.kind === "streaming") current.abort.abort();
10664
- if (current.kind !== "idle") useStore.getState().showToast({ message: `${agent.name} keeps working reopen to reattach` });
10665
+ if (current.kind !== "idle") useStore.getState().showToast({ message: `${agent.name} keeps working; reopen to reattach` });
10665
10666
  goTo(next);
10666
10667
  }, [agent.name, goTo]);
10667
10668
  /**
@@ -10680,7 +10681,7 @@ function ChatScreen({ agent, conversation }) {
10680
10681
  setItems((prev) => [...prev, {
10681
10682
  kind: "error",
10682
10683
  id: crypto.randomUUID(),
10683
- text: `not a conversation id: ${ref} pass an id, its /c/<id> link, or run /conversation on its own to pick from the list`
10684
+ text: `not a conversation id: ${ref}. pass an id, its /c/<id> link, or run /conversation on its own to pick from the list`
10684
10685
  }]);
10685
10686
  return;
10686
10687
  }
@@ -10710,7 +10711,7 @@ function ChatScreen({ agent, conversation }) {
10710
10711
  ]);
10711
10712
  const toggleShare = useCallback(() => {
10712
10713
  if (!portalClient) {
10713
- useStore.getState().showToast({ message: useStore.getState().authKind === "api-key" ? "local access needs a browser session run `skydive auth login --web`" : "local access is unavailable in this session" });
10714
+ useStore.getState().showToast({ message: useStore.getState().authKind === "api-key" ? "local access needs a browser session; run `skydive auth login --web`" : "local access is unavailable in this session" });
10714
10715
  return;
10715
10716
  }
10716
10717
  if (portal.status === "off") {
@@ -10753,7 +10754,7 @@ function ChatScreen({ agent, conversation }) {
10753
10754
  }, [agent.id, setPortalPrompt]);
10754
10755
  const openPortalAccess = useCallback(() => {
10755
10756
  if (!portalClient) {
10756
- useStore.getState().showToast({ message: useStore.getState().authKind === "api-key" ? "local access needs a browser session run `skydive auth login --web`" : "local access is unavailable in this session" });
10757
+ useStore.getState().showToast({ message: useStore.getState().authKind === "api-key" ? "local access needs a browser session; run `skydive auth login --web`" : "local access is unavailable in this session" });
10757
10758
  return;
10758
10759
  }
10759
10760
  switch (portal.status) {
@@ -10842,7 +10843,7 @@ function ChatScreen({ agent, conversation }) {
10842
10843
  break;
10843
10844
  }
10844
10845
  if (!conversationId) {
10845
- useStore.getState().showToast({ message: "nothing to fork yet send a message first" });
10846
+ useStore.getState().showToast({ message: "nothing to fork yet; send a message first" });
10846
10847
  break;
10847
10848
  }
10848
10849
  forkAndContinue();
@@ -11173,7 +11174,7 @@ function ChatScreen({ agent, conversation }) {
11173
11174
  if (runRef.current.kind === "streaming") {
11174
11175
  if (cancelLatestSteer()) return;
11175
11176
  runRef.current.abort.abort();
11176
- useStore.getState().showToast({ message: `${agent.name} keeps working reopen to reattach` });
11177
+ useStore.getState().showToast({ message: `${agent.name} keeps working; reopen to reattach` });
11177
11178
  goTo({
11178
11179
  kind: "conversation-picker",
11179
11180
  agent
@@ -573,7 +573,7 @@ async function runPrint({ appUrl, sessionToken, prompt, agentSelector, conversat
573
573
  if (machineShare) {
574
574
  if (!machineShare.isGranted(agent.id) && grantTargetAgent) await machineShare.grantAgent(agent.id);
575
575
  if (machineShare.isGranted(agent.id)) console.error(`portal: shared this machine with ${agent.name} for this run (grant persists until revoked)`);
576
- else console.error(`portal: this machine is shared (shareMachineDefault), but ${agent.name} has no grant approve its request, or run \`skydive portal grant --agent ${agent.name}\`.`);
576
+ else console.error(`portal: this machine is shared (shareMachineDefault), but ${agent.name} has no grant. Approve its request, or run \`skydive portal grant --agent ${agent.name}\`.`);
577
577
  }
578
578
  let send;
579
579
  try {
@@ -737,7 +737,7 @@ function resolveAgent(agents, selector) {
737
737
  const [only, ...rest] = agents;
738
738
  if (!only) throw new Error("No agents on this account.");
739
739
  if (rest.length === 0) return only;
740
- throw new Error(`Multiple agents on this account pass --agent <id|slug|name>. Candidates:\n${formatCandidates(agents)}`);
740
+ throw new Error(`Multiple agents on this account. Pass --agent <id|slug|name>. Candidates:\n${formatCandidates(agents)}`);
741
741
  }
742
742
  const byId = agents.find((a) => a.id === selector);
743
743
  if (byId) return byId;
@@ -745,7 +745,7 @@ function resolveAgent(agents, selector) {
745
745
  const matches = agents.filter((a) => a.slug && a.slug.toLowerCase() === needle || a.name.toLowerCase() === needle);
746
746
  const [firstMatch, ...restMatches] = matches;
747
747
  if (firstMatch && restMatches.length === 0) return firstMatch;
748
- if (restMatches.length > 0) throw new Error(`Multiple agents match "${selector}" pass the id instead. Candidates:\n${formatCandidates(matches)}`);
748
+ if (restMatches.length > 0) throw new Error(`Multiple agents match "${selector}". Pass the id instead. Candidates:\n${formatCandidates(matches)}`);
749
749
  throw new Error(`No agent matches "${selector}". Candidates:\n${formatCandidates(agents)}`);
750
750
  }
751
751
  function formatCandidates(agents) {
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { a as runPrint, i as resolveAgent, n as messageGet, o as toPrintError, r as readStdin, t as collectRunText } from "./print-CiaU2ygh.mjs";
2
+ import { a as runPrint, i as resolveAgent, n as messageGet, o as toPrintError, r as readStdin, t as collectRunText } from "./print-CswnhVUN.mjs";
3
3
  import "./rest-CG7VpQ56.mjs";
4
4
  import "./billing-blocked-CwfG1BTR.mjs";
5
5
 
@@ -25,13 +25,13 @@ async function connectMachineShare({ appUrl, sessionToken, timeoutHint }) {
25
25
  resolveCwd: () => process.cwd(),
26
26
  onState: (state) => {
27
27
  if (state.status === "connected") signalConnected();
28
- if (state.status === "error") console.error(`portal: connection error: ${state.error ?? "unknown"} retrying`);
28
+ if (state.status === "error") console.error(`portal: connection error: ${state.error ?? "unknown"}; retrying`);
29
29
  }
30
30
  });
31
31
  machineShare.enable();
32
32
  if (await Promise.race([connected.then(() => false), new Promise((resolve) => setTimeout(() => resolve(true), 3e4).unref())])) {
33
33
  machineShare.dispose();
34
- printError(`Could not connect the portal within 30s machine sharing is unavailable (network, or the portal kill switch is off). ${timeoutHint ?? "Check `skydive portal status`."}`);
34
+ printError(`Could not connect the portal within 30s. Machine sharing is unavailable (network, or the portal kill switch is off). ${timeoutHint ?? "Check `skydive portal status`."}`);
35
35
  process.exit(1);
36
36
  }
37
37
  return machineShare;
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { S as getConfigPath } from "./print-CiaU2ygh.mjs";
2
+ import { S as getConfigPath } from "./print-CswnhVUN.mjs";
3
3
  import os from "node:os";
4
4
  import path from "node:path";
5
5
  import { err, ok } from "neverthrow";
@@ -8,7 +8,7 @@ import fs from "node:fs";
8
8
 
9
9
  //#region package.json
10
10
  var name = "skydive-cli";
11
- var version$1 = "0.4.0-beta.1112";
11
+ var version$1 = "0.4.0-beta.1141";
12
12
 
13
13
  //#endregion
14
14
  //#region src/auth/organization.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skydive-cli",
3
- "version": "0.4.0-beta.1112",
3
+ "version": "0.4.0-beta.1141",
4
4
  "description": "Skydive CLI — cloud agents from the command line",
5
5
  "homepage": "https://skydive.com",
6
6
  "license": "MIT",