@memberjunction/codegen-lib 5.29.0 → 5.30.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 (37) hide show
  1. package/dist/Database/codeGenDatabaseProvider.d.ts +5 -1
  2. package/dist/Database/codeGenDatabaseProvider.d.ts.map +1 -1
  3. package/dist/Database/codeGenDatabaseProvider.js.map +1 -1
  4. package/dist/Database/manage-metadata.d.ts +30 -8
  5. package/dist/Database/manage-metadata.d.ts.map +1 -1
  6. package/dist/Database/manage-metadata.js +115 -25
  7. package/dist/Database/manage-metadata.js.map +1 -1
  8. package/dist/Database/providers/postgresql/PostgreSQLCodeGenProvider.d.ts +1 -1
  9. package/dist/Database/providers/postgresql/PostgreSQLCodeGenProvider.d.ts.map +1 -1
  10. package/dist/Database/providers/postgresql/PostgreSQLCodeGenProvider.js +9 -3
  11. package/dist/Database/providers/postgresql/PostgreSQLCodeGenProvider.js.map +1 -1
  12. package/dist/Database/providers/sqlserver/SQLServerCodeGenProvider.d.ts +1 -1
  13. package/dist/Database/providers/sqlserver/SQLServerCodeGenProvider.d.ts.map +1 -1
  14. package/dist/Database/providers/sqlserver/SQLServerCodeGenProvider.js +10 -3
  15. package/dist/Database/providers/sqlserver/SQLServerCodeGenProvider.js.map +1 -1
  16. package/dist/Database/sql_codegen.d.ts +10 -0
  17. package/dist/Database/sql_codegen.d.ts.map +1 -1
  18. package/dist/Database/sql_codegen.js +30 -7
  19. package/dist/Database/sql_codegen.js.map +1 -1
  20. package/dist/Misc/advanced_generation.d.ts.map +1 -1
  21. package/dist/Misc/advanced_generation.js +16 -0
  22. package/dist/Misc/advanced_generation.js.map +1 -1
  23. package/dist/Misc/codegen-reporter.d.ts +231 -0
  24. package/dist/Misc/codegen-reporter.d.ts.map +1 -0
  25. package/dist/Misc/codegen-reporter.js +492 -0
  26. package/dist/Misc/codegen-reporter.js.map +1 -0
  27. package/dist/Misc/createNewUser.d.ts.map +1 -1
  28. package/dist/Misc/createNewUser.js +42 -41
  29. package/dist/Misc/createNewUser.js.map +1 -1
  30. package/dist/index.d.ts +1 -0
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +1 -0
  33. package/dist/index.js.map +1 -1
  34. package/dist/runCodeGen.d.ts.map +1 -1
  35. package/dist/runCodeGen.js +153 -107
  36. package/dist/runCodeGen.js.map +1 -1
  37. package/package.json +18 -18
@@ -0,0 +1,231 @@
1
+ import { BaseSingleton } from '@memberjunction/global';
2
+ /**
3
+ * Structured telemetry for a single CodeGen run.
4
+ *
5
+ * Captures phase timings (nested), per-entity work, LLM call details, and counters.
6
+ * Writes one JSON file per run to `~/.mj/codegen-state/run-<timestamp>.json`.
7
+ *
8
+ * Mirrors the file-based precedent set by `@memberjunction/metadata-sync`'s
9
+ * `~/.mj/sync-state/` pattern (PR #2330) rather than MJCore's runtime
10
+ * `TelemetryManager` (which is designed for live-app session tracking).
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * const reporter = CodeGenReporter.Instance;
15
+ * reporter.startRun();
16
+ * reporter.mark('platform', 'sqlserver');
17
+ *
18
+ * await reporter.phase('manageMetadata', async () => {
19
+ * // ... existing CodeGen code
20
+ * });
21
+ *
22
+ * await reporter.entityPhase('Customer', 'advancedGeneration', async () => {
23
+ * // ... per-entity work
24
+ * });
25
+ *
26
+ * reporter.recordLLMCall({
27
+ * entityName: 'Customer', promptName: 'SmartFieldIdentification',
28
+ * model: 'gemini-3-flash-lite', tokensIn: 3421, tokensOut: 412,
29
+ * costUSD: 0.00052, latencyMs: 1843,
30
+ * });
31
+ *
32
+ * reporter.counter('sqlStatements', 1);
33
+ *
34
+ * const reportPath = await reporter.endRun(true);
35
+ * ```
36
+ */
37
+ /**
38
+ * A single phase span. Phases can nest via the stack held in `CodeGenReporter`.
39
+ */
40
+ export type PhaseSpan = {
41
+ name: string;
42
+ /** Offset in ms from the start of the run (or start of parent for children). */
43
+ startMs: number;
44
+ /** Duration of this phase in ms. Set when the phase ends. */
45
+ durationMs: number;
46
+ /** Nested child phases, in order of entry. */
47
+ children: PhaseSpan[];
48
+ };
49
+ /**
50
+ * Per-entity breakdown entry, accumulated across phases.
51
+ */
52
+ export type EntityEntry = {
53
+ name: string;
54
+ totalMs: number;
55
+ advancedGenerationMs: number;
56
+ llmCalls: number;
57
+ tokensIn: number;
58
+ tokensOut: number;
59
+ costUSD: number;
60
+ flags: {
61
+ new: boolean;
62
+ modified: boolean;
63
+ regenerated: boolean;
64
+ };
65
+ };
66
+ /**
67
+ * Record of a single LLM call made during the run.
68
+ */
69
+ export type LLMCallEntry = {
70
+ entityName: string | null;
71
+ promptName: string;
72
+ model: string | null;
73
+ tokensIn: number;
74
+ tokensOut: number;
75
+ costUSD: number;
76
+ latencyMs: number;
77
+ /** Offset in ms from the start of the run. */
78
+ tsMs: number;
79
+ };
80
+ /**
81
+ * Free-form counters. `spCalls` is a nested dict keyed by SP name.
82
+ */
83
+ export type RunCounters = {
84
+ entitiesProcessed: number;
85
+ entitiesNew: number;
86
+ entitiesModified: number;
87
+ entitiesRegenerated: number;
88
+ sqlStatements: number;
89
+ filesWritten: number;
90
+ spCalls: Record<string, number>;
91
+ [key: string]: number | Record<string, number>;
92
+ };
93
+ /**
94
+ * Shape of the JSON report written to disk.
95
+ */
96
+ export type RunReport = {
97
+ runId: string;
98
+ startedAt: string;
99
+ finishedAt: string;
100
+ totalMs: number;
101
+ success: boolean;
102
+ context: Record<string, unknown>;
103
+ phases: PhaseSpan[];
104
+ entities: EntityEntry[];
105
+ llmCalls: LLMCallEntry[];
106
+ counters: RunCounters;
107
+ totalCostUSD: number;
108
+ totalTokensIn: number;
109
+ totalTokensOut: number;
110
+ notes: string[];
111
+ };
112
+ /**
113
+ * Compact summary returned by `listRuns()` for the report list CLI.
114
+ */
115
+ export type RunSummary = {
116
+ runId: string;
117
+ startedAt: string;
118
+ totalMs: number;
119
+ success: boolean;
120
+ entitiesProcessed: number;
121
+ llmCalls: number;
122
+ totalCostUSD: number;
123
+ filePath: string;
124
+ };
125
+ /**
126
+ * Singleton reporter for CodeGen runs. Holds state for a single run at a time;
127
+ * call `startRun()` to begin, `endRun()` to emit and reset.
128
+ */
129
+ export declare class CodeGenReporter extends BaseSingleton<CodeGenReporter> {
130
+ protected constructor();
131
+ static get Instance(): CodeGenReporter;
132
+ private _active;
133
+ private _runStartMs;
134
+ private _runStartIso;
135
+ private _phases;
136
+ private _phaseStack;
137
+ private _entities;
138
+ private _llmCalls;
139
+ private _counters;
140
+ private _context;
141
+ private _notes;
142
+ private _currentEntity;
143
+ /** True if a run is currently in progress. */
144
+ get IsActive(): boolean;
145
+ /** Begin capturing a new run. Resets all state from any prior run. */
146
+ startRun(): void;
147
+ /**
148
+ * Wrap an async block as a named phase. Phases nest automatically: any
149
+ * phases started while another is open are recorded as its children.
150
+ *
151
+ * If no run is active this becomes a pass-through — safe to call
152
+ * unconditionally.
153
+ */
154
+ phase<T>(name: string, fn: () => Promise<T>): Promise<T>;
155
+ /**
156
+ * Wrap per-entity work. Accumulates total time and sub-phase time on the
157
+ * entity record. Also sets the "current entity" so LLM calls recorded
158
+ * inside this block get attributed correctly.
159
+ */
160
+ entityPhase<T>(entityName: string, phaseName: string, fn: () => Promise<T>): Promise<T>;
161
+ /**
162
+ * Record a single LLM call. Attribution falls back to the entity set by
163
+ * the most recent `entityPhase()` if the caller doesn't supply one.
164
+ */
165
+ recordLLMCall(call: {
166
+ entityName?: string | null;
167
+ promptName: string;
168
+ model?: string | null;
169
+ tokensIn?: number;
170
+ tokensOut?: number;
171
+ costUSD?: number;
172
+ latencyMs: number;
173
+ }): void;
174
+ /** Increment a named counter (default 1). Unknown counter names are allowed. */
175
+ counter(name: string, delta?: number): void;
176
+ /** Increment a specific stored-procedure call count. */
177
+ spCallCounter(spName: string, delta?: number): void;
178
+ /** Set a one-time context value (platform, mjVersion, etc.). */
179
+ mark(key: string, value: unknown): void;
180
+ /** Flag an entity's change status. Used for attribution in the report. */
181
+ flagEntity(entityName: string, flag: 'new' | 'modified' | 'regenerated', value?: boolean): void;
182
+ /** Append a free-form note (warnings, unexpected conditions, etc.). */
183
+ note(message: string): void;
184
+ /**
185
+ * Finalize the run, write the JSON report to disk, and reset state.
186
+ * Returns the written file path (or null) and the report object.
187
+ *
188
+ * Safe to call even if `startRun()` wasn't called (becomes a no-op).
189
+ */
190
+ endRun(success: boolean): Promise<{
191
+ filePath: string | null;
192
+ report: RunReport | null;
193
+ }>;
194
+ /** Get the current in-memory report (snapshot). Mostly for tests. */
195
+ snapshot(): RunReport;
196
+ /**
197
+ * Print a human-readable summary of the completed run to stdout.
198
+ * Call after `endRun()` — operates on the saved report.
199
+ */
200
+ static printSummary(report: RunReport): void;
201
+ private static sumPhaseTime;
202
+ /** The directory where run JSON files are stored. */
203
+ static stateDir(): string;
204
+ /** List recent runs, newest first, with compact summaries. */
205
+ static listRuns(limit?: number): Promise<RunSummary[]>;
206
+ /** Load a single run by file name OR run id. Returns null if not found. */
207
+ static loadRun(runIdOrFile: string): Promise<RunReport | null>;
208
+ /**
209
+ * Prune `~/.mj/codegen-state/` to the most recent MAX_RETAINED_RUNS files.
210
+ * Non-fatal on errors.
211
+ */
212
+ static pruneOldRuns(): Promise<void>;
213
+ private getOrCreateEntity;
214
+ private emptyCounters;
215
+ private makeRunId;
216
+ /**
217
+ * Absolute start time of a phase (ms since epoch). The phase's own
218
+ * startMs is stored relative to its parent (or run start), so we have
219
+ * to walk up the stack to get an absolute.
220
+ */
221
+ private phaseStartAbs;
222
+ }
223
+ /** Shortcut: wrap a phase using the singleton. */
224
+ export declare function reportPhase<T>(name: string, fn: () => Promise<T>): Promise<T>;
225
+ /** Shortcut: wrap a per-entity phase using the singleton. */
226
+ export declare function reportEntityPhase<T>(entityName: string, phaseName: string, fn: () => Promise<T>): Promise<T>;
227
+ /** Shortcut: increment a counter using the singleton. */
228
+ export declare function reportCounter(name: string, delta?: number): void;
229
+ /** Shortcut: set a context mark using the singleton. */
230
+ export declare function reportMark(key: string, value: unknown): void;
231
+ //# sourceMappingURL=codegen-reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen-reporter.d.ts","sourceRoot":"","sources":["../../src/Misc/codegen-reporter.ts"],"names":[],"mappings":"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"}