localclawd 1.8.8 → 1.9.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 +158 -103
  2. package/package.json +1 -1
package/dist/cli.mjs CHANGED
@@ -87608,7 +87608,7 @@ var init_isEqual = __esm(() => {
87608
87608
 
87609
87609
  // src/utils/userAgent.ts
87610
87610
  function getClaudeCodeUserAgent() {
87611
- return `claude-code/${"1.8.8"}`;
87611
+ return `claude-code/${"1.9.0"}`;
87612
87612
  }
87613
87613
 
87614
87614
  // src/utils/workloadContext.ts
@@ -87630,7 +87630,7 @@ function getUserAgent() {
87630
87630
  const clientApp = process.env.CLAUDE_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.CLAUDE_AGENT_SDK_CLIENT_APP}` : "";
87631
87631
  const workload = getWorkload();
87632
87632
  const workloadSuffix = workload ? `, workload/${workload}` : "";
87633
- return `claude-cli/${"1.8.8"} (${process.env.USER_TYPE}, ${process.env.CLAUDE_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
87633
+ return `claude-cli/${"1.9.0"} (${process.env.USER_TYPE}, ${process.env.CLAUDE_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
87634
87634
  }
87635
87635
  function getMCPUserAgent() {
87636
87636
  const parts = [];
@@ -87644,7 +87644,7 @@ function getMCPUserAgent() {
87644
87644
  parts.push(`client-app/${process.env.CLAUDE_AGENT_SDK_CLIENT_APP}`);
87645
87645
  }
87646
87646
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
87647
- return `claude-code/${"1.8.8"}${suffix}`;
87647
+ return `claude-code/${"1.9.0"}${suffix}`;
87648
87648
  }
87649
87649
  function getWebFetchUserAgent() {
87650
87650
  return `Claude-User (${getClaudeCodeUserAgent()}; +https://support.anthropic.com/)`;
@@ -130840,7 +130840,7 @@ function getAttributionHeader(fingerprint) {
130840
130840
  if (!isAttributionHeaderEnabled()) {
130841
130841
  return "";
130842
130842
  }
130843
- const version = `${"1.8.8"}.${fingerprint}`;
130843
+ const version = `${"1.9.0"}.${fingerprint}`;
130844
130844
  const entrypoint = process.env.CLAUDE_CODE_ENTRYPOINT ?? "unknown";
130845
130845
  const cch = "";
130846
130846
  const workload = getWorkload();
@@ -147029,7 +147029,7 @@ var init_metadata = __esm(() => {
147029
147029
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
147030
147030
  WHITESPACE_REGEX = /\s+/;
147031
147031
  getVersionBase = memoize_default(() => {
147032
- const match = "1.8.8".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
147032
+ const match = "1.9.0".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
147033
147033
  return match ? match[0] : undefined;
147034
147034
  });
147035
147035
  buildEnvContext = memoize_default(async () => {
@@ -147069,9 +147069,9 @@ var init_metadata = __esm(() => {
147069
147069
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
147070
147070
  isClaudeCodeAction: isEnvTruthy(process.env.CLAUDE_CODE_ACTION),
147071
147071
  isClaudeAiAuth: isClaudeAISubscriber(),
147072
- version: "1.8.8",
147072
+ version: "1.9.0",
147073
147073
  versionBase: getVersionBase(),
147074
- buildTime: "2026-05-07T17:26:12.076Z",
147074
+ buildTime: "2026-05-07T17:47:00.138Z",
147075
147075
  deploymentEnvironment: env3.detectDeploymentEnvironment(),
147076
147076
  ...isEnvTruthy(process.env.GITHUB_ACTIONS) && {
147077
147077
  githubEventName: process.env.GITHUB_EVENT_NAME,
@@ -179647,7 +179647,7 @@ function getTelemetryAttributes() {
179647
179647
  attributes["session.id"] = sessionId;
179648
179648
  }
179649
179649
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
179650
- attributes["app.version"] = "1.8.8";
179650
+ attributes["app.version"] = "1.9.0";
179651
179651
  }
179652
179652
  const oauthAccount = getOauthAccountInfo();
179653
179653
  if (oauthAccount) {
@@ -242448,7 +242448,7 @@ function getInstallationEnv() {
242448
242448
  return;
242449
242449
  }
242450
242450
  function getClaudeCodeVersion() {
242451
- return "1.8.8";
242451
+ return "1.9.0";
242452
242452
  }
242453
242453
  async function getInstalledVSCodeExtensionVersion(command) {
242454
242454
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -247722,7 +247722,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
247722
247722
  const client4 = new Client({
247723
247723
  name: "localclawd",
247724
247724
  title: "localclawd",
247725
- version: "1.8.8",
247725
+ version: "1.9.0",
247726
247726
  description: "local-first AI coding tool",
247727
247727
  websiteUrl: PRODUCT_URL
247728
247728
  }, {
@@ -248064,7 +248064,7 @@ var init_client9 = __esm(() => {
248064
248064
  const client4 = new Client({
248065
248065
  name: "localclawd",
248066
248066
  title: "localclawd",
248067
- version: "1.8.8",
248067
+ version: "1.9.0",
248068
248068
  description: "local-first AI coding tool",
248069
248069
  websiteUrl: PRODUCT_URL
248070
248070
  }, {
@@ -262466,7 +262466,7 @@ function computeFingerprint(messageText, version) {
262466
262466
  }
262467
262467
  function computeFingerprintFromMessages(messages) {
262468
262468
  const firstMessageText = extractFirstMessageText(messages);
262469
- return computeFingerprint(firstMessageText, "1.8.8");
262469
+ return computeFingerprint(firstMessageText, "1.9.0");
262470
262470
  }
262471
262471
  var FINGERPRINT_SALT = "59cf53e54c78";
262472
262472
  var init_fingerprint = () => {};
@@ -262508,7 +262508,7 @@ async function sideQuery(opts) {
262508
262508
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
262509
262509
  }
262510
262510
  const messageText = extractFirstUserMessageText(messages);
262511
- const fingerprint = computeFingerprint(messageText, "1.8.8");
262511
+ const fingerprint = computeFingerprint(messageText, "1.9.0");
262512
262512
  const attributionHeader = getAttributionHeader(fingerprint);
262513
262513
  const systemBlocks = [
262514
262514
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -283256,7 +283256,7 @@ var init_user = __esm(() => {
283256
283256
  deviceId,
283257
283257
  sessionId: getSessionId(),
283258
283258
  email: getEmail(),
283259
- appVersion: "1.8.8",
283259
+ appVersion: "1.9.0",
283260
283260
  platform: getHostPlatformForAnalytics(),
283261
283261
  organizationUuid,
283262
283262
  accountUuid,
@@ -284321,7 +284321,7 @@ async function initializeBetaTracing(resource) {
284321
284321
  });
284322
284322
  logs.setGlobalLoggerProvider(loggerProvider);
284323
284323
  setLoggerProvider(loggerProvider);
284324
- const eventLogger = logs.getLogger("com.anthropic.claude_code.events", "1.8.8");
284324
+ const eventLogger = logs.getLogger("com.anthropic.claude_code.events", "1.9.0");
284325
284325
  setEventLogger(eventLogger);
284326
284326
  process.on("beforeExit", async () => {
284327
284327
  await loggerProvider?.forceFlush();
@@ -284361,7 +284361,7 @@ async function initializeTelemetry() {
284361
284361
  const platform2 = getPlatform();
284362
284362
  const baseAttributes = {
284363
284363
  [ATTR_SERVICE_NAME4]: "claude-code",
284364
- [ATTR_SERVICE_VERSION4]: "1.8.8"
284364
+ [ATTR_SERVICE_VERSION4]: "1.9.0"
284365
284365
  };
284366
284366
  if (platform2 === "wsl") {
284367
284367
  const wslVersion = getWslVersion();
@@ -284406,7 +284406,7 @@ async function initializeTelemetry() {
284406
284406
  } catch {}
284407
284407
  };
284408
284408
  registerCleanup(shutdownTelemetry2);
284409
- return meterProvider2.getMeter("com.anthropic.claude_code", "1.8.8");
284409
+ return meterProvider2.getMeter("com.anthropic.claude_code", "1.9.0");
284410
284410
  }
284411
284411
  const meterProvider = new MeterProvider4({
284412
284412
  resource,
@@ -284426,7 +284426,7 @@ async function initializeTelemetry() {
284426
284426
  });
284427
284427
  logs.setGlobalLoggerProvider(loggerProvider);
284428
284428
  setLoggerProvider(loggerProvider);
284429
- const eventLogger = logs.getLogger("com.anthropic.claude_code.events", "1.8.8");
284429
+ const eventLogger = logs.getLogger("com.anthropic.claude_code.events", "1.9.0");
284430
284430
  setEventLogger(eventLogger);
284431
284431
  logForDebugging("[3P telemetry] Event logger set successfully");
284432
284432
  process.on("beforeExit", async () => {
@@ -284488,7 +284488,7 @@ Current timeout: ${timeoutMs}ms
284488
284488
  }
284489
284489
  };
284490
284490
  registerCleanup(shutdownTelemetry);
284491
- return meterProvider.getMeter("com.anthropic.claude_code", "1.8.8");
284491
+ return meterProvider.getMeter("com.anthropic.claude_code", "1.9.0");
284492
284492
  }
284493
284493
  async function flushTelemetry() {
284494
284494
  const meterProvider = getMeterProvider();
@@ -285678,7 +285678,7 @@ function detectLinuxGlobPatternWarnings() {
285678
285678
  }
285679
285679
  async function getDoctorDiagnostic() {
285680
285680
  const installationType = await getCurrentInstallationType();
285681
- const version = typeof MACRO !== "undefined" ? "1.8.8" : "unknown";
285681
+ const version = typeof MACRO !== "undefined" ? "1.9.0" : "unknown";
285682
285682
  const installationPath = await getInstallationPath();
285683
285683
  const invokedBinary = getInvokedBinary();
285684
285684
  const multipleInstallations = await detectMultipleInstallations();
@@ -286619,8 +286619,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
286619
286619
  const maxVersion = await getMaxVersion();
286620
286620
  if (maxVersion && gt(version, maxVersion)) {
286621
286621
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version} to ${maxVersion}`);
286622
- if (gte("1.8.8", maxVersion)) {
286623
- logForDebugging(`Native installer: current version ${"1.8.8"} is already at or above maxVersion ${maxVersion}, skipping update`);
286622
+ if (gte("1.9.0", maxVersion)) {
286623
+ logForDebugging(`Native installer: current version ${"1.9.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
286624
286624
  logEvent("tengu_native_update_skipped_max_version", {
286625
286625
  latency_ms: Date.now() - startTime,
286626
286626
  max_version: maxVersion,
@@ -286631,7 +286631,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
286631
286631
  version = maxVersion;
286632
286632
  }
286633
286633
  }
286634
- if (!forceReinstall && version === "1.8.8" && await versionIsAvailable(version) && await isPossibleLocalClawdBinary(executablePath)) {
286634
+ if (!forceReinstall && version === "1.9.0" && await versionIsAvailable(version) && await isPossibleLocalClawdBinary(executablePath)) {
286635
286635
  logForDebugging(`Found ${version} at ${executablePath}, skipping install`);
286636
286636
  logEvent("tengu_native_update_complete", {
286637
286637
  latency_ms: Date.now() - startTime,
@@ -322840,7 +322840,8 @@ async function fetchServerWorkflow(url3, name) {
322840
322840
  const filename = name.endsWith(".json") ? name : `${name}.json`;
322841
322841
  const candidates = [
322842
322842
  `${url3}/userdata/workflows/${encodeURIComponent(filename)}`,
322843
- `${url3}/userdata/${encodeURIComponent(filename)}`
322843
+ `${url3}/userdata/${encodeURIComponent(filename)}`,
322844
+ `${url3}/userdata?file=${encodeURIComponent(`workflows/${filename}`)}`
322844
322845
  ];
322845
322846
  for (const candidate of candidates) {
322846
322847
  try {
@@ -322848,16 +322849,17 @@ async function fetchServerWorkflow(url3, name) {
322848
322849
  if (res.ok) {
322849
322850
  try {
322850
322851
  const data = await res.json();
322852
+ if (data && typeof data === "object" && !Array.isArray(data) && Object.keys(data).length === 0)
322853
+ continue;
322851
322854
  return { data };
322852
- } catch {
322853
- return { error: `HTTP 200 but response is not JSON at ${candidate}` };
322854
- }
322855
+ } catch {}
322855
322856
  }
322856
322857
  } catch {}
322857
322858
  }
322858
- return { error: `Not found. Tried:
322859
- ${candidates.join(`
322860
- `)}` };
322859
+ return {
322860
+ error: `ComfyUI did not return workflow content (tried ${candidates.length} URL patterns).`,
322861
+ manualExport: true
322862
+ };
322861
322863
  }
322862
322864
  function extractOutputImages(item) {
322863
322865
  const images = [];
@@ -322923,9 +322925,22 @@ function replaceTemplatesDeep(obj, vars) {
322923
322925
  return obj;
322924
322926
  }
322925
322927
  async function loadWorkflow(projectRoot, name) {
322928
+ const wfBase = join79(projectRoot, ".localclawd", "image-pipeline", "workflows");
322926
322929
  const filename = name.endsWith(".json") ? name : `${name}.json`;
322927
322930
  try {
322928
- const data = await readFile26(join79(projectRoot, ".localclawd", "image-pipeline", "workflows", filename), "utf-8");
322931
+ const data = await readFile26(join79(wfBase, filename), "utf-8");
322932
+ return JSON.parse(data);
322933
+ } catch {}
322934
+ const all4 = await listWorkflows(projectRoot);
322935
+ const baseName = name.replace(/\.json$/, "").split(/[\\/]/).pop() ?? name;
322936
+ const match = all4.find((w2) => {
322937
+ const wBaseName = w2.replace(/\.json$/, "").split(/[\\/]/).pop() ?? "";
322938
+ return wBaseName === baseName;
322939
+ });
322940
+ if (!match)
322941
+ return null;
322942
+ try {
322943
+ const data = await readFile26(join79(wfBase, match), "utf-8");
322929
322944
  return JSON.parse(data);
322930
322945
  } catch {
322931
322946
  return null;
@@ -322949,10 +322964,6 @@ async function scaffoldProject(projectRoot) {
322949
322964
  created.push(".localclawd/image-pipeline/config.json");
322950
322965
  await writeFile19(join79(base, "prompts", "example.json"), JSON.stringify(EXAMPLE_PROMPT, null, 2), "utf-8");
322951
322966
  created.push(".localclawd/image-pipeline/prompts/example.json");
322952
- await writeFile19(join79(base, "workflows", "txt2img.json"), JSON.stringify(DEFAULT_WORKFLOW, null, 2), "utf-8");
322953
- created.push(".localclawd/image-pipeline/workflows/txt2img.json");
322954
- await writeFile19(join79(base, "workflows", "z_image_turbo.json"), JSON.stringify(Z_IMAGE_TURBO_WORKFLOW, null, 2), "utf-8");
322955
- created.push(".localclawd/image-pipeline/workflows/z_image_turbo.json");
322956
322967
  await writeFile19(join79(base, "scripts", "generate.sh"), GENERATE_SH, "utf-8");
322957
322968
  created.push(".localclawd/image-pipeline/scripts/generate.sh");
322958
322969
  await writeFile19(join79(base, "scripts", "generate.ps1"), GENERATE_PS1, "utf-8");
@@ -322960,6 +322971,18 @@ async function scaffoldProject(projectRoot) {
322960
322971
  await writeFile19(join79(base, "README.md"), README_CONTENT, "utf-8");
322961
322972
  created.push(".localclawd/image-pipeline/README.md");
322962
322973
  }
322974
+ for (const [wfName, wfContent] of [
322975
+ ["txt2img.json", DEFAULT_WORKFLOW],
322976
+ ["z_image_turbo.json", Z_IMAGE_TURBO_WORKFLOW]
322977
+ ]) {
322978
+ const wfPath = join79(base, "workflows", wfName);
322979
+ try {
322980
+ await access5(wfPath);
322981
+ } catch {
322982
+ await writeFile19(wfPath, JSON.stringify(wfContent, null, 2), "utf-8");
322983
+ created.push(`.localclawd/image-pipeline/workflows/${wfName}`);
322984
+ }
322985
+ }
322963
322986
  return { configPath, created, alreadyExisted };
322964
322987
  }
322965
322988
  async function loadConfig(projectRoot) {
@@ -322984,14 +323007,24 @@ async function listPrompts(projectRoot) {
322984
323007
  }
322985
323008
  }
322986
323009
  async function listWorkflows(projectRoot) {
322987
- try {
322988
- const { readdir: readdir12 } = await import("fs/promises");
322989
- const dir = join79(projectRoot, ".localclawd", "image-pipeline", "workflows");
322990
- const files = await readdir12(dir);
322991
- return files.filter((f) => f.endsWith(".json"));
322992
- } catch {
322993
- return [];
323010
+ const base = join79(projectRoot, ".localclawd", "image-pipeline", "workflows");
323011
+ const results = [];
323012
+ async function scan(dir, rel) {
323013
+ try {
323014
+ const { readdir: rd } = await import("fs/promises");
323015
+ const entries = await rd(dir, { withFileTypes: true });
323016
+ for (const entry of entries) {
323017
+ const entryRel = rel ? `${rel}/${entry.name}` : entry.name;
323018
+ if (entry.isDirectory()) {
323019
+ await scan(join79(dir, entry.name), entryRel);
323020
+ } else if (entry.isFile() && entry.name.endsWith(".json")) {
323021
+ results.push(entryRel);
323022
+ }
323023
+ }
323024
+ } catch {}
322994
323025
  }
323026
+ await scan(base, "");
323027
+ return results;
322995
323028
  }
322996
323029
  var DEFAULT_CONFIG2, EXAMPLE_PROMPT, DEFAULT_WORKFLOW, Z_IMAGE_TURBO_WORKFLOW, GENERATE_SH = `#!/usr/bin/env bash
322997
323030
  # localclawd image pipeline — quick generate helper
@@ -331882,7 +331915,7 @@ function getAnthropicEnvMetadata() {
331882
331915
  function getBuildAgeMinutes() {
331883
331916
  if (false)
331884
331917
  ;
331885
- const buildTime = new Date("2026-05-07T17:26:12.076Z").getTime();
331918
+ const buildTime = new Date("2026-05-07T17:47:00.138Z").getTime();
331886
331919
  if (isNaN(buildTime))
331887
331920
  return;
331888
331921
  return Math.floor((Date.now() - buildTime) / 60000);
@@ -360712,7 +360745,7 @@ function Feedback({
360712
360745
  platform: env3.platform,
360713
360746
  gitRepo: envInfo.isGit,
360714
360747
  terminal: env3.terminal,
360715
- version: "1.8.8",
360748
+ version: "1.9.0",
360716
360749
  transcript: normalizeMessagesForAPI(messages),
360717
360750
  errors: sanitizedErrors,
360718
360751
  lastApiRequest: getLastAPIRequest(),
@@ -360904,7 +360937,7 @@ function Feedback({
360904
360937
  ", ",
360905
360938
  env3.terminal,
360906
360939
  ", v",
360907
- "1.8.8"
360940
+ "1.9.0"
360908
360941
  ]
360909
360942
  }, undefined, true, undefined, this)
360910
360943
  ]
@@ -361010,7 +361043,7 @@ ${sanitizedDescription}
361010
361043
  ` + `**Environment Info**
361011
361044
  ` + `- Platform: ${env3.platform}
361012
361045
  ` + `- Terminal: ${env3.terminal}
361013
- ` + `- Version: ${"1.8.8"}
361046
+ ` + `- Version: ${"1.9.0"}
361014
361047
  ` + `- Feedback ID: ${feedbackId}
361015
361048
  ` + `
361016
361049
  **Errors**
@@ -363638,7 +363671,7 @@ function buildPrimarySection() {
363638
363671
  }, undefined, false, undefined, this);
363639
363672
  return [{
363640
363673
  label: "Version",
363641
- value: "1.8.8"
363674
+ value: "1.9.0"
363642
363675
  }, {
363643
363676
  label: "Session name",
363644
363677
  value: nameValue
@@ -368319,7 +368352,7 @@ function Config({
368319
368352
  }
368320
368353
  }, undefined, false, undefined, this)
368321
368354
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime176.jsxDEV(ChannelDowngradeDialog, {
368322
- currentVersion: "1.8.8",
368355
+ currentVersion: "1.9.0",
368323
368356
  onChoice: (choice) => {
368324
368357
  setShowSubmenu(null);
368325
368358
  setTabsHidden(false);
@@ -368331,7 +368364,7 @@ function Config({
368331
368364
  autoUpdatesChannel: "stable"
368332
368365
  };
368333
368366
  if (choice === "stay") {
368334
- newSettings.minimumVersion = "1.8.8";
368367
+ newSettings.minimumVersion = "1.9.0";
368335
368368
  }
368336
368369
  updateSettingsForSource("userSettings", newSettings);
368337
368370
  setSettingsData((prev_27) => ({
@@ -374918,9 +374951,15 @@ var call20 = async (onDone, _context, args) => {
374918
374951
  lines.push(` Generated images will be saved to:`);
374919
374952
  lines.push(` ${generatedDir}`);
374920
374953
  lines.push("");
374954
+ lines.push(" To add custom workflows:");
374955
+ lines.push(` Export from ComfyUI → Save (API Format) → drop into:`);
374956
+ lines.push(` .localclawd/image-pipeline/workflows/`);
374957
+ lines.push(` .localclawd/image-pipeline/workflows/comfyui/ ← or any subfolder`);
374958
+ lines.push("");
374921
374959
  lines.push(" Next steps:");
374922
374960
  lines.push(" /image-pipeline config http://127.0.0.1:8000 — confirm or change ComfyUI URL");
374923
- lines.push(" /image-pipeline workflow txt2img set default workflow");
374961
+ lines.push(" /image-pipeline list see all available workflows");
374962
+ lines.push(" /image-pipeline workflow z_image_turbo — set default workflow");
374924
374963
  lines.push(" /image a misty forest at dawn — generate an image");
374925
374964
  onDone(lines.join(`
374926
374965
  `), { display: "system" });
@@ -374993,7 +375032,11 @@ var call20 = async (onDone, _context, args) => {
374993
375032
  outputDir: ".localclawd/image-pipeline/generated"
374994
375033
  };
374995
375034
  const workflows = await listWorkflows(projectRoot);
374996
- const match = workflows.find((w2) => w2 === name || w2 === `${name}.json`);
375035
+ const baseName = name.replace(/\.json$/, "").split(/[\\/]/).pop() ?? name;
375036
+ const match = workflows.find((w2) => {
375037
+ const wName = w2.replace(/\.json$/, "");
375038
+ return wName === name.replace(/\.json$/, "") || wName.split(/[\\/]/).pop() === baseName;
375039
+ });
374997
375040
  if (!match) {
374998
375041
  const lines = [
374999
375042
  `◆ Image Pipeline — Workflow not found: "${name}"`,
@@ -375004,13 +375047,16 @@ var call20 = async (onDone, _context, args) => {
375004
375047
  for (const w2 of workflows)
375005
375048
  lines.push(` • ${w2.replace(/\.json$/, "")}`);
375006
375049
  } else {
375007
- lines.push(" No workflows found — run /image-pipeline setup first.");
375050
+ lines.push(" No local workflows found.");
375051
+ lines.push(" Run /image-pipeline setup to add bundled templates.");
375052
+ lines.push(" Or export a workflow from ComfyUI (API Format) and drop it into:");
375053
+ lines.push(` ${join113(projectRoot, ".localclawd", "image-pipeline", "workflows")}`);
375008
375054
  }
375009
375055
  onDone(lines.join(`
375010
375056
  `), { display: "system" });
375011
375057
  return null;
375012
375058
  }
375013
- config2.defaultWorkflow = name.replace(/\.json$/, "");
375059
+ config2.defaultWorkflow = match.replace(/\.json$/, "");
375014
375060
  await saveConfig2(projectRoot, config2);
375015
375061
  onDone([
375016
375062
  "◆ Image Pipeline — Default Workflow Set",
@@ -375092,13 +375138,22 @@ var call20 = async (onDone, _context, args) => {
375092
375138
  }
375093
375139
  const fetchResult = await fetchServerWorkflow(backendUrl, name);
375094
375140
  if ("error" in fetchResult) {
375141
+ const wfDir = join113(projectRoot, ".localclawd", "image-pipeline", "workflows", "comfyui");
375095
375142
  onDone([
375096
375143
  `◆ Image Pipeline — Fetch Failed: "${name}"`,
375097
375144
  "",
375098
375145
  ` ${fetchResult.error}`,
375099
375146
  "",
375100
- " Make sure ComfyUI is running and the workflow exists.",
375101
- " Run /image-pipeline fetch (no args) to list available workflows."
375147
+ " Export the workflow manually from ComfyUI:",
375148
+ ` 1. Open ComfyUI: ${backendUrl}`,
375149
+ " 2. Load the workflow (sidebar or Menu → Open)",
375150
+ " 3. Settings → Enable Dev Mode",
375151
+ " 4. Save (API Format) — exports a flat JSON file",
375152
+ " 5. Drop the JSON file into:",
375153
+ ` ${wfDir}`,
375154
+ "",
375155
+ " Then: /image-pipeline workflow " + name,
375156
+ " /image " + name + ": <your prompt>"
375102
375157
  ].join(`
375103
375158
  `), { display: "system" });
375104
375159
  return null;
@@ -385764,7 +385819,7 @@ function Help(t0) {
385764
385819
  let t6;
385765
385820
  if ($2[31] !== tabs) {
385766
385821
  t6 = /* @__PURE__ */ jsx_dev_runtime221.jsxDEV(Tabs, {
385767
- title: `localclawd v${"1.8.8"}`,
385822
+ title: `localclawd v${"1.9.0"}`,
385768
385823
  color: "professionalBlue",
385769
385824
  defaultTab: "general",
385770
385825
  children: tabs
@@ -403026,7 +403081,7 @@ function getRecentReleaseNotes(currentVersion, previousVersion, changelogContent
403026
403081
  }
403027
403082
  return [];
403028
403083
  }
403029
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.8.8") {
403084
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.9.0") {
403030
403085
  if (process.env.USER_TYPE === "ant") {
403031
403086
  const changelog = MACRO.VERSION_CHANGELOG;
403032
403087
  if (changelog) {
@@ -403053,7 +403108,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.8.8") {
403053
403108
  releaseNotes
403054
403109
  };
403055
403110
  }
403056
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.8.8") {
403111
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.9.0") {
403057
403112
  if (process.env.USER_TYPE === "ant") {
403058
403113
  const changelog = MACRO.VERSION_CHANGELOG;
403059
403114
  if (changelog) {
@@ -403210,7 +403265,7 @@ function getRecentActivitySync() {
403210
403265
  return cachedActivity;
403211
403266
  }
403212
403267
  function getLogoDisplayData() {
403213
- const version = process.env.DEMO_VERSION ?? "1.8.8";
403268
+ const version = process.env.DEMO_VERSION ?? "1.9.0";
403214
403269
  const serverUrl = getDirectConnectServerUrl();
403215
403270
  const displayPath = process.env.DEMO_VERSION ? "/code/claude" : getDisplayPath(getCwd());
403216
403271
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -404310,7 +404365,7 @@ function Logo() {
404310
404365
  if ($2[2] === Symbol.for("react.memo_cache_sentinel")) {
404311
404366
  t2 = () => {
404312
404367
  const currentConfig = getGlobalConfig();
404313
- if (currentConfig.lastReleaseNotesSeen === "1.8.8") {
404368
+ if (currentConfig.lastReleaseNotesSeen === "1.9.0") {
404314
404369
  return;
404315
404370
  }
404316
404371
  saveGlobalConfig(_temp326);
@@ -404969,12 +405024,12 @@ function Logo() {
404969
405024
  return t41;
404970
405025
  }
404971
405026
  function _temp326(current) {
404972
- if (current.lastReleaseNotesSeen === "1.8.8") {
405027
+ if (current.lastReleaseNotesSeen === "1.9.0") {
404973
405028
  return current;
404974
405029
  }
404975
405030
  return {
404976
405031
  ...current,
404977
- lastReleaseNotesSeen: "1.8.8"
405032
+ lastReleaseNotesSeen: "1.9.0"
404978
405033
  };
404979
405034
  }
404980
405035
  function _temp241(s_0) {
@@ -435453,7 +435508,7 @@ async function captureMemoryDiagnostics(trigger, dumpNumber = 0) {
435453
435508
  smapsRollup,
435454
435509
  platform: process.platform,
435455
435510
  nodeVersion: process.version,
435456
- ccVersion: "1.8.8"
435511
+ ccVersion: "1.9.0"
435457
435512
  };
435458
435513
  }
435459
435514
  async function performHeapDump(trigger = "manual", dumpNumber = 0) {
@@ -436038,7 +436093,7 @@ var init_bridge_kick = __esm(() => {
436038
436093
  var call87 = async () => {
436039
436094
  return {
436040
436095
  type: "text",
436041
- value: `${"1.8.8"} (built ${"2026-05-07T17:26:12.076Z"})`
436096
+ value: `${"1.9.0"} (built ${"2026-05-07T17:47:00.138Z"})`
436042
436097
  };
436043
436098
  }, version, version_default;
436044
436099
  var init_version = __esm(() => {
@@ -443982,7 +444037,7 @@ function generateHtmlReport(data, insights) {
443982
444037
  </html>`;
443983
444038
  }
443984
444039
  function buildExportData(data, insights, facets, remoteStats) {
443985
- const version2 = typeof MACRO !== "undefined" ? "1.8.8" : "unknown";
444040
+ const version2 = typeof MACRO !== "undefined" ? "1.9.0" : "unknown";
443986
444041
  const remote_hosts_collected = remoteStats?.hosts.filter((h) => h.sessionCount > 0).map((h) => h.name);
443987
444042
  const facets_summary = {
443988
444043
  total: facets.size,
@@ -448183,7 +448238,7 @@ var init_sessionStorage = __esm(() => {
448183
448238
  init_settings2();
448184
448239
  init_slowOperations();
448185
448240
  init_uuid();
448186
- VERSION6 = typeof MACRO !== "undefined" ? "1.8.8" : "unknown";
448241
+ VERSION6 = typeof MACRO !== "undefined" ? "1.9.0" : "unknown";
448187
448242
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
448188
448243
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
448189
448244
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -449384,7 +449439,7 @@ var init_filesystem = __esm(() => {
449384
449439
  });
449385
449440
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
449386
449441
  const nonce = randomBytes20(16).toString("hex");
449387
- return join151(getClaudeTempDir(), "bundled-skills", "1.8.8", nonce);
449442
+ return join151(getClaudeTempDir(), "bundled-skills", "1.9.0", nonce);
449388
449443
  });
449389
449444
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
449390
449445
  });
@@ -458621,7 +458676,7 @@ function buildSystemInitMessage(inputs) {
458621
458676
  slash_commands: inputs.commands.filter((c5) => c5.userInvocable !== false).map((c5) => c5.name),
458622
458677
  apiKeySource: getAnthropicApiKeyWithSource().source,
458623
458678
  betas: getSdkBetas(),
458624
- claude_code_version: "1.8.8",
458679
+ claude_code_version: "1.9.0",
458625
458680
  output_style: outputStyle2,
458626
458681
  agents: inputs.agents.map((agent) => agent.agentType),
458627
458682
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill) => skill.name),
@@ -472778,7 +472833,7 @@ var init_useVoiceEnabled = __esm(() => {
472778
472833
  function getSemverPart(version2) {
472779
472834
  return `${import_semver10.major(version2, { loose: true })}.${import_semver10.minor(version2, { loose: true })}.${import_semver10.patch(version2, { loose: true })}`;
472780
472835
  }
472781
- function useUpdateNotification(updatedVersion, initialVersion = "1.8.8") {
472836
+ function useUpdateNotification(updatedVersion, initialVersion = "1.9.0") {
472782
472837
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react214.useState(() => getSemverPart(initialVersion));
472783
472838
  if (!updatedVersion) {
472784
472839
  return null;
@@ -472818,7 +472873,7 @@ function AutoUpdater({
472818
472873
  return;
472819
472874
  }
472820
472875
  if (false) {}
472821
- const currentVersion = "1.8.8";
472876
+ const currentVersion = "1.9.0";
472822
472877
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
472823
472878
  let latestVersion = await getLatestVersion(channel);
472824
472879
  const isDisabled = isAutoUpdaterDisabled();
@@ -473029,12 +473084,12 @@ function NativeAutoUpdater({
473029
473084
  logEvent("tengu_native_auto_updater_start", {});
473030
473085
  try {
473031
473086
  const maxVersion = await getMaxVersion();
473032
- if (maxVersion && gt("1.8.8", maxVersion)) {
473087
+ if (maxVersion && gt("1.9.0", maxVersion)) {
473033
473088
  const msg = await getMaxVersionMessage();
473034
473089
  setMaxVersionIssue(msg ?? "affects your version");
473035
473090
  }
473036
473091
  const result = await installLatest(channel);
473037
- const currentVersion = "1.8.8";
473092
+ const currentVersion = "1.9.0";
473038
473093
  const latencyMs = Date.now() - startTime;
473039
473094
  if (result.lockFailed) {
473040
473095
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -473169,17 +473224,17 @@ function PackageManagerAutoUpdater(t0) {
473169
473224
  const maxVersion = await getMaxVersion();
473170
473225
  if (maxVersion && latest && gt(latest, maxVersion)) {
473171
473226
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
473172
- if (gte("1.8.8", maxVersion)) {
473173
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.8.8"} is already at or above maxVersion ${maxVersion}, skipping update`);
473227
+ if (gte("1.9.0", maxVersion)) {
473228
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.9.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
473174
473229
  setUpdateAvailable(false);
473175
473230
  return;
473176
473231
  }
473177
473232
  latest = maxVersion;
473178
473233
  }
473179
- const hasUpdate = latest && !gte("1.8.8", latest) && !shouldSkipVersion(latest);
473234
+ const hasUpdate = latest && !gte("1.9.0", latest) && !shouldSkipVersion(latest);
473180
473235
  setUpdateAvailable(!!hasUpdate);
473181
473236
  if (hasUpdate) {
473182
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.8.8"} -> ${latest}`);
473237
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.9.0"} -> ${latest}`);
473183
473238
  }
473184
473239
  };
473185
473240
  $2[0] = t1;
@@ -473213,7 +473268,7 @@ function PackageManagerAutoUpdater(t0) {
473213
473268
  wrap: "truncate",
473214
473269
  children: [
473215
473270
  "currentVersion: ",
473216
- "1.8.8"
473271
+ "1.9.0"
473217
473272
  ]
473218
473273
  }, undefined, true, undefined, this);
473219
473274
  $2[3] = verbose;
@@ -480773,7 +480828,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
480773
480828
  project_dir: getOriginalCwd(),
480774
480829
  added_dirs: addedDirs
480775
480830
  },
480776
- version: "1.8.8",
480831
+ version: "1.9.0",
480777
480832
  output_style: {
480778
480833
  name: outputStyleName
480779
480834
  },
@@ -492345,7 +492400,7 @@ async function submitTranscriptShare(messages, trigger, appearanceId) {
492345
492400
  } catch {}
492346
492401
  const data = {
492347
492402
  trigger,
492348
- version: "1.8.8",
492403
+ version: "1.9.0",
492349
492404
  platform: process.platform,
492350
492405
  transcript,
492351
492406
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -509254,7 +509309,7 @@ function appendToLog(path17, message) {
509254
509309
  cwd: getFsImplementation().cwd(),
509255
509310
  userType: process.env.USER_TYPE,
509256
509311
  sessionId: getSessionId(),
509257
- version: "1.8.8"
509312
+ version: "1.9.0"
509258
509313
  };
509259
509314
  getLogWriter(path17).write(messageWithTimestamp);
509260
509315
  }
@@ -513278,8 +513333,8 @@ async function getEnvLessBridgeConfig() {
513278
513333
  }
513279
513334
  async function checkEnvLessBridgeMinVersion() {
513280
513335
  const cfg = await getEnvLessBridgeConfig();
513281
- if (cfg.min_version && lt("1.8.8", cfg.min_version)) {
513282
- return `Your version of localclawd (${"1.8.8"}) is too old for Remote Control.
513336
+ if (cfg.min_version && lt("1.9.0", cfg.min_version)) {
513337
+ return `Your version of localclawd (${"1.9.0"}) is too old for Remote Control.
513283
513338
  Version ${cfg.min_version} or higher is required. Run \`localclawd update\` to update.`;
513284
513339
  }
513285
513340
  return null;
@@ -513751,7 +513806,7 @@ async function initBridgeCore(params) {
513751
513806
  const rawApi = createBridgeApiClient({
513752
513807
  baseUrl,
513753
513808
  getAccessToken,
513754
- runnerVersion: "1.8.8",
513809
+ runnerVersion: "1.9.0",
513755
513810
  onDebug: logForDebugging,
513756
513811
  onAuth401,
513757
513812
  getTrustedDeviceToken
@@ -519470,7 +519525,7 @@ async function startMCPServer(cwd3, debug4, verbose) {
519470
519525
  setCwd(cwd3);
519471
519526
  const server = new Server({
519472
519527
  name: "claude/tengu",
519473
- version: "1.8.8"
519528
+ version: "1.9.0"
519474
519529
  }, {
519475
519530
  capabilities: {
519476
519531
  tools: {}
@@ -520551,7 +520606,7 @@ function WelcomeLogo() {
520551
520606
  dimColor: true,
520552
520607
  children: [
520553
520608
  "v",
520554
- "1.8.8"
520609
+ "1.9.0"
520555
520610
  ]
520556
520611
  }, undefined, true, undefined, this)
520557
520612
  ]
@@ -520742,7 +520797,7 @@ __export(exports_update, {
520742
520797
  });
520743
520798
  async function update() {
520744
520799
  logEvent("tengu_update_check", {});
520745
- writeToStdout(`Current version: ${"1.8.8"}
520800
+ writeToStdout(`Current version: ${"1.9.0"}
520746
520801
  `);
520747
520802
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
520748
520803
  writeToStdout(`Checking for updates to ${channel} version...
@@ -520817,8 +520872,8 @@ async function update() {
520817
520872
  writeToStdout(`localclawd is managed by Homebrew.
520818
520873
  `);
520819
520874
  const latest = await getLatestVersion(channel);
520820
- if (latest && !gte("1.8.8", latest)) {
520821
- writeToStdout(`Update available: ${"1.8.8"} → ${latest}
520875
+ if (latest && !gte("1.9.0", latest)) {
520876
+ writeToStdout(`Update available: ${"1.9.0"} → ${latest}
520822
520877
  `);
520823
520878
  writeToStdout(`
520824
520879
  `);
@@ -520834,8 +520889,8 @@ async function update() {
520834
520889
  writeToStdout(`localclawd is managed by winget.
520835
520890
  `);
520836
520891
  const latest = await getLatestVersion(channel);
520837
- if (latest && !gte("1.8.8", latest)) {
520838
- writeToStdout(`Update available: ${"1.8.8"} → ${latest}
520892
+ if (latest && !gte("1.9.0", latest)) {
520893
+ writeToStdout(`Update available: ${"1.9.0"} → ${latest}
520839
520894
  `);
520840
520895
  writeToStdout(`
520841
520896
  `);
@@ -520849,8 +520904,8 @@ async function update() {
520849
520904
  writeToStdout(`localclawd is managed by apk.
520850
520905
  `);
520851
520906
  const latest = await getLatestVersion(channel);
520852
- if (latest && !gte("1.8.8", latest)) {
520853
- writeToStdout(`Update available: ${"1.8.8"} → ${latest}
520907
+ if (latest && !gte("1.9.0", latest)) {
520908
+ writeToStdout(`Update available: ${"1.9.0"} → ${latest}
520854
520909
  `);
520855
520910
  writeToStdout(`
520856
520911
  `);
@@ -520915,11 +520970,11 @@ async function update() {
520915
520970
  `);
520916
520971
  await gracefulShutdown(1);
520917
520972
  }
520918
- if (result.latestVersion === "1.8.8") {
520919
- writeToStdout(source_default.green(`localclawd is up to date (${"1.8.8"})`) + `
520973
+ if (result.latestVersion === "1.9.0") {
520974
+ writeToStdout(source_default.green(`localclawd is up to date (${"1.9.0"})`) + `
520920
520975
  `);
520921
520976
  } else {
520922
- writeToStdout(source_default.green(`Successfully updated from ${"1.8.8"} to version ${result.latestVersion}`) + `
520977
+ writeToStdout(source_default.green(`Successfully updated from ${"1.9.0"} to version ${result.latestVersion}`) + `
520923
520978
  `);
520924
520979
  await regenerateCompletionCache();
520925
520980
  }
@@ -520979,12 +521034,12 @@ async function update() {
520979
521034
  `);
520980
521035
  await gracefulShutdown(1);
520981
521036
  }
520982
- if (latestVersion === "1.8.8") {
520983
- writeToStdout(source_default.green(`localclawd is up to date (${"1.8.8"})`) + `
521037
+ if (latestVersion === "1.9.0") {
521038
+ writeToStdout(source_default.green(`localclawd is up to date (${"1.9.0"})`) + `
520984
521039
  `);
520985
521040
  await gracefulShutdown(0);
520986
521041
  }
520987
- writeToStdout(`New version available: ${latestVersion} (current: ${"1.8.8"})
521042
+ writeToStdout(`New version available: ${latestVersion} (current: ${"1.9.0"})
520988
521043
  `);
520989
521044
  writeToStdout(`Installing update...
520990
521045
  `);
@@ -521029,7 +521084,7 @@ async function update() {
521029
521084
  logForDebugging(`update: Installation status: ${status2}`);
521030
521085
  switch (status2) {
521031
521086
  case "success":
521032
- writeToStdout(source_default.green(`Successfully updated from ${"1.8.8"} to version ${latestVersion}`) + `
521087
+ writeToStdout(source_default.green(`Successfully updated from ${"1.9.0"} to version ${latestVersion}`) + `
521033
521088
  `);
521034
521089
  await regenerateCompletionCache();
521035
521090
  break;
@@ -522271,7 +522326,7 @@ Run with --debug for more details.
522271
522326
  }
522272
522327
  }
522273
522328
  logForDiagnosticsNoPII("info", "started", {
522274
- version: "1.8.8",
522329
+ version: "1.9.0",
522275
522330
  is_native_binary: isInBundledMode()
522276
522331
  });
522277
522332
  registerCleanup(async () => {
@@ -523055,7 +523110,7 @@ Usage: localclawd --remote "your task description"`, () => gracefulShutdown(1));
523055
523110
  pendingHookMessages
523056
523111
  }, renderAndRun);
523057
523112
  }
523058
- }).version("1.8.8 (localclawd)", "-v, --version", "Output the version number");
523113
+ }).version("1.9.0 (localclawd)", "-v, --version", "Output the version number");
523059
523114
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
523060
523115
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
523061
523116
  if (canUserConfigureAdvisor()) {
@@ -523569,7 +523624,7 @@ if (false) {}
523569
523624
  async function main2() {
523570
523625
  const args = process.argv.slice(2);
523571
523626
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
523572
- console.log(`${"1.8.8"} (localclawd)`);
523627
+ console.log(`${"1.9.0"} (localclawd)`);
523573
523628
  return;
523574
523629
  }
523575
523630
  const {
@@ -523652,4 +523707,4 @@ localclawd crashed: ${msg}
523652
523707
  process.exit(1);
523653
523708
  });
523654
523709
 
523655
- //# debugId=A465C93B87DA448764756E2164756E21
523710
+ //# debugId=40FDF2E96DA5BCD764756E2164756E21
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "localclawd",
3
- "version": "1.8.8",
3
+ "version": "1.9.0",
4
4
  "description": "Local-first coding CLI for vLLM, Ollama, and OpenAI-compatible backends.",
5
5
  "private": false,
6
6
  "type": "module",