@eeshans/howiprompt 2.1.0

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 (82) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +148 -0
  3. package/bin/bootstrap-db.mjs +166 -0
  4. package/bin/cli-helpers.mjs +86 -0
  5. package/bin/cli.mjs +205 -0
  6. package/config/ml.json +47 -0
  7. package/data/claude_code/.gitkeep +3 -0
  8. package/data/codex/.gitkeep +0 -0
  9. package/data/reference_clusters.json +314 -0
  10. package/dist/index.d.ts +18 -0
  11. package/dist/index.js +194 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/pipeline/backends.d.ts +39 -0
  14. package/dist/pipeline/backends.js +411 -0
  15. package/dist/pipeline/backends.js.map +1 -0
  16. package/dist/pipeline/classifiers.d.ts +17 -0
  17. package/dist/pipeline/classifiers.js +181 -0
  18. package/dist/pipeline/classifiers.js.map +1 -0
  19. package/dist/pipeline/config.d.ts +21 -0
  20. package/dist/pipeline/config.js +79 -0
  21. package/dist/pipeline/config.js.map +1 -0
  22. package/dist/pipeline/db.d.ts +41 -0
  23. package/dist/pipeline/db.js +130 -0
  24. package/dist/pipeline/db.js.map +1 -0
  25. package/dist/pipeline/embeddings.d.ts +15 -0
  26. package/dist/pipeline/embeddings.js +82 -0
  27. package/dist/pipeline/embeddings.js.map +1 -0
  28. package/dist/pipeline/exclusions.d.ts +86 -0
  29. package/dist/pipeline/exclusions.js +320 -0
  30. package/dist/pipeline/exclusions.js.map +1 -0
  31. package/dist/pipeline/metrics.d.ts +12 -0
  32. package/dist/pipeline/metrics.js +278 -0
  33. package/dist/pipeline/metrics.js.map +1 -0
  34. package/dist/pipeline/ml-config.d.ts +23 -0
  35. package/dist/pipeline/ml-config.js +54 -0
  36. package/dist/pipeline/ml-config.js.map +1 -0
  37. package/dist/pipeline/models.d.ts +23 -0
  38. package/dist/pipeline/models.js +21 -0
  39. package/dist/pipeline/models.js.map +1 -0
  40. package/dist/pipeline/nlp.d.ts +20 -0
  41. package/dist/pipeline/nlp.js +200 -0
  42. package/dist/pipeline/nlp.js.map +1 -0
  43. package/dist/pipeline/parsers.d.ts +11 -0
  44. package/dist/pipeline/parsers.js +492 -0
  45. package/dist/pipeline/parsers.js.map +1 -0
  46. package/dist/pipeline/registry.d.ts +21 -0
  47. package/dist/pipeline/registry.js +45 -0
  48. package/dist/pipeline/registry.js.map +1 -0
  49. package/dist/pipeline/style.d.ts +37 -0
  50. package/dist/pipeline/style.js +204 -0
  51. package/dist/pipeline/style.js.map +1 -0
  52. package/dist/pipeline/sync.d.ts +8 -0
  53. package/dist/pipeline/sync.js +52 -0
  54. package/dist/pipeline/sync.js.map +1 -0
  55. package/dist/pipeline/trends.d.ts +8 -0
  56. package/dist/pipeline/trends.js +226 -0
  57. package/dist/pipeline/trends.js.map +1 -0
  58. package/dist/server.d.ts +7 -0
  59. package/dist/server.js +216 -0
  60. package/dist/server.js.map +1 -0
  61. package/frontend/dist/_astro/MethodologyModal.astro_astro_type_script_index_0_lang.jiHwSrn-.js +34 -0
  62. package/frontend/dist/_astro/index.Ck1ZXjve.css +1 -0
  63. package/frontend/dist/_astro/index.astro_astro_type_script_index_0_lang.PuBlxVje.js +37 -0
  64. package/frontend/dist/_astro/index.astro_astro_type_script_index_1_lang.DmQY6kFx.js +1 -0
  65. package/frontend/dist/_astro/theme.CbYAaQI4.js +1 -0
  66. package/frontend/dist/_astro/wrapped.CpzRcLjf.css +1 -0
  67. package/frontend/dist/_astro/wrapped.astro_astro_type_script_index_0_lang.D4GeWu2-.js +11 -0
  68. package/frontend/dist/_astro/wrapped.astro_astro_type_script_index_1_lang.CPAAJDh5.js +1 -0
  69. package/frontend/dist/favicon.svg +4 -0
  70. package/frontend/dist/images/card_architect.png +0 -0
  71. package/frontend/dist/images/card_commander.png +0 -0
  72. package/frontend/dist/images/card_delegator.png +0 -0
  73. package/frontend/dist/images/card_explorer.png +0 -0
  74. package/frontend/dist/images/card_partner.png +0 -0
  75. package/frontend/dist/images/char_architect.png +0 -0
  76. package/frontend/dist/images/char_commander.png +0 -0
  77. package/frontend/dist/images/char_delegator.png +0 -0
  78. package/frontend/dist/images/char_explorer.png +0 -0
  79. package/frontend/dist/images/char_partner.png +0 -0
  80. package/frontend/dist/index.html +9 -0
  81. package/frontend/dist/wrapped/index.html +9 -0
  82. package/package.json +66 -0
@@ -0,0 +1,204 @@
1
+ // style.ts — Data-driven 2×2 persona scoring.
2
+ // Detail Level (brief→detailed) × Communication Style (directive→collaborative)
3
+ // Patterns validated on 21k prompts in persona-2-redesign.ipynb
4
+ // --- Interaction-move markers (refined from pattern audit on 1k prompts) ---
5
+ const MARKERS = {
6
+ correction: [
7
+ /\bactually\b/i, /\bwait\b/i, /\binstead\b/i, /\bwrong\b/i,
8
+ /\bstop\b/i, /\bno[,.]?\s+(don't|do not|that's not|not what)/i,
9
+ /\bgo back\b/i, /\bthat's wrong\b/i,
10
+ ],
11
+ inquiry: [
12
+ /\bwhy\b/i, /\bhow (do|can|to|would|does|should|is)\b/i,
13
+ /\bwhat if\b/i, /\bwhat about\b/i, /\bcompare\b/i,
14
+ /\bexplain\b/i, /\bshould (i|we)\b/i,
15
+ /\bwhat's the difference\b/i, /\bis there a (way|better)\b/i,
16
+ ],
17
+ review: [
18
+ /\bcheck\b/i, /\bverify\b/i, /\btest\b/i, /\bvalidate\b/i,
19
+ /\berror\b/i, /\bfix\b/i, /\bdebug\b/i, /\btraceback\b/i, /\breview\b/i,
20
+ ],
21
+ constraint: [
22
+ /\bmust\b/i, /\bdon't\b/i, /\bnever\b/i, /\balways\b/i,
23
+ /\bwithout\b/i, /\bexactly\b/i, /\bonly\b/i, /\bat least\b/i,
24
+ ],
25
+ };
26
+ const TASK_MARKERS = {
27
+ task_debug: [
28
+ /\berror\b/i, /\btraceback\b/i, /\bcrash(ed|es|ing)?\b/i,
29
+ /\bfailing\b/i, /\bbroken\b/i, /\bexception\b/i,
30
+ /\bnot working\b/i, /\bdoesn't work\b/i, /\bdoes not work\b/i,
31
+ ],
32
+ task_explain: [
33
+ /\bexplain\b/i, /\bwhat does\b/i, /\bhow does\b/i, /\bwhat is\b/i,
34
+ /\bwalk me through\b/i, /\bhelp me understand\b/i,
35
+ /\bwhy does\b/i, /\bwhy is\b/i,
36
+ ],
37
+ task_generate: [
38
+ /\bcreate\b/i, /\bbuild\b/i, /\bwrite\b/i, /\bimplement\b/i,
39
+ /\bgenerate\b/i, /\bset up\b/i, /\bsetup\b/i,
40
+ ],
41
+ task_refactor: [
42
+ /\brefactor\b/i, /\bclean up\b/i, /\brename\b/i,
43
+ /\brestructure\b/i, /\bsimplify\b/i,
44
+ ],
45
+ };
46
+ // Directive vs Collaborative — the Y-axis of the 2×2
47
+ const STYLE_MARKERS = {
48
+ directive: [
49
+ /^(yes|no|ok|okay|yep|nope|sure)\b/i,
50
+ /\bjust\b/i, /\bi want\b/i, /\bi need\b/i,
51
+ /\bgive me\b/i, /\btell me\b/i, /\bshow me\b/i,
52
+ /\bdo (this|that|it)\b/i, /\bgo ahead\b/i,
53
+ ],
54
+ collaborative: [
55
+ /\bcan you\b/i, /\bcould you\b/i, /\bwould you\b/i,
56
+ /\bi think\b/i, /\bmaybe\b/i, /\bperhaps\b/i,
57
+ /\blet's\b/i, /\bwe should\b/i, /\bwe could\b/i,
58
+ /\bwhat do you think\b/i, /\bany (suggestions?|ideas?|thoughts?)\b/i,
59
+ /\bhelp\b/i,
60
+ ],
61
+ };
62
+ const FILE_REF_RE = /[\w\-./]+\.(js|ts|py|go|rs|java|sql|sh|json|yaml|md|html|css)\b/g;
63
+ const LIST_MARKER_RE = /^\s*[-*\d]+\.?\s/gm;
64
+ const LINE_REF_RE = /line\s+\d+/i;
65
+ const THANKS_RE = /\b(thanks|thank you|thx)\b/i;
66
+ function countPatterns(text, patterns) {
67
+ let total = 0;
68
+ for (const p of patterns) {
69
+ const m = text.match(new RegExp(p.source, p.flags + (p.flags.includes("g") ? "" : "g")));
70
+ total += m ? m.length : 0;
71
+ }
72
+ return total;
73
+ }
74
+ export function extractFeatures(content, wordCount) {
75
+ const t = content.toLowerCase();
76
+ return {
77
+ word_count: wordCount || content.split(/\s+/).length,
78
+ char_count: content.length,
79
+ newline_count: (content.match(/\n/g) || []).length,
80
+ has_code_block: content.includes("```") ? 1 : 0,
81
+ question_count: (content.match(/\?/g) || []).length,
82
+ list_marker_count: (content.match(LIST_MARKER_RE) || []).length,
83
+ file_ref_count: (content.match(FILE_REF_RE) || []).length,
84
+ has_line_ref: LINE_REF_RE.test(t) ? 1 : 0,
85
+ correction_count: countPatterns(t, MARKERS.correction),
86
+ inquiry_count: countPatterns(t, MARKERS.inquiry),
87
+ review_count: countPatterns(t, MARKERS.review),
88
+ constraint_count: countPatterns(t, MARKERS.constraint),
89
+ task_debug_count: countPatterns(t, TASK_MARKERS.task_debug),
90
+ task_explain_count: countPatterns(t, TASK_MARKERS.task_explain),
91
+ task_generate_count: countPatterns(t, TASK_MARKERS.task_generate),
92
+ task_refactor_count: countPatterns(t, TASK_MARKERS.task_refactor),
93
+ directive_count: countPatterns(t, STYLE_MARKERS.directive),
94
+ collaborative_count: countPatterns(t, STYLE_MARKERS.collaborative),
95
+ has_please: t.includes("please") ? 1 : 0,
96
+ has_thanks: THANKS_RE.test(t) ? 1 : 0,
97
+ };
98
+ }
99
+ // Detail score: sum of structural features, sigmoid-mapped to 0–100.
100
+ // Calibrated on 21k prompts: median raw ~= −1.6, 95th pctl ~= 9.
101
+ export function computeDetailScore(f) {
102
+ const raw = zscore(f.word_count, 41, 74) +
103
+ zscore(f.char_count, 198, 446) +
104
+ zscore(f.newline_count, 2.4, 6.8) +
105
+ zscore(f.file_ref_count, 0.3, 1.2) +
106
+ f.has_code_block +
107
+ f.has_line_ref +
108
+ zscore(f.constraint_count, 0.7, 1.5) +
109
+ zscore(f.list_marker_count, 0.2, 0.9);
110
+ return sigmoid(raw, 0, 4) * 100;
111
+ }
112
+ // Style score: collaborative minus directive signals, sigmoid-mapped to 0–100.
113
+ // Calibrated on 21k prompts: median raw ~= −1.1.
114
+ export function computeStyleScore(f) {
115
+ const raw = zscore(f.collaborative_count, 0.4, 0.9) +
116
+ (f.collaborative_count > 0 ? 1 : 0) +
117
+ f.has_please +
118
+ f.has_thanks +
119
+ zscore(f.question_count, 0.4, 0.9) +
120
+ zscore(f.inquiry_count, 0.3, 0.8) -
121
+ zscore(f.directive_count, 0.6, 1.1) -
122
+ (f.directive_count > 0 ? 1 : 0);
123
+ return sigmoid(raw, 0, 3) * 100;
124
+ }
125
+ export const PERSONAS = {
126
+ "Brief + Directive": {
127
+ name: "The Commander",
128
+ quadrant: "Brief + Directive",
129
+ description: "You give precise orders in short bursts. No wasted words, no hand-holding — you know exactly what you want and expect the AI to deliver it on the first try.",
130
+ traits: ["Direct", "Efficient", "Decisive"],
131
+ },
132
+ "Brief + Collaborative": {
133
+ name: "The Partner",
134
+ quadrant: "Brief + Collaborative",
135
+ description: "You keep it short but keep it human. Quick exchanges, polite nudges, and a conversational flow that treats AI as a co-pilot, not a tool.",
136
+ traits: ["Conversational", "Collaborative", "Adaptive"],
137
+ },
138
+ "Detailed + Directive": {
139
+ name: "The Architect",
140
+ quadrant: "Detailed + Directive",
141
+ description: "You write specs, not prompts. Every request comes with constraints, file paths, and numbered requirements. You leave nothing to chance.",
142
+ traits: ["Precise", "Methodical", "Thorough"],
143
+ },
144
+ "Detailed + Collaborative": {
145
+ name: "The Explorer",
146
+ quadrant: "Detailed + Collaborative",
147
+ description: "You bring context and ask questions. Every conversation is an investigation — you explain what you're thinking, ask for alternatives, and dig into the details together.",
148
+ traits: ["Curious", "Analytical", "Open-minded"],
149
+ },
150
+ };
151
+ export function classifyQuadrant(detailScore, styleScore) {
152
+ const detailed = detailScore >= 50;
153
+ const collaborative = styleScore >= 50;
154
+ if (detailed && collaborative)
155
+ return "Detailed + Collaborative";
156
+ if (detailed)
157
+ return "Detailed + Directive";
158
+ if (collaborative)
159
+ return "Brief + Collaborative";
160
+ return "Brief + Directive";
161
+ }
162
+ export function getPersona(detailScore, styleScore) {
163
+ return PERSONAS[classifyQuadrant(detailScore, styleScore)];
164
+ }
165
+ // --- Pipeline integration ---
166
+ export async function enrichStyle(client, onBatchProgress) {
167
+ const result = await client.execute(`SELECT m.id, m.content, m.word_count FROM messages m
168
+ JOIN nlp_enrichments e ON m.id = e.message_id
169
+ WHERE m.role = 'human' AND m.is_excluded = 0
170
+ AND e.detail_score IS NULL`);
171
+ if (result.rows.length === 0)
172
+ return 0;
173
+ const batchSize = 500;
174
+ let done = 0;
175
+ for (let i = 0; i < result.rows.length; i += batchSize) {
176
+ const batch = result.rows.slice(i, i + batchSize);
177
+ const stmts = batch.map((row) => {
178
+ const features = extractFeatures(String(row.content), Number(row.word_count));
179
+ const detail = round(computeDetailScore(features), 1);
180
+ const style = round(computeStyleScore(features), 1);
181
+ const quadrant = classifyQuadrant(detail, style);
182
+ return {
183
+ sql: `UPDATE nlp_enrichments SET detail_score = ?, style_score = ?, quadrant = ? WHERE message_id = ?`,
184
+ args: [detail, style, quadrant, Number(row.id)],
185
+ };
186
+ });
187
+ await client.batch(stmts, "write");
188
+ done += batch.length;
189
+ onBatchProgress?.(done, result.rows.length);
190
+ }
191
+ return done;
192
+ }
193
+ // --- Helpers ---
194
+ function zscore(value, mean, std) {
195
+ return std > 0 ? (value - mean) / std : 0;
196
+ }
197
+ function sigmoid(x, center, scale) {
198
+ return 1 / (1 + Math.exp(-(x - center) / scale));
199
+ }
200
+ function round(n, decimals) {
201
+ const f = 10 ** decimals;
202
+ return Math.round(n * f) / f;
203
+ }
204
+ //# sourceMappingURL=style.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/pipeline/style.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface SyncResult {
2
+ files: number;
3
+ source: string;
4
+ }
5
+ export declare function syncClaudeCode(destDir: string): SyncResult;
6
+ export declare function syncCodex(destPath: string): SyncResult;
7
+ export declare function syncVsCodeChatSessions(sourceDir: string, destDir: string): SyncResult;
8
+ export declare function syncLmStudioConversations(destDir: string): SyncResult;
@@ -0,0 +1,52 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import os from "node:os";
4
+ function copyMatchingRecursive(srcDir, destDir, matcher) {
5
+ let count = 0;
6
+ for (const entry of fs.readdirSync(srcDir, { withFileTypes: true })) {
7
+ const srcPath = path.join(srcDir, entry.name);
8
+ const destPath = path.join(destDir, entry.name);
9
+ if (entry.isDirectory()) {
10
+ count += copyMatchingRecursive(srcPath, destPath, matcher);
11
+ }
12
+ else if (matcher(srcPath, entry.name)) {
13
+ fs.mkdirSync(destDir, { recursive: true });
14
+ fs.copyFileSync(srcPath, destPath);
15
+ count++;
16
+ }
17
+ }
18
+ return count;
19
+ }
20
+ export function syncClaudeCode(destDir) {
21
+ const sourceDir = path.join(os.homedir(), ".claude", "projects");
22
+ if (!fs.existsSync(sourceDir)) {
23
+ return { files: 0, source: sourceDir };
24
+ }
25
+ const filesCopied = copyMatchingRecursive(sourceDir, destDir, (_srcPath, entryName) => entryName.endsWith(".jsonl") || entryName.includes(".jsonl.backup."));
26
+ return { files: filesCopied, source: sourceDir };
27
+ }
28
+ export function syncCodex(destPath) {
29
+ const sourcePath = path.join(os.homedir(), ".codex", "history.jsonl");
30
+ if (!fs.existsSync(sourcePath)) {
31
+ return { files: 0, source: sourcePath };
32
+ }
33
+ fs.mkdirSync(path.dirname(destPath), { recursive: true });
34
+ fs.copyFileSync(sourcePath, destPath);
35
+ return { files: 1, source: sourcePath };
36
+ }
37
+ export function syncVsCodeChatSessions(sourceDir, destDir) {
38
+ if (!fs.existsSync(sourceDir)) {
39
+ return { files: 0, source: sourceDir };
40
+ }
41
+ const filesCopied = copyMatchingRecursive(sourceDir, destDir, (srcPath, entryName) => entryName.endsWith(".json") && srcPath.includes(`${path.sep}chatSessions${path.sep}`));
42
+ return { files: filesCopied, source: sourceDir };
43
+ }
44
+ export function syncLmStudioConversations(destDir) {
45
+ const sourceDir = path.join(os.homedir(), ".lmstudio", "conversations");
46
+ if (!fs.existsSync(sourceDir)) {
47
+ return { files: 0, source: sourceDir };
48
+ }
49
+ const filesCopied = copyMatchingRecursive(sourceDir, destDir, (_srcPath, entryName) => entryName.endsWith(".conversation.json"));
50
+ return { files: filesCopied, source: sourceDir };
51
+ }
52
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/pipeline/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Client } from "@libsql/client";
2
+ import { type MessageRow } from "./db.js";
3
+ import { type Platform } from "./models.js";
4
+ export declare function computeStyleSnapshot(messages: MessageRow[]): Record<string, number>;
5
+ export declare function buildTrendRollups(bucketMap: Map<string, MessageRow[]>, bucketKey: string): Record<string, any>[];
6
+ export declare function computeTrendDeltas(dailyRollups: Record<string, any>[]): Record<string, any>;
7
+ export declare function detectShiftMarkers(dailyRollups: Record<string, any>[]): Record<string, any>[];
8
+ export declare function computeTrendMetrics(client: Client, platform?: Platform): Promise<Record<string, any>>;
@@ -0,0 +1,226 @@
1
+ import { queryMessages, platformFilter } from "./db.js";
2
+ import { PLATFORM_VALUES, Role } from "./models.js";
3
+ import { BACKTRACK_PATTERNS, COMMAND_PATTERN } from "./nlp.js";
4
+ function countPatternMatches(text, pattern) {
5
+ const matches = text.match(pattern);
6
+ pattern.lastIndex = 0;
7
+ return matches?.length ?? 0;
8
+ }
9
+ export function computeStyleSnapshot(messages) {
10
+ const total = messages.length;
11
+ if (total === 0) {
12
+ return { backtrack_per_100: 0, question_rate_pct: 0, command_rate_pct: 0 };
13
+ }
14
+ let btCount = 0;
15
+ for (const pattern of Object.values(BACKTRACK_PATTERNS)) {
16
+ for (const m of messages)
17
+ btCount += countPatternMatches(m.content, pattern);
18
+ }
19
+ const qCount = messages.filter((m) => m.content.trim().endsWith("?")).length;
20
+ const cCount = messages.filter((m) => COMMAND_PATTERN.test(m.content.trim())).length;
21
+ COMMAND_PATTERN.lastIndex = 0;
22
+ return {
23
+ backtrack_per_100: round((btCount / total) * 100, 1),
24
+ question_rate_pct: round((qCount / total) * 100, 1),
25
+ command_rate_pct: round((cCount / total) * 100, 1),
26
+ };
27
+ }
28
+ export function buildTrendRollups(bucketMap, bucketKey) {
29
+ const keys = Array.from(bucketMap.keys()).sort();
30
+ const rollups = [];
31
+ for (const key of keys) {
32
+ const msgs = bucketMap.get(key);
33
+ const totalPrompts = msgs.length;
34
+ const sourceCounts = {};
35
+ const modelCounts = {};
36
+ for (const m of msgs) {
37
+ sourceCounts[m.platform] = (sourceCounts[m.platform] ?? 0) + 1;
38
+ if (m.modelId || m.modelProvider) {
39
+ const mid = m.modelId ?? "unknown";
40
+ modelCounts[mid] = (modelCounts[mid] ?? 0) + 1;
41
+ }
42
+ }
43
+ const sourceSharePct = {};
44
+ for (const src of Object.keys(sourceCounts).sort()) {
45
+ sourceSharePct[src] = totalPrompts ? round((sourceCounts[src] ?? 0) / totalPrompts * 100, 1) : 0;
46
+ }
47
+ rollups.push({
48
+ [bucketKey]: key,
49
+ prompts: totalPrompts,
50
+ source_counts: sourceCounts,
51
+ source_share_pct: sourceSharePct,
52
+ style: computeStyleSnapshot(msgs),
53
+ model_prompts: Object.values(modelCounts).reduce((a, b) => a + b, 0),
54
+ models: Object.fromEntries(Object.entries(modelCounts).sort(([, a], [, b]) => b - a)),
55
+ });
56
+ }
57
+ return rollups;
58
+ }
59
+ export function computeTrendDeltas(dailyRollups) {
60
+ if (!dailyRollups.length)
61
+ return {};
62
+ const latestDate = new Date(dailyRollups[dailyRollups.length - 1].date);
63
+ function windowRollups(days) {
64
+ const start = new Date(latestDate);
65
+ start.setDate(start.getDate() - (days - 1));
66
+ return dailyRollups.filter((item) => new Date(item.date) >= start);
67
+ }
68
+ function windowAvg(items, selector) {
69
+ if (!items.length)
70
+ return null;
71
+ return round(items.reduce((sum, item) => sum + selector(item), 0) / items.length, 1);
72
+ }
73
+ const recent7 = windowRollups(7);
74
+ const recent30 = windowRollups(30);
75
+ function dominantSourceShare(item) {
76
+ return Math.max(0, ...Object.values(item.source_share_pct || {}).map((value) => Number(value) || 0));
77
+ }
78
+ const selectors = {
79
+ prompts_per_day: (item) => item.prompts,
80
+ dominant_source_share_pct: dominantSourceShare,
81
+ backtrack_per_100: (item) => item.style.backtrack_per_100,
82
+ question_rate_pct: (item) => item.style.question_rate_pct,
83
+ command_rate_pct: (item) => item.style.command_rate_pct,
84
+ model_coverage_pct: (item) => item.prompts ? round((item.model_prompts / item.prompts) * 100, 1) : 0,
85
+ };
86
+ const deltas = {};
87
+ for (const [name, selector] of Object.entries(selectors)) {
88
+ const avg7 = windowAvg(recent7, selector);
89
+ const avg30 = windowAvg(recent30, selector);
90
+ const deltaPct = avg7 != null && avg30 != null && avg30 !== 0
91
+ ? round(((avg7 - avg30) / avg30) * 100, 1)
92
+ : null;
93
+ deltas[name] = { avg_7d: avg7, avg_30d: avg30, delta_pct: deltaPct };
94
+ }
95
+ return deltas;
96
+ }
97
+ export function detectShiftMarkers(dailyRollups) {
98
+ if (dailyRollups.length < 2)
99
+ return [];
100
+ const avgPrompts = dailyRollups.reduce((s, r) => s + r.prompts, 0) / dailyRollups.length;
101
+ const minShift = Math.max(10, Math.floor(avgPrompts * 0.35));
102
+ const markers = [];
103
+ for (let i = 1; i < dailyRollups.length; i++) {
104
+ const prev = dailyRollups[i - 1];
105
+ const curr = dailyRollups[i];
106
+ const promptDelta = curr.prompts - prev.prompts;
107
+ if (Math.abs(promptDelta) >= minShift) {
108
+ markers.push({
109
+ date: curr.date,
110
+ type: "prompt_shift",
111
+ direction: promptDelta > 0 ? "up" : "down",
112
+ delta_prompts: promptDelta,
113
+ prev_prompts: prev.prompts,
114
+ curr_prompts: curr.prompts,
115
+ magnitude: Math.abs(promptDelta),
116
+ });
117
+ }
118
+ const sources = new Set([
119
+ ...Object.keys(prev.source_share_pct || {}),
120
+ ...Object.keys(curr.source_share_pct || {}),
121
+ ]);
122
+ for (const source of sources) {
123
+ const shareDelta = round(Number(curr.source_share_pct?.[source] ?? 0) - Number(prev.source_share_pct?.[source] ?? 0), 1);
124
+ if (Math.abs(shareDelta) < 20)
125
+ continue;
126
+ markers.push({
127
+ date: curr.date,
128
+ type: "source_share_shift",
129
+ source,
130
+ direction: shareDelta > 0 ? "up" : "down",
131
+ delta_source_share_pct: shareDelta,
132
+ prev_source_share_pct: Number(prev.source_share_pct?.[source] ?? 0),
133
+ curr_source_share_pct: Number(curr.source_share_pct?.[source] ?? 0),
134
+ magnitude: Math.abs(shareDelta),
135
+ });
136
+ }
137
+ }
138
+ markers.sort((a, b) => b.magnitude - a.magnitude || a.date.localeCompare(b.date));
139
+ return markers.slice(0, 10);
140
+ }
141
+ export async function computeTrendMetrics(client, platform) {
142
+ const humanMsgs = await queryMessages(client, { role: Role.HUMAN, platform });
143
+ const dailyBuckets = new Map();
144
+ const weeklyBuckets = new Map();
145
+ for (const msg of humanMsgs) {
146
+ const d = new Date(msg.timestamp);
147
+ const dayKey = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
148
+ const dayOfWeek = (d.getDay() + 6) % 7; // 0=Mon
149
+ const weekStart = new Date(d);
150
+ weekStart.setDate(d.getDate() - dayOfWeek);
151
+ const weekKey = `${weekStart.getFullYear()}-${String(weekStart.getMonth() + 1).padStart(2, "0")}-${String(weekStart.getDate()).padStart(2, "0")}`;
152
+ if (!dailyBuckets.has(dayKey))
153
+ dailyBuckets.set(dayKey, []);
154
+ dailyBuckets.get(dayKey).push(msg);
155
+ if (!weeklyBuckets.has(weekKey))
156
+ weeklyBuckets.set(weekKey, []);
157
+ weeklyBuckets.get(weekKey).push(msg);
158
+ }
159
+ const dailyRollups = buildTrendRollups(dailyBuckets, "date");
160
+ const weeklyRollups = buildTrendRollups(weeklyBuckets, "week_start");
161
+ // Enrich weekly rollups with NLP score averages
162
+ await enrichWeeklyNlp(client, weeklyRollups, platform);
163
+ const result = {
164
+ daily_rollups: dailyRollups,
165
+ weekly_rollups: weeklyRollups,
166
+ deltas_7d_vs_30d: computeTrendDeltas(dailyRollups),
167
+ shift_markers: detectShiftMarkers(dailyRollups),
168
+ };
169
+ // When showing all platforms, add per-platform weekly breakdowns
170
+ if (!platform) {
171
+ const byPlatform = {};
172
+ for (const plat of PLATFORM_VALUES) {
173
+ const platMsgs = humanMsgs.filter((m) => m.platform === plat);
174
+ if (platMsgs.length === 0)
175
+ continue;
176
+ const platWeekly = new Map();
177
+ for (const msg of platMsgs) {
178
+ const d = new Date(msg.timestamp);
179
+ const dayOfWeek = (d.getDay() + 6) % 7;
180
+ const weekStart = new Date(d);
181
+ weekStart.setDate(d.getDate() - dayOfWeek);
182
+ const weekKey = `${weekStart.getFullYear()}-${String(weekStart.getMonth() + 1).padStart(2, "0")}-${String(weekStart.getDate()).padStart(2, "0")}`;
183
+ if (!platWeekly.has(weekKey))
184
+ platWeekly.set(weekKey, []);
185
+ platWeekly.get(weekKey).push(msg);
186
+ }
187
+ const rollups = buildTrendRollups(platWeekly, "week_start");
188
+ await enrichWeeklyNlp(client, rollups, plat);
189
+ byPlatform[plat] = rollups;
190
+ }
191
+ result.weekly_by_platform = byPlatform;
192
+ }
193
+ return result;
194
+ }
195
+ async function enrichWeeklyNlp(client, weeklyRollups, platform) {
196
+ const pf = platformFilter(platform);
197
+ const rs = await client.execute({
198
+ sql: `SELECT
199
+ strftime('%Y-%m-%d', date(m.local_date, 'weekday 0', '-6 days')) as week_start,
200
+ AVG(e.hitl_score) as hitl,
201
+ AVG(e.vibe_score) as vibe,
202
+ AVG(e.politeness_score) as politeness
203
+ FROM nlp_enrichments e
204
+ JOIN messages m ON e.message_id = m.id
205
+ WHERE m.role = 'human' AND m.is_excluded = 0 AND e.hitl_score IS NOT NULL${pf.clause}
206
+ GROUP BY week_start
207
+ ORDER BY week_start`,
208
+ args: pf.args,
209
+ });
210
+ const nlpByWeek = new Map();
211
+ for (const row of rs.rows) {
212
+ nlpByWeek.set(String(row.week_start), {
213
+ hitl_score: row.hitl != null ? round(Number(row.hitl), 1) : 0,
214
+ vibe_coder_index: row.vibe != null ? round(Number(row.vibe), 1) : 0,
215
+ politeness: row.politeness != null ? round(Number(row.politeness), 1) : null,
216
+ });
217
+ }
218
+ for (const rollup of weeklyRollups) {
219
+ rollup.nlp = nlpByWeek.get(rollup.week_start) || null;
220
+ }
221
+ }
222
+ function round(n, decimals) {
223
+ const factor = 10 ** decimals;
224
+ return Math.round(n * factor) / factor;
225
+ }
226
+ //# sourceMappingURL=trends.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trends.js","sourceRoot":"","sources":["../../src/pipeline/trends.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import http from "node:http";
2
+ export interface ServerOptions {
3
+ port: number;
4
+ dataDir: string;
5
+ dbPath: string;
6
+ }
7
+ export declare function startServer(opts: ServerOptions): Promise<http.Server>;