skydive-cli 0.6.0-beta.25 → 0.6.0-beta.27

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-DyrLMPnC.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-BjWK1R7z.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-cm5SdN8E.mjs";
2
+ import { c as version, s as name, t as createRestClient } from "./rest-DlIgk561.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-BlZzj7yy.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-CQYnyhzY.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-pKI_QTmT.mjs";
8
+ import { a as resolveMachineIdentity } from "./client-DC2ivbJN.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--k2fcWhI.mjs";
11
+ import { d as daemonPaths, i as queryDaemonStatus, n as ensureDaemonRunning, s as stopDaemon, u as PORTAL_DAEMON_FLAG } from "./daemon-CxlndJaI.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-KM9tlCQv.mjs");
1589
+ const { runChat } = await import("./boot-CzrgHtPt.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-C9wWXtly.mjs");
1619
+ const { connectMachineShare } = await import("./print-share-DU94NbI4.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-DxckoQq_.mjs");
1627
+ const { runPrint } = await import("./print-BcvDoSnU.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-KM9tlCQv.mjs");
2034
+ const { runChat } = await import("./boot-CzrgHtPt.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-DxckoQq_.mjs");
2118
+ const { runPrint, readStdin } = await import("./print-BcvDoSnU.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-C9wWXtly.mjs");
2148
+ const { connectMachineShare } = await import("./print-share-DU94NbI4.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-DxckoQq_.mjs");
2213
+ const { messageGet } = await import("./print-BcvDoSnU.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-KM9tlCQv.mjs");
2416
+ const { runWorkspacePicker } = await import("./boot-CzrgHtPt.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-hu2vyzDR.mjs");
2495
+ const { PortalDaemonClient } = await import("./daemon-client-Ilk1sDhY.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-D_Bz9P6h.mjs");
2853
- const { resolveAgent } = await import("./print-DxckoQq_.mjs");
2852
+ const { createRestClient } = await import("./rest-Cd88Ab8J.mjs");
2853
+ const { resolveAgent } = await import("./print-BcvDoSnU.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-D_Bz9P6h.mjs");
3125
- const { resolveAgent } = await import("./print-DxckoQq_.mjs");
3124
+ const { createRestClient } = await import("./rest-Cd88Ab8J.mjs");
3125
+ const { resolveAgent } = await import("./print-BcvDoSnU.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-C8z0gjiS.mjs");
4578
+ const { runPortalDaemon } = await import("./daemon-mUUYnDlu.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-DyrLMPnC.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-BjWK1R7z.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-cm5SdN8E.mjs";
2
+ import { a as errorMessage, i as sendErrorMessage, n as errorDetail, o as isRecord, t as createRestClient } from "./rest-DlIgk561.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-BlZzj7yy.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-CQYnyhzY.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-pKI_QTmT.mjs";
7
+ import { t as PortalClient } from "./client-DC2ivbJN.mjs";
8
8
  import { t as defaultTlsCertSource } from "./tls-cert-Rua2oV7n.mjs";
9
9
  import "./api-BFQ4PQDA.mjs";
10
- import "./daemon--k2fcWhI.mjs";
10
+ import "./daemon-CxlndJaI.mjs";
11
11
  import { t as SandboxStream } from "./client-l6orYfqq.mjs";
12
- import { t as PortalDaemonClient } from "./daemon-client-BxNqcNzX.mjs";
12
+ import { t as PortalDaemonClient } from "./daemon-client-DQXDHGUD.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";
@@ -8654,9 +8654,19 @@ function formatChatFooterStatus({ runKind, ctrlCArmed, portalOpen, hasPendingSte
8654
8654
  * appended only once something has chosen one — an agent with no stored level
8655
8655
  * runs at the platform default, and naming a level it never picked would be a
8656
8656
  * claim the footer can't back.
8657
- */
8658
- function formatModelHint(model, effort) {
8659
- 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}`;
8660
8670
  }
8661
8671
 
8662
8672
  //#endregion
@@ -10683,8 +10693,11 @@ function ModelSwitcher({ models, initialSavedEfforts, floor, currentModel, curre
10683
10693
  agentId,
10684
10694
  model: model.id,
10685
10695
  thinkingLevel: effort
10686
- });
10687
- 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({
10688
10701
  conversationId,
10689
10702
  agentId,
10690
10703
  model: model.id,
@@ -10694,9 +10707,10 @@ function ModelSwitcher({ models, initialSavedEfforts, floor, currentModel, curre
10694
10707
  pinUnsupported: false
10695
10708
  };
10696
10709
  onModelSelected({
10697
- model: settled.model ?? model.id,
10698
- effort: settled.thinkingLevel,
10699
- 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
10700
10714
  });
10701
10715
  } catch (err) {
10702
10716
  failed(err);
@@ -10713,23 +10727,34 @@ function ModelSwitcher({ models, initialSavedEfforts, floor, currentModel, curre
10713
10727
  });
10714
10728
  if (model.id === currentModel) {
10715
10729
  let pinUnsupported = false;
10716
- if (conversationId) ({pinUnsupported} = await withAgentFallback(() => rest.setConversationModel({
10717
- conversationId,
10718
- agentId,
10719
- model: model.id,
10720
- thinkingLevel: level
10721
- }), () => rest.updateAgentEffort({
10722
- agentId,
10723
- thinkingLevel: level
10724
- })));
10725
- else await rest.updateAgentEffort({
10726
- agentId,
10727
- thinkingLevel: level
10728
- });
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
+ }
10729
10753
  onEffortSelected({
10730
10754
  effort: level,
10731
10755
  label: effortLabel(model, level),
10732
- pinUnsupported
10756
+ pinUnsupported,
10757
+ scope
10733
10758
  });
10734
10759
  return;
10735
10760
  }
@@ -14037,6 +14062,7 @@ function ChatScreen({ agent, conversation, attachRunId, parentConversationId })
14037
14062
  const [model, setModel] = useState(agent.model ?? null);
14038
14063
  const [effort, setEffort] = useState(agent.thinkingLevel ?? null);
14039
14064
  const [modelLocked, setModelLocked] = useState(agent.modelLocked ?? false);
14065
+ const [agentDefaultModel, setAgentDefaultModel] = useState(agent.model ?? null);
14040
14066
  const [cardPickerOpen, setCardPickerOpen] = useState(false);
14041
14067
  const [modelPickerView, setModelPickerView] = useState(null);
14042
14068
  const modelPickerOpen = modelPickerView !== null;
@@ -14506,6 +14532,7 @@ function ChatScreen({ agent, conversation, attachRunId, parentConversationId })
14506
14532
  setModel(event.model);
14507
14533
  setEffort(event.thinkingLevel ?? null);
14508
14534
  setModelLocked(event.modelLocked);
14535
+ setAgentDefaultModel(event.agentModel ?? null);
14509
14536
  return;
14510
14537
  }
14511
14538
  if (event.kind === "conversation" && event.title) setChatTitle(event.title);
@@ -16123,7 +16150,11 @@ function ChatScreen({ agent, conversation, attachRunId, parentConversationId })
16123
16150
  cardVerb,
16124
16151
  nonWebChannel
16125
16152
  ]);
16126
- const modelHint = formatModelHint(model, effort);
16153
+ const modelHint = formatModelHint({
16154
+ model,
16155
+ effort,
16156
+ agentModel: agentDefaultModel
16157
+ });
16127
16158
  if (askPrompt) return /* @__PURE__ */ jsx(AskPicker, {
16128
16159
  questions: askPrompt.questions,
16129
16160
  onSubmit: (text) => {
@@ -16155,6 +16186,7 @@ function ChatScreen({ agent, conversation, attachRunId, parentConversationId })
16155
16186
  onModelSelected: (next) => {
16156
16187
  setModel(next.model);
16157
16188
  setEffort(next.effort);
16189
+ if (next.scope === "agent") setAgentDefaultModel(next.model);
16158
16190
  setModelPickerView(null);
16159
16191
  useStore.getState().showToast(next.pinUnsupported ? {
16160
16192
  variant: "warning",
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { t as PortalClient } from "./client-DC2ivbJN.mjs";
3
+ import "./api-BFQ4PQDA.mjs";
4
+
5
+ export { PortalClient };
@@ -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 "1789594940";
163
+ return "1789697077";
164
164
  }
165
165
  /**
166
166
  * Whether a client carrying `mine` should replace a running daemon carrying
@@ -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-pKI_QTmT.mjs";
2
+ import { i as isRecord, n as isNewerBuild, r as portalDaemonBuild, t as PortalClient } from "./client-DC2ivbJN.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";
@@ -73,17 +73,37 @@ function canonicalPortalAppUrl(appUrl) {
73
73
  * every alias of one deployment (see {@link canonicalPortalAppUrl}) shares
74
74
  * one. Kept under the OS temp dir because Unix socket paths are
75
75
  * length-limited (~104 bytes on macOS).
76
+ *
77
+ * Darwin `sockaddr_un.sun_path` is 104 bytes including NUL (103 usable).
78
+ * `os.tmpdir()` on macOS is `$TMPDIR` (`/var/folders/<id>/T`, often ~50
79
+ * chars). Adding `skydive-portal-<user>-<hash>/daemon.sock` overruns that
80
+ * cap: bind() fails, the sidecar handshake still reports the long path, and
81
+ * connect() returns ENOENT (or Go's "path must be shorter than SUN_LEN").
82
+ * Stay in `os.tmpdir()` (do not relocate to `/tmp`) and shorten the leaf
83
+ * when the composed path would blow the cap. Windows named pipes have no
84
+ * sun_path, so they keep the long leaf.
76
85
  */
86
+ const SUN_PATH_MAX = 103;
77
87
  function daemonPaths(appUrl) {
88
+ const parent = os.tmpdir();
78
89
  const user = safeSegment(os.userInfo().username || "user");
79
90
  const app = createHash("sha256").update(canonicalPortalAppUrl(appUrl)).digest("hex").slice(0, 12);
80
- const dir = path.join(os.tmpdir(), `skydive-portal-${user}-${app}`);
81
- return {
91
+ const dir = path.join(parent, `skydive-portal-${user}-${app}`);
92
+ const paths = {
82
93
  dir,
83
94
  socketPath: path.join(dir, "daemon.sock"),
84
95
  statePath: path.join(dir, "state.json"),
85
96
  logPath: path.join(dir, "daemon.log")
86
97
  };
98
+ if (process.platform === "win32" || Buffer.byteLength(paths.socketPath) <= SUN_PATH_MAX) return paths;
99
+ const short = createHash("sha256").update(`${os.userInfo().username || "user"}\0${canonicalPortalAppUrl(appUrl)}`).digest("hex").slice(0, 12);
100
+ const shortDir = path.join(parent, `skydive-p-${short}`);
101
+ return {
102
+ dir: shortDir,
103
+ socketPath: path.join(shortDir, "d.sock"),
104
+ statePath: path.join(shortDir, "state.json"),
105
+ logPath: path.join(shortDir, "daemon.log")
106
+ };
87
107
  }
88
108
  function safeSegment(value) {
89
109
  return value.replace(/[^a-zA-Z0-9_-]/g, "").slice(0, 24) || "user";
@@ -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--k2fcWhI.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-CxlndJaI.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-DC2ivbJN.mjs";
3
+ import "./tls-cert-Rua2oV7n.mjs";
4
+ import "./api-BFQ4PQDA.mjs";
5
+ import "./daemon-CxlndJaI.mjs";
6
+ import { t as PortalDaemonClient } from "./daemon-client-DQXDHGUD.mjs";
7
+
8
+ export { PortalDaemonClient };
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import "./client-pKI_QTmT.mjs";
2
+ import "./client-DC2ivbJN.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--k2fcWhI.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-CxlndJaI.mjs";
6
6
 
7
7
  export { runPortalDaemon };
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { c as version$1 } from "./rest-DyrLMPnC.mjs";
3
- import { E as getConfigPath } from "./print-BjWK1R7z.mjs";
2
+ import { c as version$1 } from "./rest-DlIgk561.mjs";
3
+ import { E as getConfigPath } from "./print-BlZzj7yy.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-DyrLMPnC.mjs";
3
- import { a as runPrint, i as resolveAgent, n as messageGet, o as toPrintError, r as readStdin, t as collectRunText } from "./print-BjWK1R7z.mjs";
2
+ import "./rest-DlIgk561.mjs";
3
+ import { a as runPrint, i as resolveAgent, n as messageGet, o as toPrintError, r as readStdin, t as collectRunText } from "./print-BlZzj7yy.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-DyrLMPnC.mjs";
2
+ import { a as errorMessage, i as sendErrorMessage, o as isRecord, t as createRestClient } from "./rest-DlIgk561.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-LsfcGY1X.mjs");
17
+ const { PortalClient } = await import("./client-BbBxcmay.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-DyrLMPnC.mjs";
2
+ import { i as sendErrorMessage, n as errorDetail, r as filenameFromContentDisposition, t as createRestClient } from "./rest-DlIgk561.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.25";
9
+ var version = "0.6.0-beta.27";
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(),
@@ -737,7 +744,8 @@ const conversationStreamEventSchema = z.discriminatedUnion("kind", [
737
744
  id: z.string(),
738
745
  model: z.string().nullable(),
739
746
  modelLocked: z.boolean(),
740
- thinkingLevel: z.string().nullish()
747
+ thinkingLevel: z.string().nullish(),
748
+ agentModel: z.string().nullish()
741
749
  }),
742
750
  z.object({
743
751
  kind: z.literal("run"),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skydive-cli",
3
- "version": "0.6.0-beta.25",
3
+ "version": "0.6.0-beta.27",
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.25",
75
- "skydive-cli-darwin-x64": "0.6.0-beta.25",
76
- "skydive-cli-linux-x64": "0.6.0-beta.25",
77
- "skydive-cli-linux-arm64": "0.6.0-beta.25"
74
+ "skydive-cli-darwin-arm64": "0.6.0-beta.27",
75
+ "skydive-cli-darwin-x64": "0.6.0-beta.27",
76
+ "skydive-cli-linux-x64": "0.6.0-beta.27",
77
+ "skydive-cli-linux-arm64": "0.6.0-beta.27"
78
78
  }
79
79
  }
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env node
2
- import { t as PortalClient } from "./client-pKI_QTmT.mjs";
3
- import "./api-BFQ4PQDA.mjs";
4
-
5
- export { PortalClient };
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env node
2
- import "./client-pKI_QTmT.mjs";
3
- import "./tls-cert-Rua2oV7n.mjs";
4
- import "./api-BFQ4PQDA.mjs";
5
- import "./daemon--k2fcWhI.mjs";
6
- import { t as PortalDaemonClient } from "./daemon-client-BxNqcNzX.mjs";
7
-
8
- export { PortalDaemonClient };