eklavya 1.42.1 → 1.42.3
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.
|
@@ -17,6 +17,10 @@
|
|
|
17
17
|
* snapshot the previous Bash call left. Agents edit through heredocs and
|
|
18
18
|
* `sed -i` as often as through Edit -- a 39-call session made no Edit at all.
|
|
19
19
|
* Files already dirty at the first snapshot count only if they move again.
|
|
20
|
+
* The snapshot covers the session's own tree and the one a leading
|
|
21
|
+
* `cd <dir> &&` names, one per repository: a session started in the main
|
|
22
|
+
* checkout that works in a sibling worktree edits only there, and the
|
|
23
|
+
* session's cwd never moves (36 Bash calls in one talea session, no nudge).
|
|
20
24
|
*
|
|
21
25
|
* PostToolUse rather than PreToolUse: a failed edit never gets here, so only an
|
|
22
26
|
* edit that happened counts, and the nudge lands after the tool result the model
|
|
@@ -31,6 +35,7 @@
|
|
|
31
35
|
* costs no git. No inference; fails open.
|
|
32
36
|
*/
|
|
33
37
|
import fs from 'node:fs';
|
|
38
|
+
import os from 'node:os';
|
|
34
39
|
import path from 'node:path';
|
|
35
40
|
import { run, openExisting, config, cwdOf, sessionId } from './lib.js';
|
|
36
41
|
import { git } from './changes-lib.js';
|
|
@@ -38,6 +43,8 @@ const EDIT_TOOLS = /^(Edit|Write|MultiEdit|NotebookEdit)$/;
|
|
|
38
43
|
const KEY_PREFIX = 'delegate_nudge:';
|
|
39
44
|
/** More dirty entries than this and the Bash snapshot is skipped: the row would be large and the signal is noise. */
|
|
40
45
|
const MAX_SNAPSHOT = 2000;
|
|
46
|
+
/** Repositories whose snapshots are kept; the least recently touched goes first. */
|
|
47
|
+
const MAX_ROOTS = 4;
|
|
41
48
|
const NUDGE = `[Eklavya] This task now edits more than one file. Hand the remaining work to one or more agents run in the background, each with a self-contained brief (goal, files, constraints, how to verify), and take back a short report. While they build, ask questions: get_session_quiz_plan with while_waiting: true, then AskUserQuestion, record_attempt and the verdict, one at a time, until an agent reports or questions_needed is 0. If the rest is a line or two, or agents cannot run in the background here, carry on inline.`;
|
|
42
49
|
/** The same file under every spelling: a symlinked temp dir, `./a.ts`, `a.ts`. */
|
|
43
50
|
function canonical(file) {
|
|
@@ -48,11 +55,25 @@ function canonical(file) {
|
|
|
48
55
|
return path.resolve(file);
|
|
49
56
|
}
|
|
50
57
|
}
|
|
51
|
-
/**
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
58
|
+
/**
|
|
59
|
+
* The directory a command's leading `cd` moves to, or null. Only the first
|
|
60
|
+
* word: `cd <dir> && …` is how agents work in another checkout. A `cd` later in
|
|
61
|
+
* the command, `pushd`, a subshell or a variable is not followed.
|
|
62
|
+
*/
|
|
63
|
+
function leadingCd(command, cwd) {
|
|
64
|
+
const m = /^\s*cd\s+(?:"([^"]+)"|'([^']+)'|([^\s;&|]+))\s*(?:&&|;|\n|$)/.exec(command);
|
|
65
|
+
const dir = m?.[1] ?? m?.[2] ?? m?.[3];
|
|
66
|
+
if (!dir || dir.includes('$'))
|
|
55
67
|
return null;
|
|
68
|
+
const home = dir === '~' || dir.startsWith('~/') ? path.join(os.homedir(), dir.slice(1)) : dir;
|
|
69
|
+
return path.resolve(cwd, home);
|
|
70
|
+
}
|
|
71
|
+
/** The repository root `dir` sits in, or null. */
|
|
72
|
+
function rootOf(dir) {
|
|
73
|
+
return git(dir, ['rev-parse', '--show-toplevel'])?.trim() || null;
|
|
74
|
+
}
|
|
75
|
+
/** Every entry `git status` reports under `root`, by absolute path, with its size and mtime; null on failure. */
|
|
76
|
+
function dirtyStamps(root) {
|
|
56
77
|
const status = git(root, ['status', '--porcelain=v1', '-z', '-uall']);
|
|
57
78
|
if (status === null)
|
|
58
79
|
return null;
|
|
@@ -114,13 +135,20 @@ await run(async (input) => {
|
|
|
114
135
|
return 0;
|
|
115
136
|
// Outside the lock: git can take a moment, and nothing here needs the row.
|
|
116
137
|
let changed;
|
|
117
|
-
let
|
|
138
|
+
let snaps;
|
|
118
139
|
if (isBash) {
|
|
119
|
-
const
|
|
120
|
-
|
|
140
|
+
const command = typeof input.tool_input?.command === 'string' ? input.tool_input.command : '';
|
|
141
|
+
const target = leadingCd(command, cwd);
|
|
142
|
+
const roots = new Set([cwd, target].filter((d) => Boolean(d)).map(rootOf).filter((r) => Boolean(r)));
|
|
143
|
+
snaps = {};
|
|
144
|
+
for (const root of roots) {
|
|
145
|
+
const now = dirtyStamps(root);
|
|
146
|
+
if (now)
|
|
147
|
+
snaps[root] = now;
|
|
148
|
+
}
|
|
149
|
+
if (!Object.keys(snaps).length)
|
|
121
150
|
return 0;
|
|
122
|
-
|
|
123
|
-
changed = []; // filled against the stored snapshot below
|
|
151
|
+
changed = []; // filled against the stored snapshots below
|
|
124
152
|
}
|
|
125
153
|
else {
|
|
126
154
|
changed = [canonical(path.resolve(cwd, raw))];
|
|
@@ -131,23 +159,28 @@ await run(async (input) => {
|
|
|
131
159
|
const state = read();
|
|
132
160
|
if (state.done)
|
|
133
161
|
return false;
|
|
134
|
-
if (
|
|
135
|
-
// ponytail:
|
|
136
|
-
//
|
|
137
|
-
// later call changes one more. A
|
|
138
|
-
// the cost of a second process on
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
162
|
+
if (snaps) {
|
|
163
|
+
// ponytail: a repository's first snapshot is taken after the first Bash
|
|
164
|
+
// call that reaches it, so a first command there that already changed
|
|
165
|
+
// two files is caught only when a later call changes one more. A
|
|
166
|
+
// PreToolUse snapshot would close it at the cost of a second process on
|
|
167
|
+
// every Bash call.
|
|
168
|
+
const kept = { ...state.snaps };
|
|
169
|
+
for (const [root, now] of Object.entries(snaps)) {
|
|
170
|
+
const before = kept[root];
|
|
171
|
+
if (before)
|
|
172
|
+
changed.push(...Object.keys(now).filter((f) => before[f] !== now[f]));
|
|
173
|
+
delete kept[root];
|
|
174
|
+
kept[root] = now; // re-inserted last: most recently touched
|
|
142
175
|
}
|
|
143
|
-
state.
|
|
176
|
+
state.snaps = Object.fromEntries(Object.entries(kept).slice(-MAX_ROOTS));
|
|
144
177
|
}
|
|
145
178
|
const others = [...new Set(changed)].filter((f) => f !== state.first);
|
|
146
179
|
if (!state.first && others.length)
|
|
147
180
|
state.first = others.shift();
|
|
148
181
|
if (others.length) {
|
|
149
182
|
state.done = true;
|
|
150
|
-
delete state.
|
|
183
|
+
delete state.snaps;
|
|
151
184
|
}
|
|
152
185
|
db.prepare('INSERT INTO meta (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value').run(key, `${new Date().toISOString()}|${JSON.stringify(state)}`);
|
|
153
186
|
return Boolean(state.done);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delegate-nudge.js","sourceRoot":"","sources":["../../src/hooks/delegate-nudge.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"delegate-nudge.js","sourceRoot":"","sources":["../../src/hooks/delegate-nudge.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eklavya",
|
|
3
3
|
"displayName": "Eklavya",
|
|
4
|
-
"version": "1.42.
|
|
4
|
+
"version": "1.42.3",
|
|
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"
|
|
@@ -20,7 +20,7 @@ registrations, for ten rows total.
|
|
|
20
20
|
| PostToolUse (all tools) | `capture-tool` | Record one memory event with a bounded result excerpt (none for reads and edits); no quiz, summarization or provider call |
|
|
21
21
|
| PostToolUse (`mcp__.*log_session_concepts`) | `checkpoint-quiz` | Ask a due interleaved question after concepts are logged |
|
|
22
22
|
| PostToolUse (`^(Bash|Edit|Write|MultiEdit|NotebookEdit)$`) | `checkpoint-quiz` | Mark an edit into a git tree for `only_on_changes`; recheck pacing as work continues; no spinner on every tool call |
|
|
23
|
-
| PostToolUse (`^(Bash|Edit|Write|MultiEdit|NotebookEdit)$`) | `delegate-nudge` | With questions on and `delegate_work`, tell the parent once per session, at its second distinct changed file (edit tool path, or `git status` moving between Bash calls), to hand the rest to background agents; parent only;
|
|
23
|
+
| PostToolUse (`^(Bash|Edit|Write|MultiEdit|NotebookEdit)$`) | `delegate-nudge` | With questions on and `delegate_work`, tell the parent once per session, at its second distinct changed file (edit tool path, or `git status` moving between Bash calls in the session's repository and in the one a leading `cd <dir> &&` names), to hand the rest to background agents; parent only; git for at most two repositories per Bash until it fires; no inference |
|
|
24
24
|
| Stop | `stop-quiz-check` | Record the turn's final message (parent only), flush the memory seam and request the remaining eligible quiz |
|
|
25
25
|
|
|
26
26
|
The MCP matcher accepts both standalone and plugin-scoped names. Do not narrow
|
|
@@ -18,4 +18,4 @@ Say one line back:
|
|
|
18
18
|
|
|
19
19
|
If `set_config` returns a `note`, the project enforces the commit gate: say that a commit still waits for the quiz, and keeps growing while the session is silent. If it returns `no_session`, no hook has registered this session — say so and offer `/eklavya:mode off` at global scope instead, which they will have to turn back on themselves. Do not fall back to it without asking.
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
Memory keeps recording, but concepts logged while skipped are not asked later: a later session start removes logged work that no question reached.
|
package/package.json
CHANGED