@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,23 @@
1
+ export interface EmbeddingConfig {
2
+ model: string;
3
+ dtype: string;
4
+ dimensions: number;
5
+ batchSize: number;
6
+ }
7
+ export interface ClassifierWeights {
8
+ [cluster: string]: number;
9
+ }
10
+ export interface ClassifierConfig {
11
+ weights: ClassifierWeights;
12
+ similarityThreshold: number;
13
+ confidenceFloor?: number;
14
+ normalizationScale: number;
15
+ centerPoint?: number;
16
+ }
17
+ export interface MlConfig {
18
+ embedding: EmbeddingConfig;
19
+ hitl: ClassifierConfig;
20
+ vibe: ClassifierConfig;
21
+ politeness: ClassifierConfig;
22
+ }
23
+ export declare function loadMlConfig(dataDir: string): MlConfig;
@@ -0,0 +1,54 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ function deepMerge(target, source) {
5
+ const result = { ...target };
6
+ for (const key of Object.keys(source)) {
7
+ if (source[key] &&
8
+ typeof source[key] === "object" &&
9
+ !Array.isArray(source[key]) &&
10
+ target[key] &&
11
+ typeof target[key] === "object") {
12
+ result[key] = deepMerge(target[key], source[key]);
13
+ }
14
+ else {
15
+ result[key] = source[key];
16
+ }
17
+ }
18
+ return result;
19
+ }
20
+ export function loadMlConfig(dataDir) {
21
+ // Load shipped defaults from config/ml.json
22
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
23
+ const defaultsPath = path.join(__dirname, "..", "..", "config", "ml.json");
24
+ let defaults = {};
25
+ try {
26
+ defaults = JSON.parse(fs.readFileSync(defaultsPath, "utf-8"));
27
+ }
28
+ catch {
29
+ // Fallback if running from dist/
30
+ const altPath = path.join(__dirname, "..", "config", "ml.json");
31
+ try {
32
+ defaults = JSON.parse(fs.readFileSync(altPath, "utf-8"));
33
+ }
34
+ catch {
35
+ // Use hardcoded minimal defaults
36
+ defaults = {
37
+ embedding: { model: "onnx-community/bge-small-en-v1.5-ONNX", dtype: "int8", dimensions: 384, batchSize: 64 },
38
+ hitl: { weights: {}, similarityThreshold: 0.35, confidenceFloor: 0.5, normalizationScale: 8 },
39
+ vibe: { weights: {}, similarityThreshold: 0.35, centerPoint: 50, normalizationScale: 5 },
40
+ };
41
+ }
42
+ }
43
+ // Load user overrides
44
+ const overridePath = path.join(dataDir, "ml.json");
45
+ let overrides = {};
46
+ try {
47
+ overrides = JSON.parse(fs.readFileSync(overridePath, "utf-8"));
48
+ }
49
+ catch {
50
+ // No overrides — fine
51
+ }
52
+ return deepMerge(defaults, overrides);
53
+ }
54
+ //# sourceMappingURL=ml-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ml-config.js","sourceRoot":"","sources":["../../src/pipeline/ml-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AA4BzC,SAAS,SAAS,CAAC,MAAW,EAAE,MAAW;IACzC,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,IACE,MAAM,CAAC,GAAG,CAAC;YACX,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ;YAC/B,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,MAAM,CAAC,GAAG,CAAC;YACX,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ,EAC/B,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,4CAA4C;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC3E,IAAI,QAAQ,GAAQ,EAAE,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,iCAAiC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAChE,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;YACjC,QAAQ,GAAG;gBACT,SAAS,EAAE,EAAE,KAAK,EAAE,uCAAuC,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE;gBAC5G,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,kBAAkB,EAAE,CAAC,EAAE;gBAC7F,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE;aACzF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACnD,IAAI,SAAS,GAAQ,EAAE,CAAC;IACxB,IAAI,CAAC;QACH,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;IAED,OAAO,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAa,CAAC;AACpD,CAAC"}
@@ -0,0 +1,23 @@
1
+ export declare enum Platform {
2
+ CLAUDE_CODE = "claude_code",
3
+ CODEX = "codex",
4
+ COPILOT_CHAT = "copilot_chat",
5
+ CURSOR = "cursor",
6
+ LMSTUDIO = "lmstudio"
7
+ }
8
+ export declare const PLATFORM_VALUES: Platform[];
9
+ export declare enum Role {
10
+ HUMAN = "human",
11
+ ASSISTANT = "assistant"
12
+ }
13
+ export interface Message {
14
+ timestamp: Date;
15
+ platform: Platform;
16
+ role: Role;
17
+ content: string;
18
+ conversationId: string;
19
+ wordCount: number;
20
+ modelId?: string;
21
+ modelProvider?: string;
22
+ sourceFile?: string;
23
+ }
@@ -0,0 +1,21 @@
1
+ export var Platform;
2
+ (function (Platform) {
3
+ Platform["CLAUDE_CODE"] = "claude_code";
4
+ Platform["CODEX"] = "codex";
5
+ Platform["COPILOT_CHAT"] = "copilot_chat";
6
+ Platform["CURSOR"] = "cursor";
7
+ Platform["LMSTUDIO"] = "lmstudio";
8
+ })(Platform || (Platform = {}));
9
+ export const PLATFORM_VALUES = [
10
+ Platform.CLAUDE_CODE,
11
+ Platform.CODEX,
12
+ Platform.COPILOT_CHAT,
13
+ Platform.CURSOR,
14
+ Platform.LMSTUDIO,
15
+ ];
16
+ export var Role;
17
+ (function (Role) {
18
+ Role["HUMAN"] = "human";
19
+ Role["ASSISTANT"] = "assistant";
20
+ })(Role || (Role = {}));
21
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/pipeline/models.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,QAMX;AAND,WAAY,QAAQ;IAClB,uCAA2B,CAAA;IAC3B,2BAAe,CAAA;IACf,yCAA6B,CAAA;IAC7B,6BAAiB,CAAA;IACjB,iCAAqB,CAAA;AACvB,CAAC,EANW,QAAQ,KAAR,QAAQ,QAMnB;AAED,MAAM,CAAC,MAAM,eAAe,GAAe;IACzC,QAAQ,CAAC,WAAW;IACpB,QAAQ,CAAC,KAAK;IACd,QAAQ,CAAC,YAAY;IACrB,QAAQ,CAAC,MAAM;IACf,QAAQ,CAAC,QAAQ;CAClB,CAAC;AAEF,MAAM,CAAN,IAAY,IAGX;AAHD,WAAY,IAAI;IACd,uBAAe,CAAA;IACf,+BAAuB,CAAA;AACzB,CAAC,EAHW,IAAI,KAAJ,IAAI,QAGf"}
@@ -0,0 +1,20 @@
1
+ import type { Client } from "@libsql/client";
2
+ import type { Platform } from "./models.js";
3
+ export declare const POLITENESS_PATTERNS: Record<string, RegExp>;
4
+ export declare const BACKTRACK_PATTERNS: Record<string, RegExp>;
5
+ export declare const COMMAND_PATTERN: RegExp;
6
+ export declare const INTENT_PATTERNS: Record<string, RegExp[]>;
7
+ export declare function classifyIntent(text: string): {
8
+ intent: string;
9
+ confidence: number;
10
+ };
11
+ export declare function computeComplexity(text: string): {
12
+ score: number;
13
+ confidence: number;
14
+ };
15
+ export declare function computeIterationStyle(text: string): {
16
+ score: number;
17
+ confidence: number;
18
+ };
19
+ export declare function enrichNlp(client: Client): Promise<number>;
20
+ export declare function computeNlpMetrics(client: Client, platform?: Platform): Promise<Record<string, any>>;
@@ -0,0 +1,200 @@
1
+ import { insertNlpEnrichments, platformFilter } from "./db.js";
2
+ export const POLITENESS_PATTERNS = {
3
+ please: /\bplease\b/gi,
4
+ thanks: /\b(thanks|thank you|thx)\b/gi,
5
+ sorry: /\b(sorry|apologies|apologize)\b/gi,
6
+ };
7
+ export const BACKTRACK_PATTERNS = {
8
+ actually: /\bactually\b/gi,
9
+ wait: /\bwait\b/gi,
10
+ never_mind: /\b(never\s*mind|nevermind)\b/gi,
11
+ scratch_that: /\b(scratch that|ignore that)\b/gi,
12
+ };
13
+ export const COMMAND_PATTERN = /^(please\s+)?(do|make|create|write|build|add|fix|update|change|remove|delete|show|run|help|can you|could you|would you|tell|explain|find|search|get|set|check|test|debug|implement|refactor)\b/i;
14
+ export const INTENT_PATTERNS = {
15
+ debug_fix: [/\b(debug|fix|error|bug|failing|broken|traceback|stack trace)\b/i],
16
+ build_feature: [/\b(build|create|implement|add|ship|feature|integrate)\b/i],
17
+ analysis_research: [/\b(analyze|audit|review|compare|benchmark|research|investigate)\b/i],
18
+ explanation_learning: [/\b(explain|why|how does|teach|walk me through|help me understand)\b/i],
19
+ planning_strategy: [/\b(plan|roadmap|milestone|phase|next steps|strategy)\b/i],
20
+ ops_commands: [/\b(run|execute|command|script|deploy|release|push|tag)\b/i],
21
+ };
22
+ const ITERATION_MARKERS = [
23
+ /\bactually\b/gi,
24
+ /\bwait\b/gi,
25
+ /\binstead\b/gi,
26
+ /\bchange\b/gi,
27
+ /\bupdate\b/gi,
28
+ /\bfix\b/gi,
29
+ /\brevise\b/gi,
30
+ /\bretry\b/gi,
31
+ /\bagain\b/gi,
32
+ /\bdifferent\b/gi,
33
+ /\bscratch that\b/gi,
34
+ /\brework\b/gi,
35
+ ];
36
+ export function classifyIntent(text) {
37
+ const scores = {};
38
+ for (const [intent, patterns] of Object.entries(INTENT_PATTERNS)) {
39
+ let score = 0;
40
+ for (const pattern of patterns) {
41
+ if (pattern.test(text))
42
+ score++;
43
+ pattern.lastIndex = 0;
44
+ }
45
+ scores[intent] = score;
46
+ }
47
+ const entries = Object.entries(scores).sort((a, b) => b[1] - a[1]);
48
+ const topIntent = entries[0][0];
49
+ const topScore = entries[0][1];
50
+ const secondScore = entries.length > 1 ? entries[1][1] : 0;
51
+ if (topScore === 0)
52
+ return { intent: "other", confidence: 0.5 };
53
+ let confidence = 0.6 + Math.min(topScore, 3) * 0.1;
54
+ if (topScore > secondScore)
55
+ confidence += 0.1;
56
+ return { intent: topIntent, confidence: round(Math.min(confidence, 0.95), 2) };
57
+ }
58
+ export function computeComplexity(text) {
59
+ const content = text.trim();
60
+ const words = content.split(/\s+/).filter(Boolean).length;
61
+ let score = 1.0;
62
+ if (words >= 15)
63
+ score += 0.7;
64
+ if (words >= 35)
65
+ score += 0.8;
66
+ if (words >= 70)
67
+ score += 0.8;
68
+ if (content.includes("\n"))
69
+ score += 0.5;
70
+ if ((content.match(/,/g)?.length ?? 0) >= 2 || content.includes(";"))
71
+ score += 0.4;
72
+ if (/[{}`]|--|\.\/|=|->/.test(content))
73
+ score += 0.5;
74
+ const constraintHits = (content.match(/\b(must|should|without|exactly|at least|at most|step|checklist|constraint)\b/gi) ?? []).length;
75
+ score += Math.min(constraintHits, 3) * 0.2;
76
+ const finalScore = round(Math.min(score, 5.0), 1);
77
+ let confidence = 0.65;
78
+ if (words >= 20)
79
+ confidence += 0.1;
80
+ if (constraintHits > 0)
81
+ confidence += 0.1;
82
+ if (content.includes("\n") || /[{}`]|--|\.\/|=|->/.test(content))
83
+ confidence += 0.05;
84
+ return { score: finalScore, confidence: round(Math.min(confidence, 0.95), 2) };
85
+ }
86
+ export function computeIterationStyle(text) {
87
+ let markerHits = 0;
88
+ for (const pattern of ITERATION_MARKERS) {
89
+ markerHits += (text.match(pattern) ?? []).length;
90
+ pattern.lastIndex = 0;
91
+ }
92
+ let score = markerHits * 20;
93
+ if (text.includes("?"))
94
+ score += 8;
95
+ if (/\b(again|retry|revise|change|update|different)\b/i.test(text))
96
+ score += 8;
97
+ const finalScore = round(Math.min(score, 100), 1);
98
+ let confidence = 0.6 + Math.min(markerHits, 3) * 0.1;
99
+ if (text.includes("?"))
100
+ confidence += 0.05;
101
+ return { score: finalScore, confidence: round(Math.min(confidence, 0.95), 2) };
102
+ }
103
+ export async function enrichNlp(client) {
104
+ const result = await client.execute("SELECT m.id, m.content FROM messages m LEFT JOIN nlp_enrichments e ON m.id = e.message_id WHERE m.role = 'human' AND m.is_excluded = 0 AND e.message_id IS NULL");
105
+ const enrichments = result.rows.map((row) => {
106
+ const content = String(row.content);
107
+ const intent = classifyIntent(content);
108
+ const complexity = computeComplexity(content);
109
+ const iteration = computeIterationStyle(content);
110
+ return {
111
+ messageId: Number(row.id),
112
+ intent: intent.intent,
113
+ intentConfidence: intent.confidence,
114
+ complexityScore: complexity.score,
115
+ complexityConfidence: complexity.confidence,
116
+ iterationScore: iteration.score,
117
+ iterationConfidence: iteration.confidence,
118
+ };
119
+ });
120
+ if (enrichments.length > 0) {
121
+ await insertNlpEnrichments(client, enrichments);
122
+ }
123
+ return enrichments.length;
124
+ }
125
+ async function aggregateClassifier(client, column, pf) {
126
+ const result = await client.execute({
127
+ sql: `SELECT AVG(e.${column}) as avg_s, AVG(e.${column.replace("_score", "_confidence")}) as avg_c, MIN(e.${column.replace("_score", "_confidence")}) as min_c, MAX(e.${column.replace("_score", "_confidence")}) as max_c FROM nlp_enrichments e JOIN messages m ON e.message_id = m.id WHERE m.role = 'human' AND m.is_excluded = 0 AND e.${column} IS NOT NULL${pf.clause}`,
128
+ args: pf.args,
129
+ });
130
+ const r = result.rows[0];
131
+ if (r.avg_s == null)
132
+ return { avg_score: null, confidence: null };
133
+ return {
134
+ avg_score: round(Number(r.avg_s), 1),
135
+ confidence: { mean: round(Number(r.avg_c), 2), min: round(Number(r.min_c), 2), max: round(Number(r.max_c), 2) },
136
+ };
137
+ }
138
+ export async function computeNlpMetrics(client, platform) {
139
+ const pf = platformFilter(platform);
140
+ const totalResult = await client.execute({
141
+ sql: `SELECT COUNT(*) as cnt FROM nlp_enrichments e JOIN messages m ON e.message_id = m.id WHERE m.role = 'human' AND m.is_excluded = 0${pf.clause}`,
142
+ args: pf.args,
143
+ });
144
+ const total = Number(totalResult.rows[0].cnt);
145
+ const emptyClassifier = { method: "embedding_similarity_v1", avg_score: null, confidence: null };
146
+ if (total === 0) {
147
+ return {
148
+ intent: { method: "deterministic_rules_v1", counts: {}, rates_pct: {}, top_intents: [], confidence: { mean: 0, min: 0, max: 0 } },
149
+ hitl_score: emptyClassifier,
150
+ vibe_coder_index: emptyClassifier,
151
+ politeness: emptyClassifier,
152
+ };
153
+ }
154
+ // Intent
155
+ const intentRows = await client.execute({
156
+ sql: `SELECT e.intent, COUNT(*) as cnt FROM nlp_enrichments e JOIN messages m ON e.message_id = m.id WHERE m.role = 'human' AND m.is_excluded = 0${pf.clause} GROUP BY e.intent ORDER BY cnt DESC, e.intent`,
157
+ args: pf.args,
158
+ });
159
+ const intentCounts = {};
160
+ const intentRates = {};
161
+ const topIntents = [];
162
+ for (const row of intentRows.rows) {
163
+ const intent = String(row.intent);
164
+ const count = Number(row.cnt);
165
+ intentCounts[intent] = count;
166
+ intentRates[intent] = round((count / total) * 100, 1);
167
+ }
168
+ for (const row of intentRows.rows.slice(0, 3)) {
169
+ const intent = String(row.intent);
170
+ topIntents.push({ intent, count: intentCounts[intent], rate_pct: intentRates[intent] });
171
+ }
172
+ const intentConf = await client.execute({
173
+ sql: `SELECT AVG(e.intent_confidence) as avg_c, MIN(e.intent_confidence) as min_c, MAX(e.intent_confidence) as max_c FROM nlp_enrichments e JOIN messages m ON e.message_id = m.id WHERE m.role = 'human' AND m.is_excluded = 0${pf.clause}`,
174
+ args: pf.args,
175
+ });
176
+ const ic = intentConf.rows[0];
177
+ // Aggregate hero embedding classifiers in parallel
178
+ const [hitl, vibe, politeness] = await Promise.all([
179
+ aggregateClassifier(client, "hitl_score", pf),
180
+ aggregateClassifier(client, "vibe_score", pf),
181
+ aggregateClassifier(client, "politeness_score", pf),
182
+ ]);
183
+ return {
184
+ intent: {
185
+ method: "deterministic_rules_v1",
186
+ counts: intentCounts,
187
+ rates_pct: intentRates,
188
+ top_intents: topIntents,
189
+ confidence: { mean: round(Number(ic.avg_c), 2), min: round(Number(ic.min_c), 2), max: round(Number(ic.max_c), 2) },
190
+ },
191
+ hitl_score: { method: "embedding_similarity_v1", ...hitl },
192
+ vibe_coder_index: { method: "embedding_similarity_v1", ...vibe },
193
+ politeness: { method: "embedding_similarity_v1", ...politeness },
194
+ };
195
+ }
196
+ function round(n, decimals) {
197
+ const factor = 10 ** decimals;
198
+ return Math.round(n * factor) / factor;
199
+ }
200
+ //# sourceMappingURL=nlp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nlp.js","sourceRoot":"","sources":["../../src/pipeline/nlp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Message, Platform } from "./models.js";
2
+ import type { CompiledRules } from "./exclusions.js";
3
+ export declare function parseClaudeCode(sourceDir: string, agentCwds?: string[], rules?: CompiledRules): Promise<Message[]>;
4
+ export interface SessionModel {
5
+ modelId?: string;
6
+ modelProvider?: string;
7
+ }
8
+ export declare function parseCodexSessionMetadata(sessionsPath: string): Promise<Map<string, SessionModel>>;
9
+ export declare function parseCodexHistory(sourcePath: string, sessionModels?: Map<string, SessionModel>): Promise<Message[]>;
10
+ export declare function parseVsCodeChatSessions(sourceDir: string, platform: Platform.COPILOT_CHAT | Platform.CURSOR): Promise<Message[]>;
11
+ export declare function parseLmStudioConversations(sourceDir: string): Promise<Message[]>;