@memberjunction/rubrics-base 0.0.0 → 6.2.0-edge.2

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 (43) hide show
  1. package/LICENSE +183 -0
  2. package/README.md +35 -28
  3. package/dist/RubricEngineBase.d.ts +150 -0
  4. package/dist/RubricEngineBase.d.ts.map +1 -0
  5. package/dist/RubricEngineBase.js +267 -0
  6. package/dist/RubricEngineBase.js.map +1 -0
  7. package/dist/RubricScoring.d.ts +60 -0
  8. package/dist/RubricScoring.d.ts.map +1 -0
  9. package/dist/RubricScoring.js +363 -0
  10. package/dist/RubricScoring.js.map +1 -0
  11. package/dist/RubricVersionDiff.d.ts +59 -0
  12. package/dist/RubricVersionDiff.d.ts.map +1 -0
  13. package/dist/RubricVersionDiff.js +256 -0
  14. package/dist/RubricVersionDiff.js.map +1 -0
  15. package/dist/authoring.d.ts +16 -0
  16. package/dist/authoring.d.ts.map +1 -0
  17. package/dist/authoring.js +98 -0
  18. package/dist/authoring.js.map +1 -0
  19. package/dist/canonical.d.ts +22 -0
  20. package/dist/canonical.d.ts.map +1 -0
  21. package/dist/canonical.js +152 -0
  22. package/dist/canonical.js.map +1 -0
  23. package/dist/evidence.d.ts +13 -0
  24. package/dist/evidence.d.ts.map +1 -0
  25. package/dist/evidence.js +38 -0
  26. package/dist/evidence.js.map +1 -0
  27. package/dist/index.d.ts +12 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +9 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/sampling.d.ts +71 -0
  32. package/dist/sampling.d.ts.map +1 -0
  33. package/dist/sampling.js +63 -0
  34. package/dist/sampling.js.map +1 -0
  35. package/dist/snapshot.d.ts +16 -0
  36. package/dist/snapshot.d.ts.map +1 -0
  37. package/dist/snapshot.js +114 -0
  38. package/dist/snapshot.js.map +1 -0
  39. package/dist/types.d.ts +170 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +2 -0
  42. package/dist/types.js.map +1 -0
  43. package/package.json +39 -7
@@ -0,0 +1,267 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { BaseEngine } from '@memberjunction/core';
11
+ import { RegisterClass } from '@memberjunction/global';
12
+ import { SnapshotFromRows } from './snapshot.js';
13
+ /** Entities {@link RubricEngineBase.Config} keeps fresh. */
14
+ export const RUBRIC_CACHE_ENTITIES = [
15
+ 'MJ: Rubric Categories',
16
+ 'MJ: Rubric Scales',
17
+ 'MJ: Rubric Scale Levels',
18
+ 'MJ: Rubrics',
19
+ 'MJ: Rubric Versions',
20
+ 'MJ: Rubric Criteria',
21
+ 'MJ: Rubric Criterion Levels',
22
+ 'MJ: Rubric Bands',
23
+ 'MJ: AI Agent Rubrics',
24
+ ];
25
+ /**
26
+ * Cache of rubric definitions. It is a {@link BaseEngine}, so a metadata provider
27
+ * can refresh it. Only versions whose status is Published are kept, each with its
28
+ * criteria, level anchors, bands, and the scales those criteria use. Drafts are dropped.
29
+ * Callers can still replace the shaped cache directly.
30
+ */
31
+ let RubricEngineBase = class RubricEngineBase extends BaseEngine {
32
+ static get Instance() {
33
+ return super.getInstance();
34
+ }
35
+ constructor() {
36
+ super();
37
+ this.categories = new Map();
38
+ this.scales = new Map();
39
+ this.rubrics = new Map();
40
+ this.published = new Map();
41
+ this.publishedByRubric = new Map();
42
+ this.agentRubrics = new Map();
43
+ }
44
+ /**
45
+ * Loads the rubric entities, then rebuilds the published-version maps the
46
+ * readers use. A metadata refresh is not visible until that rebuild.
47
+ */
48
+ async Config(forceRefresh, contextUser, provider) {
49
+ const configs = RUBRIC_CACHE_ENTITIES.map(entityName => ({
50
+ Type: 'entity',
51
+ EntityName: entityName,
52
+ PropertyName: propertyName(entityName),
53
+ CacheLocal: true,
54
+ }));
55
+ await this.Load(configs, provider, forceRefresh, contextUser);
56
+ this.ReplaceCache(ShapedCacheFromRows({
57
+ categories: this.loaded('MJ: Rubric Categories'),
58
+ scales: this.loaded('MJ: Rubric Scales'),
59
+ levels: this.loaded('MJ: Rubric Scale Levels'),
60
+ rubrics: this.loaded('MJ: Rubrics'),
61
+ versions: this.loaded('MJ: Rubric Versions'),
62
+ criteria: this.loaded('MJ: Rubric Criteria'),
63
+ anchors: this.loaded('MJ: Rubric Criterion Levels'),
64
+ bands: this.loaded('MJ: Rubric Bands'),
65
+ agentRubrics: this.loaded('MJ: AI Agent Rubrics'),
66
+ }));
67
+ }
68
+ loaded(entityName) {
69
+ const value = this[propertyName(entityName)];
70
+ return Array.isArray(value) ? value : [];
71
+ }
72
+ /**
73
+ * Replace the whole cache. Published versions are stored with their tree.
74
+ * A Draft or Retired version is not stored, even when its criteria were loaded.
75
+ */
76
+ ReplaceCache(snapshot) {
77
+ this.categories = new Map(snapshot.categories.map(category => [category.id, category]));
78
+ this.scales = new Map(snapshot.scales.map(scale => [scale.id, scale]));
79
+ this.rubrics = new Map(snapshot.rubrics.map(rubric => [rubric.id, rubric]));
80
+ this.published = new Map();
81
+ this.publishedByRubric = new Map();
82
+ this.agentRubrics = new Map();
83
+ for (const version of snapshot.versions) {
84
+ if (version.status !== 'Published')
85
+ continue;
86
+ const scaleIds = new Set(version.nodes.map(node => node.scaleId).filter((id) => !!id));
87
+ const cached = {
88
+ id: version.id,
89
+ rubricId: version.rubricId,
90
+ majorVersion: version.majorVersion ?? 0,
91
+ minorVersion: version.minorVersion ?? 0,
92
+ patchVersion: version.patchVersion ?? 0,
93
+ notApplicablePolicy: version.notApplicablePolicy,
94
+ passThreshold: version.passThreshold ?? null,
95
+ minimumCompleteness: version.minimumCompleteness ?? null,
96
+ instructions: version.instructions ?? null,
97
+ scoreDisplayMin: version.scoreDisplayMin,
98
+ scoreDisplayMax: version.scoreDisplayMax,
99
+ nodes: version.nodes,
100
+ bands: version.bands,
101
+ scales: [...scaleIds].map(id => this.scales.get(id)).filter((scale) => !!scale),
102
+ };
103
+ this.published.set(cached.id, cached);
104
+ const list = this.publishedByRubric.get(cached.rubricId) ?? [];
105
+ list.push(cached);
106
+ this.publishedByRubric.set(cached.rubricId, list);
107
+ }
108
+ for (const link of snapshot.agentRubrics) {
109
+ const list = this.agentRubrics.get(link.agentId) ?? [];
110
+ list.push(link);
111
+ this.agentRubrics.set(link.agentId, list);
112
+ }
113
+ }
114
+ /** Category by id, or null when it was not in the last snapshot. */
115
+ GetCategory(id) {
116
+ return this.categories.get(id) ?? null;
117
+ }
118
+ /** Scale by id, including its levels, or null. */
119
+ GetScale(id) {
120
+ return this.scales.get(id) ?? null;
121
+ }
122
+ /** Rubric definition by id, or null. */
123
+ GetRubric(id) {
124
+ return this.rubrics.get(id) ?? null;
125
+ }
126
+ /**
127
+ * A published version with its criteria, anchors, bands, and scales.
128
+ * Returns null for an unknown id and for a draft that was present in the snapshot.
129
+ */
130
+ GetPublishedVersion(versionId) {
131
+ return this.published.get(versionId) ?? null;
132
+ }
133
+ /** Every cached published version of one rubric, highest number first. */
134
+ GetPublishedVersions(rubricId) {
135
+ const list = this.publishedByRubric.get(rubricId) ?? [];
136
+ return [...list].sort(compareVersionDesc);
137
+ }
138
+ /** The highest published version of a rubric, or null when none is published. */
139
+ GetLatestPublishedVersion(rubricId) {
140
+ return this.GetPublishedVersions(rubricId)[0] ?? null;
141
+ }
142
+ /** Rubrics linked to an agent, highest priority first. */
143
+ GetAgentRubrics(agentId) {
144
+ const list = this.agentRubrics.get(agentId) ?? [];
145
+ return [...list].sort((a, b) => b.priority - a.priority);
146
+ }
147
+ };
148
+ RubricEngineBase = __decorate([
149
+ RegisterClass(BaseEngine, 'RubricEngineBase'),
150
+ __metadata("design:paramtypes", [])
151
+ ], RubricEngineBase);
152
+ export { RubricEngineBase };
153
+ function compareVersionDesc(a, b) {
154
+ if (a.majorVersion !== b.majorVersion)
155
+ return b.majorVersion - a.majorVersion;
156
+ if (a.minorVersion !== b.minorVersion)
157
+ return b.minorVersion - a.minorVersion;
158
+ return b.patchVersion - a.patchVersion;
159
+ }
160
+ function propertyName(entityName) {
161
+ return `_${entityName.replace(/[^A-Za-z0-9]/g, '')}`;
162
+ }
163
+ /** Builds the shaped cache from the entity rows {@link RubricEngineBase.Config} just loaded. */
164
+ export function ShapedCacheFromRows(loaded) {
165
+ const scales = loaded.scales.map(scale => {
166
+ const id = text(cell(scale, 'ID'));
167
+ return {
168
+ id,
169
+ name: text(cell(scale, 'Name')),
170
+ scaleType: cell(scale, 'ScaleType') === 'Numeric' ? 'Numeric' : 'Levels',
171
+ minValue: numberOrNull(cell(scale, 'MinValue')),
172
+ maxValue: numberOrNull(cell(scale, 'MaxValue')),
173
+ step: numberOrNull(cell(scale, 'Step')),
174
+ higherIsBetter: cell(scale, 'HigherIsBetter') == null ? true : bit(cell(scale, 'HigherIsBetter')),
175
+ levels: loaded.levels.filter(level => text(cell(level, 'ScaleID')) === id).map(level => ({
176
+ id: text(cell(level, 'ID')),
177
+ label: text(cell(level, 'Label')),
178
+ value: numberOrZero(cell(level, 'Value')),
179
+ normalizedValue: numberOrZero(cell(level, 'NormalizedValue')),
180
+ description: text(cell(level, 'Description')) || null,
181
+ sequence: numberOrZero(cell(level, 'Sequence')),
182
+ })),
183
+ };
184
+ });
185
+ const versions = loaded.versions.map(version => {
186
+ const id = text(cell(version, 'ID'));
187
+ const rubricId = text(cell(version, 'RubricID'));
188
+ const criteria = loaded.criteria.filter(row => text(cell(row, 'RubricVersionID')) === id);
189
+ const criterionIds = new Set(criteria.map(row => text(cell(row, 'ID'))));
190
+ const scaleIds = criteria.map(row => text(cell(row, 'ScaleID'))).filter(scaleId => scaleId.length > 0);
191
+ const tree = SnapshotFromRows({
192
+ version,
193
+ rubricId,
194
+ criteria,
195
+ anchors: loaded.anchors.filter(row => criterionIds.has(text(cell(row, 'CriterionID')))),
196
+ bands: loaded.bands.filter(row => text(cell(row, 'RubricVersionID')) === id),
197
+ scales: loaded.scales.filter(row => scaleIds.includes(text(cell(row, 'ID')))),
198
+ levels: loaded.levels.filter(row => scaleIds.includes(text(cell(row, 'ScaleID')))),
199
+ });
200
+ return {
201
+ id,
202
+ rubricId,
203
+ status: text(cell(version, 'Status')),
204
+ majorVersion: numberOrNull(cell(version, 'MajorVersion')),
205
+ minorVersion: numberOrNull(cell(version, 'MinorVersion')),
206
+ patchVersion: numberOrNull(cell(version, 'PatchVersion')),
207
+ notApplicablePolicy: (text(cell(version, 'NotApplicablePolicy')) || 'ExcludeAndRedistribute'),
208
+ passThreshold: numberOrNull(cell(version, 'PassThreshold')),
209
+ minimumCompleteness: numberOrNull(cell(version, 'MinimumCompleteness')),
210
+ instructions: text(cell(version, 'Instructions')) || null,
211
+ scoreDisplayMin: numberOrZero(cell(version, 'ScoreDisplayMin')),
212
+ scoreDisplayMax: cell(version, 'ScoreDisplayMax') == null ? 100 : numberOrZero(cell(version, 'ScoreDisplayMax')),
213
+ nodes: tree.nodes,
214
+ bands: tree.bands,
215
+ };
216
+ });
217
+ return {
218
+ categories: loaded.categories.map(row => ({
219
+ id: text(cell(row, 'ID')),
220
+ name: text(cell(row, 'Name')),
221
+ parentId: text(cell(row, 'ParentID')) || null,
222
+ description: text(cell(row, 'Description')) || null,
223
+ sequence: numberOrZero(cell(row, 'Sequence')),
224
+ })),
225
+ scales,
226
+ rubrics: loaded.rubrics.map(row => ({
227
+ id: text(cell(row, 'ID')),
228
+ name: text(cell(row, 'Name')),
229
+ categoryId: text(cell(row, 'CategoryID')) || null,
230
+ description: text(cell(row, 'Description')) || null,
231
+ status: text(cell(row, 'Status')),
232
+ })),
233
+ versions,
234
+ agentRubrics: loaded.agentRubrics.map(row => ({
235
+ id: text(cell(row, 'ID')),
236
+ agentId: text(cell(row, 'AgentID')),
237
+ rubricId: text(cell(row, 'RubricID')),
238
+ purpose: text(cell(row, 'Purpose')) || null,
239
+ isDefault: bit(cell(row, 'IsDefault')),
240
+ status: text(cell(row, 'Status')),
241
+ priority: numberOrZero(cell(row, 'Priority')),
242
+ })),
243
+ };
244
+ }
245
+ function cell(row, name) {
246
+ const record = row;
247
+ if (record && record[name] === undefined && typeof record.Get === 'function')
248
+ return record.Get(name);
249
+ return record?.[name];
250
+ }
251
+ function text(value) {
252
+ return value == null ? '' : String(value);
253
+ }
254
+ function numberOrZero(value) {
255
+ const parsed = typeof value === 'number' ? value : Number(value);
256
+ return Number.isFinite(parsed) ? parsed : 0;
257
+ }
258
+ function numberOrNull(value) {
259
+ if (value == null || value === '')
260
+ return null;
261
+ const parsed = typeof value === 'number' ? value : Number(value);
262
+ return Number.isFinite(parsed) ? parsed : null;
263
+ }
264
+ function bit(value) {
265
+ return value === true || value === 1 || value === '1';
266
+ }
267
+ //# sourceMappingURL=RubricEngineBase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RubricEngineBase.js","sourceRoot":"","sources":["../src/RubricEngineBase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import type { RubricScoreInput, RubricScoreResult } from './types.js';
2
+ export declare const SCORING_ENGINE_VERSION: "1.0";
3
+ /** Submit is refused. The message names the criterion when one answer is illegal. */
4
+ export declare class RubricValidationError extends Error {
5
+ constructor(message: string);
6
+ }
7
+ /**
8
+ * Pure §6 scoring. No database. Scores are on a closed 0..1 scale.
9
+ *
10
+ * A levels answer scores the chosen level's NormalizedValue. A numeric answer scores
11
+ * (value − min) / (max − min), inverted when HigherIsBetter is false. A value outside
12
+ * the range or off Step is refused, not clamped.
13
+ *
14
+ * The not-applicable policy (the criterion's, otherwise the version's) changes weight:
15
+ * ExcludeAndRedistribute drops the node and the siblings' weights renormalize, and the
16
+ * node is not applicable. CountAsZero scores 0 and keeps the weight. FailEvaluation
17
+ * drops the node and raises NotApplicableFailure. NotAllowed refuses the submit and
18
+ * names the criterion.
19
+ *
20
+ * An unanswered applicable node is dropped from the math the same way, and it lowers
21
+ * completeness. Advisory nodes are stored when they have a score and never enter a
22
+ * rollup, a gate, completeness, or the verdict.
23
+ *
24
+ * Outcome, first match: Incomplete when completeness is below the minimum; then
25
+ * NotApplicableFailure, including when that policy is why the overall score is null;
26
+ * then Incomplete when the overall score is null for any other reason; then GateFailed;
27
+ * then BelowThreshold or Passed when a threshold applies; otherwise Scored. Passed is true only for
28
+ * Passed. It is null for Scored, and for Incomplete when the version has no threshold
29
+ * and no gate. Otherwise it is false.
30
+ *
31
+ * Stored decimals are rounded to 6 places after the arithmetic. Threshold, gate,
32
+ * band, and completeness comparisons use that same rounding, so a float such as
33
+ * the weighted mean of 0.1, 0.2, and 0.7 is not treated as below the value it
34
+ * rounds to.
35
+ */
36
+ export declare class RubricScoring {
37
+ static Compute(input: RubricScoreInput): RubricScoreResult;
38
+ private static scoreNode;
39
+ private static scoreLeaf;
40
+ private static applyGate;
41
+ private static hasValue;
42
+ private static normalize;
43
+ private static combine;
44
+ /** Sets each included sibling's share of the parent. All-zero weights share equally. */
45
+ private static rollupWeights;
46
+ private static assignContributions;
47
+ private static outcome;
48
+ private static passed;
49
+ /** Half-open ranges. The band whose max is 1 also contains 1. */
50
+ private static bandId;
51
+ private static confidence;
52
+ /** Path weight keeps going under a Minimum or Maximum group. Contribution does not. */
53
+ private static assignPathWeights;
54
+ private static assignGroupConfidence;
55
+ private static groupCompleteness;
56
+ private static leafConfidence;
57
+ private static flatten;
58
+ private static toStored;
59
+ }
60
+ //# sourceMappingURL=RubricScoring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RubricScoring.d.ts","sourceRoot":"","sources":["../src/RubricScoring.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAMR,gBAAgB,EAChB,iBAAiB,EAGpB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,sBAAsB,EAAG,KAAc,CAAC;AAErD,qFAAqF;AACrF,qBAAa,qBAAsB,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAIrC;AAuBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,aAAa;WACR,OAAO,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB;IAoD7D,OAAO,CAAC,MAAM,CAAC,SAAS;IAyC5B,OAAO,CAAC,MAAM,CAAC,SAAS;IA+DxB,OAAO,CAAC,MAAM,CAAC,SAAS;IAOxB,OAAO,CAAC,MAAM,CAAC,QAAQ;IAKvB,OAAO,CAAC,MAAM,CAAC,SAAS;IAmCxB,OAAO,CAAC,MAAM,CAAC,OAAO;IAUtB,wFAAwF;IACxF,OAAO,CAAC,MAAM,CAAC,aAAa;IAiB5B,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAclC,OAAO,CAAC,MAAM,CAAC,OAAO;IAgBtB,OAAO,CAAC,MAAM,CAAC,MAAM;IAWrB,iEAAiE;IACjE,OAAO,CAAC,MAAM,CAAC,MAAM;IAIrB,OAAO,CAAC,MAAM,CAAC,UAAU;IAazB,uFAAuF;IACvF,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAahC,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAQpC,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAOhC,OAAO,CAAC,MAAM,CAAC,cAAc;IAI7B,OAAO,CAAC,MAAM,CAAC,OAAO;IAUtB,OAAO,CAAC,MAAM,CAAC,QAAQ;CAc1B"}