@theromans/convex-dobty 0.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 (133) hide show
  1. package/README.md +24 -0
  2. package/dist/client/index.d.ts +287 -0
  3. package/dist/client/index.d.ts.map +1 -0
  4. package/dist/client/index.js +215 -0
  5. package/dist/client/index.js.map +1 -0
  6. package/dist/component/_generated/api.d.ts +23 -0
  7. package/dist/component/_generated/api.d.ts.map +1 -0
  8. package/dist/component/_generated/api.js +15 -0
  9. package/dist/component/_generated/api.js.map +1 -0
  10. package/dist/component/_generated/dataModel.d.ts +28 -0
  11. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  12. package/dist/component/_generated/dataModel.js +11 -0
  13. package/dist/component/_generated/dataModel.js.map +1 -0
  14. package/dist/component/_generated/server.d.ts +23 -0
  15. package/dist/component/_generated/server.d.ts.map +1 -0
  16. package/dist/component/_generated/server.js +18 -0
  17. package/dist/component/_generated/server.js.map +1 -0
  18. package/dist/component/assessment.d.ts +141 -0
  19. package/dist/component/assessment.d.ts.map +1 -0
  20. package/dist/component/assessment.js +498 -0
  21. package/dist/component/assessment.js.map +1 -0
  22. package/dist/component/convex.config.d.ts +3 -0
  23. package/dist/component/convex.config.d.ts.map +1 -0
  24. package/dist/component/convex.config.js +3 -0
  25. package/dist/component/convex.config.js.map +1 -0
  26. package/dist/component/metrics.d.ts +145 -0
  27. package/dist/component/metrics.d.ts.map +1 -0
  28. package/dist/component/metrics.js +425 -0
  29. package/dist/component/metrics.js.map +1 -0
  30. package/dist/component/potentialAnalysis.d.ts +510 -0
  31. package/dist/component/potentialAnalysis.d.ts.map +1 -0
  32. package/dist/component/potentialAnalysis.js +1035 -0
  33. package/dist/component/potentialAnalysis.js.map +1 -0
  34. package/dist/component/schema.d.ts +342 -0
  35. package/dist/component/schema.d.ts.map +1 -0
  36. package/dist/component/schema.js +194 -0
  37. package/dist/component/schema.js.map +1 -0
  38. package/dist/component/scoring.d.ts +6 -0
  39. package/dist/component/scoring.d.ts.map +1 -0
  40. package/dist/component/scoring.js +394 -0
  41. package/dist/component/scoring.js.map +1 -0
  42. package/dist/data/dm/cvr.d.ts +12 -0
  43. package/dist/data/dm/cvr.d.ts.map +1 -0
  44. package/dist/data/dm/cvr.js +71 -0
  45. package/dist/data/dm/cvr.js.map +1 -0
  46. package/dist/data/dm/guidelines.d.ts +9 -0
  47. package/dist/data/dm/guidelines.d.ts.map +1 -0
  48. package/dist/data/dm/guidelines.js +22 -0
  49. package/dist/data/dm/guidelines.js.map +1 -0
  50. package/dist/data/dm/methods.d.ts +10 -0
  51. package/dist/data/dm/methods.d.ts.map +1 -0
  52. package/dist/data/dm/methods.js +50 -0
  53. package/dist/data/dm/methods.js.map +1 -0
  54. package/dist/data/dm/systems.d.ts +10 -0
  55. package/dist/data/dm/systems.d.ts.map +1 -0
  56. package/dist/data/dm/systems.js +52 -0
  57. package/dist/data/dm/systems.js.map +1 -0
  58. package/dist/data/domains.d.ts +20 -0
  59. package/dist/data/domains.d.ts.map +1 -0
  60. package/dist/data/domains.js +264 -0
  61. package/dist/data/domains.js.map +1 -0
  62. package/dist/data/ek/cvr.d.ts +12 -0
  63. package/dist/data/ek/cvr.d.ts.map +1 -0
  64. package/dist/data/ek/cvr.js +58 -0
  65. package/dist/data/ek/cvr.js.map +1 -0
  66. package/dist/data/ek/guidelines.d.ts +9 -0
  67. package/dist/data/ek/guidelines.d.ts.map +1 -0
  68. package/dist/data/ek/guidelines.js +26 -0
  69. package/dist/data/ek/guidelines.js.map +1 -0
  70. package/dist/data/ek/methods.d.ts +9 -0
  71. package/dist/data/ek/methods.d.ts.map +1 -0
  72. package/dist/data/ek/methods.js +35 -0
  73. package/dist/data/ek/methods.js.map +1 -0
  74. package/dist/data/ek/systems.d.ts +9 -0
  75. package/dist/data/ek/systems.d.ts.map +1 -0
  76. package/dist/data/ek/systems.js +23 -0
  77. package/dist/data/ek/systems.js.map +1 -0
  78. package/dist/data/influence-areas.d.ts +26 -0
  79. package/dist/data/influence-areas.d.ts.map +1 -0
  80. package/dist/data/influence-areas.js +143 -0
  81. package/dist/data/influence-areas.js.map +1 -0
  82. package/dist/data/km/cvr.d.ts +13 -0
  83. package/dist/data/km/cvr.d.ts.map +1 -0
  84. package/dist/data/km/cvr.js +65 -0
  85. package/dist/data/km/cvr.js.map +1 -0
  86. package/dist/data/km/guidelines.d.ts +9 -0
  87. package/dist/data/km/guidelines.d.ts.map +1 -0
  88. package/dist/data/km/guidelines.js +20 -0
  89. package/dist/data/km/guidelines.js.map +1 -0
  90. package/dist/data/km/methods.d.ts +9 -0
  91. package/dist/data/km/methods.d.ts.map +1 -0
  92. package/dist/data/km/methods.js +28 -0
  93. package/dist/data/km/methods.js.map +1 -0
  94. package/dist/data/km/systems.d.ts +9 -0
  95. package/dist/data/km/systems.d.ts.map +1 -0
  96. package/dist/data/km/systems.js +18 -0
  97. package/dist/data/km/systems.js.map +1 -0
  98. package/dist/data/stammdaten.d.ts +7 -0
  99. package/dist/data/stammdaten.d.ts.map +1 -0
  100. package/dist/data/stammdaten.js +94 -0
  101. package/dist/data/stammdaten.js.map +1 -0
  102. package/dist/data/types.d.ts +113 -0
  103. package/dist/data/types.d.ts.map +1 -0
  104. package/dist/data/types.js +23 -0
  105. package/dist/data/types.js.map +1 -0
  106. package/package.json +38 -0
  107. package/src/client/index.ts +442 -0
  108. package/src/component/_generated/api.ts +35 -0
  109. package/src/component/_generated/component.ts +50 -0
  110. package/src/component/_generated/dataModel.ts +42 -0
  111. package/src/component/_generated/server.ts +48 -0
  112. package/src/component/assessment.ts +536 -0
  113. package/src/component/convex.config.ts +3 -0
  114. package/src/component/metrics.ts +479 -0
  115. package/src/component/potentialAnalysis.ts +1118 -0
  116. package/src/component/schema.ts +209 -0
  117. package/src/component/scoring.ts +485 -0
  118. package/src/data/dm/cvr.ts +75 -0
  119. package/src/data/dm/guidelines.ts +24 -0
  120. package/src/data/dm/methods.ts +53 -0
  121. package/src/data/dm/systems.ts +55 -0
  122. package/src/data/domains.ts +275 -0
  123. package/src/data/ek/cvr.ts +62 -0
  124. package/src/data/ek/guidelines.ts +28 -0
  125. package/src/data/ek/methods.ts +39 -0
  126. package/src/data/ek/systems.ts +25 -0
  127. package/src/data/influence-areas.ts +162 -0
  128. package/src/data/km/cvr.ts +69 -0
  129. package/src/data/km/guidelines.ts +22 -0
  130. package/src/data/km/methods.ts +30 -0
  131. package/src/data/km/systems.ts +20 -0
  132. package/src/data/stammdaten.ts +96 -0
  133. package/src/data/types.ts +183 -0
@@ -0,0 +1,145 @@
1
+ /** Get current metrics for a workspace, optionally filtered by domain */
2
+ export declare const getMetrics: import("convex/server").RegisteredQuery<"public", {
3
+ domain?: string | undefined;
4
+ workspaceId: string;
5
+ }, Promise<{
6
+ _id: import("convex/values").GenericId<"metrics">;
7
+ _creationTime: number;
8
+ domain: string;
9
+ workspaceId: string;
10
+ data: any;
11
+ computedAt: number;
12
+ } | {
13
+ _id: import("convex/values").GenericId<"metrics">;
14
+ _creationTime: number;
15
+ domain: string;
16
+ workspaceId: string;
17
+ data: any;
18
+ computedAt: number;
19
+ }[] | null>>;
20
+ /** Get per-dimension score breakdown for a domain */
21
+ export declare const getDimensionScores: import("convex/server").RegisteredQuery<"public", {
22
+ domain: string;
23
+ workspaceId: string;
24
+ }, Promise<{} | null>>;
25
+ /** Get CVR monetary potential breakdown */
26
+ export declare const getMonetaryPotential: import("convex/server").RegisteredQuery<"public", {
27
+ domain?: string | undefined;
28
+ workspaceId: string;
29
+ }, Promise<{} | null>>;
30
+ /** Return full dashboard data structure for a workspace */
31
+ export declare const getDashboardData: import("convex/server").RegisteredQuery<"public", {
32
+ workspaceId: string;
33
+ }, Promise<{
34
+ domains: Record<string, unknown>;
35
+ overall: {
36
+ score: number;
37
+ maturityLevels: import("../data/types.js").MaturityLevelDef[];
38
+ };
39
+ snapshotCount: number;
40
+ lastSnapshotAt: number | null;
41
+ }>>;
42
+ /** Return mode-appropriate system prompt text for AI injection */
43
+ export declare const getSystemPrompt: import("convex/server").RegisteredQuery<"public", {
44
+ workspaceType: string;
45
+ }, Promise<string>>;
46
+ /** Persist an immutable snapshot */
47
+ export declare const createSnapshot: import("convex/server").RegisteredMutation<"internal", {
48
+ domain: string;
49
+ workspaceId: string;
50
+ snapshotType: string;
51
+ }, Promise<import("convex/values").GenericId<"snapshots"> | null>>;
52
+ /** Consultant dashboard — cross-domain view with radar data, priorities, flagged items */
53
+ export declare const getConsultantDashboard: import("convex/server").RegisteredQuery<"public", {
54
+ workspaceId?: string | undefined;
55
+ }, Promise<{
56
+ radarData: Record<string, {
57
+ score: number;
58
+ domain: string;
59
+ label: string;
60
+ }>;
61
+ domainSummaries: Record<string, {
62
+ overallScore: number;
63
+ maturityLevel: string;
64
+ progress: {
65
+ total: number;
66
+ answered: number;
67
+ progressPct: number;
68
+ };
69
+ totalMonetaryPotential: number;
70
+ }>;
71
+ priorities: {
72
+ dimensionKey: string;
73
+ domain: string;
74
+ label: string;
75
+ score: number;
76
+ gap: number;
77
+ }[];
78
+ flaggedItems: {
79
+ questionKey: string;
80
+ value: unknown;
81
+ confidence: number;
82
+ source: string;
83
+ }[];
84
+ maturityLevels: import("../data/types.js").MaturityLevelDef[];
85
+ }>>;
86
+ /** User dashboard — focused workspace view with progress and next questions */
87
+ export declare const getUserDashboard: import("convex/server").RegisteredQuery<"public", {
88
+ workspaceId: string;
89
+ }, Promise<{
90
+ totalProgress: {
91
+ answered: number;
92
+ total: number;
93
+ pct: number;
94
+ };
95
+ domainProgress: Record<string, {
96
+ answered: number;
97
+ total: number;
98
+ pct: number;
99
+ score: number;
100
+ }>;
101
+ nextQuestions: {
102
+ questionKey: string;
103
+ domain: string;
104
+ dimension: string;
105
+ label: string;
106
+ }[];
107
+ }>>;
108
+ /** Aggregate metrics across multiple workspaces for Overview workspace type */
109
+ export declare const getOverviewDashboard: import("convex/server").RegisteredQuery<"public", {
110
+ workspaceIds: string[];
111
+ }, Promise<{
112
+ aggregatedDimensions: Record<string, {
113
+ avgScore: number;
114
+ domain: string;
115
+ }>;
116
+ domainAverages: Record<string, {
117
+ avgScore: number;
118
+ workspaceCount: number;
119
+ totalMonetary: number;
120
+ }>;
121
+ overall: {
122
+ avgScore: number;
123
+ maturityLevel: string;
124
+ totalMonetaryPotential: number;
125
+ workspaceCount: number;
126
+ };
127
+ maturityLevels: import("../data/types.js").MaturityLevelDef[];
128
+ }>>;
129
+ /** List snapshots for a workspace, optionally filtered by domain */
130
+ export declare const getSnapshots: import("convex/server").RegisteredQuery<"public", {
131
+ domain?: string | undefined;
132
+ workspaceId: string;
133
+ }, Promise<{
134
+ _id: import("convex/values").GenericId<"snapshots">;
135
+ _creationTime: number;
136
+ financialInputs?: any;
137
+ monetaryPotential?: any;
138
+ domain: string;
139
+ workspaceId: string;
140
+ dimensionScores: any;
141
+ overallMaturity: any;
142
+ snapshotAt: number;
143
+ snapshotType: string;
144
+ }[]>>;
145
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/component/metrics.ts"],"names":[],"mappings":"AAMA,yEAAyE;AACzE,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;YAmBrB,CAAC;AAEH,qDAAqD;AACrD,eAAO,MAAM,kBAAkB;;;sBAgB7B,CAAC;AAEH,2CAA2C;AAC3C,eAAO,MAAM,oBAAoB;;;sBA2B/B,CAAC;AAEH,2DAA2D;AAC3D,eAAO,MAAM,gBAAgB;;;;;;;;;;GAgD3B,CAAC;AAEH,kEAAkE;AAClE,eAAO,MAAM,eAAe;;mBA4C1B,CAAC;AAIH,oCAAoC;AACpC,eAAO,MAAM,cAAc;;;;kEAgCzB,CAAC;AAIH,0FAA0F;AAC1F,eAAO,MAAM,sBAAsB;;;;eAiBU,MAAM;gBAAU,MAAM;eAAS,MAAM;;;sBAE9D,MAAM;uBACL,MAAM;kBACX;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE;gCAC1C,MAAM;;;;;;;;;;qBA+CO,MAAM;eAAS,OAAO;oBAAc,MAAM;gBAAU,MAAM;;;GAwBnG,CAAC;AAEH,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB;;;;;;;;;kBAawB,MAAM;eAAS,MAAM;aAAO,MAAM;eAAS,MAAM;;;;;;;;GAgDpG,CAAC;AAIH,+EAA+E;AAC/E,eAAO,MAAM,oBAAoB;;;;kBAyC0B,MAAM;gBAAU,MAAM;;;kBAS5B,MAAM;wBAAkB,MAAM;uBAAiB,MAAM;;;;;;;;;GA6BxG,CAAC;AAEH,oEAAoE;AACpE,eAAO,MAAM,YAAY;;;;;;;;;;;;;;KAmBvB,CAAC"}
@@ -0,0 +1,425 @@
1
+ import { query, internalMutation } from "./_generated/server.js";
2
+ import { v } from "convex/values";
3
+ import { DOMAINS, MATURITY_LEVELS, getMaturityLevel } from "../data/domains.js";
4
+ // ── Queries ──
5
+ /** Get current metrics for a workspace, optionally filtered by domain */
6
+ export const getMetrics = query({
7
+ args: {
8
+ workspaceId: v.string(),
9
+ domain: v.optional(v.string()),
10
+ },
11
+ handler: async (ctx, args) => {
12
+ if (args.domain) {
13
+ return await ctx.db
14
+ .query("metrics")
15
+ .withIndex("by_workspace_domain", (q) => q.eq("workspaceId", args.workspaceId).eq("domain", args.domain))
16
+ .first();
17
+ }
18
+ return await ctx.db
19
+ .query("metrics")
20
+ .withIndex("by_workspace", (q) => q.eq("workspaceId", args.workspaceId))
21
+ .collect();
22
+ },
23
+ });
24
+ /** Get per-dimension score breakdown for a domain */
25
+ export const getDimensionScores = query({
26
+ args: {
27
+ workspaceId: v.string(),
28
+ domain: v.string(),
29
+ },
30
+ handler: async (ctx, args) => {
31
+ const metric = await ctx.db
32
+ .query("metrics")
33
+ .withIndex("by_workspace_domain", (q) => q.eq("workspaceId", args.workspaceId).eq("domain", args.domain))
34
+ .first();
35
+ if (!metric)
36
+ return null;
37
+ const data = metric.data;
38
+ return data.dimensionScores ?? null;
39
+ },
40
+ });
41
+ /** Get CVR monetary potential breakdown */
42
+ export const getMonetaryPotential = query({
43
+ args: {
44
+ workspaceId: v.string(),
45
+ domain: v.optional(v.string()),
46
+ },
47
+ handler: async (ctx, args) => {
48
+ if (args.domain) {
49
+ const metric = await ctx.db
50
+ .query("metrics")
51
+ .withIndex("by_workspace_domain", (q) => q.eq("workspaceId", args.workspaceId).eq("domain", args.domain))
52
+ .first();
53
+ if (!metric)
54
+ return null;
55
+ const data = metric.data;
56
+ return data.monetaryPotential ?? null;
57
+ }
58
+ // Aggregate across all domains
59
+ const metrics = await ctx.db
60
+ .query("metrics")
61
+ .withIndex("by_workspace", (q) => q.eq("workspaceId", args.workspaceId))
62
+ .collect();
63
+ return metrics.map((m) => ({
64
+ domain: m.domain,
65
+ monetaryPotential: m.data.monetaryPotential,
66
+ }));
67
+ },
68
+ });
69
+ /** Return full dashboard data structure for a workspace */
70
+ export const getDashboardData = query({
71
+ args: {
72
+ workspaceId: v.string(),
73
+ },
74
+ handler: async (ctx, args) => {
75
+ const metrics = await ctx.db
76
+ .query("metrics")
77
+ .withIndex("by_workspace", (q) => q.eq("workspaceId", args.workspaceId))
78
+ .collect();
79
+ const snapshots = await ctx.db
80
+ .query("snapshots")
81
+ .withIndex("by_workspace", (q) => q.eq("workspaceId", args.workspaceId))
82
+ .collect();
83
+ const domainData = {};
84
+ for (const m of metrics) {
85
+ domainData[m.domain] = m.data;
86
+ }
87
+ // Overall cross-domain summary
88
+ let totalDimScore = 0;
89
+ let totalMaxScore = 0;
90
+ for (const d of DOMAINS) {
91
+ const data = domainData[d.key];
92
+ if (data?.dimensionScores) {
93
+ const scores = data.dimensionScores;
94
+ for (const dim of Object.values(scores)) {
95
+ totalDimScore += dim.status;
96
+ }
97
+ }
98
+ totalMaxScore += d.maxScore;
99
+ }
100
+ const overallScore = totalMaxScore > 0 ? (totalDimScore / totalMaxScore) * 4 : 0;
101
+ return {
102
+ domains: domainData,
103
+ overall: {
104
+ score: Math.round(overallScore * 100) / 100,
105
+ maturityLevels: MATURITY_LEVELS,
106
+ },
107
+ snapshotCount: snapshots.length,
108
+ lastSnapshotAt: snapshots.length > 0
109
+ ? Math.max(...snapshots.map((s) => s.snapshotAt))
110
+ : null,
111
+ };
112
+ },
113
+ });
114
+ /** Return mode-appropriate system prompt text for AI injection */
115
+ export const getSystemPrompt = query({
116
+ args: {
117
+ workspaceType: v.string(),
118
+ },
119
+ handler: async (ctx, args) => {
120
+ const wt = args.workspaceType;
121
+ if (wt === "Project") {
122
+ return `## DOBT+ 5DoBT Potential Analysis
123
+ You are assisting with a 5DoBT Potential Analysis. Guide the user through the 7-step process:
124
+ 1. Project Charter — define goal, business case, scope
125
+ 2. Definition of Done — target states with effect types
126
+ 3. Influence Areas — identify relevant sub-areas from 5 DoBT dimensions
127
+ 4. Points of Changes — concrete changes creating business value
128
+ 5. Fields of Action — action measures with SP/NSP classification
129
+ 6. Potential Status — validate, estimate, calculate potentials
130
+ 7. Calculation Summary — financial evaluation with 3-year projection
131
+
132
+ Use the assessment tools to track progress and record findings.`;
133
+ }
134
+ // Excellence Rating mode (KM, EK, DM, Overview)
135
+ const domainLabel = wt === "Overview"
136
+ ? "all domains (Kostenmanagement, Einkauf, Digitales Management)"
137
+ : wt === "KM" ? "Kostenmanagement" : wt === "EK" ? "Einkauf" : "Digitales Management";
138
+ return `## DOBT+ Excellence Rating Assessment
139
+ You are conducting a DOBT+ Excellence Rating assessment for ${domainLabel}.
140
+
141
+ The assessment evaluates organizational maturity across methods, systems, guidelines, and expert dimensions on a 4-level scale:
142
+ - **Informativ (1)**: Basic awareness, ad-hoc processes
143
+ - **Steuernd (2)**: Controlled, repeatable processes with defined ownership
144
+ - **Integrativ (3)**: Integrated cross-functional processes, standardized practices
145
+ - **World Class (4)**: Optimized, continuously improving, industry-leading
146
+
147
+ ### Your role:
148
+ - Use **getAssessmentStatus** to check current progress when asked
149
+ - Use **getNextQuestions** to identify priority questions to ask
150
+ - When the user provides information about methods, systems, or guidelines in use, use **submitAssessmentAnswer** to record it with an appropriate confidence score
151
+ - Use **getMetrics** to present dimension scores and maturity levels
152
+ - For method/system/guideline questions, gather the 5 sub-aspects: bekannt (known), in Anwendung (in use), definiert/dokumentiert (defined), verankert (anchored), Schulungen (training)
153
+ - Be proactive about gathering data during natural conversation but not overly pushy
154
+ - When presenting results, explain what each maturity level means in practical terms`;
155
+ },
156
+ });
157
+ // ── Snapshot Functions ──
158
+ /** Persist an immutable snapshot */
159
+ export const createSnapshot = internalMutation({
160
+ args: {
161
+ workspaceId: v.string(),
162
+ domain: v.string(),
163
+ snapshotType: v.string(),
164
+ },
165
+ handler: async (ctx, args) => {
166
+ const metric = await ctx.db
167
+ .query("metrics")
168
+ .withIndex("by_workspace_domain", (q) => q.eq("workspaceId", args.workspaceId).eq("domain", args.domain))
169
+ .first();
170
+ if (!metric)
171
+ return null;
172
+ const data = metric.data;
173
+ const config = await ctx.db
174
+ .query("config")
175
+ .withIndex("by_key", (q) => q.eq("key", "dobt-addon"))
176
+ .first();
177
+ return await ctx.db.insert("snapshots", {
178
+ workspaceId: args.workspaceId,
179
+ domain: args.domain,
180
+ dimensionScores: data.dimensionScores,
181
+ overallMaturity: data.overallMaturity,
182
+ monetaryPotential: data.monetaryPotential,
183
+ financialInputs: config?.financialInputs,
184
+ snapshotAt: Date.now(),
185
+ snapshotType: args.snapshotType,
186
+ });
187
+ },
188
+ });
189
+ // ── Dashboard Queries (Section 8) ──
190
+ /** Consultant dashboard — cross-domain view with radar data, priorities, flagged items */
191
+ export const getConsultantDashboard = query({
192
+ args: {
193
+ workspaceId: v.optional(v.string()),
194
+ },
195
+ handler: async (ctx, args) => {
196
+ // If workspaceId given, scope to that workspace; otherwise aggregate all
197
+ let metricsQuery;
198
+ if (args.workspaceId) {
199
+ metricsQuery = await ctx.db
200
+ .query("metrics")
201
+ .withIndex("by_workspace", (q) => q.eq("workspaceId", args.workspaceId))
202
+ .collect();
203
+ }
204
+ else {
205
+ metricsQuery = await ctx.db.query("metrics").collect();
206
+ }
207
+ // Build radar data across all 21 dimensions
208
+ const radarData = {};
209
+ const domainSummaries = {};
210
+ for (const m of metricsQuery) {
211
+ const data = m.data;
212
+ const dimScores = data.dimensionScores;
213
+ const overall = data.overallMaturity;
214
+ const progress = data.progress;
215
+ const monetary = data.monetaryPotential;
216
+ const totals = monetary?.totals;
217
+ const domainDef = DOMAINS.find((d) => d.key === m.domain);
218
+ if (dimScores && domainDef) {
219
+ for (const dim of domainDef.dimensions) {
220
+ const ds = dimScores[dim.key];
221
+ if (ds) {
222
+ radarData[dim.key] = {
223
+ score: ds.status,
224
+ domain: m.domain,
225
+ label: dim.label,
226
+ };
227
+ }
228
+ }
229
+ }
230
+ domainSummaries[m.domain] = {
231
+ overallScore: overall?.overall_score ?? 0,
232
+ maturityLevel: overall?.maturity_level ?? "not_assessed",
233
+ progress: progress ?? { total: 0, answered: 0, progressPct: 0 },
234
+ totalMonetaryPotential: totals?.total_margin_effect ?? 0,
235
+ };
236
+ }
237
+ // Improvement priorities — dimensions with largest gap, sorted desc
238
+ const priorities = Object.entries(radarData)
239
+ .map(([key, val]) => ({
240
+ dimensionKey: key,
241
+ domain: val.domain,
242
+ label: val.label,
243
+ score: val.score,
244
+ gap: Math.round((4 - val.score) * 100) / 100,
245
+ }))
246
+ .filter((p) => p.gap > 0)
247
+ .sort((a, b) => b.gap - a.gap)
248
+ .slice(0, 10);
249
+ // Flagged answers — low confidence AI extractions
250
+ let flaggedItems = [];
251
+ if (args.workspaceId) {
252
+ const answers = await ctx.db
253
+ .query("answers")
254
+ .withIndex("by_workspace", (q) => q.eq("workspaceId", args.workspaceId))
255
+ .collect();
256
+ flaggedItems = answers
257
+ .filter((a) => a.source === "ai_extracted" && a.confidence !== undefined && a.confidence < 0.7)
258
+ .map((a) => ({
259
+ questionKey: a.questionKey,
260
+ value: a.value,
261
+ confidence: a.confidence,
262
+ source: a.source,
263
+ }));
264
+ }
265
+ return {
266
+ radarData,
267
+ domainSummaries,
268
+ priorities,
269
+ flaggedItems,
270
+ maturityLevels: MATURITY_LEVELS,
271
+ };
272
+ },
273
+ });
274
+ /** User dashboard — focused workspace view with progress and next questions */
275
+ export const getUserDashboard = query({
276
+ args: {
277
+ workspaceId: v.string(),
278
+ },
279
+ handler: async (ctx, args) => {
280
+ const metrics = await ctx.db
281
+ .query("metrics")
282
+ .withIndex("by_workspace", (q) => q.eq("workspaceId", args.workspaceId))
283
+ .collect();
284
+ // Summary widgets
285
+ let totalAnswered = 0;
286
+ let totalQuestions = 0;
287
+ const domainProgress = {};
288
+ for (const m of metrics) {
289
+ const data = m.data;
290
+ const progress = data.progress;
291
+ const overall = data.overallMaturity;
292
+ if (progress) {
293
+ totalAnswered += progress.answered;
294
+ totalQuestions += progress.total;
295
+ domainProgress[m.domain] = {
296
+ answered: progress.answered,
297
+ total: progress.total,
298
+ pct: progress.progressPct,
299
+ score: overall?.overall_score ?? 0,
300
+ };
301
+ }
302
+ }
303
+ // Next recommended questions
304
+ const allQuestions = await ctx.db.query("questions").collect();
305
+ const answers = await ctx.db
306
+ .query("answers")
307
+ .withIndex("by_workspace", (q) => q.eq("workspaceId", args.workspaceId))
308
+ .collect();
309
+ const answeredKeys = new Set(answers.map((a) => a.questionKey));
310
+ const nextQuestions = allQuestions
311
+ .filter((q) => !answeredKeys.has(q.questionKey))
312
+ .sort((a, b) => a.sortOrder - b.sortOrder)
313
+ .slice(0, 5)
314
+ .map((q) => ({
315
+ questionKey: q.questionKey,
316
+ domain: q.domain,
317
+ dimension: q.dimension,
318
+ label: q.label,
319
+ }));
320
+ return {
321
+ totalProgress: {
322
+ answered: totalAnswered,
323
+ total: totalQuestions,
324
+ pct: totalQuestions > 0 ? Math.round((totalAnswered / totalQuestions) * 100) : 0,
325
+ },
326
+ domainProgress,
327
+ nextQuestions,
328
+ };
329
+ },
330
+ });
331
+ // ── Overview Workspace Aggregation (Section 9) ──
332
+ /** Aggregate metrics across multiple workspaces for Overview workspace type */
333
+ export const getOverviewDashboard = query({
334
+ args: {
335
+ workspaceIds: v.array(v.string()),
336
+ },
337
+ handler: async (ctx, args) => {
338
+ // Collect metrics from all specified workspaces
339
+ const allMetrics = [];
340
+ for (const wsId of args.workspaceIds) {
341
+ const wsMetrics = await ctx.db
342
+ .query("metrics")
343
+ .withIndex("by_workspace", (q) => q.eq("workspaceId", wsId))
344
+ .collect();
345
+ allMetrics.push(...wsMetrics);
346
+ }
347
+ // Aggregate dimension scores across workspaces (average per dimension)
348
+ const dimAccum = {};
349
+ const domainAccum = {};
350
+ for (const m of allMetrics) {
351
+ const data = m.data;
352
+ const dimScores = data.dimensionScores;
353
+ const overall = data.overallMaturity;
354
+ const monetary = data.monetaryPotential;
355
+ const totals = monetary?.totals;
356
+ if (dimScores) {
357
+ for (const [dimKey, dimData] of Object.entries(dimScores)) {
358
+ if (!dimAccum[dimKey])
359
+ dimAccum[dimKey] = { sum: 0, count: 0, domain: m.domain };
360
+ dimAccum[dimKey].sum += dimData.status;
361
+ dimAccum[dimKey].count++;
362
+ }
363
+ }
364
+ if (!domainAccum[m.domain])
365
+ domainAccum[m.domain] = { score: 0, count: 0, monetaryTotal: 0 };
366
+ domainAccum[m.domain].score += overall?.overall_score ?? 0;
367
+ domainAccum[m.domain].count++;
368
+ domainAccum[m.domain].monetaryTotal += totals?.total_margin_effect ?? 0;
369
+ }
370
+ // Averaged dimension scores (21 dimensions)
371
+ const aggregatedDimensions = {};
372
+ for (const [dimKey, acc] of Object.entries(dimAccum)) {
373
+ aggregatedDimensions[dimKey] = {
374
+ avgScore: acc.count > 0 ? Math.round((acc.sum / acc.count) * 100) / 100 : 0,
375
+ domain: acc.domain,
376
+ };
377
+ }
378
+ // Domain-level averages
379
+ const domainAverages = {};
380
+ for (const [domain, acc] of Object.entries(domainAccum)) {
381
+ domainAverages[domain] = {
382
+ avgScore: acc.count > 0 ? Math.round((acc.score / acc.count) * 100) / 100 : 0,
383
+ workspaceCount: acc.count,
384
+ totalMonetary: Math.round(acc.monetaryTotal),
385
+ };
386
+ }
387
+ // Overall cross-domain average
388
+ const allDomainScores = Object.values(domainAccum).map((a) => a.count > 0 ? a.score / a.count : 0);
389
+ const overallAvg = allDomainScores.length > 0
390
+ ? allDomainScores.reduce((s, v) => s + v, 0) / allDomainScores.length
391
+ : 0;
392
+ const totalMonetary = Object.values(domainAccum).reduce((s, a) => s + a.monetaryTotal, 0);
393
+ return {
394
+ aggregatedDimensions,
395
+ domainAverages,
396
+ overall: {
397
+ avgScore: Math.round(overallAvg * 100) / 100,
398
+ maturityLevel: getMaturityLevel(overallAvg),
399
+ totalMonetaryPotential: Math.round(totalMonetary),
400
+ workspaceCount: args.workspaceIds.length,
401
+ },
402
+ maturityLevels: MATURITY_LEVELS,
403
+ };
404
+ },
405
+ });
406
+ /** List snapshots for a workspace, optionally filtered by domain */
407
+ export const getSnapshots = query({
408
+ args: {
409
+ workspaceId: v.string(),
410
+ domain: v.optional(v.string()),
411
+ },
412
+ handler: async (ctx, args) => {
413
+ if (args.domain) {
414
+ return await ctx.db
415
+ .query("snapshots")
416
+ .withIndex("by_workspace_domain", (q) => q.eq("workspaceId", args.workspaceId).eq("domain", args.domain))
417
+ .collect();
418
+ }
419
+ return await ctx.db
420
+ .query("snapshots")
421
+ .withIndex("by_workspace", (q) => q.eq("workspaceId", args.workspaceId))
422
+ .collect();
423
+ },
424
+ });
425
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/component/metrics.ts"],"names":[],"mappings":"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"}