eklavya 1.71.2 → 1.73.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.
- package/README.md +3 -3
- package/dist/assets/dashboard.html +95 -15
- package/dist/assets/tutor/SKILL.md +8 -10
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/concepts.js +118 -0
- package/dist/concepts.js.map +1 -0
- package/dist/dashboard.js +6 -4
- package/dist/dashboard.js.map +1 -1
- package/dist/hooks/checkpoint-quiz.js +3 -2
- package/dist/hooks/checkpoint-quiz.js.map +1 -1
- package/dist/hooks/session-start.js +3 -1
- package/dist/hooks/session-start.js.map +1 -1
- package/dist/hooks/stop-quiz-check.js +3 -2
- package/dist/hooks/stop-quiz-check.js.map +1 -1
- package/dist/memory/learning.js +13 -3
- package/dist/memory/learning.js.map +1 -1
- package/dist/memory/recall.js +3 -3
- package/dist/memory/recall.js.map +1 -1
- package/dist/migrations/032_concept_tags_mastery_streak.sql +24 -0
- package/dist/plugin/.claude-plugin/plugin.json +1 -1
- package/dist/plugin/skills/tutor/SKILL.md +8 -10
- package/dist/slug.js +2 -2
- package/dist/slug.js.map +1 -1
- package/dist/srs.js +43 -4
- package/dist/srs.js.map +1 -1
- package/dist/store.js +15 -11
- package/dist/store.js.map +1 -1
- package/dist/telemetry-send.js +2 -2
- package/dist/telemetry-send.js.map +1 -1
- package/dist/tools/get_concept_graph.js +7 -6
- package/dist/tools/get_concept_graph.js.map +1 -1
- package/dist/tools/get_learner_profile.js +3 -4
- package/dist/tools/get_learner_profile.js.map +1 -1
- package/dist/tools/get_session_quiz_plan.js +5 -5
- package/dist/tools/get_session_quiz_plan.js.map +1 -1
- package/dist/tools/log_session_concepts.js +68 -11
- package/dist/tools/log_session_concepts.js.map +1 -1
- package/dist/tools/record_attempt.js +2 -2
- package/dist/tools/record_attempt.js.map +1 -1
- package/dist/tools/types.js +4 -0
- package/dist/tools/types.js.map +1 -1
- package/dist/tools/upsert_concepts.js +36 -14
- package/dist/tools/upsert_concepts.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { loadConfig } from '../config.js';
|
|
3
3
|
import { normalizeSlug, isValidSlug, findFuzzyMatch } from '../slug.js';
|
|
4
|
-
import {
|
|
4
|
+
import { cleanTags, findCandidates, growConcept, MAX_NAME_WORDS, wordCount } from '../concepts.js';
|
|
5
|
+
import { decayedScore, isKnown, streakOf } from '../srs.js';
|
|
5
6
|
import { resolveSessionId } from '../session.js';
|
|
6
7
|
import { allConceptSlugs, conceptBySlug, insertConcept, logSessionConcept, masteryFor, newConceptsThisSession, sessionConcepts, syncGate, } from '../store.js';
|
|
7
8
|
import { withSurfaceNote } from '../surface.js';
|
|
@@ -15,16 +16,24 @@ export const logSessionConcepts = {
|
|
|
15
16
|
// the environment the server was started in. That is the right moment: the
|
|
16
17
|
// host sets `CLAUDE_CODE_ENTRYPOINT` before spawning us and a session cannot
|
|
17
18
|
// change surface halfway through.
|
|
18
|
-
description: withSurfaceNote(
|
|
19
|
+
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. A concept is a short name (1-${MAX_NAME_WORDS} words), a description and tags: reuse one the learner already has before minting. An unknown slug that resembles existing concepts is not created: the response lists them in needs_decision, so call again with a candidate's slug, or the same slug with new: true when none is the same idea. Pass a description or tags for a concept you met again and it deepens. Pass prerequisites (slugs to know first) so the concept needs no follow-up call. When the response carries next_action, do what it says before quizzing.`, ' '),
|
|
19
20
|
inputSchema: {
|
|
20
21
|
session_id: z.string().max(LIMITS.sessionId).optional().describe(SESSION_HINT),
|
|
21
22
|
cwd: z.string().max(LIMITS.cwd).optional().describe(CWD_HINT),
|
|
22
23
|
concepts: z
|
|
23
24
|
.array(z.object({
|
|
24
25
|
slug: z.string().max(LIMITS.slug).describe('kebab-case, e.g. "httponly-cookies"'),
|
|
25
|
-
name: z
|
|
26
|
+
name: z
|
|
27
|
+
.string()
|
|
28
|
+
.max(LIMITS.name)
|
|
29
|
+
.refine((n) => wordCount(n) <= MAX_NAME_WORDS, `a concept name is 1-${MAX_NAME_WORDS} words; put the detail in description`)
|
|
30
|
+
.optional(),
|
|
26
31
|
domain: z.string().max(LIMITS.domain).optional(),
|
|
27
32
|
tier: z.number().int().min(1).max(5).optional(),
|
|
33
|
+
description: z.string().max(LIMITS.conceptDescription).optional().describe('What the concept is, in a sentence or two. On an existing concept it deepens the description.'),
|
|
34
|
+
tags: z.array(z.string().max(LIMITS.tag)).max(LIMITS.tags).optional().describe('1-3 word labels, e.g. ["flutter", "animation"]. Reuse tags you have seen.'),
|
|
35
|
+
new: z.boolean().optional().describe('Set when needs_decision listed candidates and none is the same idea.'),
|
|
36
|
+
prerequisites: z.array(z.string().max(LIMITS.slug)).max(5).optional().describe('Slugs of concepts to know first: existing ones, or others in this call. Each becomes a prerequisite_of edge, which is what makes the fairness check work.'),
|
|
28
37
|
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
38
|
}))
|
|
30
39
|
.min(1)
|
|
@@ -36,8 +45,12 @@ export const logSessionConcepts = {
|
|
|
36
45
|
const sessionId = resolveSessionId(db, args.session_id, args.cwd);
|
|
37
46
|
const created = [];
|
|
38
47
|
const matched = [];
|
|
48
|
+
const needsDecision = [];
|
|
39
49
|
const logged = [];
|
|
40
50
|
let capped = 0;
|
|
51
|
+
let edgesAdded = 0;
|
|
52
|
+
const prerequisitesNotFound = [];
|
|
53
|
+
const resolved = new Map();
|
|
41
54
|
const apply = db.transaction(() => {
|
|
42
55
|
let budget = Math.max(0, config.max_new_concepts_per_session - newConceptsThisSession(db, sessionId));
|
|
43
56
|
for (const input of args.concepts) {
|
|
@@ -55,23 +68,55 @@ export const logSessionConcepts = {
|
|
|
55
68
|
matched.push({ requested: slug, resolved: concept.slug });
|
|
56
69
|
}
|
|
57
70
|
}
|
|
71
|
+
if (!concept && !input.new) {
|
|
72
|
+
// Not minted yet: the model decides whether one of these is the same
|
|
73
|
+
// idea. Skipping the check is `new: true`, an explicit claim.
|
|
74
|
+
const candidates = findCandidates(db, { slug, name: input.name, tags: input.tags, domain: input.domain });
|
|
75
|
+
if (candidates.length > 0) {
|
|
76
|
+
needsDecision.push({ requested: slug, candidates });
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
58
80
|
if (!concept) {
|
|
59
81
|
if (budget <= 0) {
|
|
60
82
|
capped += 1;
|
|
61
83
|
continue;
|
|
62
84
|
}
|
|
85
|
+
const tags = cleanTags([input.domain ?? '', ...(input.tags ?? [])]);
|
|
63
86
|
concept = insertConcept(db, {
|
|
64
87
|
slug,
|
|
65
88
|
name: input.name ?? slug.replace(/-/g, ' '),
|
|
66
|
-
domain: input.domain ?? DEFAULT_DOMAIN,
|
|
89
|
+
domain: input.domain ?? tags[0] ?? DEFAULT_DOMAIN,
|
|
90
|
+
description: input.description ?? null,
|
|
91
|
+
tags,
|
|
67
92
|
tier: input.tier ?? DEFAULT_TIER,
|
|
68
93
|
source: 'llm',
|
|
69
94
|
});
|
|
70
95
|
created.push(concept.slug);
|
|
71
96
|
budget -= 1;
|
|
72
97
|
}
|
|
98
|
+
else {
|
|
99
|
+
growConcept(db, concept, { description: input.description, tags: input.tags });
|
|
100
|
+
}
|
|
73
101
|
logSessionConcept(db, sessionId, concept.id, input.context ?? null, 'work');
|
|
74
102
|
logged.push(concept.slug);
|
|
103
|
+
resolved.set(slug, concept);
|
|
104
|
+
}
|
|
105
|
+
// After the loop, so a prerequisite listed later in the same call exists.
|
|
106
|
+
const insertEdge = db.prepare('INSERT OR IGNORE INTO edges (from_concept, to_concept, relation) VALUES (?, ?, ?)');
|
|
107
|
+
for (const input of args.concepts) {
|
|
108
|
+
const concept = resolved.get(normalizeSlug(input.slug));
|
|
109
|
+
if (!concept)
|
|
110
|
+
continue;
|
|
111
|
+
for (const raw of input.prerequisites ?? []) {
|
|
112
|
+
const key = normalizeSlug(raw);
|
|
113
|
+
const near = resolved.has(key) || conceptBySlug(db, key) ? undefined : findFuzzyMatch(key, allConceptSlugs(db));
|
|
114
|
+
const pre = resolved.get(key) ?? conceptBySlug(db, key) ?? (near ? conceptBySlug(db, near.slug) : undefined);
|
|
115
|
+
if (!pre)
|
|
116
|
+
prerequisitesNotFound.push({ concept: concept.slug, requested: key });
|
|
117
|
+
else if (pre.id !== concept.id)
|
|
118
|
+
edgesAdded += insertEdge.run(pre.id, concept.id, 'prerequisite_of').changes;
|
|
119
|
+
}
|
|
75
120
|
}
|
|
76
121
|
// The gate's bar rises with the work: how many touched concepts are still
|
|
77
122
|
// unmastered, capped at the configured questions per task.
|
|
@@ -79,7 +124,7 @@ export const logSessionConcepts = {
|
|
|
79
124
|
// raising the bar would raise it past anything the learner could clear.
|
|
80
125
|
const unmastered = sessionConcepts(db, sessionId, 'work').filter((c) => {
|
|
81
126
|
const m = masteryFor(db, c.id);
|
|
82
|
-
return !isKnown({ score: decayedScore(m.score, m.next_review, now),
|
|
127
|
+
return !isKnown({ score: decayedScore(m.score, m.next_review, now), ...streakOf(m) });
|
|
83
128
|
}).length;
|
|
84
129
|
// Inside the transaction, not after it: `registerTools` retries the whole
|
|
85
130
|
// handler on SQLITE_BUSY, and a retry after the concepts had committed
|
|
@@ -91,21 +136,33 @@ export const logSessionConcepts = {
|
|
|
91
136
|
});
|
|
92
137
|
});
|
|
93
138
|
const gate = apply();
|
|
94
|
-
// Said in the response, not only in the tutor skill.
|
|
95
|
-
//
|
|
96
|
-
//
|
|
97
|
-
// about, however far out of its depth the learner is. The skill says to fix
|
|
139
|
+
// Said in the response, not only in the tutor skill. `prereqs_unmet` is
|
|
140
|
+
// computed from edges, so a concept with none can never be reported as
|
|
141
|
+
// unfair to ask about, however far out of its depth the learner is. The skill says to fix
|
|
98
142
|
// that, but it is model-invoked and may never load; the same gap is why the
|
|
99
143
|
// concept-logging directive had to move into the SessionStart banner. This
|
|
100
144
|
// lands in context whatever loaded.
|
|
101
|
-
const
|
|
102
|
-
? `Call
|
|
145
|
+
const decide = needsDecision.length > 0
|
|
146
|
+
? `Call log_session_concepts again for ${needsDecision.map((n) => n.requested).join(', ')}: use a candidate's slug when it is the same idea, or repeat the slug with new: true when none is. Nothing was logged for them yet.`
|
|
147
|
+
: undefined;
|
|
148
|
+
// Created concepts that still have no edge: the ones whose `prerequisites`
|
|
149
|
+
// the model left out. Those are the only debt now; a concept logged with
|
|
150
|
+
// its prerequisites needs no second call.
|
|
151
|
+
const hasEdge = db.prepare('SELECT 1 FROM edges e JOIN concepts c ON c.id IN (e.from_concept, e.to_concept) WHERE c.slug = ? LIMIT 1');
|
|
152
|
+
const unlinked = created.filter((slug) => !hasEdge.get(slug));
|
|
153
|
+
const followUp = unlinked.length > 0
|
|
154
|
+
? `Call upsert_concepts for ${unlinked.join(', ')} — each was created with no prerequisite edge. Give each at least one prerequisite_of edge (or pass prerequisites when you log), or prereqs_unmet stays empty and the fairness check silently passes.`
|
|
103
155
|
: undefined;
|
|
156
|
+
const nextAction = [decide, followUp].filter(Boolean).join(' ') || undefined;
|
|
104
157
|
return {
|
|
105
158
|
session_id: sessionId,
|
|
106
159
|
logged,
|
|
107
160
|
created,
|
|
161
|
+
unlinked,
|
|
108
162
|
matched,
|
|
163
|
+
needs_decision: needsDecision,
|
|
164
|
+
edges_added: edgesAdded,
|
|
165
|
+
...(prerequisitesNotFound.length ? { prerequisites_not_found: prerequisitesNotFound } : {}),
|
|
109
166
|
capped,
|
|
110
167
|
gate,
|
|
111
168
|
...(nextAction ? { next_action: nextAction } : {}),
|
|
@@ -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,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"log_session_concepts.js","sourceRoot":"","sources":["../../src/tools/log_session_concepts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { loadConfig } from '../config.js';
|
|
3
3
|
import { normalizeSlug } from '../slug.js';
|
|
4
|
-
import { decayedScore, isKnown } from '../srs.js';
|
|
4
|
+
import { decayedScore, isKnown, streakOf } from '../srs.js';
|
|
5
5
|
import { resolveSessionId } from '../session.js';
|
|
6
6
|
import { conceptBySlug, gradeConcept, hasAskedQuestion, isMissed, recordInvalidQuestion, levelStanding, logSessionConcept, promoteIfEarned, syncGate, MAX_MCQ_GRADE, PASSING_GRADE, } from '../store.js';
|
|
7
7
|
import { stripAskHeader } from '../ask.js';
|
|
@@ -241,7 +241,7 @@ export function recordAttemptCore(db, args) {
|
|
|
241
241
|
interval_days: state.interval_d,
|
|
242
242
|
reps: state.reps,
|
|
243
243
|
ease: Number(state.ease.toFixed(2)),
|
|
244
|
-
known: isKnown({ score,
|
|
244
|
+
known: isKnown({ score, ...streakOf(state) }),
|
|
245
245
|
// Never the same question twice. Recorded either way — refusing the
|
|
246
246
|
// write would lose a real answer — but the tutor is told, so the next
|
|
247
247
|
// question can be a new one.
|
|
@@ -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;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,WAAW,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
|
@@ -21,6 +21,10 @@ export const LIMITS = {
|
|
|
21
21
|
name: 200,
|
|
22
22
|
domain: 100,
|
|
23
23
|
description: 2000,
|
|
24
|
+
/** A concept's description: a paragraph at most, so it stays cheap to show beside its neighbours. */
|
|
25
|
+
conceptDescription: 400,
|
|
26
|
+
tags: 5,
|
|
27
|
+
tag: 24,
|
|
24
28
|
context: 1000,
|
|
25
29
|
question: 4000,
|
|
26
30
|
answer: 8000,
|
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;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"}
|
|
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,qGAAqG;IACrG,kBAAkB,EAAE,GAAG;IACvB,IAAI,EAAE,CAAC;IACP,GAAG,EAAE,EAAE;IACP,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"}
|
|
@@ -2,23 +2,30 @@ import { z } from 'zod';
|
|
|
2
2
|
import { loadConfig } from '../config.js';
|
|
3
3
|
import { normalizeSlug, isValidSlug, findFuzzyMatch } from '../slug.js';
|
|
4
4
|
import { resolveSessionId } from '../session.js';
|
|
5
|
+
import { cleanTags, findCandidates, growConcept, MAX_NAME_WORDS, wordCount } from '../concepts.js';
|
|
5
6
|
import { allConceptSlugs, conceptBySlug, insertConcept, newConceptsThisSession } from '../store.js';
|
|
6
7
|
import { CWD_HINT, LIMITS, SESSION_HINT } from './types.js';
|
|
7
8
|
const DEFAULT_DOMAIN = 'general';
|
|
8
9
|
export const upsertConcepts = {
|
|
9
10
|
name: 'upsert_concepts',
|
|
10
11
|
title: 'Upsert concepts',
|
|
11
|
-
description: 'Grow the knowledge graph when work touches a concept that has no slug yet, or give a concept log_session_concepts just created
|
|
12
|
+
description: 'Grow the knowledge graph when work touches a concept that has no slug yet, or give a concept log_session_concepts just created its real domain, tier, description and tags. A concept is a short name (1-3 words), a description and tags. Slugs are normalized and near-duplicates are folded into the existing concept, so check the returned canonical slug before using it; a new concept that resembles existing ones is listed in needs_decision instead of created, so reuse a candidate or repeat it with new: true. A concept from the seed or a pack, or one that already has a domain (given when it was logged, or its first tag), keeps its domain, tier and description; its tags can still grow. `updated` lists what changed.',
|
|
12
13
|
inputSchema: {
|
|
13
14
|
session_id: z.string().max(LIMITS.sessionId).optional().describe(SESSION_HINT),
|
|
14
15
|
cwd: z.string().max(LIMITS.cwd).optional().describe(CWD_HINT),
|
|
15
16
|
concepts: z
|
|
16
17
|
.array(z.object({
|
|
17
18
|
slug: z.string().max(LIMITS.slug),
|
|
18
|
-
name: z
|
|
19
|
+
name: z
|
|
20
|
+
.string()
|
|
21
|
+
.max(LIMITS.name)
|
|
22
|
+
.refine((n) => wordCount(n) <= MAX_NAME_WORDS, `a concept name is 1-${MAX_NAME_WORDS} words; put the detail in description`)
|
|
23
|
+
.optional(),
|
|
19
24
|
domain: z.string().max(LIMITS.domain).optional(),
|
|
20
25
|
tier: z.number().int().min(1).max(5).optional(),
|
|
21
|
-
description: z.string().max(LIMITS.
|
|
26
|
+
description: z.string().max(LIMITS.conceptDescription).optional(),
|
|
27
|
+
tags: z.array(z.string().max(LIMITS.tag)).max(LIMITS.tags).optional(),
|
|
28
|
+
new: z.boolean().optional().describe('Set when needs_decision listed candidates and none is the same idea.'),
|
|
22
29
|
}))
|
|
23
30
|
.min(1)
|
|
24
31
|
.max(LIMITS.concepts),
|
|
@@ -39,6 +46,7 @@ export const upsertConcepts = {
|
|
|
39
46
|
const matched = [];
|
|
40
47
|
const updated = [];
|
|
41
48
|
const rejected = [];
|
|
49
|
+
const needsDecision = [];
|
|
42
50
|
const resolvedSlug = new Map();
|
|
43
51
|
let edgesAdded = 0;
|
|
44
52
|
db.transaction(() => {
|
|
@@ -51,18 +59,23 @@ export const upsertConcepts = {
|
|
|
51
59
|
}
|
|
52
60
|
const existing = conceptBySlug(db, slug);
|
|
53
61
|
if (existing) {
|
|
54
|
-
// `log_session_concepts` mints
|
|
55
|
-
//
|
|
56
|
-
//
|
|
57
|
-
//
|
|
58
|
-
// already-placed concept is the catalogue's, and one model call must
|
|
59
|
-
// not rewrite it for every learner.
|
|
62
|
+
// `log_session_concepts` mints a concept in the domain it was given (or
|
|
63
|
+
// its first tag), else `general`, at tier 2. Only a concept still in
|
|
64
|
+
// `general` is unplaced: a seeded, pack or already-placed concept is the
|
|
65
|
+
// catalogue's, and one model call must not rewrite it for every learner.
|
|
60
66
|
const bare = existing.source === 'llm' && existing.domain === DEFAULT_DOMAIN;
|
|
61
67
|
const domain = input.domain && input.domain !== DEFAULT_DOMAIN ? input.domain : null;
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
68
|
+
let changed = false;
|
|
69
|
+
if (bare && (domain || input.tier !== undefined)) {
|
|
70
|
+
db.prepare('UPDATE concepts SET domain = ?, tier = ? WHERE id = ?').run(domain ?? existing.domain, input.tier ?? existing.tier, existing.id);
|
|
71
|
+
changed = true;
|
|
65
72
|
}
|
|
73
|
+
// Description and tags deepen any concept the session met again; the
|
|
74
|
+
// catalogue's own descriptions are left alone (see growConcept).
|
|
75
|
+
if (growConcept(db, existing, { description: input.description, tags: input.tags }))
|
|
76
|
+
changed = true;
|
|
77
|
+
if (changed)
|
|
78
|
+
updated.push(existing.slug);
|
|
66
79
|
resolvedSlug.set(input.slug, existing.slug);
|
|
67
80
|
matched.push({ requested: slug, resolved: existing.slug });
|
|
68
81
|
continue;
|
|
@@ -73,14 +86,23 @@ export const upsertConcepts = {
|
|
|
73
86
|
matched.push({ requested: slug, resolved: near.slug });
|
|
74
87
|
continue;
|
|
75
88
|
}
|
|
89
|
+
if (!input.new) {
|
|
90
|
+
const candidates = findCandidates(db, { slug, name: input.name, tags: input.tags, domain: input.domain });
|
|
91
|
+
if (candidates.length > 0) {
|
|
92
|
+
needsDecision.push({ requested: slug, candidates });
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
76
96
|
if (budget <= 0) {
|
|
77
97
|
rejected.push({ slug, reason: 'session_cap_reached' });
|
|
78
98
|
continue;
|
|
79
99
|
}
|
|
100
|
+
const tags = cleanTags([input.domain ?? '', ...(input.tags ?? [])]);
|
|
80
101
|
const concept = insertConcept(db, {
|
|
81
102
|
slug,
|
|
82
103
|
name: input.name ?? slug.replace(/-/g, ' '),
|
|
83
|
-
domain: input.domain ?? DEFAULT_DOMAIN,
|
|
104
|
+
domain: input.domain ?? tags[0] ?? DEFAULT_DOMAIN,
|
|
105
|
+
tags,
|
|
84
106
|
description: input.description ?? null,
|
|
85
107
|
tier: input.tier ?? 2,
|
|
86
108
|
source: 'llm',
|
|
@@ -99,7 +121,7 @@ export const upsertConcepts = {
|
|
|
99
121
|
edgesAdded += result.changes;
|
|
100
122
|
}
|
|
101
123
|
})();
|
|
102
|
-
return { created, updated, matched, rejected, edges_added: edgesAdded };
|
|
124
|
+
return { created, updated, matched, rejected, needs_decision: needsDecision, edges_added: edgesAdded };
|
|
103
125
|
},
|
|
104
126
|
};
|
|
105
127
|
//# sourceMappingURL=upsert_concepts.js.map
|
|
@@ -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,MAAM,EAAE,YAAY,EAAgB,MAAM,YAAY,CAAC;AAE1E,MAAM,cAAc,GAAG,SAAS,CAAC;AAEjC,MAAM,CAAC,MAAM,cAAc,GAAY;IACrC,IAAI,EAAE,iBAAiB;IACvB,KAAK,EAAE,iBAAiB;IACxB,WAAW,EACT
|
|
1
|
+
{"version":3,"file":"upsert_concepts.js","sourceRoot":"","sources":["../../src/tools/upsert_concepts.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED