@tenb/skill-telemetry
v0.1.0
Published
Lightweight telemetry SDK for SkillForge skills — instant or batched reporting
Readme
@skillforge/telemetry
Lightweight telemetry SDK for SkillForge skills. Zero dependencies, two modes.
Install
npm install @skillforge/telemetryInstant Mode (lightweight skills)
import { createReporter } from '@skillforge/telemetry';
const report = createReporter('author/skill-name');
// Simple report
report.report({ toolName: 'search', success: true, duration: 150 });
// Wrap a function
const result = await report.wrap('analyze', async () => {
return await doAnalysis(input);
});
// Timer helper
const t = report.start('generate');
try {
const result = await generate(input);
t.success();
} catch (e) {
t.fail(e);
}Batched Mode (long-running skills)
import { createReporter } from '@skillforge/telemetry';
const report = createReporter('author/skill-name');
// Start batched: buffer events, flush every 5 min or when buffer hits 50
report.startBatched();
// Enqueue events (non-blocking, auto-deduped)
report.enqueue({ toolName: 'chat-reply', success: true, duration: 200 });
report.enqueue({ toolName: 'message-received', success: true, duration: 0 });
// Auto-flushes on:
// - Buffer reaches maxBufferSize (default 50)
// - Timer interval (default 5 min)
// - Process exit (SIGINT/SIGTERM/beforeExit)
// Manual flush + stop
report.stop();Example: dating-pilot integration
import { createReporter } from '@skillforge/telemetry';
const telemetry = createReporter('jaydy/dating-pilot');
// Swipe (instant mode — one-off operation)
export async function swipeWithFilter(params) {
return telemetry.wrap('swipe', async () => {
// existing swipe logic...
return { likedCount, skippedCount, matchedCount };
});
}
// Chat system (batched mode — long-running)
export async function initChatSystem() {
telemetry.startBatched(300000); // flush every 5 min
// On new message received
onMessageReceived((msg) => {
telemetry.enqueue({ toolName: 'message-received', success: true, duration: 0 });
});
// On AI reply sent
onAIReplySent((reply) => {
telemetry.enqueue({ toolName: 'ai-reply', success: true, duration: reply.latency });
});
}
export async function stopChatSystem() {
telemetry.stop(); // flush remaining buffer
}Options
createReporter('slug', {
apiUrl: 'http://localhost:3002', // default: https://api.skillforge.dev
disabled: false, // or set SKILLFORGE_TELEMETRY=off
flushInterval: 300000, // batched mode: 5 min
maxBufferSize: 50, // batched mode: auto-flush threshold
});Privacy
- Only sends: skillSlug, toolName, success, duration, errorType
- Never sends: user content, API keys, personal data
- Set
SKILLFORGE_TELEMETRY=offto disable - All requests are fire-and-forget (never blocks your skill)
