eklavya 1.84.0 → 1.85.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
CHANGED
|
@@ -52,13 +52,13 @@ Code's learning loop.
|
|
|
52
52
|
|---|---|
|
|
53
53
|
| Learner state and concepts | `get_learner_profile`, `log_session_concepts`, `upsert_concepts`, `get_concept_graph` |
|
|
54
54
|
| Questions and assessment (automatic questions wait for a code change, not a `git pull`; see `quiz.only_on_changes`) | `get_session_quiz_plan`, `record_attempt`, `get_gate_status` |
|
|
55
|
-
| Quiz side panel (experimental) | `present_question` for the model; `panel_sync` and `panel_answer`, called only by the panel mod, never by the model; its header stacks the mark above the topic in a pane under 60 cells wide |
|
|
55
|
+
| Quiz side panel (experimental) | `present_question` for the model; `panel_sync` and `panel_answer`, called only by the panel mod, never by the model; its header stacks the mark above the topic in a pane under 60 cells wide; on the desktop app each option's note is its own line under the option, and a click on the option picks it |
|
|
56
56
|
| Settings | `get_config`, `set_config` |
|
|
57
57
|
| Find and read memory (`memory_status` includes a `health` verdict with reasons) | `memory_search`, `memory_get`, `memory_timeline`, `memory_file_history`, `memory_status` |
|
|
58
58
|
| Maintain memory | `memory_write`, `memory_correct`, `memory_delete`, `memory_collections` |
|
|
59
59
|
| Inspect code | `code_outline`, `code_find_symbol` |
|
|
60
60
|
|
|
61
|
-
`log_session_concepts` and `upsert_concepts` take a concept name of 1 to 3 words, a `description` of up to 400 characters and up to 5 `tags`. A new concept that resembles existing ones is not created: the response lists it under `needs_decision` with candidates, and you reuse a candidate's slug or repeat the slug with `new: true`. `log_session_concepts` creates a new concept with the domain and tier you pass, or domain `general` and tier 2 when you pass none. Pass `prerequisites` (up to 5 slugs, existing or in the same call) and each becomes a `prerequisite_of` edge; a slug it cannot find is reported under `prerequisites_not_found`, and the response lists the created concepts that still have no edge under `unlinked`. `upsert_concepts` sets the domain and tier of a model-created concept that still has domain `general`, adds tags to any concept, fills in or refines the description of a model-created concept, and adds edges. It never rewrites the description or domain of a concept from the seed or a pack, or of one that already has a domain (the one it was logged with, or its first tag). Its response lists the concepts it changed under `updated`. `get_concept_graph` returns each concept's `tags`.
|
|
61
|
+
`log_session_concepts` and `upsert_concepts` take a concept name of 1 to 3 words (a longer name fails the whole call's input check), a `description` of up to 400 characters and up to 5 `tags`. A new concept that resembles existing ones is not created: the response lists it under `needs_decision` with candidates, and you reuse a candidate's slug or repeat the slug with `new: true`. `log_session_concepts` creates a new concept with the domain and tier you pass, or domain `general` and tier 2 when you pass none. Pass `prerequisites` (up to 5 slugs, existing or in the same call) and each becomes a `prerequisite_of` edge; a slug it cannot find is reported under `prerequisites_not_found`, and the response lists the created concepts that still have no edge under `unlinked`. `upsert_concepts` sets the domain and tier of a model-created concept that still has domain `general`, adds tags to any concept, fills in or refines the description of a model-created concept, and adds edges. It never rewrites the description or domain of a concept from the seed or a pack, or of one that already has a domain (the one it was logged with, or its first tag). Its response lists the concepts it changed under `updated`. `get_concept_graph` returns each concept's `tags`.
|
|
62
62
|
|
|
63
63
|
`memory_collections` applies a saved filter the same way with or without a
|
|
64
64
|
query, and its members are live entries only: a member deleted or corrected
|
|
@@ -49,7 +49,7 @@ actual decision in the actual file.
|
|
|
49
49
|
- Good: `"set httpOnly on the refresh cookie in auth.ts:42"`
|
|
50
50
|
- Useless: `"used cookies"`
|
|
51
51
|
|
|
52
|
-
A concept is a topic, not a fact: `name` it in 1–3 words ("Flutter animation",
|
|
52
|
+
A concept is a topic, not a fact: `name` it in 1–3 words, never 4 or more ("Flutter animation",
|
|
53
53
|
not "dispose the controller in pulse.dart"), say what it is in `description`,
|
|
54
54
|
add `tags`. Reuse what exists. If the response has `needs_decision`, nothing was
|
|
55
55
|
logged for those: call again with a candidate's `slug` when it is the same idea,
|
|
@@ -57,8 +57,8 @@ or the same slug with `new: true` when none is. Give each concept an honest `tie
|
|
|
57
57
|
or `prereqs_unmet` stays empty and the fairness check silently passes. Any
|
|
58
58
|
`unlinked` slug in the response still owes an edge: `upsert_concepts`.
|
|
59
59
|
|
|
60
|
-
Logging is silent — never narrate it or pause the work
|
|
61
|
-
`as-you-go` cadence, the default, the
|
|
60
|
+
Logging is silent — never narrate it or pause the work. On
|
|
61
|
+
`as-you-go` cadence, the default, the call may come back with a
|
|
62
62
|
checkpoint.
|
|
63
63
|
|
|
64
64
|
## Which one is asking
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eklavya",
|
|
3
3
|
"displayName": "Eklavya",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.85.0",
|
|
5
5
|
"description": "Learn while your agent works. Turns coding-agent generation time into adaptive, Socratic learning grounded in the code being written.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Ajay Kumar"
|
|
@@ -434,7 +434,7 @@ export const register: Register = on => {
|
|
|
434
434
|
))}
|
|
435
435
|
</Box>
|
|
436
436
|
)
|
|
437
|
-
// One answer: a bordered block. The Button holds the
|
|
437
|
+
// One answer: a bordered block. The Button holds the answer text, so a press on it
|
|
438
438
|
// selects; the border and fill show the pick, and nothing implies it is
|
|
439
439
|
// right. The desktop app gives the text more room inside the border; the padding itself is not
|
|
440
440
|
// pressable, since a Button takes none. The terminal keeps its tight cards.
|
|
@@ -501,11 +501,12 @@ export const register: Register = on => {
|
|
|
501
501
|
const locked = s.step === 'grading'
|
|
502
502
|
// Submit looks disabled until there is something to send; pressing it then does nothing.
|
|
503
503
|
const hasDraft = s.draft.other ? s.draft.text.trim().length > 0 : s.draft.picked !== null
|
|
504
|
-
//
|
|
504
|
+
// In the terminal the answer and its note are the Button's own inline Text, so a press anywhere on them
|
|
505
|
+
// selects. The desktop app draws only a Button's label (docs/verified-schemas.md row 17), so there the
|
|
506
|
+
// note is a Text under the Button and only the answer selects.
|
|
505
507
|
// Markdown marks cannot show inside a Button, so the code and bold marks are dropped from both.
|
|
506
508
|
// The pick shows by the card's border and fill, never a mark in the text, so picking moves nothing.
|
|
507
|
-
//
|
|
508
|
-
// its plain Button draws.
|
|
509
|
+
// The terminal indents the note under the `1: ` its plain Button draws.
|
|
509
510
|
// `wrap` asks the app to wrap a long answer rather than cut it off.
|
|
510
511
|
const answer = (id: string, key: string, hotkey: string, label: string, chosen: boolean, note?: string) => (
|
|
511
512
|
<Button
|
|
@@ -516,7 +517,7 @@ export const register: Register = on => {
|
|
|
516
517
|
onPress={() => (locked ? undefined : id === 'other' ? chooseOther($) : pick($, id))}
|
|
517
518
|
>
|
|
518
519
|
<Text wrap="wrap" bold={chosen} color={chosen && id !== 'other' ? PICKED.text : undefined}>{label}</Text>
|
|
519
|
-
{note ? <Text wrap="wrap" dimColor={!chosen} color={chosen ? PICKED.note : undefined}>{`\n
|
|
520
|
+
{note && !app ? <Text wrap="wrap" dimColor={!chosen} color={chosen ? PICKED.note : undefined}>{`\n ${note}`}</Text> : null}
|
|
520
521
|
</Button>
|
|
521
522
|
)
|
|
522
523
|
const options = q.options.map((o, i) => {
|
|
@@ -525,7 +526,10 @@ export const register: Register = on => {
|
|
|
525
526
|
o.id,
|
|
526
527
|
chosen,
|
|
527
528
|
answer(o.id, `opt-${o.id}`, String(i + 1), plainLabel(o.label), chosen, o.note ? plainLabel(o.note) : undefined),
|
|
528
|
-
|
|
529
|
+
// The desktop app draws only a Button's label, not its inline children, so there the note sits under the button.
|
|
530
|
+
app && o.note
|
|
531
|
+
? [<Text key={`note-${o.id}`} wrap="wrap" dimColor={!chosen} color={chosen ? PICKED.note : undefined}>{plainLabel(o.note)}</Text>]
|
|
532
|
+
: [],
|
|
529
533
|
)
|
|
530
534
|
})
|
|
531
535
|
|
|
@@ -49,7 +49,7 @@ actual decision in the actual file.
|
|
|
49
49
|
- Good: `"set httpOnly on the refresh cookie in auth.ts:42"`
|
|
50
50
|
- Useless: `"used cookies"`
|
|
51
51
|
|
|
52
|
-
A concept is a topic, not a fact: `name` it in 1–3 words ("Flutter animation",
|
|
52
|
+
A concept is a topic, not a fact: `name` it in 1–3 words, never 4 or more ("Flutter animation",
|
|
53
53
|
not "dispose the controller in pulse.dart"), say what it is in `description`,
|
|
54
54
|
add `tags`. Reuse what exists. If the response has `needs_decision`, nothing was
|
|
55
55
|
logged for those: call again with a candidate's `slug` when it is the same idea,
|
|
@@ -57,8 +57,8 @@ or the same slug with `new: true` when none is. Give each concept an honest `tie
|
|
|
57
57
|
or `prereqs_unmet` stays empty and the fairness check silently passes. Any
|
|
58
58
|
`unlinked` slug in the response still owes an edge: `upsert_concepts`.
|
|
59
59
|
|
|
60
|
-
Logging is silent — never narrate it or pause the work
|
|
61
|
-
`as-you-go` cadence, the default, the
|
|
60
|
+
Logging is silent — never narrate it or pause the work. On
|
|
61
|
+
`as-you-go` cadence, the default, the call may come back with a
|
|
62
62
|
checkpoint.
|
|
63
63
|
|
|
64
64
|
## Which one is asking
|
package/package.json
CHANGED