eklavya 1.25.0 → 1.25.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.
- package/dist/assets/dashboard.html +1 -1
- package/dist/assets/tutor/references/focus-and-level.md +7 -0
- package/dist/claude-mem.js +9 -7
- package/dist/claude-mem.js.map +1 -1
- package/dist/cli-memory.js +786 -0
- package/dist/cli-memory.js.map +1 -0
- package/dist/cli.js +95 -773
- package/dist/cli.js.map +1 -1
- package/dist/config.js +79 -13
- package/dist/config.js.map +1 -1
- package/dist/dashboard.js +36 -14
- package/dist/dashboard.js.map +1 -1
- package/dist/db.js +33 -6
- package/dist/db.js.map +1 -1
- package/dist/hooks/capture-lib.js +55 -0
- package/dist/hooks/capture-lib.js.map +1 -0
- package/dist/hooks/capture-tool.js +1 -1
- package/dist/hooks/capture-tool.js.map +1 -1
- package/dist/hooks/commit-lib.js +255 -0
- package/dist/hooks/commit-lib.js.map +1 -0
- package/dist/hooks/lib.js +37 -5
- package/dist/hooks/lib.js.map +1 -1
- package/dist/hooks/memory-lib.js +93 -78
- package/dist/hooks/memory-lib.js.map +1 -1
- package/dist/hooks/pre-tool-gate.js +5 -10
- package/dist/hooks/pre-tool-gate.js.map +1 -1
- package/dist/hooks/prompt-submit-nudge.js +26 -1
- package/dist/hooks/prompt-submit-nudge.js.map +1 -1
- package/dist/hooks/session-start.js +13 -4
- package/dist/hooks/session-start.js.map +1 -1
- package/dist/install.js +280 -67
- package/dist/install.js.map +1 -1
- package/dist/memory/capture.js +25 -5
- package/dist/memory/capture.js.map +1 -1
- package/dist/memory/privacy.js +105 -7
- package/dist/memory/privacy.js.map +1 -1
- package/dist/memory/provider.js +13 -3
- package/dist/memory/provider.js.map +1 -1
- package/dist/memory/recall.js +18 -6
- package/dist/memory/recall.js.map +1 -1
- package/dist/memory/spool.js +105 -23
- package/dist/memory/spool.js.map +1 -1
- package/dist/memory/store.js +32 -2
- package/dist/memory/store.js.map +1 -1
- package/dist/memory/summarize.js +5 -5
- package/dist/memory/summarize.js.map +1 -1
- package/dist/memory/worker.js +71 -10
- package/dist/memory/worker.js.map +1 -1
- package/dist/migrate.js +60 -14
- package/dist/migrate.js.map +1 -1
- package/dist/paths.js +49 -0
- package/dist/paths.js.map +1 -1
- package/dist/plugin/.claude-plugin/plugin.json +1 -1
- package/dist/plugin/cli/CLAUDE.md +16 -4
- package/dist/plugin/hooks/CLAUDE.md +33 -3
- package/dist/plugin/hooks/run.mjs +69 -5
- package/dist/plugin/scripts/install-git-hook.sh +114 -24
- package/dist/plugin/skills/CLAUDE.md +1 -1
- package/dist/plugin/skills/setup/SKILL.md +9 -2
- package/dist/plugin/skills/tutor/references/focus-and-level.md +7 -0
- package/dist/safe-write.js +146 -0
- package/dist/safe-write.js.map +1 -0
- package/dist/slug.js +4 -1
- package/dist/slug.js.map +1 -1
- package/dist/srs.js +33 -1
- package/dist/srs.js.map +1 -1
- package/dist/store.js +29 -20
- package/dist/store.js.map +1 -1
- package/dist/tools/config_tools.js +23 -1
- package/dist/tools/config_tools.js.map +1 -1
- package/dist/tools/get_session_quiz_plan.js +51 -30
- package/dist/tools/get_session_quiz_plan.js.map +1 -1
- package/dist/tools/log_session_concepts.js +30 -23
- package/dist/tools/log_session_concepts.js.map +1 -1
- package/dist/tools/record_attempt.js +18 -8
- package/dist/tools/record_attempt.js.map +1 -1
- package/dist/tools/types.js +29 -0
- package/dist/tools/types.js.map +1 -1
- package/dist/tools/upsert_concepts.js +12 -10
- package/dist/tools/upsert_concepts.js.map +1 -1
- package/dist/user-skill/eklavya/SKILL.md +26 -10
- package/package.json +1 -1
|
@@ -2,10 +2,12 @@ import { z } from 'zod';
|
|
|
2
2
|
import { loadConfig } from '../config.js';
|
|
3
3
|
import { clampToLevel, decayedScore, isDue, isKnown, nextTierToAsk } from '../srs.js';
|
|
4
4
|
import { answerPosition } from '../mcq.js';
|
|
5
|
+
import { normalizeSlug } from '../slug.js';
|
|
6
|
+
import { minutesSince } from '../time.js';
|
|
5
7
|
import { isSessionOff, resolveSessionId } from '../session.js';
|
|
6
8
|
import { attemptedConceptIds, backlogConcepts, domainSiblings, gateRetryConcepts, gateRow, pendingElsewhere, prereqsOf, resolveTopic, lastAttempt, lastAttemptAt, levelStanding, masteryFor, recentQuestions, sessionConcepts, unmetPrereqs, wasEverTaught, } from '../store.js';
|
|
7
9
|
import { attributionRule, withSurfaceNote } from '../surface.js';
|
|
8
|
-
import { CWD_HINT, SESSION_HINT } from './types.js';
|
|
10
|
+
import { CWD_HINT, LIMITS, SESSION_HINT } from './types.js';
|
|
9
11
|
/**
|
|
10
12
|
* What the tutor must do with the questions, stated per focus so the pedagogy
|
|
11
13
|
* cannot drift from the setting. Returned with every plan.
|
|
@@ -26,15 +28,6 @@ const LEVEL_FRAMING = {
|
|
|
26
28
|
hard: 'Level hard (tiers 3-5). Judgement, failure modes and design: when is this the wrong approach entirely, and how would they notice in production. A definition question is a wasted question here.',
|
|
27
29
|
};
|
|
28
30
|
const ASKED_HISTORY = 3;
|
|
29
|
-
function minutesSince(iso, now) {
|
|
30
|
-
if (!iso)
|
|
31
|
-
return Number.POSITIVE_INFINITY;
|
|
32
|
-
// SQLite datetime('now') is UTC without a zone marker; make that explicit.
|
|
33
|
-
const t = Date.parse(iso.includes('T') ? iso : `${iso.replace(' ', 'T')}Z`);
|
|
34
|
-
if (!Number.isFinite(t))
|
|
35
|
-
return Number.POSITIVE_INFINITY;
|
|
36
|
-
return (now.getTime() - t) / 60_000;
|
|
37
|
-
}
|
|
38
31
|
export const getSessionQuizPlan = {
|
|
39
32
|
name: 'get_session_quiz_plan',
|
|
40
33
|
title: 'Get session quiz plan',
|
|
@@ -42,17 +35,19 @@ export const getSessionQuizPlan = {
|
|
|
42
35
|
// '"project" plans from the diff', and the returned `framing` it points at is
|
|
43
36
|
// already re-pointed on Cowork. A description that still promised a diff
|
|
44
37
|
// while the framing said otherwise would set the two against each other.
|
|
45
|
-
description: withSurfaceNote('What to quiz on right now and at what difficulty tier, chosen from this session\'s concepts and whatever is due for review. Pass a domain to plan a topic quiz instead. Every item carries asked_before (questions this learner has already been asked — never repeat one), already_taught (they blanked and you explained it, so the next question is a follow-up) and prereqs_unmet. When this session\'s own concepts and its review debt run out, it falls back to work an earlier session logged but never asked about, oldest first, only from this project and within the domains this session touched, with reason "backlog" -- those carry no context line, so ask about the concept itself rather than about code that is not on screen. Never in enforced mode, where only this session\'s own work can open the gate. In enforced mode,
|
|
38
|
+
description: withSurfaceNote('What to quiz on right now and at what difficulty tier, chosen from this session\'s concepts and whatever is due for review. Pass a domain to plan a topic quiz instead. Every item carries asked_before (questions this learner has already been asked — never repeat one), already_taught (they blanked and you explained it, so the next question is a follow-up) and prereqs_unmet. When this session\'s own concepts and its review debt run out, it falls back to work an earlier session logged but never asked about, oldest first, only from this project (never outside a git repository, where there is no project) and within the domains this session touched, with reason "backlog" -- those carry no context line, so ask about the concept itself rather than about code that is not on screen. Never in enforced mode, where only this session\'s own work can open the gate. In enforced mode, while the gate is unpassed, it serves only this session\'s own work -- no widening, no review -- including work concepts mastered in another session since they were logged, with reason "gate_work"; once everything else is exhausted it re-offers concepts that were blanked on and taught, a tier lower, with reason "gate_retry". Honours the configured focus: "project" plans from the diff, "concept" widens to prerequisites and domain siblings, "learn" plans from focus_topic and marks overlaps with the session\'s work as bridge_context. Every plan carries focus and framing — follow framing, it is what the setting means. Every question is multiple choice: ask it with AskUserQuestion as four options, never as a blank prompt. Each item also carries answer_position (1-4) — put the correct option in exactly that slot, or the right answer ends up first every time and the learner stops reading the options. Every tier is clamped to this project\'s difficulty level (easy 1-2, medium 2-4, hard 3-5), which is earned per project and returned as level with level_framing — obey it: a tier-4 question at level easy is the failure this exists to prevent. Every plan carries ask_attribution — obey it verbatim: it is the header and stem rule for the host this session is actually running on, and it differs between a terminal and a Claude Desktop question card. The dials this question was pitched from (mode, focus, cadence, level) never go in the stem either way. Under the interleaved cadence a plan is ONE question: ask it, grade it and get back to the work — there is no second question to come back for. Passing max, domain or slugs means the developer asked to be quizzed, and plans the whole budget; so does enforced mode, where the gate needs a round it can pass. Returns questions_needed: 0 when there is nothing worth asking; a session plan then also carries pending_elsewhere (up to three other projects, as checkout paths, with how many concepts wait there) when any do.', ' '),
|
|
46
39
|
inputSchema: {
|
|
47
|
-
session_id: z.string().optional().describe(SESSION_HINT),
|
|
48
|
-
cwd: z.string().optional().describe(CWD_HINT),
|
|
40
|
+
session_id: z.string().max(LIMITS.sessionId).optional().describe(SESSION_HINT),
|
|
41
|
+
cwd: z.string().max(LIMITS.cwd).optional().describe(CWD_HINT),
|
|
49
42
|
max: z.number().int().min(1).max(10).optional().describe('Cap on questions. Defaults to the configured max_questions_per_task.'),
|
|
50
43
|
domain: z
|
|
51
44
|
.string()
|
|
45
|
+
.max(LIMITS.domain)
|
|
52
46
|
.optional()
|
|
53
47
|
.describe('Plan a topic quiz on this domain instead of this session\'s work, e.g. "web-auth". Prerequisites are ordered first.'),
|
|
54
48
|
slugs: z
|
|
55
|
-
.array(z.string())
|
|
49
|
+
.array(z.string().max(LIMITS.slug))
|
|
50
|
+
.max(LIMITS.concepts)
|
|
56
51
|
.optional()
|
|
57
52
|
.describe('Plan around these specific concepts. Use when the developer named a concept rather than a domain.'),
|
|
58
53
|
ignore_cooldown: z
|
|
@@ -78,9 +73,12 @@ export const getSessionQuizPlan = {
|
|
|
78
73
|
// one set of tier and repeat rules. An explicit domain or slugs still win:
|
|
79
74
|
// the developer naming a topic outranks a standing setting.
|
|
80
75
|
let effDomain = args.domain;
|
|
81
|
-
|
|
76
|
+
// Normalised as every other tool normalises: `slugs` is matched against the
|
|
77
|
+
// stored slug exactly, so "HttpOnly Cookies" found nothing and the plan came
|
|
78
|
+
// back empty for a concept that exists.
|
|
79
|
+
let effSlugs = args.slugs?.map(normalizeSlug).filter(Boolean);
|
|
82
80
|
let topicUnresolved = false;
|
|
83
|
-
const explicitTopic = Boolean(args.domain || (
|
|
81
|
+
const explicitTopic = Boolean(args.domain || (effSlugs && effSlugs.length > 0));
|
|
84
82
|
// The cadence decides how big a plan is allowed to be, and this is the only
|
|
85
83
|
// place that can enforce it. `interleaved` promises one question at a time,
|
|
86
84
|
// at the seam where the concept was logged -- but a plan of four is a plan
|
|
@@ -159,7 +157,10 @@ export const getSessionQuizPlan = {
|
|
|
159
157
|
const gap = config.cadence === 'interleaved'
|
|
160
158
|
? config.min_minutes_between_checkpoints
|
|
161
159
|
: config.min_minutes_between_quizzes;
|
|
162
|
-
|
|
160
|
+
// The shared clock policy: both stored timestamp shapes parsed as UTC, and
|
|
161
|
+
// a clock that moved backwards reads as "just now" rather than as a
|
|
162
|
+
// negative age that inflates `minutes_remaining` past the gap itself.
|
|
163
|
+
const since = minutesSince(lastAttemptAt(db, sessionId));
|
|
163
164
|
if (since < gap) {
|
|
164
165
|
return {
|
|
165
166
|
session_id: sessionId,
|
|
@@ -183,6 +184,10 @@ export const getSessionQuizPlan = {
|
|
|
183
184
|
detail: `Nothing in the graph matches "${config.focus_topic}". Offer the closest domain from get_concept_graph, or teach from first principles and upsert_concepts as you go.`,
|
|
184
185
|
};
|
|
185
186
|
}
|
|
187
|
+
// An enforced gate that is open and not yet passed. While it is, the plan
|
|
188
|
+
// serves only what can pass it -- see (a') and the widening guards below.
|
|
189
|
+
const gate = config.quiz.enforced && !topicMode ? gateRow(db, sessionId) : undefined;
|
|
190
|
+
const gateOpen = Boolean(gate && gate.required > 0 && !gate.passed);
|
|
186
191
|
const picked = [];
|
|
187
192
|
const seen = new Set();
|
|
188
193
|
// Where the session's own work touched a concept. In `learn` focus this is
|
|
@@ -298,6 +303,20 @@ export const getSessionQuizPlan = {
|
|
|
298
303
|
if (!isKnown({ score, reps: m.reps }))
|
|
299
304
|
add(c, c.context, 'unmastered');
|
|
300
305
|
}
|
|
306
|
+
// (a') enforced and unpassed: this session's work concepts that are
|
|
307
|
+
// mastered anyway -- mastered in another session after this one logged
|
|
308
|
+
// them. `required` was frozen when they were logged and never drops, so
|
|
309
|
+
// leaving them out made the bar unreachable: three logged, one mastered
|
|
310
|
+
// elsewhere, and at most two left to pass against a need of three.
|
|
311
|
+
//
|
|
312
|
+
// Asked rather than counted as already satisfied. The gate is a claim
|
|
313
|
+
// that *this* work was understood, and a pass recorded elsewhere, on a
|
|
314
|
+
// question about other code, is not that; answering one question costs
|
|
315
|
+
// less than a gate that can be cleared without looking at the diff.
|
|
316
|
+
if (gateOpen) {
|
|
317
|
+
for (const c of sessionConcepts(db, sessionId, 'work'))
|
|
318
|
+
add(c, c.context, 'gate_work');
|
|
319
|
+
}
|
|
301
320
|
// (b) concepts this session touched that are due for review
|
|
302
321
|
for (const c of touched) {
|
|
303
322
|
const m = masteryFor(db, c.id);
|
|
@@ -311,7 +330,11 @@ export const getSessionQuizPlan = {
|
|
|
311
330
|
//
|
|
312
331
|
// Deliberately before (c): a prerequisite of today's work is more use than
|
|
313
332
|
// an unrelated concept that happens to be due.
|
|
314
|
-
|
|
333
|
+
//
|
|
334
|
+
// Never while an enforced gate is open: a widened concept is recorded as
|
|
335
|
+
// review, the gate counts only work, and every slot it takes is a
|
|
336
|
+
// question the learner answers without moving the commit any closer.
|
|
337
|
+
if (focus === 'concept' && picked.length < max && !gateOpen) {
|
|
315
338
|
const touchedIds = touched.map((c) => c.id);
|
|
316
339
|
const exclude = new Set(touchedIds);
|
|
317
340
|
for (const c of prereqsOf(db, touchedIds)) {
|
|
@@ -340,7 +363,8 @@ export const getSessionQuizPlan = {
|
|
|
340
363
|
// a project key), backlog by where it was logged (`backlogConcepts`).
|
|
341
364
|
// (c) anything else due in the same domains, answered in this project, so
|
|
342
365
|
// review debt gets paid down
|
|
343
|
-
|
|
366
|
+
// Not while an enforced gate is open, for the same reason as widening.
|
|
367
|
+
if (picked.length < max && domains.size > 0 && !gateOpen) {
|
|
344
368
|
const placeholders = [...domains].map(() => '?').join(',');
|
|
345
369
|
const rows = db
|
|
346
370
|
.prepare(`SELECT c.* FROM concepts c
|
|
@@ -399,17 +423,14 @@ export const getSessionQuizPlan = {
|
|
|
399
423
|
// Unenforced quizzing is deliberately left alone. It has no gate to deadlock, and
|
|
400
424
|
// re-offering a concept there would be the nagging the cooldown exists to
|
|
401
425
|
// prevent.
|
|
402
|
-
if (
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
for (const c of gateRetryConcepts(db, sessionId)) {
|
|
411
|
-
add(c, c.context, 'gate_retry', { retry: true });
|
|
412
|
-
}
|
|
426
|
+
if (picked.length === 0 && gateOpen) {
|
|
427
|
+
// `seen` carries two meanings: "already picked" and "considered and
|
|
428
|
+
// rejected". Only the second is in it here -- nothing was picked, or we
|
|
429
|
+
// would not be in this branch -- so clearing it drops exactly the
|
|
430
|
+
// rejections the retry pass exists to reconsider, and cannot lose a pick.
|
|
431
|
+
seen.clear();
|
|
432
|
+
for (const c of gateRetryConcepts(db, sessionId)) {
|
|
433
|
+
add(c, c.context, 'gate_retry', { retry: true });
|
|
413
434
|
}
|
|
414
435
|
}
|
|
415
436
|
// Foundations before what rests on them, so a quiz never leads with a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get_session_quiz_plan.js","sourceRoot":"","sources":["../../src/tools/get_session_quiz_plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAc,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAc,MAAM,WAAW,CAAC;AAClG,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,OAAO,EACP,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,WAAW,EACX,aAAa,EACb,aAAa,EACb,UAAU,EACV,eAAe,EACf,eAAe,EACf,YAAY,EACZ,aAAa,GAGd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAgB,MAAM,YAAY,CAAC;AAmDlE;;;GAGG;AACH,MAAM,OAAO,GAA0B;IACrC,OAAO,EACL,iHAAiH;IACnH,OAAO,EACL,+TAA+T;IACjU,KAAK,EACH,qRAAqR;CACxR,CAAC;AAEF;;;;GAIG;AACH,MAAM,aAAa,GAA0B;IAC3C,IAAI,EACF,+SAA+S;IACjT,MAAM,EACJ,0JAA0J;IAC5J,IAAI,EACF,kMAAkM;CACrM,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,SAAS,YAAY,CAAC,GAAkB,EAAE,GAAS;IACjD,IAAI,CAAC,GAAG;QAAE,OAAO,MAAM,CAAC,iBAAiB,CAAC;IAC1C,2EAA2E;IAC3E,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC,iBAAiB,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAY;IACzC,IAAI,EAAE,uBAAuB;IAC7B,KAAK,EAAE,uBAAuB;IAC9B,8EAA8E;IAC9E,8EAA8E;IAC9E,yEAAyE;IACzE,yEAAyE;IACzE,WAAW,EAAE,eAAe,CAC1B,ykFAAykF,EACzkF,GAAG,CACJ;IACD,WAAW,EAAE;QACX,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QACxD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC7C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sEAAsE,CAAC;QAChI,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,qHAAqH,CAAC;QAClI,KAAK,EAAE,CAAC;aACL,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;aACjB,QAAQ,EAAE;aACV,QAAQ,CAAC,mGAAmG,CAAC;QAChH,eAAe,EAAE,CAAC;aACf,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,qHAAqH,CAAC;QAClI,KAAK,EAAE,CAAC;aACL,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;aACrC,QAAQ,EAAE;aACV,QAAQ,CAAC,0EAA0E,CAAC;KACxF;IACD,OAAO,EAAE,CACP,IAQC,EACD,EAAE,EAAE,EAAE,EACN,EAAE;QACF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAClE,MAAM,KAAK,GAAU,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC;QAChD,yEAAyE;QACzE,qEAAqE;QACrE,+DAA+D;QAC/D,MAAM,QAAQ,GAAG,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAErD,qEAAqE;QACrE,4EAA4E;QAC5E,2EAA2E;QAC3E,4DAA4D;QAC5D,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;QAC5B,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;QAC1B,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAEpF,4EAA4E;QAC5E,4EAA4E;QAC5E,2EAA2E;QAC3E,4EAA4E;QAC5E,4EAA4E;QAC5E,6EAA6E;QAC7E,6EAA6E;QAC7E,kCAAkC;QAClC,EAAE;QACF,uEAAuE;QACvE,6EAA6E;QAC7E,gFAAgF;QAChF,EAAE;QACF,sEAAsE;QACtE,0EAA0E;QAC1E,yEAAyE;QACzE,uEAAuE;QACvE,yEAAyE;QACzE,kCAAkC;QAClC,MAAM,MAAM,GACV,MAAM,CAAC,OAAO,KAAK,aAAa,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,aAAa,CAAC;QAC9E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAErE,IAAI,CAAC,aAAa,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACxC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;gBACxB,OAAO;oBACL,UAAU,EAAE,SAAS;oBACrB,gBAAgB,EAAE,CAAC;oBACnB,QAAQ,EAAE,EAAE;oBACZ,KAAK;oBACL,MAAM,EAAE,UAAU;oBAClB,MAAM,EAAE,uGAAuG;iBAChH,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YACnD,IAAI,KAAK,CAAC,MAAM;gBAAE,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;iBACtC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC;;gBACnD,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAE1E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACzB,0EAA0E;YAC1E,2EAA2E;YAC3E,2EAA2E;YAC3E,wEAAwE;YACxE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;QAC/F,CAAC;QAED,qEAAqE;QACrE,wEAAwE;QACxE,gEAAgE;QAChE,kEAAkE;QAClE,IAAI,YAAY,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC;YAChC,OAAO;gBACL,UAAU,EAAE,SAAS;gBACrB,gBAAgB,EAAE,CAAC;gBACnB,QAAQ,EAAE,EAAE;gBACZ,MAAM,EAAE,aAAa;gBACrB,MAAM,EAAE,sNAAsN;aAC/N,CAAC;QACJ,CAAC;QAED,4EAA4E;QAC5E,6EAA6E;QAC7E,kEAAkE;QAClE,EAAE;QACF,4EAA4E;QAC5E,8EAA8E;QAC9E,8EAA8E;QAC9E,4EAA4E;QAC5E,2EAA2E;QAC3E,2EAA2E;QAC3E,gEAAgE;QAChE,2EAA2E;QAC3E,6EAA6E;QAC7E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YACnD,MAAM,GAAG,GACP,MAAM,CAAC,OAAO,KAAK,aAAa;gBAC9B,CAAC,CAAC,MAAM,CAAC,+BAA+B;gBACxC,CAAC,CAAC,MAAM,CAAC,2BAA2B,CAAC;YACzC,MAAM,KAAK,GAAG,YAAY,CAAC,aAAa,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;YAC9D,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;gBAChB,OAAO;oBACL,UAAU,EAAE,SAAS;oBACrB,gBAAgB,EAAE,CAAC;oBACnB,QAAQ,EAAE,EAAE;oBACZ,MAAM,EAAE,UAAU;oBAClB,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;iBAC1C,CAAC;YACJ,CAAC;QACH,CAAC;QAED,2EAA2E;QAC3E,+DAA+D;QAC/D,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO;gBACL,UAAU,EAAE,SAAS;gBACrB,gBAAgB,EAAE,CAAC;gBACnB,QAAQ,EAAE,EAAE;gBACZ,KAAK;gBACL,KAAK,EAAE,MAAM,CAAC,WAAW;gBACzB,MAAM,EAAE,eAAe;gBACvB,MAAM,EAAE,iCAAiC,MAAM,CAAC,WAAW,mHAAmH;aAC/K,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAe,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,2EAA2E;QAC3E,2EAA2E;QAC3E,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;QACjD,KAAK,MAAM,CAAC,IAAI,eAAe,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC;YAC/C,IAAI,CAAC,CAAC,OAAO;gBAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,6EAA6E;QAC7E,yEAAyE;QACzE,MAAM,YAAY,GAAG,mBAAmB,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QACxD,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,MAAM,GAAG,GAAG,CACV,OAAmB,EACnB,OAAsB,EACtB,MAA0B;QAC1B,uEAAuE;QACvE,qEAAqE;QACrE,gEAAgE;QAChE,OAA4B,EAAE,EACxB,EAAE;YACR,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,GAAG;gBAAE,OAAO;YAC3D,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;gBAChD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACvB,YAAY,IAAI,CAAC,CAAC;gBAClB,OAAO;YACT,CAAC;YAED,MAAM,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YACrC,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;YACxD,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YACzC,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;YAE7D,MAAM,IAAI,GAAG,YAAY,CACvB,aAAa,CAAC;gBACZ,WAAW,EAAE,OAAO,CAAC,IAAI;gBACzB,cAAc,EAAE,IAAI,EAAE,UAAU,IAAI,IAAI;gBACxC,SAAS,EAAE,IAAI,EAAE,KAAK,IAAI,IAAI;gBAC9B,KAAK;aACN,CAAC,EACF,QAAQ,CAAC,KAAK,CACf,CAAC;YACF,4EAA4E;YAC5E,kEAAkE;YAClE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAE7E,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,WAAW,EAAE,SAAS;gBACtB,OAAO;gBACP,yEAAyE;gBACzE,uEAAuE;gBACvE,kDAAkD;gBAClD,GAAG,CAAC,KAAK,KAAK,OAAO,IAAI,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;oBACvD,CAAC,CAAC,EAAE,cAAc,EAAE,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAE,EAAE;oBACvD,CAAC,CAAC,EAAE,CAAC;gBACP,UAAU,EAAE,IAAI,EAAE,KAAK,IAAI,IAAI;gBAC/B,YAAY,EAAE,KAAK;gBACnB,cAAc,EAAE,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC7C,aAAa,EAAE,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC;gBAChD,eAAe,EAAE,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;gBAC3D,MAAM;aACP,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,IAAI,SAAS,EAAE,CAAC;YACd,0EAA0E;YAC1E,sEAAsE;YACtE,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAc,EAAE,CAAC;YAC7B,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC7B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACzB,CAAC;YACD,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpC,OAAO,CAAC,IAAI,CAAC,cAAc,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACjE,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;YAC3B,CAAC;YAED,MAAM,IAAI,GAAG,EAAE;iBACZ,OAAO,CACN;;qBAEW,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;4CACG,CACnC;iBACA,GAAG,CAAC,GAAG,MAAM,CAAiB,CAAC;YAElC,uEAAuE;YACvE,uEAAuE;YACvE,MAAM,UAAU,GAAG,IAAI;iBACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACT,MAAM,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC/B,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;gBACxD,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC;YAC/F,CAAC,CAAC;iBACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC;iBAChC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACb,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG;oBAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3C,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK;oBAAE,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;gBAClD,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC7B,CAAC,CAAC,CAAC;YAEL,wEAAwE;YACxE,sEAAsE;YACtE,sBAAsB;YACtB,MAAM,WAAW,GAAG,CAAC,aAAa,IAAI,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC;YAClF,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC9B,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,WAAW,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,eAAe,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YAC/C,KAAK,MAAM,CAAC,IAAI,OAAO;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAE/C,sEAAsE;YACtE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,MAAM,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC/B,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;gBACxD,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;oBAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YACzE,CAAC;YAED,4DAA4D;YAC5D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,MAAM,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC/B,IAAI,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC;oBAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YACjE,CAAC;YAED,yEAAyE;YACzE,sEAAsE;YACtE,uEAAuE;YACvE,2CAA2C;YAC3C,EAAE;YACF,2EAA2E;YAC3E,+CAA+C;YAC/C,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC5C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;gBAEpC,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,CAAC;oBAC1C,MAAM,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC/B,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;wBACjF,4DAA4D;wBAC5D,+DAA+D;wBAC/D,+DAA+D;wBAC/D,mBAAmB;wBACnB,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC;oBACnC,CAAC;gBACH,CAAC;gBAED,KAAK,MAAM,CAAC,IAAI,cAAc,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;oBAC1D,IAAI,MAAM,CAAC,MAAM,IAAI,GAAG;wBAAE,MAAM;oBAChC,MAAM,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC/B,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;wBACjF,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC;oBACnC,CAAC;gBACH,CAAC;YACH,CAAC;YAED,0EAA0E;YAC1E,qEAAqE;YACrE,sEAAsE;YACtE,2EAA2E;YAC3E,sEAAsE;YAEtE,0EAA0E;YAC1E,6BAA6B;YAC7B,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBAC5C,MAAM,YAAY,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC3D,MAAM,IAAI,GAAG,EAAE;qBACZ,OAAO,CACN;;kCAEsB,YAAY;;wCAEN,CAC7B;qBACA,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAiB,CAAC;gBACrE,KAAK,MAAM,CAAC,IAAI,IAAI;oBAAE,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;YACtD,CAAC;YAED,mEAAmE;YACnE,EAAE;YACF,yEAAyE;YACzE,yEAAyE;YACzE,4EAA4E;YAC5E,0EAA0E;YAC1E,0EAA0E;YAC1E,2EAA2E;YAC3E,sBAAsB;YACtB,EAAE;YACF,4EAA4E;YAC5E,uEAAuE;YACvE,iEAAiE;YACjE,EAAE;YACF,4EAA4E;YAC5E,4EAA4E;YAC5E,wEAAwE;YACxE,qEAAqE;YACrE,EAAE;YACF,0EAA0E;YAC1E,2EAA2E;YAC3E,0EAA0E;YAC1E,2EAA2E;YAC3E,kEAAkE;YAClE,wEAAwE;YACxE,EAAE;YACF,4DAA4D;YAC5D,yEAAyE;YACzE,0EAA0E;YAC1E,oEAAoE;YACpE,yEAAyE;YACzE,gEAAgE;YAChE,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACjD,KAAK,MAAM,CAAC,IAAI,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC;oBAAE,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;YAClG,CAAC;QACH,CAAC;QAED,4EAA4E;QAC5E,6EAA6E;QAC7E,6EAA6E;QAC7E,8EAA8E;QAC9E,4EAA4E;QAC5E,mDAAmD;QACnD,EAAE;QACF,kFAAkF;QAClF,0EAA0E;QAC1E,WAAW;QACX,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9D,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YACpC,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC9C,oEAAoE;gBACpE,wEAAwE;gBACxE,kEAAkE;gBAClE,0EAA0E;gBAC1E,IAAI,CAAC,KAAK,EAAE,CAAC;gBACb,KAAK,MAAM,CAAC,IAAI,iBAAiB,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC;oBACjD,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;QACH,CAAC;QAED,sEAAsE;QACtE,6CAA6C;QAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACnB,IAAI,CAAC,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;gBACtD,OAAO,CAAC,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC;YACzD,CAAC;YACD,OAAO,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,uEAAuE;YACvE,+CAA+C;YAC/C,EAAE;YACF,sEAAsE;YACtE,mEAAmE;YACnE,8DAA8D;YAC9D,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;YACvE,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3E,OAAO,YAAY,GAAG,CAAC;gBACrB,CAAC,CAAC;oBACE,UAAU,EAAE,SAAS;oBACrB,gBAAgB,EAAE,CAAC;oBACnB,QAAQ,EAAE,EAAE;oBACZ,KAAK;oBACL,MAAM,EAAE,iBAAiB;oBACzB,MAAM,EAAE,GAAG,YAAY,uDAAuD;oBAC9E,GAAG,KAAK;iBACT;gBACH,CAAC,CAAC;oBACE,UAAU,EAAE,SAAS;oBACrB,gBAAgB,EAAE,CAAC;oBACnB,QAAQ,EAAE,EAAE;oBACZ,KAAK;oBACL,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,gBAAgB;oBACtD,GAAG,KAAK;iBACT,CAAC;QACR,CAAC;QAED,OAAO;YACL,UAAU,EAAE,SAAS;YACrB,gBAAgB,EAAE,MAAM,CAAC,MAAM;YAC/B,KAAK;YACL,wEAAwE;YACxE,0EAA0E;YAC1E,sEAAsE;YACtE,8CAA8C;YAC9C,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC;YAC7C,yEAAyE;YACzE,kEAAkE;YAClE,wEAAwE;YACxE,yEAAyE;YACzE,oEAAoE;YACpE,qEAAqE;YACrE,eAAe,EAAE,eAAe,EAAE;YAClC,GAAG,CAAC,KAAK,KAAK,OAAO,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjF,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,aAAa,EAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC;YAC5C,cAAc,EAAE;gBACd,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM;gBAC9B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO;gBAC/B,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ;gBAClC,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ;gBACzC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ;gBACtC,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC7C;YACD,QAAQ,EAAE,MAAM;SACjB,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"get_session_quiz_plan.js","sourceRoot":"","sources":["../../src/tools/get_session_quiz_plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { loadConfig } from '../config.js';
|
|
3
|
-
import { normalizeSlug, findFuzzyMatch } from '../slug.js';
|
|
3
|
+
import { normalizeSlug, isValidSlug, findFuzzyMatch } from '../slug.js';
|
|
4
4
|
import { decayedScore, isKnown } from '../srs.js';
|
|
5
5
|
import { resolveSessionId } from '../session.js';
|
|
6
6
|
import { allConceptSlugs, conceptBySlug, insertConcept, logSessionConcept, masteryFor, newConceptsThisSession, sessionConcepts, syncGate, } from '../store.js';
|
|
7
7
|
import { withSurfaceNote } from '../surface.js';
|
|
8
|
-
import { CWD_HINT, SESSION_HINT } from './types.js';
|
|
8
|
+
import { CWD_HINT, LIMITS, SESSION_HINT } from './types.js';
|
|
9
9
|
const DEFAULT_DOMAIN = 'general';
|
|
10
10
|
const DEFAULT_TIER = 2;
|
|
11
11
|
export const logSessionConcepts = {
|
|
@@ -17,17 +17,18 @@ export const logSessionConcepts = {
|
|
|
17
17
|
// change surface halfway through.
|
|
18
18
|
description: withSurfaceNote('Record the concepts the current task genuinely exercises, each with a one-line context pointing at the real code you wrote. Call this while implementing, batched, 3-8 concepts per task. Unknown slugs are created automatically, but bare — when the response carries next_action, do what it says before quizzing.', ' '),
|
|
19
19
|
inputSchema: {
|
|
20
|
-
session_id: z.string().optional().describe(SESSION_HINT),
|
|
21
|
-
cwd: z.string().optional().describe(CWD_HINT),
|
|
20
|
+
session_id: z.string().max(LIMITS.sessionId).optional().describe(SESSION_HINT),
|
|
21
|
+
cwd: z.string().max(LIMITS.cwd).optional().describe(CWD_HINT),
|
|
22
22
|
concepts: z
|
|
23
23
|
.array(z.object({
|
|
24
|
-
slug: z.string().describe('kebab-case, e.g. "httponly-cookies"'),
|
|
25
|
-
name: z.string().optional(),
|
|
26
|
-
domain: z.string().optional(),
|
|
24
|
+
slug: z.string().max(LIMITS.slug).describe('kebab-case, e.g. "httponly-cookies"'),
|
|
25
|
+
name: z.string().max(LIMITS.name).optional(),
|
|
26
|
+
domain: z.string().max(LIMITS.domain).optional(),
|
|
27
27
|
tier: z.number().int().min(1).max(5).optional(),
|
|
28
|
-
context: z.string().optional().describe('One line naming the actual code, e.g. "set httpOnly on the refresh cookie in auth.ts".'),
|
|
28
|
+
context: z.string().max(LIMITS.context).optional().describe('One line naming the actual code, e.g. "set httpOnly on the refresh cookie in auth.ts".'),
|
|
29
29
|
}))
|
|
30
|
-
.min(1)
|
|
30
|
+
.min(1)
|
|
31
|
+
.max(LIMITS.concepts),
|
|
31
32
|
},
|
|
32
33
|
handler: (args, { db }) => {
|
|
33
34
|
const now = new Date();
|
|
@@ -41,7 +42,9 @@ export const logSessionConcepts = {
|
|
|
41
42
|
let budget = Math.max(0, config.max_new_concepts_per_session - newConceptsThisSession(db, sessionId));
|
|
42
43
|
for (const input of args.concepts) {
|
|
43
44
|
const slug = normalizeSlug(input.slug);
|
|
44
|
-
|
|
45
|
+
// The same check upsert_concepts makes, so the two ways a concept gets
|
|
46
|
+
// minted cannot disagree about what a slug is.
|
|
47
|
+
if (!isValidSlug(slug))
|
|
45
48
|
continue;
|
|
46
49
|
let concept = conceptBySlug(db, slug);
|
|
47
50
|
if (!concept) {
|
|
@@ -70,20 +73,24 @@ export const logSessionConcepts = {
|
|
|
70
73
|
logSessionConcept(db, sessionId, concept.id, input.context ?? null, 'work');
|
|
71
74
|
logged.push(concept.slug);
|
|
72
75
|
}
|
|
76
|
+
// The gate's bar rises with the work: how many touched concepts are still
|
|
77
|
+
// unmastered, capped at the configured questions per task.
|
|
78
|
+
// 'work' only: `passedCount` counts nothing else, so a review-debt concept
|
|
79
|
+
// raising the bar would raise it past anything the learner could clear.
|
|
80
|
+
const unmastered = sessionConcepts(db, sessionId, 'work').filter((c) => {
|
|
81
|
+
const m = masteryFor(db, c.id);
|
|
82
|
+
return !isKnown({ score: decayedScore(m.score, m.next_review, now), reps: m.reps });
|
|
83
|
+
}).length;
|
|
84
|
+
// Inside the transaction, not after it: `registerTools` retries the whole
|
|
85
|
+
// handler on SQLITE_BUSY, and a retry after the concepts had committed
|
|
86
|
+
// found them already there and answered `created: []` -- dropping the
|
|
87
|
+
// next_action that tells the tutor to give them a domain and edges.
|
|
88
|
+
return syncGate(db, sessionId, config, {
|
|
89
|
+
requiredHint: Math.min(unmastered, config.max_questions_per_task),
|
|
90
|
+
repo: repoRoot,
|
|
91
|
+
});
|
|
73
92
|
});
|
|
74
|
-
apply();
|
|
75
|
-
// The gate's bar rises with the work: how many touched concepts are still
|
|
76
|
-
// unmastered, capped at the configured questions per task.
|
|
77
|
-
// 'work' only: `passedCount` counts nothing else, so a review-debt concept
|
|
78
|
-
// raising the bar would raise it past anything the learner could clear.
|
|
79
|
-
const unmastered = sessionConcepts(db, sessionId, 'work').filter((c) => {
|
|
80
|
-
const m = masteryFor(db, c.id);
|
|
81
|
-
return !isKnown({ score: decayedScore(m.score, m.next_review, now), reps: m.reps });
|
|
82
|
-
}).length;
|
|
83
|
-
const gate = syncGate(db, sessionId, config, {
|
|
84
|
-
requiredHint: Math.min(unmastered, config.max_questions_per_task),
|
|
85
|
-
repo: repoRoot,
|
|
86
|
-
});
|
|
93
|
+
const gate = apply();
|
|
87
94
|
// Said in the response, not only in the tutor skill. A bare concept is
|
|
88
95
|
// tier 2, domain "general", no edges -- and `prereqs_unmet` is computed from
|
|
89
96
|
// edges, so a concept with none can never be reported as unfair to ask
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log_session_concepts.js","sourceRoot":"","sources":["../../src/tools/log_session_concepts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"log_session_concepts.js","sourceRoot":"","sources":["../../src/tools/log_session_concepts.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,20 +5,22 @@ import { decayedScore, isKnown } from '../srs.js';
|
|
|
5
5
|
import { resolveSessionId } from '../session.js';
|
|
6
6
|
import { conceptBySlug, gradeConcept, hasAskedQuestion, levelStanding, logSessionConcept, promoteIfEarned, syncGate, MAX_MCQ_GRADE, } from '../store.js';
|
|
7
7
|
import { stripAskHeader } from '../ask.js';
|
|
8
|
-
import { CWD_HINT, SESSION_HINT } from './types.js';
|
|
8
|
+
import { CWD_HINT, LIMITS, SESSION_HINT } from './types.js';
|
|
9
9
|
export const recordAttempt = {
|
|
10
10
|
name: 'record_attempt',
|
|
11
11
|
title: 'Record a quiz attempt',
|
|
12
12
|
description: 'Grade one answer on the 0-5 SM-2 scale and persist it. Updates mastery, the next review date, the session gate and this project\'s difficulty level. Record every response, including "I don\'t know" (grade 0, outcome dont_know, after you have taught it) and declines (grade 0, outcome declined). Pass format "mcq" and the options you offered — question takes the stem alone, which is what the repeat check hashes; the options go in options. Multiple choice is capped at grade 4: picking one of four cannot show you know why; omit format only when they typed a real explanation instead of picking. Returns level and level_progress, and level_up on the answer that earns a promotion — say that in one line and move on.',
|
|
13
13
|
inputSchema: {
|
|
14
|
-
session_id: z.string().optional().describe(SESSION_HINT),
|
|
15
|
-
cwd: z.string().optional().describe(CWD_HINT),
|
|
16
|
-
slug: z.string().describe('The concept that was asked about.'),
|
|
14
|
+
session_id: z.string().max(LIMITS.sessionId).optional().describe(SESSION_HINT),
|
|
15
|
+
cwd: z.string().max(LIMITS.cwd).optional().describe(CWD_HINT),
|
|
16
|
+
slug: z.string().max(LIMITS.slug).describe('The concept that was asked about.'),
|
|
17
17
|
question: z
|
|
18
18
|
.string()
|
|
19
|
+
.max(LIMITS.question)
|
|
19
20
|
.describe('The question stem exactly as asked, and only the stem. This text is what stops the same question coming back later, so anything baked in here that moves — shuffled options, a dial in a bracketed line — would make one question look like several.'),
|
|
20
21
|
answer: z
|
|
21
22
|
.string()
|
|
23
|
+
.max(LIMITS.answer)
|
|
22
24
|
.optional()
|
|
23
25
|
.describe('The learner\'s answer verbatim — for multiple choice, the option they picked (or what they typed under "Other"). Omit for a skip.'),
|
|
24
26
|
grade: z
|
|
@@ -28,13 +30,14 @@ export const recordAttempt = {
|
|
|
28
30
|
.max(5)
|
|
29
31
|
.describe('0 no answer/skip, 1-2 wrong, 3 correct but laboured, 4 correct, 5 correct and explained the why.'),
|
|
30
32
|
difficulty: z.number().int().min(1).max(5).describe('The tier you actually asked at — use tier_to_ask from the plan.'),
|
|
31
|
-
feedback: z.string().optional().describe('The short explanation you gave back.'),
|
|
33
|
+
feedback: z.string().max(LIMITS.feedback).optional().describe('The short explanation you gave back.'),
|
|
32
34
|
format: z
|
|
33
35
|
.literal('mcq')
|
|
34
36
|
.optional()
|
|
35
37
|
.describe('Pass "mcq" — the only shape Eklavya asks in: four options via AskUserQuestion. Say so, because a correct multiple-choice answer is weaker evidence than a correct free one and is capped accordingly. Omit it only when the learner picked "Other" and typed a real explanation, which is free recall and earns an uncapped grade.'),
|
|
36
38
|
options: z
|
|
37
|
-
.array(z.string())
|
|
39
|
+
.array(z.string().max(LIMITS.option))
|
|
40
|
+
.max(LIMITS.options)
|
|
38
41
|
.optional()
|
|
39
42
|
.describe('For mcq: the option labels you offered, in the order shown. Not the stem.'),
|
|
40
43
|
outcome: z
|
|
@@ -106,11 +109,18 @@ export const recordAttempt = {
|
|
|
106
109
|
// In the same transaction as the grade: a promotion is a fact about
|
|
107
110
|
// attempt rows, and a crash between the two would leave a level claiming
|
|
108
111
|
// evidence that was rolled back.
|
|
109
|
-
|
|
112
|
+
const promotion = promoteIfEarned(db, config, repoRoot);
|
|
113
|
+
// The gate too. `registerTools` retries the whole handler on SQLITE_BUSY,
|
|
114
|
+
// which is only safe when every write here rolls back together: with the
|
|
115
|
+
// gate written after the commit, a lock on it retried a grade that had
|
|
116
|
+
// already landed, and one answer became two attempt rows and a rung of
|
|
117
|
+
// the SM-2 ladder the learner never climbed.
|
|
118
|
+
const gate = syncGate(db, sessionId, config, { repo: repoRoot });
|
|
119
|
+
return { state: next, promotion, gate };
|
|
110
120
|
})();
|
|
111
121
|
const state = graded.state;
|
|
122
|
+
const gate = graded.gate;
|
|
112
123
|
const after = levelStanding(db, config, repoRoot);
|
|
113
|
-
const gate = syncGate(db, sessionId, config, { repo: repoRoot });
|
|
114
124
|
const score = decayedScore(state.score, state.next_review, now);
|
|
115
125
|
return {
|
|
116
126
|
slug: concept.slug,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record_attempt.js","sourceRoot":"","sources":["../../src/tools/record_attempt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EACL,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,QAAQ,EACR,aAAa,GAGd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAgB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"record_attempt.js","sourceRoot":"","sources":["../../src/tools/record_attempt.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/types.js
CHANGED
|
@@ -1,4 +1,33 @@
|
|
|
1
1
|
/** Shared arg shapes so every tool speaks the same dialect. */
|
|
2
2
|
export const CWD_HINT = "Working directory, so this project's settings are found. Defaults to the server cwd.";
|
|
3
3
|
export const SESSION_HINT = 'Claude Code session id. Optional — omit it and the server resolves the current session itself.';
|
|
4
|
+
/**
|
|
5
|
+
* Ceilings on the free text a model hands the learning tools, in characters.
|
|
6
|
+
*
|
|
7
|
+
* Every one of these is persisted -- into `attempts`, `concepts` or
|
|
8
|
+
* `session_concepts` -- and read back into context by later plans, so an
|
|
9
|
+
* unbounded field is a runaway generation that bloats the learner's database
|
|
10
|
+
* and then every prompt that quotes it. Each is set several times above
|
|
11
|
+
* anything legitimate (a real stem runs 100-500 characters, an option under
|
|
12
|
+
* 200, a context line under 150): the point is to stop a runaway, never to
|
|
13
|
+
* trim a real question. Over the limit is rejected by the schema rather than
|
|
14
|
+
* truncated, so the model gets an error naming the field and resends a
|
|
15
|
+
* shorter one; truncating would store a question nobody asked.
|
|
16
|
+
*/
|
|
17
|
+
export const LIMITS = {
|
|
18
|
+
sessionId: 256,
|
|
19
|
+
cwd: 4096,
|
|
20
|
+
slug: 200,
|
|
21
|
+
name: 200,
|
|
22
|
+
domain: 100,
|
|
23
|
+
description: 2000,
|
|
24
|
+
context: 1000,
|
|
25
|
+
question: 4000,
|
|
26
|
+
answer: 8000,
|
|
27
|
+
feedback: 8000,
|
|
28
|
+
option: 1000,
|
|
29
|
+
options: 10,
|
|
30
|
+
concepts: 50,
|
|
31
|
+
edges: 200,
|
|
32
|
+
};
|
|
4
33
|
//# sourceMappingURL=types.js.map
|
package/dist/tools/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAeA,+DAA+D;AAC/D,MAAM,CAAC,MAAM,QAAQ,GAAG,sFAAsF,CAAC;AAC/G,MAAM,CAAC,MAAM,YAAY,GACvB,gGAAgG,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAeA,+DAA+D;AAC/D,MAAM,CAAC,MAAM,QAAQ,GAAG,sFAAsF,CAAC;AAC/G,MAAM,CAAC,MAAM,YAAY,GACvB,gGAAgG,CAAC;AAEnG;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,SAAS,EAAE,GAAG;IACd,GAAG,EAAE,IAAI;IACT,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,GAAG;IACT,MAAM,EAAE,GAAG;IACX,WAAW,EAAE,IAAI;IACjB,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,IAAI;IACd,MAAM,EAAE,IAAI;IACZ,QAAQ,EAAE,IAAI;IACd,MAAM,EAAE,IAAI;IACZ,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE,EAAE;IACZ,KAAK,EAAE,GAAG;CACF,CAAC"}
|
|
@@ -3,29 +3,31 @@ import { loadConfig } from '../config.js';
|
|
|
3
3
|
import { normalizeSlug, isValidSlug, findFuzzyMatch } from '../slug.js';
|
|
4
4
|
import { resolveSessionId } from '../session.js';
|
|
5
5
|
import { allConceptSlugs, conceptBySlug, insertConcept, newConceptsThisSession } from '../store.js';
|
|
6
|
-
import { CWD_HINT, SESSION_HINT } from './types.js';
|
|
6
|
+
import { CWD_HINT, LIMITS, SESSION_HINT } from './types.js';
|
|
7
7
|
export const upsertConcepts = {
|
|
8
8
|
name: 'upsert_concepts',
|
|
9
9
|
title: 'Upsert concepts',
|
|
10
10
|
description: 'Grow the knowledge graph when work touches a concept that has no slug yet. Slugs are normalized and near-duplicates are folded into the existing concept, so check the returned canonical slug before using it.',
|
|
11
11
|
inputSchema: {
|
|
12
|
-
session_id: z.string().optional().describe(SESSION_HINT),
|
|
13
|
-
cwd: z.string().optional().describe(CWD_HINT),
|
|
12
|
+
session_id: z.string().max(LIMITS.sessionId).optional().describe(SESSION_HINT),
|
|
13
|
+
cwd: z.string().max(LIMITS.cwd).optional().describe(CWD_HINT),
|
|
14
14
|
concepts: z
|
|
15
15
|
.array(z.object({
|
|
16
|
-
slug: z.string(),
|
|
17
|
-
name: z.string().optional(),
|
|
18
|
-
domain: z.string().optional(),
|
|
16
|
+
slug: z.string().max(LIMITS.slug),
|
|
17
|
+
name: z.string().max(LIMITS.name).optional(),
|
|
18
|
+
domain: z.string().max(LIMITS.domain).optional(),
|
|
19
19
|
tier: z.number().int().min(1).max(5).optional(),
|
|
20
|
-
description: z.string().optional(),
|
|
20
|
+
description: z.string().max(LIMITS.description).optional(),
|
|
21
21
|
}))
|
|
22
|
-
.min(1)
|
|
22
|
+
.min(1)
|
|
23
|
+
.max(LIMITS.concepts),
|
|
23
24
|
edges: z
|
|
24
25
|
.array(z.object({
|
|
25
|
-
from: z.string(),
|
|
26
|
-
to: z.string(),
|
|
26
|
+
from: z.string().max(LIMITS.slug),
|
|
27
|
+
to: z.string().max(LIMITS.slug),
|
|
27
28
|
relation: z.enum(['prerequisite_of', 'related_to', 'part_of']),
|
|
28
29
|
}))
|
|
30
|
+
.max(LIMITS.edges)
|
|
29
31
|
.optional()
|
|
30
32
|
.describe('Prefer prerequisite_of edges — they are what orders a teaching session.'),
|
|
31
33
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upsert_concepts.js","sourceRoot":"","sources":["../../src/tools/upsert_concepts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACpG,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAgB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"upsert_concepts.js","sourceRoot":"","sources":["../../src/tools/upsert_concepts.ts"],"names":[],"mappings":"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"}
|