skydive-cli 0.6.0-beta.43 → 0.6.0-beta.44

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,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
- import { c as version, s as name, t as createRestClient } from "./rest-sPrMWI3O.mjs";
3
- import { A as getPreference, B as resolveChatAuth, C as DEFAULT_API_URL, D as getConfigPath, E as deleteConfig, F as getStoredApiKeyId, G as saveConfig, H as resolveManagementAuth, I as getStoredApiKeyWorkspaceName, J as setLastSeenVersion, K as saveSession, L as getUpdateCheckDisabled, O as getDefaultAgent, P as getShareMachineDefault, S as API_KEY_PREFIX, T as PREFERENCES, U as resolveSession$1, V as resolveConfig, b as API_KEYS_URL, i as resolveAgent$1, j as getPromptHistoryPath, k as getLastSeenVersion, x as API_KEY_FAMILY_PREFIX, z as resolveAppUrl } from "./print-BCmiE-GH.mjs";
4
- import { A as installAgentAlias, B as resolveWorkspaceId, D as machineOsFromPlatform, E as buildImportSeedPrompt, F as detectShell, I as ensureActiveOrganization, L as getActiveWorkspaceId, M as takenAliasNames, N as SUPPORTED_SHELLS, O as aliasActivationHint, P as defaultInstallEnv, R as getSessionIdentity, V as setActiveWorkspace, c as getAutomaticLogsDir, j as slugifyAliasName, k as dedupeAliasName, l as maybeStartProfiling, o as brandHelpArt, t as installCrashHandler, u as profileDir, w as themes, z as listWorkspaces } from "./install-cFvM8rL1.mjs";
2
+ import { c as version, s as name, t as createRestClient } from "./rest-DapRUHYJ.mjs";
3
+ import { A as getPreference, B as resolveChatAuth, C as DEFAULT_API_URL, D as getConfigPath, E as deleteConfig, F as getStoredApiKeyId, G as saveConfig, H as resolveManagementAuth, I as getStoredApiKeyWorkspaceName, J as setLastSeenVersion, K as saveSession, L as getUpdateCheckDisabled, O as getDefaultAgent, P as getShareMachineDefault, S as API_KEY_PREFIX, T as PREFERENCES, U as resolveSession$1, V as resolveConfig, b as API_KEYS_URL, i as resolveAgent$1, j as getPromptHistoryPath, k as getLastSeenVersion, x as API_KEY_FAMILY_PREFIX, z as resolveAppUrl } from "./print-357wbbEE.mjs";
4
+ import { A as installAgentAlias, B as resolveWorkspaceId, D as machineOsFromPlatform, E as buildImportSeedPrompt, F as detectShell, I as ensureActiveOrganization, L as getActiveWorkspaceId, M as takenAliasNames, N as SUPPORTED_SHELLS, O as aliasActivationHint, P as defaultInstallEnv, R as getSessionIdentity, V as setActiveWorkspace, c as getAutomaticLogsDir, j as slugifyAliasName, k as dedupeAliasName, l as maybeStartProfiling, o as brandHelpArt, t as installCrashHandler, u as profileDir, w as themes, z as listWorkspaces } from "./install-DLTphokL.mjs";
5
5
  import { n as printError, r as printTable, t as output } from "./output-C9mb3sUB.mjs";
6
6
  import { t as HttpError } from "./http-error-BF2NZZE3.mjs";
7
7
  import "./billing-blocked-D3l5kJlX.mjs";
8
- import { s as resolveMachineIdentity } from "./client-B1MsnBwh.mjs";
8
+ import { s as resolveMachineIdentity } from "./client-D0RqJE_-.mjs";
9
9
  import "./tls-cert-Rua2oV7n.mjs";
10
10
  import { i as grantPortalAccess, n as fetchPortalDevices, o as registerPortalDevice, r as findThisDevice, s as revokePortalAccess } from "./api-BFQ4PQDA.mjs";
11
- import { d as daemonPaths, i as queryDaemonStatus, n as ensureDaemonRunning, s as stopDaemon, u as PORTAL_DAEMON_FLAG } from "./daemon-BusoaIlg.mjs";
11
+ import { d as daemonPaths, i as queryDaemonStatus, n as ensureDaemonRunning, s as stopDaemon, u as PORTAL_DAEMON_FLAG } from "./daemon-CaPq7nD7.mjs";
12
12
  import { a as encodeFsRequest, i as decodeFsResponse, n as SANDBOX_STREAM_PATH, r as streamSpecToQuery, t as SandboxStream } from "./client-CFnT0cAy.mjs";
13
13
  import { hideBin } from "yargs/helpers";
14
14
  import yargs from "yargs";
@@ -1080,7 +1080,7 @@ async function resolveTargetAgentId(client, selector) {
1080
1080
  printError("Missing --agent <id or name>. Run `skydive agents list` for candidates.");
1081
1081
  process.exit(1);
1082
1082
  }
1083
- const { resolveAgent } = await import("./print-BxegZyen.mjs");
1083
+ const { resolveAgent } = await import("./print-B-NaRUOR.mjs");
1084
1084
  const result = await client.listAgents({
1085
1085
  scope: "org",
1086
1086
  limit: 100
@@ -1823,7 +1823,7 @@ const importCommand = {
1823
1823
  process.exit(1);
1824
1824
  }
1825
1825
  }
1826
- const { runChat } = await import("./boot-BYfedmQF.mjs");
1826
+ const { runChat } = await import("./boot-D-sj-qcz.mjs");
1827
1827
  await runChat({
1828
1828
  appUrl,
1829
1829
  sessionToken: session.value.sessionToken,
@@ -1853,7 +1853,7 @@ async function runImportPrintMode({ argv, appUrl }) {
1853
1853
  printError(`${session.error.message} For non-interactive use, run \`skydive auth login --web\` first, or set SKYDIVE_SESSION_TOKEN.`);
1854
1854
  process.exit(1);
1855
1855
  }
1856
- const { connectMachineShare } = await import("./print-share-BFXM-F1d.mjs");
1856
+ const { connectMachineShare } = await import("./print-share-0lItV44A.mjs");
1857
1857
  const machineShare = await connectMachineShare({
1858
1858
  appUrl,
1859
1859
  sessionToken: session.value.sessionToken,
@@ -1861,7 +1861,7 @@ async function runImportPrintMode({ argv, appUrl }) {
1861
1861
  });
1862
1862
  const extra = (argv.print ?? "").trim();
1863
1863
  const prompt = buildImportSeedPrompt(process.cwd(), machineOsFromPlatform(process.platform)) + (extra ? `\n\nAdditional instructions: ${extra}` : "");
1864
- const { runPrint } = await import("./print-BxegZyen.mjs");
1864
+ const { runPrint } = await import("./print-B-NaRUOR.mjs");
1865
1865
  try {
1866
1866
  const result = await runPrint({
1867
1867
  appUrl,
@@ -2284,7 +2284,7 @@ const chatCommand = {
2284
2284
  sessionToken: auth.value.token,
2285
2285
  agentSelector: argv.agent ?? null
2286
2286
  });
2287
- const { runChat } = await import("./boot-BYfedmQF.mjs");
2287
+ const { runChat } = await import("./boot-D-sj-qcz.mjs");
2288
2288
  await runChat({
2289
2289
  appUrl: auth.value.appUrl,
2290
2290
  sessionToken: auth.value.token,
@@ -2368,7 +2368,7 @@ async function runPrintMode({ argv, appUrl }) {
2368
2368
  printError(`${auth.error.message} For non-interactive use, run \`skydive auth login\` first, or set SKYDIVE_API_KEY / SKYDIVE_SESSION_TOKEN.`);
2369
2369
  process.exit(1);
2370
2370
  }
2371
- const { runPrint, readStdin } = await import("./print-BxegZyen.mjs");
2371
+ const { runPrint, readStdin } = await import("./print-B-NaRUOR.mjs");
2372
2372
  const workspaceId = await resolveWorkspaceFlag({
2373
2373
  appUrl,
2374
2374
  sessionToken: auth.value.token,
@@ -2398,7 +2398,7 @@ async function runPrintMode({ argv, appUrl }) {
2398
2398
  process.exit(1);
2399
2399
  }
2400
2400
  } else {
2401
- const { connectMachineShare } = await import("./print-share-BFXM-F1d.mjs");
2401
+ const { connectMachineShare } = await import("./print-share-0lItV44A.mjs");
2402
2402
  machineShare = await connectMachineShare({
2403
2403
  appUrl: auth.value.appUrl,
2404
2404
  sessionToken: auth.value.token,
@@ -2463,7 +2463,7 @@ const getCommand$1 = {
2463
2463
  printError(`${auth.error.message} Run \`skydive auth login\` first, or set SKYDIVE_API_KEY / SKYDIVE_SESSION_TOKEN.`);
2464
2464
  process.exit(1);
2465
2465
  }
2466
- const { messageGet } = await import("./print-BxegZyen.mjs");
2466
+ const { messageGet } = await import("./print-B-NaRUOR.mjs");
2467
2467
  try {
2468
2468
  const result = await messageGet({
2469
2469
  appUrl: auth.value.appUrl,
@@ -2666,7 +2666,7 @@ const switchCommand = {
2666
2666
  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.");
2667
2667
  process.exit(1);
2668
2668
  }
2669
- const { runWorkspacePicker } = await import("./boot-BYfedmQF.mjs");
2669
+ const { runWorkspacePicker } = await import("./boot-D-sj-qcz.mjs");
2670
2670
  await runWorkspacePicker(session);
2671
2671
  return;
2672
2672
  }
@@ -2745,7 +2745,7 @@ const openCommand = {
2745
2745
  const agent = argv.agent ? resolveAgent$1((await fetchPortalDevices(session)).agents, argv.agent) : null;
2746
2746
  const cwd = argv.cwd ? path.resolve(argv.cwd) : process.cwd();
2747
2747
  const { machineName } = await resolveMachineIdentity(null);
2748
- const { PortalDaemonClient } = await import("./daemon-client-4mwquWFX.mjs");
2748
+ const { PortalDaemonClient } = await import("./daemon-client-fmh2MKfy.mjs");
2749
2749
  let lastLine = "";
2750
2750
  let signalConnected;
2751
2751
  const connected = new Promise((resolve) => {
@@ -3105,8 +3105,8 @@ const sandboxCommand = {
3105
3105
  }).example("skydive sandbox --agent grace", "Live terminal (Ctrl-] detaches)").example("skydive sandbox --agent grace -- tail -n 50 /tmp/harness.log", "One-shot command (use `--` so its flags reach the sandbox)").example("skydive sandbox --agent grace -- sh -c 'ls /tmp | wc -l'", "Shell features go through an explicit `sh -c`"),
3106
3106
  handler: async (argv) => {
3107
3107
  const session = requireSession(argv);
3108
- const { createRestClient } = await import("./rest-DhI-ZkM8.mjs");
3109
- const { resolveAgent } = await import("./print-BxegZyen.mjs");
3108
+ const { createRestClient } = await import("./rest-BzBSObm9.mjs");
3109
+ const { resolveAgent } = await import("./print-B-NaRUOR.mjs");
3110
3110
  const client = createRestClient({
3111
3111
  appUrl: session.appUrl,
3112
3112
  sessionToken: session.sessionToken
@@ -3423,8 +3423,8 @@ const fsEditCommand = {
3423
3423
  handler: async (argv) => {
3424
3424
  const session = requireSession(argv);
3425
3425
  const remotePath = argv.path;
3426
- const { createRestClient } = await import("./rest-DhI-ZkM8.mjs");
3427
- const { resolveAgent } = await import("./print-BxegZyen.mjs");
3426
+ const { createRestClient } = await import("./rest-BzBSObm9.mjs");
3427
+ const { resolveAgent } = await import("./print-B-NaRUOR.mjs");
3428
3428
  const client = createRestClient({
3429
3429
  appUrl: session.appUrl,
3430
3430
  sessionToken: session.sessionToken
@@ -4878,7 +4878,7 @@ if (process.argv.includes(UPDATE_WORKER_FLAG)) {
4878
4878
  process.exit(0);
4879
4879
  }
4880
4880
  if (process.argv.includes(PORTAL_DAEMON_FLAG)) {
4881
- const { runPortalDaemon } = await import("./daemon-D_R0Y1mm.mjs");
4881
+ const { runPortalDaemon } = await import("./daemon-BQBdP8BA.mjs");
4882
4882
  runPortalDaemon(process.argv);
4883
4883
  } else runCli();
4884
4884
  function runCli() {
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
- import { a as errorMessage, i as sendErrorMessage, n as errorDetail, o as isRecord, t as createRestClient } from "./rest-sPrMWI3O.mjs";
3
- import { C as DEFAULT_API_URL, D as getConfigPath, M as getReviewStateDir, N as getSavedTheme, R as recordDefaultAgent, W as resolveWebUrl, _ as computeSettledLabel, c as actionableCardVerb, d as parseOauthConnectParams, f as prioritizeActionableCards, g as composeQuestionAnswerEntries, h as composeQuestionAnswer, i as resolveAgent, l as cardActionErrorMessage, m as resolveConnectUrl, p as reconcileMaskedInput, q as saveTheme, s as MASK_CHAR, u as parseExternalOauthConnectParams, v as parseConnectCard, w as DEFAULT_APP_URL, y as specKeyFor } from "./print-BCmiE-GH.mjs";
4
- import { A as installAgentAlias, C as themeVersion, D as machineOsFromPlatform, F as detectShell, L as getActiveWorkspaceId, M as takenAliasNames, O as aliasActivationHint, S as themeModeFromColorFgBg, T as themesForMode, V as setActiveWorkspace, _ as monoTheme, a as WORDMARK, b as themeForMode, d as profilingEnabled, f as record, g as findTheme, h as applyTheme, i as MARK_CELLS, j as slugifyAliasName, k as dedupeAliasName, m as DEFAULT_THEME_ID, n as buildCrashReport, p as writeArtifact, r as writeCrashReport, s as splashFitsWidth, t as installCrashHandler, v as noColorRequested, x as themeMode, y as theme, z as listWorkspaces } from "./install-cFvM8rL1.mjs";
2
+ import { a as errorMessage, i as sendErrorMessage, n as errorDetail, o as isRecord, t as createRestClient } from "./rest-DapRUHYJ.mjs";
3
+ import { C as DEFAULT_API_URL, D as getConfigPath, M as getReviewStateDir, N as getSavedTheme, R as recordDefaultAgent, W as resolveWebUrl, _ as computeSettledLabel, c as actionableCardVerb, d as parseOauthConnectParams, f as prioritizeActionableCards, g as composeQuestionAnswerEntries, h as composeQuestionAnswer, i as resolveAgent, l as cardActionErrorMessage, m as resolveConnectUrl, p as reconcileMaskedInput, q as saveTheme, s as MASK_CHAR, u as parseExternalOauthConnectParams, v as parseConnectCard, w as DEFAULT_APP_URL, y as specKeyFor } from "./print-357wbbEE.mjs";
4
+ import { A as installAgentAlias, C as themeVersion, D as machineOsFromPlatform, F as detectShell, L as getActiveWorkspaceId, M as takenAliasNames, O as aliasActivationHint, S as themeModeFromColorFgBg, T as themesForMode, V as setActiveWorkspace, _ as monoTheme, a as WORDMARK, b as themeForMode, d as profilingEnabled, f as record, g as findTheme, h as applyTheme, i as MARK_CELLS, j as slugifyAliasName, k as dedupeAliasName, m as DEFAULT_THEME_ID, n as buildCrashReport, p as writeArtifact, r as writeCrashReport, s as splashFitsWidth, t as installCrashHandler, v as noColorRequested, x as themeMode, y as theme, z as listWorkspaces } from "./install-DLTphokL.mjs";
5
5
  import { t as HttpError } from "./http-error-BF2NZZE3.mjs";
6
6
  import { i as billingBlockedOutcomeFromSendResponse } from "./billing-blocked-D3l5kJlX.mjs";
7
- import { n as PortalClient } from "./client-B1MsnBwh.mjs";
7
+ import { n as PortalClient } from "./client-D0RqJE_-.mjs";
8
8
  import { t as defaultTlsCertSource } from "./tls-cert-Rua2oV7n.mjs";
9
9
  import "./api-BFQ4PQDA.mjs";
10
- import "./daemon-BusoaIlg.mjs";
10
+ import "./daemon-CaPq7nD7.mjs";
11
11
  import { t as SandboxStream } from "./client-CFnT0cAy.mjs";
12
- import { t as PortalDaemonClient } from "./daemon-client-B9Z0MLKE.mjs";
12
+ import { t as PortalDaemonClient } from "./daemon-client-cLHlYHvr.mjs";
13
13
  import { t as runRawPtyPassthrough } from "./raw-pty-Cj-O0pyb.mjs";
14
14
  import * as os$1 from "node:os";
15
15
  import { homedir, platform, release, tmpdir } from "node:os";
@@ -5671,7 +5671,8 @@ const ConversationContext = createContext({
5671
5671
  subagentSelection: null,
5672
5672
  collectSandboxStats: null,
5673
5673
  latestComputerId: null,
5674
- scrolledUp: false
5674
+ scrolledUp: false,
5675
+ transcriptContentWidth: null
5675
5676
  });
5676
5677
  function useConversationContext() {
5677
5678
  return useContext(ConversationContext);
@@ -5732,6 +5733,10 @@ const GiB = 1024 * 1024 * 1024;
5732
5733
  function gb(bytes) {
5733
5734
  return (bytes / GiB).toFixed(1);
5734
5735
  }
5736
+ /** Whole GiB, for the compact rungs of the caption ladder. */
5737
+ function gbWhole(bytes) {
5738
+ return String(Math.round(bytes / GiB));
5739
+ }
5735
5740
  /**
5736
5741
  * Reduce a snapshot to the ordered list of gauges the `/computer` card draws:
5737
5742
  * CPU utilization, memory, and disk — the three signals the api's live-stats
@@ -5746,6 +5751,11 @@ function toGauges(stats) {
5746
5751
  label: "cpu",
5747
5752
  fraction: cpuFraction,
5748
5753
  detail: `${stats.cpuUsedPct.toFixed(0)}% · ${stats.cpuCount} vCPU`,
5754
+ variants: [
5755
+ `${stats.cpuUsedPct.toFixed(0)}% · ${stats.cpuCount} vCPU`,
5756
+ `${stats.cpuCount} vCPU`,
5757
+ ""
5758
+ ],
5749
5759
  severity: severityFor(cpuFraction)
5750
5760
  });
5751
5761
  const memFraction = stats.memTotalBytes > 0 ? stats.memUsedBytes / stats.memTotalBytes : 0;
@@ -5753,6 +5763,7 @@ function toGauges(stats) {
5753
5763
  label: "memory",
5754
5764
  fraction: memFraction,
5755
5765
  detail: `${gb(stats.memUsedBytes)} / ${gb(stats.memTotalBytes)} GB`,
5766
+ variants: byteVariants(stats.memUsedBytes, stats.memTotalBytes),
5756
5767
  severity: severityFor(memFraction)
5757
5768
  });
5758
5769
  const diskFraction = stats.diskTotalBytes > 0 ? stats.diskUsedBytes / stats.diskTotalBytes : 0;
@@ -5760,11 +5771,70 @@ function toGauges(stats) {
5760
5771
  label: "disk",
5761
5772
  fraction: diskFraction,
5762
5773
  detail: `${gb(stats.diskUsedBytes)} / ${gb(stats.diskTotalBytes)} GB`,
5774
+ variants: byteVariants(stats.diskUsedBytes, stats.diskTotalBytes),
5763
5775
  severity: severityFor(diskFraction)
5764
5776
  });
5765
5777
  return gauges;
5766
5778
  }
5767
5779
  /**
5780
+ * The caption ladder for a used/total byte pair: the full spaced caption,
5781
+ * then progressively shorter statements of the same numbers. Each rung must
5782
+ * be strictly shorter than the one before it so the fit loop below always
5783
+ * makes progress; the final rung is empty (percent column only).
5784
+ */
5785
+ function byteVariants(used, total) {
5786
+ return [
5787
+ `${gb(used)} / ${gb(total)} GB`,
5788
+ `${gb(used)}/${gb(total)} GB`,
5789
+ `${gbWhole(used)}/${gbWhole(total)} GB`,
5790
+ `${gbWhole(used)}/${gbWhole(total)}`,
5791
+ ""
5792
+ ];
5793
+ }
5794
+ /**
5795
+ * Columns a gauge row spends that are NOT the bar: the two-space gap after
5796
+ * the padded label, the percent column (one space + four right-aligned
5797
+ * cols), and the two-space gap before the detail caption. Counted in one
5798
+ * place so the width budgeting below can't drift from what `GaugeRow` draws.
5799
+ */
5800
+ const GAUGE_ROW_CHROME_COLS = 9;
5801
+ /** Bar floor: below this the glyph strip stops reading as a gauge. */
5802
+ const GAUGE_MIN_BAR_WIDTH = 4;
5803
+ /**
5804
+ * Fit a set of gauges into a row of `width` columns. One ladder index is
5805
+ * chosen for ALL rows (so the captions stay a uniform grid), picking the
5806
+ * most verbose caption every row can carry with a bar at or above the floor;
5807
+ * the bar takes whatever the chosen captions leave. If even the empty
5808
+ * caption doesn't leave the floor, the bar shrinks to what's left rather
5809
+ * than wrapping — a row is always exactly one line.
5810
+ *
5811
+ * Pure, so the layout math is unit-testable without a renderer.
5812
+ */
5813
+ function fitGaugesToWidth(opts) {
5814
+ const room = opts.width - opts.labelWidth - GAUGE_ROW_CHROME_COLS;
5815
+ const chosen = opts.gauges.map((g) => {
5816
+ const rung = g.variants.findIndex((v) => room - v.length >= GAUGE_MIN_BAR_WIDTH);
5817
+ return rung === -1 ? g.variants.length - 1 : rung;
5818
+ });
5819
+ const shared = Math.max(0, ...chosen);
5820
+ const fitted = opts.gauges.map((g, i) => {
5821
+ const rung = chosen[i] ?? g.variants.length - 1;
5822
+ const detail = g.variants[Math.min(shared, rung)] ?? "";
5823
+ return {
5824
+ gauge: {
5825
+ ...g,
5826
+ detail
5827
+ },
5828
+ captionCols: detail.length
5829
+ };
5830
+ });
5831
+ const barWidth = Math.max(1, room - Math.max(0, ...fitted.map((f) => f.captionCols)));
5832
+ return {
5833
+ gauges: fitted.map((f) => f.gauge),
5834
+ barWidth
5835
+ };
5836
+ }
5837
+ /**
5768
5838
  * A single-line horizontal bar of `width` cells filled to `fraction`
5769
5839
  * (clamped 0..1), using block glyphs. The last partial cell uses one of the
5770
5840
  * eighth-block glyphs so a 37%% bar reads differently from a 40%% one even in a
@@ -5816,7 +5886,7 @@ function renderBar(fraction, width) {
5816
5886
  * this component only draws.
5817
5887
  */
5818
5888
  function ComputerItem({ item }) {
5819
- const { collectSandboxStats, latestComputerId, scrolledUp } = useConversationContext();
5889
+ const { collectSandboxStats, latestComputerId, scrolledUp, transcriptContentWidth } = useConversationContext();
5820
5890
  const live = shouldPollComputer({
5821
5891
  isLatest: latestComputerId === item.id,
5822
5892
  canCollect: collectSandboxStats !== null,
@@ -5868,8 +5938,15 @@ function ComputerItem({ item }) {
5868
5938
  }) });
5869
5939
  const gauges = toGauges(stats);
5870
5940
  const labelWidth = Math.max(...gauges.map((g) => g.label.length));
5871
- const barWidth = 24;
5872
- return /* @__PURE__ */ jsx(Shell, { children: gauges.map((g) => /* @__PURE__ */ jsx(GaugeRow, {
5941
+ const { gauges: fittedGauges, barWidth } = transcriptContentWidth === null ? {
5942
+ gauges,
5943
+ barWidth: 24
5944
+ } : fitGaugesToWidth({
5945
+ width: transcriptContentWidth,
5946
+ labelWidth,
5947
+ gauges
5948
+ });
5949
+ return /* @__PURE__ */ jsx(Shell, { children: fittedGauges.map((g) => /* @__PURE__ */ jsx(GaugeRow, {
5873
5950
  gauge: g,
5874
5951
  labelWidth,
5875
5952
  barWidth
@@ -5931,6 +6008,14 @@ function GaugeRow({ gauge, labelWidth, barWidth }) {
5931
6008
  * all content shares one left margin and the transcript stays clean — the
5932
6009
  * opencode pattern. Status/role is carried by glyphs and color, not bars.
5933
6010
  */
6011
+ /**
6012
+ * Columns the Row wrapper spends before/around its content: left padding,
6013
+ * the 1-col gutter bar, the gap after it, and right padding. Exported so
6014
+ * callers that know the transcript strip width (the chat screen, for the
6015
+ * `/computer` card's gauge budget) can net it out without copying the
6016
+ * geometry.
6017
+ */
6018
+ const TRANSCRIPT_ROW_CHROME_COLS = 4;
5934
6019
  function Row({ barColor, children }) {
5935
6020
  return /* @__PURE__ */ jsxs("box", {
5936
6021
  style: {
@@ -7870,7 +7955,11 @@ function ComputerSection({ visible, collectSandboxStats, pollMs }) {
7870
7955
  ]);
7871
7956
  const gauges = stats === null ? [] : toGauges(stats);
7872
7957
  const labelWidth = 6;
7873
- const barWidth = 8;
7958
+ const { gauges: fittedGauges, barWidth } = fitGaugesToWidth({
7959
+ width: SIDE_PANEL_WIDTH - 4,
7960
+ labelWidth,
7961
+ gauges
7962
+ });
7874
7963
  return /* @__PURE__ */ jsxs("box", {
7875
7964
  style: {
7876
7965
  flexDirection: "column",
@@ -7893,7 +7982,7 @@ function ComputerSection({ visible, collectSandboxStats, pollMs }) {
7893
7982
  fg: theme.dim,
7894
7983
  children: collectSandboxStats === null ? "no stats source" : "no sandbox running"
7895
7984
  }) : null,
7896
- gauges.map((g) => /* @__PURE__ */ jsx(GaugeRow, {
7985
+ fittedGauges.map((g) => /* @__PURE__ */ jsx(GaugeRow, {
7897
7986
  gauge: g,
7898
7987
  labelWidth,
7899
7988
  barWidth
@@ -16356,6 +16445,7 @@ function ChatScreen({ agent, conversation, attachRunId, parentConversationId })
16356
16445
  width
16357
16446
  }) === "side";
16358
16447
  const sidePanelWidth = sidePanelShown ? SIDE_PANEL_WIDTH : 0;
16448
+ const transcriptContentWidth = Math.max(1, bodyWidth - sidePanelWidth - (sidePanelShown ? 2 : 0) - (reviewPlacement === "side" ? reviewWidth + 1 : 0) - TRANSCRIPT_ROW_CHROME_COLS);
16359
16449
  const inlineReviewHeight = reviewOpen && reviewPlacement === "below" ? reviewHeight : 0;
16360
16450
  const menuRows = menuOpen ? completionMenuHeight(menuCommands.length) : 0;
16361
16451
  const todoCardVisible = !credPrompt && !planHidden && !!todos && todos.length > 0;
@@ -16862,7 +16952,8 @@ function ChatScreen({ agent, conversation, attachRunId, parentConversationId })
16862
16952
  subagentSelection,
16863
16953
  collectSandboxStats: boundCollectSandboxStats,
16864
16954
  latestComputerId,
16865
- scrolledUp
16955
+ scrolledUp,
16956
+ transcriptContentWidth
16866
16957
  }), [
16867
16958
  rest,
16868
16959
  conversationId,
@@ -16871,7 +16962,8 @@ function ChatScreen({ agent, conversation, attachRunId, parentConversationId })
16871
16962
  subagentSelection,
16872
16963
  boundCollectSandboxStats,
16873
16964
  latestComputerId,
16874
- scrolledUp
16965
+ scrolledUp,
16966
+ transcriptContentWidth
16875
16967
  ]);
16876
16968
  const actionableCards = useMemo(() => prioritizeActionableCards(items.filter(isActionableCard)), [items]);
16877
16969
  const cardVerb = useMemo(() => actionableCardVerb(actionableCards), [actionableCards]);
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { n as PortalClient, r as RATE_LIMIT_STAND_DOWN_MS, t as AUTH_STAND_DOWN_MS } from "./client-B1MsnBwh.mjs";
2
+ import { n as PortalClient, r as RATE_LIMIT_STAND_DOWN_MS, t as AUTH_STAND_DOWN_MS } from "./client-D0RqJE_-.mjs";
3
3
  import "./api-BFQ4PQDA.mjs";
4
4
 
5
5
  export { PortalClient };
@@ -161,7 +161,7 @@ function errorMessage(err) {
161
161
  * the commit time of the built tree is one monotonic clock they share.
162
162
  */
163
163
  function portalDaemonBuild() {
164
- return "1790645178";
164
+ return "1790647386";
165
165
  }
166
166
  /**
167
167
  * Whether a client carrying `mine` should replace a running daemon carrying
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import "./client-B1MsnBwh.mjs";
2
+ import "./client-D0RqJE_-.mjs";
3
3
  import "./tls-cert-Rua2oV7n.mjs";
4
4
  import "./api-BFQ4PQDA.mjs";
5
- import { a as runPortalDaemon, c as stopDaemonForHandoff, i as queryDaemonStatus, n as ensureDaemonRunning, o as startPortalDaemon, r as isDaemonListening, s as stopDaemon, t as PortalDaemon } from "./daemon-BusoaIlg.mjs";
5
+ import { a as runPortalDaemon, c as stopDaemonForHandoff, i as queryDaemonStatus, n as ensureDaemonRunning, o as startPortalDaemon, r as isDaemonListening, s as stopDaemon, t as PortalDaemon } from "./daemon-CaPq7nD7.mjs";
6
6
 
7
7
  export { runPortalDaemon };
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { a as portalDaemonBuild, i as isNewerBuild, n as PortalClient, o as isRecord } from "./client-B1MsnBwh.mjs";
2
+ import { a as portalDaemonBuild, i as isNewerBuild, n as PortalClient, o as isRecord } from "./client-D0RqJE_-.mjs";
3
3
  import { t as defaultTlsCertSource } from "./tls-cert-Rua2oV7n.mjs";
4
4
  import os from "node:os";
5
5
  import path from "node:path";
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { d as daemonPaths, f as encodeLine, l as LOCAL_PROTOCOL_VERSION, m as parseDaemonMessage, n as ensureDaemonRunning, p as makeLineParser } from "./daemon-BusoaIlg.mjs";
2
+ import { d as daemonPaths, f as encodeLine, l as LOCAL_PROTOCOL_VERSION, m as parseDaemonMessage, n as ensureDaemonRunning, p as makeLineParser } from "./daemon-CaPq7nD7.mjs";
3
3
  import { randomUUID } from "node:crypto";
4
4
  import { connect } from "node:net";
5
5
 
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import "./client-D0RqJE_-.mjs";
3
+ import "./tls-cert-Rua2oV7n.mjs";
4
+ import "./api-BFQ4PQDA.mjs";
5
+ import "./daemon-CaPq7nD7.mjs";
6
+ import { t as PortalDaemonClient } from "./daemon-client-cLHlYHvr.mjs";
7
+
8
+ export { PortalDaemonClient };
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { c as version$1 } from "./rest-sPrMWI3O.mjs";
3
- import { D as getConfigPath } from "./print-BCmiE-GH.mjs";
2
+ import { c as version$1 } from "./rest-DapRUHYJ.mjs";
3
+ import { D as getConfigPath } from "./print-357wbbEE.mjs";
4
4
  import os from "node:os";
5
5
  import path from "node:path";
6
6
  import { err, ok } from "neverthrow";
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { a as errorMessage, i as sendErrorMessage, o as isRecord, t as createRestClient } from "./rest-sPrMWI3O.mjs";
2
+ import { a as errorMessage, i as sendErrorMessage, o as isRecord, t as createRestClient } from "./rest-DapRUHYJ.mjs";
3
3
  import { t as HttpError } from "./http-error-BF2NZZE3.mjs";
4
4
  import { i as billingBlockedOutcomeFromSendResponse, n as BillingBlockedError } from "./billing-blocked-D3l5kJlX.mjs";
5
5
  import path from "node:path";
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import "./rest-sPrMWI3O.mjs";
3
- import { a as runPrint, i as resolveAgent, n as messageGet, o as toPrintError, r as readStdin, t as collectRunText } from "./print-BCmiE-GH.mjs";
2
+ import "./rest-DapRUHYJ.mjs";
3
+ import { a as runPrint, i as resolveAgent, n as messageGet, o as toPrintError, r as readStdin, t as collectRunText } from "./print-357wbbEE.mjs";
4
4
  import "./billing-blocked-D3l5kJlX.mjs";
5
5
 
6
6
  export { messageGet, readStdin, resolveAgent, runPrint };
@@ -14,7 +14,7 @@ import { n as printError } from "./output-C9mb3sUB.mjs";
14
14
  * the reply (and to --json).
15
15
  */
16
16
  async function connectMachineShare({ appUrl, sessionToken, timeoutHint }) {
17
- const { PortalClient } = await import("./client-BPanhjj1.mjs");
17
+ const { PortalClient } = await import("./client-BQ6mNlsD.mjs");
18
18
  const { defaultTlsCertSource } = await import("./tls-cert-BpCaD5AT.mjs");
19
19
  let signalConnected;
20
20
  const connected = new Promise((resolve) => {
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { i as sendErrorMessage, n as errorDetail, r as filenameFromContentDisposition, t as createRestClient } from "./rest-sPrMWI3O.mjs";
2
+ import { i as sendErrorMessage, n as errorDetail, r as filenameFromContentDisposition, t as createRestClient } from "./rest-DapRUHYJ.mjs";
3
3
  import { t as HttpError } from "./http-error-BF2NZZE3.mjs";
4
4
  import "./billing-blocked-D3l5kJlX.mjs";
5
5
 
@@ -6,7 +6,7 @@ import { createParser } from "eventsource-parser";
6
6
 
7
7
  //#region package.json
8
8
  var name = "skydive-cli";
9
- var version = "0.6.0-beta.43";
9
+ var version = "0.6.0-beta.44";
10
10
 
11
11
  //#endregion
12
12
  //#region src/chat/util.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skydive-cli",
3
- "version": "0.6.0-beta.43",
3
+ "version": "0.6.0-beta.44",
4
4
  "description": "Skydive CLI — cloud agents from the command line",
5
5
  "homepage": "https://skydive.com",
6
6
  "license": "MIT",
@@ -71,9 +71,9 @@
71
71
  },
72
72
  "//optionalDependencies": "The per-platform binary packages (skydive-cli-<os>-<arch>) are INTENTIONALLY not committed here. They are published by release-skydive-cli-binaries.yml and injected — pinned to the exact version being published — into the published launcher's optionalDependencies at release time (scripts/prepare-platform-packages.mjs --pin-version, run in release-skydive-cli.yml). Committing them would make `yarn install` try to resolve versions that only exist post-publish, breaking local dev and CI. npm installs of a published skydive-cli still get them (os/cpu-gated); the launcher (src/launcher.ts) resolves and execs the matching one. Local dev never needs them: it runs the JS bundle or `build:binary` directly.",
73
73
  "optionalDependencies": {
74
- "skydive-cli-darwin-arm64": "0.6.0-beta.43",
75
- "skydive-cli-darwin-x64": "0.6.0-beta.43",
76
- "skydive-cli-linux-x64": "0.6.0-beta.43",
77
- "skydive-cli-linux-arm64": "0.6.0-beta.43"
74
+ "skydive-cli-darwin-arm64": "0.6.0-beta.44",
75
+ "skydive-cli-darwin-x64": "0.6.0-beta.44",
76
+ "skydive-cli-linux-x64": "0.6.0-beta.44",
77
+ "skydive-cli-linux-arm64": "0.6.0-beta.44"
78
78
  }
79
79
  }
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env node
2
- import "./client-B1MsnBwh.mjs";
3
- import "./tls-cert-Rua2oV7n.mjs";
4
- import "./api-BFQ4PQDA.mjs";
5
- import "./daemon-BusoaIlg.mjs";
6
- import { t as PortalDaemonClient } from "./daemon-client-B9Z0MLKE.mjs";
7
-
8
- export { PortalDaemonClient };