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
package/dist/server.js
ADDED
|
@@ -0,0 +1,268 @@
|
|
|
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
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
10
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
11
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
12
|
+
import { readFileSync } from 'node:fs';
|
|
13
|
+
import { networkCapsuleFromFile } from './tools/networkCapsule.js';
|
|
14
|
+
import { apiCapsule } from './tools/apiCapsule.js';
|
|
15
|
+
import { stackCapsule } from './tools/stackCapsule.js';
|
|
16
|
+
import { threadsCapsule } from './tools/threadsCapsule.js';
|
|
17
|
+
import { eventsCapsule } from './tools/eventsCapsule.js';
|
|
18
|
+
import { sessionCapsule } from './tools/sessionCapsule.js';
|
|
19
|
+
import { sqlCapsule } from './tools/sqlCapsule.js';
|
|
20
|
+
import { logCapsuleFromString, logCapsuleFromFile } from './tools/logCapsule.js';
|
|
21
|
+
import { validateLicense, isCapsuleAllowed } from './license/check.js';
|
|
22
|
+
const server = new Server({ name: 'nuxs-capsule', version: '0.1.0' }, { capabilities: { tools: {} } });
|
|
23
|
+
const TOOL_DEFINITIONS = [
|
|
24
|
+
{
|
|
25
|
+
name: 'network_capsule',
|
|
26
|
+
description: '⚠️ ALWAYS use this BEFORE Read on .har files. ' +
|
|
27
|
+
'Compresses 50-100k tokens to 1.5k (66×). Algorithm-only, zero LLM cost. ' +
|
|
28
|
+
'Returns critical_path, top slowest, errors, by_host, blocking. ' +
|
|
29
|
+
'Reading a HAR raw will likely overflow your context window.',
|
|
30
|
+
inputSchema: {
|
|
31
|
+
type: 'object',
|
|
32
|
+
properties: {
|
|
33
|
+
file_path: { type: 'string', description: 'Absolute path to .har file' }
|
|
34
|
+
},
|
|
35
|
+
required: ['file_path']
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'api_capsule',
|
|
40
|
+
description: '⚠️ ALWAYS use this BEFORE Read on API JSON responses >20KB. ' +
|
|
41
|
+
'Compresses gigantes responses to 2k tokens with schema + diverse samples + field stats (50×). ' +
|
|
42
|
+
'Algorithm-only, zero cost.',
|
|
43
|
+
inputSchema: {
|
|
44
|
+
type: 'object',
|
|
45
|
+
properties: {
|
|
46
|
+
json: { type: 'string', description: 'JSON string or path to .json file' },
|
|
47
|
+
source_url: { type: 'string', description: 'Optional source URL for context' }
|
|
48
|
+
},
|
|
49
|
+
required: ['json']
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'stack_capsule',
|
|
54
|
+
description: 'Use on stack traces >100 lines (Sentry, browser console, Node crash). ' +
|
|
55
|
+
'Extracts root component + trigger + chain + suggested fix (16×). ' +
|
|
56
|
+
'Costs ~$0.0001 per capsule. Requires paid tier.',
|
|
57
|
+
inputSchema: {
|
|
58
|
+
type: 'object',
|
|
59
|
+
properties: {
|
|
60
|
+
trace: { type: 'string', description: 'Stack trace text' },
|
|
61
|
+
source: { type: 'string', enum: ['sentry', 'console', 'node'] }
|
|
62
|
+
},
|
|
63
|
+
required: ['trace']
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: 'threads_capsule',
|
|
68
|
+
description: 'Use on discussion threads >20 comments (PR review, Slack, Discord, Linear). ' +
|
|
69
|
+
'Extracts final decision + reasoning + action_items + unresolved (20×). ' +
|
|
70
|
+
'Costs ~$0.0008 per capsule. Requires paid tier.',
|
|
71
|
+
inputSchema: {
|
|
72
|
+
type: 'object',
|
|
73
|
+
properties: {
|
|
74
|
+
messages: {
|
|
75
|
+
type: 'array',
|
|
76
|
+
items: {
|
|
77
|
+
type: 'object',
|
|
78
|
+
properties: {
|
|
79
|
+
author: { type: 'string' },
|
|
80
|
+
text: { type: 'string' },
|
|
81
|
+
timestamp: { type: 'string' }
|
|
82
|
+
},
|
|
83
|
+
required: ['author', 'text']
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
source: {
|
|
87
|
+
type: 'string',
|
|
88
|
+
enum: ['github_pr', 'slack', 'discord', 'linear', 'jira', 'other']
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
required: ['messages']
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
name: 'events_capsule',
|
|
96
|
+
description: 'Use on product event dumps (Mixpanel, PostHog, Amplitude). ' +
|
|
97
|
+
'Extracts funnel + drop_offs + anomalies + top_events (30×). ' +
|
|
98
|
+
'Costs ~$0.0005 per capsule. Requires paid tier.',
|
|
99
|
+
inputSchema: {
|
|
100
|
+
type: 'object',
|
|
101
|
+
properties: {
|
|
102
|
+
events: {
|
|
103
|
+
type: 'array',
|
|
104
|
+
items: {
|
|
105
|
+
type: 'object',
|
|
106
|
+
properties: {
|
|
107
|
+
event: { type: 'string' },
|
|
108
|
+
user_id: { type: 'string' },
|
|
109
|
+
timestamp: { type: 'string' },
|
|
110
|
+
properties: { type: 'object' }
|
|
111
|
+
},
|
|
112
|
+
required: ['event']
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
source: {
|
|
116
|
+
type: 'string',
|
|
117
|
+
enum: ['mixpanel', 'posthog', 'amplitude', 'other']
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
required: ['events']
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
name: 'session_capsule',
|
|
125
|
+
description: 'Compress current agent session memory when context > 60k tokens. ' +
|
|
126
|
+
'Returns markdown bullets with investigated/findings/decisions/pending/files (40×). ' +
|
|
127
|
+
'Format: markdown (not JSON) — saves ~30% tokens vs JSON for prose. ' +
|
|
128
|
+
'Costs ~$0.001 per compression. Requires paid tier.',
|
|
129
|
+
inputSchema: {
|
|
130
|
+
type: 'object',
|
|
131
|
+
properties: {
|
|
132
|
+
turns: {
|
|
133
|
+
type: 'array',
|
|
134
|
+
items: {
|
|
135
|
+
type: 'object',
|
|
136
|
+
properties: {
|
|
137
|
+
role: { type: 'string', enum: ['user', 'assistant', 'tool'] },
|
|
138
|
+
content: { type: 'string' },
|
|
139
|
+
tool_name: { type: 'string' }
|
|
140
|
+
},
|
|
141
|
+
required: ['role', 'content']
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
agent: { type: 'string' }
|
|
145
|
+
},
|
|
146
|
+
required: ['turns']
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
name: 'sql_capsule',
|
|
151
|
+
description: 'Use on slow query logs (Postgres, MySQL). ' +
|
|
152
|
+
'Groups queries by shape, ranks by impact, suggests indexes (25×). ' +
|
|
153
|
+
'Costs ~$0.001 per analysis. Requires paid tier.',
|
|
154
|
+
inputSchema: {
|
|
155
|
+
type: 'object',
|
|
156
|
+
properties: {
|
|
157
|
+
slow_log: { type: 'string', description: 'Raw slow query log text' },
|
|
158
|
+
source: { type: 'string', enum: ['postgres', 'mysql', 'mongodb', 'other'] }
|
|
159
|
+
},
|
|
160
|
+
required: ['slow_log']
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
name: 'log_capsule',
|
|
165
|
+
description: '⚠️ ALWAYS use this BEFORE Read on infra logs >5KB ' +
|
|
166
|
+
'(kubectl logs, journalctl, docker logs, nginx access logs, ' +
|
|
167
|
+
'AWS CloudWatch, Vercel logs). ' +
|
|
168
|
+
'Drain3 templating compresses repetitive lines into ~50 templates ' +
|
|
169
|
+
'with line-anchored evidence (50-200× typical). Algorithm-only, ' +
|
|
170
|
+
'zero LLM cost, <300ms even on 1M+ lines. ' +
|
|
171
|
+
'Output schema compatible with Codag IncidentCapsule.',
|
|
172
|
+
inputSchema: {
|
|
173
|
+
type: 'object',
|
|
174
|
+
properties: {
|
|
175
|
+
logs: { type: 'string', description: 'Raw log text OR path to log file' },
|
|
176
|
+
service: { type: 'string', description: 'Optional service name hint (e.g. "nginx", "my-app")' }
|
|
177
|
+
},
|
|
178
|
+
required: ['logs']
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
];
|
|
182
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
183
|
+
tools: TOOL_DEFINITIONS
|
|
184
|
+
}));
|
|
185
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
186
|
+
const { name, arguments: args } = request.params;
|
|
187
|
+
if (!args) {
|
|
188
|
+
return { content: [{ type: 'text', text: 'No arguments provided' }], isError: true };
|
|
189
|
+
}
|
|
190
|
+
// Valida licença pra cápsulas pagas
|
|
191
|
+
const lic = await validateLicense();
|
|
192
|
+
const capsuleType = name.replace('_capsule', '');
|
|
193
|
+
if (!isCapsuleAllowed(lic.tier, capsuleType)) {
|
|
194
|
+
return {
|
|
195
|
+
content: [{
|
|
196
|
+
type: 'text',
|
|
197
|
+
text: `Capsule "${capsuleType}" requires a paid Nuxs tier (Solo Pro R$29+). ` +
|
|
198
|
+
`Current tier: ${lic.tier}. Get a license at https://nuxs.ai/pricing`
|
|
199
|
+
}],
|
|
200
|
+
isError: true
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
try {
|
|
204
|
+
let result;
|
|
205
|
+
switch (name) {
|
|
206
|
+
case 'network_capsule':
|
|
207
|
+
result = networkCapsuleFromFile(args.file_path);
|
|
208
|
+
break;
|
|
209
|
+
case 'api_capsule': {
|
|
210
|
+
const json = args.json;
|
|
211
|
+
// Se é caminho de arquivo, lê
|
|
212
|
+
const content = json.startsWith('{') || json.startsWith('[')
|
|
213
|
+
? json
|
|
214
|
+
: readFileSync(json, 'utf8');
|
|
215
|
+
result = apiCapsule(content, args.source_url);
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
case 'stack_capsule':
|
|
219
|
+
result = await stackCapsule(args.trace, args.source);
|
|
220
|
+
break;
|
|
221
|
+
case 'threads_capsule':
|
|
222
|
+
result = await threadsCapsule(args.messages, args.source);
|
|
223
|
+
break;
|
|
224
|
+
case 'events_capsule':
|
|
225
|
+
result = await eventsCapsule(args.events, args.source);
|
|
226
|
+
break;
|
|
227
|
+
case 'session_capsule':
|
|
228
|
+
result = await sessionCapsule(args.turns, args.agent ?? 'unknown');
|
|
229
|
+
break;
|
|
230
|
+
case 'sql_capsule':
|
|
231
|
+
result = await sqlCapsule(args.slow_log, args.source);
|
|
232
|
+
break;
|
|
233
|
+
case 'log_capsule': {
|
|
234
|
+
const logs = args.logs;
|
|
235
|
+
const service = args.service;
|
|
236
|
+
// Se é caminho [não tem newlines E começa com /], lê arquivo
|
|
237
|
+
const looksLikePath = !logs.includes('\n') && (logs.startsWith('/') || logs.startsWith('~'));
|
|
238
|
+
result = looksLikePath
|
|
239
|
+
? logCapsuleFromFile(logs, service)
|
|
240
|
+
: logCapsuleFromString(logs, service);
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
default:
|
|
244
|
+
return {
|
|
245
|
+
content: [{ type: 'text', text: `Unknown tool: ${name}` }],
|
|
246
|
+
isError: true
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
const text = typeof result === 'string'
|
|
250
|
+
? result
|
|
251
|
+
: JSON.stringify(result, null, 2);
|
|
252
|
+
return { content: [{ type: 'text', text }] };
|
|
253
|
+
}
|
|
254
|
+
catch (err) {
|
|
255
|
+
return {
|
|
256
|
+
content: [{ type: 'text', text: `Error: ${err.message}` }],
|
|
257
|
+
isError: true
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
const transport = new StdioServerTransport();
|
|
262
|
+
server.connect(transport).then(() => {
|
|
263
|
+
console.error('[nuxs-capsule] MCP server running on stdio');
|
|
264
|
+
}).catch((err) => {
|
|
265
|
+
console.error('[nuxs-capsule] server failed:', err);
|
|
266
|
+
process.exit(1);
|
|
267
|
+
});
|
|
268
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEvE,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,EAC1C,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;AAEF,MAAM,gBAAgB,GAAG;IACvB;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,gDAAgD;YAChD,0EAA0E;YAC1E,iEAAiE;YACjE,6DAA6D;QAC/D,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,EAAE;aACzE;YACD,QAAQ,EAAE,CAAC,WAAW,CAAC;SACxB;KACF;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EACT,8DAA8D;YAC9D,gGAAgG;YAChG,4BAA4B;QAC9B,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mCAAmC,EAAE;gBAC1E,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iCAAiC,EAAE;aAC/E;YACD,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB;KACF;IACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,wEAAwE;YACxE,mEAAmE;YACnE,iDAAiD;QACnD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE;gBAC1D,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE;aAChE;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;KACF;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,8EAA8E;YAC9E,yEAAyE;YACzE,iDAAiD;QACnD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,QAAQ,EAAE;oBACR,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACxB,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;yBAC9B;wBACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;qBAC7B;iBACF;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC;iBACnE;aACF;YACD,QAAQ,EAAE,CAAC,UAAU,CAAC;SACvB;KACF;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EACT,6DAA6D;YAC7D,8DAA8D;YAC9D,iDAAiD;QACnD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACzB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BAC3B,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BAC7B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;yBAC/B;wBACD,QAAQ,EAAE,CAAC,OAAO,CAAC;qBACpB;iBACF;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC;iBACpD;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;SACrB;KACF;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,mEAAmE;YACnE,qFAAqF;YACrF,qEAAqE;YACrE,oDAAoD;QACtD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE;4BAC7D,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BAC3B,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;yBAC9B;wBACD,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;qBAC9B;iBACF;gBACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC1B;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;KACF;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EACT,4CAA4C;YAC5C,oEAAoE;YACpE,iDAAiD;QACnD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yBAAyB,EAAE;gBACpE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE;aAC5E;YACD,QAAQ,EAAE,CAAC,UAAU,CAAC;SACvB;KACF;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EACT,oDAAoD;YACpD,6DAA6D;YAC7D,gCAAgC;YAChC,mEAAmE;YACnE,iEAAiE;YACjE,2CAA2C;YAC3C,sDAAsD;QACxD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kCAAkC,EAAE;gBACzE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qDAAqD,EAAE;aAChG;YACD,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB;KACF;CACF,CAAC;AAEF,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAC5D,KAAK,EAAE,gBAAgB;CACxB,CAAC,CAAC,CAAC;AAEJ,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IACjD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACvF,CAAC;IAED,oCAAoC;IACpC,MAAM,GAAG,GAAG,MAAM,eAAe,EAAE,CAAC;IACpC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACjD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;QAC7C,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,YAAY,WAAW,gDAAgD;wBAC3E,iBAAiB,GAAG,CAAC,IAAI,4CAA4C;iBACxE,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,IAAI,MAAe,CAAC;QACpB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,iBAAiB;gBACpB,MAAM,GAAG,sBAAsB,CAAC,IAAI,CAAC,SAAmB,CAAC,CAAC;gBAC1D,MAAM;YACR,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAc,CAAC;gBACjC,8BAA8B;gBAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;oBAC1D,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAC/B,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,UAAgC,CAAC,CAAC;gBACpE,MAAM;YACR,CAAC;YACD,KAAK,eAAe;gBAClB,MAAM,GAAG,MAAM,YAAY,CACzB,IAAI,CAAC,KAAe,EACpB,IAAI,CAAC,MAAmD,CACzD,CAAC;gBACF,MAAM;YACR,KAAK,iBAAiB;gBACpB,MAAM,GAAG,MAAM,cAAc,CAC3B,IAAI,CAAC,QAAiB,EACtB,IAAI,CAAC,MAAa,CACnB,CAAC;gBACF,MAAM;YACR,KAAK,gBAAgB;gBACnB,MAAM,GAAG,MAAM,aAAa,CAC1B,IAAI,CAAC,MAAe,EACpB,IAAI,CAAC,MAAa,CACnB,CAAC;gBACF,MAAM;YACR,KAAK,iBAAiB;gBACpB,MAAM,GAAG,MAAM,cAAc,CAC3B,IAAI,CAAC,KAAc,EAClB,IAAI,CAAC,KAAa,IAAI,SAAS,CACjC,CAAC;gBACF,MAAM;YACR,KAAK,aAAa;gBAChB,MAAM,GAAG,MAAM,UAAU,CACvB,IAAI,CAAC,QAAkB,EACvB,IAAI,CAAC,MAAa,CACnB,CAAC;gBACF,MAAM;YACR,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAc,CAAC;gBACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAA6B,CAAC;gBACnD,6DAA6D;gBAC7D,MAAM,aAAa,GACjB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzE,MAAM,GAAG,aAAa;oBACpB,CAAC,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC;oBACnC,CAAC,CAAC,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBACxC,MAAM;YACR,CAAC;YACD;gBACE,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC;oBAC1D,OAAO,EAAE,IAAI;iBACd,CAAC;QACN,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,MAAM,KAAK,QAAQ;YACrC,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACpC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAW,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC;YACrE,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;IAClC,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;AAC9D,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/setup.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI: `npx nuxs-capsule setup`
|
|
3
|
+
*
|
|
4
|
+
* Setup automático em 1 comando:
|
|
5
|
+
* 1. Cria ~/.nuxs/
|
|
6
|
+
* 2. Pede license key (ou modo Free anônimo)
|
|
7
|
+
* 3. Detecta agentes instalados (Claude Code, Cursor)
|
|
8
|
+
* 4. Configura MCP em cada um
|
|
9
|
+
* 5. Configura Hook PreToolUse no Claude Code
|
|
10
|
+
*
|
|
11
|
+
* Modelo Codag: "Hooks + MCP, wired automatically"
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|
package/dist/setup.js
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI: `npx nuxs-capsule setup`
|
|
3
|
+
*
|
|
4
|
+
* Setup automático em 1 comando:
|
|
5
|
+
* 1. Cria ~/.nuxs/
|
|
6
|
+
* 2. Pede license key (ou modo Free anônimo)
|
|
7
|
+
* 3. Detecta agentes instalados (Claude Code, Cursor)
|
|
8
|
+
* 4. Configura MCP em cada um
|
|
9
|
+
* 5. Configura Hook PreToolUse no Claude Code
|
|
10
|
+
*
|
|
11
|
+
* Modelo Codag: "Hooks + MCP, wired automatically"
|
|
12
|
+
*/
|
|
13
|
+
import { readFileSync, writeFileSync, existsSync } from 'node:fs';
|
|
14
|
+
import { homedir } from 'node:os';
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
import { createInterface } from 'node:readline/promises';
|
|
17
|
+
import { ensureDir } from './lib/fileStat.js';
|
|
18
|
+
import { setLicenseKey } from './license/check.js';
|
|
19
|
+
const NUXS_DIR = join(homedir(), '.nuxs');
|
|
20
|
+
const CACHE_DIR = join(NUXS_DIR, 'cache');
|
|
21
|
+
const CLAUDE_CONFIG = join(homedir(), '.claude', 'settings.json');
|
|
22
|
+
const CLAUDE_PROJECT_MCP = '.mcp.json';
|
|
23
|
+
const CURSOR_MCP = join(homedir(), '.cursor', 'mcp.json');
|
|
24
|
+
const INTERCEPT_BIN = join(homedir(), '.nuxs', 'bin', 'nuxs-capsule-intercept');
|
|
25
|
+
const SERVER_BIN = join(homedir(), '.nuxs', 'bin', 'nuxs-capsule');
|
|
26
|
+
async function main() {
|
|
27
|
+
console.log('\n🟢 Nuxs Capsule Setup\n');
|
|
28
|
+
ensureDir(NUXS_DIR);
|
|
29
|
+
ensureDir(CACHE_DIR);
|
|
30
|
+
ensureDir(join(NUXS_DIR, 'bin'));
|
|
31
|
+
// 1. License key
|
|
32
|
+
await setupLicense();
|
|
33
|
+
// 2. Detecta + configura agentes
|
|
34
|
+
const configured = [];
|
|
35
|
+
if (existsSync(join(homedir(), '.claude'))) {
|
|
36
|
+
setupClaudeCode();
|
|
37
|
+
configured.push('Claude Code');
|
|
38
|
+
}
|
|
39
|
+
if (existsSync(join(homedir(), '.cursor'))) {
|
|
40
|
+
setupCursor();
|
|
41
|
+
configured.push('Cursor');
|
|
42
|
+
}
|
|
43
|
+
if (configured.length === 0) {
|
|
44
|
+
console.log('⚠️ Nenhum agente IA detectado (~/.claude ou ~/.cursor).');
|
|
45
|
+
console.log(' Instala o agente primeiro, depois roda `nuxs-capsule setup` de novo.\n');
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
console.log(`\n✅ Configurado em: ${configured.join(', ')}\n`);
|
|
49
|
+
console.log('Reinicia o agente pra carregar o MCP.\n');
|
|
50
|
+
console.log('Próximos passos:');
|
|
51
|
+
console.log(' - O agente vai usar Nuxs Capsule AUTOMATICAMENTE em .har, .json grande, etc');
|
|
52
|
+
console.log(' - Vê tua economia em https://nuxs.ai/mymind');
|
|
53
|
+
console.log(' - Free tier: 50 cápsulas LLM-based/dia + ilimitado algoritmo puro');
|
|
54
|
+
console.log(' - Solo Pro R$29/mês: ilimitado → https://nuxs.ai/pricing\n');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async function setupLicense() {
|
|
58
|
+
if (process.env.NUXS_LICENSE_KEY) {
|
|
59
|
+
console.log('✓ License key via env NUXS_LICENSE_KEY');
|
|
60
|
+
setLicenseKey(process.env.NUXS_LICENSE_KEY);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
64
|
+
const answer = await rl.question('License key (cole aqui — ou pressiona Enter pra Free anônimo): ');
|
|
65
|
+
rl.close();
|
|
66
|
+
if (answer.trim()) {
|
|
67
|
+
setLicenseKey(answer.trim());
|
|
68
|
+
console.log('✓ License key salva em ~/.nuxs/license.json\n');
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
console.log('✓ Modo Free anônimo ativo (50 cápsulas LLM/dia, ilimitado algoritmo)\n');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function setupClaudeCode() {
|
|
75
|
+
console.log('→ Configurando Claude Code...');
|
|
76
|
+
// Carrega settings existente ou cria novo
|
|
77
|
+
let settings = {};
|
|
78
|
+
if (existsSync(CLAUDE_CONFIG)) {
|
|
79
|
+
try {
|
|
80
|
+
settings = JSON.parse(readFileSync(CLAUDE_CONFIG, 'utf8'));
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
settings = {};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// 1. Adiciona hook PreToolUse (não destrutivo — preserva outros hooks)
|
|
87
|
+
settings.hooks = settings.hooks ?? {};
|
|
88
|
+
settings.hooks.PreToolUse = settings.hooks.PreToolUse ?? [];
|
|
89
|
+
const alreadyAdded = settings.hooks.PreToolUse.some((h) => h.hooks?.some((hh) => hh.command?.includes('nuxs-capsule-intercept')));
|
|
90
|
+
if (!alreadyAdded) {
|
|
91
|
+
settings.hooks.PreToolUse.push({
|
|
92
|
+
matcher: 'Read|Bash|WebFetch',
|
|
93
|
+
hooks: [
|
|
94
|
+
{
|
|
95
|
+
type: 'command',
|
|
96
|
+
command: INTERCEPT_BIN,
|
|
97
|
+
timeout_ms: 5000
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
// 2. Adiciona MCP server
|
|
103
|
+
settings.mcpServers = settings.mcpServers ?? {};
|
|
104
|
+
settings.mcpServers['nuxs-capsule'] = {
|
|
105
|
+
command: SERVER_BIN,
|
|
106
|
+
args: []
|
|
107
|
+
};
|
|
108
|
+
writeFileSync(CLAUDE_CONFIG, JSON.stringify(settings, null, 2));
|
|
109
|
+
console.log(` ✓ ${CLAUDE_CONFIG}`);
|
|
110
|
+
}
|
|
111
|
+
function setupCursor() {
|
|
112
|
+
console.log('→ Configurando Cursor...');
|
|
113
|
+
let config = { mcpServers: {} };
|
|
114
|
+
if (existsSync(CURSOR_MCP)) {
|
|
115
|
+
try {
|
|
116
|
+
config = JSON.parse(readFileSync(CURSOR_MCP, 'utf8'));
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
config = { mcpServers: {} };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
config.mcpServers = config.mcpServers ?? {};
|
|
123
|
+
config.mcpServers['nuxs-capsule'] = {
|
|
124
|
+
command: SERVER_BIN,
|
|
125
|
+
args: []
|
|
126
|
+
};
|
|
127
|
+
ensureDir(join(homedir(), '.cursor'));
|
|
128
|
+
writeFileSync(CURSOR_MCP, JSON.stringify(config, null, 2));
|
|
129
|
+
console.log(` ✓ ${CURSOR_MCP}`);
|
|
130
|
+
}
|
|
131
|
+
main().catch((err) => {
|
|
132
|
+
console.error('❌ Setup falhou:', err);
|
|
133
|
+
process.exit(1);
|
|
134
|
+
});
|
|
135
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetria zero-knowledge. NUNCA conteúdo, só metadata.
|
|
3
|
+
* Fire-and-forget — não bloqueia cápsula.
|
|
4
|
+
*
|
|
5
|
+
* Audit defensivo no cliente: bloqueia envio se payload contém strings
|
|
6
|
+
* suspeitas (defesa redundante; server também valida).
|
|
7
|
+
*/
|
|
8
|
+
import type { UsageRecord } from '../types.js';
|
|
9
|
+
/** Registra uso local + envia pra server (fire-and-forget). */
|
|
10
|
+
export declare function trackUsage(record: UsageRecord): Promise<void>;
|
|
11
|
+
/** Leitura agregada local — pro user ver economia mesmo offline. */
|
|
12
|
+
export declare function getLocalUsageStats(days?: number): {
|
|
13
|
+
total_capsules: number;
|
|
14
|
+
total_tokens_saved: number;
|
|
15
|
+
total_cost_saved_usd: number;
|
|
16
|
+
by_type: Record<string, number>;
|
|
17
|
+
by_agent: Record<string, number>;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/telemetry/usage.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAS/C,+DAA+D;AAC/D,wBAAsB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCnE;AAiBD,oEAAoE;AACpE,wBAAgB,kBAAkB,CAAC,IAAI,SAAK,GAAG;IAC7C,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CAyCA"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetria zero-knowledge. NUNCA conteúdo, só metadata.
|
|
3
|
+
* Fire-and-forget — não bloqueia cápsula.
|
|
4
|
+
*
|
|
5
|
+
* Audit defensivo no cliente: bloqueia envio se payload contém strings
|
|
6
|
+
* suspeitas (defesa redundante; server também valida).
|
|
7
|
+
*/
|
|
8
|
+
import { readFileSync, writeFileSync, existsSync } from 'node:fs';
|
|
9
|
+
import { homedir } from 'node:os';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { ensureDir } from '../lib/fileStat.js';
|
|
12
|
+
import { getMachineFingerprint } from '../lib/fingerprint.js';
|
|
13
|
+
import { getLicenseKey } from '../license/check.js';
|
|
14
|
+
const NUXS_DIR = join(homedir(), '.nuxs');
|
|
15
|
+
const USAGE_FILE = join(NUXS_DIR, 'usage.json');
|
|
16
|
+
const SERVER_URL = process.env.NUXS_SERVER_URL ?? 'https://pixeldesk-api.onrender.com';
|
|
17
|
+
const SUSPICIOUS_PATTERN = /api[_-]?key|password|secret|http[s]?:\/\/|\/home\/|\/usr\/|sk_test_|sk_live_|whsec_|Bearer\s|nxs_[a-f0-9]/i;
|
|
18
|
+
const MAX_PAYLOAD_BYTES = 2048;
|
|
19
|
+
/** Registra uso local + envia pra server (fire-and-forget). */
|
|
20
|
+
export async function trackUsage(record) {
|
|
21
|
+
// Audit local: rejeita payload com strings suspeitas
|
|
22
|
+
const payloadStr = JSON.stringify(record);
|
|
23
|
+
if (SUSPICIOUS_PATTERN.test(payloadStr)) {
|
|
24
|
+
console.warn('[nuxs-capsule] telemetry blocked locally: suspicious pattern');
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (payloadStr.length > MAX_PAYLOAD_BYTES) {
|
|
28
|
+
console.warn('[nuxs-capsule] telemetry blocked locally: payload too large');
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// 1. Append no log local (sempre, mesmo offline)
|
|
32
|
+
appendLocal(record);
|
|
33
|
+
// 2. Envia pra server (best-effort)
|
|
34
|
+
const licenseKey = getLicenseKey();
|
|
35
|
+
if (!licenseKey)
|
|
36
|
+
return; // Free anônimo não manda telemetria
|
|
37
|
+
try {
|
|
38
|
+
// record já contém machine_fingerprint; sobrescreve com o local (canônico)
|
|
39
|
+
// pra evitar mismatch entre record e máquina atual.
|
|
40
|
+
await fetch(`${SERVER_URL}/api/usage/track`, {
|
|
41
|
+
method: 'POST',
|
|
42
|
+
headers: { 'Content-Type': 'application/json' },
|
|
43
|
+
body: JSON.stringify({
|
|
44
|
+
...record,
|
|
45
|
+
license_key: licenseKey,
|
|
46
|
+
machine_fingerprint: getMachineFingerprint()
|
|
47
|
+
}),
|
|
48
|
+
signal: AbortSignal.timeout(3000)
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Silent — telemetria não pode bloquear cápsula
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function appendLocal(record) {
|
|
56
|
+
ensureDir(NUXS_DIR);
|
|
57
|
+
let log = [];
|
|
58
|
+
if (existsSync(USAGE_FILE)) {
|
|
59
|
+
try {
|
|
60
|
+
log = JSON.parse(readFileSync(USAGE_FILE, 'utf8'));
|
|
61
|
+
}
|
|
62
|
+
catch { /* corrupto, recomeça */ }
|
|
63
|
+
}
|
|
64
|
+
log.push(record);
|
|
65
|
+
// Rotação: mantém só últimos 30 dias
|
|
66
|
+
const thirtyDaysAgo = Date.now() - 30 * 24 * 60 * 60 * 1000;
|
|
67
|
+
log = log.filter((r) => new Date(r.timestamp).getTime() > thirtyDaysAgo);
|
|
68
|
+
writeFileSync(USAGE_FILE, JSON.stringify(log));
|
|
69
|
+
}
|
|
70
|
+
/** Leitura agregada local — pro user ver economia mesmo offline. */
|
|
71
|
+
export function getLocalUsageStats(days = 30) {
|
|
72
|
+
if (!existsSync(USAGE_FILE)) {
|
|
73
|
+
return {
|
|
74
|
+
total_capsules: 0,
|
|
75
|
+
total_tokens_saved: 0,
|
|
76
|
+
total_cost_saved_usd: 0,
|
|
77
|
+
by_type: {},
|
|
78
|
+
by_agent: {}
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
let log = [];
|
|
82
|
+
try {
|
|
83
|
+
log = JSON.parse(readFileSync(USAGE_FILE, 'utf8'));
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return {
|
|
87
|
+
total_capsules: 0,
|
|
88
|
+
total_tokens_saved: 0,
|
|
89
|
+
total_cost_saved_usd: 0,
|
|
90
|
+
by_type: {},
|
|
91
|
+
by_agent: {}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
const cutoff = Date.now() - days * 24 * 60 * 60 * 1000;
|
|
95
|
+
const recent = log.filter((r) => new Date(r.timestamp).getTime() > cutoff);
|
|
96
|
+
const byType = {};
|
|
97
|
+
const byAgent = {};
|
|
98
|
+
let totalSaved = 0;
|
|
99
|
+
let totalCost = 0;
|
|
100
|
+
for (const r of recent) {
|
|
101
|
+
byType[r.capsule_type] = (byType[r.capsule_type] ?? 0) + 1;
|
|
102
|
+
byAgent[r.agent_detected] = (byAgent[r.agent_detected] ?? 0) + 1;
|
|
103
|
+
totalSaved += r.tokens_saved;
|
|
104
|
+
totalCost += r.cost_saved_usd;
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
total_capsules: recent.length,
|
|
108
|
+
total_tokens_saved: totalSaved,
|
|
109
|
+
total_cost_saved_usd: totalCost,
|
|
110
|
+
by_type: byType,
|
|
111
|
+
by_agent: byAgent
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/telemetry/usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* api_capsule — comprime JSON gigante (responses de API).
|
|
3
|
+
* Algoritmo puro, zero LLM.
|
|
4
|
+
*
|
|
5
|
+
* Compressão típica: 100k tokens → 2k (50×).
|
|
6
|
+
*
|
|
7
|
+
* Mecânica:
|
|
8
|
+
* 1. Parse JSON
|
|
9
|
+
* 2. Detecta array principal (data, items, results, ou root array)
|
|
10
|
+
* 3. Infer JSON Schema simples
|
|
11
|
+
* 4. Sample 3-5 itens diversos (cobrem variações)
|
|
12
|
+
* 5. Field stats: type + null_count + unique_count
|
|
13
|
+
*/
|
|
14
|
+
import type { ApiCapsule } from '../types.js';
|
|
15
|
+
export declare function apiCapsule(json: string, _sourceUrl?: string): ApiCapsule;
|
|
16
|
+
//# sourceMappingURL=apiCapsule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiCapsule.d.ts","sourceRoot":"","sources":["../../src/tools/apiCapsule.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK9C,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,UAAU,CAsBxE"}
|