localclawd 2.0.9 → 2.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 (3) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.mjs +134 -99
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -22,7 +22,7 @@ The project focuses on four areas:
22
22
  - Compact-context controls for local models that degrade before their advertised context limit.
23
23
  - Multimodal passthrough for local models that support image and screenshot input.
24
24
  - **Lattice memory scoring** — memory files tagged with `tags:` frontmatter are ranked using Jaccard similarity and co-occurrence lattice math. Works offline as a fallback when a hosted side-query model is unavailable.
25
- - **`/keepgoing`** — autonomous task continuation loop. The model works through all outstanding steps without waiting for user input and re-queues itself after each response. Stops when the model emits `TASK COMPLETE:` or `NEEDS INPUT:`. Aliases: `/kg`, `/continue`.
25
+ - **`/keepgoing`** — autonomous task continuation loop. After each round, a lightweight synthesis agent analyzes the full conversation and writes a precise directive for the next round the model doesn't need to self-direct. Stops when the user presses Ctrl+C or sends `/stop`. Aliases: `/kg`, `/continue`.
26
26
  - **`/buddy`** — spawns a named ASCII animal companion for the session with a personality. Use `/buddy pet` to hear their thoughts on the current codebase.
27
27
  - **`/images`** — quick-start slash command that forwards into the project-local image pipeline setup flow, with ComfyUI-first defaults and helper scaffolding.
28
28
  - **`/image-pipeline`** — scaffolds and uses a project-local image generation workflow for game textures, sprites, and related art assets under `.localclawd/image-pipeline/`, then visually reviews outputs when the current model/runtime supports image reads.
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/${"2.0.9"}`;
87611
+ return `claude-code/${"2.1.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/${"2.0.9"} (${process.env.USER_TYPE}, ${process.env.CLAUDE_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
87633
+ return `claude-cli/${"2.1.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/${"2.0.9"}${suffix}`;
87647
+ return `claude-code/${"2.1.0"}${suffix}`;
87648
87648
  }
87649
87649
  function getWebFetchUserAgent() {
87650
87650
  return `Claude-User (${getClaudeCodeUserAgent()}; +https://support.anthropic.com/)`;
@@ -88024,14 +88024,14 @@ async function* iterateSseEvents(body) {
88024
88024
  }
88025
88025
  }
88026
88026
  }
88027
- function createStreamingResponse(upstream, model) {
88027
+ function createStreamingResponse(upstream, model, estimatedInputTokens = 0) {
88028
88028
  const requestId = upstream.headers.get("x-request-id") || randomUUID2();
88029
88029
  const stream4 = new ReadableStream({
88030
88030
  async start(controller) {
88031
88031
  const messageId = `msg_${randomUUID2()}`;
88032
88032
  const contentBlockIndexes = new Map;
88033
88033
  let nextIndex = 0;
88034
- let finalUsage = toAnthropicUsage(undefined);
88034
+ let finalUsage = { ...toAnthropicUsage(undefined), input_tokens: estimatedInputTokens };
88035
88035
  let finalStopReason = null;
88036
88036
  controller.enqueue(encodeSse("message_start", {
88037
88037
  type: "message_start",
@@ -88213,7 +88213,7 @@ function buildLocalLLMFetch(inner) {
88213
88213
  }
88214
88214
  const model = openAiRequest.model;
88215
88215
  if (requestBody.stream) {
88216
- return createStreamingResponse(upstream, model);
88216
+ return createStreamingResponse(upstream, model, estimateTokensFromRequest(requestBody));
88217
88217
  }
88218
88218
  const payload = await upstream.json();
88219
88219
  const anthropicResponse = buildAnthropicMessageFromOpenAI(payload, model);
@@ -130791,7 +130791,7 @@ function getAttributionHeader(fingerprint) {
130791
130791
  if (!isAttributionHeaderEnabled()) {
130792
130792
  return "";
130793
130793
  }
130794
- const version = `${"2.0.9"}.${fingerprint}`;
130794
+ const version = `${"2.1.0"}.${fingerprint}`;
130795
130795
  const entrypoint = process.env.CLAUDE_CODE_ENTRYPOINT ?? "unknown";
130796
130796
  const cch = "";
130797
130797
  const workload = getWorkload();
@@ -146980,7 +146980,7 @@ var init_metadata = __esm(() => {
146980
146980
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
146981
146981
  WHITESPACE_REGEX = /\s+/;
146982
146982
  getVersionBase = memoize_default(() => {
146983
- const match = "2.0.9".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
146983
+ const match = "2.1.0".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
146984
146984
  return match ? match[0] : undefined;
146985
146985
  });
146986
146986
  buildEnvContext = memoize_default(async () => {
@@ -147020,9 +147020,9 @@ var init_metadata = __esm(() => {
147020
147020
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
147021
147021
  isClaudeCodeAction: isEnvTruthy(process.env.CLAUDE_CODE_ACTION),
147022
147022
  isClaudeAiAuth: isClaudeAISubscriber(),
147023
- version: "2.0.9",
147023
+ version: "2.1.0",
147024
147024
  versionBase: getVersionBase(),
147025
- buildTime: "2026-05-09T16:13:29.495Z",
147025
+ buildTime: "2026-05-09T16:28:38.867Z",
147026
147026
  deploymentEnvironment: env3.detectDeploymentEnvironment(),
147027
147027
  ...isEnvTruthy(process.env.GITHUB_ACTIONS) && {
147028
147028
  githubEventName: process.env.GITHUB_EVENT_NAME,
@@ -179598,7 +179598,7 @@ function getTelemetryAttributes() {
179598
179598
  attributes["session.id"] = sessionId;
179599
179599
  }
179600
179600
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
179601
- attributes["app.version"] = "2.0.9";
179601
+ attributes["app.version"] = "2.1.0";
179602
179602
  }
179603
179603
  const oauthAccount = getOauthAccountInfo();
179604
179604
  if (oauthAccount) {
@@ -180549,7 +180549,7 @@ function isAutoCompactEnabled() {
180549
180549
  return true;
180550
180550
  }
180551
180551
  async function shouldAutoCompact(messages, model, querySource, snipTokensFreed = 0) {
180552
- if (querySource === "session_memory" || querySource === "compact") {
180552
+ if (querySource === "session_memory" || querySource === "compact" || querySource === "keepgoing_synthesis") {
180553
180553
  return false;
180554
180554
  }
180555
180555
  if (false) {}
@@ -242398,7 +242398,7 @@ function getInstallationEnv() {
242398
242398
  return;
242399
242399
  }
242400
242400
  function getClaudeCodeVersion() {
242401
- return "2.0.9";
242401
+ return "2.1.0";
242402
242402
  }
242403
242403
  async function getInstalledVSCodeExtensionVersion(command) {
242404
242404
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -247672,7 +247672,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
247672
247672
  const client4 = new Client({
247673
247673
  name: "localclawd",
247674
247674
  title: "localclawd",
247675
- version: "2.0.9",
247675
+ version: "2.1.0",
247676
247676
  description: "local-first AI coding tool",
247677
247677
  websiteUrl: PRODUCT_URL
247678
247678
  }, {
@@ -248014,7 +248014,7 @@ var init_client9 = __esm(() => {
248014
248014
  const client4 = new Client({
248015
248015
  name: "localclawd",
248016
248016
  title: "localclawd",
248017
- version: "2.0.9",
248017
+ version: "2.1.0",
248018
248018
  description: "local-first AI coding tool",
248019
248019
  websiteUrl: PRODUCT_URL
248020
248020
  }, {
@@ -262416,7 +262416,7 @@ function computeFingerprint(messageText, version) {
262416
262416
  }
262417
262417
  function computeFingerprintFromMessages(messages) {
262418
262418
  const firstMessageText = extractFirstMessageText(messages);
262419
- return computeFingerprint(firstMessageText, "2.0.9");
262419
+ return computeFingerprint(firstMessageText, "2.1.0");
262420
262420
  }
262421
262421
  var FINGERPRINT_SALT = "59cf53e54c78";
262422
262422
  var init_fingerprint = () => {};
@@ -262458,7 +262458,7 @@ async function sideQuery(opts) {
262458
262458
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
262459
262459
  }
262460
262460
  const messageText = extractFirstUserMessageText(messages);
262461
- const fingerprint = computeFingerprint(messageText, "2.0.9");
262461
+ const fingerprint = computeFingerprint(messageText, "2.1.0");
262462
262462
  const attributionHeader = getAttributionHeader(fingerprint);
262463
262463
  const systemBlocks = [
262464
262464
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -283206,7 +283206,7 @@ var init_user = __esm(() => {
283206
283206
  deviceId,
283207
283207
  sessionId: getSessionId(),
283208
283208
  email: getEmail(),
283209
- appVersion: "2.0.9",
283209
+ appVersion: "2.1.0",
283210
283210
  platform: getHostPlatformForAnalytics(),
283211
283211
  organizationUuid,
283212
283212
  accountUuid,
@@ -284271,7 +284271,7 @@ async function initializeBetaTracing(resource) {
284271
284271
  });
284272
284272
  logs.setGlobalLoggerProvider(loggerProvider);
284273
284273
  setLoggerProvider(loggerProvider);
284274
- const eventLogger = logs.getLogger("com.anthropic.claude_code.events", "2.0.9");
284274
+ const eventLogger = logs.getLogger("com.anthropic.claude_code.events", "2.1.0");
284275
284275
  setEventLogger(eventLogger);
284276
284276
  process.on("beforeExit", async () => {
284277
284277
  await loggerProvider?.forceFlush();
@@ -284311,7 +284311,7 @@ async function initializeTelemetry() {
284311
284311
  const platform2 = getPlatform();
284312
284312
  const baseAttributes = {
284313
284313
  [ATTR_SERVICE_NAME4]: "claude-code",
284314
- [ATTR_SERVICE_VERSION4]: "2.0.9"
284314
+ [ATTR_SERVICE_VERSION4]: "2.1.0"
284315
284315
  };
284316
284316
  if (platform2 === "wsl") {
284317
284317
  const wslVersion = getWslVersion();
@@ -284356,7 +284356,7 @@ async function initializeTelemetry() {
284356
284356
  } catch {}
284357
284357
  };
284358
284358
  registerCleanup(shutdownTelemetry2);
284359
- return meterProvider2.getMeter("com.anthropic.claude_code", "2.0.9");
284359
+ return meterProvider2.getMeter("com.anthropic.claude_code", "2.1.0");
284360
284360
  }
284361
284361
  const meterProvider = new MeterProvider4({
284362
284362
  resource,
@@ -284376,7 +284376,7 @@ async function initializeTelemetry() {
284376
284376
  });
284377
284377
  logs.setGlobalLoggerProvider(loggerProvider);
284378
284378
  setLoggerProvider(loggerProvider);
284379
- const eventLogger = logs.getLogger("com.anthropic.claude_code.events", "2.0.9");
284379
+ const eventLogger = logs.getLogger("com.anthropic.claude_code.events", "2.1.0");
284380
284380
  setEventLogger(eventLogger);
284381
284381
  logForDebugging("[3P telemetry] Event logger set successfully");
284382
284382
  process.on("beforeExit", async () => {
@@ -284438,7 +284438,7 @@ Current timeout: ${timeoutMs}ms
284438
284438
  }
284439
284439
  };
284440
284440
  registerCleanup(shutdownTelemetry);
284441
- return meterProvider.getMeter("com.anthropic.claude_code", "2.0.9");
284441
+ return meterProvider.getMeter("com.anthropic.claude_code", "2.1.0");
284442
284442
  }
284443
284443
  async function flushTelemetry() {
284444
284444
  const meterProvider = getMeterProvider();
@@ -285628,7 +285628,7 @@ function detectLinuxGlobPatternWarnings() {
285628
285628
  }
285629
285629
  async function getDoctorDiagnostic() {
285630
285630
  const installationType = await getCurrentInstallationType();
285631
- const version = typeof MACRO !== "undefined" ? "2.0.9" : "unknown";
285631
+ const version = typeof MACRO !== "undefined" ? "2.1.0" : "unknown";
285632
285632
  const installationPath = await getInstallationPath();
285633
285633
  const invokedBinary = getInvokedBinary();
285634
285634
  const multipleInstallations = await detectMultipleInstallations();
@@ -286569,8 +286569,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
286569
286569
  const maxVersion = await getMaxVersion();
286570
286570
  if (maxVersion && gt(version, maxVersion)) {
286571
286571
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version} to ${maxVersion}`);
286572
- if (gte("2.0.9", maxVersion)) {
286573
- logForDebugging(`Native installer: current version ${"2.0.9"} is already at or above maxVersion ${maxVersion}, skipping update`);
286572
+ if (gte("2.1.0", maxVersion)) {
286573
+ logForDebugging(`Native installer: current version ${"2.1.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
286574
286574
  logEvent("tengu_native_update_skipped_max_version", {
286575
286575
  latency_ms: Date.now() - startTime,
286576
286576
  max_version: maxVersion,
@@ -286581,7 +286581,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
286581
286581
  version = maxVersion;
286582
286582
  }
286583
286583
  }
286584
- if (!forceReinstall && version === "2.0.9" && await versionIsAvailable(version) && await isPossibleLocalClawdBinary(executablePath)) {
286584
+ if (!forceReinstall && version === "2.1.0" && await versionIsAvailable(version) && await isPossibleLocalClawdBinary(executablePath)) {
286585
286585
  logForDebugging(`Found ${version} at ${executablePath}, skipping install`);
286586
286586
  logEvent("tengu_native_update_complete", {
286587
286587
  latency_ms: Date.now() - startTime,
@@ -331857,7 +331857,7 @@ function getAnthropicEnvMetadata() {
331857
331857
  function getBuildAgeMinutes() {
331858
331858
  if (false)
331859
331859
  ;
331860
- const buildTime = new Date("2026-05-09T16:13:29.495Z").getTime();
331860
+ const buildTime = new Date("2026-05-09T16:28:38.867Z").getTime();
331861
331861
  if (isNaN(buildTime))
331862
331862
  return;
331863
331863
  return Math.floor((Date.now() - buildTime) / 60000);
@@ -360689,7 +360689,7 @@ function Feedback({
360689
360689
  platform: env3.platform,
360690
360690
  gitRepo: envInfo.isGit,
360691
360691
  terminal: env3.terminal,
360692
- version: "2.0.9",
360692
+ version: "2.1.0",
360693
360693
  transcript: normalizeMessagesForAPI(messages),
360694
360694
  errors: sanitizedErrors,
360695
360695
  lastApiRequest: getLastAPIRequest(),
@@ -360881,7 +360881,7 @@ function Feedback({
360881
360881
  ", ",
360882
360882
  env3.terminal,
360883
360883
  ", v",
360884
- "2.0.9"
360884
+ "2.1.0"
360885
360885
  ]
360886
360886
  }, undefined, true, undefined, this)
360887
360887
  ]
@@ -360987,7 +360987,7 @@ ${sanitizedDescription}
360987
360987
  ` + `**Environment Info**
360988
360988
  ` + `- Platform: ${env3.platform}
360989
360989
  ` + `- Terminal: ${env3.terminal}
360990
- ` + `- Version: ${"2.0.9"}
360990
+ ` + `- Version: ${"2.1.0"}
360991
360991
  ` + `- Feedback ID: ${feedbackId}
360992
360992
  ` + `
360993
360993
  **Errors**
@@ -363615,7 +363615,7 @@ function buildPrimarySection() {
363615
363615
  }, undefined, false, undefined, this);
363616
363616
  return [{
363617
363617
  label: "Version",
363618
- value: "2.0.9"
363618
+ value: "2.1.0"
363619
363619
  }, {
363620
363620
  label: "Session name",
363621
363621
  value: nameValue
@@ -368296,7 +368296,7 @@ function Config({
368296
368296
  }
368297
368297
  }, undefined, false, undefined, this)
368298
368298
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime176.jsxDEV(ChannelDowngradeDialog, {
368299
- currentVersion: "2.0.9",
368299
+ currentVersion: "2.1.0",
368300
368300
  onChoice: (choice) => {
368301
368301
  setShowSubmenu(null);
368302
368302
  setTabsHidden(false);
@@ -368308,7 +368308,7 @@ function Config({
368308
368308
  autoUpdatesChannel: "stable"
368309
368309
  };
368310
368310
  if (choice === "stay") {
368311
- newSettings.minimumVersion = "2.0.9";
368311
+ newSettings.minimumVersion = "2.1.0";
368312
368312
  }
368313
368313
  updateSettingsForSource("userSettings", newSettings);
368314
368314
  setSettingsData((prev_27) => ({
@@ -377353,6 +377353,44 @@ function extractLastAssistantText(messages) {
377353
377353
  }
377354
377354
  return "";
377355
377355
  }
377356
+ async function synthesizeNextDirective(focus) {
377357
+ try {
377358
+ const cacheSafeParams = getLastCacheSafeParams();
377359
+ if (!cacheSafeParams)
377360
+ return "";
377361
+ const focusLine = focus ? `
377362
+ The overall session focus is: ${focus}` : "";
377363
+ const prompt = `You are a task director reviewing an autonomous coding session.${focusLine}
377364
+
377365
+ Based on the conversation above, write a precise 2-3 sentence directive for the NEXT round of work.
377366
+ - Reference specific files, functions, or tests by name
377367
+ - Build directly on what was just completed or unblocked
377368
+ - Be concrete: name the exact next action, what to verify, and what "done" looks like
377369
+
377370
+ Write ONLY the directive. No preamble, no markdown, no tool calls. Start immediately with the action.`;
377371
+ const result = await runForkedAgent({
377372
+ promptMessages: [createUserMessage({ content: prompt })],
377373
+ cacheSafeParams,
377374
+ canUseTool: async () => ({
377375
+ behavior: "deny",
377376
+ message: "Synthesis agent is text-only",
377377
+ decisionReason: { type: "other", reason: "synthesis" }
377378
+ }),
377379
+ querySource: "keepgoing_synthesis",
377380
+ forkLabel: "keepgoing_synthesis",
377381
+ maxTurns: 1,
377382
+ skipTranscript: true,
377383
+ skipCacheWrite: true
377384
+ });
377385
+ const assistantMsg = getLastAssistantMessage(result.messages);
377386
+ if (!assistantMsg || assistantMsg.isApiErrorMessage)
377387
+ return "";
377388
+ return extractTextContent(assistantMsg.message.content, `
377389
+ `).trim().slice(0, 600);
377390
+ } catch {
377391
+ return "";
377392
+ }
377393
+ }
377356
377394
  function buildOnboardingPrompt(round, focus, externalMsg, contextCompacted) {
377357
377395
  const modeTag = isThinkHarderMode ? " · \uD83E\uDDE0 THINK HARDER" : "";
377358
377396
  const focusLine = focus ? `
@@ -377386,19 +377424,13 @@ TodoCreate, TodoUpdate
377386
377424
  · Run builds/tests after significant changes
377387
377425
  · If genuinely blocked: state the blocker clearly, spawn a subagent to research it, or try an alternative approach — do NOT stall
377388
377426
 
377389
- ━━━ REQUIRED ENDING ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
377390
- At the END of every response, write exactly these two lines:
377427
+ ━━━ OPTIONAL ENDING ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
377428
+ You may end your response with:
377391
377429
 
377392
377430
  SUMMARY: <1-2 sentences of what you accomplished this round>
377393
- NEXT: <1–3 sentences describing your specific plan for the next round>
377394
-
377395
- Both lines are required every round without exception.
377396
- NEXT: becomes your only prompt next round — be precise about files,
377397
- actions, and outcomes to verify.
377431
+ NEXT: <your plan for the following round (used as fallback if needed)>
377398
377432
 
377399
- CRITICAL: You MUST write "NEXT: ..." at the end of EVERY response.
377400
- If you omit NEXT: the system will repeat this entire onboarding prompt
377401
- next round instead of your directive — you will lose continuity.`;
377433
+ These help with context continuity but are not required.`;
377402
377434
  }
377403
377435
  function buildSelfDirectedPrompt(round, directive, focus, externalMsg) {
377404
377436
  const modeTag = isThinkHarderMode ? " · \uD83E\uDDE0 THINK HARDER" : "";
@@ -377417,9 +377449,7 @@ ${telegramSection}${thinkHarder}
377417
377449
  DIRECTIVE:
377418
377450
  ${directive}
377419
377451
 
377420
- Proceed. End your response with:
377421
- SUMMARY: <what you accomplished this round>
377422
- NEXT: <your plan for the following round>`;
377452
+ Proceed.`;
377423
377453
  }
377424
377454
  function KeepGoingBanner({
377425
377455
  round,
@@ -377564,10 +377594,13 @@ async function callInner3(onDone, context7, args) {
377564
377594
  }
377565
377595
  const contextCompacted = lastText === NO_CONTENT_MESSAGE || lastText.trim() === "";
377566
377596
  if (!contextCompacted) {
377567
- const newDirective = extractSelfDirective(lastText);
377568
- if (newDirective)
377569
- sessionSelfDirective = newDirective;
377570
- if (!sessionSelfDirective && sessionRound > 1) {
377597
+ const extracted = extractSelfDirective(lastText);
377598
+ const synthesized = lastText.trim() && sessionRound >= 1 ? await synthesizeNextDirective(focus) : "";
377599
+ if (synthesized) {
377600
+ sessionSelfDirective = synthesized;
377601
+ } else if (extracted) {
377602
+ sessionSelfDirective = extracted;
377603
+ } else if (sessionRound > 1) {
377571
377604
  const preview = lastText.slice(0, 300).replace(/\n/g, " ").trim();
377572
377605
  sessionSelfDirective = preview ? `Continue from where you left off: ${preview.slice(0, 200)}` : "Continue with the next most important task.";
377573
377606
  }
@@ -377668,6 +377701,8 @@ var init_keepgoing = __esm(() => {
377668
377701
  init_signalBot();
377669
377702
  init_telegramSignals();
377670
377703
  init_messageQueueManager();
377704
+ init_forkedAgent();
377705
+ init_messages3();
377671
377706
  React58 = __toESM(require_react(), 1);
377672
377707
  jsx_dev_runtime196 = __toESM(require_jsx_dev_runtime(), 1);
377673
377708
  });
@@ -385974,7 +386009,7 @@ function Help(t0) {
385974
386009
  let t6;
385975
386010
  if ($2[31] !== tabs) {
385976
386011
  t6 = /* @__PURE__ */ jsx_dev_runtime220.jsxDEV(Tabs, {
385977
- title: `localclawd v${"2.0.9"}`,
386012
+ title: `localclawd v${"2.1.0"}`,
385978
386013
  color: "professionalBlue",
385979
386014
  defaultTab: "general",
385980
386015
  children: tabs
@@ -403236,7 +403271,7 @@ function getRecentReleaseNotes(currentVersion, previousVersion, changelogContent
403236
403271
  }
403237
403272
  return [];
403238
403273
  }
403239
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "2.0.9") {
403274
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "2.1.0") {
403240
403275
  if (process.env.USER_TYPE === "ant") {
403241
403276
  const changelog = MACRO.VERSION_CHANGELOG;
403242
403277
  if (changelog) {
@@ -403263,7 +403298,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "2.0.9") {
403263
403298
  releaseNotes
403264
403299
  };
403265
403300
  }
403266
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "2.0.9") {
403301
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "2.1.0") {
403267
403302
  if (process.env.USER_TYPE === "ant") {
403268
403303
  const changelog = MACRO.VERSION_CHANGELOG;
403269
403304
  if (changelog) {
@@ -403420,7 +403455,7 @@ function getRecentActivitySync() {
403420
403455
  return cachedActivity;
403421
403456
  }
403422
403457
  function getLogoDisplayData() {
403423
- const version = process.env.DEMO_VERSION ?? "2.0.9";
403458
+ const version = process.env.DEMO_VERSION ?? "2.1.0";
403424
403459
  const serverUrl = getDirectConnectServerUrl();
403425
403460
  const displayPath = process.env.DEMO_VERSION ? "/code/claude" : getDisplayPath(getCwd());
403426
403461
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -404520,7 +404555,7 @@ function Logo() {
404520
404555
  if ($2[2] === Symbol.for("react.memo_cache_sentinel")) {
404521
404556
  t2 = () => {
404522
404557
  const currentConfig = getGlobalConfig();
404523
- if (currentConfig.lastReleaseNotesSeen === "2.0.9") {
404558
+ if (currentConfig.lastReleaseNotesSeen === "2.1.0") {
404524
404559
  return;
404525
404560
  }
404526
404561
  saveGlobalConfig(_temp326);
@@ -405179,12 +405214,12 @@ function Logo() {
405179
405214
  return t41;
405180
405215
  }
405181
405216
  function _temp326(current) {
405182
- if (current.lastReleaseNotesSeen === "2.0.9") {
405217
+ if (current.lastReleaseNotesSeen === "2.1.0") {
405183
405218
  return current;
405184
405219
  }
405185
405220
  return {
405186
405221
  ...current,
405187
- lastReleaseNotesSeen: "2.0.9"
405222
+ lastReleaseNotesSeen: "2.1.0"
405188
405223
  };
405189
405224
  }
405190
405225
  function _temp241(s_0) {
@@ -435663,7 +435698,7 @@ async function captureMemoryDiagnostics(trigger, dumpNumber = 0) {
435663
435698
  smapsRollup,
435664
435699
  platform: process.platform,
435665
435700
  nodeVersion: process.version,
435666
- ccVersion: "2.0.9"
435701
+ ccVersion: "2.1.0"
435667
435702
  };
435668
435703
  }
435669
435704
  async function performHeapDump(trigger = "manual", dumpNumber = 0) {
@@ -436248,7 +436283,7 @@ var init_bridge_kick = __esm(() => {
436248
436283
  var call88 = async () => {
436249
436284
  return {
436250
436285
  type: "text",
436251
- value: `${"2.0.9"} (built ${"2026-05-09T16:13:29.495Z"})`
436286
+ value: `${"2.1.0"} (built ${"2026-05-09T16:28:38.867Z"})`
436252
436287
  };
436253
436288
  }, version, version_default;
436254
436289
  var init_version = __esm(() => {
@@ -444192,7 +444227,7 @@ function generateHtmlReport(data, insights) {
444192
444227
  </html>`;
444193
444228
  }
444194
444229
  function buildExportData(data, insights, facets, remoteStats) {
444195
- const version2 = typeof MACRO !== "undefined" ? "2.0.9" : "unknown";
444230
+ const version2 = typeof MACRO !== "undefined" ? "2.1.0" : "unknown";
444196
444231
  const remote_hosts_collected = remoteStats?.hosts.filter((h) => h.sessionCount > 0).map((h) => h.name);
444197
444232
  const facets_summary = {
444198
444233
  total: facets.size,
@@ -448395,7 +448430,7 @@ var init_sessionStorage = __esm(() => {
448395
448430
  init_settings2();
448396
448431
  init_slowOperations();
448397
448432
  init_uuid();
448398
- VERSION6 = typeof MACRO !== "undefined" ? "2.0.9" : "unknown";
448433
+ VERSION6 = typeof MACRO !== "undefined" ? "2.1.0" : "unknown";
448399
448434
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
448400
448435
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
448401
448436
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -449596,7 +449631,7 @@ var init_filesystem = __esm(() => {
449596
449631
  });
449597
449632
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
449598
449633
  const nonce = randomBytes20(16).toString("hex");
449599
- return join151(getClaudeTempDir(), "bundled-skills", "2.0.9", nonce);
449634
+ return join151(getClaudeTempDir(), "bundled-skills", "2.1.0", nonce);
449600
449635
  });
449601
449636
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
449602
449637
  });
@@ -458833,7 +458868,7 @@ function buildSystemInitMessage(inputs) {
458833
458868
  slash_commands: inputs.commands.filter((c5) => c5.userInvocable !== false).map((c5) => c5.name),
458834
458869
  apiKeySource: getAnthropicApiKeyWithSource().source,
458835
458870
  betas: getSdkBetas(),
458836
- claude_code_version: "2.0.9",
458871
+ claude_code_version: "2.1.0",
458837
458872
  output_style: outputStyle2,
458838
458873
  agents: inputs.agents.map((agent) => agent.agentType),
458839
458874
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill) => skill.name),
@@ -472990,7 +473025,7 @@ var init_useVoiceEnabled = __esm(() => {
472990
473025
  function getSemverPart(version2) {
472991
473026
  return `${import_semver10.major(version2, { loose: true })}.${import_semver10.minor(version2, { loose: true })}.${import_semver10.patch(version2, { loose: true })}`;
472992
473027
  }
472993
- function useUpdateNotification(updatedVersion, initialVersion = "2.0.9") {
473028
+ function useUpdateNotification(updatedVersion, initialVersion = "2.1.0") {
472994
473029
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react214.useState(() => getSemverPart(initialVersion));
472995
473030
  if (!updatedVersion) {
472996
473031
  return null;
@@ -473030,7 +473065,7 @@ function AutoUpdater({
473030
473065
  return;
473031
473066
  }
473032
473067
  if (false) {}
473033
- const currentVersion = "2.0.9";
473068
+ const currentVersion = "2.1.0";
473034
473069
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
473035
473070
  let latestVersion = await getLatestVersion(channel);
473036
473071
  const isDisabled = isAutoUpdaterDisabled();
@@ -473241,12 +473276,12 @@ function NativeAutoUpdater({
473241
473276
  logEvent("tengu_native_auto_updater_start", {});
473242
473277
  try {
473243
473278
  const maxVersion = await getMaxVersion();
473244
- if (maxVersion && gt("2.0.9", maxVersion)) {
473279
+ if (maxVersion && gt("2.1.0", maxVersion)) {
473245
473280
  const msg = await getMaxVersionMessage();
473246
473281
  setMaxVersionIssue(msg ?? "affects your version");
473247
473282
  }
473248
473283
  const result = await installLatest(channel);
473249
- const currentVersion = "2.0.9";
473284
+ const currentVersion = "2.1.0";
473250
473285
  const latencyMs = Date.now() - startTime;
473251
473286
  if (result.lockFailed) {
473252
473287
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -473381,17 +473416,17 @@ function PackageManagerAutoUpdater(t0) {
473381
473416
  const maxVersion = await getMaxVersion();
473382
473417
  if (maxVersion && latest && gt(latest, maxVersion)) {
473383
473418
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
473384
- if (gte("2.0.9", maxVersion)) {
473385
- logForDebugging(`PackageManagerAutoUpdater: current version ${"2.0.9"} is already at or above maxVersion ${maxVersion}, skipping update`);
473419
+ if (gte("2.1.0", maxVersion)) {
473420
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"2.1.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
473386
473421
  setUpdateAvailable(false);
473387
473422
  return;
473388
473423
  }
473389
473424
  latest = maxVersion;
473390
473425
  }
473391
- const hasUpdate = latest && !gte("2.0.9", latest) && !shouldSkipVersion(latest);
473426
+ const hasUpdate = latest && !gte("2.1.0", latest) && !shouldSkipVersion(latest);
473392
473427
  setUpdateAvailable(!!hasUpdate);
473393
473428
  if (hasUpdate) {
473394
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"2.0.9"} -> ${latest}`);
473429
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"2.1.0"} -> ${latest}`);
473395
473430
  }
473396
473431
  };
473397
473432
  $2[0] = t1;
@@ -473425,7 +473460,7 @@ function PackageManagerAutoUpdater(t0) {
473425
473460
  wrap: "truncate",
473426
473461
  children: [
473427
473462
  "currentVersion: ",
473428
- "2.0.9"
473463
+ "2.1.0"
473429
473464
  ]
473430
473465
  }, undefined, true, undefined, this);
473431
473466
  $2[3] = verbose;
@@ -480985,7 +481020,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
480985
481020
  project_dir: getOriginalCwd(),
480986
481021
  added_dirs: addedDirs
480987
481022
  },
480988
- version: "2.0.9",
481023
+ version: "2.1.0",
480989
481024
  output_style: {
480990
481025
  name: outputStyleName
480991
481026
  },
@@ -492557,7 +492592,7 @@ async function submitTranscriptShare(messages, trigger, appearanceId) {
492557
492592
  } catch {}
492558
492593
  const data = {
492559
492594
  trigger,
492560
- version: "2.0.9",
492595
+ version: "2.1.0",
492561
492596
  platform: process.platform,
492562
492597
  transcript,
492563
492598
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -509466,7 +509501,7 @@ function appendToLog(path17, message) {
509466
509501
  cwd: getFsImplementation().cwd(),
509467
509502
  userType: process.env.USER_TYPE,
509468
509503
  sessionId: getSessionId(),
509469
- version: "2.0.9"
509504
+ version: "2.1.0"
509470
509505
  };
509471
509506
  getLogWriter(path17).write(messageWithTimestamp);
509472
509507
  }
@@ -513480,8 +513515,8 @@ async function getEnvLessBridgeConfig() {
513480
513515
  }
513481
513516
  async function checkEnvLessBridgeMinVersion() {
513482
513517
  const cfg = await getEnvLessBridgeConfig();
513483
- if (cfg.min_version && lt("2.0.9", cfg.min_version)) {
513484
- return `Your version of localclawd (${"2.0.9"}) is too old for Remote Control.
513518
+ if (cfg.min_version && lt("2.1.0", cfg.min_version)) {
513519
+ return `Your version of localclawd (${"2.1.0"}) is too old for Remote Control.
513485
513520
  Version ${cfg.min_version} or higher is required. Run \`localclawd update\` to update.`;
513486
513521
  }
513487
513522
  return null;
@@ -513953,7 +513988,7 @@ async function initBridgeCore(params) {
513953
513988
  const rawApi = createBridgeApiClient({
513954
513989
  baseUrl,
513955
513990
  getAccessToken,
513956
- runnerVersion: "2.0.9",
513991
+ runnerVersion: "2.1.0",
513957
513992
  onDebug: logForDebugging,
513958
513993
  onAuth401,
513959
513994
  getTrustedDeviceToken
@@ -519672,7 +519707,7 @@ async function startMCPServer(cwd3, debug4, verbose) {
519672
519707
  setCwd(cwd3);
519673
519708
  const server = new Server({
519674
519709
  name: "claude/tengu",
519675
- version: "2.0.9"
519710
+ version: "2.1.0"
519676
519711
  }, {
519677
519712
  capabilities: {
519678
519713
  tools: {}
@@ -520753,7 +520788,7 @@ function WelcomeLogo() {
520753
520788
  dimColor: true,
520754
520789
  children: [
520755
520790
  "v",
520756
- "2.0.9"
520791
+ "2.1.0"
520757
520792
  ]
520758
520793
  }, undefined, true, undefined, this)
520759
520794
  ]
@@ -520944,7 +520979,7 @@ __export(exports_update, {
520944
520979
  });
520945
520980
  async function update() {
520946
520981
  logEvent("tengu_update_check", {});
520947
- writeToStdout(`Current version: ${"2.0.9"}
520982
+ writeToStdout(`Current version: ${"2.1.0"}
520948
520983
  `);
520949
520984
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
520950
520985
  writeToStdout(`Checking for updates to ${channel} version...
@@ -521019,8 +521054,8 @@ async function update() {
521019
521054
  writeToStdout(`localclawd is managed by Homebrew.
521020
521055
  `);
521021
521056
  const latest = await getLatestVersion(channel);
521022
- if (latest && !gte("2.0.9", latest)) {
521023
- writeToStdout(`Update available: ${"2.0.9"} → ${latest}
521057
+ if (latest && !gte("2.1.0", latest)) {
521058
+ writeToStdout(`Update available: ${"2.1.0"} → ${latest}
521024
521059
  `);
521025
521060
  writeToStdout(`
521026
521061
  `);
@@ -521036,8 +521071,8 @@ async function update() {
521036
521071
  writeToStdout(`localclawd is managed by winget.
521037
521072
  `);
521038
521073
  const latest = await getLatestVersion(channel);
521039
- if (latest && !gte("2.0.9", latest)) {
521040
- writeToStdout(`Update available: ${"2.0.9"} → ${latest}
521074
+ if (latest && !gte("2.1.0", latest)) {
521075
+ writeToStdout(`Update available: ${"2.1.0"} → ${latest}
521041
521076
  `);
521042
521077
  writeToStdout(`
521043
521078
  `);
@@ -521051,8 +521086,8 @@ async function update() {
521051
521086
  writeToStdout(`localclawd is managed by apk.
521052
521087
  `);
521053
521088
  const latest = await getLatestVersion(channel);
521054
- if (latest && !gte("2.0.9", latest)) {
521055
- writeToStdout(`Update available: ${"2.0.9"} → ${latest}
521089
+ if (latest && !gte("2.1.0", latest)) {
521090
+ writeToStdout(`Update available: ${"2.1.0"} → ${latest}
521056
521091
  `);
521057
521092
  writeToStdout(`
521058
521093
  `);
@@ -521117,11 +521152,11 @@ async function update() {
521117
521152
  `);
521118
521153
  await gracefulShutdown(1);
521119
521154
  }
521120
- if (result.latestVersion === "2.0.9") {
521121
- writeToStdout(source_default.green(`localclawd is up to date (${"2.0.9"})`) + `
521155
+ if (result.latestVersion === "2.1.0") {
521156
+ writeToStdout(source_default.green(`localclawd is up to date (${"2.1.0"})`) + `
521122
521157
  `);
521123
521158
  } else {
521124
- writeToStdout(source_default.green(`Successfully updated from ${"2.0.9"} to version ${result.latestVersion}`) + `
521159
+ writeToStdout(source_default.green(`Successfully updated from ${"2.1.0"} to version ${result.latestVersion}`) + `
521125
521160
  `);
521126
521161
  await regenerateCompletionCache();
521127
521162
  }
@@ -521181,12 +521216,12 @@ async function update() {
521181
521216
  `);
521182
521217
  await gracefulShutdown(1);
521183
521218
  }
521184
- if (latestVersion === "2.0.9") {
521185
- writeToStdout(source_default.green(`localclawd is up to date (${"2.0.9"})`) + `
521219
+ if (latestVersion === "2.1.0") {
521220
+ writeToStdout(source_default.green(`localclawd is up to date (${"2.1.0"})`) + `
521186
521221
  `);
521187
521222
  await gracefulShutdown(0);
521188
521223
  }
521189
- writeToStdout(`New version available: ${latestVersion} (current: ${"2.0.9"})
521224
+ writeToStdout(`New version available: ${latestVersion} (current: ${"2.1.0"})
521190
521225
  `);
521191
521226
  writeToStdout(`Installing update...
521192
521227
  `);
@@ -521231,7 +521266,7 @@ async function update() {
521231
521266
  logForDebugging(`update: Installation status: ${status2}`);
521232
521267
  switch (status2) {
521233
521268
  case "success":
521234
- writeToStdout(source_default.green(`Successfully updated from ${"2.0.9"} to version ${latestVersion}`) + `
521269
+ writeToStdout(source_default.green(`Successfully updated from ${"2.1.0"} to version ${latestVersion}`) + `
521235
521270
  `);
521236
521271
  await regenerateCompletionCache();
521237
521272
  break;
@@ -522473,7 +522508,7 @@ Run with --debug for more details.
522473
522508
  }
522474
522509
  }
522475
522510
  logForDiagnosticsNoPII("info", "started", {
522476
- version: "2.0.9",
522511
+ version: "2.1.0",
522477
522512
  is_native_binary: isInBundledMode()
522478
522513
  });
522479
522514
  registerCleanup(async () => {
@@ -523257,7 +523292,7 @@ Usage: localclawd --remote "your task description"`, () => gracefulShutdown(1));
523257
523292
  pendingHookMessages
523258
523293
  }, renderAndRun);
523259
523294
  }
523260
- }).version("2.0.9 (localclawd)", "-v, --version", "Output the version number");
523295
+ }).version("2.1.0 (localclawd)", "-v, --version", "Output the version number");
523261
523296
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
523262
523297
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
523263
523298
  if (canUserConfigureAdvisor()) {
@@ -523771,7 +523806,7 @@ if (false) {}
523771
523806
  async function main2() {
523772
523807
  const args = process.argv.slice(2);
523773
523808
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
523774
- console.log(`${"2.0.9"} (localclawd)`);
523809
+ console.log(`${"2.1.0"} (localclawd)`);
523775
523810
  return;
523776
523811
  }
523777
523812
  const {
@@ -523862,4 +523897,4 @@ localclawd crashed: ${msg}
523862
523897
  process.exit(1);
523863
523898
  });
523864
523899
 
523865
- //# debugId=0D369AEA085893C864756E2164756E21
523900
+ //# debugId=B8DF83B2F993734C64756E2164756E21
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "localclawd",
3
- "version": "2.0.9",
3
+ "version": "2.1.0",
4
4
  "description": "Local-first coding CLI for vLLM, Ollama, and OpenAI-compatible backends.",
5
5
  "private": false,
6
6
  "type": "module",