localclawd 1.0.4 → 1.0.5

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 +2 -1
  2. package/dist/cli.mjs +485 -197
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -167,9 +167,10 @@ localclawd
167
167
 
168
168
  ## Release status
169
169
 
170
- `v1.0.4` is live on npm. Install globally with `npm install -g localclawd` or run without installing with `npx localclawd`. Native multi-platform binaries can be added later without changing the install surface.
170
+ `v1.0.5` is live on npm. Install globally with `npm install -g localclawd` or run without installing with `npx localclawd`. Native multi-platform binaries can be added later without changing the install surface.
171
171
 
172
172
  **Changelog**
173
+ - `1.0.5` — Geometric algebra lattice (Cl(n,0) multivectors, FCA concept lattice, rotor temporal decay, IDF attention); /keepgoing upgraded to ultimate persistent mode with subagent support, 7 stop-signal patterns, unlimited rounds, round counter; /thinkharder enforces 4-phase DRAFT→CRITIQUE→REFINE→VERIFY pipeline per change.
173
174
  - `1.0.4` — Fix `util is not defined` crash permanently by externalizing zod from the Bun bundle; add `/buddy`, `/thinkharder`, `/thinknormal` commands; fix `/keepgoing` autonomous loop; indigo/violet color scheme finalized.
174
175
  - `1.0.3` — Fix `util3 is not defined` crash from zod v4 bundled inside `@modelcontextprotocol/sdk`; pin all deps to current versions; zod v3 forced globally via overrides+resolutions.
175
176
  - `1.0.2` — Fix zod v4 bundler crash (`_uppercase2 is not defined`); pin zod to `^3`; version string now reflects package.json correctly.
package/dist/cli.mjs CHANGED
@@ -96391,7 +96391,7 @@ var init_isEqual = __esm(() => {
96391
96391
 
96392
96392
  // src/utils/userAgent.ts
96393
96393
  function getClaudeCodeUserAgent() {
96394
- return `claude-code/${"1.0.4"}`;
96394
+ return `claude-code/${"1.0.5"}`;
96395
96395
  }
96396
96396
 
96397
96397
  // src/utils/workloadContext.ts
@@ -96413,7 +96413,7 @@ function getUserAgent() {
96413
96413
  const clientApp = process.env.CLAUDE_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.CLAUDE_AGENT_SDK_CLIENT_APP}` : "";
96414
96414
  const workload = getWorkload();
96415
96415
  const workloadSuffix = workload ? `, workload/${workload}` : "";
96416
- return `claude-cli/${"1.0.4"} (${process.env.USER_TYPE}, ${process.env.CLAUDE_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
96416
+ return `claude-cli/${"1.0.5"} (${process.env.USER_TYPE}, ${process.env.CLAUDE_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
96417
96417
  }
96418
96418
  function getMCPUserAgent() {
96419
96419
  const parts = [];
@@ -96427,7 +96427,7 @@ function getMCPUserAgent() {
96427
96427
  parts.push(`client-app/${process.env.CLAUDE_AGENT_SDK_CLIENT_APP}`);
96428
96428
  }
96429
96429
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
96430
- return `claude-code/${"1.0.4"}${suffix}`;
96430
+ return `claude-code/${"1.0.5"}${suffix}`;
96431
96431
  }
96432
96432
  function getWebFetchUserAgent() {
96433
96433
  return `Claude-User (${getClaudeCodeUserAgent()}; +https://support.anthropic.com/)`;
@@ -106248,7 +106248,7 @@ function getAttributionHeader(fingerprint) {
106248
106248
  if (!isAttributionHeaderEnabled()) {
106249
106249
  return "";
106250
106250
  }
106251
- const version = `${"1.0.4"}.${fingerprint}`;
106251
+ const version = `${"1.0.5"}.${fingerprint}`;
106252
106252
  const entrypoint = process.env.CLAUDE_CODE_ENTRYPOINT ?? "unknown";
106253
106253
  const cch = "";
106254
106254
  const workload = getWorkload();
@@ -139293,7 +139293,7 @@ var init_metadata = __esm(() => {
139293
139293
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
139294
139294
  WHITESPACE_REGEX = /\s+/;
139295
139295
  getVersionBase = memoize_default(() => {
139296
- const match = "1.0.4".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
139296
+ const match = "1.0.5".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
139297
139297
  return match ? match[0] : undefined;
139298
139298
  });
139299
139299
  buildEnvContext = memoize_default(async () => {
@@ -139333,9 +139333,9 @@ var init_metadata = __esm(() => {
139333
139333
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
139334
139334
  isClaudeCodeAction: isEnvTruthy(process.env.CLAUDE_CODE_ACTION),
139335
139335
  isClaudeAiAuth: isClaudeAISubscriber(),
139336
- version: "1.0.4",
139336
+ version: "1.0.5",
139337
139337
  versionBase: getVersionBase(),
139338
- buildTime: "2026-04-05T15:58:33.485Z",
139338
+ buildTime: "2026-04-05T16:12:56.094Z",
139339
139339
  deploymentEnvironment: env4.detectDeploymentEnvironment(),
139340
139340
  ...isEnvTruthy(process.env.GITHUB_ACTIONS) && {
139341
139341
  githubEventName: process.env.GITHUB_EVENT_NAME,
@@ -203889,7 +203889,7 @@ function getTelemetryAttributes() {
203889
203889
  attributes["session.id"] = sessionId;
203890
203890
  }
203891
203891
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
203892
- attributes["app.version"] = "1.0.4";
203892
+ attributes["app.version"] = "1.0.5";
203893
203893
  }
203894
203894
  const oauthAccount = getOauthAccountInfo();
203895
203895
  if (oauthAccount) {
@@ -235493,7 +235493,7 @@ function getInstallationEnv() {
235493
235493
  return;
235494
235494
  }
235495
235495
  function getClaudeCodeVersion() {
235496
- return "1.0.4";
235496
+ return "1.0.5";
235497
235497
  }
235498
235498
  async function getInstalledVSCodeExtensionVersion(command) {
235499
235499
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -241096,7 +241096,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
241096
241096
  const client4 = new Client({
241097
241097
  name: "claude-code",
241098
241098
  title: "Claude Code",
241099
- version: "1.0.4",
241099
+ version: "1.0.5",
241100
241100
  description: "Anthropic's agentic coding tool",
241101
241101
  websiteUrl: PRODUCT_URL
241102
241102
  }, {
@@ -241449,7 +241449,7 @@ var init_client9 = __esm(() => {
241449
241449
  const client4 = new Client({
241450
241450
  name: "claude-code",
241451
241451
  title: "Claude Code",
241452
- version: "1.0.4",
241452
+ version: "1.0.5",
241453
241453
  description: "Anthropic's agentic coding tool",
241454
241454
  websiteUrl: PRODUCT_URL
241455
241455
  }, {
@@ -264640,7 +264640,7 @@ var init_user = __esm(() => {
264640
264640
  deviceId,
264641
264641
  sessionId: getSessionId(),
264642
264642
  email: getEmail(),
264643
- appVersion: "1.0.4",
264643
+ appVersion: "1.0.5",
264644
264644
  platform: getHostPlatformForAnalytics(),
264645
264645
  organizationUuid,
264646
264646
  accountUuid,
@@ -265964,7 +265964,7 @@ async function initializeBetaTracing(resource) {
265964
265964
  });
265965
265965
  logs.setGlobalLoggerProvider(loggerProvider);
265966
265966
  setLoggerProvider(loggerProvider);
265967
- const eventLogger = logs.getLogger("com.anthropic.claude_code.events", "1.0.4");
265967
+ const eventLogger = logs.getLogger("com.anthropic.claude_code.events", "1.0.5");
265968
265968
  setEventLogger(eventLogger);
265969
265969
  process.on("beforeExit", async () => {
265970
265970
  await loggerProvider?.forceFlush();
@@ -266004,7 +266004,7 @@ async function initializeTelemetry() {
266004
266004
  const platform4 = getPlatform();
266005
266005
  const baseAttributes = {
266006
266006
  [ATTR_SERVICE_NAME5]: "claude-code",
266007
- [ATTR_SERVICE_VERSION5]: "1.0.4"
266007
+ [ATTR_SERVICE_VERSION5]: "1.0.5"
266008
266008
  };
266009
266009
  if (platform4 === "wsl") {
266010
266010
  const wslVersion = getWslVersion();
@@ -266049,7 +266049,7 @@ async function initializeTelemetry() {
266049
266049
  } catch {}
266050
266050
  };
266051
266051
  registerCleanup(shutdownTelemetry2);
266052
- return meterProvider2.getMeter("com.anthropic.claude_code", "1.0.4");
266052
+ return meterProvider2.getMeter("com.anthropic.claude_code", "1.0.5");
266053
266053
  }
266054
266054
  const meterProvider = new MeterProvider5({
266055
266055
  resource,
@@ -266069,7 +266069,7 @@ async function initializeTelemetry() {
266069
266069
  });
266070
266070
  logs.setGlobalLoggerProvider(loggerProvider);
266071
266071
  setLoggerProvider(loggerProvider);
266072
- const eventLogger = logs.getLogger("com.anthropic.claude_code.events", "1.0.4");
266072
+ const eventLogger = logs.getLogger("com.anthropic.claude_code.events", "1.0.5");
266073
266073
  setEventLogger(eventLogger);
266074
266074
  logForDebugging("[3P telemetry] Event logger set successfully");
266075
266075
  process.on("beforeExit", async () => {
@@ -266131,7 +266131,7 @@ Current timeout: ${timeoutMs}ms
266131
266131
  }
266132
266132
  };
266133
266133
  registerCleanup(shutdownTelemetry);
266134
- return meterProvider.getMeter("com.anthropic.claude_code", "1.0.4");
266134
+ return meterProvider.getMeter("com.anthropic.claude_code", "1.0.5");
266135
266135
  }
266136
266136
  async function flushTelemetry() {
266137
266137
  const meterProvider = getMeterProvider();
@@ -267353,7 +267353,7 @@ function detectLinuxGlobPatternWarnings() {
267353
267353
  }
267354
267354
  async function getDoctorDiagnostic() {
267355
267355
  const installationType = await getCurrentInstallationType();
267356
- const version = typeof MACRO !== "undefined" ? "1.0.4" : "unknown";
267356
+ const version = typeof MACRO !== "undefined" ? "1.0.5" : "unknown";
267357
267357
  const installationPath = await getInstallationPath();
267358
267358
  const invokedBinary = getInvokedBinary();
267359
267359
  const multipleInstallations = await detectMultipleInstallations();
@@ -268295,8 +268295,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
268295
268295
  const maxVersion = await getMaxVersion();
268296
268296
  if (maxVersion && gt(version, maxVersion)) {
268297
268297
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version} to ${maxVersion}`);
268298
- if (gte("1.0.4", maxVersion)) {
268299
- logForDebugging(`Native installer: current version ${"1.0.4"} is already at or above maxVersion ${maxVersion}, skipping update`);
268298
+ if (gte("1.0.5", maxVersion)) {
268299
+ logForDebugging(`Native installer: current version ${"1.0.5"} is already at or above maxVersion ${maxVersion}, skipping update`);
268300
268300
  logEvent("tengu_native_update_skipped_max_version", {
268301
268301
  latency_ms: Date.now() - startTime,
268302
268302
  max_version: maxVersion,
@@ -268307,7 +268307,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
268307
268307
  version = maxVersion;
268308
268308
  }
268309
268309
  }
268310
- if (!forceReinstall && version === "1.0.4" && await versionIsAvailable(version) && await isPossibleLocalClawdBinary(executablePath)) {
268310
+ if (!forceReinstall && version === "1.0.5" && await versionIsAvailable(version) && await isPossibleLocalClawdBinary(executablePath)) {
268311
268311
  logForDebugging(`Found ${version} at ${executablePath}, skipping install`);
268312
268312
  logEvent("tengu_native_update_complete", {
268313
268313
  latency_ms: Date.now() - startTime,
@@ -337535,29 +337535,134 @@ var init_readFileInRange = __esm(() => {
337535
337535
  function parseTags(raw) {
337536
337536
  if (!raw)
337537
337537
  return [];
337538
- if (Array.isArray(raw)) {
337538
+ if (Array.isArray(raw))
337539
337539
  return raw.filter((t) => typeof t === "string").map((t) => t.trim().toLowerCase()).filter(Boolean);
337540
- }
337541
- if (typeof raw === "string") {
337540
+ if (typeof raw === "string")
337542
337541
  return raw.split(/[,\s]+/).map((t) => t.trim().toLowerCase()).filter(Boolean);
337543
- }
337544
337542
  return [];
337545
337543
  }
337546
337544
  function extractQueryTags(query2) {
337547
- return query2.toLowerCase().replace(/[^a-z0-9\s_-]/g, " ").split(/\s+/).map((t) => t.trim()).filter((t) => t.length >= 2 && !STOP_WORDS.has(t)).slice(0, 20);
337545
+ return query2.toLowerCase().replace(/[^a-z0-9\s_-]/g, " ").split(/\s+/).map((t) => t.trim()).filter((t) => t.length >= 2 && !STOP_WORDS.has(t)).slice(0, 24);
337546
+ }
337547
+ function gradeOf(blade) {
337548
+ let k2 = 0;
337549
+ let b3 = blade;
337550
+ while (b3) {
337551
+ k2 += b3 & 1;
337552
+ b3 >>>= 1;
337553
+ }
337554
+ return k2;
337555
+ }
337556
+ function revSign(grade) {
337557
+ return grade * (grade - 1) / 2 % 2 === 0 ? 1 : -1;
337558
+ }
337559
+ function mvGeometricInner(A, B2) {
337560
+ let sum = 0;
337561
+ for (const [blade, coeff] of A) {
337562
+ const bCoeff = B2.get(blade);
337563
+ if (bCoeff === undefined)
337564
+ continue;
337565
+ const grade = gradeOf(blade);
337566
+ sum += revSign(grade) * coeff * bCoeff;
337567
+ }
337568
+ return sum;
337548
337569
  }
337549
- function jaccardSimilarity(a2, b3) {
337550
- if (a2.length === 0 && b3.length === 0)
337570
+ function mvNormSquared(M3) {
337571
+ let sum = 0;
337572
+ for (const [blade, coeff] of M3) {
337573
+ const grade = gradeOf(blade);
337574
+ sum += Math.abs(revSign(grade)) * coeff * coeff;
337575
+ }
337576
+ return sum;
337577
+ }
337578
+ function mvCosineSimilarity(A, B2) {
337579
+ const normA = Math.sqrt(mvNormSquared(A));
337580
+ const normB = Math.sqrt(mvNormSquared(B2));
337581
+ if (normA === 0 || normB === 0)
337551
337582
  return 0;
337552
- const setA = new Set(a2);
337553
- const setB = new Set(b3);
337554
- let intersection3 = 0;
337555
- for (const t of setA) {
337556
- if (setB.has(t))
337557
- intersection3++;
337583
+ return Math.max(-1, Math.min(1, mvGeometricInner(A, B2) / (normA * normB)));
337584
+ }
337585
+ function buildTagVocabulary(memories) {
337586
+ const freq = new Map;
337587
+ for (const m2 of memories)
337588
+ for (const t of m2.tags)
337589
+ freq.set(t, (freq.get(t) ?? 0) + 1);
337590
+ const sorted = [...freq.entries()].sort((a2, b3) => b3[1] - a2[1]);
337591
+ const vocab = new Map;
337592
+ for (let i3 = 0;i3 < Math.min(sorted.length, MAX_DIM); i3++)
337593
+ vocab.set(sorted[i3][0], i3);
337594
+ return vocab;
337595
+ }
337596
+ function buildIdfWeights(memories, vocab) {
337597
+ const N2 = memories.length;
337598
+ const df = new Map;
337599
+ for (const m2 of memories) {
337600
+ const seen = new Set;
337601
+ for (const t of m2.tags) {
337602
+ const idx = vocab.get(t);
337603
+ if (idx !== undefined && !seen.has(idx)) {
337604
+ seen.add(idx);
337605
+ df.set(idx, (df.get(idx) ?? 0) + 1);
337606
+ }
337607
+ }
337558
337608
  }
337559
- const union3 = setA.size + setB.size - intersection3;
337560
- return union3 === 0 ? 0 : intersection3 / union3;
337609
+ const weights = new Map;
337610
+ for (const [bit, count3] of df)
337611
+ weights.set(bit, Math.log(1 + N2 / count3));
337612
+ return weights;
337613
+ }
337614
+ function tagsToMultivector(tags, vocab, idfWeights, coocIndex, maxCoocPerMemory) {
337615
+ const mv = new Map;
337616
+ const n2 = tags.length;
337617
+ if (n2 > 0)
337618
+ mv.set(0, 1 / Math.sqrt(n2));
337619
+ const bits2 = [];
337620
+ for (const t of tags) {
337621
+ const idx = vocab.get(t);
337622
+ if (idx === undefined)
337623
+ continue;
337624
+ const blade = 1 << idx;
337625
+ const w2 = idfWeights.get(idx) ?? 1;
337626
+ mv.set(blade, (mv.get(blade) ?? 0) + w2);
337627
+ bits2.push(idx);
337628
+ }
337629
+ for (let a2 = 0;a2 < bits2.length; a2++) {
337630
+ for (let b3 = a2 + 1;b3 < bits2.length; b3++) {
337631
+ const ta = [...vocab.entries()].find(([, v2]) => v2 === bits2[a2])?.[0];
337632
+ const tb = [...vocab.entries()].find(([, v2]) => v2 === bits2[b3])?.[0];
337633
+ if (!ta || !tb)
337634
+ continue;
337635
+ const coCount = coocIndex.get(ta)?.get(tb) ?? 0;
337636
+ if (coCount === 0)
337637
+ continue;
337638
+ const w_a = idfWeights.get(bits2[a2]) ?? 1;
337639
+ const w_b = idfWeights.get(bits2[b3]) ?? 1;
337640
+ const blade = 1 << bits2[a2] | 1 << bits2[b3];
337641
+ const coStrength = Math.sqrt(coCount / (maxCoocPerMemory || 1));
337642
+ mv.set(blade, (mv.get(blade) ?? 0) + Math.sqrt(w_a * w_b) * coStrength);
337643
+ }
337644
+ }
337645
+ return mv;
337646
+ }
337647
+ function fcaNeighborhoodScore(queryTags, memoryTags) {
337648
+ if (queryTags.length === 0)
337649
+ return 0;
337650
+ const memSet = new Set(memoryTags);
337651
+ let covered = 0;
337652
+ for (const qt of queryTags)
337653
+ if (memSet.has(qt))
337654
+ covered++;
337655
+ const ratio = covered / queryTags.length;
337656
+ return ratio * ratio;
337657
+ }
337658
+ function rotorDecay(ageMs, halfLifeMs = HALF_LIFE_MS, nowMs = Date.now()) {
337659
+ const lambda = Math.LN2 / halfLifeMs;
337660
+ const baseDecay = Math.exp(-lambda * Math.max(0, ageMs));
337661
+ const currentPhase = nowMs % ANNUAL_PERIOD_MS / ANNUAL_PERIOD_MS;
337662
+ const memPhase = (nowMs - ageMs) % ANNUAL_PERIOD_MS / ANNUAL_PERIOD_MS;
337663
+ const phaseDiff = currentPhase - memPhase;
337664
+ const periodicBoost = 1 + ROTOR_AMPLITUDE * Math.cos(2 * Math.PI * phaseDiff);
337665
+ return baseDecay * periodicBoost;
337561
337666
  }
337562
337667
  function buildCooccurrenceIndex(memories) {
337563
337668
  const index = new Map;
@@ -337569,46 +337674,41 @@ function buildCooccurrenceIndex(memories) {
337569
337674
  };
337570
337675
  for (const mem of memories) {
337571
337676
  const tags = mem.tags;
337572
- for (let i3 = 0;i3 < tags.length; i3++) {
337677
+ for (let i3 = 0;i3 < tags.length; i3++)
337573
337678
  for (let j2 = i3 + 1;j2 < tags.length; j2++) {
337574
337679
  bump(tags[i3], tags[j2]);
337575
337680
  bump(tags[j2], tags[i3]);
337576
337681
  }
337577
- }
337578
337682
  }
337579
337683
  return index;
337580
337684
  }
337581
- function cooccurrenceBonus(queryTags, memoryTags, index) {
337582
- if (queryTags.length === 0 || memoryTags.length === 0)
337583
- return 0;
337584
- let score = 0;
337585
- const memSet = new Set(memoryTags);
337586
- for (const qt of queryTags) {
337587
- const neighbours = index.get(qt);
337588
- if (!neighbours)
337589
- continue;
337590
- for (const mt2 of memSet) {
337591
- const coCount = neighbours.get(mt2) ?? 0;
337592
- if (coCount > 0) {
337593
- score += Math.log1p(coCount);
337594
- }
337595
- }
337596
- }
337597
- const maxPossible = queryTags.length * memoryTags.length * Math.log1p(1);
337598
- return maxPossible === 0 ? 0 : Math.min(1, score / maxPossible);
337599
- }
337600
- function latticeRelevanceScore(queryTags, memory, index, nowMs = Date.now()) {
337601
- const jaccard = jaccardSimilarity(queryTags, memory.tags);
337602
- const cooc = cooccurrenceBonus(queryTags, memory.tags, index);
337685
+ function maxCoocCount(index) {
337686
+ let max2 = 1;
337687
+ for (const row of index.values())
337688
+ for (const v2 of row.values())
337689
+ if (v2 > max2)
337690
+ max2 = v2;
337691
+ return max2;
337692
+ }
337693
+ function geometricLatticeScore(queryMv, queryTags, memory, vocab, idfWeights, coocIndex, maxCooc, nowMs) {
337694
+ const memMv = tagsToMultivector(memory.tags, vocab, idfWeights, coocIndex, maxCooc);
337695
+ const geoSim = Math.max(0, mvCosineSimilarity(queryMv, memMv));
337696
+ const fcaScore = fcaNeighborhoodScore(queryTags, memory.tags);
337603
337697
  const ageMs = Math.max(0, nowMs - memory.mtimeMs);
337604
- const halfLifeMs = 30 * 24 * 60 * 60 * 1000;
337605
- const recency = Math.pow(0.5, ageMs / halfLifeMs);
337606
- return JACCARD_WEIGHT * jaccard + COOCCURRENCE_WEIGHT * cooc + RECENCY_WEIGHT * recency;
337698
+ const temporal = rotorDecay(ageMs, HALF_LIFE_MS, nowMs);
337699
+ return GEO_WEIGHT * geoSim + FCA_WEIGHT * fcaScore + TEMPORAL_WEIGHT * temporal;
337607
337700
  }
337608
- function rankByLatticeRelevance(queryTags, memories, index, nowMs = Date.now()) {
337701
+ function rankByLatticeRelevance(queryTags, memories, _index, nowMs = Date.now()) {
337702
+ if (memories.length === 0)
337703
+ return [];
337704
+ const vocab = buildTagVocabulary(memories);
337705
+ const idfWeights = buildIdfWeights(memories, vocab);
337706
+ const coocIndex = buildCooccurrenceIndex(memories);
337707
+ const maxCooc = maxCoocCount(coocIndex);
337708
+ const queryMv = tagsToMultivector(queryTags, vocab, idfWeights, coocIndex, maxCooc);
337609
337709
  return memories.map((mem) => ({
337610
337710
  ...mem,
337611
- latticeScore: latticeRelevanceScore(queryTags, mem, index, nowMs)
337711
+ latticeScore: geometricLatticeScore(queryMv, queryTags, mem, vocab, idfWeights, coocIndex, maxCooc, nowMs)
337612
337712
  })).sort((a2, b3) => b3.latticeScore - a2.latticeScore);
337613
337713
  }
337614
337714
  function topLatticeMemories(query2, memories, topN = 5) {
@@ -337617,7 +337717,7 @@ function topLatticeMemories(query2, memories, topN = 5) {
337617
337717
  const ranked = rankByLatticeRelevance(queryTags, memories, index);
337618
337718
  return ranked.filter((m2) => m2.latticeScore > 0).slice(0, topN);
337619
337719
  }
337620
- var STOP_WORDS, JACCARD_WEIGHT = 0.65, COOCCURRENCE_WEIGHT = 0.25, RECENCY_WEIGHT = 0.1;
337720
+ var STOP_WORDS, MAX_DIM = 20, HALF_LIFE_MS, ANNUAL_PERIOD_MS, ROTOR_AMPLITUDE = 0.08, GEO_WEIGHT = 0.6, FCA_WEIGHT = 0.28, TEMPORAL_WEIGHT = 0.12;
337621
337721
  var init_lattice = __esm(() => {
337622
337722
  STOP_WORDS = new Set([
337623
337723
  "a",
@@ -337679,8 +337779,24 @@ var init_lattice = __esm(() => {
337679
337779
  "me",
337680
337780
  "him",
337681
337781
  "us",
337682
- "them"
337782
+ "them",
337783
+ "not",
337784
+ "no",
337785
+ "if",
337786
+ "then",
337787
+ "so",
337788
+ "up",
337789
+ "out",
337790
+ "about",
337791
+ "into",
337792
+ "over",
337793
+ "after",
337794
+ "from",
337795
+ "get",
337796
+ "use"
337683
337797
  ]);
337798
+ HALF_LIFE_MS = 30 * 24 * 60 * 60 * 1000;
337799
+ ANNUAL_PERIOD_MS = 365.25 * 24 * 60 * 60 * 1000;
337684
337800
  });
337685
337801
 
337686
337802
  // src/memdir/memoryTypes.ts
@@ -339264,7 +339380,7 @@ function getAnthropicEnvMetadata() {
339264
339380
  function getBuildAgeMinutes() {
339265
339381
  if (false)
339266
339382
  ;
339267
- const buildTime = new Date("2026-04-05T15:58:33.485Z").getTime();
339383
+ const buildTime = new Date("2026-04-05T16:12:56.094Z").getTime();
339268
339384
  if (isNaN(buildTime))
339269
339385
  return;
339270
339386
  return Math.floor((Date.now() - buildTime) / 60000);
@@ -362972,7 +363088,7 @@ function Feedback({
362972
363088
  platform: env4.platform,
362973
363089
  gitRepo: envInfo.isGit,
362974
363090
  terminal: env4.terminal,
362975
- version: "1.0.4",
363091
+ version: "1.0.5",
362976
363092
  transcript: normalizeMessagesForAPI(messages),
362977
363093
  errors: sanitizedErrors,
362978
363094
  lastApiRequest: getLastAPIRequest(),
@@ -363164,7 +363280,7 @@ function Feedback({
363164
363280
  ", ",
363165
363281
  env4.terminal,
363166
363282
  ", v",
363167
- "1.0.4"
363283
+ "1.0.5"
363168
363284
  ]
363169
363285
  }, undefined, true, undefined, this)
363170
363286
  ]
@@ -363270,7 +363386,7 @@ ${sanitizedDescription}
363270
363386
  ` + `**Environment Info**
363271
363387
  ` + `- Platform: ${env4.platform}
363272
363388
  ` + `- Terminal: ${env4.terminal}
363273
- ` + `- Version: ${"1.0.4"}
363389
+ ` + `- Version: ${"1.0.5"}
363274
363390
  ` + `- Feedback ID: ${feedbackId}
363275
363391
  ` + `
363276
363392
  **Errors**
@@ -366383,7 +366499,7 @@ function buildPrimarySection() {
366383
366499
  }, undefined, false, undefined, this);
366384
366500
  return [{
366385
366501
  label: "Version",
366386
- value: "1.0.4"
366502
+ value: "1.0.5"
366387
366503
  }, {
366388
366504
  label: "Session name",
366389
366505
  value: nameValue
@@ -370448,7 +370564,7 @@ function Config({
370448
370564
  }
370449
370565
  }, undefined, false, undefined, this)
370450
370566
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime177.jsxDEV(ChannelDowngradeDialog, {
370451
- currentVersion: "1.0.4",
370567
+ currentVersion: "1.0.5",
370452
370568
  onChoice: (choice) => {
370453
370569
  setShowSubmenu(null);
370454
370570
  setTabsHidden(false);
@@ -370460,7 +370576,7 @@ function Config({
370460
370576
  autoUpdatesChannel: "stable"
370461
370577
  };
370462
370578
  if (choice === "stay") {
370463
- newSettings.minimumVersion = "1.0.4";
370579
+ newSettings.minimumVersion = "1.0.5";
370464
370580
  }
370465
370581
  updateSettingsForSource("userSettings", newSettings);
370466
370582
  setSettingsData((prev_27) => ({
@@ -376934,14 +377050,84 @@ var exports_keepgoing = {};
376934
377050
  __export(exports_keepgoing, {
376935
377051
  call: () => call19
376936
377052
  });
377053
+ function resetSession(focus) {
377054
+ sessionRound = 0;
377055
+ sessionFocus = focus;
377056
+ }
377057
+ function incrementRound() {
377058
+ sessionRound += 1;
377059
+ return sessionRound;
377060
+ }
377061
+ function parseMaxRounds(args) {
377062
+ const parts = args.trim().split(/\s+/);
377063
+ let maxRounds = DEFAULT_MAX_ROUNDS;
377064
+ const focusParts = [];
377065
+ for (const part of parts) {
377066
+ if (part === "unlimited" || part === "0") {
377067
+ maxRounds = Infinity;
377068
+ } else if (/^\d+$/.test(part)) {
377069
+ maxRounds = parseInt(part, 10);
377070
+ } else if (part) {
377071
+ focusParts.push(part);
377072
+ }
377073
+ }
377074
+ return { maxRounds, focus: focusParts.join(" ") };
377075
+ }
377076
+ function detectStopSignal(text) {
377077
+ for (const { pattern, label } of STOP_PATTERNS)
377078
+ if (pattern.test(text))
377079
+ return label;
377080
+ return null;
377081
+ }
377082
+ function buildContinuationPrompt(round2, maxRounds, focus) {
377083
+ const roundInfo = isFinite(maxRounds) ? `Round ${round2} of ${maxRounds}` : `Round ${round2} (unlimited)`;
377084
+ const focusLine = focus ? `
377085
+ Current focus: ${focus}
377086
+ ` : "";
377087
+ return `[KEEP GOING — AUTONOMOUS OPERATION — ${roundInfo}]
377088
+ ${focusLine}
377089
+ You are in full autonomous mode. Work continuously until all tasks are done.
377090
+
377091
+ ━━━ CAPABILITIES ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
377092
+ You have access to ALL tools:
377093
+ • Read, Write, Edit, MultiEdit — file operations
377094
+ • Bash — run commands, builds, tests, git
377095
+ • Glob, Grep — search codebase
377096
+ • WebFetch, WebSearch — internet access
377097
+ • Agent — SPAWN SUBAGENTS for parallel/complex work
377098
+ • TodoCreate, TodoUpdate — task tracking
377099
+
377100
+ SPAWN SUBAGENTS when:
377101
+ → A sub-task is independent of current work (run in parallel)
377102
+ → A task is complex enough to benefit from a fresh context
377103
+ → You need specialized work done concurrently (e.g., research + implement)
377104
+
377105
+ ━━━ AUTONOMOUS RULES ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
377106
+ 1. DO NOT ask for confirmation between steps — proceed immediately
377107
+ 2. After completing a major milestone, state: "Completed: <what was done>"
377108
+ 3. After significant changes, run tests/builds to verify correctness
377109
+ 4. Use git commits after each logical unit of work
377110
+ 5. If you encounter a blocker you cannot resolve autonomously, emit:
377111
+ NEEDS INPUT: <specific question>
377112
+ Then stop and wait — do NOT guess or assume critical details
377113
+ 6. When ALL work is truly complete, emit:
377114
+ TASK COMPLETE: <one-sentence summary of everything accomplished>
377115
+
377116
+ ━━━ CONTINUE NOW ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
377117
+ Pick up exactly where you left off. Do not re-explain what was already done.
377118
+ Proceed directly with the next action.`;
377119
+ }
376937
377120
  function KeepGoingBanner({
376938
- args,
377121
+ round: round2,
377122
+ maxRounds,
377123
+ focus,
376939
377124
  onReady
376940
377125
  }) {
376941
377126
  React57.useEffect(() => {
376942
377127
  const id = setTimeout(onReady, 0);
376943
377128
  return () => clearTimeout(id);
376944
377129
  }, [onReady]);
377130
+ const roundDisplay = isFinite(maxRounds) ? `${round2}/${maxRounds}` : `${round2}/∞`;
376945
377131
  return /* @__PURE__ */ jsx_dev_runtime198.jsxDEV(ThemedBox_default, {
376946
377132
  flexDirection: "column",
376947
377133
  marginTop: 1,
@@ -376949,77 +377135,122 @@ function KeepGoingBanner({
376949
377135
  /* @__PURE__ */ jsx_dev_runtime198.jsxDEV(ThemedText, {
376950
377136
  bold: true,
376951
377137
  color: "cyan",
376952
- children: "◆ Keep Going — working autonomously until TASK COMPLETE"
377138
+ children: `◆ Keep Going [round ${roundDisplay}]`
376953
377139
  }, undefined, false, undefined, this),
376954
- args ? /* @__PURE__ */ jsx_dev_runtime198.jsxDEV(ThemedText, {
377140
+ focus ? /* @__PURE__ */ jsx_dev_runtime198.jsxDEV(ThemedText, {
376955
377141
  dimColor: true,
376956
- children: ` Focus: ${args}`
377142
+ color: "cyan",
377143
+ children: ` ↳ Focus: ${focus}`
376957
377144
  }, undefined, false, undefined, this) : /* @__PURE__ */ jsx_dev_runtime198.jsxDEV(ThemedText, {
376958
377145
  dimColor: true,
376959
- children: " Press Ctrl+C or type to intervene at any time"
377146
+ children: " Press Ctrl+C or type to intervene at any time"
377147
+ }, undefined, false, undefined, this)
377148
+ ]
377149
+ }, undefined, true, undefined, this);
377150
+ }
377151
+ function KeepGoingDone({
377152
+ round: round2,
377153
+ reason,
377154
+ onReady
377155
+ }) {
377156
+ React57.useEffect(() => {
377157
+ const id = setTimeout(onReady, 0);
377158
+ return () => clearTimeout(id);
377159
+ }, [onReady]);
377160
+ return /* @__PURE__ */ jsx_dev_runtime198.jsxDEV(ThemedBox_default, {
377161
+ flexDirection: "column",
377162
+ marginTop: 1,
377163
+ children: [
377164
+ /* @__PURE__ */ jsx_dev_runtime198.jsxDEV(ThemedText, {
377165
+ bold: true,
377166
+ color: "green",
377167
+ children: `◆ Keep Going — stopped after ${round2} rounds`
376960
377168
  }, undefined, false, undefined, this),
376961
377169
  /* @__PURE__ */ jsx_dev_runtime198.jsxDEV(ThemedText, {
376962
377170
  dimColor: true,
376963
- children: ` Auto-rounds cap: ${MAX_AUTO_ROUNDS}`
377171
+ children: ` Reason: ${reason}`
376964
377172
  }, undefined, false, undefined, this)
376965
377173
  ]
376966
377174
  }, undefined, true, undefined, this);
376967
377175
  }
376968
- function KeepGoingDone({
376969
- message,
377176
+ function KeepGoingCapReached({
377177
+ round: round2,
377178
+ maxRounds,
377179
+ focus,
376970
377180
  onReady
376971
377181
  }) {
376972
377182
  React57.useEffect(() => {
376973
377183
  const id = setTimeout(onReady, 0);
376974
377184
  return () => clearTimeout(id);
376975
377185
  }, [onReady]);
377186
+ const resumeCmd = focus ? `/keepgoing ${focus}` : "/keepgoing";
376976
377187
  return /* @__PURE__ */ jsx_dev_runtime198.jsxDEV(ThemedBox_default, {
377188
+ flexDirection: "column",
376977
377189
  marginTop: 1,
376978
- children: /* @__PURE__ */ jsx_dev_runtime198.jsxDEV(ThemedText, {
376979
- bold: true,
376980
- color: "green",
376981
- children: `◆ Keep Going — ${message}`
376982
- }, undefined, false, undefined, this)
376983
- }, undefined, false, undefined, this);
377190
+ children: [
377191
+ /* @__PURE__ */ jsx_dev_runtime198.jsxDEV(ThemedText, {
377192
+ bold: true,
377193
+ color: "yellow",
377194
+ children: `◆ Keep Going — round cap reached (${round2}/${maxRounds})`
377195
+ }, undefined, false, undefined, this),
377196
+ /* @__PURE__ */ jsx_dev_runtime198.jsxDEV(ThemedText, {
377197
+ dimColor: true,
377198
+ children: ` Type ${resumeCmd} to continue for another ${maxRounds} rounds.`
377199
+ }, undefined, false, undefined, this)
377200
+ ]
377201
+ }, undefined, true, undefined, this);
376984
377202
  }
376985
- var React57, jsx_dev_runtime198, MAX_AUTO_ROUNDS = 25, CONTINUATION_PROMPT = `Continue working on the current task.
376986
-
376987
- Rules:
376988
- - Work through every outstanding step using all available tools.
376989
- - Do NOT wait for user confirmation between steps — proceed autonomously.
376990
- - When the ENTIRE task is fully and completely done, respond with:
376991
- TASK COMPLETE: <one-sentence summary>
376992
- - If you are blocked and need user input, respond with:
376993
- NEEDS INPUT: <what you need>
376994
- - If you are unsure what the task is, ask briefly.
376995
-
376996
- Begin.`, call19 = async (onDone, context8, args) => {
376997
- const extraFocus = args?.trim() ?? "";
377203
+ var React57, jsx_dev_runtime198, sessionRound = 0, sessionFocus = "", DEFAULT_MAX_ROUNDS = 50, STOP_PATTERNS, call19 = async (onDone, context8, args) => {
377204
+ const rawArgs = args?.trim() ?? "";
377205
+ const { maxRounds, focus } = parseMaxRounds(rawArgs);
377206
+ if (sessionRound === 0 || focus && focus !== sessionFocus) {
377207
+ resetSession(focus);
377208
+ }
376998
377209
  let stopReason = null;
376999
377210
  context8.setMessages((prev) => {
377000
- const lastAssistant = [...prev].reverse().find((m2) => m2.role === "assistant");
377001
- if (lastAssistant) {
377002
- const blocks = Array.isArray(lastAssistant.content) ? lastAssistant.content : [];
377211
+ if (prev.length === 0)
377212
+ return prev;
377213
+ for (let i3 = prev.length - 1;i3 >= 0; i3--) {
377214
+ const msg = prev[i3];
377215
+ if (msg.role !== "assistant")
377216
+ continue;
377217
+ const blocks = Array.isArray(msg.content) ? msg.content : [];
377003
377218
  const text = blocks.filter((b3) => b3.type === "text").map((b3) => b3.text ?? "").join(`
377004
377219
  `);
377005
- if (text.includes("TASK COMPLETE:")) {
377006
- stopReason = "task declared complete";
377007
- } else if (text.includes("NEEDS INPUT:")) {
377008
- stopReason = "paused — model needs input";
377009
- }
377220
+ stopReason = detectStopSignal(text);
377221
+ break;
377010
377222
  }
377011
377223
  return prev;
377012
377224
  });
377013
377225
  if (stopReason !== null) {
377226
+ const finalRound = sessionRound;
377227
+ resetSession("");
377014
377228
  return /* @__PURE__ */ jsx_dev_runtime198.jsxDEV(KeepGoingDone, {
377015
- message: stopReason,
377016
- onReady: () => onDone(stopReason)
377229
+ round: finalRound,
377230
+ reason: stopReason,
377231
+ onReady: () => onDone(undefined)
377017
377232
  }, undefined, false, undefined, this);
377018
377233
  }
377019
- const prompt = CONTINUATION_PROMPT + (extraFocus ? `
377020
-
377021
- Focus specifically on: ${extraFocus}` : "");
377022
- const nextCmd = extraFocus ? `/keepgoing ${extraFocus}` : "/keepgoing";
377234
+ const round2 = incrementRound();
377235
+ if (isFinite(maxRounds) && round2 > maxRounds) {
377236
+ const finalRound = sessionRound;
377237
+ resetSession("");
377238
+ return /* @__PURE__ */ jsx_dev_runtime198.jsxDEV(KeepGoingCapReached, {
377239
+ round: finalRound,
377240
+ maxRounds,
377241
+ focus,
377242
+ onReady: () => onDone(undefined)
377243
+ }, undefined, false, undefined, this);
377244
+ }
377245
+ const prompt = buildContinuationPrompt(round2, maxRounds, focus);
377246
+ const nextArgs = [];
377247
+ if (!isFinite(maxRounds))
377248
+ nextArgs.push("unlimited");
377249
+ else if (maxRounds !== DEFAULT_MAX_ROUNDS)
377250
+ nextArgs.push(String(maxRounds));
377251
+ if (focus)
377252
+ nextArgs.push(focus);
377253
+ const nextCmd = `/keepgoing${nextArgs.length ? " " + nextArgs.join(" ") : ""}`;
377023
377254
  const handleReady = () => {
377024
377255
  onDone(undefined, {
377025
377256
  display: "system",
@@ -377030,7 +377261,9 @@ Focus specifically on: ${extraFocus}` : "");
377030
377261
  });
377031
377262
  };
377032
377263
  return /* @__PURE__ */ jsx_dev_runtime198.jsxDEV(KeepGoingBanner, {
377033
- args: extraFocus,
377264
+ round: round2,
377265
+ maxRounds,
377266
+ focus,
377034
377267
  onReady: handleReady
377035
377268
  }, undefined, false, undefined, this);
377036
377269
  };
@@ -377038,6 +377271,13 @@ var init_keepgoing = __esm(() => {
377038
377271
  init_ink2();
377039
377272
  React57 = __toESM(require_react(), 1);
377040
377273
  jsx_dev_runtime198 = __toESM(require_jsx_dev_runtime(), 1);
377274
+ STOP_PATTERNS = [
377275
+ { pattern: /TASK[_ ]COMPLETE:/i, label: "task complete" },
377276
+ { pattern: /NEEDS[_ ]INPUT:/i, label: "paused — needs input" },
377277
+ { pattern: /\bFINISHED\b/, label: "finished" },
377278
+ { pattern: /ALL[_ ]DONE\b/i, label: "all done" },
377279
+ { pattern: /WORK[_ ]COMPLETE:/i, label: "work complete" }
377280
+ ];
377041
377281
  });
377042
377282
 
377043
377283
  // src/commands/keepgoing/index.ts
@@ -377076,16 +377316,26 @@ function ThinkHarderBanner({ onReady }) {
377076
377316
  /* @__PURE__ */ jsx_dev_runtime199.jsxDEV(ThemedText, {
377077
377317
  bold: true,
377078
377318
  color: "magenta",
377079
- children: "◆ Think Harder mode ACTIVE"
377080
- }, undefined, false, undefined, this),
377081
- /* @__PURE__ */ jsx_dev_runtime199.jsxDEV(ThemedText, {
377082
- dimColor: true,
377083
- children: " Model will double-check each step and query memory frequently."
377319
+ children: "◆ Think Harder 3-iteration refinement pipeline ACTIVE"
377084
377320
  }, undefined, false, undefined, this),
377085
- /* @__PURE__ */ jsx_dev_runtime199.jsxDEV(ThemedText, {
377086
- dimColor: true,
377087
- children: " Use /thinknormal to return to default."
377088
- }, undefined, false, undefined, this)
377321
+ /* @__PURE__ */ jsx_dev_runtime199.jsxDEV(ThemedBox_default, {
377322
+ flexDirection: "column",
377323
+ marginLeft: 2,
377324
+ children: [
377325
+ /* @__PURE__ */ jsx_dev_runtime199.jsxDEV(ThemedText, {
377326
+ dimColor: true,
377327
+ children: "Phase 1 DRAFT → Phase 2 CRITIQUE → Phase 3 REFINE → Phase 4 VERIFY → Write"
377328
+ }, undefined, false, undefined, this),
377329
+ /* @__PURE__ */ jsx_dev_runtime199.jsxDEV(ThemedText, {
377330
+ dimColor: true,
377331
+ children: "Each code change must pass all four phases before being saved."
377332
+ }, undefined, false, undefined, this),
377333
+ /* @__PURE__ */ jsx_dev_runtime199.jsxDEV(ThemedText, {
377334
+ dimColor: true,
377335
+ children: "Use /thinknormal to return to default."
377336
+ }, undefined, false, undefined, this)
377337
+ ]
377338
+ }, undefined, true, undefined, this)
377089
377339
  ]
377090
377340
  }, undefined, true, undefined, this);
377091
377341
  }
@@ -377105,31 +377355,69 @@ function ThinkNormalBanner({ onReady }) {
377105
377355
  }, undefined, false, undefined, this),
377106
377356
  /* @__PURE__ */ jsx_dev_runtime199.jsxDEV(ThemedText, {
377107
377357
  dimColor: true,
377108
- children: " Default pipeline active. Lattice memory is fallback-only."
377358
+ children: " Default pipeline. Lattice memory is fallback-only."
377109
377359
  }, undefined, false, undefined, this)
377110
377360
  ]
377111
377361
  }, undefined, true, undefined, this);
377112
377362
  }
377113
- var React58, jsx_dev_runtime199, isThinkHarderMode = false, THINKHARDER_PROMPT = `[CAREFUL MODE ACTIVE]
377114
-
377115
- For the remainder of this conversation, follow these rules at every step:
377116
-
377117
- 1. VERIFY before acting: Read the relevant file(s) before making any edit.
377118
- 2. DOUBLE-CHECK your output: After each tool call or code change, re-read
377119
- what you wrote and confirm it is correct and complete.
377120
- 3. MEMORY-FIRST: Before starting a new sub-task, check memory files for
377121
- relevant context using the Read tool on ~/.claude/memory/ or the project
377122
- CLAUDE.md / memory/ directory.
377123
- 4. SMALL STEPS: Prefer smaller, verifiable increments over large sweeping
377124
- changes. Confirm each step before proceeding.
377125
- 5. EXPLAIN: Briefly explain your reasoning before each non-trivial action
377126
- so the user can follow along.
377127
-
377128
- Begin working with extra care.`, THINKNORMAL_PROMPT = `[CAREFUL MODE DEACTIVATED]
377129
-
377130
- Resume normal operation. Standard tool use and pipeline apply.
377131
- Lattice memory scoring is available as a fallback when the hosted
377132
- side-query model is unavailable, but is not invoked by default.`, call20 = async (onDone, _context, _args) => {
377363
+ var React58, jsx_dev_runtime199, isThinkHarderMode = false, THINKHARDER_PROMPT = `[THINK HARDER — 3-ITERATION REFINEMENT PIPELINE ACTIVE]
377364
+
377365
+ Every code change or file edit must pass through all four phases before
377366
+ being written to disk. Do NOT call Edit, Write, or Bash with new code until
377367
+ Phase 4 is complete.
377368
+
377369
+ ══════════════════════════════════════════════════════════
377370
+ PHASE 1 DRAFT
377371
+ ══════════════════════════════════════════════════════════
377372
+ Write the initial implementation in full inside a code block.
377373
+ Think aloud: describe your approach, key decisions, and any tradeoffs.
377374
+ Do NOT call any write tool yet.
377375
+
377376
+ ══════════════════════════════════════════════════════════
377377
+ PHASE 2 — CRITIQUE (self-review)
377378
+ ══════════════════════════════════════════════════════════
377379
+ Critically review your draft. For each issue found, write:
377380
+ [CATEGORY] Description of the issue
377381
+
377382
+ Categories: CORRECTNESS | EDGE CASE | PERFORMANCE | SECURITY |
377383
+ STYLE | NAMING | MISSING LOGIC | TYPE SAFETY
377384
+
377385
+ If the draft is perfect (rare), write: ✓ No issues found — proceeding.
377386
+
377387
+ ══════════════════════════════════════════════════════════
377388
+ PHASE 3 — REFINE
377389
+ ══════════════════════════════════════════════════════════
377390
+ Apply every fix from Phase 2. For each fix:
377391
+ → [CATEGORY] What you changed and why
377392
+
377393
+ Write the complete refined implementation inside a code block.
377394
+
377395
+ ══════════════════════════════════════════════════════════
377396
+ PHASE 4 — VERIFY (final gate)
377397
+ ══════════════════════════════════════════════════════════
377398
+ For each issue listed in Phase 2, confirm:
377399
+ ✓ [CATEGORY] Resolved: description of fix applied
377400
+
377401
+ Only after ALL issues are marked ✓ may you call Edit/Write/Bash to
377402
+ persist the code. If new issues are discovered during verification,
377403
+ loop back to Phase 3.
377404
+
377405
+ ══════════════════════════════════════════════════════════
377406
+ ADDITIONAL RULES
377407
+ ══════════════════════════════════════════════════════════
377408
+ • READ every file before editing it — never guess current contents.
377409
+ • CHECK memory files at the start of each new task for relevant context.
377410
+ • After writing a change, verify it by reading the file back.
377411
+ • Prefer small, focused edits over large sweeping rewrites.
377412
+ • Explain each non-trivial decision briefly for the user.
377413
+
377414
+ Begin Phase 1 now.`, THINKNORMAL_PROMPT = `[THINK HARDER DEACTIVATED — default pipeline restored]
377415
+
377416
+ Resume standard operation:
377417
+ • Normal tool use and response pipeline apply.
377418
+ • Lattice memory scoring is available as a fallback only (not invoked by default).
377419
+ • You may write code without the 3-phase refinement cycle, though careful
377420
+ reasoning is always encouraged.`, call20 = async (onDone, _context, _args) => {
377133
377421
  setThinkHarderMode(true);
377134
377422
  return /* @__PURE__ */ jsx_dev_runtime199.jsxDEV(ThinkHarderBanner, {
377135
377423
  onReady: () => onDone(undefined, {
@@ -378835,7 +379123,7 @@ function HelpV2(t0) {
378835
379123
  let t6;
378836
379124
  if ($3[31] !== tabs) {
378837
379125
  t6 = /* @__PURE__ */ jsx_dev_runtime206.jsxDEV(Tabs, {
378838
- title: `localclawd v${"1.0.4"}`,
379126
+ title: `localclawd v${"1.0.5"}`,
378839
379127
  color: "professionalBlue",
378840
379128
  defaultTab: "general",
378841
379129
  children: tabs
@@ -402993,7 +403281,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
402993
403281
  return [];
402994
403282
  }
402995
403283
  }
402996
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.0.4") {
403284
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.0.5") {
402997
403285
  if (process.env.USER_TYPE === "ant") {
402998
403286
  const changelog = MACRO.VERSION_CHANGELOG;
402999
403287
  if (changelog) {
@@ -403020,7 +403308,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.0.4") {
403020
403308
  releaseNotes
403021
403309
  };
403022
403310
  }
403023
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.0.4") {
403311
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.0.5") {
403024
403312
  if (process.env.USER_TYPE === "ant") {
403025
403313
  const changelog = MACRO.VERSION_CHANGELOG;
403026
403314
  if (changelog) {
@@ -404187,7 +404475,7 @@ function getRecentActivitySync() {
404187
404475
  return cachedActivity;
404188
404476
  }
404189
404477
  function getLogoDisplayData() {
404190
- const version = process.env.DEMO_VERSION ?? "1.0.4";
404478
+ const version = process.env.DEMO_VERSION ?? "1.0.5";
404191
404479
  const serverUrl = getDirectConnectServerUrl();
404192
404480
  const displayPath = process.env.DEMO_VERSION ? "/code/claude" : getDisplayPath(getCwd());
404193
404481
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -405461,7 +405749,7 @@ function LogoV2() {
405461
405749
  if ($3[2] === Symbol.for("react.memo_cache_sentinel")) {
405462
405750
  t2 = () => {
405463
405751
  const currentConfig = getGlobalConfig();
405464
- if (currentConfig.lastReleaseNotesSeen === "1.0.4") {
405752
+ if (currentConfig.lastReleaseNotesSeen === "1.0.5") {
405465
405753
  return;
405466
405754
  }
405467
405755
  saveGlobalConfig(_temp327);
@@ -406137,12 +406425,12 @@ function LogoV2() {
406137
406425
  return t41;
406138
406426
  }
406139
406427
  function _temp327(current) {
406140
- if (current.lastReleaseNotesSeen === "1.0.4") {
406428
+ if (current.lastReleaseNotesSeen === "1.0.5") {
406141
406429
  return current;
406142
406430
  }
406143
406431
  return {
406144
406432
  ...current,
406145
- lastReleaseNotesSeen: "1.0.4"
406433
+ lastReleaseNotesSeen: "1.0.5"
406146
406434
  };
406147
406435
  }
406148
406436
  function _temp245(s_0) {
@@ -432350,7 +432638,7 @@ async function captureMemoryDiagnostics(trigger, dumpNumber = 0) {
432350
432638
  smapsRollup,
432351
432639
  platform: process.platform,
432352
432640
  nodeVersion: process.version,
432353
- ccVersion: "1.0.4"
432641
+ ccVersion: "1.0.5"
432354
432642
  };
432355
432643
  }
432356
432644
  async function performHeapDump(trigger = "manual", dumpNumber = 0) {
@@ -432935,7 +433223,7 @@ var init_bridge_kick = __esm(() => {
432935
433223
  var call57 = async () => {
432936
433224
  return {
432937
433225
  type: "text",
432938
- value: `${"1.0.4"} (built ${"2026-04-05T15:58:33.485Z"})`
433226
+ value: `${"1.0.5"} (built ${"2026-04-05T16:12:56.094Z"})`
432939
433227
  };
432940
433228
  }, version, version_default;
432941
433229
  var init_version = __esm(() => {
@@ -441871,7 +442159,7 @@ function generateHtmlReport(data, insights) {
441871
442159
  </html>`;
441872
442160
  }
441873
442161
  function buildExportData(data, insights, facets, remoteStats) {
441874
- const version2 = typeof MACRO !== "undefined" ? "1.0.4" : "unknown";
442162
+ const version2 = typeof MACRO !== "undefined" ? "1.0.5" : "unknown";
441875
442163
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
441876
442164
  const facets_summary = {
441877
442165
  total: facets.size,
@@ -445984,7 +446272,7 @@ var init_sessionStorage = __esm(() => {
445984
446272
  init_settings2();
445985
446273
  init_slowOperations();
445986
446274
  init_uuid();
445987
- VERSION5 = typeof MACRO !== "undefined" ? "1.0.4" : "unknown";
446275
+ VERSION5 = typeof MACRO !== "undefined" ? "1.0.5" : "unknown";
445988
446276
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
445989
446277
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
445990
446278
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -447186,7 +447474,7 @@ var init_filesystem = __esm(() => {
447186
447474
  });
447187
447475
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
447188
447476
  const nonce = randomBytes18(16).toString("hex");
447189
- return join128(getClaudeTempDir(), "bundled-skills", "1.0.4", nonce);
447477
+ return join128(getClaudeTempDir(), "bundled-skills", "1.0.5", nonce);
447190
447478
  });
447191
447479
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
447192
447480
  });
@@ -453184,7 +453472,7 @@ function computeFingerprint(messageText, version2) {
453184
453472
  }
453185
453473
  function computeFingerprintFromMessages(messages) {
453186
453474
  const firstMessageText = extractFirstMessageText(messages);
453187
- return computeFingerprint(firstMessageText, "1.0.4");
453475
+ return computeFingerprint(firstMessageText, "1.0.5");
453188
453476
  }
453189
453477
  var FINGERPRINT_SALT = "59cf53e54c78";
453190
453478
  var init_fingerprint = () => {};
@@ -455039,7 +455327,7 @@ async function sideQuery(opts) {
455039
455327
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
455040
455328
  }
455041
455329
  const messageText = extractFirstUserMessageText(messages);
455042
- const fingerprint = computeFingerprint(messageText, "1.0.4");
455330
+ const fingerprint = computeFingerprint(messageText, "1.0.5");
455043
455331
  const attributionHeader = getAttributionHeader(fingerprint);
455044
455332
  const systemBlocks = [
455045
455333
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -459837,7 +460125,7 @@ function buildSystemInitMessage(inputs) {
459837
460125
  slash_commands: inputs.commands.filter((c7) => c7.userInvocable !== false).map((c7) => c7.name),
459838
460126
  apiKeySource: getAnthropicApiKeyWithSource().source,
459839
460127
  betas: getSdkBetas(),
459840
- claude_code_version: "1.0.4",
460128
+ claude_code_version: "1.0.5",
459841
460129
  output_style: outputStyle2,
459842
460130
  agents: inputs.agents.map((agent) => agent.agentType),
459843
460131
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill) => skill.name),
@@ -474416,7 +474704,7 @@ var init_useVoiceEnabled = __esm(() => {
474416
474704
  function getSemverPart(version2) {
474417
474705
  return `${import_semver12.major(version2, { loose: true })}.${import_semver12.minor(version2, { loose: true })}.${import_semver12.patch(version2, { loose: true })}`;
474418
474706
  }
474419
- function useUpdateNotification(updatedVersion, initialVersion = "1.0.4") {
474707
+ function useUpdateNotification(updatedVersion, initialVersion = "1.0.5") {
474420
474708
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react227.useState(() => getSemverPart(initialVersion));
474421
474709
  if (!updatedVersion) {
474422
474710
  return null;
@@ -474456,7 +474744,7 @@ function AutoUpdater({
474456
474744
  return;
474457
474745
  }
474458
474746
  if (false) {}
474459
- const currentVersion = "1.0.4";
474747
+ const currentVersion = "1.0.5";
474460
474748
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
474461
474749
  let latestVersion = await getLatestVersion(channel);
474462
474750
  const isDisabled = isAutoUpdaterDisabled();
@@ -474667,12 +474955,12 @@ function NativeAutoUpdater({
474667
474955
  logEvent("tengu_native_auto_updater_start", {});
474668
474956
  try {
474669
474957
  const maxVersion = await getMaxVersion();
474670
- if (maxVersion && gt("1.0.4", maxVersion)) {
474958
+ if (maxVersion && gt("1.0.5", maxVersion)) {
474671
474959
  const msg = await getMaxVersionMessage();
474672
474960
  setMaxVersionIssue(msg ?? "affects your version");
474673
474961
  }
474674
474962
  const result = await installLatest(channel);
474675
- const currentVersion = "1.0.4";
474963
+ const currentVersion = "1.0.5";
474676
474964
  const latencyMs = Date.now() - startTime;
474677
474965
  if (result.lockFailed) {
474678
474966
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -474807,17 +475095,17 @@ function PackageManagerAutoUpdater(t0) {
474807
475095
  const maxVersion = await getMaxVersion();
474808
475096
  if (maxVersion && latest && gt(latest, maxVersion)) {
474809
475097
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
474810
- if (gte("1.0.4", maxVersion)) {
474811
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.0.4"} is already at or above maxVersion ${maxVersion}, skipping update`);
475098
+ if (gte("1.0.5", maxVersion)) {
475099
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.0.5"} is already at or above maxVersion ${maxVersion}, skipping update`);
474812
475100
  setUpdateAvailable(false);
474813
475101
  return;
474814
475102
  }
474815
475103
  latest = maxVersion;
474816
475104
  }
474817
- const hasUpdate = latest && !gte("1.0.4", latest) && !shouldSkipVersion(latest);
475105
+ const hasUpdate = latest && !gte("1.0.5", latest) && !shouldSkipVersion(latest);
474818
475106
  setUpdateAvailable(!!hasUpdate);
474819
475107
  if (hasUpdate) {
474820
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.0.4"} -> ${latest}`);
475108
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.0.5"} -> ${latest}`);
474821
475109
  }
474822
475110
  };
474823
475111
  $3[0] = t1;
@@ -474851,7 +475139,7 @@ function PackageManagerAutoUpdater(t0) {
474851
475139
  wrap: "truncate",
474852
475140
  children: [
474853
475141
  "currentVersion: ",
474854
- "1.0.4"
475142
+ "1.0.5"
474855
475143
  ]
474856
475144
  }, undefined, true, undefined, this);
474857
475145
  $3[3] = verbose;
@@ -482409,7 +482697,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
482409
482697
  project_dir: getOriginalCwd(),
482410
482698
  added_dirs: addedDirs
482411
482699
  },
482412
- version: "1.0.4",
482700
+ version: "1.0.5",
482413
482701
  output_style: {
482414
482702
  name: outputStyleName
482415
482703
  },
@@ -493955,7 +494243,7 @@ async function submitTranscriptShare(messages, trigger, appearanceId) {
493955
494243
  } catch {}
493956
494244
  const data = {
493957
494245
  trigger,
493958
- version: "1.0.4",
494246
+ version: "1.0.5",
493959
494247
  platform: process.platform,
493960
494248
  transcript,
493961
494249
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -505540,7 +505828,7 @@ function WelcomeV2() {
505540
505828
  dimColor: true,
505541
505829
  children: [
505542
505830
  "v",
505543
- "1.0.4"
505831
+ "1.0.5"
505544
505832
  ]
505545
505833
  }, undefined, true, undefined, this)
505546
505834
  ]
@@ -506812,7 +507100,7 @@ function completeOnboarding() {
506812
507100
  saveGlobalConfig((current) => ({
506813
507101
  ...current,
506814
507102
  hasCompletedOnboarding: true,
506815
- lastOnboardingVersion: "1.0.4"
507103
+ lastOnboardingVersion: "1.0.5"
506816
507104
  }));
506817
507105
  }
506818
507106
  function showDialog(root2, renderer) {
@@ -511247,7 +511535,7 @@ function appendToLog(path22, message) {
511247
511535
  cwd: getFsImplementation().cwd(),
511248
511536
  userType: process.env.USER_TYPE,
511249
511537
  sessionId: getSessionId(),
511250
- version: "1.0.4"
511538
+ version: "1.0.5"
511251
511539
  };
511252
511540
  getLogWriter(path22).write(messageWithTimestamp);
511253
511541
  }
@@ -515224,8 +515512,8 @@ async function getEnvLessBridgeConfig() {
515224
515512
  }
515225
515513
  async function checkEnvLessBridgeMinVersion() {
515226
515514
  const cfg = await getEnvLessBridgeConfig();
515227
- if (cfg.min_version && lt("1.0.4", cfg.min_version)) {
515228
- return `Your version of localclawd (${"1.0.4"}) is too old for Remote Control.
515515
+ if (cfg.min_version && lt("1.0.5", cfg.min_version)) {
515516
+ return `Your version of localclawd (${"1.0.5"}) is too old for Remote Control.
515229
515517
  Version ${cfg.min_version} or higher is required. Run \`localclawd update\` to update.`;
515230
515518
  }
515231
515519
  return null;
@@ -515697,7 +515985,7 @@ async function initBridgeCore(params) {
515697
515985
  const rawApi = createBridgeApiClient({
515698
515986
  baseUrl,
515699
515987
  getAccessToken,
515700
- runnerVersion: "1.0.4",
515988
+ runnerVersion: "1.0.5",
515701
515989
  onDebug: logForDebugging,
515702
515990
  onAuth401,
515703
515991
  getTrustedDeviceToken
@@ -521353,7 +521641,7 @@ async function startMCPServer(cwd3, debug4, verbose) {
521353
521641
  setCwd(cwd3);
521354
521642
  const server = new Server({
521355
521643
  name: "claude/tengu",
521356
- version: "1.0.4"
521644
+ version: "1.0.5"
521357
521645
  }, {
521358
521646
  capabilities: {
521359
521647
  tools: {}
@@ -522958,7 +523246,7 @@ __export(exports_update, {
522958
523246
  });
522959
523247
  async function update() {
522960
523248
  logEvent("tengu_update_check", {});
522961
- writeToStdout(`Current version: ${"1.0.4"}
523249
+ writeToStdout(`Current version: ${"1.0.5"}
522962
523250
  `);
522963
523251
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
522964
523252
  writeToStdout(`Checking for updates to ${channel} version...
@@ -523033,8 +523321,8 @@ async function update() {
523033
523321
  writeToStdout(`localclawd is managed by Homebrew.
523034
523322
  `);
523035
523323
  const latest = await getLatestVersion(channel);
523036
- if (latest && !gte("1.0.4", latest)) {
523037
- writeToStdout(`Update available: ${"1.0.4"} → ${latest}
523324
+ if (latest && !gte("1.0.5", latest)) {
523325
+ writeToStdout(`Update available: ${"1.0.5"} → ${latest}
523038
523326
  `);
523039
523327
  writeToStdout(`
523040
523328
  `);
@@ -523050,8 +523338,8 @@ async function update() {
523050
523338
  writeToStdout(`localclawd is managed by winget.
523051
523339
  `);
523052
523340
  const latest = await getLatestVersion(channel);
523053
- if (latest && !gte("1.0.4", latest)) {
523054
- writeToStdout(`Update available: ${"1.0.4"} → ${latest}
523341
+ if (latest && !gte("1.0.5", latest)) {
523342
+ writeToStdout(`Update available: ${"1.0.5"} → ${latest}
523055
523343
  `);
523056
523344
  writeToStdout(`
523057
523345
  `);
@@ -523065,8 +523353,8 @@ async function update() {
523065
523353
  writeToStdout(`localclawd is managed by apk.
523066
523354
  `);
523067
523355
  const latest = await getLatestVersion(channel);
523068
- if (latest && !gte("1.0.4", latest)) {
523069
- writeToStdout(`Update available: ${"1.0.4"} → ${latest}
523356
+ if (latest && !gte("1.0.5", latest)) {
523357
+ writeToStdout(`Update available: ${"1.0.5"} → ${latest}
523070
523358
  `);
523071
523359
  writeToStdout(`
523072
523360
  `);
@@ -523131,11 +523419,11 @@ async function update() {
523131
523419
  `);
523132
523420
  await gracefulShutdown(1);
523133
523421
  }
523134
- if (result.latestVersion === "1.0.4") {
523135
- writeToStdout(source_default.green(`localclawd is up to date (${"1.0.4"})`) + `
523422
+ if (result.latestVersion === "1.0.5") {
523423
+ writeToStdout(source_default.green(`localclawd is up to date (${"1.0.5"})`) + `
523136
523424
  `);
523137
523425
  } else {
523138
- writeToStdout(source_default.green(`Successfully updated from ${"1.0.4"} to version ${result.latestVersion}`) + `
523426
+ writeToStdout(source_default.green(`Successfully updated from ${"1.0.5"} to version ${result.latestVersion}`) + `
523139
523427
  `);
523140
523428
  await regenerateCompletionCache();
523141
523429
  }
@@ -523195,12 +523483,12 @@ async function update() {
523195
523483
  `);
523196
523484
  await gracefulShutdown(1);
523197
523485
  }
523198
- if (latestVersion === "1.0.4") {
523199
- writeToStdout(source_default.green(`localclawd is up to date (${"1.0.4"})`) + `
523486
+ if (latestVersion === "1.0.5") {
523487
+ writeToStdout(source_default.green(`localclawd is up to date (${"1.0.5"})`) + `
523200
523488
  `);
523201
523489
  await gracefulShutdown(0);
523202
523490
  }
523203
- writeToStdout(`New version available: ${latestVersion} (current: ${"1.0.4"})
523491
+ writeToStdout(`New version available: ${latestVersion} (current: ${"1.0.5"})
523204
523492
  `);
523205
523493
  writeToStdout(`Installing update...
523206
523494
  `);
@@ -523245,7 +523533,7 @@ async function update() {
523245
523533
  logForDebugging(`update: Installation status: ${status2}`);
523246
523534
  switch (status2) {
523247
523535
  case "success":
523248
- writeToStdout(source_default.green(`Successfully updated from ${"1.0.4"} to version ${latestVersion}`) + `
523536
+ writeToStdout(source_default.green(`Successfully updated from ${"1.0.5"} to version ${latestVersion}`) + `
523249
523537
  `);
523250
523538
  await regenerateCompletionCache();
523251
523539
  break;
@@ -524487,7 +524775,7 @@ ${customInstructions}` : customInstructions;
524487
524775
  }
524488
524776
  }
524489
524777
  logForDiagnosticsNoPII("info", "started", {
524490
- version: "1.0.4",
524778
+ version: "1.0.5",
524491
524779
  is_native_binary: isInBundledMode()
524492
524780
  });
524493
524781
  registerCleanup(async () => {
@@ -525271,7 +525559,7 @@ Usage: localclawd --remote "your task description"`, () => gracefulShutdown(1));
525271
525559
  pendingHookMessages
525272
525560
  }, renderAndRun);
525273
525561
  }
525274
- }).version("1.0.4 (localClawd)", "-v, --version", "Output the version number");
525562
+ }).version("1.0.5 (localClawd)", "-v, --version", "Output the version number");
525275
525563
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
525276
525564
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
525277
525565
  if (canUserConfigureAdvisor()) {
@@ -525778,7 +526066,7 @@ if (false) {}
525778
526066
  async function main2() {
525779
526067
  const args = process.argv.slice(2);
525780
526068
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
525781
- console.log(`${"1.0.4"} (localclawd)`);
526069
+ console.log(`${"1.0.5"} (localclawd)`);
525782
526070
  return;
525783
526071
  }
525784
526072
  const {
@@ -525862,4 +526150,4 @@ async function main2() {
525862
526150
  }
525863
526151
  main2();
525864
526152
 
525865
- //# debugId=D3D0E4362BAE45FC64756E2164756E21
526153
+ //# debugId=70B44E2C5951F6D564756E2164756E21
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "localclawd",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "Local-first coding CLI for vLLM, Ollama, and OpenAI-compatible backends.",
5
5
  "private": false,
6
6
  "type": "module",