@llmtune/cli 0.1.9 → 0.2.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/README.md +206 -181
- package/dist/agent/conversation.d.ts.map +1 -0
- package/dist/agent/conversation.js.map +1 -0
- package/dist/agent/loop.d.ts.map +1 -0
- package/dist/agent/loop.js +27 -10
- package/dist/agent/loop.js.map +1 -0
- package/dist/agent/planner.d.ts.map +1 -0
- package/dist/agent/planner.js.map +1 -0
- package/dist/auth/client.d.ts.map +1 -0
- package/dist/auth/client.js.map +1 -0
- package/dist/auth/config.d.ts.map +1 -0
- package/dist/auth/config.js.map +1 -0
- package/dist/commands/balance.d.ts.map +1 -0
- package/dist/commands/balance.js.map +1 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/marketplace.d.ts.map +1 -0
- package/dist/commands/marketplace.js.map +1 -0
- package/dist/commands/models.d.ts.map +1 -0
- package/dist/commands/models.js.map +1 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/compact/auto-compact.d.ts.map +1 -0
- package/dist/compact/auto-compact.js.map +1 -0
- package/dist/compact/budget.d.ts.map +1 -0
- package/dist/compact/budget.js +18 -0
- package/dist/compact/budget.js.map +1 -0
- package/dist/compact/history-store.d.ts.map +1 -0
- package/dist/compact/history-store.js.map +1 -0
- package/dist/compact/microcompact.d.ts.map +1 -0
- package/dist/compact/microcompact.js.map +1 -0
- package/dist/compact/service.d.ts.map +1 -0
- package/dist/compact/service.js.map +1 -0
- package/dist/context/agent-identity.d.ts.map +1 -0
- package/dist/context/agent-identity.js +19 -0
- package/dist/context/agent-identity.js.map +1 -0
- package/dist/context/analyzer.d.ts.map +1 -0
- package/dist/context/analyzer.js.map +1 -0
- package/dist/context/builder.d.ts.map +1 -0
- package/dist/context/builder.js +7 -0
- package/dist/context/builder.js.map +1 -0
- package/dist/context/cache.d.ts.map +1 -0
- package/dist/context/cache.js.map +1 -0
- package/dist/context/git-context.d.ts.map +1 -0
- package/dist/context/git-context.js.map +1 -0
- package/dist/context/llmtune-md.d.ts.map +1 -0
- package/dist/context/llmtune-md.js.map +1 -0
- package/dist/context/project-detect.d.ts +26 -0
- package/dist/context/project-detect.d.ts.map +1 -0
- package/dist/context/project-detect.js +213 -0
- package/dist/context/project-detect.js.map +1 -0
- package/dist/context/workspace.d.ts.map +1 -0
- package/dist/context/workspace.js.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/marketplace/client.d.ts.map +1 -0
- package/dist/marketplace/client.js.map +1 -0
- package/dist/memory/files.d.ts.map +1 -0
- package/dist/memory/files.js.map +1 -0
- package/dist/memory/service.d.ts +2 -1
- package/dist/memory/service.d.ts.map +1 -0
- package/dist/memory/service.js +1 -0
- package/dist/memory/service.js.map +1 -0
- package/dist/repl/auto-save.d.ts +14 -0
- package/dist/repl/auto-save.d.ts.map +1 -0
- package/dist/repl/auto-save.js +101 -0
- package/dist/repl/auto-save.js.map +1 -0
- package/dist/repl/repl.d.ts.map +1 -0
- package/dist/repl/repl.js +247 -2
- package/dist/repl/repl.js.map +1 -0
- package/dist/skills/args.d.ts.map +1 -0
- package/dist/skills/args.js.map +1 -0
- package/dist/skills/frontmatter.d.ts.map +1 -0
- package/dist/skills/frontmatter.js.map +1 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/skills/signing/signer.d.ts.map +1 -0
- package/dist/skills/signing/signer.js.map +1 -0
- package/dist/skills/trust.d.ts.map +1 -0
- package/dist/skills/trust.js.map +1 -0
- package/dist/telemetry/logger.d.ts.map +1 -0
- package/dist/telemetry/logger.js.map +1 -0
- package/dist/tools/permissions.d.ts.map +1 -0
- package/dist/tools/permissions.js.map +1 -0
- package/dist/tools/protocol.d.ts.map +1 -0
- package/dist/tools/protocol.js.map +1 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/sandbox/docker.d.ts.map +1 -0
- package/dist/tools/sandbox/docker.js.map +1 -0
- package/dist/tools/sandbox/index.d.ts.map +1 -0
- package/dist/tools/sandbox/index.js.map +1 -0
- package/dist/tools/sanitize.d.ts.map +1 -0
- package/dist/tools/sanitize.js.map +1 -0
- package/dist/tools/tools/ask-user.d.ts.map +1 -0
- package/dist/tools/tools/ask-user.js.map +1 -0
- package/dist/tools/tools/bash.d.ts.map +1 -0
- package/dist/tools/tools/bash.js +52 -1
- package/dist/tools/tools/bash.js.map +1 -0
- package/dist/tools/tools/edit.d.ts.map +1 -0
- package/dist/tools/tools/edit.js +1 -0
- package/dist/tools/tools/edit.js.map +1 -0
- package/dist/tools/tools/glob.d.ts.map +1 -0
- package/dist/tools/tools/glob.js.map +1 -0
- package/dist/tools/tools/grep.d.ts.map +1 -0
- package/dist/tools/tools/grep.js +6 -8
- package/dist/tools/tools/grep.js.map +1 -0
- package/dist/tools/tools/read.d.ts.map +1 -0
- package/dist/tools/tools/read.js.map +1 -0
- package/dist/tools/tools/web-fetch.d.ts.map +1 -0
- package/dist/tools/tools/web-fetch.js.map +1 -0
- package/dist/tools/tools/write.d.ts.map +1 -0
- package/dist/tools/tools/write.js.map +1 -0
- package/dist/tools/validation.d.ts.map +1 -0
- package/dist/tools/validation.js.map +1 -0
- package/dist/ui/banner.d.ts.map +1 -0
- package/dist/ui/banner.js.map +1 -0
- package/dist/utils/diff.d.ts +38 -0
- package/dist/utils/diff.d.ts.map +1 -0
- package/dist/utils/diff.js +184 -0
- package/dist/utils/diff.js.map +1 -0
- package/dist/utils/errors.d.ts +32 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +72 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/ignore.d.ts +22 -0
- package/dist/utils/ignore.d.ts.map +1 -0
- package/dist/utils/ignore.js +205 -0
- package/dist/utils/ignore.js.map +1 -0
- package/dist/utils/input-history.d.ts +37 -0
- package/dist/utils/input-history.d.ts.map +1 -0
- package/dist/utils/input-history.js +142 -0
- package/dist/utils/input-history.js.map +1 -0
- package/dist/utils/markdown.d.ts.map +1 -0
- package/dist/utils/markdown.js.map +1 -0
- package/dist/utils/rate-limit.d.ts +36 -0
- package/dist/utils/rate-limit.d.ts.map +1 -0
- package/dist/utils/rate-limit.js +71 -0
- package/dist/utils/rate-limit.js.map +1 -0
- package/dist/utils/retry.d.ts +26 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +96 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/spinner.d.ts +12 -0
- package/dist/utils/spinner.d.ts.map +1 -0
- package/dist/utils/spinner.js +51 -0
- package/dist/utils/spinner.js.map +1 -0
- package/dist/utils/stats.d.ts +29 -0
- package/dist/utils/stats.d.ts.map +1 -0
- package/dist/utils/stats.js +95 -0
- package/dist/utils/stats.js.map +1 -0
- package/dist/utils/streaming.d.ts.map +1 -0
- package/dist/utils/streaming.js.map +1 -0
- package/dist/utils/tokens.d.ts.map +1 -0
- package/dist/utils/tokens.js.map +1 -0
- package/dist/utils/undo-tracker.d.ts +37 -0
- package/dist/utils/undo-tracker.d.ts.map +1 -0
- package/dist/utils/undo-tracker.js +118 -0
- package/dist/utils/undo-tracker.js.map +1 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js.map +1 -0
- package/package.json +61 -45
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Simple rate limiter for tool calls.
|
|
4
|
+
* Prevents runaway agent loops from hammering the system.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.RateLimiter = void 0;
|
|
8
|
+
const DEFAULT_CONFIG = {
|
|
9
|
+
maxCalls: 60,
|
|
10
|
+
windowMs: 60_000, // 1 minute
|
|
11
|
+
perTool: {
|
|
12
|
+
bash: { maxCalls: 30, windowMs: 60_000 },
|
|
13
|
+
write: { maxCalls: 40, windowMs: 60_000 },
|
|
14
|
+
edit: { maxCalls: 40, windowMs: 60_000 },
|
|
15
|
+
web_fetch: { maxCalls: 20, windowMs: 60_000 },
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
class RateLimiter {
|
|
19
|
+
calls = new Map();
|
|
20
|
+
config;
|
|
21
|
+
constructor(config) {
|
|
22
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Check if a tool call is allowed. Returns true if allowed, false if rate limited.
|
|
26
|
+
*/
|
|
27
|
+
isAllowed(toolName) {
|
|
28
|
+
const now = Date.now();
|
|
29
|
+
const records = this.getRecords(toolName);
|
|
30
|
+
// Clean up old records
|
|
31
|
+
const windowMs = this.getWindowMs(toolName);
|
|
32
|
+
const cutoff = now - windowMs;
|
|
33
|
+
const recent = records.filter((r) => r.timestamp > cutoff);
|
|
34
|
+
const maxCalls = this.getMaxCalls(toolName);
|
|
35
|
+
if (recent.length >= maxCalls) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
// Record this call
|
|
39
|
+
recent.push({ timestamp: now });
|
|
40
|
+
this.calls.set(toolName, recent);
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get the number of remaining calls for a tool in the current window.
|
|
45
|
+
*/
|
|
46
|
+
remaining(toolName) {
|
|
47
|
+
const now = Date.now();
|
|
48
|
+
const records = this.getRecords(toolName);
|
|
49
|
+
const windowMs = this.getWindowMs(toolName);
|
|
50
|
+
const cutoff = now - windowMs;
|
|
51
|
+
const recent = records.filter((r) => r.timestamp > cutoff);
|
|
52
|
+
return Math.max(0, this.getMaxCalls(toolName) - recent.length);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Reset rate limit state (e.g., on new session).
|
|
56
|
+
*/
|
|
57
|
+
reset() {
|
|
58
|
+
this.calls.clear();
|
|
59
|
+
}
|
|
60
|
+
getRecords(toolName) {
|
|
61
|
+
return this.calls.get(toolName) ?? [];
|
|
62
|
+
}
|
|
63
|
+
getMaxCalls(toolName) {
|
|
64
|
+
return this.config.perTool?.[toolName]?.maxCalls ?? this.config.maxCalls;
|
|
65
|
+
}
|
|
66
|
+
getWindowMs(toolName) {
|
|
67
|
+
return this.config.perTool?.[toolName]?.windowMs ?? this.config.windowMs;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.RateLimiter = RateLimiter;
|
|
71
|
+
//# sourceMappingURL=rate-limit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/utils/rate-limit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry utility for API calls with exponential backoff.
|
|
3
|
+
* Handles rate limits (429), server errors (500/502/503), and network issues.
|
|
4
|
+
*/
|
|
5
|
+
export interface RetryOptions {
|
|
6
|
+
maxRetries?: number;
|
|
7
|
+
baseDelayMs?: number;
|
|
8
|
+
maxDelayMs?: number;
|
|
9
|
+
/** Retry on these error patterns (string match against error message) */
|
|
10
|
+
retryableErrors?: string[];
|
|
11
|
+
/** Called before each retry with attempt number and delay */
|
|
12
|
+
onRetry?: (attempt: number, delay: number, error: Error) => void;
|
|
13
|
+
}
|
|
14
|
+
export declare class RetryableError extends Error {
|
|
15
|
+
readonly statusCode?: number | undefined;
|
|
16
|
+
constructor(message: string, statusCode?: number | undefined);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Determine if an error is retryable (rate limit, server error, network issue).
|
|
20
|
+
*/
|
|
21
|
+
export declare function isRetryableError(err: unknown): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Execute a function with retry logic and exponential backoff + jitter.
|
|
24
|
+
*/
|
|
25
|
+
export declare function withRetry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
|
|
26
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,yEAAyE;IACzE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,6DAA6D;IAC7D,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CACjE;AAED,qBAAa,cAAe,SAAQ,KAAK;aACM,UAAU,CAAC,EAAE,MAAM;gBAApD,OAAO,EAAE,MAAM,EAAkB,UAAU,CAAC,EAAE,MAAM,YAAA;CAIjE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAyBtD;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,CAAC,CAAC,CAyCZ"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Retry utility for API calls with exponential backoff.
|
|
4
|
+
* Handles rate limits (429), server errors (500/502/503), and network issues.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.RetryableError = void 0;
|
|
8
|
+
exports.isRetryableError = isRetryableError;
|
|
9
|
+
exports.withRetry = withRetry;
|
|
10
|
+
const DEFAULT_MAX_RETRIES = 3;
|
|
11
|
+
const DEFAULT_BASE_DELAY_MS = 1000;
|
|
12
|
+
const DEFAULT_MAX_DELAY_MS = 30_000;
|
|
13
|
+
class RetryableError extends Error {
|
|
14
|
+
statusCode;
|
|
15
|
+
constructor(message, statusCode) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.statusCode = statusCode;
|
|
18
|
+
this.name = "RetryableError";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.RetryableError = RetryableError;
|
|
22
|
+
/**
|
|
23
|
+
* Determine if an error is retryable (rate limit, server error, network issue).
|
|
24
|
+
*/
|
|
25
|
+
function isRetryableError(err) {
|
|
26
|
+
if (err instanceof RetryableError)
|
|
27
|
+
return true;
|
|
28
|
+
if (err && typeof err === "object") {
|
|
29
|
+
const e = err;
|
|
30
|
+
// OpenAI API error structure
|
|
31
|
+
if (e.status === 429)
|
|
32
|
+
return true; // Rate limit
|
|
33
|
+
if (e.status === 500)
|
|
34
|
+
return true; // Internal server error
|
|
35
|
+
if (e.status === 502)
|
|
36
|
+
return true; // Bad gateway
|
|
37
|
+
if (e.status === 503)
|
|
38
|
+
return true; // Service unavailable
|
|
39
|
+
if (e.status === 529)
|
|
40
|
+
return true; // Overloaded
|
|
41
|
+
// Network errors
|
|
42
|
+
const msg = String(e.message ?? "");
|
|
43
|
+
if (msg.includes("ECONNRESET"))
|
|
44
|
+
return true;
|
|
45
|
+
if (msg.includes("ECONNREFUSED"))
|
|
46
|
+
return true;
|
|
47
|
+
if (msg.includes("ETIMEDOUT"))
|
|
48
|
+
return true;
|
|
49
|
+
if (msg.includes("socket hang up"))
|
|
50
|
+
return true;
|
|
51
|
+
if (msg.includes("network"))
|
|
52
|
+
return true;
|
|
53
|
+
if (msg.includes("fetch failed"))
|
|
54
|
+
return true;
|
|
55
|
+
if (msg.includes("abort"))
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Execute a function with retry logic and exponential backoff + jitter.
|
|
62
|
+
*/
|
|
63
|
+
async function withRetry(fn, options = {}) {
|
|
64
|
+
const { maxRetries = DEFAULT_MAX_RETRIES, baseDelayMs = DEFAULT_BASE_DELAY_MS, maxDelayMs = DEFAULT_MAX_DELAY_MS, onRetry, } = options;
|
|
65
|
+
let lastError;
|
|
66
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
67
|
+
try {
|
|
68
|
+
return await fn();
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
72
|
+
lastError = error;
|
|
73
|
+
// Don't retry non-retryable errors
|
|
74
|
+
if (!isRetryableError(err)) {
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
// Don't retry if we've exhausted attempts
|
|
78
|
+
if (attempt >= maxRetries) {
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
// Calculate delay with exponential backoff + jitter
|
|
82
|
+
const exponentialDelay = baseDelayMs * Math.pow(2, attempt);
|
|
83
|
+
const jitter = Math.random() * baseDelayMs;
|
|
84
|
+
const delay = Math.min(exponentialDelay + jitter, maxDelayMs);
|
|
85
|
+
if (onRetry) {
|
|
86
|
+
onRetry(attempt + 1, delay, error);
|
|
87
|
+
}
|
|
88
|
+
await sleep(delay);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
throw lastError ?? new Error("Retry failed with unknown error");
|
|
92
|
+
}
|
|
93
|
+
function sleep(ms) {
|
|
94
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AA0BH,4CAyBC;AAKD,8BA4CC;AAlGD,MAAM,mBAAmB,GAAG,CAAC,CAAA;AAC7B,MAAM,qBAAqB,GAAG,IAAI,CAAA;AAClC,MAAM,oBAAoB,GAAG,MAAM,CAAA;AAYnC,MAAa,cAAe,SAAQ,KAAK;IACM;IAA7C,YAAY,OAAe,EAAkB,UAAmB;QAC9D,KAAK,CAAC,OAAO,CAAC,CAAA;QAD6B,eAAU,GAAV,UAAU,CAAS;QAE9D,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;IAC9B,CAAC;CACF;AALD,wCAKC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,GAAY;IAC3C,IAAI,GAAG,YAAY,cAAc;QAAE,OAAO,IAAI,CAAA;IAE9C,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,GAA8B,CAAA;QAExC,6BAA6B;QAC7B,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAA,CAAC,aAAa;QAC/C,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAA,CAAC,wBAAwB;QAC1D,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAA,CAAC,cAAc;QAChD,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAA,CAAC,sBAAsB;QACxD,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAA,CAAC,aAAa;QAE/C,iBAAiB;QACjB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;QACnC,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC;YAAE,OAAO,IAAI,CAAA;QAC3C,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;YAAE,OAAO,IAAI,CAAA;QAC7C,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC;YAAE,OAAO,IAAI,CAAA;QAC1C,IAAI,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAAE,OAAO,IAAI,CAAA;QAC/C,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAA;QACxC,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;YAAE,OAAO,IAAI,CAAA;QAC7C,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAA;IACxC,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,SAAS,CAC7B,EAAoB,EACpB,UAAwB,EAAE;IAE1B,MAAM,EACJ,UAAU,GAAG,mBAAmB,EAChC,WAAW,GAAG,qBAAqB,EACnC,UAAU,GAAG,oBAAoB,EACjC,OAAO,GACR,GAAG,OAAO,CAAA;IAEX,IAAI,SAA4B,CAAA;IAEhC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAA;QACnB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;YACjE,SAAS,GAAG,KAAK,CAAA;YAEjB,mCAAmC;YACnC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,KAAK,CAAA;YACb,CAAC;YAED,0CAA0C;YAC1C,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;gBAC1B,MAAM,KAAK,CAAA;YACb,CAAC;YAED,oDAAoD;YACpD,MAAM,gBAAgB,GAAG,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;YAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,WAAW,CAAA;YAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,MAAM,EAAE,UAAU,CAAC,CAAA;YAE7D,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,OAAO,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;YACpC,CAAC;YAED,MAAM,KAAK,CAAC,KAAK,CAAC,CAAA;QACpB,CAAC;IACH,CAAC;IAED,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;AACjE,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AAC1D,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight "thinking" spinner shown while waiting for LLM responses.
|
|
3
|
+
* Uses only ASCII characters for maximum terminal compatibility.
|
|
4
|
+
*/
|
|
5
|
+
export interface Spinner {
|
|
6
|
+
start(label?: string): void;
|
|
7
|
+
update(label: string): void;
|
|
8
|
+
stop(): void;
|
|
9
|
+
isSpinning(): boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function createSpinner(): Spinner;
|
|
12
|
+
//# sourceMappingURL=spinner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/utils/spinner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,OAAO;IACtB,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,IAAI,IAAI,IAAI,CAAA;IACZ,UAAU,IAAI,OAAO,CAAA;CACtB;AAED,wBAAgB,aAAa,IAAI,OAAO,CA4CvC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Lightweight "thinking" spinner shown while waiting for LLM responses.
|
|
4
|
+
* Uses only ASCII characters for maximum terminal compatibility.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.createSpinner = createSpinner;
|
|
8
|
+
const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⦶", "⠧", "⠇", "⠏"];
|
|
9
|
+
const INTERVAL_MS = 80;
|
|
10
|
+
function createSpinner() {
|
|
11
|
+
let frameIndex = 0;
|
|
12
|
+
let timer = null;
|
|
13
|
+
let active = false;
|
|
14
|
+
let currentLabel = "Thinking";
|
|
15
|
+
return {
|
|
16
|
+
start(label) {
|
|
17
|
+
if (active)
|
|
18
|
+
return;
|
|
19
|
+
active = true;
|
|
20
|
+
currentLabel = label ?? "Thinking";
|
|
21
|
+
frameIndex = 0;
|
|
22
|
+
// Hide cursor for cleaner look
|
|
23
|
+
process.stdout.write("\x1B[?25l");
|
|
24
|
+
timer = setInterval(() => {
|
|
25
|
+
const frame = SPINNER_FRAMES[frameIndex % SPINNER_FRAMES.length];
|
|
26
|
+
process.stdout.write(`\r ${frame} ${currentLabel}...`);
|
|
27
|
+
frameIndex++;
|
|
28
|
+
}, INTERVAL_MS);
|
|
29
|
+
},
|
|
30
|
+
update(label) {
|
|
31
|
+
currentLabel = label;
|
|
32
|
+
},
|
|
33
|
+
stop() {
|
|
34
|
+
if (!active)
|
|
35
|
+
return;
|
|
36
|
+
active = false;
|
|
37
|
+
if (timer) {
|
|
38
|
+
clearInterval(timer);
|
|
39
|
+
timer = null;
|
|
40
|
+
}
|
|
41
|
+
// Clear the spinner line
|
|
42
|
+
process.stdout.write("\r" + " ".repeat(currentLabel.length + 20) + "\r");
|
|
43
|
+
// Show cursor again
|
|
44
|
+
process.stdout.write("\x1B[?25h");
|
|
45
|
+
},
|
|
46
|
+
isSpinning() {
|
|
47
|
+
return active;
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/utils/spinner.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAYH,sCA4CC;AAtDD,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;AACzE,MAAM,WAAW,GAAG,EAAE,CAAA;AAStB,SAAgB,aAAa;IAC3B,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,IAAI,KAAK,GAA0C,IAAI,CAAA;IACvD,IAAI,MAAM,GAAG,KAAK,CAAA;IAClB,IAAI,YAAY,GAAG,UAAU,CAAA;IAE7B,OAAO;QACL,KAAK,CAAC,KAAc;YAClB,IAAI,MAAM;gBAAE,OAAM;YAClB,MAAM,GAAG,IAAI,CAAA;YACb,YAAY,GAAG,KAAK,IAAI,UAAU,CAAA;YAClC,UAAU,GAAG,CAAC,CAAA;YAEd,+BAA+B;YAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;YAEjC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;gBACvB,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAA;gBAChE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI,YAAY,KAAK,CAAC,CAAA;gBACvD,UAAU,EAAE,CAAA;YACd,CAAC,EAAE,WAAW,CAAC,CAAA;QACjB,CAAC;QAED,MAAM,CAAC,KAAa;YAClB,YAAY,GAAG,KAAK,CAAA;QACtB,CAAC;QAED,IAAI;YACF,IAAI,CAAC,MAAM;gBAAE,OAAM;YACnB,MAAM,GAAG,KAAK,CAAA;YACd,IAAI,KAAK,EAAE,CAAC;gBACV,aAAa,CAAC,KAAK,CAAC,CAAA;gBACpB,KAAK,GAAG,IAAI,CAAA;YACd,CAAC;YACD,yBAAyB;YACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAA;YACxE,oBAAoB;YACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;QACnC,CAAC;QAED,UAAU;YACR,OAAO,MAAM,CAAA;QACf,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session statistics tracker.
|
|
3
|
+
* Tracks token usage, tool calls, timing, and costs for the current session.
|
|
4
|
+
*/
|
|
5
|
+
export interface SessionStats {
|
|
6
|
+
startTime: number;
|
|
7
|
+
totalInputTokens: number;
|
|
8
|
+
totalOutputTokens: number;
|
|
9
|
+
totalToolCalls: number;
|
|
10
|
+
toolCallCounts: Record<string, number>;
|
|
11
|
+
llmCalls: number;
|
|
12
|
+
compactCount: number;
|
|
13
|
+
tokensSavedByCompact: number;
|
|
14
|
+
errors: number;
|
|
15
|
+
}
|
|
16
|
+
export declare class StatsTracker {
|
|
17
|
+
private stats;
|
|
18
|
+
constructor();
|
|
19
|
+
recordLLMCall(inputTokens: number, outputTokens: number): void;
|
|
20
|
+
recordToolCall(toolName: string): void;
|
|
21
|
+
recordCompact(tokensSaved: number): void;
|
|
22
|
+
recordError(): void;
|
|
23
|
+
getStats(): Readonly<SessionStats>;
|
|
24
|
+
getElapsedTime(): string;
|
|
25
|
+
getEstimatedCost(): number;
|
|
26
|
+
getSummary(): string;
|
|
27
|
+
reset(): void;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/utils/stats.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,MAAM,CAAA;IACxB,iBAAiB,EAAE,MAAM,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,MAAM,EAAE,MAAM,CAAA;CACf;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAc;;IAgB3B,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAM9D,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKtC,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAKxC,WAAW,IAAI,IAAI;IAInB,QAAQ,IAAI,QAAQ,CAAC,YAAY,CAAC;IAIlC,cAAc,IAAI,MAAM;IAWxB,gBAAgB,IAAI,MAAM;IAO1B,UAAU,IAAI,MAAM;IA6BpB,KAAK,IAAI,IAAI;CAad"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Session statistics tracker.
|
|
4
|
+
* Tracks token usage, tool calls, timing, and costs for the current session.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.StatsTracker = void 0;
|
|
8
|
+
class StatsTracker {
|
|
9
|
+
stats;
|
|
10
|
+
constructor() {
|
|
11
|
+
this.stats = {
|
|
12
|
+
startTime: Date.now(),
|
|
13
|
+
totalInputTokens: 0,
|
|
14
|
+
totalOutputTokens: 0,
|
|
15
|
+
totalToolCalls: 0,
|
|
16
|
+
toolCallCounts: {},
|
|
17
|
+
llmCalls: 0,
|
|
18
|
+
compactCount: 0,
|
|
19
|
+
tokensSavedByCompact: 0,
|
|
20
|
+
errors: 0,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
recordLLMCall(inputTokens, outputTokens) {
|
|
24
|
+
this.stats.llmCalls++;
|
|
25
|
+
this.stats.totalInputTokens += inputTokens;
|
|
26
|
+
this.stats.totalOutputTokens += outputTokens;
|
|
27
|
+
}
|
|
28
|
+
recordToolCall(toolName) {
|
|
29
|
+
this.stats.totalToolCalls++;
|
|
30
|
+
this.stats.toolCallCounts[toolName] = (this.stats.toolCallCounts[toolName] ?? 0) + 1;
|
|
31
|
+
}
|
|
32
|
+
recordCompact(tokensSaved) {
|
|
33
|
+
this.stats.compactCount++;
|
|
34
|
+
this.stats.tokensSavedByCompact += tokensSaved;
|
|
35
|
+
}
|
|
36
|
+
recordError() {
|
|
37
|
+
this.stats.errors++;
|
|
38
|
+
}
|
|
39
|
+
getStats() {
|
|
40
|
+
return this.stats;
|
|
41
|
+
}
|
|
42
|
+
getElapsedTime() {
|
|
43
|
+
const elapsed = Date.now() - this.stats.startTime;
|
|
44
|
+
const seconds = Math.floor(elapsed / 1000);
|
|
45
|
+
const minutes = Math.floor(seconds / 60);
|
|
46
|
+
const hours = Math.floor(minutes / 60);
|
|
47
|
+
if (hours > 0)
|
|
48
|
+
return `${hours}h ${minutes % 60}m`;
|
|
49
|
+
if (minutes > 0)
|
|
50
|
+
return `${minutes}m ${seconds % 60}s`;
|
|
51
|
+
return `${seconds}s`;
|
|
52
|
+
}
|
|
53
|
+
getEstimatedCost() {
|
|
54
|
+
// Approximate pricing per 1M tokens
|
|
55
|
+
return ((this.stats.totalInputTokens * 3 + this.stats.totalOutputTokens * 15) / 1_000_000);
|
|
56
|
+
}
|
|
57
|
+
getSummary() {
|
|
58
|
+
const lines = [];
|
|
59
|
+
lines.push(` Duration: ${this.getElapsedTime()}`);
|
|
60
|
+
lines.push(` LLM calls: ${this.stats.llmCalls}`);
|
|
61
|
+
lines.push(` Input tokens: ${this.stats.totalInputTokens.toLocaleString()}`);
|
|
62
|
+
lines.push(` Output tokens: ${this.stats.totalOutputTokens.toLocaleString()}`);
|
|
63
|
+
lines.push(` Tool calls: ${this.stats.totalToolCalls}`);
|
|
64
|
+
// Top tools
|
|
65
|
+
const topTools = Object.entries(this.stats.toolCallCounts)
|
|
66
|
+
.sort((a, b) => b[1] - a[1])
|
|
67
|
+
.slice(0, 5);
|
|
68
|
+
if (topTools.length > 0) {
|
|
69
|
+
lines.push(` Top tools: ${topTools.map(([name, count]) => `${name}(${count})`).join(", ")}`);
|
|
70
|
+
}
|
|
71
|
+
if (this.stats.compactCount > 0) {
|
|
72
|
+
lines.push(` Compactions: ${this.stats.compactCount} (${this.stats.tokensSavedByCompact.toLocaleString()} tokens saved)`);
|
|
73
|
+
}
|
|
74
|
+
if (this.stats.errors > 0) {
|
|
75
|
+
lines.push(` Errors: ${this.stats.errors}`);
|
|
76
|
+
}
|
|
77
|
+
lines.push(` Est. cost: $${this.getEstimatedCost().toFixed(4)}`);
|
|
78
|
+
return lines.join("\n");
|
|
79
|
+
}
|
|
80
|
+
reset() {
|
|
81
|
+
this.stats = {
|
|
82
|
+
startTime: Date.now(),
|
|
83
|
+
totalInputTokens: 0,
|
|
84
|
+
totalOutputTokens: 0,
|
|
85
|
+
totalToolCalls: 0,
|
|
86
|
+
toolCallCounts: {},
|
|
87
|
+
llmCalls: 0,
|
|
88
|
+
compactCount: 0,
|
|
89
|
+
tokensSavedByCompact: 0,
|
|
90
|
+
errors: 0,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
exports.StatsTracker = StatsTracker;
|
|
95
|
+
//# sourceMappingURL=stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/utils/stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../../src/utils/streaming.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAgB,sBAAsB;mBAMnB,MAAM,GAAG,IAAI;IAU5B,mEAAmE;aAC1D,IAAI;iBAOA,MAAM;EAItB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAejF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAKtE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../src/utils/streaming.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAEH,wDA4BC;AAED,oCAeC;AAED,4CAKC;AApDD,SAAgB,sBAAsB;IACpC,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,IAAI,cAAc,GAAG,CAAC,CAAA;IACtB,MAAM,kBAAkB,GAAG,EAAE,CAAA;IAE7B,OAAO;QACL,OAAO,CAAC,KAAa;YACnB,MAAM,IAAI,KAAK,CAAA;YACf,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YACtB,IAAI,GAAG,GAAG,cAAc,IAAI,kBAAkB,EAAE,CAAC;gBAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;gBAC5B,MAAM,GAAG,EAAE,CAAA;gBACX,cAAc,GAAG,GAAG,CAAA;YACtB,CAAC;QACH,CAAC;QAED,mEAAmE;QACnE,KAAK;YACH,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;gBAC5B,MAAM,GAAG,EAAE,CAAA;YACb,CAAC;QACH,CAAC;QAED,SAAS;YACP,OAAO,MAAM,CAAA;QACf,CAAC;KACF,CAAA;AACH,CAAC;AAED,SAAgB,YAAY,CAAC,IAAY,EAAE,KAA8B;IACvE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;QACpC,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;QACpD,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;QACpC,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;QACpC;YACE,OAAO,EAAE,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAgB,gBAAgB,CAAC,IAAY,EAAE,MAAe;IAC5D,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAA;IACpE,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;AAC7C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/utils/tokens.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,GAClD,MAAM,CAYR;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAQxF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIvD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/utils/tokens.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAEH,wCAGC;AAED,wDAcC;AAED,4DAQC;AAED,4CAIC;AAnCD,SAAgB,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAA;IACnB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;AACnC,CAAC;AAED,SAAgB,sBAAsB,CACpC,QAAmD;IAEnD,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,OAAO,GACX,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;YAC7B,CAAC,CAAC,GAAG,CAAC,OAAO;YACb,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;QACvC,KAAK,IAAI,cAAc,CAAC,OAAO,CAAC,CAAA;QAChC,wDAAwD;QACxD,KAAK,IAAI,CAAC,CAAA;IACZ,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAgB,wBAAwB,CAAC,OAAuC;IAC9E,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,IAAI,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAA;QACzD,KAAK,IAAI,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAA;QAClD,KAAK,IAAI,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAA;IACpE,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAgB,gBAAgB,CAAC,MAAc;IAC7C,IAAI,MAAM,IAAI,SAAS;QAAE,OAAO,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAA;IACrE,IAAI,MAAM,IAAI,KAAK;QAAE,OAAO,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAA;IAC7D,OAAO,MAAM,CAAC,MAAM,CAAC,CAAA;AACvB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Undo tracker — keeps a stack of file snapshots before destructive edits.
|
|
3
|
+
* Enables /undo command to revert the last file change.
|
|
4
|
+
*/
|
|
5
|
+
export interface FileSnapshot {
|
|
6
|
+
filePath: string;
|
|
7
|
+
content: string | null;
|
|
8
|
+
timestamp: number;
|
|
9
|
+
operation: "write" | "edit";
|
|
10
|
+
}
|
|
11
|
+
export declare class UndoTracker {
|
|
12
|
+
private stack;
|
|
13
|
+
/**
|
|
14
|
+
* Save a snapshot of the file before it gets modified.
|
|
15
|
+
* Call this BEFORE performing the write/edit.
|
|
16
|
+
*/
|
|
17
|
+
push(filePath: string, operation: "write" | "edit"): void;
|
|
18
|
+
/**
|
|
19
|
+
* Undo the most recent file change. Returns info about what was undone,
|
|
20
|
+
* or null if there's nothing to undo.
|
|
21
|
+
*/
|
|
22
|
+
undo(): FileSnapshot | null;
|
|
23
|
+
/**
|
|
24
|
+
* Peek at the most recent snapshot without popping it.
|
|
25
|
+
*/
|
|
26
|
+
peek(): FileSnapshot | null;
|
|
27
|
+
/**
|
|
28
|
+
* Get the full undo history.
|
|
29
|
+
*/
|
|
30
|
+
getHistory(): readonly FileSnapshot[];
|
|
31
|
+
/**
|
|
32
|
+
* Clear the undo stack.
|
|
33
|
+
*/
|
|
34
|
+
clear(): void;
|
|
35
|
+
get size(): number;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=undo-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"undo-tracker.d.ts","sourceRoot":"","sources":["../../src/utils/undo-tracker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,OAAO,GAAG,MAAM,CAAA;CAC5B;AAID,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAqB;IAElC;;;OAGG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI;IAuBzD;;;OAGG;IACH,IAAI,IAAI,YAAY,GAAG,IAAI;IAoB3B;;OAEG;IACH,IAAI,IAAI,YAAY,GAAG,IAAI;IAI3B;;OAEG;IACH,UAAU,IAAI,SAAS,YAAY,EAAE;IAIrC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Undo tracker — keeps a stack of file snapshots before destructive edits.
|
|
4
|
+
* Enables /undo command to revert the last file change.
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.UndoTracker = void 0;
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const MAX_UNDO_STACK = 50;
|
|
44
|
+
class UndoTracker {
|
|
45
|
+
stack = [];
|
|
46
|
+
/**
|
|
47
|
+
* Save a snapshot of the file before it gets modified.
|
|
48
|
+
* Call this BEFORE performing the write/edit.
|
|
49
|
+
*/
|
|
50
|
+
push(filePath, operation) {
|
|
51
|
+
const resolved = path.resolve(filePath);
|
|
52
|
+
let content = null;
|
|
53
|
+
try {
|
|
54
|
+
content = fs.readFileSync(resolved, "utf-8");
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// File doesn't exist yet — that's fine
|
|
58
|
+
}
|
|
59
|
+
this.stack.push({
|
|
60
|
+
filePath: resolved,
|
|
61
|
+
content,
|
|
62
|
+
timestamp: Date.now(),
|
|
63
|
+
operation,
|
|
64
|
+
});
|
|
65
|
+
// Trim old entries
|
|
66
|
+
if (this.stack.length > MAX_UNDO_STACK) {
|
|
67
|
+
this.stack = this.stack.slice(-MAX_UNDO_STACK);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Undo the most recent file change. Returns info about what was undone,
|
|
72
|
+
* or null if there's nothing to undo.
|
|
73
|
+
*/
|
|
74
|
+
undo() {
|
|
75
|
+
const snapshot = this.stack.pop();
|
|
76
|
+
if (!snapshot)
|
|
77
|
+
return null;
|
|
78
|
+
try {
|
|
79
|
+
if (snapshot.content === null) {
|
|
80
|
+
// File was created — delete it
|
|
81
|
+
fs.unlinkSync(snapshot.filePath);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// File was modified — restore previous content
|
|
85
|
+
fs.writeFileSync(snapshot.filePath, snapshot.content, "utf-8");
|
|
86
|
+
}
|
|
87
|
+
return snapshot;
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
// Put it back on the stack if undo failed
|
|
91
|
+
this.stack.push(snapshot);
|
|
92
|
+
throw err;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Peek at the most recent snapshot without popping it.
|
|
97
|
+
*/
|
|
98
|
+
peek() {
|
|
99
|
+
return this.stack.length > 0 ? this.stack[this.stack.length - 1] : null;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get the full undo history.
|
|
103
|
+
*/
|
|
104
|
+
getHistory() {
|
|
105
|
+
return this.stack;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Clear the undo stack.
|
|
109
|
+
*/
|
|
110
|
+
clear() {
|
|
111
|
+
this.stack = [];
|
|
112
|
+
}
|
|
113
|
+
get size() {
|
|
114
|
+
return this.stack.length;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
exports.UndoTracker = UndoTracker;
|
|
118
|
+
//# sourceMappingURL=undo-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"undo-tracker.js","sourceRoot":"","sources":["../../src/utils/undo-tracker.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAwB;AACxB,2CAA4B;AAU5B,MAAM,cAAc,GAAG,EAAE,CAAA;AAEzB,MAAa,WAAW;IACd,KAAK,GAAmB,EAAE,CAAA;IAElC;;;OAGG;IACH,IAAI,CAAC,QAAgB,EAAE,SAA2B;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QACvC,IAAI,OAAO,GAAkB,IAAI,CAAA;QAEjC,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,QAAQ;YAClB,OAAO;YACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS;SACV,CAAC,CAAA;QAEF,mBAAmB;QACnB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,CAAA;QAChD,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,IAAI;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAA;QACjC,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAA;QAE1B,IAAI,CAAC;YACH,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC9B,+BAA+B;gBAC/B,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;YAClC,CAAC;iBAAM,CAAC;gBACN,+CAA+C;gBAC/C,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAChE,CAAC;YACD,OAAO,QAAQ,CAAA;QACjB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,0CAA0C;YAC1C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACzB,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACzE,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;IACjB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAA;IAC1B,CAAC;CACF;AA9ED,kCA8EC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,QAAsB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":";;;;;;AAAA,mEAAyC;AAE5B,QAAA,WAAW,GAAG,sBAAW,CAAC,OAAO,CAAA"}
|