localclawd 1.0.8 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli.mjs +427 -191
  2. package/package.json +1 -1
package/dist/cli.mjs CHANGED
@@ -89253,7 +89253,7 @@ var init_isEqual = __esm(() => {
89253
89253
 
89254
89254
  // src/utils/userAgent.ts
89255
89255
  function getClaudeCodeUserAgent() {
89256
- return `claude-code/${"1.0.8"}`;
89256
+ return `claude-code/${"1.1.0"}`;
89257
89257
  }
89258
89258
 
89259
89259
  // src/utils/workloadContext.ts
@@ -89275,7 +89275,7 @@ function getUserAgent() {
89275
89275
  const clientApp = process.env.CLAUDE_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.CLAUDE_AGENT_SDK_CLIENT_APP}` : "";
89276
89276
  const workload = getWorkload();
89277
89277
  const workloadSuffix = workload ? `, workload/${workload}` : "";
89278
- return `claude-cli/${"1.0.8"} (${process.env.USER_TYPE}, ${process.env.CLAUDE_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
89278
+ return `claude-cli/${"1.1.0"} (${process.env.USER_TYPE}, ${process.env.CLAUDE_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
89279
89279
  }
89280
89280
  function getMCPUserAgent() {
89281
89281
  const parts = [];
@@ -89289,7 +89289,7 @@ function getMCPUserAgent() {
89289
89289
  parts.push(`client-app/${process.env.CLAUDE_AGENT_SDK_CLIENT_APP}`);
89290
89290
  }
89291
89291
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
89292
- return `claude-code/${"1.0.8"}${suffix}`;
89292
+ return `claude-code/${"1.1.0"}${suffix}`;
89293
89293
  }
89294
89294
  function getWebFetchUserAgent() {
89295
89295
  return `Claude-User (${getClaudeCodeUserAgent()}; +https://support.anthropic.com/)`;
@@ -99110,7 +99110,7 @@ function getAttributionHeader(fingerprint) {
99110
99110
  if (!isAttributionHeaderEnabled()) {
99111
99111
  return "";
99112
99112
  }
99113
- const version = `${"1.0.8"}.${fingerprint}`;
99113
+ const version = `${"1.1.0"}.${fingerprint}`;
99114
99114
  const entrypoint = process.env.CLAUDE_CODE_ENTRYPOINT ?? "unknown";
99115
99115
  const cch = "";
99116
99116
  const workload = getWorkload();
@@ -132657,7 +132657,7 @@ var init_metadata = __esm(() => {
132657
132657
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
132658
132658
  WHITESPACE_REGEX = /\s+/;
132659
132659
  getVersionBase = memoize_default(() => {
132660
- const match = "1.0.8".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
132660
+ const match = "1.1.0".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
132661
132661
  return match ? match[0] : undefined;
132662
132662
  });
132663
132663
  buildEnvContext = memoize_default(async () => {
@@ -132697,9 +132697,9 @@ var init_metadata = __esm(() => {
132697
132697
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
132698
132698
  isClaudeCodeAction: isEnvTruthy(process.env.CLAUDE_CODE_ACTION),
132699
132699
  isClaudeAiAuth: isClaudeAISubscriber(),
132700
- version: "1.0.8",
132700
+ version: "1.1.0",
132701
132701
  versionBase: getVersionBase(),
132702
- buildTime: "2026-04-05T20:46:26.460Z",
132702
+ buildTime: "2026-04-05T21:11:48.193Z",
132703
132703
  deploymentEnvironment: env4.detectDeploymentEnvironment(),
132704
132704
  ...isEnvTruthy(process.env.GITHUB_ACTIONS) && {
132705
132705
  githubEventName: process.env.GITHUB_EVENT_NAME,
@@ -197286,7 +197286,7 @@ function getTelemetryAttributes() {
197286
197286
  attributes["session.id"] = sessionId;
197287
197287
  }
197288
197288
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
197289
- attributes["app.version"] = "1.0.8";
197289
+ attributes["app.version"] = "1.1.0";
197290
197290
  }
197291
197291
  const oauthAccount = getOauthAccountInfo();
197292
197292
  if (oauthAccount) {
@@ -229347,7 +229347,7 @@ function getInstallationEnv() {
229347
229347
  return;
229348
229348
  }
229349
229349
  function getClaudeCodeVersion() {
229350
- return "1.0.8";
229350
+ return "1.1.0";
229351
229351
  }
229352
229352
  async function getInstalledVSCodeExtensionVersion(command) {
229353
229353
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -234949,7 +234949,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
234949
234949
  const client4 = new Client({
234950
234950
  name: "claude-code",
234951
234951
  title: "Claude Code",
234952
- version: "1.0.8",
234952
+ version: "1.1.0",
234953
234953
  description: "Anthropic's agentic coding tool",
234954
234954
  websiteUrl: PRODUCT_URL
234955
234955
  }, {
@@ -235302,7 +235302,7 @@ var init_client9 = __esm(() => {
235302
235302
  const client4 = new Client({
235303
235303
  name: "claude-code",
235304
235304
  title: "Claude Code",
235305
- version: "1.0.8",
235305
+ version: "1.1.0",
235306
235306
  description: "Anthropic's agentic coding tool",
235307
235307
  websiteUrl: PRODUCT_URL
235308
235308
  }, {
@@ -258493,7 +258493,7 @@ var init_user = __esm(() => {
258493
258493
  deviceId,
258494
258494
  sessionId: getSessionId(),
258495
258495
  email: getEmail(),
258496
- appVersion: "1.0.8",
258496
+ appVersion: "1.1.0",
258497
258497
  platform: getHostPlatformForAnalytics(),
258498
258498
  organizationUuid,
258499
258499
  accountUuid,
@@ -259817,7 +259817,7 @@ async function initializeBetaTracing(resource) {
259817
259817
  });
259818
259818
  logs.setGlobalLoggerProvider(loggerProvider);
259819
259819
  setLoggerProvider(loggerProvider);
259820
- const eventLogger = logs.getLogger("com.anthropic.claude_code.events", "1.0.8");
259820
+ const eventLogger = logs.getLogger("com.anthropic.claude_code.events", "1.1.0");
259821
259821
  setEventLogger(eventLogger);
259822
259822
  process.on("beforeExit", async () => {
259823
259823
  await loggerProvider?.forceFlush();
@@ -259857,7 +259857,7 @@ async function initializeTelemetry() {
259857
259857
  const platform3 = getPlatform();
259858
259858
  const baseAttributes = {
259859
259859
  [ATTR_SERVICE_NAME5]: "claude-code",
259860
- [ATTR_SERVICE_VERSION5]: "1.0.8"
259860
+ [ATTR_SERVICE_VERSION5]: "1.1.0"
259861
259861
  };
259862
259862
  if (platform3 === "wsl") {
259863
259863
  const wslVersion = getWslVersion();
@@ -259902,7 +259902,7 @@ async function initializeTelemetry() {
259902
259902
  } catch {}
259903
259903
  };
259904
259904
  registerCleanup(shutdownTelemetry2);
259905
- return meterProvider2.getMeter("com.anthropic.claude_code", "1.0.8");
259905
+ return meterProvider2.getMeter("com.anthropic.claude_code", "1.1.0");
259906
259906
  }
259907
259907
  const meterProvider = new MeterProvider5({
259908
259908
  resource,
@@ -259922,7 +259922,7 @@ async function initializeTelemetry() {
259922
259922
  });
259923
259923
  logs.setGlobalLoggerProvider(loggerProvider);
259924
259924
  setLoggerProvider(loggerProvider);
259925
- const eventLogger = logs.getLogger("com.anthropic.claude_code.events", "1.0.8");
259925
+ const eventLogger = logs.getLogger("com.anthropic.claude_code.events", "1.1.0");
259926
259926
  setEventLogger(eventLogger);
259927
259927
  logForDebugging("[3P telemetry] Event logger set successfully");
259928
259928
  process.on("beforeExit", async () => {
@@ -259984,7 +259984,7 @@ Current timeout: ${timeoutMs}ms
259984
259984
  }
259985
259985
  };
259986
259986
  registerCleanup(shutdownTelemetry);
259987
- return meterProvider.getMeter("com.anthropic.claude_code", "1.0.8");
259987
+ return meterProvider.getMeter("com.anthropic.claude_code", "1.1.0");
259988
259988
  }
259989
259989
  async function flushTelemetry() {
259990
259990
  const meterProvider = getMeterProvider();
@@ -261207,7 +261207,7 @@ function detectLinuxGlobPatternWarnings() {
261207
261207
  }
261208
261208
  async function getDoctorDiagnostic() {
261209
261209
  const installationType = await getCurrentInstallationType();
261210
- const version = typeof MACRO !== "undefined" ? "1.0.8" : "unknown";
261210
+ const version = typeof MACRO !== "undefined" ? "1.1.0" : "unknown";
261211
261211
  const installationPath = await getInstallationPath();
261212
261212
  const invokedBinary = getInvokedBinary();
261213
261213
  const multipleInstallations = await detectMultipleInstallations();
@@ -262148,8 +262148,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
262148
262148
  const maxVersion = await getMaxVersion();
262149
262149
  if (maxVersion && gt(version, maxVersion)) {
262150
262150
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version} to ${maxVersion}`);
262151
- if (gte("1.0.8", maxVersion)) {
262152
- logForDebugging(`Native installer: current version ${"1.0.8"} is already at or above maxVersion ${maxVersion}, skipping update`);
262151
+ if (gte("1.1.0", maxVersion)) {
262152
+ logForDebugging(`Native installer: current version ${"1.1.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
262153
262153
  logEvent("tengu_native_update_skipped_max_version", {
262154
262154
  latency_ms: Date.now() - startTime,
262155
262155
  max_version: maxVersion,
@@ -262160,7 +262160,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
262160
262160
  version = maxVersion;
262161
262161
  }
262162
262162
  }
262163
- if (!forceReinstall && version === "1.0.8" && await versionIsAvailable(version) && await isPossibleLocalClawdBinary(executablePath)) {
262163
+ if (!forceReinstall && version === "1.1.0" && await versionIsAvailable(version) && await isPossibleLocalClawdBinary(executablePath)) {
262164
262164
  logForDebugging(`Found ${version} at ${executablePath}, skipping install`);
262165
262165
  logEvent("tengu_native_update_complete", {
262166
262166
  latency_ms: Date.now() - startTime,
@@ -333236,7 +333236,7 @@ function getAnthropicEnvMetadata() {
333236
333236
  function getBuildAgeMinutes() {
333237
333237
  if (false)
333238
333238
  ;
333239
- const buildTime = new Date("2026-04-05T20:46:26.460Z").getTime();
333239
+ const buildTime = new Date("2026-04-05T21:11:48.193Z").getTime();
333240
333240
  if (isNaN(buildTime))
333241
333241
  return;
333242
333242
  return Math.floor((Date.now() - buildTime) / 60000);
@@ -356944,7 +356944,7 @@ function Feedback({
356944
356944
  platform: env4.platform,
356945
356945
  gitRepo: envInfo.isGit,
356946
356946
  terminal: env4.terminal,
356947
- version: "1.0.8",
356947
+ version: "1.1.0",
356948
356948
  transcript: normalizeMessagesForAPI(messages),
356949
356949
  errors: sanitizedErrors,
356950
356950
  lastApiRequest: getLastAPIRequest(),
@@ -357136,7 +357136,7 @@ function Feedback({
357136
357136
  ", ",
357137
357137
  env4.terminal,
357138
357138
  ", v",
357139
- "1.0.8"
357139
+ "1.1.0"
357140
357140
  ]
357141
357141
  }, undefined, true, undefined, this)
357142
357142
  ]
@@ -357242,7 +357242,7 @@ ${sanitizedDescription}
357242
357242
  ` + `**Environment Info**
357243
357243
  ` + `- Platform: ${env4.platform}
357244
357244
  ` + `- Terminal: ${env4.terminal}
357245
- ` + `- Version: ${"1.0.8"}
357245
+ ` + `- Version: ${"1.1.0"}
357246
357246
  ` + `- Feedback ID: ${feedbackId}
357247
357247
  ` + `
357248
357248
  **Errors**
@@ -360355,7 +360355,7 @@ function buildPrimarySection() {
360355
360355
  }, undefined, false, undefined, this);
360356
360356
  return [{
360357
360357
  label: "Version",
360358
- value: "1.0.8"
360358
+ value: "1.1.0"
360359
360359
  }, {
360360
360360
  label: "Session name",
360361
360361
  value: nameValue
@@ -361729,9 +361729,13 @@ var init_ModelPicker = __esm(() => {
361729
361729
  });
361730
361730
 
361731
361731
  // src/utils/model/scanModels.ts
361732
- async function fetchWithTimeout2(url3, options = {}) {
361732
+ async function fetchWithTimeout2(url3, options = {}, timeoutMs = MODEL_SCAN_TIMEOUT_MS) {
361733
361733
  const controller = new AbortController;
361734
- const timer = setTimeout(() => controller.abort(), SCAN_TIMEOUT_MS);
361734
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
361735
+ const callerSignal = options.signal;
361736
+ if (callerSignal) {
361737
+ callerSignal.addEventListener("abort", () => controller.abort(), { once: true });
361738
+ }
361735
361739
  try {
361736
361740
  return await fetch(url3, { ...options, signal: controller.signal });
361737
361741
  } finally {
@@ -361748,13 +361752,14 @@ function buildHeaders5(apiKey) {
361748
361752
  function ollamaNativeBase(v1BaseUrl) {
361749
361753
  return v1BaseUrl.replace(/\/v1\/?$/, "");
361750
361754
  }
361751
- async function fetchAvailableModels(baseUrl, provider, apiKey) {
361755
+ async function fetchAvailableModels(baseUrl, provider, apiKey, signal) {
361752
361756
  const trimmed = baseUrl.replace(/\/$/, "");
361753
361757
  if (provider === "ollama") {
361754
361758
  const nativeBase = ollamaNativeBase(trimmed);
361755
361759
  try {
361756
361760
  const res = await fetchWithTimeout2(`${nativeBase}/api/tags`, {
361757
- headers: buildHeaders5(apiKey)
361761
+ headers: buildHeaders5(apiKey),
361762
+ signal
361758
361763
  });
361759
361764
  if (res.ok) {
361760
361765
  const json = await res.json();
@@ -361762,10 +361767,14 @@ async function fetchAvailableModels(baseUrl, provider, apiKey) {
361762
361767
  if (models.length > 0)
361763
361768
  return { ok: true, models };
361764
361769
  }
361765
- } catch {}
361770
+ } catch (err2) {
361771
+ if (signal?.aborted)
361772
+ return { ok: false, error: "Cancelled." };
361773
+ }
361766
361774
  try {
361767
361775
  const res = await fetchWithTimeout2(`${trimmed}/models`, {
361768
- headers: buildHeaders5(apiKey)
361776
+ headers: buildHeaders5(apiKey),
361777
+ signal
361769
361778
  });
361770
361779
  if (res.ok) {
361771
361780
  const json = await res.json();
@@ -361774,6 +361783,8 @@ async function fetchAvailableModels(baseUrl, provider, apiKey) {
361774
361783
  return { ok: true, models };
361775
361784
  }
361776
361785
  } catch (err2) {
361786
+ if (signal?.aborted)
361787
+ return { ok: false, error: "Cancelled." };
361777
361788
  const msg = err2 instanceof Error ? err2.message : String(err2);
361778
361789
  if (msg.includes("abort") || msg.includes("timeout")) {
361779
361790
  return { ok: false, error: `Timed out connecting to Ollama at ${nativeBase}. Is Ollama running?` };
@@ -361784,7 +361795,8 @@ async function fetchAvailableModels(baseUrl, provider, apiKey) {
361784
361795
  }
361785
361796
  try {
361786
361797
  const res = await fetchWithTimeout2(`${trimmed}/models`, {
361787
- headers: buildHeaders5(apiKey)
361798
+ headers: buildHeaders5(apiKey),
361799
+ signal
361788
361800
  });
361789
361801
  if (!res.ok) {
361790
361802
  const body = await res.text().catch(() => "");
@@ -361800,6 +361812,8 @@ async function fetchAvailableModels(baseUrl, provider, apiKey) {
361800
361812
  }
361801
361813
  return { ok: true, models };
361802
361814
  } catch (err2) {
361815
+ if (signal?.aborted)
361816
+ return { ok: false, error: "Cancelled." };
361803
361817
  const msg = err2 instanceof Error ? err2.message : String(err2);
361804
361818
  if (msg.includes("abort") || msg.includes("timeout")) {
361805
361819
  return { ok: false, error: `Timed out connecting to ${trimmed}. Is the server running?` };
@@ -361807,7 +361821,65 @@ async function fetchAvailableModels(baseUrl, provider, apiKey) {
361807
361821
  return { ok: false, error: `Could not reach ${trimmed}: ${msg}` };
361808
361822
  }
361809
361823
  }
361810
- var SCAN_TIMEOUT_MS = 5000;
361824
+ async function probeVllmEndpoint(url3, parentSignal) {
361825
+ if (parentSignal.aborted)
361826
+ return null;
361827
+ try {
361828
+ const controller = new AbortController;
361829
+ const timer = setTimeout(() => controller.abort(), NETWORK_PROBE_TIMEOUT_MS);
361830
+ const onParentAbort = () => controller.abort();
361831
+ parentSignal.addEventListener("abort", onParentAbort, { once: true });
361832
+ let res;
361833
+ try {
361834
+ res = await fetch(`${url3}/models`, { signal: controller.signal });
361835
+ } finally {
361836
+ clearTimeout(timer);
361837
+ parentSignal.removeEventListener("abort", onParentAbort);
361838
+ }
361839
+ if (!res.ok)
361840
+ return null;
361841
+ const json = await res.json();
361842
+ const models = (json.data ?? []).map((m2) => m2.id).filter(Boolean);
361843
+ return models.length > 0 ? models : null;
361844
+ } catch {
361845
+ return null;
361846
+ }
361847
+ }
361848
+ async function scanLocalNetworkForVllm(subnet = "192.168.1", abortSignal, onProgress) {
361849
+ const found = [];
361850
+ const tasks = [];
361851
+ for (let host = 1;host <= 254; host++) {
361852
+ for (const port of VLLM_PORTS) {
361853
+ tasks.push({ host, port });
361854
+ }
361855
+ }
361856
+ const total = tasks.length;
361857
+ let scanned = 0;
361858
+ let taskIdx = 0;
361859
+ async function worker() {
361860
+ while (taskIdx < tasks.length) {
361861
+ if (abortSignal.aborted)
361862
+ return;
361863
+ const task = tasks[taskIdx++];
361864
+ const url3 = `http://${subnet}.${task.host}:${task.port}/v1`;
361865
+ const models = await probeVllmEndpoint(url3, abortSignal);
361866
+ if (abortSignal.aborted)
361867
+ return;
361868
+ scanned++;
361869
+ if (models) {
361870
+ found.push({ url: url3, models });
361871
+ }
361872
+ onProgress?.({ scanned, total, found: found.length });
361873
+ }
361874
+ }
361875
+ const workers = Array.from({ length: NETWORK_CONCURRENCY }, () => worker());
361876
+ await Promise.all(workers);
361877
+ return found;
361878
+ }
361879
+ var MODEL_SCAN_TIMEOUT_MS = 5000, NETWORK_PROBE_TIMEOUT_MS = 600, NETWORK_CONCURRENCY = 30, VLLM_PORTS;
361880
+ var init_scanModels = __esm(() => {
361881
+ VLLM_PORTS = [8000, 8080, 4000, 5000, 1234, 3000, 7860, 8888];
361882
+ });
361811
361883
 
361812
361884
  // src/components/LocalBackendSetup.tsx
361813
361885
  var exports_LocalBackendSetup = {};
@@ -361818,21 +361890,21 @@ function getProviderGuidance(provider) {
361818
361890
  switch (provider) {
361819
361891
  case "vllm":
361820
361892
  return {
361821
- baseUrl: "Use the URL for your local or remote vLLM server. Press Enter to keep the suggested /v1 endpoint.",
361822
- model: "Select a model discovered from your vLLM server, or type a name if you want to override.",
361823
- apiKey: "Leave blank for local servers without auth, or paste the gateway token if your deployment requires one."
361893
+ baseUrl: "Confirm or edit the vLLM server URL. Enter to accept, Esc to go back.",
361894
+ model: "Select a model discovered from your vLLM server, or type a name to override.",
361895
+ apiKey: "Leave blank for local servers without auth, or paste the gateway token if required."
361824
361896
  };
361825
361897
  case "ollama":
361826
361898
  return {
361827
- baseUrl: "Use your Ollama OpenAI-compatible endpoint. The default local address works for standard Ollama setups.",
361828
- model: "Select a model discovered from your Ollama server, or type a name if you want to override.",
361829
- apiKey: "Press Enter to keep the default local Ollama token, or replace it if your proxy expects a different value."
361899
+ baseUrl: "Confirm the Ollama endpoint. The default works for standard local setups.",
361900
+ model: "Select a model discovered from your Ollama server, or type a name to override.",
361901
+ apiKey: "Press Enter to keep the default Ollama token, or replace it if your proxy expects a different value."
361830
361902
  };
361831
361903
  case "openai":
361832
361904
  return {
361833
- baseUrl: "Use the API base URL for OpenAI or any compatible hosted gateway. Press Enter to keep the suggested default.",
361834
- model: "Enter the exact hosted model ID your provider expects, such as gpt-4.1-mini or a gateway-specific alias.",
361835
- apiKey: "Paste the API key for your hosted provider. Leave blank only if your gateway is intentionally unauthenticated."
361905
+ baseUrl: "Use the API base URL for OpenAI or any compatible hosted gateway.",
361906
+ model: "Enter the exact model ID your provider expects, such as gpt-4.1-mini.",
361907
+ apiKey: "Paste the API key for your hosted provider."
361836
361908
  };
361837
361909
  }
361838
361910
  }
@@ -361854,10 +361926,71 @@ function LocalBackendSetup({
361854
361926
  const [error5, setError] = import_react99.useState(null);
361855
361927
  const [availableModels, setAvailableModels] = import_react99.useState([]);
361856
361928
  const [scanError, setScanError] = import_react99.useState(null);
361929
+ const [networkProgress, setNetworkProgress] = import_react99.useState(null);
361930
+ const [discoveredEndpoints, setDiscoveredEndpoints] = import_react99.useState([]);
361931
+ const networkAbortRef = import_react99.useRef(null);
361932
+ const modelScanAbortRef = import_react99.useRef(null);
361933
+ const discoveredSnapshotRef = import_react99.useRef([]);
361934
+ import_react99.useEffect(() => {
361935
+ return () => {
361936
+ networkAbortRef.current?.abort();
361937
+ modelScanAbortRef.current?.abort();
361938
+ };
361939
+ }, []);
361857
361940
  import_react99.useEffect(() => {
361858
361941
  const nextValue = step === "baseUrl" ? baseUrl : step === "model" ? model : apiKey;
361859
361942
  setCursorOffset(nextValue.length);
361860
361943
  }, [step, baseUrl, model, apiKey]);
361944
+ use_input_default((_input, key) => {
361945
+ if (step === "networkScan") {
361946
+ if (key.escape || key.return) {
361947
+ networkAbortRef.current?.abort();
361948
+ setDiscoveredEndpoints(discoveredSnapshotRef.current);
361949
+ setStep("selectEndpoint");
361950
+ }
361951
+ } else if (step === "scanningModels") {
361952
+ if (key.escape) {
361953
+ modelScanAbortRef.current?.abort();
361954
+ goBack();
361955
+ } else if (key.return) {
361956
+ modelScanAbortRef.current?.abort();
361957
+ setScanError("Model scan skipped. Enter the model name manually.");
361958
+ setAvailableModels([]);
361959
+ setStep("model");
361960
+ }
361961
+ }
361962
+ }, { isActive: step === "networkScan" || step === "scanningModels" });
361963
+ function goBack() {
361964
+ setError(null);
361965
+ switch (step) {
361966
+ case "provider":
361967
+ onCancel?.();
361968
+ break;
361969
+ case "networkScan":
361970
+ networkAbortRef.current?.abort();
361971
+ setStep("provider");
361972
+ break;
361973
+ case "selectEndpoint":
361974
+ setStep("provider");
361975
+ break;
361976
+ case "baseUrl":
361977
+ setStep(provider === "vllm" ? "selectEndpoint" : "provider");
361978
+ break;
361979
+ case "scanningModels":
361980
+ modelScanAbortRef.current?.abort();
361981
+ setStep("baseUrl");
361982
+ break;
361983
+ case "model":
361984
+ setStep("baseUrl");
361985
+ break;
361986
+ case "apiKey":
361987
+ setStep("model");
361988
+ break;
361989
+ case "saveScope":
361990
+ setStep("apiKey");
361991
+ break;
361992
+ }
361993
+ }
361861
361994
  function applyProvider(nextProvider) {
361862
361995
  const defaults2 = getDefaultLocalLLMConfig(nextProvider);
361863
361996
  setProvider(nextProvider);
@@ -361867,7 +362000,47 @@ function LocalBackendSetup({
361867
362000
  setError(null);
361868
362001
  setScanError(null);
361869
362002
  setAvailableModels([]);
361870
- setStep("baseUrl");
362003
+ setDiscoveredEndpoints([]);
362004
+ if (nextProvider === "vllm") {
362005
+ startNetworkScan(defaults2.baseUrl);
362006
+ } else {
362007
+ setStep("baseUrl");
362008
+ }
362009
+ }
362010
+ function startNetworkScan(defaultUrl) {
362011
+ networkAbortRef.current?.abort();
362012
+ const abort = new AbortController;
362013
+ networkAbortRef.current = abort;
362014
+ discoveredSnapshotRef.current = [];
362015
+ setDiscoveredEndpoints([]);
362016
+ setNetworkProgress(null);
362017
+ setStep("networkScan");
362018
+ scanLocalNetworkForVllm("192.168.1", abort.signal, (progress) => {
362019
+ if (abort.signal.aborted)
362020
+ return;
362021
+ discoveredSnapshotRef.current = [...discoveredSnapshotRef.current];
362022
+ setNetworkProgress(progress);
362023
+ }).then((endpoints) => {
362024
+ if (abort.signal.aborted)
362025
+ return;
362026
+ discoveredSnapshotRef.current = endpoints;
362027
+ setDiscoveredEndpoints(endpoints);
362028
+ setStep("selectEndpoint");
362029
+ }).catch(() => {
362030
+ if (abort.signal.aborted)
362031
+ return;
362032
+ setDiscoveredEndpoints([]);
362033
+ setStep("selectEndpoint");
362034
+ });
362035
+ }
362036
+ function selectEndpoint(url3) {
362037
+ if (url3 === "__manual__") {
362038
+ setStep("baseUrl");
362039
+ return;
362040
+ }
362041
+ setBaseUrl(url3);
362042
+ setError(null);
362043
+ startModelScan(url3);
361871
362044
  }
361872
362045
  function submitBaseUrl(value) {
361873
362046
  const trimmed = value.trim();
@@ -361884,27 +362057,37 @@ function LocalBackendSetup({
361884
362057
  setBaseUrl(trimmed);
361885
362058
  setError(null);
361886
362059
  if (provider === "vllm" || provider === "ollama") {
361887
- setStep("scanningModels");
361888
- setScanError(null);
361889
- setAvailableModels([]);
361890
- fetchAvailableModels(trimmed, provider, apiKey).then((result) => {
361891
- if (result.ok) {
361892
- setAvailableModels(result.models);
361893
- setScanError(null);
361894
- } else {
361895
- setScanError(result.error);
361896
- setAvailableModels([]);
361897
- }
361898
- setStep("model");
361899
- }).catch((err2) => {
361900
- setScanError(`Unexpected error scanning models: ${err2 instanceof Error ? err2.message : String(err2)}`);
361901
- setAvailableModels([]);
361902
- setStep("model");
361903
- });
362060
+ startModelScan(trimmed);
361904
362061
  } else {
361905
362062
  setStep("model");
361906
362063
  }
361907
362064
  }
362065
+ function startModelScan(url3) {
362066
+ modelScanAbortRef.current?.abort();
362067
+ const abort = new AbortController;
362068
+ modelScanAbortRef.current = abort;
362069
+ setScanError(null);
362070
+ setAvailableModels([]);
362071
+ setStep("scanningModels");
362072
+ fetchAvailableModels(url3, provider, apiKey, abort.signal).then((result) => {
362073
+ if (abort.signal.aborted)
362074
+ return;
362075
+ if (result.ok) {
362076
+ setAvailableModels(result.models);
362077
+ setScanError(null);
362078
+ } else {
362079
+ setScanError(result.error);
362080
+ setAvailableModels([]);
362081
+ }
362082
+ setStep("model");
362083
+ }).catch((err2) => {
362084
+ if (abort.signal.aborted)
362085
+ return;
362086
+ setScanError(`Unexpected error: ${err2 instanceof Error ? err2.message : String(err2)}`);
362087
+ setAvailableModels([]);
362088
+ setStep("model");
362089
+ });
362090
+ }
361908
362091
  function submitModel(value) {
361909
362092
  const trimmed = value.trim();
361910
362093
  if (!trimmed) {
@@ -361916,32 +362099,32 @@ function LocalBackendSetup({
361916
362099
  setStep("apiKey");
361917
362100
  }
361918
362101
  function submitApiKey(value) {
361919
- const nextConfig = {
361920
- provider,
361921
- baseUrl,
361922
- model,
361923
- apiKey: value.trim()
361924
- };
362102
+ const nextConfig = { provider, baseUrl, model, apiKey: value.trim() };
361925
362103
  setApiKey(nextConfig.apiKey);
361926
362104
  setError(null);
361927
362105
  if (showSaveGloballyOption) {
361928
362106
  setStep("saveScope");
361929
362107
  return;
361930
362108
  }
361931
- onComplete(nextConfig, {
361932
- saveGlobally: true
361933
- });
362109
+ onComplete(nextConfig, { saveGlobally: true });
361934
362110
  }
361935
362111
  const providerLabel = getLocalLLMProviderLabel(provider);
361936
362112
  const baseUrlPlaceholder = getDefaultLocalLLMConfig(provider).baseUrl;
361937
362113
  const apiKeyPlaceholder = provider === "ollama" ? "ollama" : "Leave blank if your endpoint does not require auth";
361938
362114
  const guidance = getProviderGuidance(provider);
361939
362115
  const modelSelectOptions = availableModels.map((m2) => ({ label: m2, value: m2 }));
362116
+ const endpointSelectOptions = [
362117
+ ...discoveredEndpoints.map((ep) => ({
362118
+ label: `${ep.url} [${ep.models.slice(0, 2).join(", ")}${ep.models.length > 2 ? ", …" : ""}]`,
362119
+ value: ep.url
362120
+ })),
362121
+ { label: "Enter URL manually", value: "__manual__" }
362122
+ ];
361940
362123
  return /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(ThemedBox_default, {
361941
362124
  flexDirection: "column",
361942
362125
  gap: 1,
361943
362126
  paddingLeft: 1,
361944
- width: 80,
362127
+ width: 84,
361945
362128
  children: [
361946
362129
  /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(ThemedText, {
361947
362130
  bold: true,
@@ -361961,10 +362144,71 @@ function LocalBackendSetup({
361961
362144
  }, undefined, false, undefined, this),
361962
362145
  /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(ThemedText, {
361963
362146
  dimColor: true,
361964
- children: "Choose a local preset for self-hosted inference, or pick the hosted API option if you want to connect with an API key."
362147
+ children: "Enter to select · Esc exits setup"
362148
+ }, undefined, false, undefined, this)
362149
+ ]
362150
+ }, undefined, true, undefined, this) : null,
362151
+ step === "networkScan" ? /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(ThemedBox_default, {
362152
+ flexDirection: "column",
362153
+ gap: 1,
362154
+ children: [
362155
+ /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(ThemedText, {
362156
+ children: [
362157
+ "Scanning ",
362158
+ /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(ThemedText, {
362159
+ bold: true,
362160
+ children: "192.168.1.0/24"
362161
+ }, undefined, false, undefined, this),
362162
+ " for vLLM endpoints…"
362163
+ ]
362164
+ }, undefined, true, undefined, this),
362165
+ networkProgress ? /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(ThemedText, {
362166
+ dimColor: true,
362167
+ children: [
362168
+ networkProgress.scanned,
362169
+ "/",
362170
+ networkProgress.total,
362171
+ " hosts probed",
362172
+ networkProgress.found > 0 ? ` · ${networkProgress.found} found` : ""
362173
+ ]
362174
+ }, undefined, true, undefined, this) : /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(ThemedText, {
362175
+ dimColor: true,
362176
+ children: "Starting scan…"
362177
+ }, undefined, false, undefined, this),
362178
+ /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(ThemedText, {
362179
+ dimColor: true,
362180
+ children: "Enter to use results so far · Esc to go back"
362181
+ }, undefined, false, undefined, this)
362182
+ ]
362183
+ }, undefined, true, undefined, this) : null,
362184
+ step === "selectEndpoint" ? /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(jsx_dev_runtime171.Fragment, {
362185
+ children: [
362186
+ discoveredEndpoints.length > 0 ? /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(ThemedText, {
362187
+ children: [
362188
+ "Found ",
362189
+ /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(ThemedText, {
362190
+ bold: true,
362191
+ children: discoveredEndpoints.length
362192
+ }, undefined, false, undefined, this),
362193
+ " vLLM endpoint",
362194
+ discoveredEndpoints.length !== 1 ? "s" : "",
362195
+ " on 192.168.1.0/24"
362196
+ ]
362197
+ }, undefined, true, undefined, this) : /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(ThemedText, {
362198
+ children: "No vLLM endpoints found on 192.168.1.0/24 — enter the URL manually."
362199
+ }, undefined, false, undefined, this),
362200
+ /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(Select, {
362201
+ options: endpointSelectOptions,
362202
+ onChange: (value) => selectEndpoint(value),
362203
+ onCancel: () => setStep("provider")
362204
+ }, undefined, false, undefined, this),
362205
+ /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(ThemedText, {
362206
+ dimColor: true,
362207
+ children: "Enter to select · Esc goes back to provider"
361965
362208
  }, undefined, false, undefined, this)
361966
362209
  ]
361967
- }, undefined, true, undefined, this) : /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(jsx_dev_runtime171.Fragment, {
362210
+ }, undefined, true, undefined, this) : null,
362211
+ step !== "provider" && step !== "networkScan" && step !== "selectEndpoint" ? /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(jsx_dev_runtime171.Fragment, {
361968
362212
  children: [
361969
362213
  /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(ThemedText, {
361970
362214
  children: [
@@ -361988,9 +362232,9 @@ function LocalBackendSetup({
361988
362232
  value: baseUrl,
361989
362233
  onChange: setBaseUrl,
361990
362234
  onSubmit: submitBaseUrl,
361991
- onExit: onCancel,
362235
+ onExit: goBack,
361992
362236
  placeholder: baseUrlPlaceholder,
361993
- columns: 76,
362237
+ columns: 80,
361994
362238
  cursorOffset,
361995
362239
  onChangeCursorOffset: setCursorOffset,
361996
362240
  focus: true,
@@ -362014,7 +362258,7 @@ function LocalBackendSetup({
362014
362258
  }, undefined, true, undefined, this),
362015
362259
  /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(ThemedText, {
362016
362260
  dimColor: true,
362017
- children: "Connecting to the endpoint to discover available models."
362261
+ children: "Enter to skip and type manually · Esc to go back"
362018
362262
  }, undefined, false, undefined, this)
362019
362263
  ]
362020
362264
  }, undefined, true, undefined, this) : null,
@@ -362026,11 +362270,8 @@ function LocalBackendSetup({
362026
362270
  scanError ? /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(ThemedText, {
362027
362271
  color: "yellow",
362028
362272
  wrap: "wrap",
362029
- children: [
362030
- "Could not scan models: ",
362031
- scanError
362032
- ]
362033
- }, undefined, true, undefined, this) : null,
362273
+ children: scanError
362274
+ }, undefined, false, undefined, this) : null,
362034
362275
  availableModels.length > 0 ? /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(jsx_dev_runtime171.Fragment, {
362035
362276
  children: [
362036
362277
  /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(ThemedText, {
@@ -362040,7 +362281,11 @@ function LocalBackendSetup({
362040
362281
  /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(Select, {
362041
362282
  options: modelSelectOptions,
362042
362283
  onChange: (value) => submitModel(value),
362043
- onCancel
362284
+ onCancel: goBack
362285
+ }, undefined, false, undefined, this),
362286
+ /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(ThemedText, {
362287
+ dimColor: true,
362288
+ children: "Enter to select · Esc goes back to URL"
362044
362289
  }, undefined, false, undefined, this)
362045
362290
  ]
362046
362291
  }, undefined, true, undefined, this) : /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(jsx_dev_runtime171.Fragment, {
@@ -362053,9 +362298,9 @@ function LocalBackendSetup({
362053
362298
  value: model,
362054
362299
  onChange: setModel,
362055
362300
  onSubmit: submitModel,
362056
- onExit: onCancel,
362301
+ onExit: goBack,
362057
362302
  placeholder: provider === "openai" ? getDefaultLocalLLMConfig(provider).model : "",
362058
- columns: 76,
362303
+ columns: 80,
362059
362304
  cursorOffset,
362060
362305
  onChangeCursorOffset: setCursorOffset,
362061
362306
  focus: true,
@@ -362078,13 +362323,17 @@ function LocalBackendSetup({
362078
362323
  value: apiKey,
362079
362324
  onChange: setApiKey,
362080
362325
  onSubmit: submitApiKey,
362081
- onExit: onCancel,
362326
+ onExit: goBack,
362082
362327
  placeholder: apiKeyPlaceholder,
362083
- columns: 76,
362328
+ columns: 80,
362084
362329
  cursorOffset,
362085
362330
  onChangeCursorOffset: setCursorOffset,
362086
362331
  focus: true,
362087
362332
  showCursor: true
362333
+ }, undefined, false, undefined, this),
362334
+ /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(ThemedText, {
362335
+ dimColor: true,
362336
+ children: "Enter to confirm · Esc goes back to model"
362088
362337
  }, undefined, false, undefined, this)
362089
362338
  ]
362090
362339
  }, undefined, true, undefined, this) : null,
@@ -362096,43 +362345,30 @@ function LocalBackendSetup({
362096
362345
  /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(ThemedText, {
362097
362346
  dimColor: true,
362098
362347
  wrap: "wrap",
362099
- children: "Save it globally if you want this backend to be the default every time localclawd starts. Choose this launch only if you want a temporary override."
362348
+ children: 'Save globally to make this the default every time localclawd starts. Choose "this launch only" for a temporary override.'
362100
362349
  }, undefined, false, undefined, this),
362101
362350
  /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(Select, {
362102
362351
  options: [
362103
- {
362104
- label: "Save as global default (recommended)",
362105
- value: "global"
362106
- },
362107
- {
362108
- label: "Use only for this launch",
362109
- value: "session"
362110
- }
362352
+ { label: "Save as global default (recommended)", value: "global" },
362353
+ { label: "Use only for this launch", value: "session" }
362111
362354
  ],
362112
362355
  onChange: (value) => {
362113
- onComplete({
362114
- provider,
362115
- baseUrl,
362116
- model,
362117
- apiKey
362118
- }, {
362119
- saveGlobally: value === "global"
362120
- });
362356
+ onComplete({ provider, baseUrl, model, apiKey }, { saveGlobally: value === "global" });
362121
362357
  },
362122
- onCancel: () => setStep("apiKey")
362358
+ onCancel: goBack
362359
+ }, undefined, false, undefined, this),
362360
+ /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(ThemedText, {
362361
+ dimColor: true,
362362
+ children: "Enter to confirm · Esc goes back to API key"
362123
362363
  }, undefined, false, undefined, this)
362124
362364
  ]
362125
362365
  }, undefined, true, undefined, this) : null,
362126
362366
  error5 ? /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(ThemedText, {
362127
362367
  color: "error",
362128
362368
  children: error5
362129
- }, undefined, false, undefined, this) : null,
362130
- step !== "scanningModels" && step !== "saveScope" && step !== "model" ? /* @__PURE__ */ jsx_dev_runtime171.jsxDEV(ThemedText, {
362131
- dimColor: true,
362132
- children: "Enter confirms the current value. Esc cancels this setup step. Environment variables still override saved defaults when present."
362133
362369
  }, undefined, false, undefined, this) : null
362134
362370
  ]
362135
- }, undefined, true, undefined, this)
362371
+ }, undefined, true, undefined, this) : null
362136
362372
  ]
362137
362373
  }, undefined, true, undefined, this);
362138
362374
  }
@@ -362140,23 +362376,15 @@ var import_react99, jsx_dev_runtime171, PROVIDER_OPTIONS;
362140
362376
  var init_LocalBackendSetup = __esm(() => {
362141
362377
  init_ink2();
362142
362378
  init_providers();
362379
+ init_scanModels();
362143
362380
  init_select();
362144
362381
  init_TextInput();
362145
362382
  import_react99 = __toESM(require_react(), 1);
362146
362383
  jsx_dev_runtime171 = __toESM(require_jsx_dev_runtime(), 1);
362147
362384
  PROVIDER_OPTIONS = [
362148
- {
362149
- label: "Local vLLM server (recommended for self-hosted inference)",
362150
- value: "vllm"
362151
- },
362152
- {
362153
- label: "Local Ollama server",
362154
- value: "ollama"
362155
- },
362156
- {
362157
- label: "Hosted OpenAI-compatible API or gateway",
362158
- value: "openai"
362159
- }
362385
+ { label: "Local vLLM server (recommended for self-hosted inference)", value: "vllm" },
362386
+ { label: "Local Ollama server", value: "ollama" },
362387
+ { label: "Hosted OpenAI-compatible API or gateway", value: "openai" }
362160
362388
  ];
362161
362389
  });
362162
362390
 
@@ -364618,7 +364846,7 @@ function Config({
364618
364846
  }
364619
364847
  }, undefined, false, undefined, this)
364620
364848
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime177.jsxDEV(ChannelDowngradeDialog, {
364621
- currentVersion: "1.0.8",
364849
+ currentVersion: "1.1.0",
364622
364850
  onChoice: (choice) => {
364623
364851
  setShowSubmenu(null);
364624
364852
  setTabsHidden(false);
@@ -364630,7 +364858,7 @@ function Config({
364630
364858
  autoUpdatesChannel: "stable"
364631
364859
  };
364632
364860
  if (choice === "stay") {
364633
- newSettings.minimumVersion = "1.0.8";
364861
+ newSettings.minimumVersion = "1.1.0";
364634
364862
  }
364635
364863
  updateSettingsForSource("userSettings", newSettings);
364636
364864
  setSettingsData((prev_27) => ({
@@ -373177,7 +373405,7 @@ function HelpV2(t0) {
373177
373405
  let t6;
373178
373406
  if ($2[31] !== tabs) {
373179
373407
  t6 = /* @__PURE__ */ jsx_dev_runtime206.jsxDEV(Tabs, {
373180
- title: `localclawd v${"1.0.8"}`,
373408
+ title: `localclawd v${"1.1.0"}`,
373181
373409
  color: "professionalBlue",
373182
373410
  defaultTab: "general",
373183
373411
  children: tabs
@@ -397335,7 +397563,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
397335
397563
  return [];
397336
397564
  }
397337
397565
  }
397338
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.0.8") {
397566
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.1.0") {
397339
397567
  if (process.env.USER_TYPE === "ant") {
397340
397568
  const changelog = MACRO.VERSION_CHANGELOG;
397341
397569
  if (changelog) {
@@ -397362,7 +397590,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.0.8") {
397362
397590
  releaseNotes
397363
397591
  };
397364
397592
  }
397365
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.0.8") {
397593
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.1.0") {
397366
397594
  if (process.env.USER_TYPE === "ant") {
397367
397595
  const changelog = MACRO.VERSION_CHANGELOG;
397368
397596
  if (changelog) {
@@ -398529,7 +398757,7 @@ function getRecentActivitySync() {
398529
398757
  return cachedActivity;
398530
398758
  }
398531
398759
  function getLogoDisplayData() {
398532
- const version = process.env.DEMO_VERSION ?? "1.0.8";
398760
+ const version = process.env.DEMO_VERSION ?? "1.1.0";
398533
398761
  const serverUrl = getDirectConnectServerUrl();
398534
398762
  const displayPath = process.env.DEMO_VERSION ? "/code/claude" : getDisplayPath(getCwd());
398535
398763
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -399803,7 +400031,7 @@ function LogoV2() {
399803
400031
  if ($2[2] === Symbol.for("react.memo_cache_sentinel")) {
399804
400032
  t2 = () => {
399805
400033
  const currentConfig = getGlobalConfig();
399806
- if (currentConfig.lastReleaseNotesSeen === "1.0.8") {
400034
+ if (currentConfig.lastReleaseNotesSeen === "1.1.0") {
399807
400035
  return;
399808
400036
  }
399809
400037
  saveGlobalConfig(_temp327);
@@ -400479,12 +400707,12 @@ function LogoV2() {
400479
400707
  return t41;
400480
400708
  }
400481
400709
  function _temp327(current) {
400482
- if (current.lastReleaseNotesSeen === "1.0.8") {
400710
+ if (current.lastReleaseNotesSeen === "1.1.0") {
400483
400711
  return current;
400484
400712
  }
400485
400713
  return {
400486
400714
  ...current,
400487
- lastReleaseNotesSeen: "1.0.8"
400715
+ lastReleaseNotesSeen: "1.1.0"
400488
400716
  };
400489
400717
  }
400490
400718
  function _temp245(s_0) {
@@ -426692,7 +426920,7 @@ async function captureMemoryDiagnostics(trigger, dumpNumber = 0) {
426692
426920
  smapsRollup,
426693
426921
  platform: process.platform,
426694
426922
  nodeVersion: process.version,
426695
- ccVersion: "1.0.8"
426923
+ ccVersion: "1.1.0"
426696
426924
  };
426697
426925
  }
426698
426926
  async function performHeapDump(trigger = "manual", dumpNumber = 0) {
@@ -427277,7 +427505,7 @@ var init_bridge_kick = __esm(() => {
427277
427505
  var call57 = async () => {
427278
427506
  return {
427279
427507
  type: "text",
427280
- value: `${"1.0.8"} (built ${"2026-04-05T20:46:26.460Z"})`
427508
+ value: `${"1.1.0"} (built ${"2026-04-05T21:11:48.193Z"})`
427281
427509
  };
427282
427510
  }, version, version_default;
427283
427511
  var init_version = __esm(() => {
@@ -436213,7 +436441,7 @@ function generateHtmlReport(data, insights) {
436213
436441
  </html>`;
436214
436442
  }
436215
436443
  function buildExportData(data, insights, facets, remoteStats) {
436216
- const version2 = typeof MACRO !== "undefined" ? "1.0.8" : "unknown";
436444
+ const version2 = typeof MACRO !== "undefined" ? "1.1.0" : "unknown";
436217
436445
  const remote_hosts_collected = remoteStats?.hosts.filter((h) => h.sessionCount > 0).map((h) => h.name);
436218
436446
  const facets_summary = {
436219
436447
  total: facets.size,
@@ -440367,7 +440595,7 @@ var init_sessionStorage = __esm(() => {
440367
440595
  init_settings2();
440368
440596
  init_slowOperations();
440369
440597
  init_uuid();
440370
- VERSION5 = typeof MACRO !== "undefined" ? "1.0.8" : "unknown";
440598
+ VERSION5 = typeof MACRO !== "undefined" ? "1.1.0" : "unknown";
440371
440599
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
440372
440600
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
440373
440601
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -441569,7 +441797,7 @@ var init_filesystem = __esm(() => {
441569
441797
  });
441570
441798
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
441571
441799
  const nonce = randomBytes18(16).toString("hex");
441572
- return join128(getClaudeTempDir(), "bundled-skills", "1.0.8", nonce);
441800
+ return join128(getClaudeTempDir(), "bundled-skills", "1.1.0", nonce);
441573
441801
  });
441574
441802
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
441575
441803
  });
@@ -447567,7 +447795,7 @@ function computeFingerprint(messageText, version2) {
447567
447795
  }
447568
447796
  function computeFingerprintFromMessages(messages) {
447569
447797
  const firstMessageText = extractFirstMessageText(messages);
447570
- return computeFingerprint(firstMessageText, "1.0.8");
447798
+ return computeFingerprint(firstMessageText, "1.1.0");
447571
447799
  }
447572
447800
  var FINGERPRINT_SALT = "59cf53e54c78";
447573
447801
  var init_fingerprint = () => {};
@@ -449422,7 +449650,7 @@ async function sideQuery(opts) {
449422
449650
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
449423
449651
  }
449424
449652
  const messageText = extractFirstUserMessageText(messages);
449425
- const fingerprint = computeFingerprint(messageText, "1.0.8");
449653
+ const fingerprint = computeFingerprint(messageText, "1.1.0");
449426
449654
  const attributionHeader = getAttributionHeader(fingerprint);
449427
449655
  const systemBlocks = [
449428
449656
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -454220,7 +454448,7 @@ function buildSystemInitMessage(inputs) {
454220
454448
  slash_commands: inputs.commands.filter((c5) => c5.userInvocable !== false).map((c5) => c5.name),
454221
454449
  apiKeySource: getAnthropicApiKeyWithSource().source,
454222
454450
  betas: getSdkBetas(),
454223
- claude_code_version: "1.0.8",
454451
+ claude_code_version: "1.1.0",
454224
454452
  output_style: outputStyle2,
454225
454453
  agents: inputs.agents.map((agent) => agent.agentType),
454226
454454
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill) => skill.name),
@@ -468799,7 +469027,7 @@ var init_useVoiceEnabled = __esm(() => {
468799
469027
  function getSemverPart(version2) {
468800
469028
  return `${import_semver12.major(version2, { loose: true })}.${import_semver12.minor(version2, { loose: true })}.${import_semver12.patch(version2, { loose: true })}`;
468801
469029
  }
468802
- function useUpdateNotification(updatedVersion, initialVersion = "1.0.8") {
469030
+ function useUpdateNotification(updatedVersion, initialVersion = "1.1.0") {
468803
469031
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react227.useState(() => getSemverPart(initialVersion));
468804
469032
  if (!updatedVersion) {
468805
469033
  return null;
@@ -468839,7 +469067,7 @@ function AutoUpdater({
468839
469067
  return;
468840
469068
  }
468841
469069
  if (false) {}
468842
- const currentVersion = "1.0.8";
469070
+ const currentVersion = "1.1.0";
468843
469071
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
468844
469072
  let latestVersion = await getLatestVersion(channel);
468845
469073
  const isDisabled = isAutoUpdaterDisabled();
@@ -469050,12 +469278,12 @@ function NativeAutoUpdater({
469050
469278
  logEvent("tengu_native_auto_updater_start", {});
469051
469279
  try {
469052
469280
  const maxVersion = await getMaxVersion();
469053
- if (maxVersion && gt("1.0.8", maxVersion)) {
469281
+ if (maxVersion && gt("1.1.0", maxVersion)) {
469054
469282
  const msg = await getMaxVersionMessage();
469055
469283
  setMaxVersionIssue(msg ?? "affects your version");
469056
469284
  }
469057
469285
  const result = await installLatest(channel);
469058
- const currentVersion = "1.0.8";
469286
+ const currentVersion = "1.1.0";
469059
469287
  const latencyMs = Date.now() - startTime;
469060
469288
  if (result.lockFailed) {
469061
469289
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -469190,17 +469418,17 @@ function PackageManagerAutoUpdater(t0) {
469190
469418
  const maxVersion = await getMaxVersion();
469191
469419
  if (maxVersion && latest && gt(latest, maxVersion)) {
469192
469420
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
469193
- if (gte("1.0.8", maxVersion)) {
469194
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.0.8"} is already at or above maxVersion ${maxVersion}, skipping update`);
469421
+ if (gte("1.1.0", maxVersion)) {
469422
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.1.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
469195
469423
  setUpdateAvailable(false);
469196
469424
  return;
469197
469425
  }
469198
469426
  latest = maxVersion;
469199
469427
  }
469200
- const hasUpdate = latest && !gte("1.0.8", latest) && !shouldSkipVersion(latest);
469428
+ const hasUpdate = latest && !gte("1.1.0", latest) && !shouldSkipVersion(latest);
469201
469429
  setUpdateAvailable(!!hasUpdate);
469202
469430
  if (hasUpdate) {
469203
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.0.8"} -> ${latest}`);
469431
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.1.0"} -> ${latest}`);
469204
469432
  }
469205
469433
  };
469206
469434
  $2[0] = t1;
@@ -469234,7 +469462,7 @@ function PackageManagerAutoUpdater(t0) {
469234
469462
  wrap: "truncate",
469235
469463
  children: [
469236
469464
  "currentVersion: ",
469237
- "1.0.8"
469465
+ "1.1.0"
469238
469466
  ]
469239
469467
  }, undefined, true, undefined, this);
469240
469468
  $2[3] = verbose;
@@ -476792,7 +477020,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
476792
477020
  project_dir: getOriginalCwd(),
476793
477021
  added_dirs: addedDirs
476794
477022
  },
476795
- version: "1.0.8",
477023
+ version: "1.1.0",
476796
477024
  output_style: {
476797
477025
  name: outputStyleName
476798
477026
  },
@@ -488338,7 +488566,7 @@ async function submitTranscriptShare(messages, trigger, appearanceId) {
488338
488566
  } catch {}
488339
488567
  const data = {
488340
488568
  trigger,
488341
- version: "1.0.8",
488569
+ version: "1.1.0",
488342
488570
  platform: process.platform,
488343
488571
  transcript,
488344
488572
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -499923,7 +500151,7 @@ function WelcomeV2() {
499923
500151
  dimColor: true,
499924
500152
  children: [
499925
500153
  "v",
499926
- "1.0.8"
500154
+ "1.1.0"
499927
500155
  ]
499928
500156
  }, undefined, true, undefined, this)
499929
500157
  ]
@@ -500794,24 +501022,32 @@ function TrustDialog(t0) {
500794
501022
  gracefulShutdownSync(1);
500795
501023
  return;
500796
501024
  }
500797
- const isHomeDir_0 = homedir35() === getCwd();
500798
- logEvent("tengu_trust_dialog_accept", {
500799
- isHomeDir: isHomeDir_0,
500800
- hasMcpServers,
500801
- hasHooks: hasHooks2,
500802
- hasBashExecution: hasAnyBashExecution,
500803
- hasApiKeyHelper: hasApiKeyHelper2,
500804
- hasAwsCommands: hasAwsCommands2,
500805
- hasGcpCommands: hasGcpCommands2,
500806
- hasOtelHeadersHelper: hasOtelHeadersHelper2,
500807
- hasDangerousEnvVars: hasDangerousEnvVars2
500808
- });
500809
- if (isHomeDir_0) {
500810
- setSessionTrustAccepted(true);
500811
- } else {
500812
- saveCurrentProjectConfig(_temp530);
501025
+ try {
501026
+ const isHomeDir_0 = homedir35() === getCwd();
501027
+ try {
501028
+ logEvent("tengu_trust_dialog_accept", {
501029
+ isHomeDir: isHomeDir_0,
501030
+ hasMcpServers,
501031
+ hasHooks: hasHooks2,
501032
+ hasBashExecution: hasAnyBashExecution,
501033
+ hasApiKeyHelper: hasApiKeyHelper2,
501034
+ hasAwsCommands: hasAwsCommands2,
501035
+ hasGcpCommands: hasGcpCommands2,
501036
+ hasOtelHeadersHelper: hasOtelHeadersHelper2,
501037
+ hasDangerousEnvVars: hasDangerousEnvVars2
501038
+ });
501039
+ } catch {}
501040
+ if (isHomeDir_0) {
501041
+ setSessionTrustAccepted(true);
501042
+ } else {
501043
+ try {
501044
+ saveCurrentProjectConfig(_temp530);
501045
+ } catch {}
501046
+ setSessionTrustAccepted(true);
501047
+ }
501048
+ } finally {
501049
+ onDone();
500813
501050
  }
500814
- onDone();
500815
501051
  };
500816
501052
  $2[16] = hasAnyBashExecution;
500817
501053
  $2[17] = onDone;
@@ -501300,7 +501536,7 @@ function completeOnboarding() {
501300
501536
  saveGlobalConfig((current) => ({
501301
501537
  ...current,
501302
501538
  hasCompletedOnboarding: true,
501303
- lastOnboardingVersion: "1.0.8"
501539
+ lastOnboardingVersion: "1.1.0"
501304
501540
  }));
501305
501541
  }
501306
501542
  function showDialog(root3, renderer) {
@@ -505854,7 +506090,7 @@ function appendToLog(path17, message) {
505854
506090
  cwd: getFsImplementation().cwd(),
505855
506091
  userType: process.env.USER_TYPE,
505856
506092
  sessionId: getSessionId(),
505857
- version: "1.0.8"
506093
+ version: "1.1.0"
505858
506094
  };
505859
506095
  getLogWriter(path17).write(messageWithTimestamp);
505860
506096
  }
@@ -509834,8 +510070,8 @@ async function getEnvLessBridgeConfig() {
509834
510070
  }
509835
510071
  async function checkEnvLessBridgeMinVersion() {
509836
510072
  const cfg = await getEnvLessBridgeConfig();
509837
- if (cfg.min_version && lt("1.0.8", cfg.min_version)) {
509838
- return `Your version of localclawd (${"1.0.8"}) is too old for Remote Control.
510073
+ if (cfg.min_version && lt("1.1.0", cfg.min_version)) {
510074
+ return `Your version of localclawd (${"1.1.0"}) is too old for Remote Control.
509839
510075
  Version ${cfg.min_version} or higher is required. Run \`localclawd update\` to update.`;
509840
510076
  }
509841
510077
  return null;
@@ -510307,7 +510543,7 @@ async function initBridgeCore(params) {
510307
510543
  const rawApi = createBridgeApiClient({
510308
510544
  baseUrl,
510309
510545
  getAccessToken,
510310
- runnerVersion: "1.0.8",
510546
+ runnerVersion: "1.1.0",
510311
510547
  onDebug: logForDebugging,
510312
510548
  onAuth401,
510313
510549
  getTrustedDeviceToken
@@ -515963,7 +516199,7 @@ async function startMCPServer(cwd3, debug4, verbose) {
515963
516199
  setCwd(cwd3);
515964
516200
  const server = new Server({
515965
516201
  name: "claude/tengu",
515966
- version: "1.0.8"
516202
+ version: "1.1.0"
515967
516203
  }, {
515968
516204
  capabilities: {
515969
516205
  tools: {}
@@ -517568,7 +517804,7 @@ __export(exports_update, {
517568
517804
  });
517569
517805
  async function update() {
517570
517806
  logEvent("tengu_update_check", {});
517571
- writeToStdout(`Current version: ${"1.0.8"}
517807
+ writeToStdout(`Current version: ${"1.1.0"}
517572
517808
  `);
517573
517809
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
517574
517810
  writeToStdout(`Checking for updates to ${channel} version...
@@ -517643,8 +517879,8 @@ async function update() {
517643
517879
  writeToStdout(`localclawd is managed by Homebrew.
517644
517880
  `);
517645
517881
  const latest = await getLatestVersion(channel);
517646
- if (latest && !gte("1.0.8", latest)) {
517647
- writeToStdout(`Update available: ${"1.0.8"} → ${latest}
517882
+ if (latest && !gte("1.1.0", latest)) {
517883
+ writeToStdout(`Update available: ${"1.1.0"} → ${latest}
517648
517884
  `);
517649
517885
  writeToStdout(`
517650
517886
  `);
@@ -517660,8 +517896,8 @@ async function update() {
517660
517896
  writeToStdout(`localclawd is managed by winget.
517661
517897
  `);
517662
517898
  const latest = await getLatestVersion(channel);
517663
- if (latest && !gte("1.0.8", latest)) {
517664
- writeToStdout(`Update available: ${"1.0.8"} → ${latest}
517899
+ if (latest && !gte("1.1.0", latest)) {
517900
+ writeToStdout(`Update available: ${"1.1.0"} → ${latest}
517665
517901
  `);
517666
517902
  writeToStdout(`
517667
517903
  `);
@@ -517675,8 +517911,8 @@ async function update() {
517675
517911
  writeToStdout(`localclawd is managed by apk.
517676
517912
  `);
517677
517913
  const latest = await getLatestVersion(channel);
517678
- if (latest && !gte("1.0.8", latest)) {
517679
- writeToStdout(`Update available: ${"1.0.8"} → ${latest}
517914
+ if (latest && !gte("1.1.0", latest)) {
517915
+ writeToStdout(`Update available: ${"1.1.0"} → ${latest}
517680
517916
  `);
517681
517917
  writeToStdout(`
517682
517918
  `);
@@ -517741,11 +517977,11 @@ async function update() {
517741
517977
  `);
517742
517978
  await gracefulShutdown(1);
517743
517979
  }
517744
- if (result.latestVersion === "1.0.8") {
517745
- writeToStdout(source_default.green(`localclawd is up to date (${"1.0.8"})`) + `
517980
+ if (result.latestVersion === "1.1.0") {
517981
+ writeToStdout(source_default.green(`localclawd is up to date (${"1.1.0"})`) + `
517746
517982
  `);
517747
517983
  } else {
517748
- writeToStdout(source_default.green(`Successfully updated from ${"1.0.8"} to version ${result.latestVersion}`) + `
517984
+ writeToStdout(source_default.green(`Successfully updated from ${"1.1.0"} to version ${result.latestVersion}`) + `
517749
517985
  `);
517750
517986
  await regenerateCompletionCache();
517751
517987
  }
@@ -517805,12 +518041,12 @@ async function update() {
517805
518041
  `);
517806
518042
  await gracefulShutdown(1);
517807
518043
  }
517808
- if (latestVersion === "1.0.8") {
517809
- writeToStdout(source_default.green(`localclawd is up to date (${"1.0.8"})`) + `
518044
+ if (latestVersion === "1.1.0") {
518045
+ writeToStdout(source_default.green(`localclawd is up to date (${"1.1.0"})`) + `
517810
518046
  `);
517811
518047
  await gracefulShutdown(0);
517812
518048
  }
517813
- writeToStdout(`New version available: ${latestVersion} (current: ${"1.0.8"})
518049
+ writeToStdout(`New version available: ${latestVersion} (current: ${"1.1.0"})
517814
518050
  `);
517815
518051
  writeToStdout(`Installing update...
517816
518052
  `);
@@ -517855,7 +518091,7 @@ async function update() {
517855
518091
  logForDebugging(`update: Installation status: ${status2}`);
517856
518092
  switch (status2) {
517857
518093
  case "success":
517858
- writeToStdout(source_default.green(`Successfully updated from ${"1.0.8"} to version ${latestVersion}`) + `
518094
+ writeToStdout(source_default.green(`Successfully updated from ${"1.1.0"} to version ${latestVersion}`) + `
517859
518095
  `);
517860
518096
  await regenerateCompletionCache();
517861
518097
  break;
@@ -519120,7 +519356,7 @@ ${customInstructions}` : customInstructions;
519120
519356
  }
519121
519357
  }
519122
519358
  logForDiagnosticsNoPII("info", "started", {
519123
- version: "1.0.8",
519359
+ version: "1.1.0",
519124
519360
  is_native_binary: isInBundledMode()
519125
519361
  });
519126
519362
  registerCleanup(async () => {
@@ -519904,7 +520140,7 @@ Usage: localclawd --remote "your task description"`, () => gracefulShutdown(1));
519904
520140
  pendingHookMessages
519905
520141
  }, renderAndRun);
519906
520142
  }
519907
- }).version("1.0.8 (localClawd)", "-v, --version", "Output the version number");
520143
+ }).version("1.1.0 (localClawd)", "-v, --version", "Output the version number");
519908
520144
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
519909
520145
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
519910
520146
  if (canUserConfigureAdvisor()) {
@@ -520412,7 +520648,7 @@ if (false) {}
520412
520648
  async function main2() {
520413
520649
  const args = process.argv.slice(2);
520414
520650
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
520415
- console.log(`${"1.0.8"} (localclawd)`);
520651
+ console.log(`${"1.1.0"} (localclawd)`);
520416
520652
  return;
520417
520653
  }
520418
520654
  const {
@@ -520496,4 +520732,4 @@ async function main2() {
520496
520732
  }
520497
520733
  main2();
520498
520734
 
520499
- //# debugId=CFD97D6A042E5F1F64756E2164756E21
520735
+ //# debugId=1F9388A95EA6220164756E2164756E21
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "localclawd",
3
- "version": "1.0.8",
3
+ "version": "1.1.0",
4
4
  "description": "Local-first coding CLI for vLLM, Ollama, and OpenAI-compatible backends.",
5
5
  "private": false,
6
6
  "type": "module",