@jigyasudham/veto 3.3.0 → 3.5.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 +89 -7
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +1 -0
- package/dist/adapters/index.js.map +1 -1
- package/dist/agents/llm-runner.d.ts.map +1 -1
- package/dist/agents/llm-runner.js +78 -8
- package/dist/agents/llm-runner.js.map +1 -1
- package/dist/cli/context-guidance.d.ts +16 -0
- package/dist/cli/context-guidance.d.ts.map +1 -0
- package/dist/cli/context-guidance.js +20 -0
- package/dist/cli/context-guidance.js.map +1 -0
- package/dist/cli/leftover-guides.d.ts +38 -0
- package/dist/cli/leftover-guides.d.ts.map +1 -0
- package/dist/cli/leftover-guides.js +135 -0
- package/dist/cli/leftover-guides.js.map +1 -0
- package/dist/cli/lessons.d.ts +17 -0
- package/dist/cli/lessons.d.ts.map +1 -0
- package/dist/cli/lessons.js +448 -0
- package/dist/cli/lessons.js.map +1 -0
- package/dist/cli/statusline-hosts.d.ts +36 -0
- package/dist/cli/statusline-hosts.d.ts.map +1 -0
- package/dist/cli/statusline-hosts.js +212 -0
- package/dist/cli/statusline-hosts.js.map +1 -0
- package/dist/cli/statusline.d.ts +7 -0
- package/dist/cli/statusline.d.ts.map +1 -1
- package/dist/cli/statusline.js +69 -11
- package/dist/cli/statusline.js.map +1 -1
- package/dist/cli.js +114 -47
- package/dist/cli.js.map +1 -1
- package/dist/council/llm-council.d.ts.map +1 -1
- package/dist/council/llm-council.js +13 -8
- package/dist/council/llm-council.js.map +1 -1
- package/dist/lessons/adapters/claude.d.ts +10 -0
- package/dist/lessons/adapters/claude.d.ts.map +1 -0
- package/dist/lessons/adapters/claude.js +18 -0
- package/dist/lessons/adapters/claude.js.map +1 -0
- package/dist/lessons/adapters/codex.d.ts +7 -0
- package/dist/lessons/adapters/codex.d.ts.map +1 -0
- package/dist/lessons/adapters/codex.js +9 -0
- package/dist/lessons/adapters/codex.js.map +1 -0
- package/dist/lessons/adapters/gemini.d.ts +4 -0
- package/dist/lessons/adapters/gemini.d.ts.map +1 -0
- package/dist/lessons/adapters/gemini.js +44 -0
- package/dist/lessons/adapters/gemini.js.map +1 -0
- package/dist/lessons/adapters/index.d.ts +6 -0
- package/dist/lessons/adapters/index.d.ts.map +1 -0
- package/dist/lessons/adapters/index.js +14 -0
- package/dist/lessons/adapters/index.js.map +1 -0
- package/dist/lessons/adapters/markdown.d.ts +16 -0
- package/dist/lessons/adapters/markdown.d.ts.map +1 -0
- package/dist/lessons/adapters/markdown.js +130 -0
- package/dist/lessons/adapters/markdown.js.map +1 -0
- package/dist/lessons/adapters/types.d.ts +27 -0
- package/dist/lessons/adapters/types.d.ts.map +1 -0
- package/dist/lessons/adapters/types.js +2 -0
- package/dist/lessons/adapters/types.js.map +1 -0
- package/dist/lessons/classify.d.ts +33 -0
- package/dist/lessons/classify.d.ts.map +1 -0
- package/dist/lessons/classify.js +108 -0
- package/dist/lessons/classify.js.map +1 -0
- package/dist/lessons/consent.d.ts +30 -0
- package/dist/lessons/consent.d.ts.map +1 -0
- package/dist/lessons/consent.js +86 -0
- package/dist/lessons/consent.js.map +1 -0
- package/dist/lessons/discover.d.ts +26 -0
- package/dist/lessons/discover.d.ts.map +1 -0
- package/dist/lessons/discover.js +65 -0
- package/dist/lessons/discover.js.map +1 -0
- package/dist/lessons/harvest.d.ts +84 -0
- package/dist/lessons/harvest.d.ts.map +1 -0
- package/dist/lessons/harvest.js +271 -0
- package/dist/lessons/harvest.js.map +1 -0
- package/dist/lessons/identity.d.ts +23 -0
- package/dist/lessons/identity.d.ts.map +1 -0
- package/dist/lessons/identity.js +81 -0
- package/dist/lessons/identity.js.map +1 -0
- package/dist/lessons/manage.d.ts +163 -0
- package/dist/lessons/manage.d.ts.map +1 -0
- package/dist/lessons/manage.js +337 -0
- package/dist/lessons/manage.js.map +1 -0
- package/dist/lessons/mask.d.ts +6 -0
- package/dist/lessons/mask.d.ts.map +1 -0
- package/dist/lessons/mask.js +22 -0
- package/dist/lessons/mask.js.map +1 -0
- package/dist/lessons/on-save.d.ts +18 -0
- package/dist/lessons/on-save.d.ts.map +1 -0
- package/dist/lessons/on-save.js +53 -0
- package/dist/lessons/on-save.js.map +1 -0
- package/dist/lessons/select.d.ts +23 -0
- package/dist/lessons/select.d.ts.map +1 -0
- package/dist/lessons/select.js +136 -0
- package/dist/lessons/select.js.map +1 -0
- package/dist/lessons/source-project.d.ts +9 -0
- package/dist/lessons/source-project.d.ts.map +1 -0
- package/dist/lessons/source-project.js +149 -0
- package/dist/lessons/source-project.js.map +1 -0
- package/dist/lessons/store.d.ts +135 -0
- package/dist/lessons/store.d.ts.map +1 -0
- package/dist/lessons/store.js +222 -0
- package/dist/lessons/store.js.map +1 -0
- package/dist/memory/config.d.ts +27 -0
- package/dist/memory/config.d.ts.map +1 -1
- package/dist/memory/config.js +67 -0
- package/dist/memory/config.js.map +1 -1
- package/dist/memory/local.d.ts.map +1 -1
- package/dist/memory/local.js +19 -1
- package/dist/memory/local.js.map +1 -1
- package/dist/memory/schema.d.ts +1 -1
- package/dist/memory/schema.d.ts.map +1 -1
- package/dist/memory/schema.js +104 -0
- package/dist/memory/schema.js.map +1 -1
- package/dist/server/handlers/council.d.ts.map +1 -1
- package/dist/server/handlers/council.js +40 -4
- package/dist/server/handlers/council.js.map +1 -1
- package/dist/server/handlers/memory.d.ts.map +1 -1
- package/dist/server/handlers/memory.js +13 -3
- package/dist/server/handlers/memory.js.map +1 -1
- package/dist/server/handlers/session.d.ts.map +1 -1
- package/dist/server/handlers/session.js +61 -21
- package/dist/server/handlers/session.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +12 -3
- package/dist/server.js.map +1 -1
- package/dist/transcripts/cache.d.ts +1 -0
- package/dist/transcripts/cache.d.ts.map +1 -1
- package/dist/transcripts/cache.js +0 -0
- package/dist/transcripts/cache.js.map +1 -1
- package/dist/transcripts/claude-paths.d.ts +5 -0
- package/dist/transcripts/claude-paths.d.ts.map +1 -0
- package/dist/transcripts/claude-paths.js +21 -0
- package/dist/transcripts/claude-paths.js.map +1 -0
- package/dist/transcripts/context.d.ts +41 -0
- package/dist/transcripts/context.d.ts.map +1 -0
- package/dist/transcripts/context.js +144 -0
- package/dist/transcripts/context.js.map +1 -0
- package/dist/transcripts/discover.d.ts +12 -2
- package/dist/transcripts/discover.d.ts.map +1 -1
- package/dist/transcripts/discover.js +55 -7
- package/dist/transcripts/discover.js.map +1 -1
- package/dist/transcripts/manage.d.ts +8 -0
- package/dist/transcripts/manage.d.ts.map +1 -1
- package/dist/transcripts/manage.js +28 -13
- package/dist/transcripts/manage.js.map +1 -1
- package/dist/transcripts/mapping.d.ts.map +1 -1
- package/dist/transcripts/mapping.js +4 -2
- package/dist/transcripts/mapping.js.map +1 -1
- package/dist/transcripts/on-save.d.ts +9 -0
- package/dist/transcripts/on-save.d.ts.map +1 -1
- package/dist/transcripts/on-save.js +36 -9
- package/dist/transcripts/on-save.js.map +1 -1
- package/dist/transcripts/project-key.d.ts +4 -0
- package/dist/transcripts/project-key.d.ts.map +1 -0
- package/dist/transcripts/project-key.js +30 -0
- package/dist/transcripts/project-key.js.map +1 -0
- package/dist/transcripts/recall.d.ts +4 -0
- package/dist/transcripts/recall.d.ts.map +1 -1
- package/dist/transcripts/recall.js +6 -5
- package/dist/transcripts/recall.js.map +1 -1
- package/dist/transcripts/stopwords.d.ts +2 -0
- package/dist/transcripts/stopwords.d.ts.map +1 -0
- package/dist/transcripts/stopwords.js +8 -0
- package/dist/transcripts/stopwords.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
+
import { basename } from 'node:path';
|
|
3
|
+
import { getDb } from '../memory/local.js';
|
|
4
|
+
/** Per SECTION, over everything stored: an edit elsewhere in the file leaves this row alone. */
|
|
5
|
+
function sectionHash(input, section) {
|
|
6
|
+
return createHash('sha256')
|
|
7
|
+
.update(JSON.stringify([input.projectIdentity, input.projectLabel, section.scope, section.scopeReason, section.kind, section.quarantineReason, section.textMasked]))
|
|
8
|
+
.digest('hex');
|
|
9
|
+
}
|
|
10
|
+
/** A note's text, compared the way a person would: case and spacing do not make it a different note. */
|
|
11
|
+
export function lessonSignature(textMasked) {
|
|
12
|
+
return createHash('sha256').update(textMasked.toLowerCase().replace(/\s+/g, ' ').trim()).digest('hex');
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* One memory entry wherever it is kept: the same file name and section in any
|
|
16
|
+
* checkout of the same project (the D:, F: and G: copies of one Claude memory
|
|
17
|
+
* folder) is one entry, held in several places.
|
|
18
|
+
*/
|
|
19
|
+
export function lessonEntryKey(row) {
|
|
20
|
+
return [row.source_cli, row.project_identity, basename(row.source_path).toLowerCase(), row.section_anchor].join('\n');
|
|
21
|
+
}
|
|
22
|
+
function tombstoneMatcher() {
|
|
23
|
+
const stmt = getDb().prepare(`SELECT 1 FROM lesson_tombstones
|
|
24
|
+
WHERE (source_cli = ? AND source_path = ? AND section_anchor = ?) OR entry_key = ? OR signature = ? LIMIT 1`);
|
|
25
|
+
return probe => stmt.get(probe.source_cli, probe.source_path, probe.section_anchor, lessonEntryKey(probe), lessonSignature(probe.text_masked)) !== undefined;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Tombstone a note and delete it with every version and copy of it. Each row
|
|
29
|
+
* removed gets a tombstone of its own, so a copy's later edits stay forgotten,
|
|
30
|
+
* and so does text identical to a copy (not only to the note picked). Returns
|
|
31
|
+
* how many rows were removed, the note itself included.
|
|
32
|
+
*/
|
|
33
|
+
export function tombstoneLesson(row) {
|
|
34
|
+
return inTransaction(() => {
|
|
35
|
+
const db = getDb();
|
|
36
|
+
const forgetId = randomUUID();
|
|
37
|
+
const now = new Date().toISOString();
|
|
38
|
+
const insert = db.prepare(`INSERT INTO lesson_tombstones (id, forget_id, source_cli, source_path, section_anchor, entry_key, signature, created_at)
|
|
39
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
40
|
+
const del = db.prepare('DELETE FROM lessons WHERE id = ?');
|
|
41
|
+
const forgotten = tombstoneMatcher();
|
|
42
|
+
const tombstoned = new Set();
|
|
43
|
+
let pending = [row];
|
|
44
|
+
let removed = 0;
|
|
45
|
+
while (pending.length) {
|
|
46
|
+
for (const r of pending) {
|
|
47
|
+
tombstoned.add(r.id);
|
|
48
|
+
insert.run(randomUUID(), forgetId, r.source_cli, r.source_path, r.section_anchor, lessonEntryKey(r), lessonSignature(r.text_masked), now);
|
|
49
|
+
}
|
|
50
|
+
const matches = db.prepare('SELECT * FROM lessons').all().filter(forgotten);
|
|
51
|
+
for (const r of matches)
|
|
52
|
+
removed += Number(del.run(r.id).changes);
|
|
53
|
+
pending = matches.filter(r => !tombstoned.has(r.id));
|
|
54
|
+
}
|
|
55
|
+
return removed;
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
export function isProjectExcluded(projectIdentity) {
|
|
59
|
+
return getDb().prepare('SELECT 1 FROM lesson_project_exclusions WHERE project_identity = ?').get(projectIdentity) !== undefined;
|
|
60
|
+
}
|
|
61
|
+
export function excludedProjects() {
|
|
62
|
+
return getDb().prepare('SELECT project_identity, project_label, created_at FROM lesson_project_exclusions ORDER BY created_at').all();
|
|
63
|
+
}
|
|
64
|
+
/** Keep a project out of sharing, and delete what was already harvested from it. */
|
|
65
|
+
export function excludeProject(projectIdentity, projectLabel) {
|
|
66
|
+
return inTransaction(() => {
|
|
67
|
+
const db = getDb();
|
|
68
|
+
const added = Number(db.prepare('INSERT OR IGNORE INTO lesson_project_exclusions (project_identity, project_label, created_at) VALUES (?, ?, ?)')
|
|
69
|
+
.run(projectIdentity, projectLabel, new Date().toISOString()).changes) > 0;
|
|
70
|
+
const removed = Number(db.prepare('DELETE FROM lessons WHERE project_identity = ?').run(projectIdentity).changes);
|
|
71
|
+
return { added, removed };
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
export function includeProject(projectIdentity) {
|
|
75
|
+
return Number(getDb().prepare('DELETE FROM lesson_project_exclusions WHERE project_identity = ?').run(projectIdentity).changes) > 0;
|
|
76
|
+
}
|
|
77
|
+
function inTransaction(run) {
|
|
78
|
+
const db = getDb();
|
|
79
|
+
db.exec('BEGIN');
|
|
80
|
+
try {
|
|
81
|
+
const out = run();
|
|
82
|
+
db.exec('COMMIT');
|
|
83
|
+
return out;
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
db.exec('ROLLBACK');
|
|
87
|
+
throw err;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Make a source's rows exactly its current sections: insert new ones, update
|
|
92
|
+
* changed ones, delete the rest (lifetime = source). A source that failed to
|
|
93
|
+
* parse never reaches this function, so a malformed file cannot erase rows;
|
|
94
|
+
* an empty section list is a successful parse of nothing and clears them.
|
|
95
|
+
* A forgotten section counts as absent: it is deleted, never re-added.
|
|
96
|
+
*/
|
|
97
|
+
export function syncLessons(input) {
|
|
98
|
+
return inTransaction(() => {
|
|
99
|
+
const db = getDb();
|
|
100
|
+
const existing = db.prepare('SELECT id, source_hash FROM lessons WHERE source_cli = ? AND source_path = ? AND section_anchor = ?');
|
|
101
|
+
const insert = db.prepare(`INSERT INTO lessons (id, source_cli, source_path, section_anchor, project_identity, project_label, scope, scope_reason, kind, text_masked, source_hash, source_mtime, quarantined, quarantine_reason, created_at, updated_at)
|
|
102
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
103
|
+
const update = db.prepare(`UPDATE lessons SET project_identity = ?, project_label = ?, scope = ?, scope_reason = ?, kind = ?, text_masked = ?, source_hash = ?, source_mtime = ?, quarantined = ?, quarantine_reason = ?, updated_at = ? WHERE id = ?`);
|
|
104
|
+
const forgotten = tombstoneMatcher();
|
|
105
|
+
const now = new Date().toISOString();
|
|
106
|
+
let inserted = 0;
|
|
107
|
+
let updated = 0;
|
|
108
|
+
const kept = input.sections.filter(section => !forgotten({
|
|
109
|
+
source_cli: input.sourceCli, source_path: input.sourcePath, section_anchor: section.anchor,
|
|
110
|
+
project_identity: input.projectIdentity, text_masked: section.textMasked,
|
|
111
|
+
}));
|
|
112
|
+
for (const section of kept) {
|
|
113
|
+
const hash = sectionHash(input, section);
|
|
114
|
+
const quarantined = section.quarantineReason ? 1 : 0;
|
|
115
|
+
const row = existing.get(input.sourceCli, input.sourcePath, section.anchor);
|
|
116
|
+
if (!row) {
|
|
117
|
+
insert.run(randomUUID(), input.sourceCli, input.sourcePath, section.anchor, input.projectIdentity, input.projectLabel, section.scope, section.scopeReason, section.kind, section.textMasked, hash, input.sourceMtime, quarantined, section.quarantineReason, now, now);
|
|
118
|
+
inserted++;
|
|
119
|
+
}
|
|
120
|
+
else if (row.source_hash !== hash) {
|
|
121
|
+
update.run(input.projectIdentity, input.projectLabel, section.scope, section.scopeReason, section.kind, section.textMasked, hash, input.sourceMtime, quarantined, section.quarantineReason, now, row.id);
|
|
122
|
+
updated++;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const anchors = kept.map(section => section.anchor);
|
|
126
|
+
const keep = anchors.length ? ` AND section_anchor NOT IN (${anchors.map(() => '?').join(', ')})` : '';
|
|
127
|
+
const removed = Number(db.prepare(`DELETE FROM lessons WHERE source_cli = ? AND source_path = ?${keep}`)
|
|
128
|
+
.run(input.sourceCli, input.sourcePath, ...anchors).changes);
|
|
129
|
+
return { inserted, updated, removed };
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
/** Delete every row harvested from one source file. */
|
|
133
|
+
export function deleteLessonSource(source, sourcePath) {
|
|
134
|
+
return Number(getDb().prepare('DELETE FROM lessons WHERE source_cli = ? AND source_path = ?').run(source, sourcePath).changes);
|
|
135
|
+
}
|
|
136
|
+
/** Delete every row whose source file is no longer among the discovered ones. */
|
|
137
|
+
export function purgeVanishedLessonSources(present) {
|
|
138
|
+
const keep = new Set(present.map(p => `${p.source}\u0000${p.sourcePath}`));
|
|
139
|
+
const db = getDb();
|
|
140
|
+
const rows = db.prepare('SELECT DISTINCT source_cli, source_path FROM lessons').all();
|
|
141
|
+
const del = db.prepare('DELETE FROM lessons WHERE source_cli = ? AND source_path = ?');
|
|
142
|
+
let removed = 0;
|
|
143
|
+
for (const row of rows) {
|
|
144
|
+
if (!keep.has(`${row.source_cli}\u0000${row.source_path}`))
|
|
145
|
+
removed += Number(del.run(row.source_cli, row.source_path).changes);
|
|
146
|
+
}
|
|
147
|
+
return removed;
|
|
148
|
+
}
|
|
149
|
+
/** What this file looked like when it was last harvested, or null if never. */
|
|
150
|
+
export function lessonFileState(source, sourcePath) {
|
|
151
|
+
const row = getDb().prepare('SELECT mtime, size, content_hash, project_identity, harvester_version, unavailable_streak FROM lesson_file_state WHERE source_cli = ? AND source_path = ?')
|
|
152
|
+
.get(source, sourcePath);
|
|
153
|
+
return row ?? null;
|
|
154
|
+
}
|
|
155
|
+
/** Remember a successful look at a file. Clears any unavailable streak. */
|
|
156
|
+
export function recordLessonFileState(input) {
|
|
157
|
+
getDb().prepare(`INSERT INTO lesson_file_state (source_cli, source_path, mtime, size, content_hash, project_identity, harvester_version, unavailable_streak, unavailable_at, checked_at)
|
|
158
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, 0, NULL, ?)
|
|
159
|
+
ON CONFLICT(source_cli, source_path) DO UPDATE SET mtime = excluded.mtime, size = excluded.size, content_hash = excluded.content_hash,
|
|
160
|
+
project_identity = excluded.project_identity, harvester_version = excluded.harvester_version, unavailable_streak = 0, unavailable_at = NULL, checked_at = excluded.checked_at`)
|
|
161
|
+
.run(input.source, input.sourcePath, input.mtime, input.size, input.contentHash, input.projectIdentity, input.harvesterVersion, new Date().toISOString());
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* A file that could not be read. The streak grows so a source that is gone —
|
|
165
|
+
* an unplugged drive, most often — is probed less and less on the save path,
|
|
166
|
+
* where a multi-second stat would be paid by the user for nothing.
|
|
167
|
+
*/
|
|
168
|
+
export function recordLessonFileUnavailable(source, sourcePath) {
|
|
169
|
+
const now = new Date().toISOString();
|
|
170
|
+
getDb().prepare(`INSERT INTO lesson_file_state (source_cli, source_path, harvester_version, unavailable_streak, unavailable_at, checked_at)
|
|
171
|
+
VALUES (?, ?, 0, 1, ?, ?)
|
|
172
|
+
ON CONFLICT(source_cli, source_path) DO UPDATE SET unavailable_streak = lesson_file_state.unavailable_streak + 1, unavailable_at = excluded.unavailable_at, checked_at = excluded.checked_at`)
|
|
173
|
+
.run(source, sourcePath, now, now);
|
|
174
|
+
return lessonFileState(source, sourcePath)?.unavailable_streak ?? 1;
|
|
175
|
+
}
|
|
176
|
+
/** Drop remembered state for files no longer discovered, so it cannot outlive them. */
|
|
177
|
+
export function purgeVanishedLessonFileState(present) {
|
|
178
|
+
const keep = new Set(present.map(p => `${p.source}\u0000${p.sourcePath}`));
|
|
179
|
+
const db = getDb();
|
|
180
|
+
const rows = db.prepare('SELECT source_cli, source_path FROM lesson_file_state').all();
|
|
181
|
+
const del = db.prepare('DELETE FROM lesson_file_state WHERE source_cli = ? AND source_path = ?');
|
|
182
|
+
let removed = 0;
|
|
183
|
+
for (const row of rows) {
|
|
184
|
+
if (!keep.has(`${row.source_cli}\u0000${row.source_path}`))
|
|
185
|
+
removed += Number(del.run(row.source_cli, row.source_path).changes);
|
|
186
|
+
}
|
|
187
|
+
return removed;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Projects whose Claude folder was never traced back to a directory on this
|
|
191
|
+
* machine - an unplugged drive, most often. Counted from what is stored rather
|
|
192
|
+
* than from a pass, because a pass that changed nothing resolves no projects.
|
|
193
|
+
*/
|
|
194
|
+
export function unresolvedProjectCount() {
|
|
195
|
+
const row = getDb().prepare("SELECT COUNT(DISTINCT project_identity) AS n FROM lessons WHERE project_identity LIKE 'claude-slug:%'").get();
|
|
196
|
+
return row.n;
|
|
197
|
+
}
|
|
198
|
+
/** `veto lessons off` and a forced refresh both need the memory of files cleared. */
|
|
199
|
+
export function clearLessonFileState() {
|
|
200
|
+
return Number(getDb().prepare('DELETE FROM lesson_file_state').run().changes);
|
|
201
|
+
}
|
|
202
|
+
export function enableLessonSource(source) {
|
|
203
|
+
return Number(getDb().prepare('DELETE FROM lesson_source_state WHERE source_cli = ?').run(source).changes) > 0;
|
|
204
|
+
}
|
|
205
|
+
export function disableLessonSource(source, reason) {
|
|
206
|
+
getDb().prepare(`INSERT INTO lesson_source_state (source_cli, enabled, disabled_reason, checked_at) VALUES (?, 0, ?, ?)
|
|
207
|
+
ON CONFLICT(source_cli) DO UPDATE SET enabled = 0, disabled_reason = excluded.disabled_reason, checked_at = excluded.checked_at`)
|
|
208
|
+
.run(source, reason, new Date().toISOString());
|
|
209
|
+
}
|
|
210
|
+
export function isLessonSourceEnabled(source) {
|
|
211
|
+
const row = getDb().prepare('SELECT enabled FROM lesson_source_state WHERE source_cli = ?').get(source);
|
|
212
|
+
return !row || row.enabled === 1;
|
|
213
|
+
}
|
|
214
|
+
/** Hosts whose adapter tripped the format-drift canary; their rows are not served. */
|
|
215
|
+
export function disabledLessonSources() {
|
|
216
|
+
return new Set(disabledLessonSourceReasons().keys());
|
|
217
|
+
}
|
|
218
|
+
export function disabledLessonSourceReasons() {
|
|
219
|
+
const rows = getDb().prepare('SELECT source_cli, disabled_reason FROM lesson_source_state WHERE enabled = 0').all();
|
|
220
|
+
return new Map(rows.map(row => [row.source_cli, row.disabled_reason ?? 'format drift']));
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/lessons/store.ts"],"names":[],"mappings":"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"}
|
package/dist/memory/config.d.ts
CHANGED
|
@@ -6,6 +6,24 @@ export type TranscriptsConfig = {
|
|
|
6
6
|
consent_at: string | null;
|
|
7
7
|
first_capture_at: string | null;
|
|
8
8
|
};
|
|
9
|
+
export type LessonsConfig = {
|
|
10
|
+
enabled: boolean;
|
|
11
|
+
consent_version: number;
|
|
12
|
+
consent_at: string | null;
|
|
13
|
+
cross_project: boolean;
|
|
14
|
+
cross_vendor: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Whether saving a session also re-reads each AI's memory. On by default:
|
|
17
|
+
* recording notes by hand is the thing that never happens. Turning it off
|
|
18
|
+
* leaves consent and every `veto lessons` command working, so a problem in
|
|
19
|
+
* the field is one setting away from being stopped (council 534e2bd5).
|
|
20
|
+
*/
|
|
21
|
+
harvest_on_save: boolean;
|
|
22
|
+
/** When saving a session first harvested; the one-time note is shown once. */
|
|
23
|
+
first_harvest_at: string | null;
|
|
24
|
+
};
|
|
25
|
+
export declare const LESSONS_CONSENT_VERSION = 2;
|
|
26
|
+
export declare const DEFAULT_LESSONS: LessonsConfig;
|
|
9
27
|
export type VetoConfig = {
|
|
10
28
|
dailyTokenBudget: {
|
|
11
29
|
claude: number;
|
|
@@ -17,9 +35,18 @@ export type VetoConfig = {
|
|
|
17
35
|
auto_apply_learning: boolean;
|
|
18
36
|
compact_tools: boolean;
|
|
19
37
|
transcripts: TranscriptsConfig;
|
|
38
|
+
lessons: LessonsConfig;
|
|
20
39
|
};
|
|
21
40
|
export declare const DEFAULT_BUDGETS: VetoConfig['dailyTokenBudget'];
|
|
22
41
|
export declare const DEFAULT_TRANSCRIPTS: TranscriptsConfig;
|
|
23
42
|
export declare function getConfig(): VetoConfig;
|
|
24
43
|
export declare function setConfig(partial: Partial<VetoConfig>): void;
|
|
44
|
+
/** Explicit v2 opt-in. No version upgrade can silently enable sharing. */
|
|
45
|
+
export declare function enableLessonsSharing(): LessonsConfig;
|
|
46
|
+
export declare function disableLessonsSharing(): void;
|
|
47
|
+
/** True once, the first time a save harvests, so the user is told it happens. */
|
|
48
|
+
export declare function firstHarvestOnSave(): boolean;
|
|
49
|
+
/** Whether a session save should also re-read each AI's memory. */
|
|
50
|
+
export declare function isHarvestOnSaveEnabled(config?: LessonsConfig): boolean;
|
|
51
|
+
export declare function isLessonsSharingEnabled(config?: LessonsConfig): boolean;
|
|
25
52
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/memory/config.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,gBAAgB,EAAE;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,YAAY,EAAE,cAAc,GAAG,KAAK,CAAC;IAGrC,mBAAmB,EAAE,OAAO,CAAC;IAI7B,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/memory/config.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC,CAAC;AAIF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB;;;;;OAKG;IACH,eAAe,EAAE,OAAO,CAAC;IACzB,8EAA8E;IAC9E,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC,CAAC;AAMF,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,eAAe,EAAE,aAQ7B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,gBAAgB,EAAE;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,YAAY,EAAE,cAAc,GAAG,KAAK,CAAC;IAGrC,mBAAmB,EAAE,OAAO,CAAC;IAI7B,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,OAAO,EAAE,aAAa,CAAC;CACxB,CAAC;AAYF,eAAO,MAAM,eAAe,EAAE,UAAU,CAAC,kBAAkB,CAK1D,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,iBAOjC,CAAC;AA2BF,wBAAgB,SAAS,IAAI,UAAU,CAoCtC;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAc5D;AAED,0EAA0E;AAC1E,wBAAgB,oBAAoB,IAAI,aAAa,CAcpD;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C;AAED,iFAAiF;AACjF,wBAAgB,kBAAkB,IAAI,OAAO,CAK5C;AAED,mEAAmE;AACnE,wBAAgB,sBAAsB,CAAC,MAAM,GAAE,aAAmC,GAAG,OAAO,CAE3F;AAED,wBAAgB,uBAAuB,CAAC,MAAM,GAAE,aAAmC,GAAG,OAAO,CAK5F"}
|
package/dist/memory/config.js
CHANGED
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
import { join, dirname } from 'node:path';
|
|
2
2
|
import { homedir } from 'node:os';
|
|
3
3
|
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
4
|
+
// Consent v2 covers the trial only: reading notes and logging what would have
|
|
5
|
+
// been shared. Its disclosure PROMISES to ask again before any note is given to
|
|
6
|
+
// an AI (owner, 2026-09-20), so the release that starts delivery must bump this
|
|
7
|
+
// to 3, which pauses sharing until each user accepts the new disclosure.
|
|
8
|
+
export const LESSONS_CONSENT_VERSION = 2;
|
|
9
|
+
export const DEFAULT_LESSONS = {
|
|
10
|
+
enabled: false,
|
|
11
|
+
consent_version: 0,
|
|
12
|
+
consent_at: null,
|
|
13
|
+
cross_project: false,
|
|
14
|
+
cross_vendor: false,
|
|
15
|
+
harvest_on_save: true,
|
|
16
|
+
first_harvest_at: null,
|
|
17
|
+
};
|
|
4
18
|
// VETO_CONFIG_PATH overrides the config location (tests isolate here, mirroring
|
|
5
19
|
// VETO_TEST_DB). Read per-call so the override applies even after this module
|
|
6
20
|
// has already been imported transitively.
|
|
@@ -36,6 +50,17 @@ function normalizeTranscripts(raw) {
|
|
|
36
50
|
first_capture_at: typeof raw?.first_capture_at === 'string' ? raw.first_capture_at : null,
|
|
37
51
|
};
|
|
38
52
|
}
|
|
53
|
+
function normalizeLessons(raw) {
|
|
54
|
+
return {
|
|
55
|
+
enabled: raw?.enabled === true,
|
|
56
|
+
consent_version: typeof raw?.consent_version === 'number' ? raw.consent_version : 0,
|
|
57
|
+
consent_at: typeof raw?.consent_at === 'string' ? raw.consent_at : null,
|
|
58
|
+
cross_project: raw?.cross_project === true,
|
|
59
|
+
cross_vendor: raw?.cross_vendor === true,
|
|
60
|
+
harvest_on_save: raw?.harvest_on_save !== false,
|
|
61
|
+
first_harvest_at: typeof raw?.first_harvest_at === 'string' ? raw.first_harvest_at : null,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
39
64
|
export function getConfig() {
|
|
40
65
|
if (!existsSync(configPath())) {
|
|
41
66
|
return {
|
|
@@ -44,6 +69,7 @@ export function getConfig() {
|
|
|
44
69
|
auto_apply_learning: true,
|
|
45
70
|
compact_tools: false,
|
|
46
71
|
transcripts: { ...DEFAULT_TRANSCRIPTS },
|
|
72
|
+
lessons: { ...DEFAULT_LESSONS },
|
|
47
73
|
};
|
|
48
74
|
}
|
|
49
75
|
try {
|
|
@@ -59,6 +85,7 @@ export function getConfig() {
|
|
|
59
85
|
auto_apply_learning: raw.auto_apply_learning !== false, // default true
|
|
60
86
|
compact_tools: raw.compact_tools === true, // default false
|
|
61
87
|
transcripts: normalizeTranscripts(raw.transcripts),
|
|
88
|
+
lessons: normalizeLessons(raw.lessons),
|
|
62
89
|
};
|
|
63
90
|
}
|
|
64
91
|
catch {
|
|
@@ -68,6 +95,7 @@ export function getConfig() {
|
|
|
68
95
|
auto_apply_learning: true,
|
|
69
96
|
compact_tools: false,
|
|
70
97
|
transcripts: { ...DEFAULT_TRANSCRIPTS },
|
|
98
|
+
lessons: { ...DEFAULT_LESSONS },
|
|
71
99
|
};
|
|
72
100
|
}
|
|
73
101
|
}
|
|
@@ -81,8 +109,47 @@ export function setConfig(partial) {
|
|
|
81
109
|
...(partial.dailyTokenBudget ?? {}),
|
|
82
110
|
},
|
|
83
111
|
transcripts: partial.transcripts ?? current.transcripts,
|
|
112
|
+
lessons: partial.lessons ?? current.lessons,
|
|
84
113
|
};
|
|
85
114
|
mkdirSync(dirname(configPath()), { recursive: true });
|
|
86
115
|
writeFileSync(configPath(), JSON.stringify(next, null, 2), 'utf8');
|
|
87
116
|
}
|
|
117
|
+
/** Explicit v2 opt-in. No version upgrade can silently enable sharing. */
|
|
118
|
+
export function enableLessonsSharing() {
|
|
119
|
+
const lessons = {
|
|
120
|
+
enabled: true,
|
|
121
|
+
consent_version: LESSONS_CONSENT_VERSION,
|
|
122
|
+
consent_at: new Date().toISOString(),
|
|
123
|
+
cross_project: true,
|
|
124
|
+
cross_vendor: true,
|
|
125
|
+
// Turning sharing on keeps the switch the user last chose, so a machine
|
|
126
|
+
// that had harvest-on-save off does not silently get it back.
|
|
127
|
+
harvest_on_save: getConfig().lessons.harvest_on_save,
|
|
128
|
+
first_harvest_at: getConfig().lessons.first_harvest_at,
|
|
129
|
+
};
|
|
130
|
+
setConfig({ lessons });
|
|
131
|
+
return lessons;
|
|
132
|
+
}
|
|
133
|
+
export function disableLessonsSharing() {
|
|
134
|
+
const current = getConfig().lessons;
|
|
135
|
+
setConfig({ lessons: { ...current, enabled: false, cross_project: false, cross_vendor: false } });
|
|
136
|
+
}
|
|
137
|
+
/** True once, the first time a save harvests, so the user is told it happens. */
|
|
138
|
+
export function firstHarvestOnSave() {
|
|
139
|
+
const current = getConfig().lessons;
|
|
140
|
+
if (current.first_harvest_at)
|
|
141
|
+
return false;
|
|
142
|
+
setConfig({ lessons: { ...current, first_harvest_at: new Date().toISOString() } });
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
/** Whether a session save should also re-read each AI's memory. */
|
|
146
|
+
export function isHarvestOnSaveEnabled(config = getConfig().lessons) {
|
|
147
|
+
return isLessonsSharingEnabled(config) && config.harvest_on_save !== false;
|
|
148
|
+
}
|
|
149
|
+
export function isLessonsSharingEnabled(config = getConfig().lessons) {
|
|
150
|
+
return config.enabled
|
|
151
|
+
&& config.consent_version === LESSONS_CONSENT_VERSION
|
|
152
|
+
&& config.cross_project
|
|
153
|
+
&& config.cross_vendor;
|
|
154
|
+
}
|
|
88
155
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/memory/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/memory/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/memory/local.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA8BhD,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AACD,OAAO,EAAyC,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAAqB,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAG7L,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIlD,CAAC;AAmCF,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAS7E;AAOD,wBAAgB,OAAO,IAAI,IAAI,CAE9B;AAED,wBAAgB,KAAK,IAAI,YAAY,
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/memory/local.ts"],"names":[],"mappings":"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"}
|
package/dist/memory/local.js
CHANGED
|
@@ -120,6 +120,7 @@ export function getDb() {
|
|
|
120
120
|
migrateToolTraceLog(_db);
|
|
121
121
|
migrateProjectDirCase(_db);
|
|
122
122
|
migrateSessionCreatedAtIso(_db);
|
|
123
|
+
migrateLessonColumns(_db);
|
|
123
124
|
// Stamp the read-contract version so external readers (veto-vscode, statusline)
|
|
124
125
|
// can detect drift via `PRAGMA user_version`. See VETO_DB_SCHEMA_VERSION.
|
|
125
126
|
_db.exec(`PRAGMA user_version = ${VETO_DB_SCHEMA_VERSION}`);
|
|
@@ -157,6 +158,19 @@ function migrateSessionCreatedAtIso(db) {
|
|
|
157
158
|
AND strftime('%Y-%m-%dT%H:%M:%fZ', created_at) IS NOT NULL
|
|
158
159
|
`);
|
|
159
160
|
}
|
|
161
|
+
// Adds the label, quarantine-reason and scope-reason columns to a lessons table
|
|
162
|
+
// created by an earlier build (3.4.0 shipped the table without scope_reason).
|
|
163
|
+
// Harvested rows are derived and re-harvested on the next sync, so old rows
|
|
164
|
+
// need no backfill.
|
|
165
|
+
function migrateLessonColumns(db) {
|
|
166
|
+
const names = new Set(db.prepare('PRAGMA table_info(lessons)').all().map(c => c.name));
|
|
167
|
+
if (!names.has('project_label'))
|
|
168
|
+
db.exec('ALTER TABLE lessons ADD COLUMN project_label TEXT');
|
|
169
|
+
if (!names.has('quarantine_reason'))
|
|
170
|
+
db.exec('ALTER TABLE lessons ADD COLUMN quarantine_reason TEXT');
|
|
171
|
+
if (!names.has('scope_reason'))
|
|
172
|
+
db.exec('ALTER TABLE lessons ADD COLUMN scope_reason TEXT');
|
|
173
|
+
}
|
|
160
174
|
// Creates tool_call_trace_log table for auditing and session replay (v1.8.0 migration)
|
|
161
175
|
function migrateToolTraceLog(db) {
|
|
162
176
|
db.exec(`
|
|
@@ -385,6 +399,8 @@ export function updateSession(session_id, input) {
|
|
|
385
399
|
if (!existing)
|
|
386
400
|
return null;
|
|
387
401
|
const now = new Date().toISOString();
|
|
402
|
+
// platform is who saved LAST, like created_at is when: a session begun in
|
|
403
|
+
// Claude and saved from Codex used to keep saying "claude" forever.
|
|
388
404
|
db.prepare(`
|
|
389
405
|
UPDATE sessions SET
|
|
390
406
|
summary = ?,
|
|
@@ -393,12 +409,14 @@ export function updateSession(session_id, input) {
|
|
|
393
409
|
token_count = ?,
|
|
394
410
|
save_type = 'manual',
|
|
395
411
|
tags = COALESCE(?, tags),
|
|
412
|
+
platform = COALESCE(?, platform),
|
|
413
|
+
project_dir = COALESCE(?, project_dir),
|
|
396
414
|
created_at = ?
|
|
397
415
|
WHERE id = ?
|
|
398
416
|
`).run(input.summary ?? null, input.context ? JSON.stringify(input.context) : null, input.task_state ? JSON.stringify(input.task_state) : null, input.token_count ?? 0,
|
|
399
417
|
// Only overwrite tags when the caller supplies them; otherwise keep existing
|
|
400
418
|
// (COALESCE(NULL, tags) = tags). saveSession serializes tags the same way.
|
|
401
|
-
input.tags ? JSON.stringify(input.tags) : null, now, session_id);
|
|
419
|
+
input.tags ? JSON.stringify(input.tags) : null, input.platform ?? null, normalizeProjectDir(input.project_dir) ?? null, now, session_id);
|
|
402
420
|
return { updated: true, session_id, saved_at: now };
|
|
403
421
|
}
|
|
404
422
|
export function restoreSession(session_id, active_client) {
|