skydive-cli 0.6.0-beta.24 → 0.6.0-beta.26

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-si3NhA-L.mjs";
3
- import { A as getPromptHistoryPath, B as resolveConfig, D as getDefaultAgent, E as getConfigPath, F as getStoredApiKeyWorkspaceName, G as saveSession, H as resolveSession$1, I as getUpdateCheckDisabled, N as getShareMachineDefault, O as getLastSeenVersion, P as getStoredApiKeyId, R as resolveAppUrl, S as DEFAULT_API_URL, T as deleteConfig, V as resolveManagementAuth, W as saveConfig, b as API_KEY_FAMILY_PREFIX, i as resolveAgent$1, k as getPreference, q as setLastSeenVersion, w as PREFERENCES, x as API_KEY_PREFIX, y as API_KEYS_URL, z as resolveChatAuth } from "./print-DDI8g0HX.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-KL5zAlW8.mjs";
2
+ import { c as version, s as name, t as createRestClient } from "./rest-C7ahG6C2.mjs";
3
+ import { A as getPromptHistoryPath, B as resolveConfig, D as getDefaultAgent, E as getConfigPath, F as getStoredApiKeyWorkspaceName, G as saveSession, H as resolveSession$1, I as getUpdateCheckDisabled, N as getShareMachineDefault, O as getLastSeenVersion, P as getStoredApiKeyId, R as resolveAppUrl, S as DEFAULT_API_URL, T as deleteConfig, V as resolveManagementAuth, W as saveConfig, b as API_KEY_FAMILY_PREFIX, i as resolveAgent$1, k as getPreference, q as setLastSeenVersion, w as PREFERENCES, x as API_KEY_PREFIX, y as API_KEYS_URL, z as resolveChatAuth } from "./print-CYg-EpIt.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-F2CzHVln.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 { a as resolveMachineIdentity } from "./client-CNF1DFAQ.mjs";
8
+ import { a as resolveMachineIdentity } from "./client-B2QW5YW3.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-D4B5LeNQ.mjs";
11
+ import { d as daemonPaths, i as queryDaemonStatus, n as ensureDaemonRunning, s as stopDaemon, u as PORTAL_DAEMON_FLAG } from "./daemon-BVkLmE9i.mjs";
12
12
  import { a as encodeFsRequest, i as decodeFsResponse, n as SANDBOX_STREAM_PATH, r as streamSpecToQuery, t as SandboxStream } from "./client-l6orYfqq.mjs";
13
13
  import { hideBin } from "yargs/helpers";
14
14
  import yargs from "yargs";
@@ -1586,7 +1586,7 @@ const importCommand = {
1586
1586
  process.exit(1);
1587
1587
  }
1588
1588
  }
1589
- const { runChat } = await import("./boot-CZ_17jJG.mjs");
1589
+ const { runChat } = await import("./boot-Bwi44na9.mjs");
1590
1590
  await runChat({
1591
1591
  appUrl,
1592
1592
  sessionToken: session.value.sessionToken,
@@ -1616,7 +1616,7 @@ async function runImportPrintMode({ argv, appUrl }) {
1616
1616
  printError(`${session.error.message} For non-interactive use, run \`skydive auth login --web\` first, or set SKYDIVE_SESSION_TOKEN.`);
1617
1617
  process.exit(1);
1618
1618
  }
1619
- const { connectMachineShare } = await import("./print-share-Cp-UubZb.mjs");
1619
+ const { connectMachineShare } = await import("./print-share-CHp1Ap1B.mjs");
1620
1620
  const machineShare = await connectMachineShare({
1621
1621
  appUrl,
1622
1622
  sessionToken: session.value.sessionToken,
@@ -1624,7 +1624,7 @@ async function runImportPrintMode({ argv, appUrl }) {
1624
1624
  });
1625
1625
  const extra = (argv.print ?? "").trim();
1626
1626
  const prompt = buildImportSeedPrompt(process.cwd(), machineOsFromPlatform(process.platform)) + (extra ? `\n\nAdditional instructions: ${extra}` : "");
1627
- const { runPrint } = await import("./print-Dfj7y9pt.mjs");
1627
+ const { runPrint } = await import("./print-BS_EtAAV.mjs");
1628
1628
  try {
1629
1629
  const result = await runPrint({
1630
1630
  appUrl,
@@ -2031,7 +2031,7 @@ const chatCommand = {
2031
2031
  sessionToken: auth.value.token,
2032
2032
  agentSelector: argv.agent ?? null
2033
2033
  });
2034
- const { runChat } = await import("./boot-CZ_17jJG.mjs");
2034
+ const { runChat } = await import("./boot-Bwi44na9.mjs");
2035
2035
  await runChat({
2036
2036
  appUrl: auth.value.appUrl,
2037
2037
  sessionToken: auth.value.token,
@@ -2115,7 +2115,7 @@ async function runPrintMode({ argv, appUrl }) {
2115
2115
  printError(`${auth.error.message} For non-interactive use, run \`skydive auth login\` first, or set SKYDIVE_API_KEY / SKYDIVE_SESSION_TOKEN.`);
2116
2116
  process.exit(1);
2117
2117
  }
2118
- const { runPrint, readStdin } = await import("./print-Dfj7y9pt.mjs");
2118
+ const { runPrint, readStdin } = await import("./print-BS_EtAAV.mjs");
2119
2119
  const workspaceId = await resolveWorkspaceFlag({
2120
2120
  appUrl,
2121
2121
  sessionToken: auth.value.token,
@@ -2145,7 +2145,7 @@ async function runPrintMode({ argv, appUrl }) {
2145
2145
  process.exit(1);
2146
2146
  }
2147
2147
  } else {
2148
- const { connectMachineShare } = await import("./print-share-Cp-UubZb.mjs");
2148
+ const { connectMachineShare } = await import("./print-share-CHp1Ap1B.mjs");
2149
2149
  machineShare = await connectMachineShare({
2150
2150
  appUrl: auth.value.appUrl,
2151
2151
  sessionToken: auth.value.token,
@@ -2210,7 +2210,7 @@ const getCommand$1 = {
2210
2210
  printError(`${auth.error.message} Run \`skydive auth login\` first, or set SKYDIVE_API_KEY / SKYDIVE_SESSION_TOKEN.`);
2211
2211
  process.exit(1);
2212
2212
  }
2213
- const { messageGet } = await import("./print-Dfj7y9pt.mjs");
2213
+ const { messageGet } = await import("./print-BS_EtAAV.mjs");
2214
2214
  try {
2215
2215
  const result = await messageGet({
2216
2216
  appUrl: auth.value.appUrl,
@@ -2413,7 +2413,7 @@ const switchCommand = {
2413
2413
  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.");
2414
2414
  process.exit(1);
2415
2415
  }
2416
- const { runWorkspacePicker } = await import("./boot-CZ_17jJG.mjs");
2416
+ const { runWorkspacePicker } = await import("./boot-Bwi44na9.mjs");
2417
2417
  await runWorkspacePicker(session);
2418
2418
  return;
2419
2419
  }
@@ -2492,7 +2492,7 @@ const openCommand = {
2492
2492
  const agent = argv.agent ? resolveAgent$1((await fetchPortalDevices(session)).agents, argv.agent) : null;
2493
2493
  const cwd = argv.cwd ? path.resolve(argv.cwd) : process.cwd();
2494
2494
  const { machineName } = await resolveMachineIdentity(null);
2495
- const { PortalDaemonClient } = await import("./daemon-client-C7efcR_u.mjs");
2495
+ const { PortalDaemonClient } = await import("./daemon-client-6juwWtPE.mjs");
2496
2496
  let lastLine = "";
2497
2497
  let signalConnected;
2498
2498
  const connected = new Promise((resolve) => {
@@ -2849,8 +2849,8 @@ const sandboxCommand = {
2849
2849
  }).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`"),
2850
2850
  handler: async (argv) => {
2851
2851
  const session = requireSession(argv);
2852
- const { createRestClient } = await import("./rest-dBXbTmRP.mjs");
2853
- const { resolveAgent } = await import("./print-Dfj7y9pt.mjs");
2852
+ const { createRestClient } = await import("./rest-CLClexxY.mjs");
2853
+ const { resolveAgent } = await import("./print-BS_EtAAV.mjs");
2854
2854
  const client = createRestClient({
2855
2855
  appUrl: session.appUrl,
2856
2856
  sessionToken: session.sessionToken
@@ -3121,8 +3121,8 @@ const fsEditCommand = {
3121
3121
  handler: async (argv) => {
3122
3122
  const session = requireSession(argv);
3123
3123
  const remotePath = argv.path;
3124
- const { createRestClient } = await import("./rest-dBXbTmRP.mjs");
3125
- const { resolveAgent } = await import("./print-Dfj7y9pt.mjs");
3124
+ const { createRestClient } = await import("./rest-CLClexxY.mjs");
3125
+ const { resolveAgent } = await import("./print-BS_EtAAV.mjs");
3126
3126
  const client = createRestClient({
3127
3127
  appUrl: session.appUrl,
3128
3128
  sessionToken: session.sessionToken
@@ -4575,7 +4575,7 @@ if (process.argv.includes(UPDATE_WORKER_FLAG)) {
4575
4575
  process.exit(0);
4576
4576
  }
4577
4577
  if (process.argv.includes(PORTAL_DAEMON_FLAG)) {
4578
- const { runPortalDaemon } = await import("./daemon-CN5CdzEt.mjs");
4578
+ const { runPortalDaemon } = await import("./daemon-CTh9EIaa.mjs");
4579
4579
  runPortalDaemon(process.argv);
4580
4580
  } else runCli();
4581
4581
  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-si3NhA-L.mjs";
3
- import { C as DEFAULT_APP_URL, E as getConfigPath, K as saveTheme, L as recordDefaultAgent, M as getSavedTheme, S as DEFAULT_API_URL, U as resolveWebUrl, _ as parseConnectCard, c as actionableCardVerb, d as parseOauthConnectParams, f as prioritizeActionableCards, g as computeSettledLabel, h as composeQuestionAnswer, i as resolveAgent, j as getReviewStateDir, l as cardActionErrorMessage, m as resolveConnectUrl, p as reconcileMaskedInput, s as MASK_CHAR, u as parseExternalOauthConnectParams, v as specKeyFor } from "./print-DDI8g0HX.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-KL5zAlW8.mjs";
2
+ import { a as errorMessage, i as sendErrorMessage, n as errorDetail, o as isRecord, t as createRestClient } from "./rest-C7ahG6C2.mjs";
3
+ import { C as DEFAULT_APP_URL, E as getConfigPath, K as saveTheme, L as recordDefaultAgent, M as getSavedTheme, S as DEFAULT_API_URL, U as resolveWebUrl, _ as parseConnectCard, c as actionableCardVerb, d as parseOauthConnectParams, f as prioritizeActionableCards, g as computeSettledLabel, h as composeQuestionAnswer, i as resolveAgent, j as getReviewStateDir, l as cardActionErrorMessage, m as resolveConnectUrl, p as reconcileMaskedInput, s as MASK_CHAR, u as parseExternalOauthConnectParams, v as specKeyFor } from "./print-CYg-EpIt.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-F2CzHVln.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 { t as PortalClient } from "./client-CNF1DFAQ.mjs";
7
+ import { t as PortalClient } from "./client-B2QW5YW3.mjs";
8
8
  import { t as defaultTlsCertSource } from "./tls-cert-Rua2oV7n.mjs";
9
9
  import "./api-BFQ4PQDA.mjs";
10
- import "./daemon-D4B5LeNQ.mjs";
10
+ import "./daemon-BVkLmE9i.mjs";
11
11
  import { t as SandboxStream } from "./client-l6orYfqq.mjs";
12
- import { t as PortalDaemonClient } from "./daemon-client-Eoo24bVH.mjs";
12
+ import { t as PortalDaemonClient } from "./daemon-client-DBxd1-Pa.mjs";
13
13
  import { t as runRawPtyPassthrough } from "./raw-pty-dndn1Kxc.mjs";
14
14
  import * as os$1 from "node:os";
15
15
  import { homedir, platform, release, tmpdir } from "node:os";
@@ -3598,6 +3598,19 @@ function isAgentRunConversation(c) {
3598
3598
  return !humanChannels.some((human) => human === channel);
3599
3599
  }
3600
3600
  /**
3601
+ * Whether the signed-in user has their own participant row in this thread,
3602
+ * which is what per-user archive marks. An org admin's list includes every
3603
+ * thread in the org, so it can hold threads they never joined (a Slack thread
3604
+ * between a colleague and the agent, say); on those the server has no row to
3605
+ * mark and refuses, so the UI should not offer archive. Read from
3606
+ * the list row's `viewerParticipates`; an older server omits it, and a
3607
+ * brand-new conversation has no roster yet, so both read as true.
3608
+ */
3609
+ function viewerIsParticipant(c) {
3610
+ if (isNewConversation(c)) return true;
3611
+ return c.viewerParticipates ?? true;
3612
+ }
3613
+ /**
3601
3614
  * The channel a conversation belongs to when it isn't the web channel, else
3602
3615
  * null. A brand-new conversation is always web, and the list route reports the
3603
3616
  * web channel as either `'web'` or (legacy) null — both mean "post from here".
@@ -3892,6 +3905,7 @@ function ConversationHome({ agent, initialQuery, conversations, showAutomated, o
3892
3905
  const highlightRow = rows[clamped];
3893
3906
  const highlightArchived = highlightRow?.kind === "conv" && isArchived(highlightRow.hit.item);
3894
3907
  const highlightAgentRun = highlightRow?.kind === "conv" && isAgentRunConversation(highlightRow.hit.item);
3908
+ const highlightOutsider = highlightRow?.kind === "conv" && !viewerIsParticipant(highlightRow.hit.item);
3895
3909
  const confirmConv = confirmId !== null ? list.find((c) => c.id === confirmId) : void 0;
3896
3910
  const searchState = isSearching ? search?.state : void 0;
3897
3911
  const searchStatusSegment = !isSearching ? "" : searchState?.kind === "loading" || search === null ? "searching…" : searchState?.kind === "error" ? `search failed: ${searchState.message}` : list.length === 0 ? "no matches" : "";
@@ -3913,7 +3927,7 @@ function ConversationHome({ agent, initialQuery, conversations, showAutomated, o
3913
3927
  searchStatusSegment,
3914
3928
  enterHint,
3915
3929
  "/ search",
3916
- ...highlightAgentRun ? [] : [`ctrl+a ${highlightArchived ? "unarchive" : "archive"}`],
3930
+ ...highlightAgentRun || highlightOutsider ? [] : [`ctrl+a ${highlightArchived ? "unarchive" : "archive"}`],
3917
3931
  "ctrl+d delete",
3918
3932
  `tab ${showAutomated ? "hide" : "show"} agent runs`,
3919
3933
  `shift+tab ${showArchived ? "hide" : "show"} archived`,
@@ -4068,6 +4082,10 @@ function ConversationHome({ agent, initialQuery, conversations, showAutomated, o
4068
4082
  setError("agent runs can't be archived — ctrl+d deletes");
4069
4083
  return;
4070
4084
  }
4085
+ if (!viewerIsParticipant(row.hit.item)) {
4086
+ setError("you're not in this thread, so there's nothing to archive");
4087
+ return;
4088
+ }
4071
4089
  setError(null);
4072
4090
  toggleArchived(row.hit.item);
4073
4091
  }
@@ -8636,9 +8654,19 @@ function formatChatFooterStatus({ runKind, ctrlCArmed, portalOpen, hasPendingSte
8636
8654
  * appended only once something has chosen one — an agent with no stored level
8637
8655
  * runs at the platform default, and naming a level it never picked would be a
8638
8656
  * claim the footer can't back.
8639
- */
8640
- function formatModelHint(model, effort) {
8641
- return `ctrl+p · ${model ?? "default"}${effort ? ` · ${effort}` : ""}`;
8657
+ *
8658
+ * A thread that serves its own model reads differently from one following the
8659
+ * agent (ANY-8702): a differing `agentModel` gets a `thread` marker plus the
8660
+ * default it replaces — the "set and not the same as the default" case James
8661
+ * asked the footer to surface. Provenance is derived from the pair, not
8662
+ * carried as a flag (James, #24018 review). When the thread follows the
8663
+ * default — or the server predates pins and sends no `agentModel` — the model
8664
+ * renders bare exactly as before.
8665
+ */
8666
+ function formatModelHint({ model, effort, agentModel }) {
8667
+ const effortPart = effort ? ` · ${effort}` : "";
8668
+ if (model === null || agentModel === null || agentModel === model) return `ctrl+p · ${model ?? "default"}${effortPart}`;
8669
+ return `ctrl+p · ${model} (thread) · agent default ${agentModel}${effortPart}`;
8642
8670
  }
8643
8671
 
8644
8672
  //#endregion
@@ -10665,8 +10693,11 @@ function ModelSwitcher({ models, initialSavedEfforts, floor, currentModel, curre
10665
10693
  agentId,
10666
10694
  model: model.id,
10667
10695
  thinkingLevel: effort
10668
- });
10669
- const { settled, pinUnsupported } = conversationId ? await withAgentFallback(() => rest.setConversationModel({
10696
+ }).then((settled) => ({
10697
+ ...settled,
10698
+ scope: "agent"
10699
+ }));
10700
+ const pick = conversationId ? await withAgentFallback(() => rest.setConversationModel({
10670
10701
  conversationId,
10671
10702
  agentId,
10672
10703
  model: model.id,
@@ -10676,9 +10707,10 @@ function ModelSwitcher({ models, initialSavedEfforts, floor, currentModel, curre
10676
10707
  pinUnsupported: false
10677
10708
  };
10678
10709
  onModelSelected({
10679
- model: settled.model ?? model.id,
10680
- effort: settled.thinkingLevel,
10681
- pinUnsupported
10710
+ model: pick.settled.model ?? model.id,
10711
+ effort: pick.settled.thinkingLevel,
10712
+ pinUnsupported: pick.pinUnsupported,
10713
+ scope: pick.pinUnsupported ? "agent" : pick.settled.scope
10682
10714
  });
10683
10715
  } catch (err) {
10684
10716
  failed(err);
@@ -10695,23 +10727,34 @@ function ModelSwitcher({ models, initialSavedEfforts, floor, currentModel, curre
10695
10727
  });
10696
10728
  if (model.id === currentModel) {
10697
10729
  let pinUnsupported = false;
10698
- if (conversationId) ({pinUnsupported} = await withAgentFallback(() => rest.setConversationModel({
10699
- conversationId,
10700
- agentId,
10701
- model: model.id,
10702
- thinkingLevel: level
10703
- }), () => rest.updateAgentEffort({
10704
- agentId,
10705
- thinkingLevel: level
10706
- })));
10707
- else await rest.updateAgentEffort({
10708
- agentId,
10709
- thinkingLevel: level
10710
- });
10730
+ let scope = null;
10731
+ if (conversationId) {
10732
+ const result = await withAgentFallback(() => rest.setConversationModel({
10733
+ conversationId,
10734
+ agentId,
10735
+ model: model.id,
10736
+ thinkingLevel: level
10737
+ }), () => rest.updateAgentEffort({
10738
+ agentId,
10739
+ thinkingLevel: level
10740
+ }).then((settled) => ({
10741
+ ...settled,
10742
+ scope: "agent"
10743
+ })));
10744
+ pinUnsupported = result.pinUnsupported;
10745
+ scope = result.settled.scope ?? null;
10746
+ } else {
10747
+ await rest.updateAgentEffort({
10748
+ agentId,
10749
+ thinkingLevel: level
10750
+ });
10751
+ scope = "agent";
10752
+ }
10711
10753
  onEffortSelected({
10712
10754
  effort: level,
10713
10755
  label: effortLabel(model, level),
10714
- pinUnsupported
10756
+ pinUnsupported,
10757
+ scope
10715
10758
  });
10716
10759
  return;
10717
10760
  }
@@ -14019,6 +14062,7 @@ function ChatScreen({ agent, conversation, attachRunId, parentConversationId })
14019
14062
  const [model, setModel] = useState(agent.model ?? null);
14020
14063
  const [effort, setEffort] = useState(agent.thinkingLevel ?? null);
14021
14064
  const [modelLocked, setModelLocked] = useState(agent.modelLocked ?? false);
14065
+ const [agentDefaultModel, setAgentDefaultModel] = useState(agent.model ?? null);
14022
14066
  const [cardPickerOpen, setCardPickerOpen] = useState(false);
14023
14067
  const [modelPickerView, setModelPickerView] = useState(null);
14024
14068
  const modelPickerOpen = modelPickerView !== null;
@@ -14488,6 +14532,7 @@ function ChatScreen({ agent, conversation, attachRunId, parentConversationId })
14488
14532
  setModel(event.model);
14489
14533
  setEffort(event.thinkingLevel ?? null);
14490
14534
  setModelLocked(event.modelLocked);
14535
+ setAgentDefaultModel(event.agentModel ?? null);
14491
14536
  return;
14492
14537
  }
14493
14538
  if (event.kind === "conversation" && event.title) setChatTitle(event.title);
@@ -15193,6 +15238,10 @@ function ChatScreen({ agent, conversation, attachRunId, parentConversationId })
15193
15238
  useStore.getState().showToast({ message: "agent runs can't be archived — ctrl+d in the picker deletes" });
15194
15239
  return;
15195
15240
  }
15241
+ if (!viewerIsParticipant(conversation)) {
15242
+ useStore.getState().showToast({ message: "you're not in this thread, so there's nothing to archive" });
15243
+ return;
15244
+ }
15196
15245
  if (runRef.current.kind !== "idle") {
15197
15246
  useStore.getState().showToast({ message: "finish or cancel the run first (ctrl+c)" });
15198
15247
  return;
@@ -15226,6 +15275,7 @@ function ChatScreen({ agent, conversation, attachRunId, parentConversationId })
15226
15275
  askPrompt,
15227
15276
  restartConfirm,
15228
15277
  agentRunConversation,
15278
+ conversation,
15229
15279
  conversationId,
15230
15280
  rest,
15231
15281
  goTo,
@@ -16100,7 +16150,11 @@ function ChatScreen({ agent, conversation, attachRunId, parentConversationId })
16100
16150
  cardVerb,
16101
16151
  nonWebChannel
16102
16152
  ]);
16103
- const modelHint = formatModelHint(model, effort);
16153
+ const modelHint = formatModelHint({
16154
+ model,
16155
+ effort,
16156
+ agentModel: agentDefaultModel
16157
+ });
16104
16158
  if (askPrompt) return /* @__PURE__ */ jsx(AskPicker, {
16105
16159
  questions: askPrompt.questions,
16106
16160
  onSubmit: (text) => {
@@ -16132,6 +16186,7 @@ function ChatScreen({ agent, conversation, attachRunId, parentConversationId })
16132
16186
  onModelSelected: (next) => {
16133
16187
  setModel(next.model);
16134
16188
  setEffort(next.effort);
16189
+ if (next.scope === "agent") setAgentDefaultModel(next.model);
16135
16190
  setModelPickerView(null);
16136
16191
  useStore.getState().showToast(next.pinUnsupported ? {
16137
16192
  variant: "warning",
@@ -160,7 +160,7 @@ function errorMessage(err) {
160
160
  * the commit time of the built tree is one monotonic clock they share.
161
161
  */
162
162
  function portalDaemonBuild() {
163
- return "1789577256";
163
+ return "1789677433";
164
164
  }
165
165
  /**
166
166
  * Whether a client carrying `mine` should replace a running daemon carrying
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { t as PortalClient } from "./client-B2QW5YW3.mjs";
3
+ import "./api-BFQ4PQDA.mjs";
4
+
5
+ export { PortalClient };
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { i as isRecord, n as isNewerBuild, r as portalDaemonBuild, t as PortalClient } from "./client-CNF1DFAQ.mjs";
2
+ import { i as isRecord, n as isNewerBuild, r as portalDaemonBuild, t as PortalClient } from "./client-B2QW5YW3.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,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import "./client-CNF1DFAQ.mjs";
2
+ import "./client-B2QW5YW3.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-D4B5LeNQ.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-BVkLmE9i.mjs";
6
6
 
7
7
  export { runPortalDaemon };
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import "./client-B2QW5YW3.mjs";
3
+ import "./tls-cert-Rua2oV7n.mjs";
4
+ import "./api-BFQ4PQDA.mjs";
5
+ import "./daemon-BVkLmE9i.mjs";
6
+ import { t as PortalDaemonClient } from "./daemon-client-DBxd1-Pa.mjs";
7
+
8
+ export { PortalDaemonClient };
@@ -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-D4B5LeNQ.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-BVkLmE9i.mjs";
3
3
  import { randomUUID } from "node:crypto";
4
4
  import { connect } from "node:net";
5
5
 
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { c as version$1 } from "./rest-si3NhA-L.mjs";
3
- import { E as getConfigPath } from "./print-DDI8g0HX.mjs";
2
+ import { c as version$1 } from "./rest-C7ahG6C2.mjs";
3
+ import { E as getConfigPath } from "./print-CYg-EpIt.mjs";
4
4
  import os from "node:os";
5
5
  import path from "node:path";
6
6
  import { err, ok } from "neverthrow";
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import "./rest-si3NhA-L.mjs";
3
- import { a as runPrint, i as resolveAgent, n as messageGet, o as toPrintError, r as readStdin, t as collectRunText } from "./print-DDI8g0HX.mjs";
2
+ import "./rest-C7ahG6C2.mjs";
3
+ import { a as runPrint, i as resolveAgent, n as messageGet, o as toPrintError, r as readStdin, t as collectRunText } from "./print-CYg-EpIt.mjs";
4
4
  import "./billing-blocked-D3l5kJlX.mjs";
5
5
 
6
6
  export { messageGet, readStdin, resolveAgent, runPrint };
@@ -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-si3NhA-L.mjs";
2
+ import { a as errorMessage, i as sendErrorMessage, o as isRecord, t as createRestClient } from "./rest-C7ahG6C2.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";
@@ -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-CNmM4aEa.mjs");
17
+ const { PortalClient } = await import("./client-DJ-k3tFu.mjs");
18
18
  const { defaultTlsCertSource } = await import("./tls-cert-BpCaD5AT.mjs");
19
19
  let signalConnected;
20
20
  const connected = new Promise((resolve) => {
@@ -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.24";
9
+ var version = "0.6.0-beta.26";
10
10
 
11
11
  //#endregion
12
12
  //#region src/chat/util.ts
@@ -303,11 +303,17 @@ function createRestClient({ appUrl, sessionToken, workspaceId }) {
303
303
  thinkingLevel: agent.thinkingLevel ?? null
304
304
  };
305
305
  },
306
- setConversationModel: async ({ conversationId, agentId, model, thinkingLevel }) => post(`/api/v1/conversations/${conversationId}/model`, {
307
- agentId,
308
- model,
309
- thinkingLevel
310
- }, conversationModelResponseSchema),
306
+ setConversationModel: async ({ conversationId, agentId, model, thinkingLevel }) => {
307
+ const settled = await post(`/api/v1/conversations/${conversationId}/model`, {
308
+ agentId,
309
+ model,
310
+ thinkingLevel
311
+ }, conversationModelResponseSchema);
312
+ return {
313
+ ...settled,
314
+ scope: settled.scope ?? null
315
+ };
316
+ },
311
317
  updateAgentEffort: async ({ agentId, thinkingLevel }) => {
312
318
  const { agent } = await patchAgent(agentId, { thinkingLevel });
313
319
  return { thinkingLevel: agent.thinkingLevel ?? null };
@@ -566,7 +572,8 @@ const freeFloorStateResponseSchema = z.object({ result: z.object({ data: z.objec
566
572
  }).nullable() }) });
567
573
  const conversationModelResponseSchema = z.object({
568
574
  model: z.string().nullable(),
569
- thinkingLevel: z.string().nullable()
575
+ thinkingLevel: z.string().nullable(),
576
+ scope: z.enum(["agent", "conversation"]).nullish()
570
577
  });
571
578
  const updateAgentResponseSchema = z.object({ agent: z.object({
572
579
  model: z.string().nullable().optional(),
@@ -600,6 +607,7 @@ const conversationSummarySchema = z.object({
600
607
  channel: z.string().nullable(),
601
608
  channelLabel: z.string().nullable(),
602
609
  viewerArchivedAt: z.string().nullable().optional(),
610
+ viewerParticipates: z.boolean().optional(),
603
611
  unread: z.boolean().optional(),
604
612
  agent: conversationAgentSchema,
605
613
  agents: z.array(conversationAgentSchema).optional()
@@ -736,7 +744,8 @@ const conversationStreamEventSchema = z.discriminatedUnion("kind", [
736
744
  id: z.string(),
737
745
  model: z.string().nullable(),
738
746
  modelLocked: z.boolean(),
739
- thinkingLevel: z.string().nullish()
747
+ thinkingLevel: z.string().nullish(),
748
+ agentModel: z.string().nullish()
740
749
  }),
741
750
  z.object({
742
751
  kind: z.literal("run"),
@@ -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-si3NhA-L.mjs";
2
+ import { i as sendErrorMessage, n as errorDetail, r as filenameFromContentDisposition, t as createRestClient } from "./rest-C7ahG6C2.mjs";
3
3
  import { t as HttpError } from "./http-error-BF2NZZE3.mjs";
4
4
  import "./billing-blocked-D3l5kJlX.mjs";
5
5
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skydive-cli",
3
- "version": "0.6.0-beta.24",
3
+ "version": "0.6.0-beta.26",
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.24",
75
- "skydive-cli-darwin-x64": "0.6.0-beta.24",
76
- "skydive-cli-linux-x64": "0.6.0-beta.24",
77
- "skydive-cli-linux-arm64": "0.6.0-beta.24"
74
+ "skydive-cli-darwin-arm64": "0.6.0-beta.26",
75
+ "skydive-cli-darwin-x64": "0.6.0-beta.26",
76
+ "skydive-cli-linux-x64": "0.6.0-beta.26",
77
+ "skydive-cli-linux-arm64": "0.6.0-beta.26"
78
78
  }
79
79
  }
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env node
2
- import { t as PortalClient } from "./client-CNF1DFAQ.mjs";
3
- import "./api-BFQ4PQDA.mjs";
4
-
5
- export { PortalClient };
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env node
2
- import "./client-CNF1DFAQ.mjs";
3
- import "./tls-cert-Rua2oV7n.mjs";
4
- import "./api-BFQ4PQDA.mjs";
5
- import "./daemon-D4B5LeNQ.mjs";
6
- import { t as PortalDaemonClient } from "./daemon-client-Eoo24bVH.mjs";
7
-
8
- export { PortalDaemonClient };