@digital-lake/lognexus 1.1.0 → 1.2.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.
Files changed (40) hide show
  1. package/README.md +96 -7
  2. package/dist/cli.d.ts +1 -0
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +121 -31
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commit.d.ts +8 -0
  7. package/dist/commit.d.ts.map +1 -1
  8. package/dist/commit.js +75 -1
  9. package/dist/commit.js.map +1 -1
  10. package/dist/index.d.ts +2 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +2 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/mcp/tools.d.ts.map +1 -1
  15. package/dist/mcp/tools.js +77 -0
  16. package/dist/mcp/tools.js.map +1 -1
  17. package/dist/state/manager.d.ts.map +1 -1
  18. package/dist/state/manager.js +3 -0
  19. package/dist/state/manager.js.map +1 -1
  20. package/dist/telemetry/collector.d.ts +31 -0
  21. package/dist/telemetry/collector.d.ts.map +1 -0
  22. package/dist/telemetry/collector.js +257 -0
  23. package/dist/telemetry/collector.js.map +1 -0
  24. package/dist/telemetry/detector.d.ts +15 -0
  25. package/dist/telemetry/detector.d.ts.map +1 -0
  26. package/dist/telemetry/detector.js +120 -0
  27. package/dist/telemetry/detector.js.map +1 -0
  28. package/dist/telemetry/index.d.ts +5 -0
  29. package/dist/telemetry/index.d.ts.map +1 -0
  30. package/dist/telemetry/index.js +5 -0
  31. package/dist/telemetry/index.js.map +1 -0
  32. package/dist/telemetry/report.d.ts +7 -0
  33. package/dist/telemetry/report.d.ts.map +1 -0
  34. package/dist/telemetry/report.js +98 -0
  35. package/dist/telemetry/report.js.map +1 -0
  36. package/dist/telemetry/schema.d.ts +140 -0
  37. package/dist/telemetry/schema.d.ts.map +1 -0
  38. package/dist/telemetry/schema.js +78 -0
  39. package/dist/telemetry/schema.js.map +1 -0
  40. package/package.json +1 -1
@@ -0,0 +1,120 @@
1
+ import { execSync } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { extname, join } from "node:path";
4
+ export function detectProjectStacks(targetDir = process.cwd()) {
5
+ const stacks = new Set();
6
+ try {
7
+ if (existsSync(join(targetDir, "package.json"))) {
8
+ stacks.add("nodejs");
9
+ if (existsSync(join(targetDir, "tsconfig.json"))) {
10
+ stacks.add("typescript");
11
+ }
12
+ else {
13
+ stacks.add("javascript");
14
+ }
15
+ }
16
+ if (existsSync(join(targetDir, "pyproject.toml")) ||
17
+ existsSync(join(targetDir, "requirements.txt")) ||
18
+ existsSync(join(targetDir, "setup.py"))) {
19
+ stacks.add("python");
20
+ }
21
+ if (existsSync(join(targetDir, "Cargo.toml"))) {
22
+ stacks.add("rust");
23
+ }
24
+ if (existsSync(join(targetDir, "go.mod"))) {
25
+ stacks.add("go");
26
+ }
27
+ if (existsSync(join(targetDir, "pom.xml")) ||
28
+ existsSync(join(targetDir, "build.gradle")) ||
29
+ existsSync(join(targetDir, "build.gradle.kts"))) {
30
+ stacks.add("java");
31
+ }
32
+ if (existsSync(join(targetDir, "CMakeLists.txt")) || existsSync(join(targetDir, "Makefile"))) {
33
+ stacks.add("c/cpp");
34
+ }
35
+ }
36
+ catch {
37
+ // Ignore read errors
38
+ }
39
+ return Array.from(stacks).sort();
40
+ }
41
+ /**
42
+ * Extracts line change metrics by extension from a Git commit SHA without storing any file names or paths.
43
+ */
44
+ export function extractCommitDiffStats(sha, targetDir = process.cwd()) {
45
+ const extensionMap = new Map();
46
+ try {
47
+ const raw = execSync(`git diff-tree --numstat --no-commit-id -r ${sha}`, {
48
+ cwd: targetDir,
49
+ encoding: "utf8",
50
+ stdio: ["pipe", "pipe", "pipe"],
51
+ });
52
+ for (const line of raw.split("\n")) {
53
+ const trimmed = line.trim();
54
+ if (!trimmed)
55
+ continue;
56
+ const parts = trimmed.split(/\s+/);
57
+ if (parts.length < 3)
58
+ continue;
59
+ const added = Number.parseInt(parts[0], 10);
60
+ const deleted = Number.parseInt(parts[1], 10);
61
+ const filePath = parts.slice(2).join(" ");
62
+ // Ignore binary files where numstat outputs '-'
63
+ const linesAdded = Number.isNaN(added) ? 0 : added;
64
+ const linesDeleted = Number.isNaN(deleted) ? 0 : deleted;
65
+ // Extract ONLY extension (e.g. '.ts', '.py', '.md'). Zero path or filename is recorded.
66
+ const rawExt = extname(filePath).toLowerCase();
67
+ const ext = rawExt === "" ? "(no-ext)" : rawExt;
68
+ const existing = extensionMap.get(ext) ?? { linesAdded: 0, linesDeleted: 0 };
69
+ existing.linesAdded += linesAdded;
70
+ existing.linesDeleted += linesDeleted;
71
+ extensionMap.set(ext, existing);
72
+ }
73
+ }
74
+ catch {
75
+ // Non-git or commit without parents
76
+ }
77
+ return Array.from(extensionMap.entries()).map(([ext, stats]) => ({
78
+ ext,
79
+ linesAdded: stats.linesAdded,
80
+ linesDeleted: stats.linesDeleted,
81
+ }));
82
+ }
83
+ /**
84
+ * Normalizes author/reviewer strings into generic model family categories (e.g. 'gemini/flash', 'claude/sonnet').
85
+ */
86
+ export function extractModelFamilyCategory(identityStr) {
87
+ if (!identityStr)
88
+ return "unknown/other";
89
+ const trimmed = identityStr.trim().toLowerCase();
90
+ // Well-known model family heuristics
91
+ if (trimmed.includes("gemini") && trimmed.includes("flash"))
92
+ return "gemini/flash";
93
+ if (trimmed.includes("gemini") && trimmed.includes("pro"))
94
+ return "gemini/pro";
95
+ if (trimmed.includes("claude") && trimmed.includes("sonnet"))
96
+ return "claude/sonnet";
97
+ if (trimmed.includes("claude") && trimmed.includes("haiku"))
98
+ return "claude/haiku";
99
+ if (trimmed.includes("claude") && trimmed.includes("opus"))
100
+ return "claude/opus";
101
+ if (trimmed.includes("gpt") ||
102
+ trimmed.includes("openai") ||
103
+ trimmed.includes("o1") ||
104
+ trimmed.includes("o3")) {
105
+ return "openai/gpt";
106
+ }
107
+ if (trimmed.includes("deepseek"))
108
+ return "deepseek/v3";
109
+ if (trimmed.includes("kimi") || trimmed.includes("moonshot"))
110
+ return "moonshot/kimi";
111
+ if (trimmed.includes("qwen"))
112
+ return "qwen/coder";
113
+ const slashMatch = trimmed.match(/^([a-z0-9_-]+\/[a-z0-9_.-]+)/i);
114
+ if (slashMatch) {
115
+ return slashMatch[1];
116
+ }
117
+ const firstWord = trimmed.split(/\s+/)[0];
118
+ return firstWord || "unknown/other";
119
+ }
120
+ //# sourceMappingURL=detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/telemetry/detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { buildAnonymousCommunityPayload, clearTelemetry, createDefaultTelemetryStore, DEFAULT_TELEMETRY_ENDPOINT, disableTelemetry, dispatchCommunityTelemetry, enableTelemetry, getTelemetryPath, isTelemetryActive, isTelemetryGloballyDisabled, loadTelemetry, recordCommitTelemetry, recordReviewGateBlock, recordTaskFinish, recordTaskStart, saveTelemetry, updateCostSavingsEstimate, } from "./collector.js";
2
+ export { detectProjectStacks, extractCommitDiffStats, extractModelFamilyCategory, } from "./detector.js";
3
+ export { formatTelemetryMarkdownReport, generateTelemetryReportFile, } from "./report.js";
4
+ export { type AnonymousCommunityPayload, AnonymousCommunityPayloadSchema, DEFAULT_TELEMETRY_SUMMARY, type ExtensionStat, type ModelStat, type TaskTimingEntry, TaskTimingEntrySchema, type TelemetryConsent, type TelemetryMode, type TelemetryStore, TelemetryStoreSchema, type TelemetrySummary, } from "./schema.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,cAAc,EACd,2BAA2B,EAC3B,0BAA0B,EAC1B,gBAAgB,EAChB,0BAA0B,EAC1B,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,2BAA2B,EAC3B,aAAa,EACb,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,yBAAyB,EAC9B,+BAA+B,EAC/B,yBAAyB,EACzB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,qBAAqB,EACrB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,oBAAoB,EACpB,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { buildAnonymousCommunityPayload, clearTelemetry, createDefaultTelemetryStore, DEFAULT_TELEMETRY_ENDPOINT, disableTelemetry, dispatchCommunityTelemetry, enableTelemetry, getTelemetryPath, isTelemetryActive, isTelemetryGloballyDisabled, loadTelemetry, recordCommitTelemetry, recordReviewGateBlock, recordTaskFinish, recordTaskStart, saveTelemetry, updateCostSavingsEstimate, } from "./collector.js";
2
+ export { detectProjectStacks, extractCommitDiffStats, extractModelFamilyCategory, } from "./detector.js";
3
+ export { formatTelemetryMarkdownReport, generateTelemetryReportFile, } from "./report.js";
4
+ export { AnonymousCommunityPayloadSchema, DEFAULT_TELEMETRY_SUMMARY, TaskTimingEntrySchema, TelemetryStoreSchema, } from "./schema.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,cAAc,EACd,2BAA2B,EAC3B,0BAA0B,EAC1B,gBAAgB,EAChB,0BAA0B,EAC1B,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,2BAA2B,EAC3B,aAAa,EACb,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,+BAA+B,EAC/B,yBAAyB,EAIzB,qBAAqB,EAIrB,oBAAoB,GAErB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { TelemetryStore } from "./schema.js";
2
+ export declare function formatTelemetryMarkdownReport(store: TelemetryStore): string;
3
+ export declare function generateTelemetryReportFile(targetDir?: string, outputPath?: string): {
4
+ filePath: string;
5
+ content: string;
6
+ };
7
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/telemetry/report.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CA0F3E;AAED,wBAAgB,2BAA2B,CACzC,SAAS,GAAE,MAAsB,EACjC,UAAU,CAAC,EAAE,MAAM,GAClB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAiBvC"}
@@ -0,0 +1,98 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { loadTelemetry } from "./collector.js";
4
+ export function formatTelemetryMarkdownReport(store) {
5
+ const sum = store.summary;
6
+ const stacks = store.detectedStacks.length > 0 ? store.detectedStacks.join(", ") : "Standard / Multi-language";
7
+ const totalLines = sum.totalLinesAdded + sum.totalLinesDeleted;
8
+ // Language Breakdown Table
9
+ const extRows = Object.values(store.extensions).sort((a, b) => b.linesAdded + b.linesDeleted - (a.linesAdded + a.linesDeleted));
10
+ const langTable = extRows.length === 0
11
+ ? "_No commit file diffs recorded yet._"
12
+ : [
13
+ "| Extension | Commits | Lines Added (+) | Lines Deleted (-) | Net Delta |",
14
+ "|---|---|---|---|---|",
15
+ ...extRows.map((r) => `| \`${r.ext}\` | ${r.commits} | +${r.linesAdded} | -${r.linesDeleted} | ${r.linesAdded - r.linesDeleted >= 0 ? `+${r.linesAdded - r.linesDeleted}` : r.linesAdded - r.linesDeleted} |`),
16
+ ].join("\n");
17
+ // Model & Tier Breakdown Table
18
+ const modelRows = Object.values(store.models).sort((a, b) => b.commits - a.commits);
19
+ const modelTable = modelRows.length === 0
20
+ ? "_No model commit activity recorded yet._"
21
+ : [
22
+ "| Model Family | Operational Tier | Commits | Share (%) |",
23
+ "|---|---|---|---|",
24
+ ...modelRows.map((m) => {
25
+ const share = sum.totalCommits > 0 ? ((m.commits / sum.totalCommits) * 100).toFixed(1) : "0.0";
26
+ return `| \`${m.family}\` | \`${m.tier}\` | ${m.commits} | ${share}% |`;
27
+ }),
28
+ ].join("\n");
29
+ return `<!-- lognexus:
30
+ kind: telemetry-report
31
+ mode: ${store.mode}
32
+ updated_at: ${store.lastUpdated}
33
+ commits: ${sum.totalCommits}
34
+ cost_savings_pct: ${sum.estimatedCostSavingsPct}%
35
+ -->
36
+
37
+ # ⚡ LogNexus Telemetry & ROI Performance Report
38
+
39
+ **Project Scope:** Local Project
40
+ **Detected Stacks:** ${stacks}
41
+ **Telemetry Mode:** \`${store.mode}\`
42
+ **Generated At:** ${new Date().toISOString()}
43
+
44
+ ---
45
+
46
+ ## 1. Executive Metrics Dashboard
47
+
48
+ | Metric | Measured Value | Notes |
49
+ |---|---|---|
50
+ | **Total Commits Governed** | **${sum.totalCommits}** | Captured via LogNexus atomic commit engine |
51
+ | **Lines of Code Modified** | **${totalLines.toLocaleString()} LOC** | +${sum.totalLinesAdded.toLocaleString()} / -${sum.totalLinesDeleted.toLocaleString()} lines |
52
+ | **Subtasks Completed** | **${sum.totalSubtasksCompleted}** | Explicit contract lifecycle tracked |
53
+ | **Review Gate Blocks Prevented** | **${sum.reviewGateBlocksPrevented}** | Self-approval or contract violations stopped |
54
+ | **Estimated Cost Savings** | **${sum.estimatedCostSavingsPct}%** (~$${sum.estimatedCostSavingsUsd.toFixed(2)} USD) | Compared to Monolithic Tier-1 frontier execution |
55
+
56
+ ---
57
+
58
+ ## 2. Stack & Language Breakdown
59
+
60
+ ${langTable}
61
+
62
+ ---
63
+
64
+ ## 3. Multi-Model Swarm Distribution
65
+
66
+ ${modelTable}
67
+
68
+ ---
69
+
70
+ ## 4. Cost Efficiency & Model-Tier ROI Evaluation
71
+
72
+ By delegating scoped subtasks to lightweight execution models (\`tier-3\`) while reserving frontier models for architecture and review gates (\`tier-1\`), LogNexus achieves significant token and budget optimizations:
73
+
74
+ - **Estimated Monolithic Baseline Cost:** ~$${sum.estimatedBaselineCostUsd.toFixed(3)} USD *(all commits run on frontier Tier-1)*
75
+ - **Estimated Multi-Tier LogNexus Cost:** ~$${sum.estimatedActualCostUsd.toFixed(3)} USD *(routed across Tier-1/2/3)*
76
+ - **Net Budget Saved:** **~$${sum.estimatedCostSavingsUsd.toFixed(3)} USD (${sum.estimatedCostSavingsPct}%)**
77
+
78
+ ---
79
+ *Report generated automatically by **LogNexus** (\`@digital-lake/lognexus\`)*
80
+ `;
81
+ }
82
+ export function generateTelemetryReportFile(targetDir = process.cwd(), outputPath) {
83
+ const store = loadTelemetry(targetDir);
84
+ const content = formatTelemetryMarkdownReport(store);
85
+ const defaultPath = join(targetDir, ".lognexus", "telemetry.md");
86
+ const filePath = outputPath
87
+ ? outputPath.startsWith("/") || outputPath.includes(":")
88
+ ? outputPath
89
+ : join(targetDir, outputPath)
90
+ : defaultPath;
91
+ const parentDir = join(filePath, "..");
92
+ if (!existsSync(parentDir)) {
93
+ mkdirSync(parentDir, { recursive: true });
94
+ }
95
+ writeFileSync(filePath, content, "utf8");
96
+ return { filePath, content };
97
+ }
98
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/telemetry/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ import { z } from "zod";
2
+ export declare const TelemetryModeSchema: z.ZodEnum<{
3
+ community: "community";
4
+ local: "local";
5
+ off: "off";
6
+ }>;
7
+ export type TelemetryMode = z.infer<typeof TelemetryModeSchema>;
8
+ export declare const TelemetryConsentSchema: z.ZodObject<{
9
+ accepted: z.ZodDefault<z.ZodBoolean>;
10
+ policyVersion: z.ZodDefault<z.ZodString>;
11
+ acceptedAt: z.ZodDefault<z.ZodNullable<z.ZodString>>;
12
+ }, z.core.$strip>;
13
+ export type TelemetryConsent = z.infer<typeof TelemetryConsentSchema>;
14
+ export declare const ExtensionStatSchema: z.ZodObject<{
15
+ ext: z.ZodString;
16
+ commits: z.ZodDefault<z.ZodNumber>;
17
+ linesAdded: z.ZodDefault<z.ZodNumber>;
18
+ linesDeleted: z.ZodDefault<z.ZodNumber>;
19
+ }, z.core.$strip>;
20
+ export type ExtensionStat = z.infer<typeof ExtensionStatSchema>;
21
+ export declare const ModelStatSchema: z.ZodObject<{
22
+ family: z.ZodString;
23
+ tier: z.ZodDefault<z.ZodString>;
24
+ commits: z.ZodDefault<z.ZodNumber>;
25
+ totalDurationSec: z.ZodDefault<z.ZodNumber>;
26
+ avgSubtaskDurationSec: z.ZodDefault<z.ZodNumber>;
27
+ }, z.core.$strip>;
28
+ export type ModelStat = z.infer<typeof ModelStatSchema>;
29
+ export declare const TelemetrySummarySchema: z.ZodObject<{
30
+ totalCommits: z.ZodDefault<z.ZodNumber>;
31
+ totalLinesAdded: z.ZodDefault<z.ZodNumber>;
32
+ totalLinesDeleted: z.ZodDefault<z.ZodNumber>;
33
+ totalSubtasksCompleted: z.ZodDefault<z.ZodNumber>;
34
+ gitNotesCoveragePct: z.ZodDefault<z.ZodNumber>;
35
+ reviewGateBlocksPrevented: z.ZodDefault<z.ZodNumber>;
36
+ estimatedBaselineCostUsd: z.ZodDefault<z.ZodNumber>;
37
+ estimatedActualCostUsd: z.ZodDefault<z.ZodNumber>;
38
+ estimatedCostSavingsUsd: z.ZodDefault<z.ZodNumber>;
39
+ estimatedCostSavingsPct: z.ZodDefault<z.ZodNumber>;
40
+ }, z.core.$strip>;
41
+ export type TelemetrySummary = z.infer<typeof TelemetrySummarySchema>;
42
+ export declare const DEFAULT_TELEMETRY_SUMMARY: TelemetrySummary;
43
+ export declare const TaskTimingEntrySchema: z.ZodObject<{
44
+ taskId: z.ZodString;
45
+ startedAt: z.ZodString;
46
+ completedAt: z.ZodDefault<z.ZodNullable<z.ZodString>>;
47
+ durationSec: z.ZodDefault<z.ZodNumber>;
48
+ }, z.core.$strip>;
49
+ export type TaskTimingEntry = z.infer<typeof TaskTimingEntrySchema>;
50
+ export declare const TelemetryStoreSchema: z.ZodObject<{
51
+ schemaVersion: z.ZodDefault<z.ZodString>;
52
+ mode: z.ZodDefault<z.ZodEnum<{
53
+ community: "community";
54
+ local: "local";
55
+ off: "off";
56
+ }>>;
57
+ anonymousProjectId: z.ZodString;
58
+ consent: z.ZodObject<{
59
+ accepted: z.ZodDefault<z.ZodBoolean>;
60
+ policyVersion: z.ZodDefault<z.ZodString>;
61
+ acceptedAt: z.ZodDefault<z.ZodNullable<z.ZodString>>;
62
+ }, z.core.$strip>;
63
+ detectedStacks: z.ZodDefault<z.ZodArray<z.ZodString>>;
64
+ taskTimings: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
65
+ taskId: z.ZodString;
66
+ startedAt: z.ZodString;
67
+ completedAt: z.ZodDefault<z.ZodNullable<z.ZodString>>;
68
+ durationSec: z.ZodDefault<z.ZodNumber>;
69
+ }, z.core.$strip>>>;
70
+ extensions: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
71
+ ext: z.ZodString;
72
+ commits: z.ZodDefault<z.ZodNumber>;
73
+ linesAdded: z.ZodDefault<z.ZodNumber>;
74
+ linesDeleted: z.ZodDefault<z.ZodNumber>;
75
+ }, z.core.$strip>>>;
76
+ models: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
77
+ family: z.ZodString;
78
+ tier: z.ZodDefault<z.ZodString>;
79
+ commits: z.ZodDefault<z.ZodNumber>;
80
+ totalDurationSec: z.ZodDefault<z.ZodNumber>;
81
+ avgSubtaskDurationSec: z.ZodDefault<z.ZodNumber>;
82
+ }, z.core.$strip>>>;
83
+ summary: z.ZodDefault<z.ZodObject<{
84
+ totalCommits: z.ZodDefault<z.ZodNumber>;
85
+ totalLinesAdded: z.ZodDefault<z.ZodNumber>;
86
+ totalLinesDeleted: z.ZodDefault<z.ZodNumber>;
87
+ totalSubtasksCompleted: z.ZodDefault<z.ZodNumber>;
88
+ gitNotesCoveragePct: z.ZodDefault<z.ZodNumber>;
89
+ reviewGateBlocksPrevented: z.ZodDefault<z.ZodNumber>;
90
+ estimatedBaselineCostUsd: z.ZodDefault<z.ZodNumber>;
91
+ estimatedActualCostUsd: z.ZodDefault<z.ZodNumber>;
92
+ estimatedCostSavingsUsd: z.ZodDefault<z.ZodNumber>;
93
+ estimatedCostSavingsPct: z.ZodDefault<z.ZodNumber>;
94
+ }, z.core.$strip>>;
95
+ lastUpdated: z.ZodDefault<z.ZodString>;
96
+ }, z.core.$strip>;
97
+ export type TelemetryStore = z.infer<typeof TelemetryStoreSchema>;
98
+ export declare const AnonymousCommunityPayloadSchema: z.ZodObject<{
99
+ schemaVersion: z.ZodDefault<z.ZodString>;
100
+ anonymousProjectId: z.ZodString;
101
+ consent: z.ZodObject<{
102
+ accepted: z.ZodDefault<z.ZodBoolean>;
103
+ policyVersion: z.ZodDefault<z.ZodString>;
104
+ acceptedAt: z.ZodDefault<z.ZodNullable<z.ZodString>>;
105
+ }, z.core.$strip>;
106
+ environment: z.ZodObject<{
107
+ os: z.ZodString;
108
+ nodeVersion: z.ZodString;
109
+ lognexusVersion: z.ZodString;
110
+ detectedStacks: z.ZodArray<z.ZodString>;
111
+ }, z.core.$strip>;
112
+ summary: z.ZodObject<{
113
+ totalCommits: z.ZodDefault<z.ZodNumber>;
114
+ totalLinesAdded: z.ZodDefault<z.ZodNumber>;
115
+ totalLinesDeleted: z.ZodDefault<z.ZodNumber>;
116
+ totalSubtasksCompleted: z.ZodDefault<z.ZodNumber>;
117
+ gitNotesCoveragePct: z.ZodDefault<z.ZodNumber>;
118
+ reviewGateBlocksPrevented: z.ZodDefault<z.ZodNumber>;
119
+ estimatedBaselineCostUsd: z.ZodDefault<z.ZodNumber>;
120
+ estimatedActualCostUsd: z.ZodDefault<z.ZodNumber>;
121
+ estimatedCostSavingsUsd: z.ZodDefault<z.ZodNumber>;
122
+ estimatedCostSavingsPct: z.ZodDefault<z.ZodNumber>;
123
+ }, z.core.$strip>;
124
+ languageBreakdown: z.ZodArray<z.ZodObject<{
125
+ ext: z.ZodString;
126
+ commits: z.ZodDefault<z.ZodNumber>;
127
+ linesAdded: z.ZodDefault<z.ZodNumber>;
128
+ linesDeleted: z.ZodDefault<z.ZodNumber>;
129
+ }, z.core.$strip>>;
130
+ modelBreakdown: z.ZodArray<z.ZodObject<{
131
+ family: z.ZodString;
132
+ tier: z.ZodDefault<z.ZodString>;
133
+ commits: z.ZodDefault<z.ZodNumber>;
134
+ totalDurationSec: z.ZodDefault<z.ZodNumber>;
135
+ avgSubtaskDurationSec: z.ZodDefault<z.ZodNumber>;
136
+ }, z.core.$strip>>;
137
+ dispatchedAt: z.ZodDefault<z.ZodString>;
138
+ }, z.core.$strip>;
139
+ export type AnonymousCommunityPayload = z.infer<typeof AnonymousCommunityPayloadSchema>;
140
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/telemetry/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,mBAAmB;;;;EAAwC,CAAC;AACzE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,sBAAsB;;;;iBAIjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,mBAAmB;;;;;iBAK9B,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,eAAe;;;;;;iBAM1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,eAAO,MAAM,sBAAsB;;;;;;;;;;;iBAWjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,yBAAyB,EAAE,gBAWvC,CAAC;AAEF,eAAO,MAAM,qBAAqB;;;;;iBAKhC,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAW/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAc1C,CAAC;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC"}
@@ -0,0 +1,78 @@
1
+ import { z } from "zod";
2
+ export const TelemetryModeSchema = z.enum(["off", "local", "community"]);
3
+ export const TelemetryConsentSchema = z.object({
4
+ accepted: z.boolean().default(false),
5
+ policyVersion: z.string().default("1.0.0"),
6
+ acceptedAt: z.string().nullable().default(null),
7
+ });
8
+ export const ExtensionStatSchema = z.object({
9
+ ext: z.string(),
10
+ commits: z.number().default(0),
11
+ linesAdded: z.number().default(0),
12
+ linesDeleted: z.number().default(0),
13
+ });
14
+ export const ModelStatSchema = z.object({
15
+ family: z.string(),
16
+ tier: z.string().default("tier-3"),
17
+ commits: z.number().default(0),
18
+ totalDurationSec: z.number().default(0),
19
+ avgSubtaskDurationSec: z.number().default(0),
20
+ });
21
+ export const TelemetrySummarySchema = z.object({
22
+ totalCommits: z.number().default(0),
23
+ totalLinesAdded: z.number().default(0),
24
+ totalLinesDeleted: z.number().default(0),
25
+ totalSubtasksCompleted: z.number().default(0),
26
+ gitNotesCoveragePct: z.number().default(100),
27
+ reviewGateBlocksPrevented: z.number().default(0),
28
+ estimatedBaselineCostUsd: z.number().default(0),
29
+ estimatedActualCostUsd: z.number().default(0),
30
+ estimatedCostSavingsUsd: z.number().default(0),
31
+ estimatedCostSavingsPct: z.number().default(0),
32
+ });
33
+ export const DEFAULT_TELEMETRY_SUMMARY = {
34
+ totalCommits: 0,
35
+ totalLinesAdded: 0,
36
+ totalLinesDeleted: 0,
37
+ totalSubtasksCompleted: 0,
38
+ gitNotesCoveragePct: 100,
39
+ reviewGateBlocksPrevented: 0,
40
+ estimatedBaselineCostUsd: 0,
41
+ estimatedActualCostUsd: 0,
42
+ estimatedCostSavingsUsd: 0,
43
+ estimatedCostSavingsPct: 0,
44
+ };
45
+ export const TaskTimingEntrySchema = z.object({
46
+ taskId: z.string(),
47
+ startedAt: z.string(),
48
+ completedAt: z.string().nullable().default(null),
49
+ durationSec: z.number().default(0),
50
+ });
51
+ export const TelemetryStoreSchema = z.object({
52
+ schemaVersion: z.string().default("1.0.0"),
53
+ mode: TelemetryModeSchema.default("off"),
54
+ anonymousProjectId: z.string(),
55
+ consent: TelemetryConsentSchema,
56
+ detectedStacks: z.array(z.string()).default([]),
57
+ taskTimings: z.record(z.string(), TaskTimingEntrySchema).default({}),
58
+ extensions: z.record(z.string(), ExtensionStatSchema).default({}),
59
+ models: z.record(z.string(), ModelStatSchema).default({}),
60
+ summary: TelemetrySummarySchema.default(DEFAULT_TELEMETRY_SUMMARY),
61
+ lastUpdated: z.string().default(() => new Date().toISOString()),
62
+ });
63
+ export const AnonymousCommunityPayloadSchema = z.object({
64
+ schemaVersion: z.string().default("1.0.0"),
65
+ anonymousProjectId: z.string(),
66
+ consent: TelemetryConsentSchema,
67
+ environment: z.object({
68
+ os: z.string(),
69
+ nodeVersion: z.string(),
70
+ lognexusVersion: z.string(),
71
+ detectedStacks: z.array(z.string()),
72
+ }),
73
+ summary: TelemetrySummarySchema,
74
+ languageBreakdown: z.array(ExtensionStatSchema),
75
+ modelBreakdown: z.array(ModelStatSchema),
76
+ dispatchedAt: z.string().default(() => new Date().toISOString()),
77
+ });
78
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/telemetry/schema.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@digital-lake/lognexus",
3
- "version": "1.1.0",
3
+ "version": "1.2.1",
4
4
  "description": "The Universal, Git-powered context & rules framework for native AI agents (Claude, OpenAI, Gemini, DeepSeek). Scaffolding CLI and repository governance.",
5
5
  "type": "module",
6
6
  "bin": {