eklavya 1.91.0 → 1.92.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.
Files changed (113) hide show
  1. package/README.md +7 -4
  2. package/dist/assets/dashboard.html +151 -3
  3. package/dist/cli-economy.js +434 -0
  4. package/dist/cli-economy.js.map +1 -0
  5. package/dist/cli-memory.js +4 -1
  6. package/dist/cli-memory.js.map +1 -1
  7. package/dist/cli.js +46 -5
  8. package/dist/cli.js.map +1 -1
  9. package/dist/config-path.js +23 -1
  10. package/dist/config-path.js.map +1 -1
  11. package/dist/config.js +63 -0
  12. package/dist/config.js.map +1 -1
  13. package/dist/cost-report.js +67 -0
  14. package/dist/cost-report.js.map +1 -0
  15. package/dist/dashboard.js +79 -1
  16. package/dist/dashboard.js.map +1 -1
  17. package/dist/economy/LICENSE +202 -0
  18. package/dist/economy/envfacts.js +229 -0
  19. package/dist/economy/envfacts.js.map +1 -0
  20. package/dist/economy/loopguard.js +169 -0
  21. package/dist/economy/loopguard.js.map +1 -0
  22. package/dist/economy/pricing.js +54 -0
  23. package/dist/economy/pricing.js.map +1 -0
  24. package/dist/economy/shell-edits.js +238 -0
  25. package/dist/economy/shell-edits.js.map +1 -0
  26. package/dist/economy/signals.js +164 -0
  27. package/dist/economy/signals.js.map +1 -0
  28. package/dist/economy/toolprune.js +209 -0
  29. package/dist/economy/toolprune.js.map +1 -0
  30. package/dist/economy/transcript.js +290 -0
  31. package/dist/economy/transcript.js.map +1 -0
  32. package/dist/feedback-review.js +1 -1
  33. package/dist/feedback-review.js.map +1 -1
  34. package/dist/feedback.js +3 -0
  35. package/dist/feedback.js.map +1 -1
  36. package/dist/guard-note.js +21 -0
  37. package/dist/guard-note.js.map +1 -0
  38. package/dist/hooks/capture-tool.js +61 -11
  39. package/dist/hooks/capture-tool.js.map +1 -1
  40. package/dist/hooks/economy-lib.js +20 -0
  41. package/dist/hooks/economy-lib.js.map +1 -0
  42. package/dist/hooks/file-context.js +1 -1
  43. package/dist/hooks/file-context.js.map +1 -1
  44. package/dist/hooks/lib.js.map +1 -1
  45. package/dist/hooks/memory-lib.js +17 -1
  46. package/dist/hooks/memory-lib.js.map +1 -1
  47. package/dist/hooks/prompt-submit-nudge.js +15 -1
  48. package/dist/hooks/prompt-submit-nudge.js.map +1 -1
  49. package/dist/hooks/session-end.js +32 -0
  50. package/dist/hooks/session-end.js.map +1 -0
  51. package/dist/hooks/session-start.js +34 -0
  52. package/dist/hooks/session-start.js.map +1 -1
  53. package/dist/hooks/stop-quiz-check.js +20 -0
  54. package/dist/hooks/stop-quiz-check.js.map +1 -1
  55. package/dist/hooks/subagent-start.js +17 -2
  56. package/dist/hooks/subagent-start.js.map +1 -1
  57. package/dist/install.js +31 -7
  58. package/dist/install.js.map +1 -1
  59. package/dist/ledger-pending.js +85 -0
  60. package/dist/ledger-pending.js.map +1 -0
  61. package/dist/ledger.js +144 -0
  62. package/dist/ledger.js.map +1 -0
  63. package/dist/loop-guard.js +190 -0
  64. package/dist/loop-guard.js.map +1 -0
  65. package/dist/memory/capture.js +2 -2
  66. package/dist/memory/capture.js.map +1 -1
  67. package/dist/memory/embed.js +37 -0
  68. package/dist/memory/embed.js.map +1 -1
  69. package/dist/memory/pinned.js +175 -0
  70. package/dist/memory/pinned.js.map +1 -0
  71. package/dist/memory/provider.js +66 -0
  72. package/dist/memory/provider.js.map +1 -1
  73. package/dist/memory/recall.js +111 -33
  74. package/dist/memory/recall.js.map +1 -1
  75. package/dist/memory/seam.js +88 -0
  76. package/dist/memory/seam.js.map +1 -0
  77. package/dist/memory/search.js +65 -11
  78. package/dist/memory/search.js.map +1 -1
  79. package/dist/memory/store.js +74 -15
  80. package/dist/memory/store.js.map +1 -1
  81. package/dist/memory/summarize.js.map +1 -1
  82. package/dist/memory/terms.js +100 -0
  83. package/dist/memory/terms.js.map +1 -0
  84. package/dist/memory/tokens.js +11 -7
  85. package/dist/memory/tokens.js.map +1 -1
  86. package/dist/memory/use.js +123 -0
  87. package/dist/memory/use.js.map +1 -0
  88. package/dist/memory/worker.js +16 -1
  89. package/dist/memory/worker.js.map +1 -1
  90. package/dist/migrations/034_memory_keywords.sql +59 -0
  91. package/dist/migrations/035_econ_ledger.sql +69 -0
  92. package/dist/migrations/036_econ_turns.sql +52 -0
  93. package/dist/migrations/037_econ_toolprune.sql +38 -0
  94. package/dist/migrations/038_pinned_facts.sql +48 -0
  95. package/dist/migrations/039_memory_use.sql +34 -0
  96. package/dist/plugin/.claude-plugin/plugin.json +1 -1
  97. package/dist/plugin/hooks/hooks.json +30 -0
  98. package/dist/plugin/skills/CLAUDE.md +1 -1
  99. package/dist/plugin/skills/memory/SKILL.md +2 -1
  100. package/dist/plugin/skills/toolprune/SKILL.md +31 -0
  101. package/dist/statusline.js +2 -2
  102. package/dist/statusline.js.map +1 -1
  103. package/dist/toolprune-store.js +136 -0
  104. package/dist/toolprune-store.js.map +1 -0
  105. package/dist/tools/config_tools.js +30 -0
  106. package/dist/tools/config_tools.js.map +1 -1
  107. package/dist/tools/index.js +2 -1
  108. package/dist/tools/index.js.map +1 -1
  109. package/dist/tools/memory_read_tools.js +8 -0
  110. package/dist/tools/memory_read_tools.js.map +1 -1
  111. package/dist/tools/memory_write_tools.js +21 -0
  112. package/dist/tools/memory_write_tools.js.map +1 -1
  113. package/package.json +1 -1
@@ -0,0 +1,190 @@
1
+ import { TurnState, emptyTurn } from './economy/signals.js';
2
+ import { isEklavyaTool } from './economy/transcript.js';
3
+ import { decide, envelopeOf, ENVELOPE_HISTORY, JUDGE_SCHEMA, JUDGE_SYSTEM, parseVerdict, redirectText, thresholdsFor, } from './economy/loopguard.js';
4
+ /**
5
+ * The loop guard's database side (issue #262): one turn row per prompt,
6
+ * folded on every tool call by `capture-tool`, closed at `Stop`.
7
+ *
8
+ * Nudge only. A stuck turn gets at most `economy.nudges` redirects as
9
+ * `additionalContext`, then one notice: Claude is asked to tell the developer
10
+ * in a line, and the status line shows it. Nothing here stops an interactive
11
+ * turn; `economy.loopguard = stop` ends only a headless one.
12
+ */
13
+ const nowIso = () => new Date().toISOString();
14
+ /** Calls the guard never counts: Eklavya's own tools and the question card. */
15
+ export const ignoredTool = (tool) => isEklavyaTool(tool) || tool === 'AskUserQuestion';
16
+ function openRow(db, sessionId, agentId) {
17
+ return db
18
+ .prepare(`SELECT id, project, state, nudges, noticed, judge_status, verdict FROM econ_turns
19
+ WHERE session_id = ? AND agent_id = ? AND closed_at IS NULL ORDER BY id DESC LIMIT 1`)
20
+ .get(sessionId, agentId);
21
+ }
22
+ function event(db, row) {
23
+ db.prepare('INSERT INTO econ_guard_events (at, session_id, project, turn_id, kind, reason) VALUES (?, ?, ?, ?, ?, ?)').run(nowIso(), row.sessionId, row.project, row.turnId, row.kind, row.reason.slice(0, 300));
24
+ }
25
+ /** Opens a turn at a prompt, closing any the session left open (a turn that never reached Stop is unknown). */
26
+ export function openTurn(db, row) {
27
+ const agent = row.agentId ?? '';
28
+ db.prepare(`UPDATE econ_turns SET closed_at = ?, outcome = 'unknown' WHERE session_id = ? AND agent_id = ? AND closed_at IS NULL`).run(nowIso(), row.sessionId, agent);
29
+ return Number(db
30
+ .prepare('INSERT INTO econ_turns (session_id, agent_id, project, opened_at, state) VALUES (?, ?, ?, ?, ?)')
31
+ .run(row.sessionId, agent, row.project, nowIso(), JSON.stringify(emptyTurn())).lastInsertRowid);
32
+ }
33
+ /** Call counts of this project's turns that ended green, oldest first. */
34
+ export function greenCalls(db, project) {
35
+ if (!project)
36
+ return [];
37
+ return db
38
+ .prepare('SELECT calls FROM (SELECT id, calls FROM econ_envelope WHERE project = ? ORDER BY id DESC LIMIT ?) ORDER BY id')
39
+ .all(project, ENVELOPE_HISTORY).map((r) => r.calls);
40
+ }
41
+ export function thresholdsOf(config) {
42
+ const e = config.economy;
43
+ return thresholdsFor(e.loopguard_level, {
44
+ judge_confidence: e.judge_confidence,
45
+ backstop_mult: e.backstop_mult,
46
+ envelope_min_samples: e.envelope_min_samples,
47
+ });
48
+ }
49
+ /** Calls a judge's verdict stays valid for. */
50
+ export const VERDICT_CALLS = 10;
51
+ export const NOTICE = '[Eklavya loop check] This turn still looks stuck after the redirect. Tell the developer in one short line that ' +
52
+ 'Eklavya\'s loop guard thinks the turn is going round in circles, so they can step in; then carry on.';
53
+ /**
54
+ * Folds one finished tool call into the session's open turn and decides.
55
+ * Returns what the hook should say, if anything. No open turn (the guard was
56
+ * switched on mid-turn, or this is Eklavya's own activity) is nothing.
57
+ */
58
+ export function foldCall(db, config, call) {
59
+ if (config.economy.loopguard === 'off' || ignoredTool(call.tool))
60
+ return {};
61
+ // One transaction that takes the write lock first: parallel tool calls run
62
+ // their hooks at once, and a plain read-then-write would lose all but one.
63
+ return db.transaction(() => foldLocked(db, config, call)).immediate();
64
+ }
65
+ /** The ids of the turn's latest calls, kept to drop a call reported twice. */
66
+ const SEEN_IDS = 50;
67
+ function foldLocked(db, config, call) {
68
+ const agent = call.agentId ?? '';
69
+ const row = openRow(db, call.sessionId, agent);
70
+ if (!row)
71
+ return {};
72
+ const data = JSON.parse(row.state);
73
+ // A failure can arrive as both a failed PostToolUse and PostToolUseFailure.
74
+ if (call.toolUseId) {
75
+ if (data.seenIds?.includes(call.toolUseId))
76
+ return {};
77
+ data.seenIds = [...(data.seenIds ?? []), call.toolUseId].slice(-SEEN_IDS);
78
+ }
79
+ const state = new TurnState(data);
80
+ state.update(call.tool, call.args, call.result, call.failed);
81
+ const t = thresholdsOf(config);
82
+ const envelope = envelopeOf(greenCalls(db, row.project), t);
83
+ // A verdict holds for `VERDICT_CALLS` calls; after that the turn may have
84
+ // changed and a fresh look is due.
85
+ // `judgeTurn` always stores an object with the call count it judged at.
86
+ const stored = row.judge_status === 'done' ? JSON.parse(row.verdict) : null;
87
+ const fresh = stored && state.d.calls - stored.at_calls < VERDICT_CALLS ? parseVerdict(stored) : null;
88
+ // A judge that has not answered within `VERDICT_CALLS` calls never will (it
89
+ // failed to start, or died before writing): ask again rather than wait forever.
90
+ const askedAt = row.judge_status === 'pending' && row.verdict ? JSON.parse(row.verdict).asked_at_calls ?? 0 : 0;
91
+ const waiting = row.judge_status === 'pending' && state.d.calls - askedAt < VERDICT_CALLS;
92
+ const verdict = waiting ? null : fresh ?? undefined;
93
+ const judged = row.judge_status === 'done';
94
+ let decision = decide(state.snapshot(), t, envelope, { configured: Boolean(config.providers.judge), verdict });
95
+ const out = {};
96
+ let { nudges, noticed } = row;
97
+ let judgeStatus = row.judge_status;
98
+ let verdictJson = row.verdict;
99
+ // Nudges and the notice spent, and no headless stop to make: a verdict could
100
+ // change nothing, so no judge is paid for.
101
+ const spent = nudges >= config.economy.nudges && noticed && !(call.headless && config.economy.loopguard === 'stop');
102
+ if (decision.act === 'ask_judge' && spent)
103
+ decision = { act: 'none', reason: 'nothing left to say' };
104
+ if (decision.act === 'ask_judge') {
105
+ judgeStatus = 'pending';
106
+ verdictJson = JSON.stringify({ asked_at_calls: state.d.calls });
107
+ out.judgeTurn = row.id;
108
+ event(db, { sessionId: call.sessionId, project: row.project, turnId: row.id, kind: 'judge', reason: decision.reason });
109
+ }
110
+ else if (decision.act === 'redirect' && !agent) {
111
+ // Subagent turns are tracked, never nudged, until it is known whether a
112
+ // PostToolUse context reaches a background agent (#257, open question).
113
+ if (nudges < config.economy.nudges) {
114
+ nudges++;
115
+ out.context = verdict?.redirect ? `[Eklavya loop check] ${verdict.redirect}` : redirectText(state);
116
+ event(db, { sessionId: call.sessionId, project: row.project, turnId: row.id, kind: 'redirect', reason: decision.reason });
117
+ }
118
+ else if (call.headless && config.economy.loopguard === 'stop') {
119
+ out.stop = 'Eklavya loop guard: the turn kept repeating the same failure after the redirect.';
120
+ event(db, { sessionId: call.sessionId, project: row.project, turnId: row.id, kind: 'stop', reason: decision.reason });
121
+ }
122
+ else if (!noticed) {
123
+ noticed = 1;
124
+ out.context = NOTICE;
125
+ event(db, { sessionId: call.sessionId, project: row.project, turnId: row.id, kind: 'notice', reason: decision.reason });
126
+ }
127
+ }
128
+ // A verdict is spent once acted on or out of date, so the next decision needs a fresh look.
129
+ if (judged && (decision.act !== 'none' || !fresh)) {
130
+ judgeStatus = null;
131
+ verdictJson = null;
132
+ }
133
+ db.prepare('UPDATE econ_turns SET state = ?, nudges = ?, noticed = ?, judge_status = ?, verdict = ? WHERE id = ?').run(JSON.stringify(state.d), nudges, noticed, judgeStatus, verdictJson, row.id);
134
+ return out;
135
+ }
136
+ /**
137
+ * Closes the session's open turn at Stop with its outcome. A main-thread
138
+ * turn that ended green feeds this project's envelope; a turn's own outcome
139
+ * only ever gates later turns.
140
+ */
141
+ export function closeTurn(db, row) {
142
+ const agent = row.agentId ?? '';
143
+ const open = openRow(db, row.sessionId, agent);
144
+ if (!open)
145
+ return null;
146
+ const state = new TurnState(JSON.parse(open.state));
147
+ const outcome = state.verdict;
148
+ db.prepare('UPDATE econ_turns SET closed_at = ?, outcome = ? WHERE id = ?').run(nowIso(), outcome, open.id);
149
+ if (outcome === 'green' && !agent && open.project && state.d.calls > 0) {
150
+ db.prepare('INSERT INTO econ_envelope (project, calls, snapshot, recorded_at) VALUES (?, ?, ?, ?)').run(open.project, state.d.calls, JSON.stringify(state.snapshot()), nowIso());
151
+ }
152
+ return outcome;
153
+ }
154
+ export { guardNote } from './guard-note.js';
155
+ /**
156
+ * `eklavya judge <turn>`: asks `providers.judge` whether the turn is stuck,
157
+ * with a digest of counts and command shapes, and stores the verdict for the
158
+ * next tool call to read. Any failure stores "unsure", so a turn is never
159
+ * left waiting on a judge that will not answer.
160
+ */
161
+ export async function judgeTurn(db, config, turnId, run) {
162
+ const row = db.prepare('SELECT project, state FROM econ_turns WHERE id = ?').get(turnId);
163
+ if (!row)
164
+ return null;
165
+ const state = new TurnState(JSON.parse(row.state));
166
+ let verdict = { stuck: null, confidence: 0, reason: 'no judge configured' };
167
+ if (config.providers.judge) {
168
+ const envelope = envelopeOf(greenCalls(db, row.project), thresholdsOf(config));
169
+ try {
170
+ verdict = parseVerdict(await run(config.providers.judge.model, state.digest(envelope), { schema: JUDGE_SCHEMA, system: JUDGE_SYSTEM, source: 'judge' })) ?? {
171
+ stuck: null,
172
+ confidence: 0,
173
+ reason: 'the judge answered in the wrong shape',
174
+ };
175
+ }
176
+ catch (err) {
177
+ verdict = { stuck: null, confidence: 0, reason: `the judge failed: ${err.message}`.slice(0, 200) };
178
+ }
179
+ }
180
+ db.prepare(`UPDATE econ_turns SET judge_status = 'done', verdict = ? WHERE id = ?`).run(JSON.stringify({ ...verdict, at_calls: state.d.calls }), turnId);
181
+ return verdict;
182
+ }
183
+ /** Redirects, notices, stops and judge calls since `sinceIso`, per kind. */
184
+ export function guardCounts(db, project, sinceIso) {
185
+ const rows = db
186
+ .prepare(`SELECT kind, COUNT(*) AS n FROM econ_guard_events WHERE at >= ? AND (? IS NULL OR project = ?) GROUP BY kind`)
187
+ .all(sinceIso, project, project);
188
+ return Object.fromEntries(rows.map((r) => [r.kind, r.n]));
189
+ }
190
+ //# sourceMappingURL=loop-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-guard.js","sourceRoot":"","sources":["../src/loop-guard.ts"],"names":[],"mappings":"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"}
@@ -79,8 +79,8 @@ export function prepare(config, identity, event) {
79
79
  agentId: identity.agentId,
80
80
  kind: event.kind,
81
81
  tool: event.tool,
82
- occurredAt,
83
- body: cleaned.text,
82
+ occurredAt: event.hostId ? '' : occurredAt,
83
+ body: event.hostId ? `host-id:${event.hostId}` : cleaned.text,
84
84
  }),
85
85
  project: identity.project,
86
86
  checkout: identity.checkout,
@@ -1 +1 @@
1
- {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/memory/capture.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/memory/capture.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { informativeTerms } from './terms.js';
1
2
  /**
2
3
  * Local semantic vectors (ADR-03).
3
4
  *
@@ -13,6 +14,21 @@
13
14
  */
14
15
  export const LOCAL_EMBEDDER = 'local-hash-v1';
15
16
  export const LOCAL_DIM = 256;
17
+ /**
18
+ * The second local embedder (issue #258): the same hashing idea with the noise
19
+ * taken out. Stopwords are dropped, identifiers are split on case and
20
+ * underscores (and kept whole), and the vector has 1,024 buckets instead of
21
+ * 256, so unrelated words collide a quarter as often. A query may weight its
22
+ * words by rarity (see `semanticSearch`), so a word every entry uses counts for
23
+ * less than one only a few do.
24
+ *
25
+ * New entries are embedded with this one. Entries written before it keep their
26
+ * `local-hash-v1` vector until the worker re-embeds them in the background
27
+ * (`reembedLegacy` in store.ts); search compares each entry with the query
28
+ * embedded the same way, so both stay readable during the switch.
29
+ */
30
+ export const LOCAL_EMBEDDER_V2 = 'local-hash-v2';
31
+ export const LOCAL_DIM_V2 = 1024;
16
32
  function fnv1a(s) {
17
33
  let h = 0x811c9dc5;
18
34
  for (let i = 0; i < s.length; i++) {
@@ -50,6 +66,27 @@ export function embedLocal(text, dim = LOCAL_DIM) {
50
66
  }
51
67
  return normalise(vec);
52
68
  }
69
+ /**
70
+ * `local-hash-v2`. `weight` scales each term (default 1); search passes a
71
+ * rarity weight for the query, entries are embedded unweighted.
72
+ */
73
+ export function embedLocalV2(text, weight = () => 1) {
74
+ const dim = LOCAL_DIM_V2;
75
+ const vec = new Float32Array(dim);
76
+ for (const term of informativeTerms(text)) {
77
+ const w = weight(term);
78
+ vec[fnv1a(term) % dim] += w;
79
+ const padded = `^${term}$`;
80
+ for (let i = 0; i + 4 <= padded.length; i++)
81
+ vec[fnv1a(padded.slice(i, i + 4)) % dim] += 0.35 * w;
82
+ }
83
+ for (let i = 0; i < dim; i++) {
84
+ const v = vec[i];
85
+ if (v > 0)
86
+ vec[i] = Math.log1p(v);
87
+ }
88
+ return normalise(vec);
89
+ }
53
90
  export function normalise(vec) {
54
91
  let sum = 0;
55
92
  for (const v of vec)
@@ -1 +1 @@
1
- {"version":3,"file":"embed.js","sourceRoot":"","sources":["../../src/memory/embed.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"embed.js","sourceRoot":"","sources":["../../src/memory/embed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,175 @@
1
+ import crypto from 'node:crypto';
2
+ import { LINT, formRepairEvidence, observe, render } from '../economy/envfacts.js';
3
+ import { estimateTokens } from './tokens.js';
4
+ import { defangFence } from './privacy.js';
5
+ /**
6
+ * Pinned facts (issue #264): the lifecycle every fact shares, and the capped
7
+ * block at the top of the session-start recall.
8
+ *
9
+ * A fact is `forming` until `CONFIRMATIONS` sessions confirm it, then
10
+ * `active`. Each session it decays by `DECAY` and a contradiction weighs
11
+ * `CONTRADICTION` times a confirmation; below zero it retires, and one clean
12
+ * contradiction retires a high-stakes fact at once. An active fact is shown
13
+ * only while it keeps applying: once `MIN_EXERCISED` sessions have exercised
14
+ * it, in at least `MIN_APPLIED_SHARE` of them. Facts are evidence for the
15
+ * model, never a reason to change mastery: nothing here touches the learning
16
+ * tables.
17
+ */
18
+ export const CONFIRMATIONS = 3;
19
+ export const DECAY = 0.8;
20
+ export const CONTRADICTION = 5;
21
+ export const MIN_EXERCISED = 4;
22
+ export const MIN_APPLIED_SHARE = 0.4;
23
+ /** Of `memory.pinned_facts`, at most this many are environment facts. */
24
+ export const ENV_FACTS_MAX = 4;
25
+ /** About the token budget of the whole pinned part, header included. */
26
+ export const PINNED_TOKENS = 300;
27
+ /** A missing-module FormRepair contradiction counts only after this many exercised sessions in a row said so. */
28
+ export const CONTRADICT_STREAK = 2;
29
+ const nowIso = () => new Date().toISOString();
30
+ /** The evidence a family observation is, rendered to its fixed template. */
31
+ export function fromObservation(o) {
32
+ return { ...o, kind: 'env', text: render(o.family, o.params), source: 'free' };
33
+ }
34
+ /** An observer-proposed fact: keyed by its normalised text, so the same claim in three sessions confirms itself. */
35
+ export function fromProposal(kind, text) {
36
+ const clean = text.replace(/\s+/g, ' ').trim().slice(0, 300);
37
+ if (clean.length < 12 || LINT.test(clean))
38
+ return null;
39
+ const key = `observer:${kind}:${crypto.createHash('sha256').update(clean.toLowerCase()).digest('hex').slice(0, 16)}`;
40
+ return { key, family: 'observer', kind, text: clean, params: {}, source: 'observer', verdict: 'confirm', exercised: false, applied: false, high: false };
41
+ }
42
+ /**
43
+ * Everything one session's calls say about the project's facts: what the
44
+ * families observed, and how the session bore on each live FormRepair fact
45
+ * (the working form used, or the failing one working after all).
46
+ */
47
+ export function sessionEvidence(db, project, calls) {
48
+ const found = new Map(observe(calls).map((o) => [o.key, fromObservation(o)]));
49
+ const live = db
50
+ .prepare(`SELECT fact_key, params FROM pinned_facts WHERE project = ? AND family = 'form_repair' AND state != 'retired'`)
51
+ .all(project);
52
+ for (const f of live) {
53
+ const p = JSON.parse(f.params);
54
+ const bearing = formRepairEvidence(calls, p);
55
+ const seen = found.get(f.fact_key);
56
+ // A family observation of this fact implies the session ran its intent.
57
+ if (!bearing.exercised)
58
+ continue;
59
+ found.set(f.fact_key, {
60
+ ...(seen ?? fromObservation({ family: 'form_repair', key: f.fact_key, params: p, verdict: null, exercised: true, applied: false, high: false })),
61
+ verdict: seen?.verdict ?? bearing.verdict,
62
+ exercised: true,
63
+ applied: bearing.applied,
64
+ });
65
+ }
66
+ return [...found.values()];
67
+ }
68
+ /**
69
+ * Folds one session's evidence into the project's facts. Every live fact
70
+ * decays once per session; a session already counted is skipped, so a fold
71
+ * that runs twice changes nothing.
72
+ */
73
+ export function foldSessionFacts(db, project, sessionId, evidence, opts = {}) {
74
+ const at = nowIso();
75
+ const byKey = new Map(evidence.map((e) => [e.key, e]));
76
+ db.transaction(() => {
77
+ // `only`: touch just the facts this evidence is about (an observer
78
+ // proposal mid-session), so the session's own fold still decays the rest.
79
+ const live = db.prepare(`SELECT * FROM pinned_facts WHERE project = ? AND state != 'retired'`).all(project).filter((f) => !opts.only || byKey.has(f.fact_key));
80
+ for (const f of live) {
81
+ const seen = JSON.parse(f.sessions);
82
+ if (seen.includes(sessionId)) {
83
+ byKey.delete(f.fact_key);
84
+ continue;
85
+ }
86
+ const e = byKey.get(f.fact_key);
87
+ byKey.delete(f.fact_key);
88
+ const params = JSON.parse(f.params);
89
+ let verdict = e?.verdict ?? null;
90
+ // A run that did not need the missing module can pass by luck, so a
91
+ // missing-module fact needs two contradicting sessions in a row. A command
92
+ // that was not found and now runs is a clean contradiction.
93
+ if (f.family === 'form_repair' && params.error === 'module_missing' && e?.exercised) {
94
+ const streak = verdict === 'contradict' ? Number(params.contra_streak ?? 0) + 1 : 0;
95
+ params.contra_streak = streak;
96
+ if (verdict === 'contradict' && streak < CONTRADICT_STREAK)
97
+ verdict = null;
98
+ }
99
+ const score = f.score * DECAY + (verdict === 'confirm' ? 1 : 0) - (verdict === 'contradict' ? CONTRADICTION : 0);
100
+ const confirmations = f.confirmations + (verdict === 'confirm' ? 1 : 0);
101
+ const contradictions = f.contradictions + (verdict === 'contradict' ? 1 : 0);
102
+ // Decay alone never takes a positive score below zero: only a contradiction retires.
103
+ // A contradiction weighs five confirmations, and a score is at most five
104
+ // (1 / (1 - DECAY)), so a counted contradiction always takes it below zero.
105
+ const retireReason = verdict !== 'contradict' ? null : f.high ? 'contradicted (high stakes)' : 'contradicted';
106
+ const state = retireReason ? 'retired' : confirmations >= CONFIRMATIONS ? 'active' : f.state;
107
+ db.prepare(`UPDATE pinned_facts SET state = ?, score = ?, confirmations = ?, exercised = exercised + ?, applied = applied + ?,
108
+ contradictions = ?, params = ?, sessions = ?, updated_at = ?, retired_at = ?, retired_reason = ? WHERE id = ?`).run(state, score, confirmations, e?.exercised ? 1 : 0, e?.applied ? 1 : 0, contradictions, JSON.stringify(params), JSON.stringify([...seen, sessionId].slice(-50)), at, retireReason ? at : null, retireReason, f.id);
109
+ }
110
+ // New facts: only a confirmation starts one. A fact that is retired stays
111
+ // retired; the same claim must form again under a new key to come back.
112
+ const insert = db.prepare(`INSERT OR IGNORE INTO pinned_facts (project, fact_key, family, kind, text, params, source, state, score, confirmations,
113
+ exercised, applied, high, sessions, created_at, updated_at)
114
+ VALUES (?, ?, ?, ?, ?, ?, ?, 'forming', 1, 1, ?, ?, ?, ?, ?, ?)`);
115
+ for (const e of byKey.values()) {
116
+ if (e.verdict !== 'confirm')
117
+ continue;
118
+ insert.run(project, e.key, e.family, e.kind, e.text, JSON.stringify(e.params), e.source, e.exercised ? 1 : 0, e.applied ? 1 : 0, e.high ? 1 : 0, JSON.stringify([sessionId]), at, at);
119
+ }
120
+ })();
121
+ }
122
+ /** An active fact earns its place while it keeps applying in the sessions that exercise it. */
123
+ export function injectable(f) {
124
+ if (f.state !== 'active' || LINT.test(f.text))
125
+ return false;
126
+ return f.exercised < MIN_EXERCISED || f.applied / f.exercised >= MIN_APPLIED_SHARE;
127
+ }
128
+ /**
129
+ * The pinned part of the session-start block, or null: at most
130
+ * `memory.pinned_facts` facts and about `PINNED_TOKENS` tokens, environment
131
+ * facts limited to `ENV_FACTS_MAX`. Records which facts the session was shown.
132
+ */
133
+ export function pinnedLines(db, config, project, sessionId) {
134
+ const max = config.memory.pinned_facts;
135
+ if (!max || config.economy.envfacts === 'off')
136
+ return null;
137
+ const rows = db.prepare(`SELECT * FROM pinned_facts WHERE project = ? AND state = 'active' ORDER BY score DESC, id`).all(project).filter((f) => injectable(f) && (f.source === 'free' || config.economy.envfacts === 'observer'));
138
+ const header = 'Pinned facts, learned across earlier sessions here (evidence too: verify before relying on one):';
139
+ const chosen = [];
140
+ let tokens = estimateTokens(header);
141
+ let env = 0;
142
+ for (const f of rows) {
143
+ if (chosen.length >= max)
144
+ break;
145
+ if (f.kind === 'env' && env >= ENV_FACTS_MAX)
146
+ continue;
147
+ const cost = estimateTokens(`- ${f.text}`);
148
+ if (tokens + cost > PINNED_TOKENS)
149
+ continue;
150
+ chosen.push(f);
151
+ tokens += cost;
152
+ if (f.kind === 'env')
153
+ env++;
154
+ }
155
+ if (!chosen.length)
156
+ return null;
157
+ if (sessionId) {
158
+ const shown = db.prepare('INSERT OR IGNORE INTO pinned_fact_shown (session_id, fact_id, shown_at) VALUES (?, ?, ?)');
159
+ for (const f of chosen)
160
+ shown.run(sessionId, f.id, nowIso());
161
+ }
162
+ return [header, ...chosen.map((f) => `- ${defangFence(f.text)}`)];
163
+ }
164
+ export function listFacts(db, project, includeRetired = false) {
165
+ return db
166
+ .prepare(`SELECT * FROM pinned_facts WHERE project = ? ${includeRetired ? '' : "AND state != 'retired'"} ORDER BY state = 'active' DESC, score DESC, id`)
167
+ .all(project);
168
+ }
169
+ /** Retires one fact by hand. False when there is no such live fact in this project. */
170
+ export function retireFact(db, project, id, reason = 'retired by hand') {
171
+ return (db
172
+ .prepare(`UPDATE pinned_facts SET state = 'retired', retired_at = ?, retired_reason = ?, updated_at = ? WHERE id = ? AND project = ? AND state != 'retired'`)
173
+ .run(nowIso(), reason, nowIso(), id, project).changes > 0);
174
+ }
175
+ //# sourceMappingURL=pinned.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pinned.js","sourceRoot":"","sources":["../../src/memory/pinned.ts"],"names":[],"mappings":"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"}