nuxs-capsule 0.1.1
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 +21 -0
- package/bin/nuxs-capsule-intercept.js +4 -0
- package/bin/nuxs-capsule.js +20 -0
- package/dist/install.d.ts +17 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +243 -0
- package/dist/install.js.map +1 -0
- package/dist/intercept.d.ts +19 -0
- package/dist/intercept.d.ts.map +1 -0
- package/dist/intercept.js +232 -0
- package/dist/intercept.js.map +1 -0
- package/dist/lib/fileStat.d.ts +20 -0
- package/dist/lib/fileStat.d.ts.map +1 -0
- package/dist/lib/fileStat.js +71 -0
- package/dist/lib/fileStat.js.map +1 -0
- package/dist/lib/fingerprint.d.ts +10 -0
- package/dist/lib/fingerprint.d.ts.map +1 -0
- package/dist/lib/fingerprint.js +41 -0
- package/dist/lib/fingerprint.js.map +1 -0
- package/dist/lib/tokenCount.d.ts +13 -0
- package/dist/lib/tokenCount.d.ts.map +1 -0
- package/dist/lib/tokenCount.js +32 -0
- package/dist/lib/tokenCount.js.map +1 -0
- package/dist/license/check.d.ts +14 -0
- package/dist/license/check.d.ts.map +1 -0
- package/dist/license/check.js +141 -0
- package/dist/license/check.js.map +1 -0
- package/dist/providers/llmClient.d.ts +20 -0
- package/dist/providers/llmClient.d.ts.map +1 -0
- package/dist/providers/llmClient.js +40 -0
- package/dist/providers/llmClient.js.map +1 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +268 -0
- package/dist/server.js.map +1 -0
- package/dist/setup.d.ts +14 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +135 -0
- package/dist/setup.js.map +1 -0
- package/dist/telemetry/usage.d.ts +19 -0
- package/dist/telemetry/usage.d.ts.map +1 -0
- package/dist/telemetry/usage.js +114 -0
- package/dist/telemetry/usage.js.map +1 -0
- package/dist/tools/apiCapsule.d.ts +16 -0
- package/dist/tools/apiCapsule.d.ts.map +1 -0
- package/dist/tools/apiCapsule.js +169 -0
- package/dist/tools/apiCapsule.js.map +1 -0
- package/dist/tools/eventsCapsule.d.ts +15 -0
- package/dist/tools/eventsCapsule.d.ts.map +1 -0
- package/dist/tools/eventsCapsule.js +72 -0
- package/dist/tools/eventsCapsule.js.map +1 -0
- package/dist/tools/logCapsule.d.ts +38 -0
- package/dist/tools/logCapsule.d.ts.map +1 -0
- package/dist/tools/logCapsule.js +283 -0
- package/dist/tools/logCapsule.js.map +1 -0
- package/dist/tools/networkCapsule.d.ts +18 -0
- package/dist/tools/networkCapsule.d.ts.map +1 -0
- package/dist/tools/networkCapsule.js +151 -0
- package/dist/tools/networkCapsule.js.map +1 -0
- package/dist/tools/sessionCapsule.d.ts +21 -0
- package/dist/tools/sessionCapsule.d.ts.map +1 -0
- package/dist/tools/sessionCapsule.js +174 -0
- package/dist/tools/sessionCapsule.js.map +1 -0
- package/dist/tools/sqlCapsule.d.ts +17 -0
- package/dist/tools/sqlCapsule.d.ts.map +1 -0
- package/dist/tools/sqlCapsule.js +144 -0
- package/dist/tools/sqlCapsule.js.map +1 -0
- package/dist/tools/stackCapsule.d.ts +9 -0
- package/dist/tools/stackCapsule.d.ts.map +1 -0
- package/dist/tools/stackCapsule.js +132 -0
- package/dist/tools/stackCapsule.js.map +1 -0
- package/dist/tools/threadsCapsule.d.ts +14 -0
- package/dist/tools/threadsCapsule.d.ts.map +1 -0
- package/dist/tools/threadsCapsule.js +77 -0
- package/dist/tools/threadsCapsule.js.map +1 -0
- package/dist/types.d.ts +199 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/wrap.d.ts +14 -0
- package/dist/wrap.d.ts.map +1 -0
- package/dist/wrap.js +100 -0
- package/dist/wrap.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers de I/O — stat, read, hash. Tudo síncrono onde rapidez importa
|
|
3
|
+
* (hook tem que decidir em <50ms).
|
|
4
|
+
*/
|
|
5
|
+
import { statSync, readFileSync, openSync, readSync, closeSync, mkdirSync, existsSync } from 'node:fs';
|
|
6
|
+
import { createHash } from 'node:crypto';
|
|
7
|
+
import { dirname } from 'node:path';
|
|
8
|
+
export function fileInfo(path) {
|
|
9
|
+
try {
|
|
10
|
+
const s = statSync(path);
|
|
11
|
+
const dotIdx = path.lastIndexOf('.');
|
|
12
|
+
const ext = dotIdx > 0 ? path.slice(dotIdx).toLowerCase() : '';
|
|
13
|
+
return { exists: true, size: s.size, mtimeMs: s.mtimeMs, ext };
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return { exists: false, size: 0, mtimeMs: 0, ext: '' };
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/** Lê apenas os primeiros N bytes — pra sniff de content. */
|
|
20
|
+
export function readFirstBytes(path, n) {
|
|
21
|
+
try {
|
|
22
|
+
const fd = openSync(path, 'r');
|
|
23
|
+
const buf = Buffer.alloc(n);
|
|
24
|
+
const bytes = readSync(fd, buf, 0, n, 0);
|
|
25
|
+
closeSync(fd);
|
|
26
|
+
return buf.slice(0, bytes).toString('utf8');
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return '';
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Hash estável pra cache key (file_path + mtime). */
|
|
33
|
+
export function cacheKey(path, mtimeMs) {
|
|
34
|
+
return createHash('sha256').update(`${path}|${mtimeMs}`).digest('hex').slice(0, 32);
|
|
35
|
+
}
|
|
36
|
+
export function ensureDir(path) {
|
|
37
|
+
if (!existsSync(path)) {
|
|
38
|
+
mkdirSync(path, { recursive: true });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function ensureParentDir(filePath) {
|
|
42
|
+
ensureDir(dirname(filePath));
|
|
43
|
+
}
|
|
44
|
+
/** Tenta detectar agente que invocou (via env vars). */
|
|
45
|
+
export function detectAgent() {
|
|
46
|
+
// Variables comuns que cada agente seta:
|
|
47
|
+
if (process.env.CLAUDE_CODE_SESSION_ID)
|
|
48
|
+
return 'claude_code';
|
|
49
|
+
if (process.env.CURSOR_AGENT)
|
|
50
|
+
return 'cursor';
|
|
51
|
+
if (process.env.OPENCLAW_SESSION)
|
|
52
|
+
return 'openclaw';
|
|
53
|
+
if (process.env.HERMES_AGENT)
|
|
54
|
+
return 'hermes';
|
|
55
|
+
if (process.env.CODEX_SESSION)
|
|
56
|
+
return 'codex';
|
|
57
|
+
// Detecta via parent process name
|
|
58
|
+
const ppid = process.ppid;
|
|
59
|
+
try {
|
|
60
|
+
const cmdline = readFileSync(`/proc/${ppid}/comm`, 'utf8').trim().toLowerCase();
|
|
61
|
+
if (cmdline.includes('claude'))
|
|
62
|
+
return 'claude_code';
|
|
63
|
+
if (cmdline.includes('cursor'))
|
|
64
|
+
return 'cursor';
|
|
65
|
+
if (cmdline.includes('openclaw'))
|
|
66
|
+
return 'openclaw';
|
|
67
|
+
}
|
|
68
|
+
catch { /* Linux only */ }
|
|
69
|
+
return 'unknown';
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=fileStat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileStat.js","sourceRoot":"","sources":["../../src/lib/fileStat.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACvG,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IACzD,CAAC;AACH,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,CAAS;IACpD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACzC,SAAS,CAAC,EAAE,CAAC,CAAC;QACd,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,OAAe;IACpD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,WAAW;IACzB,yCAAyC;IACzC,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB;QAAE,OAAO,aAAa,CAAC;IAC7D,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY;QAAE,OAAO,QAAQ,CAAC;IAC9C,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB;QAAE,OAAO,UAAU,CAAC;IACpD,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY;QAAE,OAAO,QAAQ,CAAC;IAC9C,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa;QAAE,OAAO,OAAO,CAAC;IAC9C,kCAAkC;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,IAAI,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAChF,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,aAAa,CAAC;QACrD,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,QAAQ,CAAC;QAChD,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,OAAO,UAAU,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC5B,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Machine fingerprint pra anti-fraude de license.
|
|
3
|
+
* Hash determinístico de MAC + hostname + OS. Anônimo (hash SHA256).
|
|
4
|
+
* Nunca expõe os componentes brutos.
|
|
5
|
+
*/
|
|
6
|
+
/** Retorna fingerprint estável da máquina. Cacheia por sessão. */
|
|
7
|
+
export declare function getMachineFingerprint(): string;
|
|
8
|
+
/** OS detectável pra telemetria (sem expor versão precisa). */
|
|
9
|
+
export declare function getOsKind(): 'darwin' | 'linux' | 'win32' | 'other';
|
|
10
|
+
//# sourceMappingURL=fingerprint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../src/lib/fingerprint.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,kEAAkE;AAClE,wBAAgB,qBAAqB,IAAI,MAAM,CAkB9C;AAED,+DAA+D;AAC/D,wBAAgB,SAAS,IAAI,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAIlE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Machine fingerprint pra anti-fraude de license.
|
|
3
|
+
* Hash determinístico de MAC + hostname + OS. Anônimo (hash SHA256).
|
|
4
|
+
* Nunca expõe os componentes brutos.
|
|
5
|
+
*/
|
|
6
|
+
import { createHash } from 'node:crypto';
|
|
7
|
+
import { hostname, networkInterfaces, platform, arch } from 'node:os';
|
|
8
|
+
let _cached = null;
|
|
9
|
+
/** Retorna fingerprint estável da máquina. Cacheia por sessão. */
|
|
10
|
+
export function getMachineFingerprint() {
|
|
11
|
+
if (_cached)
|
|
12
|
+
return _cached;
|
|
13
|
+
// 1ª MAC não-virtual encontrado (skip lo, 00:00:00, etc).
|
|
14
|
+
let mac = '';
|
|
15
|
+
const nics = networkInterfaces();
|
|
16
|
+
for (const ifaces of Object.values(nics)) {
|
|
17
|
+
if (!ifaces)
|
|
18
|
+
continue;
|
|
19
|
+
for (const iface of ifaces) {
|
|
20
|
+
if (iface.internal)
|
|
21
|
+
continue;
|
|
22
|
+
if (!iface.mac || iface.mac === '00:00:00:00:00:00')
|
|
23
|
+
continue;
|
|
24
|
+
mac = iface.mac;
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
if (mac)
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
const seed = `${mac}|${hostname()}|${platform()}|${arch()}`;
|
|
31
|
+
_cached = createHash('sha256').update(seed).digest('hex').slice(0, 32);
|
|
32
|
+
return _cached;
|
|
33
|
+
}
|
|
34
|
+
/** OS detectável pra telemetria (sem expor versão precisa). */
|
|
35
|
+
export function getOsKind() {
|
|
36
|
+
const p = platform();
|
|
37
|
+
if (p === 'darwin' || p === 'linux' || p === 'win32')
|
|
38
|
+
return p;
|
|
39
|
+
return 'other';
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=fingerprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../src/lib/fingerprint.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAEtE,IAAI,OAAO,GAAkB,IAAI,CAAC;AAElC,kEAAkE;AAClE,MAAM,UAAU,qBAAqB;IACnC,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,0DAA0D;IAC1D,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;IACjC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,QAAQ;gBAAE,SAAS;YAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,mBAAmB;gBAAE,SAAS;YAC9D,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;YAChB,MAAM;QACR,CAAC;QACD,IAAI,GAAG;YAAE,MAAM;IACjB,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,GAAG,IAAI,QAAQ,EAAE,IAAI,QAAQ,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;IAC5D,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvE,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,SAAS;IACvB,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;IACrB,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,OAAO;QAAE,OAAO,CAAC,CAAC;IAC/D,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Estimativa de tokens. Não usa tiktoken (bind nativo, complica binário standalone).
|
|
3
|
+
* Heurística: 1 token ≈ 4 chars em inglês. Mais conservador pra UTF-8 com PT-BR
|
|
4
|
+
* (mais bytes por char) — uso 3.5 chars/token.
|
|
5
|
+
*
|
|
6
|
+
* Diferença vs tiktoken é ~10%. Aceitável pra telemetria de economia
|
|
7
|
+
* (não pra billing direto). Quando virar billing direto, troca por tiktoken.
|
|
8
|
+
*/
|
|
9
|
+
export declare function estimateTokens(text: string): number;
|
|
10
|
+
export declare function estimateTokensFromBytes(bytes: number): number;
|
|
11
|
+
/** Custo estimado em USD pra entrada+saída num provider. */
|
|
12
|
+
export declare function estimateCostUsd(inputTokens: number, outputTokens: number, provider: string): number;
|
|
13
|
+
//# sourceMappingURL=tokenCount.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenCount.d.ts","sourceRoot":"","sources":["../../src/lib/tokenCount.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI7D;AAED,4DAA4D;AAC5D,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,MAAM,CAWR"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Estimativa de tokens. Não usa tiktoken (bind nativo, complica binário standalone).
|
|
3
|
+
* Heurística: 1 token ≈ 4 chars em inglês. Mais conservador pra UTF-8 com PT-BR
|
|
4
|
+
* (mais bytes por char) — uso 3.5 chars/token.
|
|
5
|
+
*
|
|
6
|
+
* Diferença vs tiktoken é ~10%. Aceitável pra telemetria de economia
|
|
7
|
+
* (não pra billing direto). Quando virar billing direto, troca por tiktoken.
|
|
8
|
+
*/
|
|
9
|
+
export function estimateTokens(text) {
|
|
10
|
+
if (!text)
|
|
11
|
+
return 0;
|
|
12
|
+
return Math.ceil(text.length / 3.5);
|
|
13
|
+
}
|
|
14
|
+
export function estimateTokensFromBytes(bytes) {
|
|
15
|
+
// UTF-8 chars vs bytes — assume razão ~1.1 bytes/char pra PT-BR mix
|
|
16
|
+
const chars = bytes / 1.1;
|
|
17
|
+
return Math.ceil(chars / 3.5);
|
|
18
|
+
}
|
|
19
|
+
/** Custo estimado em USD pra entrada+saída num provider. */
|
|
20
|
+
export function estimateCostUsd(inputTokens, outputTokens, provider) {
|
|
21
|
+
const PRICING = {
|
|
22
|
+
'algorithm': { input: 0, output: 0 },
|
|
23
|
+
'deepseek-v3': { input: 0.27, output: 1.10 },
|
|
24
|
+
'gemini-flash-2.5': { input: 0.075, output: 0.30 },
|
|
25
|
+
'groq-llama': { input: 0.59, output: 0.79 },
|
|
26
|
+
'haiku-4-5': { input: 0.25, output: 1.25 },
|
|
27
|
+
'sonnet-4-6': { input: 3.00, output: 15.00 }
|
|
28
|
+
};
|
|
29
|
+
const p = PRICING[provider] ?? PRICING['haiku-4-5'];
|
|
30
|
+
return (inputTokens / 1_000_000) * p.input + (outputTokens / 1_000_000) * p.output;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=tokenCount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenCount.js","sourceRoot":"","sources":["../../src/lib/tokenCount.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC;IACpB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACnD,oEAAoE;IACpE,MAAM,KAAK,GAAG,KAAK,GAAG,GAAG,CAAC;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,eAAe,CAC7B,WAAmB,EACnB,YAAoB,EACpB,QAAgB;IAEhB,MAAM,OAAO,GAAsD;QACjE,WAAW,EAAQ,EAAE,KAAK,EAAE,CAAC,EAAO,MAAM,EAAE,CAAC,EAAE;QAC/C,aAAa,EAAM,EAAE,KAAK,EAAE,IAAI,EAAI,MAAM,EAAE,IAAI,EAAE;QAClD,kBAAkB,EAAC,EAAE,KAAK,EAAE,KAAK,EAAG,MAAM,EAAE,IAAI,EAAE;QAClD,YAAY,EAAO,EAAE,KAAK,EAAE,IAAI,EAAI,MAAM,EAAE,IAAI,EAAE;QAClD,WAAW,EAAQ,EAAE,KAAK,EAAE,IAAI,EAAI,MAAM,EAAE,IAAI,EAAE;QAClD,YAAY,EAAO,EAAE,KAAK,EAAE,IAAI,EAAI,MAAM,EAAE,KAAK,EAAE;KACpD,CAAC;IACF,MAAM,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,WAAW,CAAE,CAAC;IACrD,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;AACrF,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* License check com cache 24h em ~/.nuxs/license.json.
|
|
3
|
+
* Offline > 7d cai pra Free mode (limitado).
|
|
4
|
+
*/
|
|
5
|
+
import type { LicenseInfo, LicenseTier } from '../types.js';
|
|
6
|
+
export declare function getLicenseKey(): string | null;
|
|
7
|
+
export declare function setLicenseKey(key: string): void;
|
|
8
|
+
/** Valida licença. Usa cache 24h. Offline >7d cai pra Free. */
|
|
9
|
+
export declare function validateLicense(): Promise<LicenseInfo>;
|
|
10
|
+
/** Checa se um tipo de cápsula é permitido pro tier. */
|
|
11
|
+
export declare function isCapsuleAllowed(tier: LicenseTier, capsuleType: string): boolean;
|
|
12
|
+
/** Limite diário Free de capsulas LLM-based. */
|
|
13
|
+
export declare const FREE_DAILY_LLM_LIMIT = 50;
|
|
14
|
+
//# sourceMappingURL=check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/license/check.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAiB5D,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAU7C;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAW/C;AAED,+DAA+D;AAC/D,wBAAsB,eAAe,IAAI,OAAO,CAAC,WAAW,CAAC,CA0E5D;AA8BD,wDAAwD;AACxD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAOhF;AAED,gDAAgD;AAChD,eAAO,MAAM,oBAAoB,KAAK,CAAC"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* License check com cache 24h em ~/.nuxs/license.json.
|
|
3
|
+
* Offline > 7d cai pra Free mode (limitado).
|
|
4
|
+
*/
|
|
5
|
+
import { readFileSync, writeFileSync, existsSync } from 'node:fs';
|
|
6
|
+
import { homedir } from 'node:os';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { ensureDir } from '../lib/fileStat.js';
|
|
9
|
+
import { getMachineFingerprint, getOsKind } from '../lib/fingerprint.js';
|
|
10
|
+
const NUXS_DIR = join(homedir(), '.nuxs');
|
|
11
|
+
const LICENSE_FILE = join(NUXS_DIR, 'license.json');
|
|
12
|
+
const CACHE_TTL_MS = 24 * 60 * 60 * 1000;
|
|
13
|
+
const OFFLINE_GRACE_MS = 7 * 24 * 60 * 60 * 1000;
|
|
14
|
+
const SERVER_URL = process.env.NUXS_SERVER_URL ?? 'https://pixeldesk-api.onrender.com';
|
|
15
|
+
export function getLicenseKey() {
|
|
16
|
+
// Ordem: env var > arquivo > nulo (Free anônimo)
|
|
17
|
+
if (process.env.NUXS_LICENSE_KEY)
|
|
18
|
+
return process.env.NUXS_LICENSE_KEY;
|
|
19
|
+
if (!existsSync(LICENSE_FILE))
|
|
20
|
+
return null;
|
|
21
|
+
try {
|
|
22
|
+
const data = JSON.parse(readFileSync(LICENSE_FILE, 'utf8'));
|
|
23
|
+
return data.license_key;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export function setLicenseKey(key) {
|
|
30
|
+
ensureDir(NUXS_DIR);
|
|
31
|
+
const now = new Date().toISOString();
|
|
32
|
+
const data = {
|
|
33
|
+
license_key: key,
|
|
34
|
+
tier: 'free',
|
|
35
|
+
expires_at: null,
|
|
36
|
+
cached_at: now,
|
|
37
|
+
last_successful_check: now
|
|
38
|
+
};
|
|
39
|
+
writeFileSync(LICENSE_FILE, JSON.stringify(data, null, 2));
|
|
40
|
+
}
|
|
41
|
+
/** Valida licença. Usa cache 24h. Offline >7d cai pra Free. */
|
|
42
|
+
export async function validateLicense() {
|
|
43
|
+
const key = getLicenseKey();
|
|
44
|
+
if (!key) {
|
|
45
|
+
return { valid: true, tier: 'free', expires_at: null };
|
|
46
|
+
}
|
|
47
|
+
// Lê cache
|
|
48
|
+
let cached = null;
|
|
49
|
+
if (existsSync(LICENSE_FILE)) {
|
|
50
|
+
try {
|
|
51
|
+
cached = JSON.parse(readFileSync(LICENSE_FILE, 'utf8'));
|
|
52
|
+
}
|
|
53
|
+
catch { /* arquivo corrupto */ }
|
|
54
|
+
}
|
|
55
|
+
const now = Date.now();
|
|
56
|
+
const cachedAt = cached?.cached_at ? new Date(cached.cached_at).getTime() : 0;
|
|
57
|
+
// Cache fresh (< 24h)? Devolve.
|
|
58
|
+
if (cached && (now - cachedAt) < CACHE_TTL_MS) {
|
|
59
|
+
return {
|
|
60
|
+
valid: true,
|
|
61
|
+
tier: cached.tier,
|
|
62
|
+
expires_at: cached.expires_at
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
// Cache stale — tenta validar online
|
|
66
|
+
try {
|
|
67
|
+
const fingerprint = getMachineFingerprint();
|
|
68
|
+
const res = await fetch(`${SERVER_URL}/api/license/validate`, {
|
|
69
|
+
method: 'POST',
|
|
70
|
+
headers: { 'Content-Type': 'application/json' },
|
|
71
|
+
body: JSON.stringify({
|
|
72
|
+
license_key: key,
|
|
73
|
+
machine_fingerprint: fingerprint,
|
|
74
|
+
os: getOsKind(),
|
|
75
|
+
agent_detected: 'unknown'
|
|
76
|
+
}),
|
|
77
|
+
// Timeout curto (5s) — se cair, usa fallback
|
|
78
|
+
signal: AbortSignal.timeout(5000)
|
|
79
|
+
});
|
|
80
|
+
if (!res.ok) {
|
|
81
|
+
// Server retornou erro — provavelmente license inválida
|
|
82
|
+
return useFallback(cached);
|
|
83
|
+
}
|
|
84
|
+
const data = await res.json();
|
|
85
|
+
// Atualiza cache
|
|
86
|
+
ensureDir(NUXS_DIR);
|
|
87
|
+
const fresh = {
|
|
88
|
+
license_key: key,
|
|
89
|
+
tier: data.tier,
|
|
90
|
+
expires_at: data.expires_at,
|
|
91
|
+
cached_at: new Date(now).toISOString(),
|
|
92
|
+
last_successful_check: new Date(now).toISOString()
|
|
93
|
+
};
|
|
94
|
+
writeFileSync(LICENSE_FILE, JSON.stringify(fresh, null, 2));
|
|
95
|
+
return {
|
|
96
|
+
valid: data.valid,
|
|
97
|
+
tier: data.tier,
|
|
98
|
+
expires_at: data.expires_at
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
// Network falhou — usa fallback
|
|
103
|
+
return useFallback(cached);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function useFallback(cached) {
|
|
107
|
+
if (!cached) {
|
|
108
|
+
// Sem cache, sem internet — Free anônimo
|
|
109
|
+
return { valid: true, tier: 'free', expires_at: null };
|
|
110
|
+
}
|
|
111
|
+
// Tem cache mas offline. Quanto tempo offline?
|
|
112
|
+
const lastSuccess = new Date(cached.last_successful_check).getTime();
|
|
113
|
+
const offlineMs = Date.now() - lastSuccess;
|
|
114
|
+
if (offlineMs > OFFLINE_GRACE_MS) {
|
|
115
|
+
// > 7d offline → cai pra Free
|
|
116
|
+
return {
|
|
117
|
+
valid: true,
|
|
118
|
+
tier: 'free',
|
|
119
|
+
expires_at: null,
|
|
120
|
+
error: 'offline_too_long_downgraded_to_free'
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
// < 7d offline → usa cache mesmo stale
|
|
124
|
+
return {
|
|
125
|
+
valid: true,
|
|
126
|
+
tier: cached.tier,
|
|
127
|
+
expires_at: cached.expires_at
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/** Checa se um tipo de cápsula é permitido pro tier. */
|
|
131
|
+
export function isCapsuleAllowed(tier, capsuleType) {
|
|
132
|
+
// Algoritmo puro liberado pra todos
|
|
133
|
+
const FREE_CAPSULES = ['network', 'api'];
|
|
134
|
+
if (FREE_CAPSULES.includes(capsuleType))
|
|
135
|
+
return true;
|
|
136
|
+
// LLM-based: precisa tier pago
|
|
137
|
+
return tier !== 'free';
|
|
138
|
+
}
|
|
139
|
+
/** Limite diário Free de capsulas LLM-based. */
|
|
140
|
+
export const FREE_DAILY_LLM_LIMIT = 50;
|
|
141
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/license/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cliente que bate em /api/capsule/compress no backend Nuxs.
|
|
3
|
+
* Multi-provider transparente — server escolhe DeepSeek/Gemini/Groq/Haiku.
|
|
4
|
+
* Cliente nunca sabe qual rodou.
|
|
5
|
+
*/
|
|
6
|
+
export interface CompressRequest {
|
|
7
|
+
capsule_type: string;
|
|
8
|
+
prompt: string;
|
|
9
|
+
input: unknown;
|
|
10
|
+
model_preference?: 'cheap' | 'balanced' | 'best';
|
|
11
|
+
}
|
|
12
|
+
export interface CompressResponse {
|
|
13
|
+
result: unknown;
|
|
14
|
+
provider_used: string;
|
|
15
|
+
input_tokens: number;
|
|
16
|
+
output_tokens: number;
|
|
17
|
+
latency_ms: number;
|
|
18
|
+
}
|
|
19
|
+
export declare function compressViaLlm(req: CompressRequest): Promise<CompressResponse | null>;
|
|
20
|
+
//# sourceMappingURL=llmClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llmClient.d.ts","sourceRoot":"","sources":["../../src/providers/llmClient.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,gBAAgB,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;CAClD;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAiC3F"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cliente que bate em /api/capsule/compress no backend Nuxs.
|
|
3
|
+
* Multi-provider transparente — server escolhe DeepSeek/Gemini/Groq/Haiku.
|
|
4
|
+
* Cliente nunca sabe qual rodou.
|
|
5
|
+
*/
|
|
6
|
+
import { getLicenseKey } from '../license/check.js';
|
|
7
|
+
const SERVER_URL = process.env.NUXS_SERVER_URL ?? 'https://pixeldesk-api.onrender.com';
|
|
8
|
+
export async function compressViaLlm(req) {
|
|
9
|
+
const licenseKey = getLicenseKey();
|
|
10
|
+
if (!licenseKey) {
|
|
11
|
+
// Free anônimo não tem acesso a LLM-based capsulas
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
const startedAt = Date.now();
|
|
15
|
+
try {
|
|
16
|
+
const res = await fetch(`${SERVER_URL}/api/capsule/compress`, {
|
|
17
|
+
method: 'POST',
|
|
18
|
+
headers: {
|
|
19
|
+
'Content-Type': 'application/json',
|
|
20
|
+
'X-Nuxs-License': licenseKey
|
|
21
|
+
},
|
|
22
|
+
body: JSON.stringify(req),
|
|
23
|
+
signal: AbortSignal.timeout(30_000) // capsulas podem demorar
|
|
24
|
+
});
|
|
25
|
+
if (!res.ok) {
|
|
26
|
+
console.warn(`[nuxs-capsule] compress failed HTTP ${res.status}`);
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const data = await res.json();
|
|
30
|
+
return {
|
|
31
|
+
...data,
|
|
32
|
+
latency_ms: Date.now() - startedAt
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
console.warn(`[nuxs-capsule] compress error:`, err.message);
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=llmClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llmClient.js","sourceRoot":"","sources":["../../src/providers/llmClient.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,oCAAoC,CAAC;AAiBvF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAoB;IACvD,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,mDAAmD;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,UAAU,uBAAuB,EAAE;YAC5D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,gBAAgB,EAAE,UAAU;aAC7B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;YACzB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,yBAAyB;SAC9D,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,uCAAuC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAClE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAsB,CAAC;QAClD,OAAO;YACL,GAAG,IAAI;YACP,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;SACnC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,gCAAgC,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP server `@nuxs/capsule`.
|
|
3
|
+
*
|
|
4
|
+
* Expõe 7 tools que agentes IA podem chamar explicitamente
|
|
5
|
+
* (complementa o hook PreToolUse, que age automático).
|
|
6
|
+
*
|
|
7
|
+
* Descrições agressivas pros agentes preferirem usar antes do Read raw.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|