@nxuss/lemma 0.4.13 ā 0.5.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 +16 -10
- package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -1
- package/dist/cjs/cli/lemma-proxy.js +94 -14
- package/dist/cjs/cli/lemma-proxy.js.map +1 -1
- package/dist/cjs/mcp/index.js +198 -1
- package/dist/cjs/mcp/index.js.map +1 -1
- package/dist/cjs/observability/IdeContextSync.d.ts.map +1 -1
- package/dist/cjs/observability/IdeContextSync.js +22 -10
- package/dist/cjs/observability/IdeContextSync.js.map +1 -1
- package/dist/cjs/proxy/KeyManager.d.ts +3 -0
- package/dist/cjs/proxy/KeyManager.d.ts.map +1 -1
- package/dist/cjs/proxy/KeyManager.js +44 -1
- package/dist/cjs/proxy/KeyManager.js.map +1 -1
- package/dist/cjs/utils/ClipboardWatcher.d.ts +19 -0
- package/dist/cjs/utils/ClipboardWatcher.d.ts.map +1 -0
- package/dist/cjs/utils/ClipboardWatcher.js +99 -0
- package/dist/cjs/utils/ClipboardWatcher.js.map +1 -0
- package/dist/cjs/utils/ContextSqueezer.d.ts +27 -1
- package/dist/cjs/utils/ContextSqueezer.d.ts.map +1 -1
- package/dist/cjs/utils/ContextSqueezer.js +279 -6
- package/dist/cjs/utils/ContextSqueezer.js.map +1 -1
- package/dist/esm/cli/lemma-proxy.d.ts.map +1 -1
- package/dist/esm/cli/lemma-proxy.js +94 -14
- package/dist/esm/cli/lemma-proxy.js.map +1 -1
- package/dist/esm/mcp/index.js +198 -1
- package/dist/esm/mcp/index.js.map +1 -1
- package/dist/esm/observability/IdeContextSync.d.ts.map +1 -1
- package/dist/esm/observability/IdeContextSync.js +22 -10
- package/dist/esm/observability/IdeContextSync.js.map +1 -1
- package/dist/esm/proxy/KeyManager.d.ts +3 -0
- package/dist/esm/proxy/KeyManager.d.ts.map +1 -1
- package/dist/esm/proxy/KeyManager.js +44 -1
- package/dist/esm/proxy/KeyManager.js.map +1 -1
- package/dist/esm/utils/ClipboardWatcher.d.ts +19 -0
- package/dist/esm/utils/ClipboardWatcher.d.ts.map +1 -0
- package/dist/esm/utils/ClipboardWatcher.js +93 -0
- package/dist/esm/utils/ClipboardWatcher.js.map +1 -0
- package/dist/esm/utils/ContextSqueezer.d.ts +27 -1
- package/dist/esm/utils/ContextSqueezer.d.ts.map +1 -1
- package/dist/esm/utils/ContextSqueezer.js +273 -6
- package/dist/esm/utils/ContextSqueezer.js.map +1 -1
- package/package.json +2 -2
|
@@ -22,16 +22,15 @@ export class IdeContextSync {
|
|
|
22
22
|
exportPath: config.IDE_SYNC_EXPORT_PATH || '.lemma/live-context.md',
|
|
23
23
|
mode: config.IDE_SYNC_MODE || 'smart',
|
|
24
24
|
};
|
|
25
|
-
//
|
|
26
|
-
if (this.config.mode === 'smart') {
|
|
25
|
+
// Smart structural squeezing is enabled for everyone, but AI-based semantic duplicate filtering requires Pro
|
|
26
|
+
if (this.config.enabled && this.config.mode === 'smart') {
|
|
27
27
|
const keyManager = new KeyManager();
|
|
28
|
-
if (
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
if (keyManager.isPro()) {
|
|
29
|
+
this.embeddingService = new EmbeddingService(config.ollamaUrl, config.OLLAMA_MODEL);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
logger.info('IdeContextSync: Smart structural squeezing active. (AI-based semantic duplicate filter requires Pro).');
|
|
31
33
|
}
|
|
32
|
-
}
|
|
33
|
-
if (this.config.enabled && this.config.mode === 'smart') {
|
|
34
|
-
this.embeddingService = new EmbeddingService(config.ollamaUrl, config.OLLAMA_MODEL);
|
|
35
34
|
}
|
|
36
35
|
}
|
|
37
36
|
/**
|
|
@@ -64,9 +63,22 @@ export class IdeContextSync {
|
|
|
64
63
|
return false;
|
|
65
64
|
// Create a normalized string representation of the core event
|
|
66
65
|
const eventString = `${event.type}: ${event.message}`;
|
|
66
|
+
// If embedding service is not available (e.g. Free offline tier), fall back to exact string deduplication
|
|
67
|
+
if (!this.embeddingService) {
|
|
68
|
+
const recent = this.recentEmbeddings.find(p => p.text === eventString && (Date.now() - p.timestamp < 10000));
|
|
69
|
+
if (recent)
|
|
70
|
+
return true;
|
|
71
|
+
this.recentEmbeddings.push({
|
|
72
|
+
text: eventString,
|
|
73
|
+
embedding: [],
|
|
74
|
+
timestamp: Date.now()
|
|
75
|
+
});
|
|
76
|
+
if (this.recentEmbeddings.length > this.MAX_HISTORY) {
|
|
77
|
+
this.recentEmbeddings.shift();
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
67
81
|
try {
|
|
68
|
-
if (!this.embeddingService)
|
|
69
|
-
return false;
|
|
70
82
|
const embedding = await this.embeddingService.generateEmbedding(eventString);
|
|
71
83
|
// Check for similarity against recent events
|
|
72
84
|
for (const past of this.recentEmbeddings) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IdeContextSync.js","sourceRoot":"","sources":["../../../src/observability/IdeContextSync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,MAAM,MAAM,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;AAU9C;;;;;GAKG;AACH,MAAM,OAAO,cAAc;IAOzB,YAAY,SAAyB;QAJ7B,qBAAgB,GAA+D,EAAE,CAAC;QACzE,gBAAW,GAAG,EAAE,CAAC;QACjB,yBAAoB,GAAG,IAAI,CAAC,CAAC,8BAA8B;QAG1E,IAAI,CAAC,MAAM,GAAG,SAAS,IAAI;YACzB,OAAO,EAAE,MAAM,CAAC,gBAAgB;YAChC,UAAU,EAAE,MAAM,CAAC,oBAAoB,IAAI,wBAAwB;YACnE,IAAI,EAAE,MAAM,CAAC,aAAgC,IAAI,OAAO;SACzD,CAAC;QAEF,
|
|
1
|
+
{"version":3,"file":"IdeContextSync.js","sourceRoot":"","sources":["../../../src/observability/IdeContextSync.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,7 @@ export interface LicenseData {
|
|
|
20
20
|
isPro: boolean;
|
|
21
21
|
activatedAt: string;
|
|
22
22
|
expiresAt?: string;
|
|
23
|
+
lastValidatedAt?: string;
|
|
23
24
|
validatedRemotely: boolean;
|
|
24
25
|
email?: string;
|
|
25
26
|
}
|
|
@@ -32,8 +33,10 @@ export interface ActivationResult {
|
|
|
32
33
|
}
|
|
33
34
|
export declare class KeyManager {
|
|
34
35
|
private license;
|
|
36
|
+
private isCheckingHeartbeat;
|
|
35
37
|
constructor();
|
|
36
38
|
isPro(): boolean;
|
|
39
|
+
private checkHeartbeat;
|
|
37
40
|
getLicenseKey(): string | null;
|
|
38
41
|
getLicense(): LicenseData | null;
|
|
39
42
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KeyManager.d.ts","sourceRoot":"","sources":["../../../src/proxy/KeyManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAiBH;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAcrD;AAID,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAID,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAA4B;;
|
|
1
|
+
{"version":3,"file":"KeyManager.d.ts","sourceRoot":"","sources":["../../../src/proxy/KeyManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAiBH;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAcrD;AAID,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAID,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,mBAAmB,CAAS;;IASpC,KAAK,IAAI,OAAO;YA8BF,cAAc;IAyB5B,aAAa,IAAI,MAAM,GAAG,IAAI;IAI9B,UAAU,IAAI,WAAW,GAAG,IAAI;IAIhC;;;OAGG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA+DtD;;OAEG;IACH,UAAU,IAAI,IAAI;IAOlB;;OAEG;IACH,MAAM,IAAI,IAAI;IAMd,OAAO,CAAC,IAAI;IAoCZ,OAAO,CAAC,IAAI;IASZ,OAAO,CAAC,cAAc;IAMtB;;;OAGG;IACH,OAAO,CAAC,cAAc;CAyCvB"}
|
|
@@ -42,6 +42,7 @@ export function verifyOfflineKey(key) {
|
|
|
42
42
|
export class KeyManager {
|
|
43
43
|
constructor() {
|
|
44
44
|
this.license = null;
|
|
45
|
+
this.isCheckingHeartbeat = false;
|
|
45
46
|
this.ensureCacheDir();
|
|
46
47
|
this.license = this.load();
|
|
47
48
|
}
|
|
@@ -51,14 +52,55 @@ export class KeyManager {
|
|
|
51
52
|
return false;
|
|
52
53
|
if (!this.license.isPro)
|
|
53
54
|
return false;
|
|
54
|
-
// Check expiry if set
|
|
55
|
+
// Check expiry if explicitly set by remote server
|
|
55
56
|
if (this.license.expiresAt) {
|
|
56
57
|
if (Date.now() > new Date(this.license.expiresAt).getTime()) {
|
|
57
58
|
return false;
|
|
58
59
|
}
|
|
59
60
|
}
|
|
61
|
+
// 1. Check Offline Grace Period (30 days maximum offline usage)
|
|
62
|
+
const lastValidated = this.license.lastValidatedAt || this.license.activatedAt;
|
|
63
|
+
const timeSinceLastValidation = Date.now() - new Date(lastValidated).getTime();
|
|
64
|
+
const thirtyDaysMs = 30 * 24 * 60 * 60 * 1000;
|
|
65
|
+
if (timeSinceLastValidation > thirtyDaysMs) {
|
|
66
|
+
console.warn(`\n[KeyManager] ā Offline grace period expired (>30 days since last remote check). Internet connection required to validate subscription.`);
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
// 2. Trigger silent background heartbeat validation if 7 days have passed
|
|
70
|
+
const sevenDaysMs = 7 * 24 * 60 * 60 * 1000;
|
|
71
|
+
if (timeSinceLastValidation > sevenDaysMs) {
|
|
72
|
+
this.checkHeartbeat().catch(() => { });
|
|
73
|
+
}
|
|
60
74
|
return true;
|
|
61
75
|
}
|
|
76
|
+
async checkHeartbeat() {
|
|
77
|
+
if (this.isCheckingHeartbeat || !this.license)
|
|
78
|
+
return;
|
|
79
|
+
this.isCheckingHeartbeat = true;
|
|
80
|
+
try {
|
|
81
|
+
const remoteData = await this.validateRemote(this.license.key);
|
|
82
|
+
if (remoteData.valid) {
|
|
83
|
+
// Extend validation timestamp
|
|
84
|
+
this.license.lastValidatedAt = new Date().toISOString();
|
|
85
|
+
if (remoteData.expiresAt)
|
|
86
|
+
this.license.expiresAt = remoteData.expiresAt;
|
|
87
|
+
this.save(this.license);
|
|
88
|
+
console.log(`[KeyManager] š Silent background heartbeat check: subscription valid. Expiry extended.`);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
// Subscription cancelled or payment failed! Deactivate immediately.
|
|
92
|
+
console.warn(`[KeyManager] ā Background subscription verification failed: license is invalid or inactive. Deactivating Pro features...`);
|
|
93
|
+
this.deactivate();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
// Offline fallback: fail silently to preserve offline grace period
|
|
98
|
+
console.log(`[KeyManager] Background subscription check skipped (unreachable: ${err.message}). Grace period remaining.`);
|
|
99
|
+
}
|
|
100
|
+
finally {
|
|
101
|
+
this.isCheckingHeartbeat = false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
62
104
|
getLicenseKey() {
|
|
63
105
|
return this.license?.key || null;
|
|
64
106
|
}
|
|
@@ -109,6 +151,7 @@ export class KeyManager {
|
|
|
109
151
|
tier: 'pro',
|
|
110
152
|
isPro: true,
|
|
111
153
|
activatedAt: new Date().toISOString(),
|
|
154
|
+
lastValidatedAt: new Date().toISOString(), // Initialize validation date
|
|
112
155
|
validatedRemotely,
|
|
113
156
|
expiresAt: remoteData?.expiresAt,
|
|
114
157
|
email: remoteData?.email,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KeyManager.js","sourceRoot":"","sources":["../../../src/proxy/KeyManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,iFAAiF;AAEjF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,EAAE,cAAc,CAAC,CAAC;AAChG,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;AAC1D,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AAChE,MAAM,YAAY,GAAG,2CAA2C,CAAC;AACjE,MAAM,mBAAmB,GAAG,IAAI,CAAC;AACjC,MAAM,gBAAgB,GAAG,iDAAiD,CAAC;AAC3E,MAAM,YAAY,GAAG,4CAA4C,CAAC;AAElE;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;IACrF,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAE1B,MAAM,OAAO,GAAG,aAAa,KAAK,IAAI,KAAK,GAAG,YAAY,EAAE,CAAC;IAC7D,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7F,MAAM,gBAAgB,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEtD,OAAO,QAAQ,KAAK,gBAAgB,CAAC;AACvC,CAAC;
|
|
1
|
+
{"version":3,"file":"KeyManager.js","sourceRoot":"","sources":["../../../src/proxy/KeyManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads text content from the macOS system clipboard using native pbpaste
|
|
3
|
+
*/
|
|
4
|
+
export declare function readClipboard(): string;
|
|
5
|
+
/**
|
|
6
|
+
* Writes text content to the macOS system clipboard using native pbcopy
|
|
7
|
+
*/
|
|
8
|
+
export declare function writeClipboard(text: string): void;
|
|
9
|
+
/**
|
|
10
|
+
* Returns true if the given text contains structural hallmarks of programming source code,
|
|
11
|
+
* avoiding normal text conversations, urls, or already squeezed blocks.
|
|
12
|
+
*/
|
|
13
|
+
export declare function isCodeBlock(text: string): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Start background polling of the system clipboard.
|
|
16
|
+
* Auto-squeezes copied code snippets and alerts the developer.
|
|
17
|
+
*/
|
|
18
|
+
export declare function startClipboardWatcher(intervalMs?: number): void;
|
|
19
|
+
//# sourceMappingURL=ClipboardWatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClipboardWatcher.d.ts","sourceRoot":"","sources":["../../../src/utils/ClipboardWatcher.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAMtC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAMjD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CA2BjD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,SAAO,GAAG,IAAI,CAwC7D"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { execSync, spawn } from 'child_process';
|
|
2
|
+
import { squeezeCode } from './ContextSqueezer';
|
|
3
|
+
/**
|
|
4
|
+
* Reads text content from the macOS system clipboard using native pbpaste
|
|
5
|
+
*/
|
|
6
|
+
export function readClipboard() {
|
|
7
|
+
try {
|
|
8
|
+
return execSync('pbpaste', { encoding: 'utf8' });
|
|
9
|
+
}
|
|
10
|
+
catch (err) {
|
|
11
|
+
return '';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Writes text content to the macOS system clipboard using native pbcopy
|
|
16
|
+
*/
|
|
17
|
+
export function writeClipboard(text) {
|
|
18
|
+
try {
|
|
19
|
+
const proc = spawn('pbcopy');
|
|
20
|
+
proc.stdin.write(text);
|
|
21
|
+
proc.stdin.end();
|
|
22
|
+
}
|
|
23
|
+
catch (err) { }
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Returns true if the given text contains structural hallmarks of programming source code,
|
|
27
|
+
* avoiding normal text conversations, urls, or already squeezed blocks.
|
|
28
|
+
*/
|
|
29
|
+
export function isCodeBlock(text) {
|
|
30
|
+
const trimmed = text.trim();
|
|
31
|
+
if (trimmed.length < 30)
|
|
32
|
+
return false;
|
|
33
|
+
// Prevent double squeezing by checking for our custom squeeze header comment
|
|
34
|
+
if (trimmed.includes('// [Lemma Clipboard Optimizer: Squeezed]'))
|
|
35
|
+
return false;
|
|
36
|
+
// If it is enclosed in a markdown code block, it's definitely code
|
|
37
|
+
if (trimmed.startsWith('```') && trimmed.endsWith('```'))
|
|
38
|
+
return true;
|
|
39
|
+
// Code indicators regex matcher
|
|
40
|
+
const codeMarkers = [
|
|
41
|
+
/function\s+\w+\s*\(/i,
|
|
42
|
+
/export\s+(?:default\s+)?(?:const|let|var|class|function)/,
|
|
43
|
+
/import\s+[\s\S]+?from\s+['"]/,
|
|
44
|
+
/require\(['"][a-zA-Z0-9_\-]+['"]\)/,
|
|
45
|
+
/class\s+\w+\s*(?:extends|\{)/,
|
|
46
|
+
/public\s+static\s+void\s+main/i,
|
|
47
|
+
/def\s+\w+\s*\(.*\)\s*:/, // Python
|
|
48
|
+
/<html>[\s\S]*<\/html>/i, // HTML
|
|
49
|
+
/^[ \t]*(?:const|let|var)\s+\w+\s*=/m,
|
|
50
|
+
/^[ \t]*if\s*\(.+\)\s*\{/m,
|
|
51
|
+
/^[ \t]*import\s+\w+/m,
|
|
52
|
+
/^[ \t]*package\s+\w+/m
|
|
53
|
+
];
|
|
54
|
+
return codeMarkers.some(regex => regex.test(text));
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Start background polling of the system clipboard.
|
|
58
|
+
* Auto-squeezes copied code snippets and alerts the developer.
|
|
59
|
+
*/
|
|
60
|
+
export function startClipboardWatcher(intervalMs = 1000) {
|
|
61
|
+
let lastClipboardContent = readClipboard();
|
|
62
|
+
console.log(`\nš [Clipboard] Telepathic Optimizer Active! Polling system clips every ${intervalMs}ms.`);
|
|
63
|
+
console.log(`š” Copy any block of code to squeeze it automatically for any chat IDE!\n`);
|
|
64
|
+
setInterval(() => {
|
|
65
|
+
try {
|
|
66
|
+
const currentContent = readClipboard();
|
|
67
|
+
if (currentContent === lastClipboardContent)
|
|
68
|
+
return;
|
|
69
|
+
// Update last content cache so we don't evaluate it again
|
|
70
|
+
lastClipboardContent = currentContent;
|
|
71
|
+
if (isCodeBlock(currentContent)) {
|
|
72
|
+
const originalLength = currentContent.length;
|
|
73
|
+
// Squeeze code block
|
|
74
|
+
const squeezed = squeezeCode(currentContent);
|
|
75
|
+
// Add header to identify squeezed clips and prevent infinite loops
|
|
76
|
+
const header = `// [Lemma Clipboard Optimizer: Squeezed]\n`;
|
|
77
|
+
const finalContent = `${header}${squeezed}`;
|
|
78
|
+
const squeezedLength = finalContent.length;
|
|
79
|
+
const savings = Math.max(0, originalLength - squeezedLength);
|
|
80
|
+
const percent = originalLength > 0 ? ((savings / originalLength) * 100).toFixed(1) : '0';
|
|
81
|
+
// Update the system clipboard
|
|
82
|
+
writeClipboard(finalContent);
|
|
83
|
+
// Cache the newly written content so we ignore it on the next poll
|
|
84
|
+
lastClipboardContent = finalContent;
|
|
85
|
+
console.log(`⨠[Clipboard] Automatically squeezed copied code block! (Saved ${percent}% context tokens! [${originalLength} ā ${squeezedLength} chars])`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
console.error(`[Clipboard] Polling error: ${err.message}`);
|
|
90
|
+
}
|
|
91
|
+
}, intervalMs);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=ClipboardWatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClipboardWatcher.js","sourceRoot":"","sources":["../../../src/utils/ClipboardWatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,10 +29,23 @@ export declare function treeShakeCode(code: string, query: string): string;
|
|
|
29
29
|
* Squeezes a block of source code
|
|
30
30
|
*/
|
|
31
31
|
export declare function squeezeCode(code: string): string;
|
|
32
|
+
/**
|
|
33
|
+
* Detects the file path from the first line comment inside a code block
|
|
34
|
+
*/
|
|
35
|
+
export declare function detectFilePath(code: string): string | null;
|
|
32
36
|
/**
|
|
33
37
|
* Squeezes all markdown code blocks (``` ... ```) inside a prompt string
|
|
34
38
|
*/
|
|
35
|
-
export declare function squeezePrompt(prompt: string, query?: string): SqueezeResult;
|
|
39
|
+
export declare function squeezePrompt(prompt: string, query?: string, fileHistory?: Map<string, string>): SqueezeResult;
|
|
40
|
+
/**
|
|
41
|
+
* Extract plain text string content from message formats (string or content block arrays)
|
|
42
|
+
*/
|
|
43
|
+
export declare function extractContentText(content: any): string;
|
|
44
|
+
/**
|
|
45
|
+
* Decimates older conversational history turns by replacing them with high-density,
|
|
46
|
+
* single-line structured summaries of what was asked and what was resolved.
|
|
47
|
+
*/
|
|
48
|
+
export declare function decimateHistory(messages: any[]): any[];
|
|
36
49
|
/**
|
|
37
50
|
* Prunes conversational message history to compress large repeated codeblocks in historical messages.
|
|
38
51
|
* Keeps only the most recent message's codeblocks fully intact, and prunes older historical messages
|
|
@@ -42,4 +55,17 @@ export declare function pruneHistoryMessages(messages: any[]): {
|
|
|
42
55
|
messages: any[];
|
|
43
56
|
tokensSavedEstimate: number;
|
|
44
57
|
};
|
|
58
|
+
/**
|
|
59
|
+
* Strip import statements and require declarations from JavaScript, TypeScript, Python and CSS code
|
|
60
|
+
*/
|
|
61
|
+
export declare function stripImports(code: string): string;
|
|
62
|
+
/**
|
|
63
|
+
* Generate a highly compact, unified line-by-line diff between two versions of code blocks
|
|
64
|
+
*/
|
|
65
|
+
export declare function generateAstDiff(oldCode: string, newCode: string): string;
|
|
66
|
+
/**
|
|
67
|
+
* Filters large codebase search results / RAG dumps in the prompt, keeping only the most
|
|
68
|
+
* semantically relevant snippets based on keyword intersection (Jaccard similarity).
|
|
69
|
+
*/
|
|
70
|
+
export declare function filterHighDensityRAG(prompt: string, query: string): string;
|
|
45
71
|
//# sourceMappingURL=ContextSqueezer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextSqueezer.d.ts","sourceRoot":"","sources":["../../../src/utils/ContextSqueezer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgClD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOtD;AAGD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA0BxE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAoEjE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"ContextSqueezer.d.ts","sourceRoot":"","sources":["../../../src/utils/ContextSqueezer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgClD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOtD;AAGD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA0BxE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAoEjE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAa1D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAW,EAClB,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,aAAa,CA8Df;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,CA0BvD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,CAkDtD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG;IAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAA;CAAE,CAqDtG;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgCjD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAoExE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAiD1E"}
|