localclawd 1.7.8 → 1.8.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.
- package/dist/cli.mjs +669 -658
- package/package.json +1 -1
package/dist/cli.mjs
CHANGED
|
@@ -87608,7 +87608,7 @@ var init_isEqual = __esm(() => {
|
|
|
87608
87608
|
|
|
87609
87609
|
// src/utils/userAgent.ts
|
|
87610
87610
|
function getClaudeCodeUserAgent() {
|
|
87611
|
-
return `claude-code/${"1.
|
|
87611
|
+
return `claude-code/${"1.8.0"}`;
|
|
87612
87612
|
}
|
|
87613
87613
|
|
|
87614
87614
|
// src/utils/workloadContext.ts
|
|
@@ -87630,7 +87630,7 @@ function getUserAgent() {
|
|
|
87630
87630
|
const clientApp = process.env.CLAUDE_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.CLAUDE_AGENT_SDK_CLIENT_APP}` : "";
|
|
87631
87631
|
const workload = getWorkload();
|
|
87632
87632
|
const workloadSuffix = workload ? `, workload/${workload}` : "";
|
|
87633
|
-
return `claude-cli/${"1.
|
|
87633
|
+
return `claude-cli/${"1.8.0"} (${process.env.USER_TYPE}, ${process.env.CLAUDE_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
|
|
87634
87634
|
}
|
|
87635
87635
|
function getMCPUserAgent() {
|
|
87636
87636
|
const parts = [];
|
|
@@ -87644,7 +87644,7 @@ function getMCPUserAgent() {
|
|
|
87644
87644
|
parts.push(`client-app/${process.env.CLAUDE_AGENT_SDK_CLIENT_APP}`);
|
|
87645
87645
|
}
|
|
87646
87646
|
const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
|
|
87647
|
-
return `claude-code/${"1.
|
|
87647
|
+
return `claude-code/${"1.8.0"}${suffix}`;
|
|
87648
87648
|
}
|
|
87649
87649
|
function getWebFetchUserAgent() {
|
|
87650
87650
|
return `Claude-User (${getClaudeCodeUserAgent()}; +https://support.anthropic.com/)`;
|
|
@@ -130840,7 +130840,7 @@ function getAttributionHeader(fingerprint) {
|
|
|
130840
130840
|
if (!isAttributionHeaderEnabled()) {
|
|
130841
130841
|
return "";
|
|
130842
130842
|
}
|
|
130843
|
-
const version = `${"1.
|
|
130843
|
+
const version = `${"1.8.0"}.${fingerprint}`;
|
|
130844
130844
|
const entrypoint = process.env.CLAUDE_CODE_ENTRYPOINT ?? "unknown";
|
|
130845
130845
|
const cch = "";
|
|
130846
130846
|
const workload = getWorkload();
|
|
@@ -147029,7 +147029,7 @@ var init_metadata = __esm(() => {
|
|
|
147029
147029
|
COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
|
|
147030
147030
|
WHITESPACE_REGEX = /\s+/;
|
|
147031
147031
|
getVersionBase = memoize_default(() => {
|
|
147032
|
-
const match = "1.
|
|
147032
|
+
const match = "1.8.0".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
|
|
147033
147033
|
return match ? match[0] : undefined;
|
|
147034
147034
|
});
|
|
147035
147035
|
buildEnvContext = memoize_default(async () => {
|
|
@@ -147069,9 +147069,9 @@ var init_metadata = __esm(() => {
|
|
|
147069
147069
|
isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
|
|
147070
147070
|
isClaudeCodeAction: isEnvTruthy(process.env.CLAUDE_CODE_ACTION),
|
|
147071
147071
|
isClaudeAiAuth: isClaudeAISubscriber(),
|
|
147072
|
-
version: "1.
|
|
147072
|
+
version: "1.8.0",
|
|
147073
147073
|
versionBase: getVersionBase(),
|
|
147074
|
-
buildTime: "2026-05-07T15:
|
|
147074
|
+
buildTime: "2026-05-07T15:13:54.479Z",
|
|
147075
147075
|
deploymentEnvironment: env3.detectDeploymentEnvironment(),
|
|
147076
147076
|
...isEnvTruthy(process.env.GITHUB_ACTIONS) && {
|
|
147077
147077
|
githubEventName: process.env.GITHUB_EVENT_NAME,
|
|
@@ -179647,7 +179647,7 @@ function getTelemetryAttributes() {
|
|
|
179647
179647
|
attributes["session.id"] = sessionId;
|
|
179648
179648
|
}
|
|
179649
179649
|
if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
|
|
179650
|
-
attributes["app.version"] = "1.
|
|
179650
|
+
attributes["app.version"] = "1.8.0";
|
|
179651
179651
|
}
|
|
179652
179652
|
const oauthAccount = getOauthAccountInfo();
|
|
179653
179653
|
if (oauthAccount) {
|
|
@@ -242448,7 +242448,7 @@ function getInstallationEnv() {
|
|
|
242448
242448
|
return;
|
|
242449
242449
|
}
|
|
242450
242450
|
function getClaudeCodeVersion() {
|
|
242451
|
-
return "1.
|
|
242451
|
+
return "1.8.0";
|
|
242452
242452
|
}
|
|
242453
242453
|
async function getInstalledVSCodeExtensionVersion(command) {
|
|
242454
242454
|
const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
|
|
@@ -247722,7 +247722,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
|
|
|
247722
247722
|
const client4 = new Client({
|
|
247723
247723
|
name: "localclawd",
|
|
247724
247724
|
title: "localclawd",
|
|
247725
|
-
version: "1.
|
|
247725
|
+
version: "1.8.0",
|
|
247726
247726
|
description: "local-first AI coding tool",
|
|
247727
247727
|
websiteUrl: PRODUCT_URL
|
|
247728
247728
|
}, {
|
|
@@ -248064,7 +248064,7 @@ var init_client9 = __esm(() => {
|
|
|
248064
248064
|
const client4 = new Client({
|
|
248065
248065
|
name: "localclawd",
|
|
248066
248066
|
title: "localclawd",
|
|
248067
|
-
version: "1.
|
|
248067
|
+
version: "1.8.0",
|
|
248068
248068
|
description: "local-first AI coding tool",
|
|
248069
248069
|
websiteUrl: PRODUCT_URL
|
|
248070
248070
|
}, {
|
|
@@ -262466,7 +262466,7 @@ function computeFingerprint(messageText, version) {
|
|
|
262466
262466
|
}
|
|
262467
262467
|
function computeFingerprintFromMessages(messages) {
|
|
262468
262468
|
const firstMessageText = extractFirstMessageText(messages);
|
|
262469
|
-
return computeFingerprint(firstMessageText, "1.
|
|
262469
|
+
return computeFingerprint(firstMessageText, "1.8.0");
|
|
262470
262470
|
}
|
|
262471
262471
|
var FINGERPRINT_SALT = "59cf53e54c78";
|
|
262472
262472
|
var init_fingerprint = () => {};
|
|
@@ -262508,7 +262508,7 @@ async function sideQuery(opts) {
|
|
|
262508
262508
|
betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
|
|
262509
262509
|
}
|
|
262510
262510
|
const messageText = extractFirstUserMessageText(messages);
|
|
262511
|
-
const fingerprint = computeFingerprint(messageText, "1.
|
|
262511
|
+
const fingerprint = computeFingerprint(messageText, "1.8.0");
|
|
262512
262512
|
const attributionHeader = getAttributionHeader(fingerprint);
|
|
262513
262513
|
const systemBlocks = [
|
|
262514
262514
|
attributionHeader ? { type: "text", text: attributionHeader } : null,
|
|
@@ -283256,7 +283256,7 @@ var init_user = __esm(() => {
|
|
|
283256
283256
|
deviceId,
|
|
283257
283257
|
sessionId: getSessionId(),
|
|
283258
283258
|
email: getEmail(),
|
|
283259
|
-
appVersion: "1.
|
|
283259
|
+
appVersion: "1.8.0",
|
|
283260
283260
|
platform: getHostPlatformForAnalytics(),
|
|
283261
283261
|
organizationUuid,
|
|
283262
283262
|
accountUuid,
|
|
@@ -284321,7 +284321,7 @@ async function initializeBetaTracing(resource) {
|
|
|
284321
284321
|
});
|
|
284322
284322
|
logs.setGlobalLoggerProvider(loggerProvider);
|
|
284323
284323
|
setLoggerProvider(loggerProvider);
|
|
284324
|
-
const eventLogger = logs.getLogger("com.anthropic.claude_code.events", "1.
|
|
284324
|
+
const eventLogger = logs.getLogger("com.anthropic.claude_code.events", "1.8.0");
|
|
284325
284325
|
setEventLogger(eventLogger);
|
|
284326
284326
|
process.on("beforeExit", async () => {
|
|
284327
284327
|
await loggerProvider?.forceFlush();
|
|
@@ -284361,7 +284361,7 @@ async function initializeTelemetry() {
|
|
|
284361
284361
|
const platform2 = getPlatform();
|
|
284362
284362
|
const baseAttributes = {
|
|
284363
284363
|
[ATTR_SERVICE_NAME4]: "claude-code",
|
|
284364
|
-
[ATTR_SERVICE_VERSION4]: "1.
|
|
284364
|
+
[ATTR_SERVICE_VERSION4]: "1.8.0"
|
|
284365
284365
|
};
|
|
284366
284366
|
if (platform2 === "wsl") {
|
|
284367
284367
|
const wslVersion = getWslVersion();
|
|
@@ -284406,7 +284406,7 @@ async function initializeTelemetry() {
|
|
|
284406
284406
|
} catch {}
|
|
284407
284407
|
};
|
|
284408
284408
|
registerCleanup(shutdownTelemetry2);
|
|
284409
|
-
return meterProvider2.getMeter("com.anthropic.claude_code", "1.
|
|
284409
|
+
return meterProvider2.getMeter("com.anthropic.claude_code", "1.8.0");
|
|
284410
284410
|
}
|
|
284411
284411
|
const meterProvider = new MeterProvider4({
|
|
284412
284412
|
resource,
|
|
@@ -284426,7 +284426,7 @@ async function initializeTelemetry() {
|
|
|
284426
284426
|
});
|
|
284427
284427
|
logs.setGlobalLoggerProvider(loggerProvider);
|
|
284428
284428
|
setLoggerProvider(loggerProvider);
|
|
284429
|
-
const eventLogger = logs.getLogger("com.anthropic.claude_code.events", "1.
|
|
284429
|
+
const eventLogger = logs.getLogger("com.anthropic.claude_code.events", "1.8.0");
|
|
284430
284430
|
setEventLogger(eventLogger);
|
|
284431
284431
|
logForDebugging("[3P telemetry] Event logger set successfully");
|
|
284432
284432
|
process.on("beforeExit", async () => {
|
|
@@ -284488,7 +284488,7 @@ Current timeout: ${timeoutMs}ms
|
|
|
284488
284488
|
}
|
|
284489
284489
|
};
|
|
284490
284490
|
registerCleanup(shutdownTelemetry);
|
|
284491
|
-
return meterProvider.getMeter("com.anthropic.claude_code", "1.
|
|
284491
|
+
return meterProvider.getMeter("com.anthropic.claude_code", "1.8.0");
|
|
284492
284492
|
}
|
|
284493
284493
|
async function flushTelemetry() {
|
|
284494
284494
|
const meterProvider = getMeterProvider();
|
|
@@ -285678,7 +285678,7 @@ function detectLinuxGlobPatternWarnings() {
|
|
|
285678
285678
|
}
|
|
285679
285679
|
async function getDoctorDiagnostic() {
|
|
285680
285680
|
const installationType = await getCurrentInstallationType();
|
|
285681
|
-
const version = typeof MACRO !== "undefined" ? "1.
|
|
285681
|
+
const version = typeof MACRO !== "undefined" ? "1.8.0" : "unknown";
|
|
285682
285682
|
const installationPath = await getInstallationPath();
|
|
285683
285683
|
const invokedBinary = getInvokedBinary();
|
|
285684
285684
|
const multipleInstallations = await detectMultipleInstallations();
|
|
@@ -286619,8 +286619,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
|
|
|
286619
286619
|
const maxVersion = await getMaxVersion();
|
|
286620
286620
|
if (maxVersion && gt(version, maxVersion)) {
|
|
286621
286621
|
logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version} to ${maxVersion}`);
|
|
286622
|
-
if (gte("1.
|
|
286623
|
-
logForDebugging(`Native installer: current version ${"1.
|
|
286622
|
+
if (gte("1.8.0", maxVersion)) {
|
|
286623
|
+
logForDebugging(`Native installer: current version ${"1.8.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
|
|
286624
286624
|
logEvent("tengu_native_update_skipped_max_version", {
|
|
286625
286625
|
latency_ms: Date.now() - startTime,
|
|
286626
286626
|
max_version: maxVersion,
|
|
@@ -286631,7 +286631,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
|
|
|
286631
286631
|
version = maxVersion;
|
|
286632
286632
|
}
|
|
286633
286633
|
}
|
|
286634
|
-
if (!forceReinstall && version === "1.
|
|
286634
|
+
if (!forceReinstall && version === "1.8.0" && await versionIsAvailable(version) && await isPossibleLocalClawdBinary(executablePath)) {
|
|
286635
286635
|
logForDebugging(`Found ${version} at ${executablePath}, skipping install`);
|
|
286636
286636
|
logEvent("tengu_native_update_complete", {
|
|
286637
286637
|
latency_ms: Date.now() - startTime,
|
|
@@ -331760,7 +331760,7 @@ function getAnthropicEnvMetadata() {
|
|
|
331760
331760
|
function getBuildAgeMinutes() {
|
|
331761
331761
|
if (false)
|
|
331762
331762
|
;
|
|
331763
|
-
const buildTime = new Date("2026-05-07T15:
|
|
331763
|
+
const buildTime = new Date("2026-05-07T15:13:54.479Z").getTime();
|
|
331764
331764
|
if (isNaN(buildTime))
|
|
331765
331765
|
return;
|
|
331766
331766
|
return Math.floor((Date.now() - buildTime) / 60000);
|
|
@@ -360590,7 +360590,7 @@ function Feedback({
|
|
|
360590
360590
|
platform: env3.platform,
|
|
360591
360591
|
gitRepo: envInfo.isGit,
|
|
360592
360592
|
terminal: env3.terminal,
|
|
360593
|
-
version: "1.
|
|
360593
|
+
version: "1.8.0",
|
|
360594
360594
|
transcript: normalizeMessagesForAPI(messages),
|
|
360595
360595
|
errors: sanitizedErrors,
|
|
360596
360596
|
lastApiRequest: getLastAPIRequest(),
|
|
@@ -360782,7 +360782,7 @@ function Feedback({
|
|
|
360782
360782
|
", ",
|
|
360783
360783
|
env3.terminal,
|
|
360784
360784
|
", v",
|
|
360785
|
-
"1.
|
|
360785
|
+
"1.8.0"
|
|
360786
360786
|
]
|
|
360787
360787
|
}, undefined, true, undefined, this)
|
|
360788
360788
|
]
|
|
@@ -360888,7 +360888,7 @@ ${sanitizedDescription}
|
|
|
360888
360888
|
` + `**Environment Info**
|
|
360889
360889
|
` + `- Platform: ${env3.platform}
|
|
360890
360890
|
` + `- Terminal: ${env3.terminal}
|
|
360891
|
-
` + `- Version: ${"1.
|
|
360891
|
+
` + `- Version: ${"1.8.0"}
|
|
360892
360892
|
` + `- Feedback ID: ${feedbackId}
|
|
360893
360893
|
` + `
|
|
360894
360894
|
**Errors**
|
|
@@ -363516,7 +363516,7 @@ function buildPrimarySection() {
|
|
|
363516
363516
|
}, undefined, false, undefined, this);
|
|
363517
363517
|
return [{
|
|
363518
363518
|
label: "Version",
|
|
363519
|
-
value: "1.
|
|
363519
|
+
value: "1.8.0"
|
|
363520
363520
|
}, {
|
|
363521
363521
|
label: "Session name",
|
|
363522
363522
|
value: nameValue
|
|
@@ -368197,7 +368197,7 @@ function Config({
|
|
|
368197
368197
|
}
|
|
368198
368198
|
}, undefined, false, undefined, this)
|
|
368199
368199
|
}, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime176.jsxDEV(ChannelDowngradeDialog, {
|
|
368200
|
-
currentVersion: "1.
|
|
368200
|
+
currentVersion: "1.8.0",
|
|
368201
368201
|
onChoice: (choice) => {
|
|
368202
368202
|
setShowSubmenu(null);
|
|
368203
368203
|
setTabsHidden(false);
|
|
@@ -368209,7 +368209,7 @@ function Config({
|
|
|
368209
368209
|
autoUpdatesChannel: "stable"
|
|
368210
368210
|
};
|
|
368211
368211
|
if (choice === "stay") {
|
|
368212
|
-
newSettings.minimumVersion = "1.
|
|
368212
|
+
newSettings.minimumVersion = "1.8.0";
|
|
368213
368213
|
}
|
|
368214
368214
|
updateSettingsForSource("userSettings", newSettings);
|
|
368215
368215
|
setSettingsData((prev_27) => ({
|
|
@@ -374730,7 +374730,9 @@ var exports_image_pipeline = {};
|
|
|
374730
374730
|
__export(exports_image_pipeline, {
|
|
374731
374731
|
call: () => call20
|
|
374732
374732
|
});
|
|
374733
|
-
|
|
374733
|
+
import { mkdir as mkdir35, writeFile as writeFile37 } from "fs/promises";
|
|
374734
|
+
import { join as join113 } from "path";
|
|
374735
|
+
function PipelineCard({
|
|
374734
374736
|
title,
|
|
374735
374737
|
lines,
|
|
374736
374738
|
color: color3,
|
|
@@ -374750,88 +374752,175 @@ function Banner({
|
|
|
374750
374752
|
children: title
|
|
374751
374753
|
}, undefined, false, undefined, this),
|
|
374752
374754
|
lines.map((line, i2) => /* @__PURE__ */ jsx_dev_runtime197.jsxDEV(ThemedText, {
|
|
374753
|
-
dimColor:
|
|
374755
|
+
dimColor: line === "",
|
|
374754
374756
|
children: line
|
|
374755
374757
|
}, i2, false, undefined, this))
|
|
374756
374758
|
]
|
|
374757
374759
|
}, undefined, true, undefined, this);
|
|
374758
374760
|
}
|
|
374759
|
-
|
|
374760
|
-
const
|
|
374761
|
-
const
|
|
374762
|
-
|
|
374763
|
-
let urlToUse = backendUrl;
|
|
374764
|
-
let autoDetected = false;
|
|
374765
|
-
if (!active && backendUrl !== DEFAULT_COMFYUI_URL) {
|
|
374766
|
-
const localActive = await detectComfyUI(DEFAULT_COMFYUI_URL);
|
|
374767
|
-
if (localActive) {
|
|
374768
|
-
urlToUse = DEFAULT_COMFYUI_URL;
|
|
374769
|
-
autoDetected = true;
|
|
374770
|
-
}
|
|
374771
|
-
}
|
|
374772
|
-
const prompts = await listPrompts(projectRoot);
|
|
374773
|
-
const workflows = await listWorkflows(projectRoot);
|
|
374774
|
-
const statusLine = active || autoDetected ? `● ComfyUI active at ${urlToUse}` : `○ ComfyUI not found at ${urlToUse}`;
|
|
374775
|
-
const lines = [
|
|
374776
|
-
statusLine,
|
|
374777
|
-
` Config: .localclawd/image-pipeline/config.json${config2 ? "" : " (not scaffolded)"}`,
|
|
374778
|
-
` Prompts: ${prompts.length} template${prompts.length !== 1 ? "s" : ""} | Workflows: ${workflows.length}`,
|
|
374779
|
-
"",
|
|
374780
|
-
" Commands:",
|
|
374781
|
-
" /image-pipeline setup — scaffold project dirs",
|
|
374782
|
-
" /image-pipeline generate <prompt> — submit to ComfyUI",
|
|
374783
|
-
" /image-pipeline list — list templates",
|
|
374784
|
-
" /image-pipeline config <url> — set backend URL"
|
|
374785
|
-
];
|
|
374786
|
-
return /* @__PURE__ */ jsx_dev_runtime197.jsxDEV(Banner, {
|
|
374787
|
-
title: "◆ Image Pipeline",
|
|
374788
|
-
lines,
|
|
374789
|
-
color: active || autoDetected ? "green" : "yellow",
|
|
374790
|
-
onReady: () => onDone(undefined)
|
|
374791
|
-
}, undefined, false, undefined, this);
|
|
374761
|
+
function timestamp3() {
|
|
374762
|
+
const d = new Date;
|
|
374763
|
+
const pad = (n) => String(n).padStart(2, "0");
|
|
374764
|
+
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}_${pad(d.getHours())}-${pad(d.getMinutes())}-${pad(d.getSeconds())}`;
|
|
374792
374765
|
}
|
|
374793
|
-
|
|
374794
|
-
|
|
374795
|
-
|
|
374766
|
+
function slugify3(text, maxLen = 40) {
|
|
374767
|
+
return text.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "").slice(0, maxLen);
|
|
374768
|
+
}
|
|
374769
|
+
async function pickBackend(config2) {
|
|
374770
|
+
const configured = config2?.backendUrl ?? DEFAULT_COMFYUI_URL;
|
|
374771
|
+
if (await detectComfyUI(DEFAULT_COMFYUI_URL))
|
|
374772
|
+
return DEFAULT_COMFYUI_URL;
|
|
374773
|
+
if (configured !== DEFAULT_COMFYUI_URL && await detectComfyUI(configured))
|
|
374774
|
+
return configured;
|
|
374775
|
+
return null;
|
|
374776
|
+
}
|
|
374777
|
+
var React59, jsx_dev_runtime197, call20 = async (onDone, _context, args) => {
|
|
374778
|
+
const { getOriginalCwd: getOriginalCwd2 } = await Promise.resolve().then(() => (init_state(), exports_state));
|
|
374779
|
+
const projectRoot = getOriginalCwd2() ?? process.cwd();
|
|
374780
|
+
const rawArgs = args?.trim() ?? "";
|
|
374781
|
+
const [subcmd, ...rest] = rawArgs ? rawArgs.split(/\s+/) : [""];
|
|
374782
|
+
const restText = rest.join(" ").trim();
|
|
374783
|
+
if (!subcmd) {
|
|
374784
|
+
const config3 = await loadConfig(projectRoot);
|
|
374785
|
+
const backendUrl = config3?.backendUrl ?? DEFAULT_COMFYUI_URL;
|
|
374786
|
+
const active = await detectComfyUI(backendUrl);
|
|
374787
|
+
const prompts = await listPrompts(projectRoot);
|
|
374788
|
+
const workflows = await listWorkflows(projectRoot);
|
|
374789
|
+
const scaffolded = config3 !== null;
|
|
374790
|
+
const lines2 = [
|
|
374791
|
+
active ? `● ComfyUI active at ${backendUrl}` : `○ ComfyUI not found at ${backendUrl}`,
|
|
374792
|
+
scaffolded ? ` Scaffold: .localclawd/image-pipeline/ (${prompts.length} prompts, ${workflows.length} workflows)` : " Not scaffolded — run /image-pipeline setup",
|
|
374793
|
+
"",
|
|
374794
|
+
" /image-pipeline setup scaffold project dirs",
|
|
374795
|
+
" /image-pipeline generate <prompt> generate and save image",
|
|
374796
|
+
" /image-pipeline config <url> set ComfyUI URL",
|
|
374797
|
+
" /image-pipeline list list templates"
|
|
374798
|
+
];
|
|
374799
|
+
return /* @__PURE__ */ jsx_dev_runtime197.jsxDEV(PipelineCard, {
|
|
374800
|
+
title: "◆ Image Pipeline",
|
|
374801
|
+
lines: lines2,
|
|
374802
|
+
color: active ? "green" : "yellow",
|
|
374803
|
+
onReady: () => onDone(undefined)
|
|
374804
|
+
}, undefined, false, undefined, this);
|
|
374805
|
+
}
|
|
374806
|
+
if (subcmd === "setup") {
|
|
374807
|
+
const { created, alreadyExisted } = await scaffoldProject(projectRoot);
|
|
374808
|
+
const config3 = await loadConfig(projectRoot);
|
|
374809
|
+
const backendUrl = config3?.backendUrl ?? DEFAULT_COMFYUI_URL;
|
|
374810
|
+
const active = await detectComfyUI(backendUrl);
|
|
374811
|
+
const lines2 = [
|
|
374812
|
+
active ? `● ComfyUI active at ${backendUrl}` : `○ ComfyUI not detected at ${backendUrl}`,
|
|
374813
|
+
""
|
|
374814
|
+
];
|
|
374815
|
+
if (alreadyExisted) {
|
|
374816
|
+
lines2.push(" Pipeline already scaffolded.");
|
|
374817
|
+
} else {
|
|
374818
|
+
lines2.push(` Created ${created.length} files:`);
|
|
374819
|
+
for (const f of created)
|
|
374820
|
+
lines2.push(` + ${f}`);
|
|
374821
|
+
}
|
|
374822
|
+
if (!active) {
|
|
374823
|
+
lines2.push("", " To connect ComfyUI:", " /image-pipeline config http://<host>:8188");
|
|
374824
|
+
}
|
|
374825
|
+
lines2.push("", " Generated images will be saved to:", ` ${join113(projectRoot, ".localclawd", "image-pipeline", "generated")}`);
|
|
374826
|
+
return /* @__PURE__ */ jsx_dev_runtime197.jsxDEV(PipelineCard, {
|
|
374827
|
+
title: "◆ Image Pipeline — Setup",
|
|
374828
|
+
lines: lines2,
|
|
374829
|
+
color: active ? "green" : "yellow",
|
|
374830
|
+
onReady: () => onDone(undefined)
|
|
374831
|
+
}, undefined, false, undefined, this);
|
|
374832
|
+
}
|
|
374833
|
+
if (subcmd === "config") {
|
|
374834
|
+
const newUrl = restText;
|
|
374835
|
+
if (!newUrl || !newUrl.startsWith("http")) {
|
|
374836
|
+
return /* @__PURE__ */ jsx_dev_runtime197.jsxDEV(PipelineCard, {
|
|
374837
|
+
title: "◆ Image Pipeline — Config",
|
|
374838
|
+
lines: ["Usage: /image-pipeline config http://<host>:8188"],
|
|
374839
|
+
color: "yellow",
|
|
374840
|
+
onReady: () => onDone(undefined)
|
|
374841
|
+
}, undefined, false, undefined, this);
|
|
374842
|
+
}
|
|
374843
|
+
const existing = await loadConfig(projectRoot) ?? {
|
|
374844
|
+
backendUrl: DEFAULT_COMFYUI_URL,
|
|
374845
|
+
defaultWidth: 512,
|
|
374846
|
+
defaultHeight: 512,
|
|
374847
|
+
defaultSteps: 20,
|
|
374848
|
+
defaultCfg: 7,
|
|
374849
|
+
defaultSampler: "euler",
|
|
374850
|
+
defaultModel: "",
|
|
374851
|
+
outputDir: ".localclawd/image-pipeline/generated"
|
|
374852
|
+
};
|
|
374853
|
+
existing.backendUrl = newUrl;
|
|
374854
|
+
await saveConfig2(projectRoot, existing);
|
|
374855
|
+
const active = await detectComfyUI(newUrl);
|
|
374856
|
+
return /* @__PURE__ */ jsx_dev_runtime197.jsxDEV(PipelineCard, {
|
|
374857
|
+
title: "◆ Image Pipeline — Config Saved",
|
|
374858
|
+
lines: [
|
|
374859
|
+
` Backend URL: ${newUrl}`,
|
|
374860
|
+
active ? " ● ComfyUI reachable" : " ○ ComfyUI not reachable (saved anyway)"
|
|
374861
|
+
],
|
|
374862
|
+
color: active ? "green" : "yellow",
|
|
374863
|
+
onReady: () => onDone(undefined)
|
|
374864
|
+
}, undefined, false, undefined, this);
|
|
374865
|
+
}
|
|
374866
|
+
if (subcmd === "list") {
|
|
374867
|
+
const [prompts, workflows] = await Promise.all([listPrompts(projectRoot), listWorkflows(projectRoot)]);
|
|
374868
|
+
const lines2 = [];
|
|
374869
|
+
if (prompts.length === 0 && workflows.length === 0) {
|
|
374870
|
+
lines2.push(" No templates yet — run /image-pipeline setup");
|
|
374871
|
+
} else {
|
|
374872
|
+
if (prompts.length > 0) {
|
|
374873
|
+
lines2.push(" Prompt templates:");
|
|
374874
|
+
for (const p of prompts)
|
|
374875
|
+
lines2.push(` • prompts/${p}`);
|
|
374876
|
+
}
|
|
374877
|
+
if (workflows.length > 0) {
|
|
374878
|
+
lines2.push(" Workflows:");
|
|
374879
|
+
for (const w2 of workflows)
|
|
374880
|
+
lines2.push(` • workflows/${w2}`);
|
|
374881
|
+
}
|
|
374882
|
+
}
|
|
374883
|
+
return /* @__PURE__ */ jsx_dev_runtime197.jsxDEV(PipelineCard, {
|
|
374884
|
+
title: "◆ Image Pipeline — Templates",
|
|
374885
|
+
lines: lines2,
|
|
374886
|
+
onReady: () => onDone(undefined)
|
|
374887
|
+
}, undefined, false, undefined, this);
|
|
374888
|
+
}
|
|
374889
|
+
const promptText = subcmd === "generate" || subcmd === "gen" ? restText : rawArgs;
|
|
374890
|
+
if (!promptText) {
|
|
374891
|
+
return /* @__PURE__ */ jsx_dev_runtime197.jsxDEV(PipelineCard, {
|
|
374796
374892
|
title: "◆ Image Pipeline — Generate",
|
|
374797
|
-
lines: ["Usage: /image-pipeline generate <
|
|
374893
|
+
lines: [" Usage: /image-pipeline generate <prompt>"],
|
|
374798
374894
|
color: "yellow",
|
|
374799
374895
|
onReady: () => onDone(undefined)
|
|
374800
374896
|
}, undefined, false, undefined, this);
|
|
374801
374897
|
}
|
|
374802
374898
|
const config2 = await loadConfig(projectRoot);
|
|
374803
|
-
const
|
|
374804
|
-
|
|
374805
|
-
|
|
374806
|
-
|
|
374807
|
-
|
|
374808
|
-
urlToUse = DEFAULT_COMFYUI_URL;
|
|
374809
|
-
}
|
|
374810
|
-
}
|
|
374811
|
-
if (!await detectComfyUI(urlToUse)) {
|
|
374812
|
-
return /* @__PURE__ */ jsx_dev_runtime197.jsxDEV(Banner, {
|
|
374813
|
-
title: "◆ Image Pipeline — Generate Failed",
|
|
374899
|
+
const backend = await pickBackend(config2);
|
|
374900
|
+
if (!backend) {
|
|
374901
|
+
const tried = config2?.backendUrl ?? DEFAULT_COMFYUI_URL;
|
|
374902
|
+
return /* @__PURE__ */ jsx_dev_runtime197.jsxDEV(PipelineCard, {
|
|
374903
|
+
title: "◆ Image Pipeline — No Backend",
|
|
374814
374904
|
lines: [
|
|
374815
|
-
`ComfyUI not reachable at ${
|
|
374816
|
-
"Start ComfyUI or run /image-pipeline config <url>
|
|
374905
|
+
` ComfyUI not reachable at ${tried}`,
|
|
374906
|
+
" Start ComfyUI or run: /image-pipeline config <url>"
|
|
374817
374907
|
],
|
|
374818
374908
|
color: "red",
|
|
374819
374909
|
onReady: () => onDone(undefined)
|
|
374820
374910
|
}, undefined, false, undefined, this);
|
|
374821
374911
|
}
|
|
374822
|
-
const
|
|
374912
|
+
const model = config2?.defaultModel || "v1-5-pruned-emaonly.safetensors";
|
|
374823
374913
|
const width = config2?.defaultWidth ?? 512;
|
|
374824
374914
|
const height = config2?.defaultHeight ?? 512;
|
|
374825
374915
|
const steps = config2?.defaultSteps ?? 20;
|
|
374826
374916
|
const cfg = config2?.defaultCfg ?? 7;
|
|
374827
374917
|
const sampler = config2?.defaultSampler ?? "euler";
|
|
374828
|
-
const
|
|
374829
|
-
const seed = Math.floor(Math.random() * 2 ** 32);
|
|
374918
|
+
const seed = Math.floor(Math.random() * 4294967296);
|
|
374830
374919
|
const workflow = {
|
|
374831
374920
|
"4": { class_type: "CheckpointLoaderSimple", inputs: { ckpt_name: model } },
|
|
374832
374921
|
"5": { class_type: "EmptyLatentImage", inputs: { width, height, batch_size: 1 } },
|
|
374833
|
-
"6": { class_type: "CLIPTextEncode", inputs: { clip: ["4", 1], text:
|
|
374834
|
-
"7": { class_type: "CLIPTextEncode", inputs: { clip: ["4", 1], text:
|
|
374922
|
+
"6": { class_type: "CLIPTextEncode", inputs: { clip: ["4", 1], text: promptText } },
|
|
374923
|
+
"7": { class_type: "CLIPTextEncode", inputs: { clip: ["4", 1], text: "blurry, low quality, watermark, deformed" } },
|
|
374835
374924
|
"3": {
|
|
374836
374925
|
class_type: "KSampler",
|
|
374837
374926
|
inputs: {
|
|
@@ -374852,137 +374941,59 @@ async function runGenerate(onDone, projectRoot, prompt) {
|
|
|
374852
374941
|
};
|
|
374853
374942
|
let queued;
|
|
374854
374943
|
try {
|
|
374855
|
-
queued = await queuePrompt(
|
|
374944
|
+
queued = await queuePrompt(backend, workflow);
|
|
374856
374945
|
} catch (e) {
|
|
374857
|
-
return /* @__PURE__ */ jsx_dev_runtime197.jsxDEV(
|
|
374946
|
+
return /* @__PURE__ */ jsx_dev_runtime197.jsxDEV(PipelineCard, {
|
|
374858
374947
|
title: "◆ Image Pipeline — Queue Error",
|
|
374859
|
-
lines: [String(e)],
|
|
374948
|
+
lines: [` ${String(e)}`],
|
|
374860
374949
|
color: "red",
|
|
374861
374950
|
onReady: () => onDone(undefined)
|
|
374862
374951
|
}, undefined, false, undefined, this);
|
|
374863
374952
|
}
|
|
374864
|
-
const result = await pollForCompletion(
|
|
374865
|
-
|
|
374866
|
-
|
|
374867
|
-
|
|
374868
|
-
|
|
374869
|
-
|
|
374870
|
-
|
|
374871
|
-
|
|
374872
|
-
"Timed out waiting for completion — check ComfyUI directly.",
|
|
374873
|
-
`URL: ${urlToUse}/history/${queued.prompt_id}`
|
|
374874
|
-
];
|
|
374875
|
-
return /* @__PURE__ */ jsx_dev_runtime197.jsxDEV(Banner, {
|
|
374876
|
-
title: "◆ Image Pipeline — Generate",
|
|
374877
|
-
lines,
|
|
374878
|
-
color: result ? "green" : "yellow",
|
|
374879
|
-
onReady: () => onDone(undefined)
|
|
374880
|
-
}, undefined, false, undefined, this);
|
|
374881
|
-
}
|
|
374882
|
-
async function showList(onDone, projectRoot) {
|
|
374883
|
-
const [prompts, workflows] = await Promise.all([listPrompts(projectRoot), listWorkflows(projectRoot)]);
|
|
374884
|
-
const lines = [];
|
|
374885
|
-
if (prompts.length === 0 && workflows.length === 0) {
|
|
374886
|
-
lines.push("No templates yet. Run /image-pipeline setup to scaffold the project.");
|
|
374887
|
-
} else {
|
|
374888
|
-
if (prompts.length > 0) {
|
|
374889
|
-
lines.push("Prompt templates:");
|
|
374890
|
-
for (const p of prompts)
|
|
374891
|
-
lines.push(` • prompts/${p}`);
|
|
374892
|
-
}
|
|
374893
|
-
if (workflows.length > 0) {
|
|
374894
|
-
lines.push("Workflows:");
|
|
374895
|
-
for (const w2 of workflows)
|
|
374896
|
-
lines.push(` • workflows/${w2}`);
|
|
374897
|
-
}
|
|
374898
|
-
}
|
|
374899
|
-
return /* @__PURE__ */ jsx_dev_runtime197.jsxDEV(Banner, {
|
|
374900
|
-
title: "◆ Image Pipeline — Templates",
|
|
374901
|
-
lines,
|
|
374902
|
-
onReady: () => onDone(undefined)
|
|
374903
|
-
}, undefined, false, undefined, this);
|
|
374904
|
-
}
|
|
374905
|
-
async function updateConfig(onDone, projectRoot, newUrl) {
|
|
374906
|
-
if (!newUrl.startsWith("http")) {
|
|
374907
|
-
return /* @__PURE__ */ jsx_dev_runtime197.jsxDEV(Banner, {
|
|
374908
|
-
title: "◆ Image Pipeline — Config",
|
|
374909
|
-
lines: ["Invalid URL. Example: /image-pipeline config http://192.168.1.50:8188"],
|
|
374953
|
+
const result = await pollForCompletion(backend, queued.prompt_id);
|
|
374954
|
+
if (!result) {
|
|
374955
|
+
return /* @__PURE__ */ jsx_dev_runtime197.jsxDEV(PipelineCard, {
|
|
374956
|
+
title: "◆ Image Pipeline — Timed Out",
|
|
374957
|
+
lines: [
|
|
374958
|
+
` Job queued: ${queued.prompt_id}`,
|
|
374959
|
+
` Check: ${backend}/history/${queued.prompt_id}`
|
|
374960
|
+
],
|
|
374910
374961
|
color: "yellow",
|
|
374911
374962
|
onReady: () => onDone(undefined)
|
|
374912
374963
|
}, undefined, false, undefined, this);
|
|
374913
374964
|
}
|
|
374914
|
-
const
|
|
374915
|
-
|
|
374916
|
-
|
|
374917
|
-
|
|
374918
|
-
|
|
374919
|
-
|
|
374920
|
-
|
|
374921
|
-
|
|
374922
|
-
|
|
374923
|
-
|
|
374924
|
-
|
|
374925
|
-
|
|
374926
|
-
|
|
374927
|
-
|
|
374928
|
-
|
|
374929
|
-
|
|
374930
|
-
`Backend URL: ${newUrl}`,
|
|
374931
|
-
active ? "● ComfyUI reachable" : "○ ComfyUI not reachable at that URL"
|
|
374932
|
-
],
|
|
374933
|
-
color: active ? "green" : "yellow",
|
|
374934
|
-
onReady: () => onDone(undefined)
|
|
374935
|
-
}, undefined, false, undefined, this);
|
|
374936
|
-
}
|
|
374937
|
-
async function runSetup(onDone, projectRoot) {
|
|
374938
|
-
const { created, alreadyExisted } = await scaffoldProject(projectRoot);
|
|
374939
|
-
const config2 = await loadConfig(projectRoot);
|
|
374940
|
-
const configuredUrl = config2?.backendUrl ?? DEFAULT_COMFYUI_URL;
|
|
374941
|
-
const localActive = await detectComfyUI(DEFAULT_COMFYUI_URL);
|
|
374942
|
-
let activeUrl = null;
|
|
374943
|
-
if (localActive) {
|
|
374944
|
-
activeUrl = DEFAULT_COMFYUI_URL;
|
|
374945
|
-
} else if (configuredUrl !== DEFAULT_COMFYUI_URL && await detectComfyUI(configuredUrl)) {
|
|
374946
|
-
activeUrl = configuredUrl;
|
|
374965
|
+
const outputDir = join113(projectRoot, ".localclawd", "image-pipeline", "generated");
|
|
374966
|
+
await mkdir35(outputDir, { recursive: true });
|
|
374967
|
+
const comfyImages = extractOutputImages(result);
|
|
374968
|
+
const savedPaths = [];
|
|
374969
|
+
for (const imgFilename of comfyImages) {
|
|
374970
|
+
const subfolder = Object.values(result.outputs).flatMap((o) => o.images ?? []).find((img) => img.filename === imgFilename)?.subfolder ?? "";
|
|
374971
|
+
try {
|
|
374972
|
+
const params = new URLSearchParams({ filename: imgFilename, subfolder, type: "output" });
|
|
374973
|
+
const res = await fetch(`${backend}/view?${params}`);
|
|
374974
|
+
if (res.ok) {
|
|
374975
|
+
const outName = `${timestamp3()}_${slugify3(promptText)}.png`;
|
|
374976
|
+
const outPath = join113(outputDir, outName);
|
|
374977
|
+
await writeFile37(outPath, Buffer.from(await res.arrayBuffer()));
|
|
374978
|
+
savedPaths.push(outPath);
|
|
374979
|
+
}
|
|
374980
|
+
} catch {}
|
|
374947
374981
|
}
|
|
374948
|
-
const
|
|
374949
|
-
|
|
374950
|
-
|
|
374951
|
-
|
|
374952
|
-
|
|
374982
|
+
const lines = savedPaths.length > 0 ? [
|
|
374983
|
+
` Saved ${savedPaths.length} image${savedPaths.length !== 1 ? "s" : ""}:`,
|
|
374984
|
+
...savedPaths.map((p) => ` ${p}`),
|
|
374985
|
+
` Seed: ${seed} · ${steps} steps · ${width}×${height} · ${model}`
|
|
374986
|
+
] : [
|
|
374987
|
+
` Job complete — download failed, images in ComfyUI output folder.`,
|
|
374988
|
+
` ComfyUI filenames: ${comfyImages.join(", ") || "(none)"}`,
|
|
374989
|
+
` Seed: ${seed}`
|
|
374953
374990
|
];
|
|
374954
|
-
|
|
374955
|
-
|
|
374956
|
-
lines.push(` + ${f}`);
|
|
374957
|
-
}
|
|
374958
|
-
lines.push("", " Commands:", " /image-pipeline — status", " /image-pipeline generate <prompt> — submit to ComfyUI", " /image-pipeline config <url> — set backend URL", " /image-pipeline list — list templates", " /image <prompt> — quick generate + save to ~/generatedimages/");
|
|
374959
|
-
return /* @__PURE__ */ jsx_dev_runtime197.jsxDEV(Banner, {
|
|
374960
|
-
title: "◆ Image Pipeline — Setup",
|
|
374991
|
+
return /* @__PURE__ */ jsx_dev_runtime197.jsxDEV(PipelineCard, {
|
|
374992
|
+
title: "◆ Image Pipeline — Done",
|
|
374961
374993
|
lines,
|
|
374962
|
-
color:
|
|
374994
|
+
color: savedPaths.length > 0 ? "green" : "yellow",
|
|
374963
374995
|
onReady: () => onDone(undefined)
|
|
374964
374996
|
}, undefined, false, undefined, this);
|
|
374965
|
-
}
|
|
374966
|
-
var React59, jsx_dev_runtime197, call20 = async (onDone, _context, args) => {
|
|
374967
|
-
const { getOriginalCwd: getOriginalCwd2 } = await Promise.resolve().then(() => (init_state(), exports_state));
|
|
374968
|
-
const projectRoot = getOriginalCwd2() ?? process.cwd();
|
|
374969
|
-
const rawArgs = args?.trim() ?? "";
|
|
374970
|
-
if (!rawArgs) {
|
|
374971
|
-
return showStatus(onDone, projectRoot);
|
|
374972
|
-
}
|
|
374973
|
-
const [subcmd, ...rest] = rawArgs.split(/\s+/);
|
|
374974
|
-
const restText = rest.join(" ").trim();
|
|
374975
|
-
if (subcmd === "list") {
|
|
374976
|
-
return showList(onDone, projectRoot);
|
|
374977
|
-
}
|
|
374978
|
-
if (subcmd === "config") {
|
|
374979
|
-
return updateConfig(onDone, projectRoot, restText);
|
|
374980
|
-
}
|
|
374981
|
-
if (subcmd === "generate" || subcmd === "gen") {
|
|
374982
|
-
const promptText = restText || rawArgs;
|
|
374983
|
-
return runGenerate(onDone, projectRoot, promptText);
|
|
374984
|
-
}
|
|
374985
|
-
return runSetup(onDone, projectRoot);
|
|
374986
374997
|
};
|
|
374987
374998
|
var init_image_pipeline = __esm(() => {
|
|
374988
374999
|
init_ink2();
|
|
@@ -375021,9 +375032,9 @@ var init_telegramSignals = __esm(() => {
|
|
|
375021
375032
|
|
|
375022
375033
|
// src/services/telegram/telegramKill.ts
|
|
375023
375034
|
import { readdir as readdir22, unlink as unlink16 } from "fs/promises";
|
|
375024
|
-
import { join as
|
|
375035
|
+
import { join as join114 } from "path";
|
|
375025
375036
|
async function killAllInstances() {
|
|
375026
|
-
const sessionsDir =
|
|
375037
|
+
const sessionsDir = join114(getClaudeConfigHomeDir(), "sessions");
|
|
375027
375038
|
let files;
|
|
375028
375039
|
try {
|
|
375029
375040
|
files = await readdir22(sessionsDir);
|
|
@@ -375042,7 +375053,7 @@ async function killAllInstances() {
|
|
|
375042
375053
|
killed++;
|
|
375043
375054
|
logForDebugging(`[telegram-kill] Sent SIGTERM to PID ${pid}`);
|
|
375044
375055
|
} catch {
|
|
375045
|
-
await unlink16(
|
|
375056
|
+
await unlink16(join114(sessionsDir, file)).catch(() => {});
|
|
375046
375057
|
}
|
|
375047
375058
|
}
|
|
375048
375059
|
return killed;
|
|
@@ -375069,15 +375080,15 @@ function createEmptyState() {
|
|
|
375069
375080
|
}
|
|
375070
375081
|
|
|
375071
375082
|
// src/services/director/directorMemoryOps.ts
|
|
375072
|
-
import { mkdir as
|
|
375073
|
-
import { basename as basename34, join as
|
|
375083
|
+
import { mkdir as mkdir36, readdir as readdir23, readFile as readFile44, stat as stat38, writeFile as writeFile38 } from "fs/promises";
|
|
375084
|
+
import { basename as basename34, join as join115, resolve as resolve36 } from "path";
|
|
375074
375085
|
function setDirectorProjectRoot(projectPath) {
|
|
375075
|
-
_projectStateDir =
|
|
375086
|
+
_projectStateDir = join115(projectPath, ".localclawd");
|
|
375076
375087
|
}
|
|
375077
375088
|
function getStatePath() {
|
|
375078
375089
|
if (_projectStateDir)
|
|
375079
|
-
return
|
|
375080
|
-
return
|
|
375090
|
+
return join115(_projectStateDir, "director-memory.json");
|
|
375091
|
+
return join115(GLOBAL_DIRECTOR_DIR, "state.json");
|
|
375081
375092
|
}
|
|
375082
375093
|
async function loadDirectorState() {
|
|
375083
375094
|
try {
|
|
@@ -375092,15 +375103,15 @@ async function loadDirectorState() {
|
|
|
375092
375103
|
}
|
|
375093
375104
|
async function saveDirectorState(state) {
|
|
375094
375105
|
const dir = _projectStateDir || GLOBAL_DIRECTOR_DIR;
|
|
375095
|
-
await
|
|
375096
|
-
await
|
|
375106
|
+
await mkdir36(dir, { recursive: true });
|
|
375107
|
+
await writeFile38(getStatePath(), JSON.stringify(state, null, 2), "utf-8");
|
|
375097
375108
|
}
|
|
375098
|
-
function
|
|
375109
|
+
function slugify4(path12) {
|
|
375099
375110
|
return basename34(resolve36(path12)).toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
|
|
375100
375111
|
}
|
|
375101
375112
|
async function detectGitRemote(projectPath) {
|
|
375102
375113
|
try {
|
|
375103
|
-
const configPath =
|
|
375114
|
+
const configPath = join115(projectPath, ".git", "config");
|
|
375104
375115
|
const config2 = await readFile44(configPath, "utf-8");
|
|
375105
375116
|
const match = config2.match(/\[remote "origin"\][^[]*url\s*=\s*(.+)/m);
|
|
375106
375117
|
return match?.[1]?.trim();
|
|
@@ -375110,12 +375121,12 @@ async function detectGitRemote(projectPath) {
|
|
|
375110
375121
|
}
|
|
375111
375122
|
async function detectDescription(projectPath) {
|
|
375112
375123
|
try {
|
|
375113
|
-
const pkg = JSON.parse(await readFile44(
|
|
375124
|
+
const pkg = JSON.parse(await readFile44(join115(projectPath, "package.json"), "utf-8"));
|
|
375114
375125
|
if (pkg.description)
|
|
375115
375126
|
return pkg.description;
|
|
375116
375127
|
} catch {}
|
|
375117
375128
|
try {
|
|
375118
|
-
const readme = await readFile44(
|
|
375129
|
+
const readme = await readFile44(join115(projectPath, "README.md"), "utf-8");
|
|
375119
375130
|
const firstLine = readme.split(`
|
|
375120
375131
|
`).find((l) => l.trim() && !l.startsWith("#"));
|
|
375121
375132
|
if (firstLine)
|
|
@@ -375133,7 +375144,7 @@ function generateTags(project) {
|
|
|
375133
375144
|
}
|
|
375134
375145
|
async function registerProject(state, projectPath, description) {
|
|
375135
375146
|
const absPath = resolve36(projectPath);
|
|
375136
|
-
const id =
|
|
375147
|
+
const id = slugify4(absPath);
|
|
375137
375148
|
const existing = state.projects.find((p) => p.id === id || p.path === absPath);
|
|
375138
375149
|
if (existing) {
|
|
375139
375150
|
existing.lastActive = Date.now();
|
|
@@ -375169,7 +375180,7 @@ async function indexProjectFiles(state, projectId, projectPath) {
|
|
|
375169
375180
|
const absPath = resolve36(projectPath);
|
|
375170
375181
|
for (const name of KEY_FILES) {
|
|
375171
375182
|
try {
|
|
375172
|
-
const filePath =
|
|
375183
|
+
const filePath = join115(absPath, name);
|
|
375173
375184
|
await stat38(filePath);
|
|
375174
375185
|
const content = await readFile44(filePath, "utf-8");
|
|
375175
375186
|
const firstLine = content.split(`
|
|
@@ -375184,7 +375195,7 @@ async function indexProjectFiles(state, projectId, projectPath) {
|
|
|
375184
375195
|
} catch {}
|
|
375185
375196
|
}
|
|
375186
375197
|
try {
|
|
375187
|
-
const srcDir =
|
|
375198
|
+
const srcDir = join115(absPath, "src");
|
|
375188
375199
|
const srcFiles = await readdir23(srcDir);
|
|
375189
375200
|
for (const file of srcFiles.slice(0, 30)) {
|
|
375190
375201
|
if (!file.endsWith(".ts") && !file.endsWith(".tsx") && !file.endsWith(".js") && !file.endsWith(".py") && !file.endsWith(".rs") && !file.endsWith(".go"))
|
|
@@ -375257,8 +375268,8 @@ var GLOBAL_DIRECTOR_DIR, DIRECTOR_MEMORY_DIR, _projectStateDir = "", KEY_FILES,
|
|
|
375257
375268
|
var init_directorMemoryOps = __esm(() => {
|
|
375258
375269
|
init_debug();
|
|
375259
375270
|
init_envUtils();
|
|
375260
|
-
GLOBAL_DIRECTOR_DIR =
|
|
375261
|
-
DIRECTOR_MEMORY_DIR =
|
|
375271
|
+
GLOBAL_DIRECTOR_DIR = join115(getClaudeConfigHomeDir(), "director");
|
|
375272
|
+
DIRECTOR_MEMORY_DIR = join115(GLOBAL_DIRECTOR_DIR, "memory");
|
|
375262
375273
|
KEY_FILES = [
|
|
375263
375274
|
"package.json",
|
|
375264
375275
|
"README.md",
|
|
@@ -375611,11 +375622,11 @@ async function initSlack() {
|
|
|
375611
375622
|
if (!token || !channelId) {
|
|
375612
375623
|
try {
|
|
375613
375624
|
const { readFile: readFile45 } = await import("fs/promises");
|
|
375614
|
-
const { join:
|
|
375625
|
+
const { join: join116 } = await import("path");
|
|
375615
375626
|
const { homedir: homedir28 } = await import("os");
|
|
375616
375627
|
const { getClaudeConfigHomeDir: getClaudeConfigHomeDir3 } = await Promise.resolve().then(() => (init_envUtils(), exports_envUtils));
|
|
375617
|
-
const newPath =
|
|
375618
|
-
const legacyPath =
|
|
375628
|
+
const newPath = join116(getClaudeConfigHomeDir3(), "slack.json");
|
|
375629
|
+
const legacyPath = join116(homedir28(), ".claude", "slack.json");
|
|
375619
375630
|
let configPath = newPath;
|
|
375620
375631
|
try {
|
|
375621
375632
|
await (await import("fs/promises")).stat(newPath);
|
|
@@ -375931,11 +375942,11 @@ async function initDiscord() {
|
|
|
375931
375942
|
if (!token || !channelId) {
|
|
375932
375943
|
try {
|
|
375933
375944
|
const { readFile: readFile45 } = await import("fs/promises");
|
|
375934
|
-
const { join:
|
|
375945
|
+
const { join: join116 } = await import("path");
|
|
375935
375946
|
const { homedir: homedir28 } = await import("os");
|
|
375936
375947
|
const { getClaudeConfigHomeDir: getClaudeConfigHomeDir3 } = await Promise.resolve().then(() => (init_envUtils(), exports_envUtils));
|
|
375937
|
-
const newPath =
|
|
375938
|
-
const legacyPath =
|
|
375948
|
+
const newPath = join116(getClaudeConfigHomeDir3(), "discord.json");
|
|
375949
|
+
const legacyPath = join116(homedir28(), ".claude", "discord.json");
|
|
375939
375950
|
let configPath = newPath;
|
|
375940
375951
|
try {
|
|
375941
375952
|
await (await import("fs/promises")).stat(newPath);
|
|
@@ -376328,8 +376339,8 @@ __export(exports_scheduler, {
|
|
|
376328
376339
|
getSchedules: () => getSchedules,
|
|
376329
376340
|
addSchedule: () => addSchedule
|
|
376330
376341
|
});
|
|
376331
|
-
import { mkdir as
|
|
376332
|
-
import { join as
|
|
376342
|
+
import { mkdir as mkdir37, readFile as readFile45, writeFile as writeFile39 } from "fs/promises";
|
|
376343
|
+
import { join as join116 } from "path";
|
|
376333
376344
|
async function loadSchedules() {
|
|
376334
376345
|
try {
|
|
376335
376346
|
const raw = await readFile45(SCHEDULES_PATH, "utf-8");
|
|
@@ -376342,8 +376353,8 @@ async function loadSchedules() {
|
|
|
376342
376353
|
}
|
|
376343
376354
|
}
|
|
376344
376355
|
async function saveSchedules(file) {
|
|
376345
|
-
await
|
|
376346
|
-
await
|
|
376356
|
+
await mkdir37(getClaudeConfigHomeDir(), { recursive: true });
|
|
376357
|
+
await writeFile39(SCHEDULES_PATH, JSON.stringify(file, null, 2), "utf-8");
|
|
376347
376358
|
}
|
|
376348
376359
|
function nextRunTime(expr, from = Date.now()) {
|
|
376349
376360
|
const trimmed = expr.trim().toLowerCase();
|
|
@@ -376547,7 +376558,7 @@ var SCHEDULES_PATH, TICK_INTERVAL_MS = 30000, _tickTimer = null;
|
|
|
376547
376558
|
var init_scheduler = __esm(() => {
|
|
376548
376559
|
init_debug();
|
|
376549
376560
|
init_envUtils();
|
|
376550
|
-
SCHEDULES_PATH =
|
|
376561
|
+
SCHEDULES_PATH = join116(getClaudeConfigHomeDir(), "schedules.json");
|
|
376551
376562
|
});
|
|
376552
376563
|
|
|
376553
376564
|
// src/services/telegram/telegramBot.ts
|
|
@@ -376679,7 +376690,7 @@ async function initTelegram() {
|
|
|
376679
376690
|
if (!token || !chatIdStr) {
|
|
376680
376691
|
try {
|
|
376681
376692
|
const { readFile: readFile46, stat: stat39 } = await import("fs/promises");
|
|
376682
|
-
const { join:
|
|
376693
|
+
const { join: join117 } = await import("path");
|
|
376683
376694
|
const { homedir: homedir28 } = await import("os");
|
|
376684
376695
|
const { getClaudeConfigHomeDir: getClaudeConfigHomeDir3 } = await Promise.resolve().then(() => (init_envUtils(), exports_envUtils));
|
|
376685
376696
|
const { getOriginalCwd: getOriginalCwd2 } = await Promise.resolve().then(() => (init_state(), exports_state));
|
|
@@ -376687,10 +376698,10 @@ async function initTelegram() {
|
|
|
376687
376698
|
try {
|
|
376688
376699
|
const cwd2 = getOriginalCwd2();
|
|
376689
376700
|
if (cwd2)
|
|
376690
|
-
candidates.push(
|
|
376701
|
+
candidates.push(join117(cwd2, ".localclawd", "telegram.json"));
|
|
376691
376702
|
} catch {}
|
|
376692
|
-
candidates.push(
|
|
376693
|
-
candidates.push(
|
|
376703
|
+
candidates.push(join117(getClaudeConfigHomeDir3(), "telegram.json"));
|
|
376704
|
+
candidates.push(join117(homedir28(), ".claude", "telegram.json"));
|
|
376694
376705
|
let configPath = null;
|
|
376695
376706
|
for (const p of candidates) {
|
|
376696
376707
|
try {
|
|
@@ -377289,8 +377300,8 @@ var exports_telegram = {};
|
|
|
377289
377300
|
__export(exports_telegram, {
|
|
377290
377301
|
call: () => call22
|
|
377291
377302
|
});
|
|
377292
|
-
import { writeFile as
|
|
377293
|
-
import { join as
|
|
377303
|
+
import { writeFile as writeFile40, mkdir as mkdir38 } from "fs/promises";
|
|
377304
|
+
import { join as join117 } from "path";
|
|
377294
377305
|
function TelegramSetup({ onDone }) {
|
|
377295
377306
|
const [step, setStep] = React61.useState("instructions");
|
|
377296
377307
|
const [token, setToken] = React61.useState("");
|
|
@@ -377576,20 +377587,20 @@ async function saveTelegramConfig(token, chatId) {
|
|
|
377576
377587
|
const { getOriginalCwd: getOriginalCwd2 } = await Promise.resolve().then(() => (init_state(), exports_state));
|
|
377577
377588
|
const cwd2 = getOriginalCwd2();
|
|
377578
377589
|
if (cwd2) {
|
|
377579
|
-
const projDir =
|
|
377580
|
-
await
|
|
377581
|
-
configPath =
|
|
377590
|
+
const projDir = join117(cwd2, ".localclawd");
|
|
377591
|
+
await mkdir38(projDir, { recursive: true });
|
|
377592
|
+
configPath = join117(projDir, "telegram.json");
|
|
377582
377593
|
} else {
|
|
377583
377594
|
const dir = getClaudeConfigHomeDir();
|
|
377584
|
-
await
|
|
377585
|
-
configPath =
|
|
377595
|
+
await mkdir38(dir, { recursive: true });
|
|
377596
|
+
configPath = join117(dir, "telegram.json");
|
|
377586
377597
|
}
|
|
377587
377598
|
} catch {
|
|
377588
377599
|
const dir = getClaudeConfigHomeDir();
|
|
377589
|
-
await
|
|
377590
|
-
configPath =
|
|
377600
|
+
await mkdir38(dir, { recursive: true });
|
|
377601
|
+
configPath = join117(dir, "telegram.json");
|
|
377591
377602
|
}
|
|
377592
|
-
await
|
|
377603
|
+
await writeFile40(configPath, JSON.stringify({ token, chatId }, null, 2), "utf-8");
|
|
377593
377604
|
}
|
|
377594
377605
|
function TelegramStatus({
|
|
377595
377606
|
onDone
|
|
@@ -377799,8 +377810,8 @@ var exports_slack = {};
|
|
|
377799
377810
|
__export(exports_slack, {
|
|
377800
377811
|
call: () => call23
|
|
377801
377812
|
});
|
|
377802
|
-
import { writeFile as
|
|
377803
|
-
import { join as
|
|
377813
|
+
import { writeFile as writeFile41, mkdir as mkdir39 } from "fs/promises";
|
|
377814
|
+
import { join as join118 } from "path";
|
|
377804
377815
|
function SlackSetup({ onDone }) {
|
|
377805
377816
|
const [step, setStep] = React62.useState("instructions");
|
|
377806
377817
|
const [token, setToken] = React62.useState("");
|
|
@@ -378155,9 +378166,9 @@ function SlackSetupDone({
|
|
|
378155
378166
|
}
|
|
378156
378167
|
async function saveSlackConfig(token, channelId, userId) {
|
|
378157
378168
|
const configDir = getClaudeConfigHomeDir();
|
|
378158
|
-
await
|
|
378159
|
-
const configPath =
|
|
378160
|
-
await
|
|
378169
|
+
await mkdir39(configDir, { recursive: true });
|
|
378170
|
+
const configPath = join118(configDir, "slack.json");
|
|
378171
|
+
await writeFile41(configPath, JSON.stringify({ token, channelId, userId: userId ?? null }, null, 2), "utf-8");
|
|
378161
378172
|
}
|
|
378162
378173
|
function SlackStatus({
|
|
378163
378174
|
onDone
|
|
@@ -378382,8 +378393,8 @@ var exports_discord = {};
|
|
|
378382
378393
|
__export(exports_discord, {
|
|
378383
378394
|
call: () => call24
|
|
378384
378395
|
});
|
|
378385
|
-
import { writeFile as
|
|
378386
|
-
import { join as
|
|
378396
|
+
import { writeFile as writeFile42, mkdir as mkdir40 } from "fs/promises";
|
|
378397
|
+
import { join as join119 } from "path";
|
|
378387
378398
|
function DiscordSetup({ onDone }) {
|
|
378388
378399
|
const [step, setStep] = React64.useState("instructions");
|
|
378389
378400
|
const [token, setToken] = React64.useState("");
|
|
@@ -378677,8 +378688,8 @@ function DiscordSetupDone({
|
|
|
378677
378688
|
}
|
|
378678
378689
|
async function saveConfig3(token, channelId, userId) {
|
|
378679
378690
|
const configDir = getClaudeConfigHomeDir();
|
|
378680
|
-
await
|
|
378681
|
-
await
|
|
378691
|
+
await mkdir40(configDir, { recursive: true });
|
|
378692
|
+
await writeFile42(join119(configDir, "discord.json"), JSON.stringify({ token, channelId, userId: userId ?? null }, null, 2), "utf-8");
|
|
378682
378693
|
}
|
|
378683
378694
|
function DiscordStatus({
|
|
378684
378695
|
onDone
|
|
@@ -379210,8 +379221,8 @@ var init_schedule2 = __esm(() => {
|
|
|
379210
379221
|
});
|
|
379211
379222
|
|
|
379212
379223
|
// src/services/sessionSearch/sessionSummarize.ts
|
|
379213
|
-
import { readdir as readdir24, readFile as readFile46, writeFile as
|
|
379214
|
-
import { join as
|
|
379224
|
+
import { readdir as readdir24, readFile as readFile46, writeFile as writeFile43, mkdir as mkdir41, stat as stat39 } from "fs/promises";
|
|
379225
|
+
import { join as join120 } from "path";
|
|
379215
379226
|
import { homedir as homedir28 } from "os";
|
|
379216
379227
|
function extractText(obj) {
|
|
379217
379228
|
if (typeof obj === "string")
|
|
@@ -379240,7 +379251,7 @@ async function listUnsummarized() {
|
|
|
379240
379251
|
for (const f of files) {
|
|
379241
379252
|
if (!f.endsWith(".json"))
|
|
379242
379253
|
continue;
|
|
379243
|
-
const s = await stat39(
|
|
379254
|
+
const s = await stat39(join120(SUMMARIES_DIR2, f)).catch(() => null);
|
|
379244
379255
|
if (s)
|
|
379245
379256
|
existing.set(f.replace(/\.json$/, ""), s.mtimeMs);
|
|
379246
379257
|
}
|
|
@@ -379254,7 +379265,7 @@ async function listUnsummarized() {
|
|
|
379254
379265
|
continue;
|
|
379255
379266
|
}
|
|
379256
379267
|
for (const slug of slugs) {
|
|
379257
|
-
const slugDir =
|
|
379268
|
+
const slugDir = join120(projectsDir, slug);
|
|
379258
379269
|
try {
|
|
379259
379270
|
const entries = await readdir24(slugDir);
|
|
379260
379271
|
for (const entry of entries) {
|
|
@@ -379264,7 +379275,7 @@ async function listUnsummarized() {
|
|
|
379264
379275
|
if (seen.has(sessionId))
|
|
379265
379276
|
continue;
|
|
379266
379277
|
seen.add(sessionId);
|
|
379267
|
-
const full =
|
|
379278
|
+
const full = join120(slugDir, entry);
|
|
379268
379279
|
const s = await stat39(full).catch(() => null);
|
|
379269
379280
|
if (!s)
|
|
379270
379281
|
continue;
|
|
@@ -379375,7 +379386,7 @@ ${transcript}`;
|
|
|
379375
379386
|
};
|
|
379376
379387
|
}
|
|
379377
379388
|
async function summarizeAllPending(limit = 20, onProgress) {
|
|
379378
|
-
await
|
|
379389
|
+
await mkdir41(SUMMARIES_DIR2, { recursive: true });
|
|
379379
379390
|
const pending = await listUnsummarized();
|
|
379380
379391
|
pending.sort((a, b3) => b3.mtime - a.mtime);
|
|
379381
379392
|
const slice = pending.slice(0, limit);
|
|
@@ -379390,7 +379401,7 @@ async function summarizeAllPending(limit = 20, onProgress) {
|
|
|
379390
379401
|
continue;
|
|
379391
379402
|
}
|
|
379392
379403
|
try {
|
|
379393
|
-
await
|
|
379404
|
+
await writeFile43(join120(SUMMARIES_DIR2, `${p.sessionId}.json`), JSON.stringify(summary, null, 2), "utf-8");
|
|
379394
379405
|
summarized++;
|
|
379395
379406
|
} catch (e) {
|
|
379396
379407
|
logForDebugging(`[session-summarize] write failed: ${e}`);
|
|
@@ -379407,7 +379418,7 @@ async function loadAllSummaries() {
|
|
|
379407
379418
|
if (!f.endsWith(".json"))
|
|
379408
379419
|
continue;
|
|
379409
379420
|
try {
|
|
379410
|
-
const raw = await readFile46(
|
|
379421
|
+
const raw = await readFile46(join120(SUMMARIES_DIR2, f), "utf-8");
|
|
379411
379422
|
summaries.push(JSON.parse(raw));
|
|
379412
379423
|
} catch {}
|
|
379413
379424
|
}
|
|
@@ -379422,15 +379433,15 @@ var init_sessionSummarize = __esm(() => {
|
|
|
379422
379433
|
init_envUtils();
|
|
379423
379434
|
init_providers();
|
|
379424
379435
|
PROJECTS_DIRS = [
|
|
379425
|
-
|
|
379426
|
-
|
|
379436
|
+
join120(getClaudeConfigHomeDir(), "projects"),
|
|
379437
|
+
join120(homedir28(), ".claude", "projects")
|
|
379427
379438
|
];
|
|
379428
|
-
SUMMARIES_DIR2 =
|
|
379439
|
+
SUMMARIES_DIR2 = join120(getClaudeConfigHomeDir(), "session-summaries");
|
|
379429
379440
|
});
|
|
379430
379441
|
|
|
379431
379442
|
// src/services/sessionSearch/fts5Index.ts
|
|
379432
379443
|
import { readdir as readdir25, readFile as readFile47, stat as stat40 } from "fs/promises";
|
|
379433
|
-
import { join as
|
|
379444
|
+
import { join as join121 } from "path";
|
|
379434
379445
|
async function tryOpenDatabase() {
|
|
379435
379446
|
if (_db)
|
|
379436
379447
|
return _db;
|
|
@@ -379495,7 +379506,7 @@ async function rebuildIndex() {
|
|
|
379495
379506
|
continue;
|
|
379496
379507
|
const sessionId = entry.replace(/\.json$/, "");
|
|
379497
379508
|
seen.add(sessionId);
|
|
379498
|
-
const filePath =
|
|
379509
|
+
const filePath = join121(SUMMARIES_DIR3, entry);
|
|
379499
379510
|
let s;
|
|
379500
379511
|
try {
|
|
379501
379512
|
s = await stat40(filePath);
|
|
@@ -379566,13 +379577,13 @@ var DB_PATH, SUMMARIES_DIR3, _db = null, _available = null;
|
|
|
379566
379577
|
var init_fts5Index = __esm(() => {
|
|
379567
379578
|
init_debug();
|
|
379568
379579
|
init_envUtils();
|
|
379569
|
-
DB_PATH =
|
|
379570
|
-
SUMMARIES_DIR3 =
|
|
379580
|
+
DB_PATH = join121(getClaudeConfigHomeDir(), "sessions.db");
|
|
379581
|
+
SUMMARIES_DIR3 = join121(getClaudeConfigHomeDir(), "session-summaries");
|
|
379571
379582
|
});
|
|
379572
379583
|
|
|
379573
379584
|
// src/services/sessionSearch/sessionSearch.ts
|
|
379574
379585
|
import { readdir as readdir26, readFile as readFile48, stat as stat41 } from "fs/promises";
|
|
379575
|
-
import { join as
|
|
379586
|
+
import { join as join122 } from "path";
|
|
379576
379587
|
import { homedir as homedir29 } from "os";
|
|
379577
379588
|
function tokenize6(text) {
|
|
379578
379589
|
return text.toLowerCase().split(/[^a-z0-9_]+/).filter((t) => t.length >= 2);
|
|
@@ -379607,13 +379618,13 @@ async function listSessionFiles() {
|
|
|
379607
379618
|
continue;
|
|
379608
379619
|
}
|
|
379609
379620
|
for (const slug of projects) {
|
|
379610
|
-
const slugDir =
|
|
379621
|
+
const slugDir = join122(projectsDir, slug);
|
|
379611
379622
|
try {
|
|
379612
379623
|
const entries = await readdir26(slugDir);
|
|
379613
379624
|
for (const entry of entries) {
|
|
379614
379625
|
if (!entry.endsWith(".jsonl"))
|
|
379615
379626
|
continue;
|
|
379616
|
-
const full =
|
|
379627
|
+
const full = join122(slugDir, entry);
|
|
379617
379628
|
if (seen.has(entry))
|
|
379618
379629
|
continue;
|
|
379619
379630
|
seen.add(entry);
|
|
@@ -379829,8 +379840,8 @@ var init_sessionSearch = __esm(() => {
|
|
|
379829
379840
|
init_sessionSummarize();
|
|
379830
379841
|
init_fts5Index();
|
|
379831
379842
|
PROJECTS_DIRS2 = [
|
|
379832
|
-
|
|
379833
|
-
|
|
379843
|
+
join122(getClaudeConfigHomeDir(), "projects"),
|
|
379844
|
+
join122(homedir29(), ".claude", "projects")
|
|
379834
379845
|
];
|
|
379835
379846
|
MAX_FILE_BYTES = 5 * 1024 * 1024;
|
|
379836
379847
|
});
|
|
@@ -379998,8 +380009,8 @@ var init_summarize_sessions2 = __esm(() => {
|
|
|
379998
380009
|
});
|
|
379999
380010
|
|
|
380000
380011
|
// src/services/sessionSearch/trajectoryCompress.ts
|
|
380001
|
-
import { readFile as readFile49, writeFile as
|
|
380002
|
-
import { join as
|
|
380012
|
+
import { readFile as readFile49, writeFile as writeFile44, readdir as readdir27, mkdir as mkdir42, stat as stat42 } from "fs/promises";
|
|
380013
|
+
import { join as join123 } from "path";
|
|
380003
380014
|
import { homedir as homedir30 } from "os";
|
|
380004
380015
|
function flattenText(obj) {
|
|
380005
380016
|
if (typeof obj === "string")
|
|
@@ -380083,7 +380094,7 @@ async function compressSession(sessionId, projectSlug) {
|
|
|
380083
380094
|
let source = null;
|
|
380084
380095
|
let sourceStat = null;
|
|
380085
380096
|
for (const projectsDir of PROJECTS_DIRS3) {
|
|
380086
|
-
const candidate =
|
|
380097
|
+
const candidate = join123(projectsDir, projectSlug, `${sessionId}.jsonl`);
|
|
380087
380098
|
try {
|
|
380088
380099
|
const text = await readFile49(candidate, "utf-8");
|
|
380089
380100
|
const s = await stat42(candidate);
|
|
@@ -380117,8 +380128,8 @@ async function compressSession(sessionId, projectSlug) {
|
|
|
380117
380128
|
};
|
|
380118
380129
|
const serialized = JSON.stringify(trajectory, null, 0);
|
|
380119
380130
|
trajectory.compressedBytes = Buffer.byteLength(serialized, "utf-8");
|
|
380120
|
-
await
|
|
380121
|
-
await
|
|
380131
|
+
await mkdir42(TRAJECTORIES_DIR2, { recursive: true });
|
|
380132
|
+
await writeFile44(join123(TRAJECTORIES_DIR2, `${sessionId}.json`), JSON.stringify(trajectory), "utf-8");
|
|
380122
380133
|
return trajectory;
|
|
380123
380134
|
}
|
|
380124
380135
|
async function compressAllPending(limit = 20) {
|
|
@@ -380128,7 +380139,7 @@ async function compressAllPending(limit = 20) {
|
|
|
380128
380139
|
for (const f of files) {
|
|
380129
380140
|
if (!f.endsWith(".json"))
|
|
380130
380141
|
continue;
|
|
380131
|
-
const s = await stat42(
|
|
380142
|
+
const s = await stat42(join123(TRAJECTORIES_DIR2, f)).catch(() => null);
|
|
380132
380143
|
if (s)
|
|
380133
380144
|
existing.set(f.replace(/\.json$/, ""), s.mtimeMs);
|
|
380134
380145
|
}
|
|
@@ -380144,7 +380155,7 @@ async function compressAllPending(limit = 20) {
|
|
|
380144
380155
|
}
|
|
380145
380156
|
for (const slug of slugs) {
|
|
380146
380157
|
try {
|
|
380147
|
-
const entries = await readdir27(
|
|
380158
|
+
const entries = await readdir27(join123(projectsDir, slug));
|
|
380148
380159
|
for (const entry of entries) {
|
|
380149
380160
|
if (!entry.endsWith(".jsonl"))
|
|
380150
380161
|
continue;
|
|
@@ -380152,7 +380163,7 @@ async function compressAllPending(limit = 20) {
|
|
|
380152
380163
|
if (seen.has(sessionId))
|
|
380153
380164
|
continue;
|
|
380154
380165
|
seen.add(sessionId);
|
|
380155
|
-
const s = await stat42(
|
|
380166
|
+
const s = await stat42(join123(projectsDir, slug, entry)).catch(() => null);
|
|
380156
380167
|
if (!s)
|
|
380157
380168
|
continue;
|
|
380158
380169
|
const have = existing.get(sessionId);
|
|
@@ -380192,10 +380203,10 @@ var init_trajectoryCompress = __esm(() => {
|
|
|
380192
380203
|
init_debug();
|
|
380193
380204
|
init_envUtils();
|
|
380194
380205
|
PROJECTS_DIRS3 = [
|
|
380195
|
-
|
|
380196
|
-
|
|
380206
|
+
join123(getClaudeConfigHomeDir(), "projects"),
|
|
380207
|
+
join123(homedir30(), ".claude", "projects")
|
|
380197
380208
|
];
|
|
380198
|
-
TRAJECTORIES_DIR2 =
|
|
380209
|
+
TRAJECTORIES_DIR2 = join123(getClaudeConfigHomeDir(), "trajectories");
|
|
380199
380210
|
});
|
|
380200
380211
|
|
|
380201
380212
|
// src/commands/compress-sessions/compress-sessions.tsx
|
|
@@ -380276,7 +380287,7 @@ var init_compress_sessions2 = __esm(() => {
|
|
|
380276
380287
|
|
|
380277
380288
|
// src/services/skills/skillDistill.ts
|
|
380278
380289
|
import { readFile as readFile50, readdir as readdir28, stat as stat43 } from "fs/promises";
|
|
380279
|
-
import { join as
|
|
380290
|
+
import { join as join124 } from "path";
|
|
380280
380291
|
import { homedir as homedir31 } from "os";
|
|
380281
380292
|
function extractText3(obj) {
|
|
380282
380293
|
if (typeof obj === "string")
|
|
@@ -380307,13 +380318,13 @@ async function findMostRecentSession() {
|
|
|
380307
380318
|
continue;
|
|
380308
380319
|
}
|
|
380309
380320
|
for (const slug of slugs) {
|
|
380310
|
-
const slugDir =
|
|
380321
|
+
const slugDir = join124(projectsDir, slug);
|
|
380311
380322
|
try {
|
|
380312
380323
|
const entries = await readdir28(slugDir);
|
|
380313
380324
|
for (const entry of entries) {
|
|
380314
380325
|
if (!entry.endsWith(".jsonl"))
|
|
380315
380326
|
continue;
|
|
380316
|
-
const full =
|
|
380327
|
+
const full = join124(slugDir, entry);
|
|
380317
380328
|
const s = await stat43(full).catch(() => null);
|
|
380318
380329
|
if (!s)
|
|
380319
380330
|
continue;
|
|
@@ -380437,8 +380448,8 @@ var init_skillDistill = __esm(() => {
|
|
|
380437
380448
|
init_envUtils();
|
|
380438
380449
|
init_providers();
|
|
380439
380450
|
PROJECTS_DIRS4 = [
|
|
380440
|
-
|
|
380441
|
-
|
|
380451
|
+
join124(getClaudeConfigHomeDir(), "projects"),
|
|
380452
|
+
join124(homedir31(), ".claude", "projects")
|
|
380442
380453
|
];
|
|
380443
380454
|
});
|
|
380444
380455
|
|
|
@@ -381674,8 +381685,8 @@ var init_daytona_run2 = __esm(() => {
|
|
|
381674
381685
|
});
|
|
381675
381686
|
|
|
381676
381687
|
// src/services/skills/skillPortable.ts
|
|
381677
|
-
import { readdir as readdir29, readFile as readFile51, writeFile as
|
|
381678
|
-
import { join as
|
|
381688
|
+
import { readdir as readdir29, readFile as readFile51, writeFile as writeFile45, mkdir as mkdir43, stat as stat44 } from "fs/promises";
|
|
381689
|
+
import { join as join125, basename as basename35, extname as extname13, resolve as resolve37 } from "path";
|
|
381679
381690
|
function parseFrontmatter2(raw) {
|
|
381680
381691
|
const m2 = raw.match(/^---\s*\n([\s\S]*?)\n---\s*\n?([\s\S]*)$/);
|
|
381681
381692
|
if (!m2)
|
|
@@ -381727,7 +381738,7 @@ async function listSkills() {
|
|
|
381727
381738
|
out.push(entry.replace(/\.md$/, ""));
|
|
381728
381739
|
} else {
|
|
381729
381740
|
try {
|
|
381730
|
-
const sub = await stat44(
|
|
381741
|
+
const sub = await stat44(join125(USER_SKILLS_DIR, entry, "SKILL.md"));
|
|
381731
381742
|
if (sub.isFile())
|
|
381732
381743
|
out.push(entry);
|
|
381733
381744
|
} catch {}
|
|
@@ -381739,12 +381750,12 @@ async function listSkills() {
|
|
|
381739
381750
|
}
|
|
381740
381751
|
}
|
|
381741
381752
|
async function readSkillFile(name) {
|
|
381742
|
-
const flatPath =
|
|
381753
|
+
const flatPath = join125(USER_SKILLS_DIR, `${name}.md`);
|
|
381743
381754
|
try {
|
|
381744
381755
|
const raw = await readFile51(flatPath, "utf-8");
|
|
381745
381756
|
return { raw, path: flatPath };
|
|
381746
381757
|
} catch {}
|
|
381747
|
-
const dirPath =
|
|
381758
|
+
const dirPath = join125(USER_SKILLS_DIR, name, "SKILL.md");
|
|
381748
381759
|
try {
|
|
381749
381760
|
const raw = await readFile51(dirPath, "utf-8");
|
|
381750
381761
|
return { raw, path: dirPath };
|
|
@@ -381766,8 +381777,8 @@ async function exportSkill(name, destDir) {
|
|
|
381766
381777
|
body
|
|
381767
381778
|
};
|
|
381768
381779
|
const outPath = resolve37(destDir, `${skill.name}.md`);
|
|
381769
|
-
await
|
|
381770
|
-
await
|
|
381780
|
+
await mkdir43(destDir, { recursive: true });
|
|
381781
|
+
await writeFile45(outPath, buildFrontmatter(skill), "utf-8");
|
|
381771
381782
|
return { ok: true, path: outPath };
|
|
381772
381783
|
}
|
|
381773
381784
|
async function importSkill(filePath) {
|
|
@@ -381788,10 +381799,10 @@ async function importSkill(filePath) {
|
|
|
381788
381799
|
const description = typeof meta.description === "string" ? meta.description : "";
|
|
381789
381800
|
const tags = Array.isArray(meta.tags) ? meta.tags : [];
|
|
381790
381801
|
const skill = { name, description, tags, body };
|
|
381791
|
-
const outPath =
|
|
381802
|
+
const outPath = join125(USER_SKILLS_DIR, `${name}.md`);
|
|
381792
381803
|
try {
|
|
381793
|
-
await
|
|
381794
|
-
await
|
|
381804
|
+
await mkdir43(USER_SKILLS_DIR, { recursive: true });
|
|
381805
|
+
await writeFile45(outPath, buildFrontmatter(skill), "utf-8");
|
|
381795
381806
|
logForDebugging(`[skills] imported ${name} → ${outPath}`);
|
|
381796
381807
|
return { ok: true, name, path: outPath };
|
|
381797
381808
|
} catch (e) {
|
|
@@ -381802,7 +381813,7 @@ var USER_SKILLS_DIR;
|
|
|
381802
381813
|
var init_skillPortable = __esm(() => {
|
|
381803
381814
|
init_debug();
|
|
381804
381815
|
init_envUtils();
|
|
381805
|
-
USER_SKILLS_DIR =
|
|
381816
|
+
USER_SKILLS_DIR = join125(getClaudeConfigHomeDir(), "skills");
|
|
381806
381817
|
});
|
|
381807
381818
|
|
|
381808
381819
|
// src/commands/skills-export/skills-export.tsx
|
|
@@ -381996,8 +382007,8 @@ var init_skills_import2 = __esm(() => {
|
|
|
381996
382007
|
});
|
|
381997
382008
|
|
|
381998
382009
|
// src/services/skills/skillUsage.ts
|
|
381999
|
-
import { mkdir as
|
|
382000
|
-
import { join as
|
|
382010
|
+
import { mkdir as mkdir44, readFile as readFile52, writeFile as writeFile46 } from "fs/promises";
|
|
382011
|
+
import { join as join126 } from "path";
|
|
382001
382012
|
async function loadFile() {
|
|
382002
382013
|
try {
|
|
382003
382014
|
const raw = await readFile52(USAGE_PATH, "utf-8");
|
|
@@ -382031,7 +382042,7 @@ async function shouldNudgeDistillation() {
|
|
|
382031
382042
|
var USAGE_PATH;
|
|
382032
382043
|
var init_skillUsage = __esm(() => {
|
|
382033
382044
|
init_envUtils();
|
|
382034
|
-
USAGE_PATH =
|
|
382045
|
+
USAGE_PATH = join126(getClaudeConfigHomeDir(), "skill-usage.json");
|
|
382035
382046
|
});
|
|
382036
382047
|
|
|
382037
382048
|
// src/commands/skill-stats/skill-stats.tsx
|
|
@@ -382133,16 +382144,16 @@ var init_skill_stats2 = __esm(() => {
|
|
|
382133
382144
|
});
|
|
382134
382145
|
|
|
382135
382146
|
// src/services/skills/skillNotes.ts
|
|
382136
|
-
import { mkdir as
|
|
382137
|
-
import { join as
|
|
382147
|
+
import { mkdir as mkdir45, readFile as readFile53, writeFile as writeFile47, appendFile as appendFile5, stat as stat45 } from "fs/promises";
|
|
382148
|
+
import { join as join127 } from "path";
|
|
382138
382149
|
async function findNotesPath(skillName) {
|
|
382139
|
-
const dirPath =
|
|
382150
|
+
const dirPath = join127(USER_SKILLS_DIR2, skillName, "NOTES.md");
|
|
382140
382151
|
try {
|
|
382141
|
-
const s = await stat45(
|
|
382152
|
+
const s = await stat45(join127(USER_SKILLS_DIR2, skillName));
|
|
382142
382153
|
if (s.isDirectory())
|
|
382143
382154
|
return dirPath;
|
|
382144
382155
|
} catch {}
|
|
382145
|
-
return
|
|
382156
|
+
return join127(USER_SKILLS_DIR2, `${skillName}.notes.md`);
|
|
382146
382157
|
}
|
|
382147
382158
|
async function loadSkillNotes(skillName) {
|
|
382148
382159
|
const path12 = await findNotesPath(skillName);
|
|
@@ -382157,7 +382168,7 @@ async function appendSkillNote(skillName, note) {
|
|
|
382157
382168
|
if (!trimmed)
|
|
382158
382169
|
return { ok: false, error: "note is empty" };
|
|
382159
382170
|
const path12 = await findNotesPath(skillName);
|
|
382160
|
-
await
|
|
382171
|
+
await mkdir45(USER_SKILLS_DIR2, { recursive: true });
|
|
382161
382172
|
let existing = "";
|
|
382162
382173
|
try {
|
|
382163
382174
|
existing = await readFile53(path12, "utf-8");
|
|
@@ -382182,7 +382193,7 @@ async function appendSkillNote(skillName, note) {
|
|
|
382182
382193
|
const compacted = lines.slice(0, headerEnd).concat(lines.slice(trimStart)).join(`
|
|
382183
382194
|
`);
|
|
382184
382195
|
try {
|
|
382185
|
-
await
|
|
382196
|
+
await writeFile47(path12, compacted + entry, "utf-8");
|
|
382186
382197
|
} catch (e) {
|
|
382187
382198
|
return { ok: false, error: String(e) };
|
|
382188
382199
|
}
|
|
@@ -382201,7 +382212,7 @@ var USER_SKILLS_DIR2, MAX_NOTES_BYTES, MAX_NOTE_LENGTH = 500;
|
|
|
382201
382212
|
var init_skillNotes = __esm(() => {
|
|
382202
382213
|
init_debug();
|
|
382203
382214
|
init_envUtils();
|
|
382204
|
-
USER_SKILLS_DIR2 =
|
|
382215
|
+
USER_SKILLS_DIR2 = join127(getClaudeConfigHomeDir(), "skills");
|
|
382205
382216
|
MAX_NOTES_BYTES = 32 * 1024;
|
|
382206
382217
|
});
|
|
382207
382218
|
|
|
@@ -382961,9 +382972,9 @@ __export(exports_webuiServer, {
|
|
|
382961
382972
|
broadcastNewWindow: () => broadcastNewWindow
|
|
382962
382973
|
});
|
|
382963
382974
|
import { createServer as createServer5 } from "http";
|
|
382964
|
-
import { mkdir as
|
|
382975
|
+
import { mkdir as mkdir46, readdir as readdir30, readFile as readFile54, writeFile as writeFile48 } from "fs/promises";
|
|
382965
382976
|
import { createHash as createHash23 } from "crypto";
|
|
382966
|
-
import { join as
|
|
382977
|
+
import { join as join128 } from "path";
|
|
382967
382978
|
function getWebuiPort() {
|
|
382968
382979
|
return _boundPort;
|
|
382969
382980
|
}
|
|
@@ -382988,7 +382999,7 @@ function broadcastNewWindow(label) {
|
|
|
382988
382999
|
}
|
|
382989
383000
|
}
|
|
382990
383001
|
async function listInstances() {
|
|
382991
|
-
const sessionsDir =
|
|
383002
|
+
const sessionsDir = join128(getClaudeConfigHomeDir(), "sessions");
|
|
382992
383003
|
const out = [];
|
|
382993
383004
|
let files;
|
|
382994
383005
|
try {
|
|
@@ -383005,7 +383016,7 @@ async function listInstances() {
|
|
|
383005
383016
|
let cwd2;
|
|
383006
383017
|
let port;
|
|
383007
383018
|
try {
|
|
383008
|
-
const raw = await readFile54(
|
|
383019
|
+
const raw = await readFile54(join128(sessionsDir, f), "utf-8");
|
|
383009
383020
|
const parsed = JSON.parse(raw);
|
|
383010
383021
|
cwd2 = parsed.cwd;
|
|
383011
383022
|
port = parsed.webuiPort;
|
|
@@ -383016,8 +383027,8 @@ async function listInstances() {
|
|
|
383016
383027
|
}
|
|
383017
383028
|
async function ensureStaticHtml() {
|
|
383018
383029
|
try {
|
|
383019
|
-
await
|
|
383020
|
-
await
|
|
383030
|
+
await mkdir46(getClaudeConfigHomeDir(), { recursive: true });
|
|
383031
|
+
await writeFile48(WEBUI_HTML_PATH, STATIC_HTML, "utf-8");
|
|
383021
383032
|
} catch {}
|
|
383022
383033
|
}
|
|
383023
383034
|
function decodeFrame(buffer) {
|
|
@@ -383171,7 +383182,7 @@ async function startWebuiServer(port) {
|
|
|
383171
383182
|
_boundPort = addr.port;
|
|
383172
383183
|
_server = server;
|
|
383173
383184
|
logForDebugging(`[webui] listening on http://127.0.0.1:${_boundPort}`);
|
|
383174
|
-
|
|
383185
|
+
mkdir46(getClaudeConfigHomeDir(), { recursive: true }).then(() => writeFile48(PORT_FILE, String(_boundPort), "utf-8").catch(() => {}));
|
|
383175
383186
|
resolve39({ ok: true, port: _boundPort });
|
|
383176
383187
|
} else {
|
|
383177
383188
|
resolve39({ ok: false, error: "no address bound" });
|
|
@@ -383393,8 +383404,8 @@ var DEFAULT_PORT = 7150, PORT_FILE, WEBUI_HTML_PATH, _server = null, _boundPort
|
|
|
383393
383404
|
var init_webuiServer = __esm(() => {
|
|
383394
383405
|
init_debug();
|
|
383395
383406
|
init_envUtils();
|
|
383396
|
-
PORT_FILE =
|
|
383397
|
-
WEBUI_HTML_PATH =
|
|
383407
|
+
PORT_FILE = join128(getClaudeConfigHomeDir(), "webui-port");
|
|
383408
|
+
WEBUI_HTML_PATH = join128(getClaudeConfigHomeDir(), "webui-static.html");
|
|
383398
383409
|
_websockets = new Set;
|
|
383399
383410
|
_outputBuffer = [];
|
|
383400
383411
|
});
|
|
@@ -383757,9 +383768,9 @@ var init_windows_setup2 = __esm(() => {
|
|
|
383757
383768
|
|
|
383758
383769
|
// src/services/rpc/toolRpcServer.ts
|
|
383759
383770
|
import { createServer as createServer6 } from "http";
|
|
383760
|
-
import { readFile as readFile55, writeFile as
|
|
383771
|
+
import { readFile as readFile55, writeFile as writeFile49, mkdir as mkdir47, readdir as readdir31, stat as stat46 } from "fs/promises";
|
|
383761
383772
|
import { spawn as spawn12 } from "child_process";
|
|
383762
|
-
import { join as
|
|
383773
|
+
import { join as join129, resolve as resolvePath, relative as relative23 } from "path";
|
|
383763
383774
|
async function handleRead(p) {
|
|
383764
383775
|
try {
|
|
383765
383776
|
const raw = await readFile55(p.path, "utf-8");
|
|
@@ -383771,7 +383782,7 @@ async function handleRead(p) {
|
|
|
383771
383782
|
}
|
|
383772
383783
|
async function handleWrite(p) {
|
|
383773
383784
|
try {
|
|
383774
|
-
await
|
|
383785
|
+
await writeFile49(p.path, p.content, "utf-8");
|
|
383775
383786
|
return { ok: true, data: { bytes: Buffer.byteLength(p.content, "utf-8") } };
|
|
383776
383787
|
} catch (e) {
|
|
383777
383788
|
return { ok: false, error: String(e) };
|
|
@@ -383798,7 +383809,7 @@ async function handleEdit(p) {
|
|
|
383798
383809
|
updated = content.replace(p.oldString, p.newString);
|
|
383799
383810
|
replacements2 = 1;
|
|
383800
383811
|
}
|
|
383801
|
-
await
|
|
383812
|
+
await writeFile49(p.path, updated, "utf-8");
|
|
383802
383813
|
return { ok: true, data: { replacements: replacements2 } };
|
|
383803
383814
|
} catch (e) {
|
|
383804
383815
|
return { ok: false, error: String(e) };
|
|
@@ -383870,7 +383881,7 @@ async function walk(root2, out, maxEntries) {
|
|
|
383870
383881
|
for (const entry of entries) {
|
|
383871
383882
|
if (out.length >= maxEntries)
|
|
383872
383883
|
return;
|
|
383873
|
-
const full =
|
|
383884
|
+
const full = join129(root2, entry.name);
|
|
383874
383885
|
if (entry.name === "node_modules" || entry.name === ".git" || entry.name === ".next")
|
|
383875
383886
|
continue;
|
|
383876
383887
|
if (entry.isDirectory()) {
|
|
@@ -384016,7 +384027,7 @@ async function startToolRpcServer() {
|
|
|
384016
384027
|
_boundPort2 = addr.port;
|
|
384017
384028
|
_server2 = server;
|
|
384018
384029
|
logForDebugging(`[rpc] listening on 127.0.0.1:${_boundPort2}`);
|
|
384019
|
-
|
|
384030
|
+
mkdir47(getClaudeConfigHomeDir(), { recursive: true }).then(() => writeFile49(PORT_FILE2, String(_boundPort2), "utf-8").catch(() => {}));
|
|
384020
384031
|
}
|
|
384021
384032
|
resolve39();
|
|
384022
384033
|
});
|
|
@@ -384029,7 +384040,7 @@ var DEFAULT_PORT2 = 7149, PORT_FILE2, _server2 = null, _boundPort2 = 0;
|
|
|
384029
384040
|
var init_toolRpcServer = __esm(() => {
|
|
384030
384041
|
init_debug();
|
|
384031
384042
|
init_envUtils();
|
|
384032
|
-
PORT_FILE2 =
|
|
384043
|
+
PORT_FILE2 = join129(getClaudeConfigHomeDir(), "rpc-port");
|
|
384033
384044
|
});
|
|
384034
384045
|
|
|
384035
384046
|
// src/commands/rpc/rpc.tsx
|
|
@@ -384915,8 +384926,8 @@ var init_versions2 = __esm(() => {
|
|
|
384915
384926
|
});
|
|
384916
384927
|
|
|
384917
384928
|
// src/components/memory/MemoryFileSelector.tsx
|
|
384918
|
-
import { mkdir as
|
|
384919
|
-
import { join as
|
|
384929
|
+
import { mkdir as mkdir48 } from "fs/promises";
|
|
384930
|
+
import { join as join130 } from "path";
|
|
384920
384931
|
function MemoryFileSelector(t0) {
|
|
384921
384932
|
const $2 = c3(58);
|
|
384922
384933
|
const {
|
|
@@ -384924,8 +384935,8 @@ function MemoryFileSelector(t0) {
|
|
|
384924
384935
|
onCancel
|
|
384925
384936
|
} = t0;
|
|
384926
384937
|
const existingMemoryFiles = import_react112.use(getMemoryFiles());
|
|
384927
|
-
const userMemoryPath =
|
|
384928
|
-
const projectMemoryPath =
|
|
384938
|
+
const userMemoryPath = join130(getClaudeConfigHomeDir(), "CLAUDE.md");
|
|
384939
|
+
const projectMemoryPath = join130(getOriginalCwd(), "CLAUDE.md");
|
|
384929
384940
|
const hasUserMemory = existingMemoryFiles.some((f) => f.path === userMemoryPath);
|
|
384930
384941
|
const hasProjectMemory = existingMemoryFiles.some((f_0) => f_0.path === projectMemoryPath);
|
|
384931
384942
|
const allMemoryFiles = [...existingMemoryFiles.filter(_temp79).map(_temp230), ...hasUserMemory ? [] : [{
|
|
@@ -385264,7 +385275,7 @@ function MemoryFileSelector(t0) {
|
|
|
385264
385275
|
t20 = (value) => {
|
|
385265
385276
|
if (value.startsWith(OPEN_FOLDER_PREFIX)) {
|
|
385266
385277
|
const folderPath = value.slice(OPEN_FOLDER_PREFIX.length);
|
|
385267
|
-
|
|
385278
|
+
mkdir48(folderPath, {
|
|
385268
385279
|
recursive: true
|
|
385269
385280
|
}).catch(_temp86).then(() => openPath(folderPath));
|
|
385270
385281
|
return;
|
|
@@ -385624,19 +385635,19 @@ var exports_memory = {};
|
|
|
385624
385635
|
__export(exports_memory, {
|
|
385625
385636
|
call: () => call55
|
|
385626
385637
|
});
|
|
385627
|
-
import { mkdir as
|
|
385638
|
+
import { mkdir as mkdir49, writeFile as writeFile50 } from "fs/promises";
|
|
385628
385639
|
function MemoryCommand({
|
|
385629
385640
|
onDone
|
|
385630
385641
|
}) {
|
|
385631
385642
|
const handleSelectMemoryFile = async (memoryPath) => {
|
|
385632
385643
|
try {
|
|
385633
385644
|
if (memoryPath.includes(getClaudeConfigHomeDir())) {
|
|
385634
|
-
await
|
|
385645
|
+
await mkdir49(getClaudeConfigHomeDir(), {
|
|
385635
385646
|
recursive: true
|
|
385636
385647
|
});
|
|
385637
385648
|
}
|
|
385638
385649
|
try {
|
|
385639
|
-
await
|
|
385650
|
+
await writeFile50(memoryPath, "", {
|
|
385640
385651
|
encoding: "utf8",
|
|
385641
385652
|
flag: "wx"
|
|
385642
385653
|
});
|
|
@@ -386558,7 +386569,7 @@ function Help(t0) {
|
|
|
386558
386569
|
let t6;
|
|
386559
386570
|
if ($2[31] !== tabs) {
|
|
386560
386571
|
t6 = /* @__PURE__ */ jsx_dev_runtime238.jsxDEV(Tabs, {
|
|
386561
|
-
title: `localclawd v${"1.
|
|
386572
|
+
title: `localclawd v${"1.8.0"}`,
|
|
386562
386573
|
color: "professionalBlue",
|
|
386563
386574
|
defaultTab: "general",
|
|
386564
386575
|
children: tabs
|
|
@@ -387936,7 +387947,7 @@ var exports_keybindings = {};
|
|
|
387936
387947
|
__export(exports_keybindings, {
|
|
387937
387948
|
call: () => call58
|
|
387938
387949
|
});
|
|
387939
|
-
import { mkdir as
|
|
387950
|
+
import { mkdir as mkdir50, writeFile as writeFile51 } from "fs/promises";
|
|
387940
387951
|
import { dirname as dirname47 } from "path";
|
|
387941
387952
|
async function call58() {
|
|
387942
387953
|
if (!isKeybindingCustomizationEnabled()) {
|
|
@@ -387947,9 +387958,9 @@ async function call58() {
|
|
|
387947
387958
|
}
|
|
387948
387959
|
const keybindingsPath = getKeybindingsPath();
|
|
387949
387960
|
let fileExists = false;
|
|
387950
|
-
await
|
|
387961
|
+
await mkdir50(dirname47(keybindingsPath), { recursive: true });
|
|
387951
387962
|
try {
|
|
387952
|
-
await
|
|
387963
|
+
await writeFile51(keybindingsPath, generateKeybindingsTemplate(), {
|
|
387953
387964
|
encoding: "utf-8",
|
|
387954
387965
|
flag: "wx"
|
|
387955
387966
|
});
|
|
@@ -392259,7 +392270,7 @@ __export(exports_pluginStartupCheck, {
|
|
|
392259
392270
|
findMissingPlugins: () => findMissingPlugins,
|
|
392260
392271
|
checkEnabledPlugins: () => checkEnabledPlugins
|
|
392261
392272
|
});
|
|
392262
|
-
import { join as
|
|
392273
|
+
import { join as join131 } from "path";
|
|
392263
392274
|
async function checkEnabledPlugins() {
|
|
392264
392275
|
const settings = getInitialSettings();
|
|
392265
392276
|
const enabledPlugins = [];
|
|
@@ -392394,7 +392405,7 @@ async function installSelectedPlugins(pluginsToInstall, onProgress, scope = "use
|
|
|
392394
392405
|
} else {
|
|
392395
392406
|
registerPluginInstallation({
|
|
392396
392407
|
pluginId,
|
|
392397
|
-
installPath:
|
|
392408
|
+
installPath: join131(marketplaceInstallLocation, entry.source),
|
|
392398
392409
|
version: entry.version
|
|
392399
392410
|
}, scope, projectPath);
|
|
392400
392411
|
}
|
|
@@ -392712,10 +392723,10 @@ var init_AddMarketplace = __esm(() => {
|
|
|
392712
392723
|
|
|
392713
392724
|
// src/utils/plugins/installCounts.ts
|
|
392714
392725
|
import { randomBytes as randomBytes17 } from "crypto";
|
|
392715
|
-
import { readFile as readFile56, rename as rename7, unlink as unlink17, writeFile as
|
|
392716
|
-
import { join as
|
|
392726
|
+
import { readFile as readFile56, rename as rename7, unlink as unlink17, writeFile as writeFile52 } from "fs/promises";
|
|
392727
|
+
import { join as join132 } from "path";
|
|
392717
392728
|
function getInstallCountsCachePath() {
|
|
392718
|
-
return
|
|
392729
|
+
return join132(getPluginsDirectory(), INSTALL_COUNTS_CACHE_FILENAME);
|
|
392719
392730
|
}
|
|
392720
392731
|
async function loadInstallCountsCache() {
|
|
392721
392732
|
const cachePath = getInstallCountsCachePath();
|
|
@@ -392770,7 +392781,7 @@ async function saveInstallCountsCache(cache3) {
|
|
|
392770
392781
|
const pluginsDir = getPluginsDirectory();
|
|
392771
392782
|
await getFsImplementation().mkdir(pluginsDir);
|
|
392772
392783
|
const content = jsonStringify(cache3, null, 2);
|
|
392773
|
-
await
|
|
392784
|
+
await writeFile52(tempPath, content, {
|
|
392774
392785
|
encoding: "utf-8",
|
|
392775
392786
|
mode: 384
|
|
392776
392787
|
});
|
|
@@ -395457,7 +395468,7 @@ var init_DiscoverPlugins = __esm(() => {
|
|
|
395457
395468
|
});
|
|
395458
395469
|
|
|
395459
395470
|
// src/services/plugins/pluginOperations.ts
|
|
395460
|
-
import { dirname as dirname48, join as
|
|
395471
|
+
import { dirname as dirname48, join as join133 } from "path";
|
|
395461
395472
|
function assertInstallableScope(scope) {
|
|
395462
395473
|
if (!VALID_INSTALLABLE_SCOPES.includes(scope)) {
|
|
395463
395474
|
throw new Error(`Invalid scope "${scope}". Must be one of: ${VALID_INSTALLABLE_SCOPES.join(", ")}`);
|
|
@@ -395935,7 +395946,7 @@ async function performPluginUpdate({
|
|
|
395935
395946
|
throw e;
|
|
395936
395947
|
}
|
|
395937
395948
|
const marketplaceDir = marketplaceStats.isDirectory() ? marketplaceInstallLocation : dirname48(marketplaceInstallLocation);
|
|
395938
|
-
sourcePath =
|
|
395949
|
+
sourcePath = join133(marketplaceDir, entry.source);
|
|
395939
395950
|
try {
|
|
395940
395951
|
await fs4.stat(sourcePath);
|
|
395941
395952
|
} catch (e) {
|
|
@@ -395950,7 +395961,7 @@ async function performPluginUpdate({
|
|
|
395950
395961
|
throw e;
|
|
395951
395962
|
}
|
|
395952
395963
|
let pluginManifest;
|
|
395953
|
-
const manifestPath =
|
|
395964
|
+
const manifestPath = join133(sourcePath, ".claude-plugin", "plugin.json");
|
|
395954
395965
|
try {
|
|
395955
395966
|
pluginManifest = await loadPluginManifest(manifestPath, entry.name, entry.source);
|
|
395956
395967
|
} catch {}
|
|
@@ -397167,10 +397178,10 @@ var init_ManageMarketplaces = __esm(() => {
|
|
|
397167
397178
|
|
|
397168
397179
|
// src/utils/plugins/pluginFlagging.ts
|
|
397169
397180
|
import { randomBytes as randomBytes18 } from "crypto";
|
|
397170
|
-
import { readFile as readFile57, rename as rename8, unlink as unlink18, writeFile as
|
|
397171
|
-
import { join as
|
|
397181
|
+
import { readFile as readFile57, rename as rename8, unlink as unlink18, writeFile as writeFile53 } from "fs/promises";
|
|
397182
|
+
import { join as join134 } from "path";
|
|
397172
397183
|
function getFlaggedPluginsPath() {
|
|
397173
|
-
return
|
|
397184
|
+
return join134(getPluginsDirectory(), FLAGGED_PLUGINS_FILENAME);
|
|
397174
397185
|
}
|
|
397175
397186
|
function parsePluginsData(content) {
|
|
397176
397187
|
const parsed = jsonParse(content);
|
|
@@ -397208,7 +397219,7 @@ async function writeToDisk(plugins) {
|
|
|
397208
397219
|
try {
|
|
397209
397220
|
await getFsImplementation().mkdir(getPluginsDirectory());
|
|
397210
397221
|
const content = jsonStringify({ plugins }, null, 2);
|
|
397211
|
-
await
|
|
397222
|
+
await writeFile53(tempPath, content, {
|
|
397212
397223
|
encoding: "utf-8",
|
|
397213
397224
|
mode: 384
|
|
397214
397225
|
});
|
|
@@ -403717,10 +403728,10 @@ var init_transcriptSearch = __esm(() => {
|
|
|
403717
403728
|
});
|
|
403718
403729
|
|
|
403719
403730
|
// src/utils/releaseNotes.ts
|
|
403720
|
-
import { mkdir as
|
|
403721
|
-
import { dirname as dirname50, join as
|
|
403731
|
+
import { mkdir as mkdir51, readFile as readFile60, writeFile as writeFile54 } from "fs/promises";
|
|
403732
|
+
import { dirname as dirname50, join as join137 } from "path";
|
|
403722
403733
|
function getChangelogCachePath() {
|
|
403723
|
-
return
|
|
403734
|
+
return join137(getClaudeConfigHomeDir(), "cache", "changelog.md");
|
|
403724
403735
|
}
|
|
403725
403736
|
async function migrateChangelogFromConfig() {
|
|
403726
403737
|
const config2 = getGlobalConfig();
|
|
@@ -403729,8 +403740,8 @@ async function migrateChangelogFromConfig() {
|
|
|
403729
403740
|
}
|
|
403730
403741
|
const cachePath = getChangelogCachePath();
|
|
403731
403742
|
try {
|
|
403732
|
-
await
|
|
403733
|
-
await
|
|
403743
|
+
await mkdir51(dirname50(cachePath), { recursive: true });
|
|
403744
|
+
await writeFile54(cachePath, config2.cachedChangelog, {
|
|
403734
403745
|
encoding: "utf-8",
|
|
403735
403746
|
flag: "wx"
|
|
403736
403747
|
});
|
|
@@ -403751,8 +403762,8 @@ async function fetchAndStoreChangelog() {
|
|
|
403751
403762
|
return;
|
|
403752
403763
|
}
|
|
403753
403764
|
const cachePath = getChangelogCachePath();
|
|
403754
|
-
await
|
|
403755
|
-
await
|
|
403765
|
+
await mkdir51(dirname50(cachePath), { recursive: true });
|
|
403766
|
+
await writeFile54(cachePath, changelogContent, { encoding: "utf-8" });
|
|
403756
403767
|
changelogMemoryCache = changelogContent;
|
|
403757
403768
|
const changelogLastFetched = Date.now();
|
|
403758
403769
|
saveGlobalConfig((current) => ({
|
|
@@ -403820,7 +403831,7 @@ function getRecentReleaseNotes(currentVersion, previousVersion, changelogContent
|
|
|
403820
403831
|
}
|
|
403821
403832
|
return [];
|
|
403822
403833
|
}
|
|
403823
|
-
async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.
|
|
403834
|
+
async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.8.0") {
|
|
403824
403835
|
if (process.env.USER_TYPE === "ant") {
|
|
403825
403836
|
const changelog = MACRO.VERSION_CHANGELOG;
|
|
403826
403837
|
if (changelog) {
|
|
@@ -403847,7 +403858,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.7.8") {
|
|
|
403847
403858
|
releaseNotes
|
|
403848
403859
|
};
|
|
403849
403860
|
}
|
|
403850
|
-
function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.
|
|
403861
|
+
function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.8.0") {
|
|
403851
403862
|
if (process.env.USER_TYPE === "ant") {
|
|
403852
403863
|
const changelog = MACRO.VERSION_CHANGELOG;
|
|
403853
403864
|
if (changelog) {
|
|
@@ -404004,7 +404015,7 @@ function getRecentActivitySync() {
|
|
|
404004
404015
|
return cachedActivity;
|
|
404005
404016
|
}
|
|
404006
404017
|
function getLogoDisplayData() {
|
|
404007
|
-
const version = process.env.DEMO_VERSION ?? "1.
|
|
404018
|
+
const version = process.env.DEMO_VERSION ?? "1.8.0";
|
|
404008
404019
|
const serverUrl = getDirectConnectServerUrl();
|
|
404009
404020
|
const displayPath = process.env.DEMO_VERSION ? "/code/claude" : getDisplayPath(getCwd());
|
|
404010
404021
|
const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
|
|
@@ -404389,9 +404400,9 @@ function checkCachedPassesEligibility() {
|
|
|
404389
404400
|
hasCache: false
|
|
404390
404401
|
};
|
|
404391
404402
|
}
|
|
404392
|
-
const { eligible: eligible2, timestamp:
|
|
404403
|
+
const { eligible: eligible2, timestamp: timestamp4 } = cachedEntry;
|
|
404393
404404
|
const now2 = Date.now();
|
|
404394
|
-
const needsRefresh = now2 -
|
|
404405
|
+
const needsRefresh = now2 - timestamp4 > CACHE_EXPIRATION_MS;
|
|
404395
404406
|
return {
|
|
404396
404407
|
eligible: eligible2,
|
|
404397
404408
|
needsRefresh,
|
|
@@ -404474,11 +404485,11 @@ async function getCachedOrFetchPassesEligibility() {
|
|
|
404474
404485
|
if (now2 - cachedEntry.timestamp > CACHE_EXPIRATION_MS) {
|
|
404475
404486
|
logForDebugging("Passes: Cache stale, returning cached data and refreshing in background");
|
|
404476
404487
|
fetchAndStorePassesEligibility();
|
|
404477
|
-
const { timestamp:
|
|
404488
|
+
const { timestamp: timestamp5, ...response2 } = cachedEntry;
|
|
404478
404489
|
return response2;
|
|
404479
404490
|
}
|
|
404480
404491
|
logForDebugging("Passes: Using fresh cached eligibility data");
|
|
404481
|
-
const { timestamp:
|
|
404492
|
+
const { timestamp: timestamp4, ...response } = cachedEntry;
|
|
404482
404493
|
return response;
|
|
404483
404494
|
}
|
|
404484
404495
|
async function prefetchPassesEligibility() {
|
|
@@ -405104,7 +405115,7 @@ function Logo() {
|
|
|
405104
405115
|
if ($2[2] === Symbol.for("react.memo_cache_sentinel")) {
|
|
405105
405116
|
t2 = () => {
|
|
405106
405117
|
const currentConfig = getGlobalConfig();
|
|
405107
|
-
if (currentConfig.lastReleaseNotesSeen === "1.
|
|
405118
|
+
if (currentConfig.lastReleaseNotesSeen === "1.8.0") {
|
|
405108
405119
|
return;
|
|
405109
405120
|
}
|
|
405110
405121
|
saveGlobalConfig(_temp326);
|
|
@@ -405763,12 +405774,12 @@ function Logo() {
|
|
|
405763
405774
|
return t41;
|
|
405764
405775
|
}
|
|
405765
405776
|
function _temp326(current) {
|
|
405766
|
-
if (current.lastReleaseNotesSeen === "1.
|
|
405777
|
+
if (current.lastReleaseNotesSeen === "1.8.0") {
|
|
405767
405778
|
return current;
|
|
405768
405779
|
}
|
|
405769
405780
|
return {
|
|
405770
405781
|
...current,
|
|
405771
|
-
lastReleaseNotesSeen: "1.
|
|
405782
|
+
lastReleaseNotesSeen: "1.8.0"
|
|
405772
405783
|
};
|
|
405773
405784
|
}
|
|
405774
405785
|
function _temp241(s_0) {
|
|
@@ -423126,7 +423137,7 @@ __export(exports_thinkback, {
|
|
|
423126
423137
|
});
|
|
423127
423138
|
import { execa as execa11 } from "execa";
|
|
423128
423139
|
import { readFile as readFile61 } from "fs/promises";
|
|
423129
|
-
import { join as
|
|
423140
|
+
import { join as join138 } from "path";
|
|
423130
423141
|
function getMarketplaceName() {
|
|
423131
423142
|
return OFFICIAL_MARKETPLACE_NAME;
|
|
423132
423143
|
}
|
|
@@ -423144,15 +423155,15 @@ async function getThinkbackSkillDir() {
|
|
|
423144
423155
|
if (!thinkbackPlugin) {
|
|
423145
423156
|
return null;
|
|
423146
423157
|
}
|
|
423147
|
-
const skillDir =
|
|
423158
|
+
const skillDir = join138(thinkbackPlugin.path, "skills", SKILL_NAME);
|
|
423148
423159
|
if (await pathExists(skillDir)) {
|
|
423149
423160
|
return skillDir;
|
|
423150
423161
|
}
|
|
423151
423162
|
return null;
|
|
423152
423163
|
}
|
|
423153
423164
|
async function playAnimation(skillDir) {
|
|
423154
|
-
const dataPath =
|
|
423155
|
-
const playerPath =
|
|
423165
|
+
const dataPath = join138(skillDir, "year_in_review.js");
|
|
423166
|
+
const playerPath = join138(skillDir, "player.js");
|
|
423156
423167
|
try {
|
|
423157
423168
|
await readFile61(dataPath);
|
|
423158
423169
|
} catch (e) {
|
|
@@ -423200,7 +423211,7 @@ async function playAnimation(skillDir) {
|
|
|
423200
423211
|
} catch {} finally {
|
|
423201
423212
|
inkInstance.exitAlternateScreen();
|
|
423202
423213
|
}
|
|
423203
|
-
const htmlPath =
|
|
423214
|
+
const htmlPath = join138(skillDir, "year_in_review.html");
|
|
423204
423215
|
if (await pathExists(htmlPath)) {
|
|
423205
423216
|
const platform3 = getPlatform();
|
|
423206
423217
|
const openCmd = platform3 === "macos" ? "open" : platform3 === "windows" ? "start" : "xdg-open";
|
|
@@ -423536,7 +423547,7 @@ function ThinkbackFlow(t0) {
|
|
|
423536
423547
|
if (!skillDir) {
|
|
423537
423548
|
return;
|
|
423538
423549
|
}
|
|
423539
|
-
const dataPath =
|
|
423550
|
+
const dataPath = join138(skillDir, "year_in_review.js");
|
|
423540
423551
|
pathExists(dataPath).then((exists) => {
|
|
423541
423552
|
logForDebugging(`Checking for ${dataPath}: ${exists ? "found" : "not found"}`);
|
|
423542
423553
|
setHasGenerated(exists);
|
|
@@ -423707,7 +423718,7 @@ var exports_thinkback_play = {};
|
|
|
423707
423718
|
__export(exports_thinkback_play, {
|
|
423708
423719
|
call: () => call72
|
|
423709
423720
|
});
|
|
423710
|
-
import { join as
|
|
423721
|
+
import { join as join139 } from "path";
|
|
423711
423722
|
function getPluginId2() {
|
|
423712
423723
|
const marketplaceName = process.env.USER_TYPE === "ant" ? INTERNAL_MARKETPLACE_NAME : OFFICIAL_MARKETPLACE_NAME;
|
|
423713
423724
|
return `thinkback@${marketplaceName}`;
|
|
@@ -423729,7 +423740,7 @@ async function call72() {
|
|
|
423729
423740
|
value: "Thinkback plugin installation path not found."
|
|
423730
423741
|
};
|
|
423731
423742
|
}
|
|
423732
|
-
const skillDir =
|
|
423743
|
+
const skillDir = join139(firstInstall.installPath, "skills", SKILL_NAME2);
|
|
423733
423744
|
const result = await playAnimation(skillDir);
|
|
423734
423745
|
return { type: "text", value: result.message };
|
|
423735
423746
|
}
|
|
@@ -429764,7 +429775,7 @@ __export(exports_branch, {
|
|
|
429764
429775
|
call: () => call80
|
|
429765
429776
|
});
|
|
429766
429777
|
import { randomUUID as randomUUID27 } from "crypto";
|
|
429767
|
-
import { mkdir as
|
|
429778
|
+
import { mkdir as mkdir52, readFile as readFile62, writeFile as writeFile55 } from "fs/promises";
|
|
429768
429779
|
function deriveFirstPrompt(firstUserMessage) {
|
|
429769
429780
|
const content = firstUserMessage?.message?.content;
|
|
429770
429781
|
if (!content)
|
|
@@ -429780,7 +429791,7 @@ async function createFork(customTitle) {
|
|
|
429780
429791
|
const projectDir = getProjectDir2(getOriginalCwd());
|
|
429781
429792
|
const forkSessionPath = getTranscriptPathForSession(forkSessionId);
|
|
429782
429793
|
const currentTranscriptPath = getTranscriptPath();
|
|
429783
|
-
await
|
|
429794
|
+
await mkdir52(projectDir, { recursive: true, mode: 448 });
|
|
429784
429795
|
let transcriptContent;
|
|
429785
429796
|
try {
|
|
429786
429797
|
transcriptContent = await readFile62(currentTranscriptPath);
|
|
@@ -429828,7 +429839,7 @@ async function createFork(customTitle) {
|
|
|
429828
429839
|
};
|
|
429829
429840
|
lines.push(jsonStringify(forkedReplacementEntry));
|
|
429830
429841
|
}
|
|
429831
|
-
await
|
|
429842
|
+
await writeFile55(forkSessionPath, lines.join(`
|
|
429832
429843
|
`) + `
|
|
429833
429844
|
`, {
|
|
429834
429845
|
encoding: "utf8",
|
|
@@ -430090,8 +430101,8 @@ var init_types11 = __esm(() => {
|
|
|
430090
430101
|
});
|
|
430091
430102
|
|
|
430092
430103
|
// src/components/agents/agentFileUtils.ts
|
|
430093
|
-
import { mkdir as
|
|
430094
|
-
import { join as
|
|
430104
|
+
import { mkdir as mkdir53, open as open12, unlink as unlink19 } from "fs/promises";
|
|
430105
|
+
import { join as join140 } from "path";
|
|
430095
430106
|
function formatAgentAsMarkdown(agentType, whenToUse, tools, systemPrompt, color3, model, memory2, effort) {
|
|
430096
430107
|
const escapedWhenToUse = whenToUse.replace(/\\/g, "\\\\").replace(/"/g, "\\\"").replace(/\n/g, "\\\\n");
|
|
430097
430108
|
const isAllTools = tools === undefined || tools.length === 1 && tools[0] === "*";
|
|
@@ -430118,26 +430129,26 @@ function getAgentDirectoryPath(location) {
|
|
|
430118
430129
|
case "flagSettings":
|
|
430119
430130
|
throw new Error(`Cannot get directory path for ${location} agents`);
|
|
430120
430131
|
case "userSettings":
|
|
430121
|
-
return
|
|
430132
|
+
return join140(getClaudeConfigHomeDir(), AGENT_PATHS.AGENTS_DIR);
|
|
430122
430133
|
case "projectSettings":
|
|
430123
|
-
return
|
|
430134
|
+
return join140(getCwd(), AGENT_PATHS.FOLDER_NAME, AGENT_PATHS.AGENTS_DIR);
|
|
430124
430135
|
case "policySettings":
|
|
430125
|
-
return
|
|
430136
|
+
return join140(getManagedFilePath(), AGENT_PATHS.FOLDER_NAME, AGENT_PATHS.AGENTS_DIR);
|
|
430126
430137
|
case "localSettings":
|
|
430127
|
-
return
|
|
430138
|
+
return join140(getCwd(), AGENT_PATHS.FOLDER_NAME, AGENT_PATHS.AGENTS_DIR);
|
|
430128
430139
|
}
|
|
430129
430140
|
}
|
|
430130
430141
|
function getRelativeAgentDirectoryPath(location) {
|
|
430131
430142
|
switch (location) {
|
|
430132
430143
|
case "projectSettings":
|
|
430133
|
-
return
|
|
430144
|
+
return join140(".", AGENT_PATHS.FOLDER_NAME, AGENT_PATHS.AGENTS_DIR);
|
|
430134
430145
|
default:
|
|
430135
430146
|
return getAgentDirectoryPath(location);
|
|
430136
430147
|
}
|
|
430137
430148
|
}
|
|
430138
430149
|
function getNewAgentFilePath(agent) {
|
|
430139
430150
|
const dirPath = getAgentDirectoryPath(agent.source);
|
|
430140
|
-
return
|
|
430151
|
+
return join140(dirPath, `${agent.agentType}.md`);
|
|
430141
430152
|
}
|
|
430142
430153
|
function getActualAgentFilePath(agent) {
|
|
430143
430154
|
if (agent.source === "built-in") {
|
|
@@ -430148,14 +430159,14 @@ function getActualAgentFilePath(agent) {
|
|
|
430148
430159
|
}
|
|
430149
430160
|
const dirPath = getAgentDirectoryPath(agent.source);
|
|
430150
430161
|
const filename = agent.filename || agent.agentType;
|
|
430151
|
-
return
|
|
430162
|
+
return join140(dirPath, `${filename}.md`);
|
|
430152
430163
|
}
|
|
430153
430164
|
function getNewRelativeAgentFilePath(agent) {
|
|
430154
430165
|
if (agent.source === "built-in") {
|
|
430155
430166
|
return "Built-in";
|
|
430156
430167
|
}
|
|
430157
430168
|
const dirPath = getRelativeAgentDirectoryPath(agent.source);
|
|
430158
|
-
return
|
|
430169
|
+
return join140(dirPath, `${agent.agentType}.md`);
|
|
430159
430170
|
}
|
|
430160
430171
|
function getActualRelativeAgentFilePath(agent) {
|
|
430161
430172
|
if (isBuiltInAgent(agent)) {
|
|
@@ -430169,11 +430180,11 @@ function getActualRelativeAgentFilePath(agent) {
|
|
|
430169
430180
|
}
|
|
430170
430181
|
const dirPath = getRelativeAgentDirectoryPath(agent.source);
|
|
430171
430182
|
const filename = agent.filename || agent.agentType;
|
|
430172
|
-
return
|
|
430183
|
+
return join140(dirPath, `${filename}.md`);
|
|
430173
430184
|
}
|
|
430174
430185
|
async function ensureAgentDirectoryExists(source) {
|
|
430175
430186
|
const dirPath = getAgentDirectoryPath(source);
|
|
430176
|
-
await
|
|
430187
|
+
await mkdir53(dirPath, { recursive: true });
|
|
430177
430188
|
return dirPath;
|
|
430178
430189
|
}
|
|
430179
430190
|
async function saveAgentToFile(source, agentType, whenToUse, tools, systemPrompt, checkExists = true, color3, model, memory2, effort) {
|
|
@@ -436156,8 +436167,8 @@ var init_rewind = __esm(() => {
|
|
|
436156
436167
|
|
|
436157
436168
|
// src/utils/heapDumpService.ts
|
|
436158
436169
|
import { createWriteStream as createWriteStream2, writeFileSync as writeFileSync4 } from "fs";
|
|
436159
|
-
import { readdir as readdir34, readFile as readFile63, writeFile as
|
|
436160
|
-
import { join as
|
|
436170
|
+
import { readdir as readdir34, readFile as readFile63, writeFile as writeFile56 } from "fs/promises";
|
|
436171
|
+
import { join as join141 } from "path";
|
|
436161
436172
|
import { pipeline as pipeline2 } from "stream/promises";
|
|
436162
436173
|
import {
|
|
436163
436174
|
getHeapSnapshot,
|
|
@@ -436247,7 +436258,7 @@ async function captureMemoryDiagnostics(trigger, dumpNumber = 0) {
|
|
|
436247
436258
|
smapsRollup,
|
|
436248
436259
|
platform: process.platform,
|
|
436249
436260
|
nodeVersion: process.version,
|
|
436250
|
-
ccVersion: "1.
|
|
436261
|
+
ccVersion: "1.8.0"
|
|
436251
436262
|
};
|
|
436252
436263
|
}
|
|
436253
436264
|
async function performHeapDump(trigger = "manual", dumpNumber = 0) {
|
|
@@ -436265,9 +436276,9 @@ async function performHeapDump(trigger = "manual", dumpNumber = 0) {
|
|
|
436265
436276
|
const suffix = dumpNumber > 0 ? `-dump${dumpNumber}` : "";
|
|
436266
436277
|
const heapFilename = `${sessionId}${suffix}.heapsnapshot`;
|
|
436267
436278
|
const diagFilename = `${sessionId}${suffix}-diagnostics.json`;
|
|
436268
|
-
const heapPath =
|
|
436269
|
-
const diagPath =
|
|
436270
|
-
await
|
|
436279
|
+
const heapPath = join141(dumpDir, heapFilename);
|
|
436280
|
+
const diagPath = join141(dumpDir, diagFilename);
|
|
436281
|
+
await writeFile56(diagPath, jsonStringify(diagnostics, null, 2), {
|
|
436271
436282
|
mode: 384
|
|
436272
436283
|
});
|
|
436273
436284
|
logForDebugging(`[HeapDump] Diagnostics written to ${diagPath}`);
|
|
@@ -436832,7 +436843,7 @@ var init_bridge_kick = __esm(() => {
|
|
|
436832
436843
|
var call87 = async () => {
|
|
436833
436844
|
return {
|
|
436834
436845
|
type: "text",
|
|
436835
|
-
value: `${"1.
|
|
436846
|
+
value: `${"1.8.0"} (built ${"2026-05-07T15:13:54.479Z"})`
|
|
436836
436847
|
};
|
|
436837
436848
|
}, version, version_default;
|
|
436838
436849
|
var init_version = __esm(() => {
|
|
@@ -438199,8 +438210,8 @@ var init_advisor2 = __esm(() => {
|
|
|
438199
438210
|
|
|
438200
438211
|
// src/skills/bundledSkills.ts
|
|
438201
438212
|
import { constants as fsConstants4 } from "fs";
|
|
438202
|
-
import { mkdir as
|
|
438203
|
-
import { dirname as dirname51, isAbsolute as isAbsolute24, join as
|
|
438213
|
+
import { mkdir as mkdir54, open as open13 } from "fs/promises";
|
|
438214
|
+
import { dirname as dirname51, isAbsolute as isAbsolute24, join as join142, normalize as normalize12, sep as pathSep2 } from "path";
|
|
438204
438215
|
function registerBundledSkill(definition) {
|
|
438205
438216
|
const { files: files2 } = definition;
|
|
438206
438217
|
let skillRoot;
|
|
@@ -438248,7 +438259,7 @@ function getBundledSkills() {
|
|
|
438248
438259
|
return [...bundledSkills];
|
|
438249
438260
|
}
|
|
438250
438261
|
function getBundledSkillExtractDir(skillName) {
|
|
438251
|
-
return
|
|
438262
|
+
return join142(getBundledSkillsRoot(), skillName);
|
|
438252
438263
|
}
|
|
438253
438264
|
async function extractBundledSkillFiles(skillName, files2) {
|
|
438254
438265
|
const dir = getBundledSkillExtractDir(skillName);
|
|
@@ -438273,7 +438284,7 @@ async function writeSkillFiles(dir, files2) {
|
|
|
438273
438284
|
byParent.set(parent2, [entry]);
|
|
438274
438285
|
}
|
|
438275
438286
|
await Promise.all([...byParent].map(async ([parent2, entries]) => {
|
|
438276
|
-
await
|
|
438287
|
+
await mkdir54(parent2, { recursive: true, mode: 448 });
|
|
438277
438288
|
await Promise.all(entries.map(([p, c5]) => safeWriteFile(p, c5)));
|
|
438278
438289
|
}));
|
|
438279
438290
|
}
|
|
@@ -438290,7 +438301,7 @@ function resolveSkillFilePath(baseDir, relPath) {
|
|
|
438290
438301
|
if (isAbsolute24(normalized) || normalized.split(pathSep2).includes("..") || normalized.split("/").includes("..")) {
|
|
438291
438302
|
throw new Error(`bundled skill file path escapes skill dir: ${relPath}`);
|
|
438292
438303
|
}
|
|
438293
|
-
return
|
|
438304
|
+
return join142(baseDir, normalized);
|
|
438294
438305
|
}
|
|
438295
438306
|
function prependBaseDir(blocks, baseDir) {
|
|
438296
438307
|
const prefix = `Base directory for this skill: ${baseDir}
|
|
@@ -438649,7 +438660,7 @@ var init_exit2 = __esm(() => {
|
|
|
438649
438660
|
});
|
|
438650
438661
|
|
|
438651
438662
|
// src/components/ExportDialog.tsx
|
|
438652
|
-
import { join as
|
|
438663
|
+
import { join as join143 } from "path";
|
|
438653
438664
|
function ExportDialog({
|
|
438654
438665
|
content,
|
|
438655
438666
|
defaultFilename,
|
|
@@ -438682,7 +438693,7 @@ function ExportDialog({
|
|
|
438682
438693
|
};
|
|
438683
438694
|
const handleFilenameSubmit = () => {
|
|
438684
438695
|
const finalFilename = filename.endsWith(".txt") ? filename : filename.replace(/\.[^.]+$/, "") + ".txt";
|
|
438685
|
-
const filepath =
|
|
438696
|
+
const filepath = join143(getCwd(), finalFilename);
|
|
438686
438697
|
try {
|
|
438687
438698
|
writeFileSync_DEPRECATED(filepath, content, {
|
|
438688
438699
|
encoding: "utf-8",
|
|
@@ -438905,7 +438916,7 @@ __export(exports_export, {
|
|
|
438905
438916
|
extractFirstPrompt: () => extractFirstPrompt,
|
|
438906
438917
|
call: () => call91
|
|
438907
438918
|
});
|
|
438908
|
-
import { join as
|
|
438919
|
+
import { join as join144 } from "path";
|
|
438909
438920
|
function formatTimestamp(date2) {
|
|
438910
438921
|
const year = date2.getFullYear();
|
|
438911
438922
|
const month = String(date2.getMonth() + 1).padStart(2, "0");
|
|
@@ -438949,7 +438960,7 @@ async function call91(onDone, context7, args) {
|
|
|
438949
438960
|
const filename = args.trim();
|
|
438950
438961
|
if (filename) {
|
|
438951
438962
|
const finalFilename = filename.endsWith(".txt") ? filename : filename.replace(/\.[^.]+$/, "") + ".txt";
|
|
438952
|
-
const filepath =
|
|
438963
|
+
const filepath = join144(getCwd(), finalFilename);
|
|
438953
438964
|
try {
|
|
438954
438965
|
writeFileSync_DEPRECATED(filepath, content, {
|
|
438955
438966
|
encoding: "utf-8",
|
|
@@ -438963,13 +438974,13 @@ async function call91(onDone, context7, args) {
|
|
|
438963
438974
|
}
|
|
438964
438975
|
}
|
|
438965
438976
|
const firstPrompt = extractFirstPrompt(context7.messages);
|
|
438966
|
-
const
|
|
438977
|
+
const timestamp4 = formatTimestamp(new Date);
|
|
438967
438978
|
let defaultFilename;
|
|
438968
438979
|
if (firstPrompt) {
|
|
438969
438980
|
const sanitized = sanitizeFilename(firstPrompt);
|
|
438970
|
-
defaultFilename = sanitized ? `${
|
|
438981
|
+
defaultFilename = sanitized ? `${timestamp4}-${sanitized}.txt` : `conversation-${timestamp4}.txt`;
|
|
438971
438982
|
} else {
|
|
438972
|
-
defaultFilename = `conversation-${
|
|
438983
|
+
defaultFilename = `conversation-${timestamp4}.txt`;
|
|
438973
438984
|
}
|
|
438974
438985
|
return /* @__PURE__ */ jsx_dev_runtime368.jsxDEV(ExportDialog, {
|
|
438975
438986
|
content,
|
|
@@ -440494,7 +440505,7 @@ var init_asciichart = __esm(() => {
|
|
|
440494
440505
|
// src/utils/statsCache.ts
|
|
440495
440506
|
import { randomBytes as randomBytes19 } from "crypto";
|
|
440496
440507
|
import { open as open14 } from "fs/promises";
|
|
440497
|
-
import { join as
|
|
440508
|
+
import { join as join145 } from "path";
|
|
440498
440509
|
async function withStatsCacheLock(fn) {
|
|
440499
440510
|
while (statsCacheLockPromise) {
|
|
440500
440511
|
await statsCacheLockPromise;
|
|
@@ -440511,7 +440522,7 @@ async function withStatsCacheLock(fn) {
|
|
|
440511
440522
|
}
|
|
440512
440523
|
}
|
|
440513
440524
|
function getStatsCachePath() {
|
|
440514
|
-
return
|
|
440525
|
+
return join145(getClaudeConfigHomeDir(), STATS_CACHE_FILENAME);
|
|
440515
440526
|
}
|
|
440516
440527
|
function getEmptyCache() {
|
|
440517
440528
|
return {
|
|
@@ -441177,16 +441188,16 @@ var init_ansiToPng = __esm(() => {
|
|
|
441177
441188
|
});
|
|
441178
441189
|
|
|
441179
441190
|
// src/utils/screenshotClipboard.ts
|
|
441180
|
-
import { mkdir as
|
|
441191
|
+
import { mkdir as mkdir55, unlink as unlink20, writeFile as writeFile57 } from "fs/promises";
|
|
441181
441192
|
import { tmpdir as tmpdir8 } from "os";
|
|
441182
|
-
import { join as
|
|
441193
|
+
import { join as join146 } from "path";
|
|
441183
441194
|
async function copyAnsiToClipboard(ansiText, options) {
|
|
441184
441195
|
try {
|
|
441185
|
-
const tempDir =
|
|
441186
|
-
await
|
|
441187
|
-
const pngPath =
|
|
441196
|
+
const tempDir = join146(tmpdir8(), "claude-code-screenshots");
|
|
441197
|
+
await mkdir55(tempDir, { recursive: true });
|
|
441198
|
+
const pngPath = join146(tempDir, `screenshot-${Date.now()}.png`);
|
|
441188
441199
|
const pngBuffer = ansiToPng(ansiText, options);
|
|
441189
|
-
await
|
|
441200
|
+
await writeFile57(pngPath, pngBuffer);
|
|
441190
441201
|
const result = await copyPngToClipboard(pngPath);
|
|
441191
441202
|
try {
|
|
441192
441203
|
await unlink20(pngPath);
|
|
@@ -441255,7 +441266,7 @@ var init_screenshotClipboard = __esm(() => {
|
|
|
441255
441266
|
|
|
441256
441267
|
// src/utils/stats.ts
|
|
441257
441268
|
import { open as open15 } from "fs/promises";
|
|
441258
|
-
import { basename as basename40, join as
|
|
441269
|
+
import { basename as basename40, join as join147, sep as sep30 } from "path";
|
|
441259
441270
|
async function processSessionFiles(sessionFiles, options = {}) {
|
|
441260
441271
|
const { fromDate, toDate } = options;
|
|
441261
441272
|
const fs5 = getFsImplementation();
|
|
@@ -441433,17 +441444,17 @@ async function getAllSessionFiles() {
|
|
|
441433
441444
|
return [];
|
|
441434
441445
|
throw e;
|
|
441435
441446
|
}
|
|
441436
|
-
const projectDirs = allEntries.filter((dirent) => dirent.isDirectory()).map((dirent) =>
|
|
441447
|
+
const projectDirs = allEntries.filter((dirent) => dirent.isDirectory()).map((dirent) => join147(projectsDir, dirent.name));
|
|
441437
441448
|
const projectResults = await Promise.all(projectDirs.map(async (projectDir) => {
|
|
441438
441449
|
try {
|
|
441439
441450
|
const entries = await fs5.readdir(projectDir);
|
|
441440
|
-
const mainFiles = entries.filter((dirent) => dirent.isFile() && dirent.name.endsWith(".jsonl")).map((dirent) =>
|
|
441451
|
+
const mainFiles = entries.filter((dirent) => dirent.isFile() && dirent.name.endsWith(".jsonl")).map((dirent) => join147(projectDir, dirent.name));
|
|
441441
441452
|
const sessionDirs = entries.filter((dirent) => dirent.isDirectory());
|
|
441442
441453
|
const subagentResults = await Promise.all(sessionDirs.map(async (sessionDir) => {
|
|
441443
|
-
const subagentsDir =
|
|
441454
|
+
const subagentsDir = join147(projectDir, sessionDir.name, "subagents");
|
|
441444
441455
|
try {
|
|
441445
441456
|
const subagentEntries = await fs5.readdir(subagentsDir);
|
|
441446
|
-
return subagentEntries.filter((dirent) => dirent.isFile() && dirent.name.endsWith(".jsonl") && dirent.name.startsWith("agent-")).map((dirent) =>
|
|
441457
|
+
return subagentEntries.filter((dirent) => dirent.isFile() && dirent.name.endsWith(".jsonl") && dirent.name.startsWith("agent-")).map((dirent) => join147(subagentsDir, dirent.name));
|
|
441447
441458
|
} catch {
|
|
441448
441459
|
return [];
|
|
441449
441460
|
}
|
|
@@ -443313,16 +443324,16 @@ import { execFileSync as execFileSync3 } from "child_process";
|
|
|
443313
443324
|
import { constants as fsConstants5 } from "fs";
|
|
443314
443325
|
import {
|
|
443315
443326
|
copyFile as copyFile9,
|
|
443316
|
-
mkdir as
|
|
443327
|
+
mkdir as mkdir56,
|
|
443317
443328
|
mkdtemp,
|
|
443318
443329
|
readdir as readdir35,
|
|
443319
443330
|
readFile as readFile64,
|
|
443320
443331
|
rm as rm10,
|
|
443321
443332
|
unlink as unlink21,
|
|
443322
|
-
writeFile as
|
|
443333
|
+
writeFile as writeFile58
|
|
443323
443334
|
} from "fs/promises";
|
|
443324
443335
|
import { tmpdir as tmpdir9 } from "os";
|
|
443325
|
-
import { extname as extname14, join as
|
|
443336
|
+
import { extname as extname14, join as join148 } from "path";
|
|
443326
443337
|
function getAnalysisModel() {
|
|
443327
443338
|
return getDefaultOpusModel();
|
|
443328
443339
|
}
|
|
@@ -443330,13 +443341,13 @@ function getInsightsModel() {
|
|
|
443330
443341
|
return getDefaultOpusModel();
|
|
443331
443342
|
}
|
|
443332
443343
|
function getDataDir() {
|
|
443333
|
-
return
|
|
443344
|
+
return join148(getClaudeConfigHomeDir(), "usage-data");
|
|
443334
443345
|
}
|
|
443335
443346
|
function getFacetsDir() {
|
|
443336
|
-
return
|
|
443347
|
+
return join148(getDataDir(), "facets");
|
|
443337
443348
|
}
|
|
443338
443349
|
function getSessionMetaDir() {
|
|
443339
|
-
return
|
|
443350
|
+
return join148(getDataDir(), "session-meta");
|
|
443340
443351
|
}
|
|
443341
443352
|
function getLanguageFromPath(filePath) {
|
|
443342
443353
|
const ext = extname14(filePath).toLowerCase();
|
|
@@ -443681,7 +443692,7 @@ async function formatTranscriptWithSummarization(log2) {
|
|
|
443681
443692
|
`);
|
|
443682
443693
|
}
|
|
443683
443694
|
async function loadCachedFacets(sessionId) {
|
|
443684
|
-
const facetPath =
|
|
443695
|
+
const facetPath = join148(getFacetsDir(), `${sessionId}.json`);
|
|
443685
443696
|
try {
|
|
443686
443697
|
const content = await readFile64(facetPath, { encoding: "utf-8" });
|
|
443687
443698
|
const parsed = jsonParse(content);
|
|
@@ -443698,16 +443709,16 @@ async function loadCachedFacets(sessionId) {
|
|
|
443698
443709
|
}
|
|
443699
443710
|
async function saveFacets(facets) {
|
|
443700
443711
|
try {
|
|
443701
|
-
await
|
|
443712
|
+
await mkdir56(getFacetsDir(), { recursive: true });
|
|
443702
443713
|
} catch {}
|
|
443703
|
-
const facetPath =
|
|
443704
|
-
await
|
|
443714
|
+
const facetPath = join148(getFacetsDir(), `${facets.session_id}.json`);
|
|
443715
|
+
await writeFile58(facetPath, jsonStringify(facets, null, 2), {
|
|
443705
443716
|
encoding: "utf-8",
|
|
443706
443717
|
mode: 384
|
|
443707
443718
|
});
|
|
443708
443719
|
}
|
|
443709
443720
|
async function loadCachedSessionMeta(sessionId) {
|
|
443710
|
-
const metaPath =
|
|
443721
|
+
const metaPath = join148(getSessionMetaDir(), `${sessionId}.json`);
|
|
443711
443722
|
try {
|
|
443712
443723
|
const content = await readFile64(metaPath, { encoding: "utf-8" });
|
|
443713
443724
|
return jsonParse(content);
|
|
@@ -443717,10 +443728,10 @@ async function loadCachedSessionMeta(sessionId) {
|
|
|
443717
443728
|
}
|
|
443718
443729
|
async function saveSessionMeta(meta) {
|
|
443719
443730
|
try {
|
|
443720
|
-
await
|
|
443731
|
+
await mkdir56(getSessionMetaDir(), { recursive: true });
|
|
443721
443732
|
} catch {}
|
|
443722
|
-
const metaPath =
|
|
443723
|
-
await
|
|
443733
|
+
const metaPath = join148(getSessionMetaDir(), `${meta.session_id}.json`);
|
|
443734
|
+
await writeFile58(metaPath, jsonStringify(meta, null, 2), {
|
|
443724
443735
|
encoding: "utf-8",
|
|
443725
443736
|
mode: 384
|
|
443726
443737
|
});
|
|
@@ -443775,9 +443786,9 @@ function detectMultiClauding(sessions) {
|
|
|
443775
443786
|
const OVERLAP_WINDOW_MS = 30 * 60000;
|
|
443776
443787
|
const allSessionMessages = [];
|
|
443777
443788
|
for (const session2 of sessions) {
|
|
443778
|
-
for (const
|
|
443789
|
+
for (const timestamp4 of session2.user_message_timestamps) {
|
|
443779
443790
|
try {
|
|
443780
|
-
const ts = new Date(
|
|
443791
|
+
const ts = new Date(timestamp4).getTime();
|
|
443781
443792
|
allSessionMessages.push({ ts, sessionId: session2.session_id });
|
|
443782
443793
|
} catch {}
|
|
443783
443794
|
}
|
|
@@ -444776,7 +444787,7 @@ function generateHtmlReport(data, insights) {
|
|
|
444776
444787
|
</html>`;
|
|
444777
444788
|
}
|
|
444778
444789
|
function buildExportData(data, insights, facets, remoteStats) {
|
|
444779
|
-
const version2 = typeof MACRO !== "undefined" ? "1.
|
|
444790
|
+
const version2 = typeof MACRO !== "undefined" ? "1.8.0" : "unknown";
|
|
444780
444791
|
const remote_hosts_collected = remoteStats?.hosts.filter((h) => h.sessionCount > 0).map((h) => h.name);
|
|
444781
444792
|
const facets_summary = {
|
|
444782
444793
|
total: facets.size,
|
|
@@ -444827,7 +444838,7 @@ async function scanAllSessions() {
|
|
|
444827
444838
|
} catch {
|
|
444828
444839
|
return [];
|
|
444829
444840
|
}
|
|
444830
|
-
const projectDirs = dirents.filter((dirent) => dirent.isDirectory()).map((dirent) =>
|
|
444841
|
+
const projectDirs = dirents.filter((dirent) => dirent.isDirectory()).map((dirent) => join148(projectsDir, dirent.name));
|
|
444831
444842
|
const allSessions = [];
|
|
444832
444843
|
for (let i2 = 0;i2 < projectDirs.length; i2++) {
|
|
444833
444844
|
const sessionFiles = await getSessionFilesWithMtime(projectDirs[i2]);
|
|
@@ -444849,7 +444860,7 @@ async function scanAllSessions() {
|
|
|
444849
444860
|
async function generateUsageReport(options) {
|
|
444850
444861
|
let remoteStats;
|
|
444851
444862
|
if (process.env.USER_TYPE === "ant" && options?.collectRemote) {
|
|
444852
|
-
const destDir =
|
|
444863
|
+
const destDir = join148(getClaudeConfigHomeDir(), "projects");
|
|
444853
444864
|
const { hosts, totalCopied } = await collectAllRemoteHostData(destDir);
|
|
444854
444865
|
remoteStats = { hosts, totalCopied };
|
|
444855
444866
|
}
|
|
@@ -444986,10 +444997,10 @@ async function generateUsageReport(options) {
|
|
|
444986
444997
|
const insights = await generateParallelInsights(aggregated, facets);
|
|
444987
444998
|
const htmlReport = generateHtmlReport(aggregated, insights);
|
|
444988
444999
|
try {
|
|
444989
|
-
await
|
|
445000
|
+
await mkdir56(getDataDir(), { recursive: true });
|
|
444990
445001
|
} catch {}
|
|
444991
|
-
const htmlPath =
|
|
444992
|
-
await
|
|
445002
|
+
const htmlPath = join148(getDataDir(), "report.html");
|
|
445003
|
+
await writeFile58(htmlPath, htmlReport, {
|
|
444993
445004
|
encoding: "utf-8",
|
|
444994
445005
|
mode: 384
|
|
444995
445006
|
});
|
|
@@ -445084,13 +445095,13 @@ var init_insights = __esm(() => {
|
|
|
445084
445095
|
} : async () => 0;
|
|
445085
445096
|
collectFromRemoteHost = process.env.USER_TYPE === "ant" ? async (homespace, destDir) => {
|
|
445086
445097
|
const result = { copied: 0, skipped: 0 };
|
|
445087
|
-
const tempDir = await mkdtemp(
|
|
445098
|
+
const tempDir = await mkdtemp(join148(tmpdir9(), "claude-hs-"));
|
|
445088
445099
|
try {
|
|
445089
445100
|
const scpResult = await execFileNoThrow("scp", ["-rq", `${homespace}.coder:/root/.claude/projects/`, tempDir], { timeout: 300000 });
|
|
445090
445101
|
if (scpResult.code !== 0) {
|
|
445091
445102
|
return result;
|
|
445092
445103
|
}
|
|
445093
|
-
const projectsDir =
|
|
445104
|
+
const projectsDir = join148(tempDir, "projects");
|
|
445094
445105
|
let projectDirents;
|
|
445095
445106
|
try {
|
|
445096
445107
|
projectDirents = await readdir35(projectsDir, { withFileTypes: true });
|
|
@@ -445099,13 +445110,13 @@ var init_insights = __esm(() => {
|
|
|
445099
445110
|
}
|
|
445100
445111
|
await Promise.all(projectDirents.map(async (dirent) => {
|
|
445101
445112
|
const projectName = dirent.name;
|
|
445102
|
-
const projectPath =
|
|
445113
|
+
const projectPath = join148(projectsDir, projectName);
|
|
445103
445114
|
if (!dirent.isDirectory())
|
|
445104
445115
|
return;
|
|
445105
445116
|
const destProjectName = `${projectName}__${homespace}`;
|
|
445106
|
-
const destProjectPath =
|
|
445117
|
+
const destProjectPath = join148(destDir, destProjectName);
|
|
445107
445118
|
try {
|
|
445108
|
-
await
|
|
445119
|
+
await mkdir56(destProjectPath, { recursive: true });
|
|
445109
445120
|
} catch {}
|
|
445110
445121
|
let files2;
|
|
445111
445122
|
try {
|
|
@@ -445117,8 +445128,8 @@ var init_insights = __esm(() => {
|
|
|
445117
445128
|
const fileName = fileDirent.name;
|
|
445118
445129
|
if (!fileName.endsWith(".jsonl"))
|
|
445119
445130
|
return;
|
|
445120
|
-
const srcFile =
|
|
445121
|
-
const destFile =
|
|
445131
|
+
const srcFile = join148(projectPath, fileName);
|
|
445132
|
+
const destFile = join148(destProjectPath, fileName);
|
|
445122
445133
|
try {
|
|
445123
445134
|
await copyFile9(srcFile, destFile, fsConstants5.COPYFILE_EXCL);
|
|
445124
445135
|
result.copied++;
|
|
@@ -445425,9 +445436,9 @@ Find something genuinely interesting or amusing from the session summaries.`,
|
|
|
445425
445436
|
let reportUrl = `file://${htmlPath}`;
|
|
445426
445437
|
let uploadHint = "";
|
|
445427
445438
|
if (process.env.USER_TYPE === "ant") {
|
|
445428
|
-
const
|
|
445439
|
+
const timestamp4 = new Date().toISOString().replace(/[-:]/g, "").replace("T", "_").slice(0, 15);
|
|
445429
445440
|
const username = process.env.SAFEUSER || process.env.USER || "unknown";
|
|
445430
|
-
const filename = `${username}_insights_${
|
|
445441
|
+
const filename = `${username}_insights_${timestamp4}.html`;
|
|
445431
445442
|
const s3Path = `s3://anthropic-serve/atamkin/cc-user-reports/${filename}`;
|
|
445432
445443
|
const s3Url = `https://s3-frontend.infra.ant.dev/anthropic-serve/atamkin/cc-user-reports/${filename}`;
|
|
445433
445444
|
reportUrl = s3Url;
|
|
@@ -446149,14 +446160,14 @@ import { closeSync as closeSync4, fstatSync, openSync as openSync5, readSync as
|
|
|
446149
446160
|
import {
|
|
446150
446161
|
appendFile as fsAppendFile,
|
|
446151
446162
|
open as fsOpen2,
|
|
446152
|
-
mkdir as
|
|
446163
|
+
mkdir as mkdir57,
|
|
446153
446164
|
readdir as readdir36,
|
|
446154
446165
|
readFile as readFile65,
|
|
446155
446166
|
stat as stat49,
|
|
446156
446167
|
unlink as unlink22,
|
|
446157
|
-
writeFile as
|
|
446168
|
+
writeFile as writeFile59
|
|
446158
446169
|
} from "fs/promises";
|
|
446159
|
-
import { basename as basename41, dirname as dirname53, join as
|
|
446170
|
+
import { basename as basename41, dirname as dirname53, join as join149 } from "path";
|
|
446160
446171
|
function isTranscriptMessage(entry) {
|
|
446161
446172
|
return entry.type === "user" || entry.type === "assistant" || entry.type === "attachment" || entry.type === "system";
|
|
446162
446173
|
}
|
|
@@ -446170,18 +446181,18 @@ function isEphemeralToolProgress(dataType) {
|
|
|
446170
446181
|
return typeof dataType === "string" && EPHEMERAL_PROGRESS_TYPES.has(dataType);
|
|
446171
446182
|
}
|
|
446172
446183
|
function getProjectsDir2() {
|
|
446173
|
-
return
|
|
446184
|
+
return join149(getClaudeConfigHomeDir(), "projects");
|
|
446174
446185
|
}
|
|
446175
446186
|
function getTranscriptPath() {
|
|
446176
446187
|
const projectDir = getSessionProjectDir() ?? getProjectDir2(getOriginalCwd());
|
|
446177
|
-
return
|
|
446188
|
+
return join149(projectDir, `${getSessionId()}.jsonl`);
|
|
446178
446189
|
}
|
|
446179
446190
|
function getTranscriptPathForSession(sessionId) {
|
|
446180
446191
|
if (sessionId === getSessionId()) {
|
|
446181
446192
|
return getTranscriptPath();
|
|
446182
446193
|
}
|
|
446183
446194
|
const projectDir = getProjectDir2(getOriginalCwd());
|
|
446184
|
-
return
|
|
446195
|
+
return join149(projectDir, `${sessionId}.jsonl`);
|
|
446185
446196
|
}
|
|
446186
446197
|
function setAgentTranscriptSubdir(agentId, subdir) {
|
|
446187
446198
|
agentTranscriptSubdirs.set(agentId, subdir);
|
|
@@ -446193,16 +446204,16 @@ function getAgentTranscriptPath(agentId) {
|
|
|
446193
446204
|
const projectDir = getSessionProjectDir() ?? getProjectDir2(getOriginalCwd());
|
|
446194
446205
|
const sessionId = getSessionId();
|
|
446195
446206
|
const subdir = agentTranscriptSubdirs.get(agentId);
|
|
446196
|
-
const base = subdir ?
|
|
446197
|
-
return
|
|
446207
|
+
const base = subdir ? join149(projectDir, sessionId, "subagents", subdir) : join149(projectDir, sessionId, "subagents");
|
|
446208
|
+
return join149(base, `agent-${agentId}.jsonl`);
|
|
446198
446209
|
}
|
|
446199
446210
|
function getAgentMetadataPath(agentId) {
|
|
446200
446211
|
return getAgentTranscriptPath(agentId).replace(/\.jsonl$/, ".meta.json");
|
|
446201
446212
|
}
|
|
446202
446213
|
async function writeAgentMetadata(agentId, metadata) {
|
|
446203
446214
|
const path15 = getAgentMetadataPath(agentId);
|
|
446204
|
-
await
|
|
446205
|
-
await
|
|
446215
|
+
await mkdir57(dirname53(path15), { recursive: true });
|
|
446216
|
+
await writeFile59(path15, JSON.stringify(metadata));
|
|
446206
446217
|
}
|
|
446207
446218
|
async function readAgentMetadata(agentId) {
|
|
446208
446219
|
const path15 = getAgentMetadataPath(agentId);
|
|
@@ -446217,15 +446228,15 @@ async function readAgentMetadata(agentId) {
|
|
|
446217
446228
|
}
|
|
446218
446229
|
function getRemoteAgentsDir() {
|
|
446219
446230
|
const projectDir = getSessionProjectDir() ?? getProjectDir2(getOriginalCwd());
|
|
446220
|
-
return
|
|
446231
|
+
return join149(projectDir, getSessionId(), "remote-agents");
|
|
446221
446232
|
}
|
|
446222
446233
|
function getRemoteAgentMetadataPath(taskId) {
|
|
446223
|
-
return
|
|
446234
|
+
return join149(getRemoteAgentsDir(), `remote-agent-${taskId}.meta.json`);
|
|
446224
446235
|
}
|
|
446225
446236
|
async function writeRemoteAgentMetadata(taskId, metadata) {
|
|
446226
446237
|
const path15 = getRemoteAgentMetadataPath(taskId);
|
|
446227
|
-
await
|
|
446228
|
-
await
|
|
446238
|
+
await mkdir57(dirname53(path15), { recursive: true });
|
|
446239
|
+
await writeFile59(path15, JSON.stringify(metadata));
|
|
446229
446240
|
}
|
|
446230
446241
|
async function readRemoteAgentMetadata(taskId) {
|
|
446231
446242
|
const path15 = getRemoteAgentMetadataPath(taskId);
|
|
@@ -446263,7 +446274,7 @@ async function listRemoteAgentMetadata() {
|
|
|
446263
446274
|
if (!entry.isFile() || !entry.name.endsWith(".meta.json"))
|
|
446264
446275
|
continue;
|
|
446265
446276
|
try {
|
|
446266
|
-
const raw = await readFile65(
|
|
446277
|
+
const raw = await readFile65(join149(dir, entry.name), "utf-8");
|
|
446267
446278
|
results.push(JSON.parse(raw));
|
|
446268
446279
|
} catch (e) {
|
|
446269
446280
|
logForDebugging(`listRemoteAgentMetadata: skipping ${entry.name}: ${String(e)}`);
|
|
@@ -446273,7 +446284,7 @@ async function listRemoteAgentMetadata() {
|
|
|
446273
446284
|
}
|
|
446274
446285
|
function sessionIdExists(sessionId) {
|
|
446275
446286
|
const projectDir = getProjectDir2(getOriginalCwd());
|
|
446276
|
-
const sessionFile =
|
|
446287
|
+
const sessionFile = join149(projectDir, `${sessionId}.jsonl`);
|
|
446277
446288
|
const fs5 = getFsImplementation();
|
|
446278
446289
|
try {
|
|
446279
446290
|
fs5.statSync(sessionFile);
|
|
@@ -446413,7 +446424,7 @@ class Project {
|
|
|
446413
446424
|
try {
|
|
446414
446425
|
await fsAppendFile(filePath, data, { mode: 384 });
|
|
446415
446426
|
} catch {
|
|
446416
|
-
await
|
|
446427
|
+
await mkdir57(dirname53(filePath), { recursive: true, mode: 448 });
|
|
446417
446428
|
await fsAppendFile(filePath, data, { mode: 384 });
|
|
446418
446429
|
}
|
|
446419
446430
|
}
|
|
@@ -446617,7 +446628,7 @@ class Project {
|
|
|
446617
446628
|
return true;
|
|
446618
446629
|
}
|
|
446619
446630
|
});
|
|
446620
|
-
await
|
|
446631
|
+
await writeFile59(this.sessionFile, lines.join(`
|
|
446621
446632
|
`), {
|
|
446622
446633
|
encoding: "utf8"
|
|
446623
446634
|
});
|
|
@@ -446954,11 +446965,11 @@ async function hydrateRemoteSession(sessionId, ingressUrl) {
|
|
|
446954
446965
|
try {
|
|
446955
446966
|
const remoteLogs = await getSessionLogs(sessionId, ingressUrl) || [];
|
|
446956
446967
|
const projectDir = getProjectDir2(getOriginalCwd());
|
|
446957
|
-
await
|
|
446968
|
+
await mkdir57(projectDir, { recursive: true, mode: 448 });
|
|
446958
446969
|
const sessionFile = getTranscriptPathForSession(sessionId);
|
|
446959
446970
|
const content = remoteLogs.map((e) => jsonStringify(e) + `
|
|
446960
446971
|
`).join("");
|
|
446961
|
-
await
|
|
446972
|
+
await writeFile59(sessionFile, content, { encoding: "utf8", mode: 384 });
|
|
446962
446973
|
logForDebugging(`Hydrated ${remoteLogs.length} entries from remote`);
|
|
446963
446974
|
return remoteLogs.length > 0;
|
|
446964
446975
|
} catch (error5) {
|
|
@@ -446986,11 +446997,11 @@ async function hydrateFromCCRv2InternalEvents(sessionId) {
|
|
|
446986
446997
|
return false;
|
|
446987
446998
|
}
|
|
446988
446999
|
const projectDir = getProjectDir2(getOriginalCwd());
|
|
446989
|
-
await
|
|
447000
|
+
await mkdir57(projectDir, { recursive: true, mode: 448 });
|
|
446990
447001
|
const sessionFile = getTranscriptPathForSession(sessionId);
|
|
446991
447002
|
const fgContent = events2.map((e) => jsonStringify(e.payload) + `
|
|
446992
447003
|
`).join("");
|
|
446993
|
-
await
|
|
447004
|
+
await writeFile59(sessionFile, fgContent, { encoding: "utf8", mode: 384 });
|
|
446994
447005
|
logForDebugging(`Hydrated ${events2.length} foreground entries from CCR v2 internal events`);
|
|
446995
447006
|
let subagentEventCount = 0;
|
|
446996
447007
|
const subagentReader = project2.getInternalSubagentEventReader();
|
|
@@ -447012,10 +447023,10 @@ async function hydrateFromCCRv2InternalEvents(sessionId) {
|
|
|
447012
447023
|
}
|
|
447013
447024
|
for (const [agentId, entries] of byAgent) {
|
|
447014
447025
|
const agentFile = getAgentTranscriptPath(asAgentId(agentId));
|
|
447015
|
-
await
|
|
447026
|
+
await mkdir57(dirname53(agentFile), { recursive: true, mode: 448 });
|
|
447016
447027
|
const agentContent = entries.map((p) => jsonStringify(p) + `
|
|
447017
447028
|
`).join("");
|
|
447018
|
-
await
|
|
447029
|
+
await writeFile59(agentFile, agentContent, {
|
|
447019
447030
|
encoding: "utf8",
|
|
447020
447031
|
mode: 384
|
|
447021
447032
|
});
|
|
@@ -448242,7 +448253,7 @@ async function loadTranscriptFile(filePath, opts) {
|
|
|
448242
448253
|
};
|
|
448243
448254
|
}
|
|
448244
448255
|
async function loadSessionFile(sessionId) {
|
|
448245
|
-
const sessionFile =
|
|
448256
|
+
const sessionFile = join149(getSessionProjectDir() ?? getProjectDir2(getOriginalCwd()), `${sessionId}.jsonl`);
|
|
448246
448257
|
return loadTranscriptFile(sessionFile);
|
|
448247
448258
|
}
|
|
448248
448259
|
function clearSessionMessagesCache() {
|
|
@@ -448310,7 +448321,7 @@ async function loadAllProjectsMessageLogsFull(limit) {
|
|
|
448310
448321
|
} catch {
|
|
448311
448322
|
return [];
|
|
448312
448323
|
}
|
|
448313
|
-
const projectDirs = dirents.filter((dirent) => dirent.isDirectory()).map((dirent) =>
|
|
448324
|
+
const projectDirs = dirents.filter((dirent) => dirent.isDirectory()).map((dirent) => join149(projectsDir, dirent.name));
|
|
448314
448325
|
const logsPerProject = await Promise.all(projectDirs.map((projectDir) => getLogsWithoutIndex(projectDir, limit)));
|
|
448315
448326
|
const allLogs = logsPerProject.flat();
|
|
448316
448327
|
const deduped = new Map;
|
|
@@ -448335,7 +448346,7 @@ async function loadAllProjectsMessageLogsProgressive(limit, initialEnrichCount =
|
|
|
448335
448346
|
} catch {
|
|
448336
448347
|
return { logs: [], allStatLogs: [], nextIndex: 0 };
|
|
448337
448348
|
}
|
|
448338
|
-
const projectDirs = dirents.filter((dirent) => dirent.isDirectory()).map((dirent) =>
|
|
448349
|
+
const projectDirs = dirents.filter((dirent) => dirent.isDirectory()).map((dirent) => join149(projectsDir, dirent.name));
|
|
448339
448350
|
const rawLogs = [];
|
|
448340
448351
|
for (const projectDir of projectDirs) {
|
|
448341
448352
|
rawLogs.push(...await getSessionFilesLite(projectDir, limit));
|
|
@@ -448396,7 +448407,7 @@ async function getStatOnlyLogsForWorktrees(worktreePaths, limit) {
|
|
|
448396
448407
|
for (const { path: wtPath, prefix } of indexed) {
|
|
448397
448408
|
if (dirName === prefix || dirName.startsWith(prefix + "-")) {
|
|
448398
448409
|
seenDirs.add(dirName);
|
|
448399
|
-
allLogs.push(...await getSessionFilesLite(
|
|
448410
|
+
allLogs.push(...await getSessionFilesLite(join149(projectsDir, dirent.name), undefined, wtPath));
|
|
448400
448411
|
break;
|
|
448401
448412
|
}
|
|
448402
448413
|
}
|
|
@@ -448465,7 +448476,7 @@ async function loadSubagentTranscripts(agentIds) {
|
|
|
448465
448476
|
return transcripts;
|
|
448466
448477
|
}
|
|
448467
448478
|
async function loadAllSubagentTranscriptsFromDisk() {
|
|
448468
|
-
const subagentsDir =
|
|
448479
|
+
const subagentsDir = join149(getSessionProjectDir() ?? getProjectDir2(getOriginalCwd()), getSessionId(), "subagents");
|
|
448469
448480
|
let entries;
|
|
448470
448481
|
try {
|
|
448471
448482
|
entries = await readdir36(subagentsDir, { withFileTypes: true });
|
|
@@ -448593,7 +448604,7 @@ async function getSessionFilesWithMtime(projectDir) {
|
|
|
448593
448604
|
const sessionId = validateUuid2(basename41(dirent.name, ".jsonl"));
|
|
448594
448605
|
if (!sessionId)
|
|
448595
448606
|
continue;
|
|
448596
|
-
candidates.push({ sessionId, filePath:
|
|
448607
|
+
candidates.push({ sessionId, filePath: join149(projectDir, dirent.name) });
|
|
448597
448608
|
}
|
|
448598
448609
|
await Promise.all(candidates.map(async ({ sessionId, filePath }) => {
|
|
448599
448610
|
try {
|
|
@@ -448977,7 +448988,7 @@ var init_sessionStorage = __esm(() => {
|
|
|
448977
448988
|
init_settings2();
|
|
448978
448989
|
init_slowOperations();
|
|
448979
448990
|
init_uuid();
|
|
448980
|
-
VERSION6 = typeof MACRO !== "undefined" ? "1.
|
|
448991
|
+
VERSION6 = typeof MACRO !== "undefined" ? "1.8.0" : "unknown";
|
|
448981
448992
|
MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
|
|
448982
448993
|
SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
|
|
448983
448994
|
EPHEMERAL_PROGRESS_TYPES = new Set([
|
|
@@ -448989,7 +449000,7 @@ var init_sessionStorage = __esm(() => {
|
|
|
448989
449000
|
MAX_TRANSCRIPT_READ_BYTES = 50 * 1024 * 1024;
|
|
448990
449001
|
agentTranscriptSubdirs = new Map;
|
|
448991
449002
|
getProjectDir2 = memoize_default((projectDir) => {
|
|
448992
|
-
return
|
|
449003
|
+
return join149(getProjectsDir2(), sanitizePath2(projectDir));
|
|
448993
449004
|
});
|
|
448994
449005
|
METADATA_TYPE_MARKERS = [
|
|
448995
449006
|
'"type":"summary"',
|
|
@@ -449225,41 +449236,41 @@ var init_memdir = __esm(() => {
|
|
|
449225
449236
|
});
|
|
449226
449237
|
|
|
449227
449238
|
// src/tools/AgentTool/agentMemory.ts
|
|
449228
|
-
import { join as
|
|
449239
|
+
import { join as join150, normalize as normalize13, sep as sep31 } from "path";
|
|
449229
449240
|
function sanitizeAgentTypeForPath(agentType) {
|
|
449230
449241
|
return agentType.replace(/:/g, "-");
|
|
449231
449242
|
}
|
|
449232
449243
|
function getLocalAgentMemoryDir(dirName) {
|
|
449233
449244
|
if (process.env.CLAUDE_CODE_REMOTE_MEMORY_DIR) {
|
|
449234
|
-
return
|
|
449245
|
+
return join150(process.env.CLAUDE_CODE_REMOTE_MEMORY_DIR, "projects", sanitizePath2(findCanonicalGitRoot(getProjectRoot()) ?? getProjectRoot()), "agent-memory-local", dirName) + sep31;
|
|
449235
449246
|
}
|
|
449236
|
-
return
|
|
449247
|
+
return join150(getProjectMemoryBaseDir(), "agent-memory-local", dirName) + sep31;
|
|
449237
449248
|
}
|
|
449238
449249
|
function getAgentMemoryDir(agentType, scope) {
|
|
449239
449250
|
const dirName = sanitizeAgentTypeForPath(agentType);
|
|
449240
449251
|
switch (scope) {
|
|
449241
449252
|
case "project":
|
|
449242
|
-
return
|
|
449253
|
+
return join150(getProjectMemoryBaseDir(), "agent-memory", dirName) + sep31;
|
|
449243
449254
|
case "local":
|
|
449244
449255
|
return getLocalAgentMemoryDir(dirName);
|
|
449245
449256
|
case "user":
|
|
449246
|
-
return
|
|
449257
|
+
return join150(getMemoryBaseDir(), "agent-memory", dirName) + sep31;
|
|
449247
449258
|
}
|
|
449248
449259
|
}
|
|
449249
449260
|
function isAgentMemoryPath(absolutePath) {
|
|
449250
449261
|
const normalizedPath = normalize13(absolutePath);
|
|
449251
449262
|
const memoryBase = getMemoryBaseDir();
|
|
449252
|
-
if (normalizedPath.startsWith(
|
|
449263
|
+
if (normalizedPath.startsWith(join150(memoryBase, "agent-memory") + sep31)) {
|
|
449253
449264
|
return true;
|
|
449254
449265
|
}
|
|
449255
|
-
if (normalizedPath.startsWith(
|
|
449266
|
+
if (normalizedPath.startsWith(join150(getProjectMemoryBaseDir(), "agent-memory") + sep31)) {
|
|
449256
449267
|
return true;
|
|
449257
449268
|
}
|
|
449258
449269
|
if (process.env.CLAUDE_CODE_REMOTE_MEMORY_DIR) {
|
|
449259
|
-
if (normalizedPath.includes(sep31 + "agent-memory-local" + sep31) && normalizedPath.startsWith(
|
|
449270
|
+
if (normalizedPath.includes(sep31 + "agent-memory-local" + sep31) && normalizedPath.startsWith(join150(process.env.CLAUDE_CODE_REMOTE_MEMORY_DIR, "projects") + sep31)) {
|
|
449260
449271
|
return true;
|
|
449261
449272
|
}
|
|
449262
|
-
} else if (normalizedPath.startsWith(
|
|
449273
|
+
} else if (normalizedPath.startsWith(join150(getProjectMemoryBaseDir(), "agent-memory-local") + sep31)) {
|
|
449263
449274
|
return true;
|
|
449264
449275
|
}
|
|
449265
449276
|
return false;
|
|
@@ -449267,7 +449278,7 @@ function isAgentMemoryPath(absolutePath) {
|
|
|
449267
449278
|
function getMemoryScopeDisplay(memory2) {
|
|
449268
449279
|
switch (memory2) {
|
|
449269
449280
|
case "user":
|
|
449270
|
-
return `User (${
|
|
449281
|
+
return `User (${join150(getMemoryBaseDir(), "agent-memory")}/)`;
|
|
449271
449282
|
case "project":
|
|
449272
449283
|
return "Project (.localclawd/agent-memory/)";
|
|
449273
449284
|
case "local":
|
|
@@ -449309,7 +449320,7 @@ var init_agentMemory = __esm(() => {
|
|
|
449309
449320
|
// src/utils/permissions/filesystem.ts
|
|
449310
449321
|
import { randomBytes as randomBytes20 } from "crypto";
|
|
449311
449322
|
import { homedir as homedir35, tmpdir as tmpdir10 } from "os";
|
|
449312
|
-
import { join as
|
|
449323
|
+
import { join as join151, normalize as normalize14, posix as posix8, sep as sep32 } from "path";
|
|
449313
449324
|
function normalizeCaseForComparison(path15) {
|
|
449314
449325
|
return path15.toLowerCase();
|
|
449315
449326
|
}
|
|
@@ -449318,11 +449329,11 @@ function getClaudeSkillScope(filePath) {
|
|
|
449318
449329
|
const absolutePathLower = normalizeCaseForComparison(absolutePath);
|
|
449319
449330
|
const bases = [
|
|
449320
449331
|
{
|
|
449321
|
-
dir: expandPath(
|
|
449332
|
+
dir: expandPath(join151(getOriginalCwd(), ".claude", "skills")),
|
|
449322
449333
|
prefix: "/.claude/skills/"
|
|
449323
449334
|
},
|
|
449324
449335
|
{
|
|
449325
|
-
dir: expandPath(
|
|
449336
|
+
dir: expandPath(join151(homedir35(), ".claude", "skills")),
|
|
449326
449337
|
prefix: "~/.claude/skills/"
|
|
449327
449338
|
}
|
|
449328
449339
|
];
|
|
@@ -449377,21 +449388,21 @@ function isClaudeConfigFilePath(filePath) {
|
|
|
449377
449388
|
if (isClaudeSettingsPath(filePath)) {
|
|
449378
449389
|
return true;
|
|
449379
449390
|
}
|
|
449380
|
-
const commandsDir =
|
|
449381
|
-
const agentsDir =
|
|
449382
|
-
const skillsDir =
|
|
449391
|
+
const commandsDir = join151(getOriginalCwd(), ".claude", "commands");
|
|
449392
|
+
const agentsDir = join151(getOriginalCwd(), ".claude", "agents");
|
|
449393
|
+
const skillsDir = join151(getOriginalCwd(), ".claude", "skills");
|
|
449383
449394
|
return pathInWorkingPath(filePath, commandsDir) || pathInWorkingPath(filePath, agentsDir) || pathInWorkingPath(filePath, skillsDir);
|
|
449384
449395
|
}
|
|
449385
449396
|
function isSessionPlanFile(absolutePath) {
|
|
449386
|
-
const expectedPrefix =
|
|
449397
|
+
const expectedPrefix = join151(getPlansDirectory(), getPlanSlug());
|
|
449387
449398
|
const normalizedPath = normalize14(absolutePath);
|
|
449388
449399
|
return normalizedPath.startsWith(expectedPrefix) && normalizedPath.endsWith(".md");
|
|
449389
449400
|
}
|
|
449390
449401
|
function getSessionMemoryDir() {
|
|
449391
|
-
return
|
|
449402
|
+
return join151(getProjectDir2(getCwd()), getSessionId(), "session-memory") + sep32;
|
|
449392
449403
|
}
|
|
449393
449404
|
function getSessionMemoryPath() {
|
|
449394
|
-
return
|
|
449405
|
+
return join151(getSessionMemoryDir(), "summary.md");
|
|
449395
449406
|
}
|
|
449396
449407
|
function isSessionMemoryPath(absolutePath) {
|
|
449397
449408
|
const normalizedPath = normalize14(absolutePath);
|
|
@@ -449413,10 +449424,10 @@ function getClaudeTempDirName() {
|
|
|
449413
449424
|
return `claude-${uid}`;
|
|
449414
449425
|
}
|
|
449415
449426
|
function getProjectTempDir() {
|
|
449416
|
-
return
|
|
449427
|
+
return join151(getClaudeTempDir(), sanitizePath2(getOriginalCwd())) + sep32;
|
|
449417
449428
|
}
|
|
449418
449429
|
function getScratchpadDir() {
|
|
449419
|
-
return
|
|
449430
|
+
return join151(getProjectTempDir(), getSessionId(), "scratchpad");
|
|
449420
449431
|
}
|
|
449421
449432
|
async function ensureScratchpadDir() {
|
|
449422
449433
|
if (!isScratchpadEnabled()) {
|
|
@@ -449994,7 +450005,7 @@ function checkEditableInternalPath(absolutePath, input) {
|
|
|
449994
450005
|
}
|
|
449995
450006
|
};
|
|
449996
450007
|
}
|
|
449997
|
-
if (normalizeCaseForComparison(normalizedPath) === normalizeCaseForComparison(
|
|
450008
|
+
if (normalizeCaseForComparison(normalizedPath) === normalizeCaseForComparison(join151(getOriginalCwd(), ".claude", "launch.json"))) {
|
|
449998
450009
|
return {
|
|
449999
450010
|
behavior: "allow",
|
|
450000
450011
|
updatedInput: input,
|
|
@@ -450091,7 +450102,7 @@ function checkReadableInternalPath(absolutePath, input) {
|
|
|
450091
450102
|
}
|
|
450092
450103
|
};
|
|
450093
450104
|
}
|
|
450094
|
-
const tasksDir =
|
|
450105
|
+
const tasksDir = join151(getClaudeConfigHomeDir(), "tasks") + sep32;
|
|
450095
450106
|
if (normalizedPath === tasksDir.slice(0, -1) || normalizedPath.startsWith(tasksDir)) {
|
|
450096
450107
|
return {
|
|
450097
450108
|
behavior: "allow",
|
|
@@ -450102,7 +450113,7 @@ function checkReadableInternalPath(absolutePath, input) {
|
|
|
450102
450113
|
}
|
|
450103
450114
|
};
|
|
450104
450115
|
}
|
|
450105
|
-
const teamsReadDir =
|
|
450116
|
+
const teamsReadDir = join151(getClaudeConfigHomeDir(), "teams") + sep32;
|
|
450106
450117
|
if (normalizedPath === teamsReadDir.slice(0, -1) || normalizedPath.startsWith(teamsReadDir)) {
|
|
450107
450118
|
return {
|
|
450108
450119
|
behavior: "allow",
|
|
@@ -450174,11 +450185,11 @@ var init_filesystem = __esm(() => {
|
|
|
450174
450185
|
try {
|
|
450175
450186
|
resolvedBaseTmpDir = fs5.realpathSync(baseTmpDir);
|
|
450176
450187
|
} catch {}
|
|
450177
|
-
return
|
|
450188
|
+
return join151(resolvedBaseTmpDir, getClaudeTempDirName()) + sep32;
|
|
450178
450189
|
});
|
|
450179
450190
|
getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
|
|
450180
450191
|
const nonce = randomBytes20(16).toString("hex");
|
|
450181
|
-
return
|
|
450192
|
+
return join151(getClaudeTempDir(), "bundled-skills", "1.8.0", nonce);
|
|
450182
450193
|
});
|
|
450183
450194
|
getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
|
|
450184
450195
|
});
|
|
@@ -450186,24 +450197,24 @@ var init_filesystem = __esm(() => {
|
|
|
450186
450197
|
// src/utils/task/diskOutput.ts
|
|
450187
450198
|
import { constants as fsConstants6 } from "fs";
|
|
450188
450199
|
import {
|
|
450189
|
-
mkdir as
|
|
450200
|
+
mkdir as mkdir58,
|
|
450190
450201
|
open as open16,
|
|
450191
450202
|
stat as stat50,
|
|
450192
450203
|
symlink as symlink4,
|
|
450193
450204
|
unlink as unlink23
|
|
450194
450205
|
} from "fs/promises";
|
|
450195
|
-
import { join as
|
|
450206
|
+
import { join as join152 } from "path";
|
|
450196
450207
|
function getTaskOutputDir() {
|
|
450197
450208
|
if (_taskOutputDir === undefined) {
|
|
450198
|
-
_taskOutputDir =
|
|
450209
|
+
_taskOutputDir = join152(getProjectTempDir(), getSessionId(), "tasks");
|
|
450199
450210
|
}
|
|
450200
450211
|
return _taskOutputDir;
|
|
450201
450212
|
}
|
|
450202
450213
|
async function ensureOutputDir() {
|
|
450203
|
-
await
|
|
450214
|
+
await mkdir58(getTaskOutputDir(), { recursive: true });
|
|
450204
450215
|
}
|
|
450205
450216
|
function getTaskOutputPath(taskId) {
|
|
450206
|
-
return
|
|
450217
|
+
return join152(getTaskOutputDir(), `${taskId}.output`);
|
|
450207
450218
|
}
|
|
450208
450219
|
function track(p) {
|
|
450209
450220
|
_pendingOps.add(p);
|
|
@@ -454462,14 +454473,14 @@ __export(exports_worktree, {
|
|
|
454462
454473
|
import { spawnSync as spawnSync9 } from "child_process";
|
|
454463
454474
|
import {
|
|
454464
454475
|
copyFile as copyFile10,
|
|
454465
|
-
mkdir as
|
|
454476
|
+
mkdir as mkdir59,
|
|
454466
454477
|
readdir as readdir37,
|
|
454467
454478
|
readFile as readFile66,
|
|
454468
454479
|
stat as stat52,
|
|
454469
454480
|
symlink as symlink5,
|
|
454470
454481
|
utimes as utimes2
|
|
454471
454482
|
} from "fs/promises";
|
|
454472
|
-
import { basename as basename43, dirname as dirname54, join as
|
|
454483
|
+
import { basename as basename43, dirname as dirname54, join as join153 } from "path";
|
|
454473
454484
|
function validateWorktreeSlug(slug) {
|
|
454474
454485
|
if (slug.length > MAX_WORKTREE_SLUG_LENGTH) {
|
|
454475
454486
|
throw new Error(`Invalid worktree name: must be ${MAX_WORKTREE_SLUG_LENGTH} characters or fewer (got ${slug.length})`);
|
|
@@ -454484,7 +454495,7 @@ function validateWorktreeSlug(slug) {
|
|
|
454484
454495
|
}
|
|
454485
454496
|
}
|
|
454486
454497
|
async function mkdirRecursive(dirPath) {
|
|
454487
|
-
await
|
|
454498
|
+
await mkdir59(dirPath, { recursive: true });
|
|
454488
454499
|
}
|
|
454489
454500
|
async function symlinkDirectories(repoRootPath, worktreePath, dirsToSymlink) {
|
|
454490
454501
|
for (const dir of dirsToSymlink) {
|
|
@@ -454492,8 +454503,8 @@ async function symlinkDirectories(repoRootPath, worktreePath, dirsToSymlink) {
|
|
|
454492
454503
|
logForDebugging(`Skipping symlink for "${dir}": path traversal detected`, { level: "warn" });
|
|
454493
454504
|
continue;
|
|
454494
454505
|
}
|
|
454495
|
-
const sourcePath =
|
|
454496
|
-
const destPath =
|
|
454506
|
+
const sourcePath = join153(repoRootPath, dir);
|
|
454507
|
+
const destPath = join153(worktreePath, dir);
|
|
454497
454508
|
try {
|
|
454498
454509
|
await symlink5(sourcePath, destPath, "dir");
|
|
454499
454510
|
logForDebugging(`Symlinked ${dir} from main repository to worktree to avoid disk bloat`);
|
|
@@ -454517,7 +454528,7 @@ function generateTmuxSessionName(repoPath, branch2) {
|
|
|
454517
454528
|
return combined.replace(/[/.]/g, "_");
|
|
454518
454529
|
}
|
|
454519
454530
|
function worktreesDir(repoRoot) {
|
|
454520
|
-
return
|
|
454531
|
+
return join153(repoRoot, ".claude", "worktrees");
|
|
454521
454532
|
}
|
|
454522
454533
|
function flattenSlug(slug) {
|
|
454523
454534
|
return slug.replaceAll("/", "+");
|
|
@@ -454526,7 +454537,7 @@ function worktreeBranchName(slug) {
|
|
|
454526
454537
|
return `worktree-${flattenSlug(slug)}`;
|
|
454527
454538
|
}
|
|
454528
454539
|
function worktreePathFor(repoRoot, slug) {
|
|
454529
|
-
return
|
|
454540
|
+
return join153(worktreesDir(repoRoot), flattenSlug(slug));
|
|
454530
454541
|
}
|
|
454531
454542
|
async function getOrCreateWorktree(repoRoot, slug, options) {
|
|
454532
454543
|
const worktreePath = worktreePathFor(repoRoot, slug);
|
|
@@ -454540,7 +454551,7 @@ async function getOrCreateWorktree(repoRoot, slug, options) {
|
|
|
454540
454551
|
existed: true
|
|
454541
454552
|
};
|
|
454542
454553
|
}
|
|
454543
|
-
await
|
|
454554
|
+
await mkdir59(worktreesDir(repoRoot), { recursive: true });
|
|
454544
454555
|
const fetchEnv = { ...process.env, ...GIT_NO_PROMPT_ENV2 };
|
|
454545
454556
|
let baseBranch;
|
|
454546
454557
|
let baseSha = null;
|
|
@@ -454607,7 +454618,7 @@ async function getOrCreateWorktree(repoRoot, slug, options) {
|
|
|
454607
454618
|
async function copyWorktreeIncludeFiles(repoRoot, worktreePath) {
|
|
454608
454619
|
let includeContent;
|
|
454609
454620
|
try {
|
|
454610
|
-
includeContent = await readFile66(
|
|
454621
|
+
includeContent = await readFile66(join153(repoRoot, ".worktreeinclude"), "utf-8");
|
|
454611
454622
|
} catch {
|
|
454612
454623
|
return [];
|
|
454613
454624
|
}
|
|
@@ -454662,10 +454673,10 @@ async function copyWorktreeIncludeFiles(repoRoot, worktreePath) {
|
|
|
454662
454673
|
}
|
|
454663
454674
|
const copied = [];
|
|
454664
454675
|
for (const relativePath2 of files2) {
|
|
454665
|
-
const srcPath =
|
|
454666
|
-
const destPath =
|
|
454676
|
+
const srcPath = join153(repoRoot, relativePath2);
|
|
454677
|
+
const destPath = join153(worktreePath, relativePath2);
|
|
454667
454678
|
try {
|
|
454668
|
-
await
|
|
454679
|
+
await mkdir59(dirname54(destPath), { recursive: true });
|
|
454669
454680
|
await copyFile10(srcPath, destPath);
|
|
454670
454681
|
copied.push(relativePath2);
|
|
454671
454682
|
} catch (e) {
|
|
@@ -454679,9 +454690,9 @@ async function copyWorktreeIncludeFiles(repoRoot, worktreePath) {
|
|
|
454679
454690
|
}
|
|
454680
454691
|
async function performPostCreationSetup(repoRoot, worktreePath) {
|
|
454681
454692
|
const localSettingsRelativePath = getRelativeSettingsFilePathForSource("localSettings");
|
|
454682
|
-
const sourceSettingsLocal =
|
|
454693
|
+
const sourceSettingsLocal = join153(repoRoot, localSettingsRelativePath);
|
|
454683
454694
|
try {
|
|
454684
|
-
const destSettingsLocal =
|
|
454695
|
+
const destSettingsLocal = join153(worktreePath, localSettingsRelativePath);
|
|
454685
454696
|
await mkdirRecursive(dirname54(destSettingsLocal));
|
|
454686
454697
|
await copyFile10(sourceSettingsLocal, destSettingsLocal);
|
|
454687
454698
|
logForDebugging(`Copied settings.local.json to worktree: ${destSettingsLocal}`);
|
|
@@ -454691,8 +454702,8 @@ async function performPostCreationSetup(repoRoot, worktreePath) {
|
|
|
454691
454702
|
logForDebugging(`Failed to copy settings.local.json: ${e.message}`, { level: "warn" });
|
|
454692
454703
|
}
|
|
454693
454704
|
}
|
|
454694
|
-
const huskyPath =
|
|
454695
|
-
const gitHooksPath =
|
|
454705
|
+
const huskyPath = join153(repoRoot, ".husky");
|
|
454706
|
+
const gitHooksPath = join153(repoRoot, ".git", "hooks");
|
|
454696
454707
|
let hooksPath = null;
|
|
454697
454708
|
for (const candidatePath of [huskyPath, gitHooksPath]) {
|
|
454698
454709
|
try {
|
|
@@ -454967,7 +454978,7 @@ async function cleanupStaleAgentWorktrees(cutoffDate) {
|
|
|
454967
454978
|
if (!EPHEMERAL_WORKTREE_PATTERNS.some((p) => p.test(slug))) {
|
|
454968
454979
|
continue;
|
|
454969
454980
|
}
|
|
454970
|
-
const worktreePath =
|
|
454981
|
+
const worktreePath = join153(dir, slug);
|
|
454971
454982
|
if (currentPath === worktreePath) {
|
|
454972
454983
|
continue;
|
|
454973
454984
|
}
|
|
@@ -457844,9 +457855,9 @@ __export(exports_upstreamproxy, {
|
|
|
457844
457855
|
getUpstreamProxyEnv: () => getUpstreamProxyEnv,
|
|
457845
457856
|
SESSION_TOKEN_PATH: () => SESSION_TOKEN_PATH
|
|
457846
457857
|
});
|
|
457847
|
-
import { mkdir as
|
|
457858
|
+
import { mkdir as mkdir60, readFile as readFile67, unlink as unlink24, writeFile as writeFile60 } from "fs/promises";
|
|
457848
457859
|
import { homedir as homedir36 } from "os";
|
|
457849
|
-
import { join as
|
|
457860
|
+
import { join as join154 } from "path";
|
|
457850
457861
|
async function initUpstreamProxy(opts) {
|
|
457851
457862
|
if (!isEnvTruthy(process.env.CLAUDE_CODE_REMOTE)) {
|
|
457852
457863
|
return state;
|
|
@@ -457867,7 +457878,7 @@ async function initUpstreamProxy(opts) {
|
|
|
457867
457878
|
}
|
|
457868
457879
|
setNonDumpable();
|
|
457869
457880
|
const baseUrl = opts?.ccrBaseUrl ?? process.env.ANTHROPIC_BASE_URL ?? "https://api.anthropic.com";
|
|
457870
|
-
const caBundlePath = opts?.caBundlePath ??
|
|
457881
|
+
const caBundlePath = opts?.caBundlePath ?? join154(homedir36(), ".ccr", "ca-bundle.crt");
|
|
457871
457882
|
const caOk = await downloadCaBundle(baseUrl, opts?.systemCaPath ?? SYSTEM_CA_BUNDLE, caBundlePath);
|
|
457872
457883
|
if (!caOk)
|
|
457873
457884
|
return state;
|
|
@@ -457967,8 +457978,8 @@ async function downloadCaBundle(baseUrl, systemCaPath, outPath) {
|
|
|
457967
457978
|
}
|
|
457968
457979
|
const ccrCa = await resp.text();
|
|
457969
457980
|
const systemCa = await readFile67(systemCaPath, "utf8").catch(() => "");
|
|
457970
|
-
await
|
|
457971
|
-
await
|
|
457981
|
+
await mkdir60(join154(outPath, ".."), { recursive: true });
|
|
457982
|
+
await writeFile60(outPath, systemCa + `
|
|
457972
457983
|
` + ccrCa, "utf8");
|
|
457973
457984
|
return true;
|
|
457974
457985
|
} catch (err2) {
|
|
@@ -459415,7 +459426,7 @@ function buildSystemInitMessage(inputs) {
|
|
|
459415
459426
|
slash_commands: inputs.commands.filter((c5) => c5.userInvocable !== false).map((c5) => c5.name),
|
|
459416
459427
|
apiKeySource: getAnthropicApiKeyWithSource().source,
|
|
459417
459428
|
betas: getSdkBetas(),
|
|
459418
|
-
claude_code_version: "1.
|
|
459429
|
+
claude_code_version: "1.8.0",
|
|
459419
459430
|
output_style: outputStyle2,
|
|
459420
459431
|
agents: inputs.agents.map((agent) => agent.agentType),
|
|
459421
459432
|
skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill) => skill.name),
|
|
@@ -465774,7 +465785,7 @@ var init_ShowInIDEPrompt = __esm(() => {
|
|
|
465774
465785
|
|
|
465775
465786
|
// src/components/permissions/FilePermissionDialog/permissionOptions.tsx
|
|
465776
465787
|
import { homedir as homedir37 } from "os";
|
|
465777
|
-
import { basename as basename47, join as
|
|
465788
|
+
import { basename as basename47, join as join155, sep as sep33 } from "path";
|
|
465778
465789
|
function isInClaudeFolder(filePath) {
|
|
465779
465790
|
const absolutePath = expandPath(filePath);
|
|
465780
465791
|
const claudeFolderPath = expandPath(`${getOriginalCwd()}/.claude`);
|
|
@@ -465784,7 +465795,7 @@ function isInClaudeFolder(filePath) {
|
|
|
465784
465795
|
}
|
|
465785
465796
|
function isInGlobalClaudeFolder(filePath) {
|
|
465786
465797
|
const absolutePath = expandPath(filePath);
|
|
465787
|
-
const globalClaudeFolderPath =
|
|
465798
|
+
const globalClaudeFolderPath = join155(homedir37(), ".claude");
|
|
465788
465799
|
const normalizedAbsolutePath = normalizeCaseForComparison(absolutePath);
|
|
465789
465800
|
const normalizedGlobalClaudeFolderPath = normalizeCaseForComparison(globalClaudeFolderPath);
|
|
465790
465801
|
return normalizedAbsolutePath.startsWith(normalizedGlobalClaudeFolderPath + sep33.toLowerCase()) || normalizedAbsolutePath.startsWith(normalizedGlobalClaudeFolderPath + "/");
|
|
@@ -473572,7 +473583,7 @@ var init_useVoiceEnabled = __esm(() => {
|
|
|
473572
473583
|
function getSemverPart(version2) {
|
|
473573
473584
|
return `${import_semver10.major(version2, { loose: true })}.${import_semver10.minor(version2, { loose: true })}.${import_semver10.patch(version2, { loose: true })}`;
|
|
473574
473585
|
}
|
|
473575
|
-
function useUpdateNotification(updatedVersion, initialVersion = "1.
|
|
473586
|
+
function useUpdateNotification(updatedVersion, initialVersion = "1.8.0") {
|
|
473576
473587
|
const [lastNotifiedSemver, setLastNotifiedSemver] = import_react214.useState(() => getSemverPart(initialVersion));
|
|
473577
473588
|
if (!updatedVersion) {
|
|
473578
473589
|
return null;
|
|
@@ -473612,7 +473623,7 @@ function AutoUpdater({
|
|
|
473612
473623
|
return;
|
|
473613
473624
|
}
|
|
473614
473625
|
if (false) {}
|
|
473615
|
-
const currentVersion = "1.
|
|
473626
|
+
const currentVersion = "1.8.0";
|
|
473616
473627
|
const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
|
|
473617
473628
|
let latestVersion = await getLatestVersion(channel);
|
|
473618
473629
|
const isDisabled = isAutoUpdaterDisabled();
|
|
@@ -473823,12 +473834,12 @@ function NativeAutoUpdater({
|
|
|
473823
473834
|
logEvent("tengu_native_auto_updater_start", {});
|
|
473824
473835
|
try {
|
|
473825
473836
|
const maxVersion = await getMaxVersion();
|
|
473826
|
-
if (maxVersion && gt("1.
|
|
473837
|
+
if (maxVersion && gt("1.8.0", maxVersion)) {
|
|
473827
473838
|
const msg = await getMaxVersionMessage();
|
|
473828
473839
|
setMaxVersionIssue(msg ?? "affects your version");
|
|
473829
473840
|
}
|
|
473830
473841
|
const result = await installLatest(channel);
|
|
473831
|
-
const currentVersion = "1.
|
|
473842
|
+
const currentVersion = "1.8.0";
|
|
473832
473843
|
const latencyMs = Date.now() - startTime;
|
|
473833
473844
|
if (result.lockFailed) {
|
|
473834
473845
|
logEvent("tengu_native_auto_updater_lock_contention", {
|
|
@@ -473963,17 +473974,17 @@ function PackageManagerAutoUpdater(t0) {
|
|
|
473963
473974
|
const maxVersion = await getMaxVersion();
|
|
473964
473975
|
if (maxVersion && latest && gt(latest, maxVersion)) {
|
|
473965
473976
|
logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
|
|
473966
|
-
if (gte("1.
|
|
473967
|
-
logForDebugging(`PackageManagerAutoUpdater: current version ${"1.
|
|
473977
|
+
if (gte("1.8.0", maxVersion)) {
|
|
473978
|
+
logForDebugging(`PackageManagerAutoUpdater: current version ${"1.8.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
|
|
473968
473979
|
setUpdateAvailable(false);
|
|
473969
473980
|
return;
|
|
473970
473981
|
}
|
|
473971
473982
|
latest = maxVersion;
|
|
473972
473983
|
}
|
|
473973
|
-
const hasUpdate = latest && !gte("1.
|
|
473984
|
+
const hasUpdate = latest && !gte("1.8.0", latest) && !shouldSkipVersion(latest);
|
|
473974
473985
|
setUpdateAvailable(!!hasUpdate);
|
|
473975
473986
|
if (hasUpdate) {
|
|
473976
|
-
logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.
|
|
473987
|
+
logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.8.0"} -> ${latest}`);
|
|
473977
473988
|
}
|
|
473978
473989
|
};
|
|
473979
473990
|
$2[0] = t1;
|
|
@@ -474007,7 +474018,7 @@ function PackageManagerAutoUpdater(t0) {
|
|
|
474007
474018
|
wrap: "truncate",
|
|
474008
474019
|
children: [
|
|
474009
474020
|
"currentVersion: ",
|
|
474010
|
-
"1.
|
|
474021
|
+
"1.8.0"
|
|
474011
474022
|
]
|
|
474012
474023
|
}, undefined, true, undefined, this);
|
|
474013
474024
|
$2[3] = verbose;
|
|
@@ -481567,7 +481578,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
|
|
|
481567
481578
|
project_dir: getOriginalCwd(),
|
|
481568
481579
|
added_dirs: addedDirs
|
|
481569
481580
|
},
|
|
481570
|
-
version: "1.
|
|
481581
|
+
version: "1.8.0",
|
|
481571
481582
|
output_style: {
|
|
481572
481583
|
name: outputStyleName
|
|
481573
481584
|
},
|
|
@@ -487651,9 +487662,9 @@ function initSkillImprovement() {
|
|
|
487651
487662
|
async function applySkillImprovement(skillName, updates) {
|
|
487652
487663
|
if (!skillName)
|
|
487653
487664
|
return;
|
|
487654
|
-
const { join:
|
|
487665
|
+
const { join: join156 } = await import("path");
|
|
487655
487666
|
const fs5 = await import("fs/promises");
|
|
487656
|
-
const filePath =
|
|
487667
|
+
const filePath = join156(getCwd(), ".claude", "skills", skillName, "SKILL.md");
|
|
487657
487668
|
let currentContent;
|
|
487658
487669
|
try {
|
|
487659
487670
|
currentContent = await fs5.readFile(filePath, "utf-8");
|
|
@@ -487912,7 +487923,7 @@ var init_cacache = __esm(() => {
|
|
|
487912
487923
|
// src/utils/cleanup.ts
|
|
487913
487924
|
import * as fs5 from "fs/promises";
|
|
487914
487925
|
import { homedir as homedir38 } from "os";
|
|
487915
|
-
import { join as
|
|
487926
|
+
import { join as join156 } from "path";
|
|
487916
487927
|
function getCutoffDate() {
|
|
487917
487928
|
const settings = getSettings_DEPRECATED() || {};
|
|
487918
487929
|
const cleanupPeriodDays = settings.cleanupPeriodDays ?? DEFAULT_CLEANUP_PERIOD_DAYS;
|
|
@@ -487935,9 +487946,9 @@ async function cleanupOldFilesInDirectory(dirPath, cutoffDate, isMessagePath) {
|
|
|
487935
487946
|
const files2 = await getFsImplementation().readdir(dirPath);
|
|
487936
487947
|
for (const file of files2) {
|
|
487937
487948
|
try {
|
|
487938
|
-
const
|
|
487939
|
-
if (
|
|
487940
|
-
await getFsImplementation().unlink(
|
|
487949
|
+
const timestamp4 = convertFileNameToDate(file.name);
|
|
487950
|
+
if (timestamp4 < cutoffDate) {
|
|
487951
|
+
await getFsImplementation().unlink(join156(dirPath, file.name));
|
|
487941
487952
|
if (isMessagePath) {
|
|
487942
487953
|
result.messages++;
|
|
487943
487954
|
} else {
|
|
@@ -487968,7 +487979,7 @@ async function cleanupOldMessageFiles() {
|
|
|
487968
487979
|
} catch {
|
|
487969
487980
|
return result;
|
|
487970
487981
|
}
|
|
487971
|
-
const mcpLogDirs = dirents.filter((dirent) => dirent.isDirectory() && dirent.name.startsWith("mcp-logs-")).map((dirent) =>
|
|
487982
|
+
const mcpLogDirs = dirents.filter((dirent) => dirent.isDirectory() && dirent.name.startsWith("mcp-logs-")).map((dirent) => join156(baseCachePath, dirent.name));
|
|
487972
487983
|
for (const mcpLogDir of mcpLogDirs) {
|
|
487973
487984
|
result = addCleanupResults(result, await cleanupOldFilesInDirectory(mcpLogDir, cutoffDate, true));
|
|
487974
487985
|
await tryRmdir(mcpLogDir, fsImpl);
|
|
@@ -488007,7 +488018,7 @@ async function cleanupOldSessionFiles() {
|
|
|
488007
488018
|
for (const projectDirent of projectDirents) {
|
|
488008
488019
|
if (!projectDirent.isDirectory())
|
|
488009
488020
|
continue;
|
|
488010
|
-
const projectDir =
|
|
488021
|
+
const projectDir = join156(projectsDir, projectDirent.name);
|
|
488011
488022
|
let entries;
|
|
488012
488023
|
try {
|
|
488013
488024
|
entries = await fsImpl.readdir(projectDir);
|
|
@@ -488021,15 +488032,15 @@ async function cleanupOldSessionFiles() {
|
|
|
488021
488032
|
continue;
|
|
488022
488033
|
}
|
|
488023
488034
|
try {
|
|
488024
|
-
if (await unlinkIfOld(
|
|
488035
|
+
if (await unlinkIfOld(join156(projectDir, entry.name), cutoffDate, fsImpl)) {
|
|
488025
488036
|
result.messages++;
|
|
488026
488037
|
}
|
|
488027
488038
|
} catch {
|
|
488028
488039
|
result.errors++;
|
|
488029
488040
|
}
|
|
488030
488041
|
} else if (entry.isDirectory()) {
|
|
488031
|
-
const sessionDir =
|
|
488032
|
-
const toolResultsDir =
|
|
488042
|
+
const sessionDir = join156(projectDir, entry.name);
|
|
488043
|
+
const toolResultsDir = join156(sessionDir, TOOL_RESULTS_SUBDIR);
|
|
488033
488044
|
let toolDirs;
|
|
488034
488045
|
try {
|
|
488035
488046
|
toolDirs = await fsImpl.readdir(toolResultsDir);
|
|
@@ -488040,14 +488051,14 @@ async function cleanupOldSessionFiles() {
|
|
|
488040
488051
|
for (const toolEntry of toolDirs) {
|
|
488041
488052
|
if (toolEntry.isFile()) {
|
|
488042
488053
|
try {
|
|
488043
|
-
if (await unlinkIfOld(
|
|
488054
|
+
if (await unlinkIfOld(join156(toolResultsDir, toolEntry.name), cutoffDate, fsImpl)) {
|
|
488044
488055
|
result.messages++;
|
|
488045
488056
|
}
|
|
488046
488057
|
} catch {
|
|
488047
488058
|
result.errors++;
|
|
488048
488059
|
}
|
|
488049
488060
|
} else if (toolEntry.isDirectory()) {
|
|
488050
|
-
const toolDirPath =
|
|
488061
|
+
const toolDirPath = join156(toolResultsDir, toolEntry.name);
|
|
488051
488062
|
let toolFiles;
|
|
488052
488063
|
try {
|
|
488053
488064
|
toolFiles = await fsImpl.readdir(toolDirPath);
|
|
@@ -488058,7 +488069,7 @@ async function cleanupOldSessionFiles() {
|
|
|
488058
488069
|
if (!tf.isFile())
|
|
488059
488070
|
continue;
|
|
488060
488071
|
try {
|
|
488061
|
-
if (await unlinkIfOld(
|
|
488072
|
+
if (await unlinkIfOld(join156(toolDirPath, tf.name), cutoffDate, fsImpl)) {
|
|
488062
488073
|
result.messages++;
|
|
488063
488074
|
}
|
|
488064
488075
|
} catch {
|
|
@@ -488090,7 +488101,7 @@ async function cleanupSingleDirectory(dirPath, extension2, removeEmptyDir = true
|
|
|
488090
488101
|
if (!dirent.isFile() || !dirent.name.endsWith(extension2))
|
|
488091
488102
|
continue;
|
|
488092
488103
|
try {
|
|
488093
|
-
if (await unlinkIfOld(
|
|
488104
|
+
if (await unlinkIfOld(join156(dirPath, dirent.name), cutoffDate, fsImpl)) {
|
|
488094
488105
|
result.messages++;
|
|
488095
488106
|
}
|
|
488096
488107
|
} catch {
|
|
@@ -488103,7 +488114,7 @@ async function cleanupSingleDirectory(dirPath, extension2, removeEmptyDir = true
|
|
|
488103
488114
|
return result;
|
|
488104
488115
|
}
|
|
488105
488116
|
function cleanupOldPlanFiles() {
|
|
488106
|
-
const plansDir =
|
|
488117
|
+
const plansDir = join156(getClaudeConfigHomeDir(), "plans");
|
|
488107
488118
|
return cleanupSingleDirectory(plansDir, ".md");
|
|
488108
488119
|
}
|
|
488109
488120
|
async function cleanupOldFileHistoryBackups() {
|
|
@@ -488112,14 +488123,14 @@ async function cleanupOldFileHistoryBackups() {
|
|
|
488112
488123
|
const fsImpl = getFsImplementation();
|
|
488113
488124
|
try {
|
|
488114
488125
|
const configDir = getClaudeConfigHomeDir();
|
|
488115
|
-
const fileHistoryStorageDir =
|
|
488126
|
+
const fileHistoryStorageDir = join156(configDir, "file-history");
|
|
488116
488127
|
let dirents;
|
|
488117
488128
|
try {
|
|
488118
488129
|
dirents = await fsImpl.readdir(fileHistoryStorageDir);
|
|
488119
488130
|
} catch {
|
|
488120
488131
|
return result;
|
|
488121
488132
|
}
|
|
488122
|
-
const fileHistorySessionsDirs = dirents.filter((dirent) => dirent.isDirectory()).map((dirent) =>
|
|
488133
|
+
const fileHistorySessionsDirs = dirents.filter((dirent) => dirent.isDirectory()).map((dirent) => join156(fileHistoryStorageDir, dirent.name));
|
|
488123
488134
|
await Promise.all(fileHistorySessionsDirs.map(async (fileHistorySessionDir) => {
|
|
488124
488135
|
try {
|
|
488125
488136
|
const stats2 = await fsImpl.stat(fileHistorySessionDir);
|
|
@@ -488146,14 +488157,14 @@ async function cleanupOldSessionEnvDirs() {
|
|
|
488146
488157
|
const fsImpl = getFsImplementation();
|
|
488147
488158
|
try {
|
|
488148
488159
|
const configDir = getClaudeConfigHomeDir();
|
|
488149
|
-
const sessionEnvBaseDir =
|
|
488160
|
+
const sessionEnvBaseDir = join156(configDir, "session-env");
|
|
488150
488161
|
let dirents;
|
|
488151
488162
|
try {
|
|
488152
488163
|
dirents = await fsImpl.readdir(sessionEnvBaseDir);
|
|
488153
488164
|
} catch {
|
|
488154
488165
|
return result;
|
|
488155
488166
|
}
|
|
488156
|
-
const sessionEnvDirs = dirents.filter((dirent) => dirent.isDirectory()).map((dirent) =>
|
|
488167
|
+
const sessionEnvDirs = dirents.filter((dirent) => dirent.isDirectory()).map((dirent) => join156(sessionEnvBaseDir, dirent.name));
|
|
488157
488168
|
for (const sessionEnvDir of sessionEnvDirs) {
|
|
488158
488169
|
try {
|
|
488159
488170
|
const stats2 = await fsImpl.stat(sessionEnvDir);
|
|
@@ -488175,7 +488186,7 @@ async function cleanupOldDebugLogs() {
|
|
|
488175
488186
|
const cutoffDate = getCutoffDate();
|
|
488176
488187
|
const result = { messages: 0, errors: 0 };
|
|
488177
488188
|
const fsImpl = getFsImplementation();
|
|
488178
|
-
const debugDir =
|
|
488189
|
+
const debugDir = join156(getClaudeConfigHomeDir(), "debug");
|
|
488179
488190
|
let dirents;
|
|
488180
488191
|
try {
|
|
488181
488192
|
dirents = await fsImpl.readdir(debugDir);
|
|
@@ -488187,7 +488198,7 @@ async function cleanupOldDebugLogs() {
|
|
|
488187
488198
|
continue;
|
|
488188
488199
|
}
|
|
488189
488200
|
try {
|
|
488190
|
-
if (await unlinkIfOld(
|
|
488201
|
+
if (await unlinkIfOld(join156(debugDir, dirent.name), cutoffDate, fsImpl)) {
|
|
488191
488202
|
result.messages++;
|
|
488192
488203
|
}
|
|
488193
488204
|
} catch {
|
|
@@ -488197,7 +488208,7 @@ async function cleanupOldDebugLogs() {
|
|
|
488197
488208
|
return result;
|
|
488198
488209
|
}
|
|
488199
488210
|
async function cleanupNpmCacheForAnthropicPackages() {
|
|
488200
|
-
const markerPath =
|
|
488211
|
+
const markerPath = join156(getClaudeConfigHomeDir(), ".npm-cache-cleanup");
|
|
488201
488212
|
try {
|
|
488202
488213
|
const stat54 = await fs5.stat(markerPath);
|
|
488203
488214
|
if (Date.now() - stat54.mtimeMs < ONE_DAY_MS) {
|
|
@@ -488212,7 +488223,7 @@ async function cleanupNpmCacheForAnthropicPackages() {
|
|
|
488212
488223
|
return;
|
|
488213
488224
|
}
|
|
488214
488225
|
logForDebugging("npm cache cleanup: starting");
|
|
488215
|
-
const npmCachePath =
|
|
488226
|
+
const npmCachePath = join156(homedir38(), ".npm", "_cacache");
|
|
488216
488227
|
const NPM_CACHE_RETENTION_COUNT = 5;
|
|
488217
488228
|
const startTime = Date.now();
|
|
488218
488229
|
try {
|
|
@@ -488267,7 +488278,7 @@ async function cleanupNpmCacheForAnthropicPackages() {
|
|
|
488267
488278
|
}
|
|
488268
488279
|
}
|
|
488269
488280
|
async function cleanupOldVersionsThrottled() {
|
|
488270
|
-
const markerPath =
|
|
488281
|
+
const markerPath = join156(getClaudeConfigHomeDir(), ".version-cleanup");
|
|
488271
488282
|
try {
|
|
488272
488283
|
const stat54 = await fs5.stat(markerPath);
|
|
488273
488284
|
if (Date.now() - stat54.mtimeMs < ONE_DAY_MS) {
|
|
@@ -491497,7 +491508,7 @@ __export(exports_asciicast, {
|
|
|
491497
491508
|
_resetRecordingStateForTesting: () => _resetRecordingStateForTesting
|
|
491498
491509
|
});
|
|
491499
491510
|
import { appendFile as appendFile6, rename as rename10 } from "fs/promises";
|
|
491500
|
-
import { basename as basename56, dirname as dirname55, join as
|
|
491511
|
+
import { basename as basename56, dirname as dirname55, join as join158 } from "path";
|
|
491501
491512
|
function getRecordFilePath() {
|
|
491502
491513
|
if (recordingState.filePath !== null) {
|
|
491503
491514
|
return recordingState.filePath;
|
|
@@ -491508,10 +491519,10 @@ function getRecordFilePath() {
|
|
|
491508
491519
|
if (!isEnvTruthy(process.env.CLAUDE_CODE_TERMINAL_RECORDING)) {
|
|
491509
491520
|
return null;
|
|
491510
491521
|
}
|
|
491511
|
-
const projectsDir =
|
|
491512
|
-
const projectDir =
|
|
491522
|
+
const projectsDir = join158(getClaudeConfigHomeDir(), "projects");
|
|
491523
|
+
const projectDir = join158(projectsDir, sanitizePath2(getOriginalCwd()));
|
|
491513
491524
|
recordingState.timestamp = Date.now();
|
|
491514
|
-
recordingState.filePath =
|
|
491525
|
+
recordingState.filePath = join158(projectDir, `${getSessionId()}-${recordingState.timestamp}.cast`);
|
|
491515
491526
|
return recordingState.filePath;
|
|
491516
491527
|
}
|
|
491517
491528
|
function _resetRecordingStateForTesting() {
|
|
@@ -491520,13 +491531,13 @@ function _resetRecordingStateForTesting() {
|
|
|
491520
491531
|
}
|
|
491521
491532
|
function getSessionRecordingPaths() {
|
|
491522
491533
|
const sessionId = getSessionId();
|
|
491523
|
-
const projectsDir =
|
|
491524
|
-
const projectDir =
|
|
491534
|
+
const projectsDir = join158(getClaudeConfigHomeDir(), "projects");
|
|
491535
|
+
const projectDir = join158(projectsDir, sanitizePath2(getOriginalCwd()));
|
|
491525
491536
|
try {
|
|
491526
491537
|
const entries = getFsImplementation().readdirSync(projectDir);
|
|
491527
491538
|
const names = typeof entries[0] === "string" ? entries : entries.map((e) => e.name);
|
|
491528
491539
|
const files2 = names.filter((f) => f.startsWith(sessionId) && f.endsWith(".cast")).sort();
|
|
491529
|
-
return files2.map((f) =>
|
|
491540
|
+
return files2.map((f) => join158(projectDir, f));
|
|
491530
491541
|
} catch {
|
|
491531
491542
|
return [];
|
|
491532
491543
|
}
|
|
@@ -491536,9 +491547,9 @@ async function renameRecordingForSession() {
|
|
|
491536
491547
|
if (!oldPath || recordingState.timestamp === 0) {
|
|
491537
491548
|
return;
|
|
491538
491549
|
}
|
|
491539
|
-
const projectsDir =
|
|
491540
|
-
const projectDir =
|
|
491541
|
-
const newPath =
|
|
491550
|
+
const projectsDir = join158(getClaudeConfigHomeDir(), "projects");
|
|
491551
|
+
const projectDir = join158(projectsDir, sanitizePath2(getOriginalCwd()));
|
|
491552
|
+
const newPath = join158(projectDir, `${getSessionId()}-${recordingState.timestamp}.cast`);
|
|
491542
491553
|
if (oldPath === newPath) {
|
|
491543
491554
|
return;
|
|
491544
491555
|
}
|
|
@@ -493139,7 +493150,7 @@ async function submitTranscriptShare(messages, trigger, appearanceId) {
|
|
|
493139
493150
|
} catch {}
|
|
493140
493151
|
const data = {
|
|
493141
493152
|
trigger,
|
|
493142
|
-
version: "1.
|
|
493153
|
+
version: "1.8.0",
|
|
493143
493154
|
platform: process.platform,
|
|
493144
493155
|
transcript,
|
|
493145
493156
|
subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
|
|
@@ -493294,21 +493305,21 @@ function useFeedbackSurvey(messages, isLoading, submitCount, surveyType = "sessi
|
|
|
493294
493305
|
messagesRef.current = messages;
|
|
493295
493306
|
const probabilityPassedRef = import_react280.useRef(false);
|
|
493296
493307
|
const lastEligibleSubmitCountRef = import_react280.useRef(null);
|
|
493297
|
-
const updateLastShownTime = import_react280.useCallback((
|
|
493308
|
+
const updateLastShownTime = import_react280.useCallback((timestamp4, submitCountValue) => {
|
|
493298
493309
|
setFeedbackSurvey((prev) => {
|
|
493299
|
-
if (prev.timeLastShown ===
|
|
493310
|
+
if (prev.timeLastShown === timestamp4 && prev.submitCountAtLastAppearance === submitCountValue) {
|
|
493300
493311
|
return prev;
|
|
493301
493312
|
}
|
|
493302
493313
|
return {
|
|
493303
|
-
timeLastShown:
|
|
493314
|
+
timeLastShown: timestamp4,
|
|
493304
493315
|
submitCountAtLastAppearance: submitCountValue
|
|
493305
493316
|
};
|
|
493306
493317
|
});
|
|
493307
|
-
if (getGlobalConfig().feedbackSurveyState?.lastShownTime !==
|
|
493318
|
+
if (getGlobalConfig().feedbackSurveyState?.lastShownTime !== timestamp4) {
|
|
493308
493319
|
saveGlobalConfig((current) => ({
|
|
493309
493320
|
...current,
|
|
493310
493321
|
feedbackSurveyState: {
|
|
493311
|
-
lastShownTime:
|
|
493322
|
+
lastShownTime: timestamp4
|
|
493312
493323
|
}
|
|
493313
493324
|
}));
|
|
493314
493325
|
}
|
|
@@ -494351,7 +494362,7 @@ var init_useAwaySummary = __esm(() => {
|
|
|
494351
494362
|
});
|
|
494352
494363
|
|
|
494353
494364
|
// src/utils/plugins/officialMarketplaceStartupCheck.ts
|
|
494354
|
-
import { join as
|
|
494365
|
+
import { join as join159 } from "path";
|
|
494355
494366
|
function isOfficialMarketplaceAutoInstallDisabled() {
|
|
494356
494367
|
return isEnvTruthy(process.env.CLAUDE_CODE_DISABLE_OFFICIAL_MARKETPLACE_AUTOINSTALL);
|
|
494357
494368
|
}
|
|
@@ -494434,7 +494445,7 @@ async function checkAndInstallOfficialMarketplace() {
|
|
|
494434
494445
|
return { installed: false, skipped: true, reason: "policy_blocked" };
|
|
494435
494446
|
}
|
|
494436
494447
|
const cacheDir = getMarketplacesCacheDir();
|
|
494437
|
-
const installLocation =
|
|
494448
|
+
const installLocation = join159(cacheDir, OFFICIAL_MARKETPLACE_NAME);
|
|
494438
494449
|
const gcsSha = await fetchOfficialMarketplaceFromGcs(installLocation, cacheDir);
|
|
494439
494450
|
if (gcsSha !== null) {
|
|
494440
494451
|
const known = await loadKnownMarketplacesConfig();
|
|
@@ -494690,7 +494701,7 @@ var init_tipHistory = __esm(() => {
|
|
|
494690
494701
|
|
|
494691
494702
|
// src/utils/desktopDeepLink.ts
|
|
494692
494703
|
import { readdir as readdir38 } from "fs/promises";
|
|
494693
|
-
import { join as
|
|
494704
|
+
import { join as join160 } from "path";
|
|
494694
494705
|
function isDevMode() {
|
|
494695
494706
|
if (true) {
|
|
494696
494707
|
return true;
|
|
@@ -494753,7 +494764,7 @@ async function getDesktopVersion() {
|
|
|
494753
494764
|
if (!localAppData) {
|
|
494754
494765
|
return null;
|
|
494755
494766
|
}
|
|
494756
|
-
const installDir =
|
|
494767
|
+
const installDir = join160(localAppData, "AnthropicClaude");
|
|
494757
494768
|
try {
|
|
494758
494769
|
const entries = await readdir38(installDir);
|
|
494759
494770
|
const versions = entries.filter((e) => e.startsWith("app-")).map((e) => e.slice(4)).filter((v2) => import_semver14.coerce(v2) !== null).sort((a, b3) => {
|
|
@@ -497785,7 +497796,7 @@ var init_usePluginRecommendationBase = __esm(() => {
|
|
|
497785
497796
|
});
|
|
497786
497797
|
|
|
497787
497798
|
// src/hooks/useLspPluginRecommendation.tsx
|
|
497788
|
-
import { extname as extname16, join as
|
|
497799
|
+
import { extname as extname16, join as join161 } from "path";
|
|
497789
497800
|
function useLspPluginRecommendation() {
|
|
497790
497801
|
const $2 = c3(12);
|
|
497791
497802
|
const trackedFiles = useAppState(_temp204);
|
|
@@ -497870,7 +497881,7 @@ function useLspPluginRecommendation() {
|
|
|
497870
497881
|
case "yes": {
|
|
497871
497882
|
installPluginAndNotify(pluginId, pluginName, "lsp-plugin", addNotification, async (pluginData) => {
|
|
497872
497883
|
logForDebugging(`[useLspPluginRecommendation] Installing plugin: ${pluginId}`);
|
|
497873
|
-
const localSourcePath = typeof pluginData.entry.source === "string" ?
|
|
497884
|
+
const localSourcePath = typeof pluginData.entry.source === "string" ? join161(pluginData.marketplaceInstallLocation, pluginData.entry.source) : undefined;
|
|
497874
497885
|
await cacheAndRegisterPlugin(pluginId, pluginData.entry, "user", undefined, localSourcePath);
|
|
497875
497886
|
const settings = getSettingsForSource("userSettings");
|
|
497876
497887
|
updateSettingsForSource("userSettings", {
|
|
@@ -500702,9 +500713,9 @@ var exports_REPL = {};
|
|
|
500702
500713
|
__export(exports_REPL, {
|
|
500703
500714
|
REPL: () => REPL
|
|
500704
500715
|
});
|
|
500705
|
-
import { dirname as dirname57, join as
|
|
500716
|
+
import { dirname as dirname57, join as join162 } from "path";
|
|
500706
500717
|
import { tmpdir as tmpdir11 } from "os";
|
|
500707
|
-
import { writeFile as
|
|
500718
|
+
import { writeFile as writeFile62 } from "fs/promises";
|
|
500708
500719
|
import { randomUUID as randomUUID46 } from "crypto";
|
|
500709
500720
|
function TranscriptModeFooter(t0) {
|
|
500710
500721
|
const $2 = c3(9);
|
|
@@ -503272,8 +503283,8 @@ Note: ctrl + z now suspends localclawd, ctrl + _ undoes input.
|
|
|
503272
503283
|
const w2 = Math.max(80, (process.stdout.columns ?? 80) - 6);
|
|
503273
503284
|
const raw = await renderMessagesToPlainText(deferredMessages, tools, w2);
|
|
503274
503285
|
const text = raw.replace(/[ \t]+$/gm, "");
|
|
503275
|
-
const path17 =
|
|
503276
|
-
await
|
|
503286
|
+
const path17 = join162(tmpdir11(), `cc-transcript-${Date.now()}.txt`);
|
|
503287
|
+
await writeFile62(path17, text);
|
|
503277
503288
|
const opened = openFileInExternalEditor(path17);
|
|
503278
503289
|
setStatus(opened ? `opening ${path17}` : `wrote ${path17} · no $VISUAL/$EDITOR set`);
|
|
503279
503290
|
} catch (e) {
|
|
@@ -507109,7 +507120,7 @@ var init_debug2 = __esm(() => {
|
|
|
507109
507120
|
// src/skills/bundled/imagePipeline.ts
|
|
507110
507121
|
function registerImagePipelineSkill() {
|
|
507111
507122
|
registerBundledSkill({
|
|
507112
|
-
name: "image-
|
|
507123
|
+
name: "local-image-gen",
|
|
507113
507124
|
description: "Set up and operate a project-local image generation and review pipeline for game textures, sprites, and other art assets.",
|
|
507114
507125
|
whenToUse: "Use when the user wants local texture generation, sprite/image iteration, project-local asset prompts, or visual review of generated game art.",
|
|
507115
507126
|
argumentHint: "[setup request or asset brief]",
|
|
@@ -509999,12 +510010,12 @@ var init_createDirectConnectSession = __esm(() => {
|
|
|
509999
510010
|
});
|
|
510000
510011
|
|
|
510001
510012
|
// src/utils/errorLogSink.ts
|
|
510002
|
-
import { dirname as dirname59, join as
|
|
510013
|
+
import { dirname as dirname59, join as join163 } from "path";
|
|
510003
510014
|
function getErrorsPath() {
|
|
510004
|
-
return
|
|
510015
|
+
return join163(CACHE_PATHS.errors(), DATE + ".jsonl");
|
|
510005
510016
|
}
|
|
510006
510017
|
function getMCPLogsPath(serverName) {
|
|
510007
|
-
return
|
|
510018
|
+
return join163(CACHE_PATHS.mcpLogs(serverName), DATE + ".jsonl");
|
|
510008
510019
|
}
|
|
510009
510020
|
function createJsonlWriter(options) {
|
|
510010
510021
|
const writer = createBufferedWriter(options);
|
|
@@ -510048,7 +510059,7 @@ function appendToLog(path17, message) {
|
|
|
510048
510059
|
cwd: getFsImplementation().cwd(),
|
|
510049
510060
|
userType: process.env.USER_TYPE,
|
|
510050
510061
|
sessionId: getSessionId(),
|
|
510051
|
-
version: "1.
|
|
510062
|
+
version: "1.8.0"
|
|
510052
510063
|
};
|
|
510053
510064
|
getLogWriter(path17).write(messageWithTimestamp);
|
|
510054
510065
|
}
|
|
@@ -510147,7 +510158,7 @@ var init_sinks = __esm(() => {
|
|
|
510147
510158
|
});
|
|
510148
510159
|
|
|
510149
510160
|
// src/services/SessionMemory/sessionMemory.ts
|
|
510150
|
-
import { writeFile as
|
|
510161
|
+
import { writeFile as writeFile63 } from "fs/promises";
|
|
510151
510162
|
function isSessionMemoryGateEnabled() {
|
|
510152
510163
|
if (isEnvTruthy(process.env.ENABLE_CLAUDE_CODE_SESSION_MEMORY)) {
|
|
510153
510164
|
return true;
|
|
@@ -510210,13 +510221,13 @@ async function setupSessionMemoryFile(toolUseContext) {
|
|
|
510210
510221
|
await fs6.mkdir(sessionMemoryDir, { mode: 448 });
|
|
510211
510222
|
const memoryPath = getSessionMemoryPath();
|
|
510212
510223
|
try {
|
|
510213
|
-
await
|
|
510224
|
+
await writeFile63(memoryPath, "", {
|
|
510214
510225
|
encoding: "utf-8",
|
|
510215
510226
|
mode: 384,
|
|
510216
510227
|
flag: "wx"
|
|
510217
510228
|
});
|
|
510218
510229
|
const template = await loadSessionMemoryTemplate();
|
|
510219
|
-
await
|
|
510230
|
+
await writeFile63(memoryPath, template, {
|
|
510220
510231
|
encoding: "utf-8",
|
|
510221
510232
|
mode: 384
|
|
510222
510233
|
});
|
|
@@ -510354,7 +510365,7 @@ var init_sessionMemory = __esm(() => {
|
|
|
510354
510365
|
// src/utils/iTermBackup.ts
|
|
510355
510366
|
import { copyFile as copyFile11, stat as stat56 } from "fs/promises";
|
|
510356
510367
|
import { homedir as homedir40 } from "os";
|
|
510357
|
-
import { join as
|
|
510368
|
+
import { join as join164 } from "path";
|
|
510358
510369
|
function markITerm2SetupComplete() {
|
|
510359
510370
|
saveGlobalConfig((current) => ({
|
|
510360
510371
|
...current,
|
|
@@ -510369,7 +510380,7 @@ function getIterm2RecoveryInfo() {
|
|
|
510369
510380
|
};
|
|
510370
510381
|
}
|
|
510371
510382
|
function getITerm2PlistPath() {
|
|
510372
|
-
return
|
|
510383
|
+
return join164(homedir40(), "Library", "Preferences", "com.googlecode.iterm2.plist");
|
|
510373
510384
|
}
|
|
510374
510385
|
async function checkAndRestoreITerm2Backup() {
|
|
510375
510386
|
const { inProgress, backupPath } = getIterm2RecoveryInfo();
|
|
@@ -513765,8 +513776,8 @@ var init_idleTimeout = __esm(() => {
|
|
|
513765
513776
|
|
|
513766
513777
|
// src/bridge/inboundAttachments.ts
|
|
513767
513778
|
import { randomUUID as randomUUID49 } from "crypto";
|
|
513768
|
-
import { mkdir as
|
|
513769
|
-
import { basename as basename57, join as
|
|
513779
|
+
import { mkdir as mkdir61, writeFile as writeFile64 } from "fs/promises";
|
|
513780
|
+
import { basename as basename57, join as join165 } from "path";
|
|
513770
513781
|
import { z as z95 } from "zod/v4";
|
|
513771
513782
|
function debug3(msg) {
|
|
513772
513783
|
logForDebugging(`[bridge:inbound-attach] ${msg}`);
|
|
@@ -513783,7 +513794,7 @@ function sanitizeFileName(name) {
|
|
|
513783
513794
|
return base || "attachment";
|
|
513784
513795
|
}
|
|
513785
513796
|
function uploadsDir() {
|
|
513786
|
-
return
|
|
513797
|
+
return join165(getClaudeConfigHomeDir(), "uploads", getSessionId());
|
|
513787
513798
|
}
|
|
513788
513799
|
async function resolveOne(att) {
|
|
513789
513800
|
const token = getBridgeAccessToken();
|
|
@@ -513812,10 +513823,10 @@ async function resolveOne(att) {
|
|
|
513812
513823
|
const safeName = sanitizeFileName(att.file_name);
|
|
513813
513824
|
const prefix = (att.file_uuid.slice(0, 8) || randomUUID49().slice(0, 8)).replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
513814
513825
|
const dir = uploadsDir();
|
|
513815
|
-
const outPath =
|
|
513826
|
+
const outPath = join165(dir, `${prefix}-${safeName}`);
|
|
513816
513827
|
try {
|
|
513817
|
-
await
|
|
513818
|
-
await
|
|
513828
|
+
await mkdir61(dir, { recursive: true });
|
|
513829
|
+
await writeFile64(outPath, data);
|
|
513819
513830
|
} catch (e) {
|
|
513820
513831
|
debug3(`write ${outPath} failed: ${e}`);
|
|
513821
513832
|
return;
|
|
@@ -513911,7 +513922,7 @@ var init_sessionUrl = __esm(() => {
|
|
|
513911
513922
|
|
|
513912
513923
|
// src/utils/plugins/zipCacheAdapters.ts
|
|
513913
513924
|
import { readFile as readFile69 } from "fs/promises";
|
|
513914
|
-
import { join as
|
|
513925
|
+
import { join as join166 } from "path";
|
|
513915
513926
|
async function readZipCacheKnownMarketplaces() {
|
|
513916
513927
|
try {
|
|
513917
513928
|
const content = await readFile69(getZipCacheKnownMarketplacesPath(), "utf-8");
|
|
@@ -513936,13 +513947,13 @@ async function saveMarketplaceJsonToZipCache(marketplaceName, installLocation) {
|
|
|
513936
513947
|
const content = await readMarketplaceJsonContent(installLocation);
|
|
513937
513948
|
if (content !== null) {
|
|
513938
513949
|
const relPath = getMarketplaceJsonRelativePath(marketplaceName);
|
|
513939
|
-
await atomicWriteToZipCache(
|
|
513950
|
+
await atomicWriteToZipCache(join166(zipCachePath, relPath), content);
|
|
513940
513951
|
}
|
|
513941
513952
|
}
|
|
513942
513953
|
async function readMarketplaceJsonContent(dir) {
|
|
513943
513954
|
const candidates = [
|
|
513944
|
-
|
|
513945
|
-
|
|
513955
|
+
join166(dir, ".claude-plugin", "marketplace.json"),
|
|
513956
|
+
join166(dir, "marketplace.json"),
|
|
513946
513957
|
dir
|
|
513947
513958
|
];
|
|
513948
513959
|
for (const candidate of candidates) {
|
|
@@ -514072,8 +514083,8 @@ async function getEnvLessBridgeConfig() {
|
|
|
514072
514083
|
}
|
|
514073
514084
|
async function checkEnvLessBridgeMinVersion() {
|
|
514074
514085
|
const cfg = await getEnvLessBridgeConfig();
|
|
514075
|
-
if (cfg.min_version && lt("1.
|
|
514076
|
-
return `Your version of localclawd (${"1.
|
|
514086
|
+
if (cfg.min_version && lt("1.8.0", cfg.min_version)) {
|
|
514087
|
+
return `Your version of localclawd (${"1.8.0"}) is too old for Remote Control.
|
|
514077
514088
|
Version ${cfg.min_version} or higher is required. Run \`localclawd update\` to update.`;
|
|
514078
514089
|
}
|
|
514079
514090
|
return null;
|
|
@@ -514398,17 +514409,17 @@ __export(exports_bridgePointer, {
|
|
|
514398
514409
|
clearBridgePointer: () => clearBridgePointer,
|
|
514399
514410
|
BRIDGE_POINTER_TTL_MS: () => BRIDGE_POINTER_TTL_MS
|
|
514400
514411
|
});
|
|
514401
|
-
import { mkdir as
|
|
514402
|
-
import { dirname as dirname60, join as
|
|
514412
|
+
import { mkdir as mkdir62, readFile as readFile70, stat as stat57, unlink as unlink25, writeFile as writeFile65 } from "fs/promises";
|
|
514413
|
+
import { dirname as dirname60, join as join167 } from "path";
|
|
514403
514414
|
import { z as z97 } from "zod/v4";
|
|
514404
514415
|
function getBridgePointerPath(dir) {
|
|
514405
|
-
return
|
|
514416
|
+
return join167(getProjectsDir(), sanitizePath2(dir), "bridge-pointer.json");
|
|
514406
514417
|
}
|
|
514407
514418
|
async function writeBridgePointer(dir, pointer) {
|
|
514408
514419
|
const path17 = getBridgePointerPath(dir);
|
|
514409
514420
|
try {
|
|
514410
|
-
await
|
|
514411
|
-
await
|
|
514421
|
+
await mkdir62(dirname60(path17), { recursive: true });
|
|
514422
|
+
await writeFile65(path17, jsonStringify(pointer), "utf8");
|
|
514412
514423
|
logForDebugging(`[bridge:pointer] wrote ${path17}`);
|
|
514413
514424
|
} catch (err2) {
|
|
514414
514425
|
logForDebugging(`[bridge:pointer] write failed: ${err2}`, { level: "warn" });
|
|
@@ -514545,7 +514556,7 @@ async function initBridgeCore(params) {
|
|
|
514545
514556
|
const rawApi = createBridgeApiClient({
|
|
514546
514557
|
baseUrl,
|
|
514547
514558
|
getAccessToken,
|
|
514548
|
-
runnerVersion: "1.
|
|
514559
|
+
runnerVersion: "1.8.0",
|
|
514549
514560
|
onDebug: logForDebugging,
|
|
514550
514561
|
onAuth401,
|
|
514551
514562
|
getTrustedDeviceToken
|
|
@@ -520264,7 +520275,7 @@ async function startMCPServer(cwd3, debug4, verbose) {
|
|
|
520264
520275
|
setCwd(cwd3);
|
|
520265
520276
|
const server = new Server({
|
|
520266
520277
|
name: "claude/tengu",
|
|
520267
|
-
version: "1.
|
|
520278
|
+
version: "1.8.0"
|
|
520268
520279
|
}, {
|
|
520269
520280
|
capabilities: {
|
|
520270
520281
|
tools: {}
|
|
@@ -520396,14 +520407,14 @@ __export(exports_appDesktop, {
|
|
|
520396
520407
|
});
|
|
520397
520408
|
import { readdir as readdir39, readFile as readFile72, stat as stat59 } from "fs/promises";
|
|
520398
520409
|
import { homedir as homedir41 } from "os";
|
|
520399
|
-
import { join as
|
|
520410
|
+
import { join as join168 } from "path";
|
|
520400
520411
|
async function getClaudeDesktopConfigPath() {
|
|
520401
520412
|
const platform3 = getPlatform();
|
|
520402
520413
|
if (!SUPPORTED_PLATFORMS.includes(platform3)) {
|
|
520403
520414
|
throw new Error(`Unsupported platform: ${platform3} - desktop app integration only works on macOS and WSL.`);
|
|
520404
520415
|
}
|
|
520405
520416
|
if (platform3 === "macos") {
|
|
520406
|
-
return
|
|
520417
|
+
return join168(homedir41(), "Library", "Application Support", "Claude", "claude_desktop_config.json");
|
|
520407
520418
|
}
|
|
520408
520419
|
const windowsHome = process.env.USERPROFILE ? process.env.USERPROFILE.replace(/\\/g, "/") : null;
|
|
520409
520420
|
if (windowsHome) {
|
|
@@ -520422,7 +520433,7 @@ async function getClaudeDesktopConfigPath() {
|
|
|
520422
520433
|
if (user.name === "Public" || user.name === "Default" || user.name === "Default User" || user.name === "All Users") {
|
|
520423
520434
|
continue;
|
|
520424
520435
|
}
|
|
520425
|
-
const potentialConfigPath =
|
|
520436
|
+
const potentialConfigPath = join168(usersDir, user.name, "AppData", "Roaming", "Claude", "claude_desktop_config.json");
|
|
520426
520437
|
try {
|
|
520427
520438
|
await stat59(potentialConfigPath);
|
|
520428
520439
|
return potentialConfigPath;
|
|
@@ -521345,7 +521356,7 @@ function WelcomeLogo() {
|
|
|
521345
521356
|
dimColor: true,
|
|
521346
521357
|
children: [
|
|
521347
521358
|
"v",
|
|
521348
|
-
"1.
|
|
521359
|
+
"1.8.0"
|
|
521349
521360
|
]
|
|
521350
521361
|
}, undefined, true, undefined, this)
|
|
521351
521362
|
]
|
|
@@ -521536,7 +521547,7 @@ __export(exports_update, {
|
|
|
521536
521547
|
});
|
|
521537
521548
|
async function update() {
|
|
521538
521549
|
logEvent("tengu_update_check", {});
|
|
521539
|
-
writeToStdout(`Current version: ${"1.
|
|
521550
|
+
writeToStdout(`Current version: ${"1.8.0"}
|
|
521540
521551
|
`);
|
|
521541
521552
|
const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
|
|
521542
521553
|
writeToStdout(`Checking for updates to ${channel} version...
|
|
@@ -521611,8 +521622,8 @@ async function update() {
|
|
|
521611
521622
|
writeToStdout(`localclawd is managed by Homebrew.
|
|
521612
521623
|
`);
|
|
521613
521624
|
const latest = await getLatestVersion(channel);
|
|
521614
|
-
if (latest && !gte("1.
|
|
521615
|
-
writeToStdout(`Update available: ${"1.
|
|
521625
|
+
if (latest && !gte("1.8.0", latest)) {
|
|
521626
|
+
writeToStdout(`Update available: ${"1.8.0"} → ${latest}
|
|
521616
521627
|
`);
|
|
521617
521628
|
writeToStdout(`
|
|
521618
521629
|
`);
|
|
@@ -521628,8 +521639,8 @@ async function update() {
|
|
|
521628
521639
|
writeToStdout(`localclawd is managed by winget.
|
|
521629
521640
|
`);
|
|
521630
521641
|
const latest = await getLatestVersion(channel);
|
|
521631
|
-
if (latest && !gte("1.
|
|
521632
|
-
writeToStdout(`Update available: ${"1.
|
|
521642
|
+
if (latest && !gte("1.8.0", latest)) {
|
|
521643
|
+
writeToStdout(`Update available: ${"1.8.0"} → ${latest}
|
|
521633
521644
|
`);
|
|
521634
521645
|
writeToStdout(`
|
|
521635
521646
|
`);
|
|
@@ -521643,8 +521654,8 @@ async function update() {
|
|
|
521643
521654
|
writeToStdout(`localclawd is managed by apk.
|
|
521644
521655
|
`);
|
|
521645
521656
|
const latest = await getLatestVersion(channel);
|
|
521646
|
-
if (latest && !gte("1.
|
|
521647
|
-
writeToStdout(`Update available: ${"1.
|
|
521657
|
+
if (latest && !gte("1.8.0", latest)) {
|
|
521658
|
+
writeToStdout(`Update available: ${"1.8.0"} → ${latest}
|
|
521648
521659
|
`);
|
|
521649
521660
|
writeToStdout(`
|
|
521650
521661
|
`);
|
|
@@ -521709,11 +521720,11 @@ async function update() {
|
|
|
521709
521720
|
`);
|
|
521710
521721
|
await gracefulShutdown(1);
|
|
521711
521722
|
}
|
|
521712
|
-
if (result.latestVersion === "1.
|
|
521713
|
-
writeToStdout(source_default.green(`localclawd is up to date (${"1.
|
|
521723
|
+
if (result.latestVersion === "1.8.0") {
|
|
521724
|
+
writeToStdout(source_default.green(`localclawd is up to date (${"1.8.0"})`) + `
|
|
521714
521725
|
`);
|
|
521715
521726
|
} else {
|
|
521716
|
-
writeToStdout(source_default.green(`Successfully updated from ${"1.
|
|
521727
|
+
writeToStdout(source_default.green(`Successfully updated from ${"1.8.0"} to version ${result.latestVersion}`) + `
|
|
521717
521728
|
`);
|
|
521718
521729
|
await regenerateCompletionCache();
|
|
521719
521730
|
}
|
|
@@ -521773,12 +521784,12 @@ async function update() {
|
|
|
521773
521784
|
`);
|
|
521774
521785
|
await gracefulShutdown(1);
|
|
521775
521786
|
}
|
|
521776
|
-
if (latestVersion === "1.
|
|
521777
|
-
writeToStdout(source_default.green(`localclawd is up to date (${"1.
|
|
521787
|
+
if (latestVersion === "1.8.0") {
|
|
521788
|
+
writeToStdout(source_default.green(`localclawd is up to date (${"1.8.0"})`) + `
|
|
521778
521789
|
`);
|
|
521779
521790
|
await gracefulShutdown(0);
|
|
521780
521791
|
}
|
|
521781
|
-
writeToStdout(`New version available: ${latestVersion} (current: ${"1.
|
|
521792
|
+
writeToStdout(`New version available: ${latestVersion} (current: ${"1.8.0"})
|
|
521782
521793
|
`);
|
|
521783
521794
|
writeToStdout(`Installing update...
|
|
521784
521795
|
`);
|
|
@@ -521823,7 +521834,7 @@ async function update() {
|
|
|
521823
521834
|
logForDebugging(`update: Installation status: ${status2}`);
|
|
521824
521835
|
switch (status2) {
|
|
521825
521836
|
case "success":
|
|
521826
|
-
writeToStdout(source_default.green(`Successfully updated from ${"1.
|
|
521837
|
+
writeToStdout(source_default.green(`Successfully updated from ${"1.8.0"} to version ${latestVersion}`) + `
|
|
521827
521838
|
`);
|
|
521828
521839
|
await regenerateCompletionCache();
|
|
521829
521840
|
break;
|
|
@@ -523065,7 +523076,7 @@ Run with --debug for more details.
|
|
|
523065
523076
|
}
|
|
523066
523077
|
}
|
|
523067
523078
|
logForDiagnosticsNoPII("info", "started", {
|
|
523068
|
-
version: "1.
|
|
523079
|
+
version: "1.8.0",
|
|
523069
523080
|
is_native_binary: isInBundledMode()
|
|
523070
523081
|
});
|
|
523071
523082
|
registerCleanup(async () => {
|
|
@@ -523849,7 +523860,7 @@ Usage: localclawd --remote "your task description"`, () => gracefulShutdown(1));
|
|
|
523849
523860
|
pendingHookMessages
|
|
523850
523861
|
}, renderAndRun);
|
|
523851
523862
|
}
|
|
523852
|
-
}).version("1.
|
|
523863
|
+
}).version("1.8.0 (localclawd)", "-v, --version", "Output the version number");
|
|
523853
523864
|
program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
|
|
523854
523865
|
program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
|
|
523855
523866
|
if (canUserConfigureAdvisor()) {
|
|
@@ -524363,7 +524374,7 @@ if (false) {}
|
|
|
524363
524374
|
async function main2() {
|
|
524364
524375
|
const args = process.argv.slice(2);
|
|
524365
524376
|
if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
|
|
524366
|
-
console.log(`${"1.
|
|
524377
|
+
console.log(`${"1.8.0"} (localclawd)`);
|
|
524367
524378
|
return;
|
|
524368
524379
|
}
|
|
524369
524380
|
const {
|
|
@@ -524446,4 +524457,4 @@ localclawd crashed: ${msg}
|
|
|
524446
524457
|
process.exit(1);
|
|
524447
524458
|
});
|
|
524448
524459
|
|
|
524449
|
-
//# debugId=
|
|
524460
|
+
//# debugId=83EC49A6660FF49E64756E2164756E21
|