@barivia/barsom-mcp 0.6.5 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +7 -5
  2. package/dist/index.js +1 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/shared.d.ts +85 -0
  5. package/dist/shared.d.ts.map +1 -1
  6. package/dist/shared.js +50 -2
  7. package/dist/shared.js.map +1 -1
  8. package/dist/tools/account.js +1 -1
  9. package/dist/tools/account.js.map +1 -1
  10. package/dist/tools/explore_map.d.ts +2 -1
  11. package/dist/tools/explore_map.d.ts.map +1 -1
  12. package/dist/tools/explore_map.js +121 -31
  13. package/dist/tools/explore_map.js.map +1 -1
  14. package/dist/tools/guide_barsom.d.ts.map +1 -1
  15. package/dist/tools/guide_barsom.js +2 -1
  16. package/dist/tools/guide_barsom.js.map +1 -1
  17. package/dist/tools/inference.d.ts.map +1 -1
  18. package/dist/tools/inference.js +29 -5
  19. package/dist/tools/inference.js.map +1 -1
  20. package/dist/tools/jobs.d.ts +58 -1
  21. package/dist/tools/jobs.d.ts.map +1 -1
  22. package/dist/tools/jobs.js +232 -92
  23. package/dist/tools/jobs.js.map +1 -1
  24. package/dist/tools/results.d.ts.map +1 -1
  25. package/dist/tools/results.js +56 -7
  26. package/dist/tools/results.js.map +1 -1
  27. package/dist/tools/training_guidance.js +1 -1
  28. package/dist/tools/training_guidance.js.map +1 -1
  29. package/dist/tools/training_prep.d.ts +4 -0
  30. package/dist/tools/training_prep.d.ts.map +1 -0
  31. package/dist/tools/training_prep.js +351 -0
  32. package/dist/tools/training_prep.js.map +1 -0
  33. package/dist/tools/training_review_store.d.ts +17 -0
  34. package/dist/tools/training_review_store.d.ts.map +1 -0
  35. package/dist/tools/training_review_store.js +54 -0
  36. package/dist/tools/training_review_store.js.map +1 -0
  37. package/dist/views/src/views/results-explorer/index.html +357 -0
  38. package/dist/views/src/views/training-prep/index.html +359 -0
  39. package/dist/viz-server.d.ts.map +1 -1
  40. package/dist/viz-server.js +51 -1
  41. package/dist/viz-server.js.map +1 -1
  42. package/package.json +2 -2
@@ -0,0 +1,351 @@
1
+ import { z } from "zod";
2
+ import { registerAppTool } from "@modelcontextprotocol/ext-apps/server";
3
+ import { apiCall, fetchTrainingGuidanceFromApi, getClientSupportsMcpApps, getVizPort, structuredTextResult, } from "../shared.js";
4
+ import { buildTrainMapParams, fetchTrainingPresets, } from "./jobs.js";
5
+ import { attachTrainingReviewPayload, consumeTrainingReview, getTrainingReview, storeTrainingReview, } from "./training_review_store.js";
6
+ export const TRAINING_PREP_URI = "ui://barsom/training-prep";
7
+ function getNumericColumns(preview) {
8
+ const stats = preview.column_stats ?? [];
9
+ return stats
10
+ .filter((stat) => stat.is_numeric !== false)
11
+ .map((stat) => String(stat.column ?? ""))
12
+ .filter(Boolean);
13
+ }
14
+ function getLikelyIdColumns(preview) {
15
+ const stats = preview.column_stats ?? [];
16
+ const totalRows = Number(preview.total_rows ?? 0);
17
+ if (totalRows <= 0)
18
+ return [];
19
+ return stats
20
+ .filter((stat) => stat.is_numeric !== false)
21
+ .filter((stat) => {
22
+ const mn = Number(stat.min);
23
+ const mx = Number(stat.max);
24
+ const colName = String(stat.column ?? "").toLowerCase();
25
+ const nameHint = /^(id|index|instant|row_?num|serial|record|obs)$/i.test(colName)
26
+ || colName.endsWith("_id")
27
+ || colName.startsWith("id_");
28
+ return ((mn === 0 || mn === 1) &&
29
+ mx >= totalRows * 0.9 &&
30
+ mx <= totalRows * 1.1 &&
31
+ Number(stat.null_count ?? 0) === 0 &&
32
+ nameHint);
33
+ })
34
+ .map((stat) => String(stat.column ?? ""))
35
+ .filter(Boolean);
36
+ }
37
+ function getRecommendedTrainColumns(preview, analyze) {
38
+ const recommendations = analyze.recommendations ?? {};
39
+ const recommended = (recommendations.train ?? []).filter(Boolean);
40
+ if (recommended.length > 0)
41
+ return recommended;
42
+ const numeric = getNumericColumns(preview);
43
+ const likelyId = new Set(getLikelyIdColumns(preview));
44
+ return numeric.filter((column) => !likelyId.has(column));
45
+ }
46
+ function getEpochFields(params) {
47
+ const epochs = params.epochs;
48
+ if (Array.isArray(epochs) && epochs.length >= 2) {
49
+ return {
50
+ ordering: String(epochs[0] ?? ""),
51
+ convergence: String(epochs[1] ?? ""),
52
+ };
53
+ }
54
+ if (typeof epochs === "number") {
55
+ return {
56
+ ordering: String(epochs),
57
+ convergence: "",
58
+ };
59
+ }
60
+ return { ordering: "", convergence: "" };
61
+ }
62
+ async function fetchPreparePrompt(datasetId) {
63
+ try {
64
+ const data = (await apiCall("GET", `/v1/docs/prepare_training?dataset_id=${datasetId}`));
65
+ if (typeof data.prompt === "string" && data.prompt.trim()) {
66
+ return data.prompt.trim();
67
+ }
68
+ }
69
+ catch {
70
+ // Best effort only.
71
+ }
72
+ return null;
73
+ }
74
+ function summarizePrompt(promptText) {
75
+ if (!promptText)
76
+ return [];
77
+ return promptText
78
+ .split(/\n+/)
79
+ .map((line) => line.replace(/^[-*]\s*/, "").trim())
80
+ .filter((line) => line.length > 0)
81
+ .slice(0, 4);
82
+ }
83
+ function buildWarnings(preview, selectedColumns, params, analyze) {
84
+ const warnings = [];
85
+ const stats = preview.column_stats ?? [];
86
+ const statByColumn = new Map(stats.map((stat) => [String(stat.column ?? ""), stat]));
87
+ for (const column of selectedColumns) {
88
+ const stat = statByColumn.get(column);
89
+ if (!stat)
90
+ continue;
91
+ if (stat.is_numeric === false) {
92
+ warnings.push(`${column} is not numeric in preview and should not be used directly for training.`);
93
+ }
94
+ if (Number(stat.null_count ?? 0) > 0) {
95
+ warnings.push(`${column} has ${stat.null_count} null values. Training columns must not contain missing values.`);
96
+ }
97
+ }
98
+ const totalRows = Number(preview.total_rows ?? 0);
99
+ const grid = params.grid;
100
+ if (grid && totalRows > 0 && grid[0] * grid[1] > totalRows * 0.75) {
101
+ warnings.push(`Grid ${grid[0]}×${grid[1]} may be large for ${totalRows} rows, which can create many dead nodes.`);
102
+ }
103
+ const recommendations = analyze.recommendations ?? {};
104
+ const consideredDrop = recommendations.consider_dropping ?? [];
105
+ const overlappingDrop = consideredDrop.filter((column) => selectedColumns.includes(column));
106
+ if (overlappingDrop.length > 0) {
107
+ warnings.push(`Some selected columns are highly correlated and may be redundant: ${overlappingDrop.join(", ")}.`);
108
+ }
109
+ const rawCategoricals = stats
110
+ .filter((stat) => stat.is_numeric === false)
111
+ .map((stat) => String(stat.column ?? ""))
112
+ .filter(Boolean);
113
+ if (rawCategoricals.length > 0) {
114
+ const shown = rawCategoricals.slice(0, 5).join(", ");
115
+ const suffix = rawCategoricals.length > 5 ? ", ..." : "";
116
+ warnings.push(`Raw categorical/text columns detected: ${shown}${suffix}. Exclude them by default or use baseline categorical_features explicitly.`);
117
+ }
118
+ return warnings;
119
+ }
120
+ function buildRecommendations(analyze, guidanceText, preparePrompt) {
121
+ const recommendations = [];
122
+ const dataRec = analyze.recommendations ?? {};
123
+ if ((dataRec.project_later ?? []).length > 0) {
124
+ recommendations.push(`Project later after training: ${(dataRec.project_later ?? []).join(", ")}.`);
125
+ }
126
+ if ((dataRec.low_variance ?? []).length > 0) {
127
+ recommendations.push(`Low-variance columns can usually be excluded: ${(dataRec.low_variance ?? []).join(", ")}.`);
128
+ }
129
+ for (const line of guidanceText.split("\n")) {
130
+ const trimmed = line.replace(/^-\s*/, "").trim();
131
+ if (trimmed && !trimmed.startsWith("Parameter guidance")) {
132
+ recommendations.push(trimmed);
133
+ }
134
+ if (recommendations.length >= 4)
135
+ break;
136
+ }
137
+ recommendations.push(...summarizePrompt(preparePrompt));
138
+ return [...new Set(recommendations)].slice(0, 6);
139
+ }
140
+ async function buildTrainingPrepPayload(datasetId, input) {
141
+ const [preview, analyze, presets, guidanceText, preparePrompt] = await Promise.all([
142
+ apiCall("GET", `/v1/datasets/${datasetId}/preview?n_rows=5`),
143
+ apiCall("GET", `/v1/datasets/${datasetId}/analyze`),
144
+ fetchTrainingPresets().catch(() => ({})),
145
+ fetchTrainingGuidanceFromApi().catch(() => "No training guidance available."),
146
+ fetchPreparePrompt(datasetId),
147
+ ]);
148
+ const selectedColumns = input.columns?.length
149
+ ? input.columns
150
+ : getRecommendedTrainColumns(preview, analyze);
151
+ const resolvedInput = { ...input, columns: selectedColumns };
152
+ const { params } = buildTrainMapParams(resolvedInput, presets);
153
+ const review = storeTrainingReview(datasetId, params, "train_map");
154
+ const recommendations = analyze.recommendations ?? {};
155
+ const projectLater = recommendations.project_later ?? [];
156
+ const transforms = Object.entries(params.transforms ?? {})
157
+ .map(([feature, transform]) => `${feature}: ${transform}`);
158
+ if (params.auto_log_transforms === true) {
159
+ transforms.push("Auto log transforms: enabled");
160
+ }
161
+ const cyclic = (params.cyclic_features ?? [])
162
+ .map((feature) => `${feature.feature} (period ${feature.period})`);
163
+ const temporal = (params.temporal_features ?? [])
164
+ .map((feature) => {
165
+ const columns = feature.columns ?? [];
166
+ const extract = feature.extract ?? [];
167
+ return `${columns.join(" + ")} -> ${extract.join(", ")}`;
168
+ });
169
+ const epochs = getEpochFields(params);
170
+ const grid = params.grid ?? [];
171
+ const warnings = buildWarnings(preview, selectedColumns, params, analyze);
172
+ const recommendationLines = buildRecommendations(analyze, guidanceText, preparePrompt);
173
+ const datasetName = String(preview.name ?? datasetId);
174
+ const sections = [
175
+ {
176
+ label: "Variables",
177
+ items: selectedColumns.length > 0 ? selectedColumns : ["No variables selected yet."],
178
+ },
179
+ {
180
+ label: "Project Later",
181
+ items: projectLater.length > 0 ? projectLater : ["None"],
182
+ },
183
+ {
184
+ label: "Transformations",
185
+ items: transforms.length > 0 ? transforms : ["None"],
186
+ },
187
+ {
188
+ label: "Encodings",
189
+ items: [...cyclic, ...temporal].length > 0 ? [...cyclic, ...temporal] : ["None"],
190
+ },
191
+ {
192
+ label: "Hyperparameters",
193
+ items: [
194
+ `Model: ${String(params.model ?? "SOM")}`,
195
+ `Grid: ${grid.length >= 2 ? `${grid[0]}×${grid[1]}` : "auto"}`,
196
+ `Epochs: ${epochs.ordering || "auto"}${epochs.convergence ? ` + ${epochs.convergence}` : ""}`,
197
+ `Backend: ${String(params.backend ?? "auto")}`,
198
+ `Normalize: ${Array.isArray(params.normalize) ? params.normalize.join(", ") : String(params.normalize ?? "auto")}`,
199
+ `Output: ${String(params.output_format ?? "png")}`,
200
+ ],
201
+ },
202
+ ];
203
+ const port = getVizPort();
204
+ const standaloneUrl = port ? `http://localhost:${port}/viz/training-prep?mode=standalone&review_token=${review.reviewToken}` : undefined;
205
+ const payload = {
206
+ type: "training-prep",
207
+ datasetId,
208
+ datasetName,
209
+ reviewId: review.reviewId,
210
+ reviewToken: review.reviewToken,
211
+ reviewExpiresAt: new Date(review.expiresAt).toISOString(),
212
+ selectedColumns,
213
+ suggestedProjectionColumns: projectLater,
214
+ warnings,
215
+ recommendations: recommendationLines,
216
+ sections,
217
+ editable: {
218
+ values: {
219
+ preset: input.preset,
220
+ backend: String(input.backend ?? params.backend ?? "auto"),
221
+ outputFormat: String(input.output_format ?? params.output_format ?? "png"),
222
+ model: String(input.model ?? params.model ?? "SOM"),
223
+ gridX: grid.length >= 2 ? String(grid[0]) : "",
224
+ gridY: grid.length >= 2 ? String(grid[1]) : "",
225
+ epochsOrdering: epochs.ordering,
226
+ epochsConvergence: epochs.convergence,
227
+ },
228
+ options: {
229
+ presetOptions: Object.keys(presets).map((value) => ({ value, label: value.replace("_", " ") })),
230
+ backendOptions: [
231
+ { value: "auto", label: "Auto" },
232
+ { value: "cpu", label: "CPU" },
233
+ { value: "gpu", label: "GPU" },
234
+ { value: "gpu_graphs", label: "GPU Graphs" },
235
+ ],
236
+ outputFormatOptions: [
237
+ { value: "png", label: "PNG" },
238
+ { value: "pdf", label: "PDF" },
239
+ { value: "svg", label: "SVG" },
240
+ ],
241
+ modelOptions: [
242
+ { value: "SOM", label: "SOM" },
243
+ { value: "RSOM", label: "RSOM" },
244
+ { value: "SOM-SOFT", label: "SOM-SOFT" },
245
+ { value: "RSOM-SOFT", label: "RSOM-SOFT" },
246
+ ],
247
+ },
248
+ },
249
+ draftArgs: {
250
+ ...resolvedInput,
251
+ periodic: params.periodic,
252
+ normalize: params.normalize,
253
+ columns: selectedColumns,
254
+ output_format: params.output_format,
255
+ },
256
+ summaryLines: [
257
+ `Dataset: ${datasetName}`,
258
+ `Variables: ${selectedColumns.length > 0 ? selectedColumns.join(", ") : "Not selected"}`,
259
+ `Grid: ${grid.length >= 2 ? `${grid[0]}×${grid[1]}` : "auto"}`,
260
+ `Model: ${String(params.model ?? "SOM")} | Backend: ${String(params.backend ?? "auto")} | Output: ${String(params.output_format ?? "png")}`,
261
+ ],
262
+ standaloneUrl,
263
+ };
264
+ attachTrainingReviewPayload(review.reviewToken, payload);
265
+ return payload;
266
+ }
267
+ function buildTrainingPrepContent(payload) {
268
+ const content = [
269
+ {
270
+ type: "text",
271
+ text: [
272
+ `Training prep ready for ${payload.datasetName} (${payload.datasetId}).`,
273
+ `Review ID: ${payload.reviewId}`,
274
+ ...payload.summaryLines,
275
+ payload.warnings.length > 0 ? `Warnings: ${payload.warnings.join(" | ")}` : "",
276
+ ].filter(Boolean).join("\n"),
277
+ },
278
+ ];
279
+ if (!getClientSupportsMcpApps() && payload.standaloneUrl) {
280
+ content.push({
281
+ type: "text",
282
+ text: `Interactive review: ${payload.standaloneUrl}\nOpen this URL in your browser to review and submit the prepared job.`,
283
+ });
284
+ }
285
+ return content;
286
+ }
287
+ export function registerTrainingPrepTools(server) {
288
+ const trainPrepSchema = {
289
+ dataset_id: z.string().describe("Dataset ID to prepare for training"),
290
+ preset: z.enum(["quick", "standard", "refined", "high_res"]).optional(),
291
+ grid_x: z.number().int().optional(),
292
+ grid_y: z.number().int().optional(),
293
+ epochs: z.union([z.number().int(), z.array(z.number().int()).length(2)]).optional(),
294
+ model: z.enum(["SOM", "RSOM", "SOM-SOFT", "RSOM-SOFT"]).optional(),
295
+ periodic: z.boolean().optional().default(true),
296
+ columns: z.array(z.string()).optional(),
297
+ cyclic_features: z.array(z.object({
298
+ feature: z.string(),
299
+ period: z.number(),
300
+ })).optional(),
301
+ temporal_features: z.array(z.object({
302
+ columns: z.array(z.string()),
303
+ format: z.string(),
304
+ extract: z.array(z.enum(["hour_of_day", "day_of_year", "month", "day_of_week", "minute_of_hour"])),
305
+ cyclic: z.boolean().default(true),
306
+ separator: z.string().optional(),
307
+ })).optional(),
308
+ feature_weights: z.record(z.number()).optional(),
309
+ transforms: z.record(z.enum(["log", "log1p", "log10", "sqrt", "square", "abs", "invert", "rank", "none"])).optional(),
310
+ auto_log_transforms: z.boolean().optional().default(false),
311
+ normalize: z.union([z.enum(["all", "auto", "mad", "sigmoidal"]), z.array(z.string())]).optional().default("auto"),
312
+ batch_size: z.number().int().optional(),
313
+ backend: z.enum(["auto", "cpu", "gpu", "gpu_graphs"]).optional().default("auto"),
314
+ output_format: z.enum(["png", "pdf", "svg"]).optional().default("png"),
315
+ row_range: z.tuple([z.number().int().min(1), z.number().int().min(1)]).optional(),
316
+ };
317
+ registerAppTool(server, "training_prep", {
318
+ title: "Training Preparation",
319
+ description: "Prepare a training job before submission. Opens an inline review UI showing variables, transforms, encodings, and effective hyperparameters with a guarded submit step.",
320
+ inputSchema: trainPrepSchema,
321
+ _meta: { ui: { resourceUri: TRAINING_PREP_URI } },
322
+ }, async ({ dataset_id, ...args }) => {
323
+ const payload = await buildTrainingPrepPayload(dataset_id, args);
324
+ return structuredTextResult(payload, undefined, buildTrainingPrepContent(payload));
325
+ });
326
+ server.tool("submit_prepared_training", "Submit a previously reviewed training-prep configuration. Requires an unexpired review token and explicit confirmation.", {
327
+ review_token: z.string().describe("Review token returned inside training_prep structured content."),
328
+ explicit_confirm: z.boolean().describe("Must be true to submit the reviewed training job."),
329
+ }, async ({ review_token, explicit_confirm }) => {
330
+ if (!explicit_confirm) {
331
+ throw new Error("submit_prepared_training requires explicit_confirm=true.");
332
+ }
333
+ const review = getTrainingReview(review_token);
334
+ if (!review) {
335
+ throw new Error("Review token is missing, expired, or already used. Re-open training_prep and confirm again.");
336
+ }
337
+ const data = (await apiCall("POST", "/v1/jobs", {
338
+ dataset_id: review.datasetId,
339
+ params: review.params,
340
+ }));
341
+ consumeTrainingReview(review_token);
342
+ const jobId = String(data.id ?? "");
343
+ return structuredTextResult({
344
+ type: "prepared-training-submitted",
345
+ datasetId: review.datasetId,
346
+ jobId,
347
+ message: `Training job submitted from reviewed prep. Poll with jobs(action=status, job_id="${jobId}").`,
348
+ }, `Training job submitted from reviewed prep. Job ID: ${jobId}\nPoll with jobs(action=status, job_id="${jobId}") until complete, then use results(action=get, job_id="${jobId}").`);
349
+ });
350
+ }
351
+ //# sourceMappingURL=training_prep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"training_prep.js","sourceRoot":"","sources":["../../src/tools/training_prep.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ type TrainAction = "train_map";
2
+ export interface StoredTrainingReview {
3
+ reviewId: string;
4
+ reviewToken: string;
5
+ datasetId: string;
6
+ trainAction: TrainAction;
7
+ params: Record<string, unknown>;
8
+ payload?: Record<string, unknown>;
9
+ createdAt: number;
10
+ expiresAt: number;
11
+ }
12
+ export declare function storeTrainingReview(datasetId: string, params: Record<string, unknown>, trainAction?: TrainAction): StoredTrainingReview;
13
+ export declare function attachTrainingReviewPayload(reviewToken: string, payload: Record<string, unknown>): void;
14
+ export declare function getTrainingReview(reviewToken: string): StoredTrainingReview | null;
15
+ export declare function consumeTrainingReview(reviewToken: string): StoredTrainingReview | null;
16
+ export {};
17
+ //# sourceMappingURL=training_review_store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"training_review_store.d.ts","sourceRoot":"","sources":["../../src/tools/training_review_store.ts"],"names":[],"mappings":"AAAA,KAAK,WAAW,GAAG,WAAW,CAAC;AAE/B,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAsBD,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,WAAW,GAAE,WAAyB,GACrC,oBAAoB,CActB;AAED,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,IAAI,CAKN;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAKlF;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAMtF"}
@@ -0,0 +1,54 @@
1
+ const REVIEW_TTL_MS = 15 * 60 * 1000;
2
+ const reviews = new Map();
3
+ function createToken() {
4
+ return `${Math.random().toString(36).slice(2, 10)}${Math.random().toString(36).slice(2, 10)}`;
5
+ }
6
+ function createReviewId() {
7
+ return Math.random().toString(36).slice(2, 10);
8
+ }
9
+ function pruneExpired() {
10
+ const now = Date.now();
11
+ for (const [token, review] of reviews.entries()) {
12
+ if (review.expiresAt <= now) {
13
+ reviews.delete(token);
14
+ }
15
+ }
16
+ }
17
+ export function storeTrainingReview(datasetId, params, trainAction = "train_map") {
18
+ pruneExpired();
19
+ const createdAt = Date.now();
20
+ const review = {
21
+ reviewId: createReviewId(),
22
+ reviewToken: createToken(),
23
+ datasetId,
24
+ trainAction,
25
+ params,
26
+ createdAt,
27
+ expiresAt: createdAt + REVIEW_TTL_MS,
28
+ };
29
+ reviews.set(review.reviewToken, review);
30
+ return review;
31
+ }
32
+ export function attachTrainingReviewPayload(reviewToken, payload) {
33
+ pruneExpired();
34
+ const review = reviews.get(reviewToken);
35
+ if (!review)
36
+ return;
37
+ review.payload = payload;
38
+ }
39
+ export function getTrainingReview(reviewToken) {
40
+ pruneExpired();
41
+ const review = reviews.get(reviewToken);
42
+ if (!review)
43
+ return null;
44
+ return review;
45
+ }
46
+ export function consumeTrainingReview(reviewToken) {
47
+ pruneExpired();
48
+ const review = reviews.get(reviewToken);
49
+ if (!review)
50
+ return null;
51
+ reviews.delete(reviewToken);
52
+ return review;
53
+ }
54
+ //# sourceMappingURL=training_review_store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"training_review_store.js","sourceRoot":"","sources":["../../src/tools/training_review_store.ts"],"names":[],"mappings":"AAaA,MAAM,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACrC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAgC,CAAC;AAExD,SAAS,WAAW;IAClB,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAChG,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAChD,IAAI,MAAM,CAAC,SAAS,IAAI,GAAG,EAAE,CAAC;YAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,SAAiB,EACjB,MAA+B,EAC/B,cAA2B,WAAW;IAEtC,YAAY,EAAE,CAAC;IACf,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAyB;QACnC,QAAQ,EAAE,cAAc,EAAE;QAC1B,WAAW,EAAE,WAAW,EAAE;QAC1B,SAAS;QACT,WAAW;QACX,MAAM;QACN,SAAS;QACT,SAAS,EAAE,SAAS,GAAG,aAAa;KACrC,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACxC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,WAAmB,EACnB,OAAgC;IAEhC,YAAY,EAAE,CAAC;IACf,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,YAAY,EAAE,CAAC;IACf,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,WAAmB;IACvD,YAAY,EAAE,CAAC;IACf,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC;AAChB,CAAC"}