daftari 1.15.0 → 1.17.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 (103) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/README.md +8 -2
  3. package/dist/backfill/apply.d.ts +14 -0
  4. package/dist/backfill/apply.d.ts.map +1 -0
  5. package/dist/backfill/apply.js +111 -0
  6. package/dist/backfill/apply.js.map +1 -0
  7. package/dist/backfill/derive.d.ts +25 -0
  8. package/dist/backfill/derive.d.ts.map +1 -0
  9. package/dist/backfill/derive.js +142 -0
  10. package/dist/backfill/derive.js.map +1 -0
  11. package/dist/backfill/index.d.ts +2 -0
  12. package/dist/backfill/index.d.ts.map +1 -0
  13. package/dist/backfill/index.js +232 -0
  14. package/dist/backfill/index.js.map +1 -0
  15. package/dist/backfill/plan.d.ts +19 -0
  16. package/dist/backfill/plan.d.ts.map +1 -0
  17. package/dist/backfill/plan.js +157 -0
  18. package/dist/backfill/plan.js.map +1 -0
  19. package/dist/backfill/types.d.ts +19 -0
  20. package/dist/backfill/types.d.ts.map +1 -0
  21. package/dist/backfill/types.js +10 -0
  22. package/dist/backfill/types.js.map +1 -0
  23. package/dist/cli.d.ts.map +1 -1
  24. package/dist/cli.js +15 -0
  25. package/dist/cli.js.map +1 -1
  26. package/dist/curation/lint.d.ts +3 -0
  27. package/dist/curation/lint.d.ts.map +1 -1
  28. package/dist/curation/lint.js +5 -0
  29. package/dist/curation/lint.js.map +1 -1
  30. package/dist/curation/staged-actions.d.ts +68 -0
  31. package/dist/curation/staged-actions.d.ts.map +1 -0
  32. package/dist/curation/staged-actions.js +394 -0
  33. package/dist/curation/staged-actions.js.map +1 -0
  34. package/dist/eval/generate.d.ts +12 -0
  35. package/dist/eval/generate.d.ts.map +1 -0
  36. package/dist/eval/generate.js +221 -0
  37. package/dist/eval/generate.js.map +1 -0
  38. package/dist/eval/index.d.ts +2 -0
  39. package/dist/eval/index.d.ts.map +1 -0
  40. package/dist/eval/index.js +311 -0
  41. package/dist/eval/index.js.map +1 -0
  42. package/dist/eval/llm.d.ts +47 -0
  43. package/dist/eval/llm.d.ts.map +1 -0
  44. package/dist/eval/llm.js +165 -0
  45. package/dist/eval/llm.js.map +1 -0
  46. package/dist/eval/prompts.d.ts +5 -0
  47. package/dist/eval/prompts.d.ts.map +1 -0
  48. package/dist/eval/prompts.js +44 -0
  49. package/dist/eval/prompts.js.map +1 -0
  50. package/dist/eval/run.d.ts +13 -0
  51. package/dist/eval/run.d.ts.map +1 -0
  52. package/dist/eval/run.js +78 -0
  53. package/dist/eval/run.js.map +1 -0
  54. package/dist/eval/score.d.ts +12 -0
  55. package/dist/eval/score.d.ts.map +1 -0
  56. package/dist/eval/score.js +154 -0
  57. package/dist/eval/score.js.map +1 -0
  58. package/dist/eval/storage.d.ts +10 -0
  59. package/dist/eval/storage.d.ts.map +1 -0
  60. package/dist/eval/storage.js +69 -0
  61. package/dist/eval/storage.js.map +1 -0
  62. package/dist/eval/subgraph.d.ts +17 -0
  63. package/dist/eval/subgraph.d.ts.map +1 -0
  64. package/dist/eval/subgraph.js +214 -0
  65. package/dist/eval/subgraph.js.map +1 -0
  66. package/dist/eval/tool-surface.d.ts +7 -0
  67. package/dist/eval/tool-surface.d.ts.map +1 -0
  68. package/dist/eval/tool-surface.js +160 -0
  69. package/dist/eval/tool-surface.js.map +1 -0
  70. package/dist/eval/types.d.ts +173 -0
  71. package/dist/eval/types.d.ts.map +1 -0
  72. package/dist/eval/types.js +44 -0
  73. package/dist/eval/types.js.map +1 -0
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +11 -1
  76. package/dist/index.js.map +1 -1
  77. package/dist/search/reindex.d.ts.map +1 -1
  78. package/dist/search/reindex.js +6 -0
  79. package/dist/search/reindex.js.map +1 -1
  80. package/dist/server.d.ts.map +1 -1
  81. package/dist/server.js +2 -0
  82. package/dist/server.js.map +1 -1
  83. package/dist/storage/index-db.d.ts +19 -0
  84. package/dist/storage/index-db.d.ts.map +1 -1
  85. package/dist/storage/index-db.js +56 -0
  86. package/dist/storage/index-db.js.map +1 -1
  87. package/dist/tools/curation.d.ts +2 -1
  88. package/dist/tools/curation.d.ts.map +1 -1
  89. package/dist/tools/curation.js +18 -4
  90. package/dist/tools/curation.js.map +1 -1
  91. package/dist/tools/staged-actions.d.ts +18 -0
  92. package/dist/tools/staged-actions.d.ts.map +1 -0
  93. package/dist/tools/staged-actions.js +275 -0
  94. package/dist/tools/staged-actions.js.map +1 -0
  95. package/dist/utils/config.d.ts +1 -0
  96. package/dist/utils/config.d.ts.map +1 -1
  97. package/dist/utils/config.js +32 -0
  98. package/dist/utils/config.js.map +1 -1
  99. package/dist/utils/git.d.ts +6 -0
  100. package/dist/utils/git.d.ts.map +1 -1
  101. package/dist/utils/git.js +34 -0
  102. package/dist/utils/git.js.map +1 -1
  103. package/package.json +2 -1
@@ -0,0 +1,68 @@
1
+ import { type Result } from "../frontmatter/types.js";
2
+ import { type IndexDb } from "../storage/index-db.js";
3
+ export declare const STAGED_ACTION_TYPES: readonly ["promote", "deprecate", "supersede", "merge", "confidence-up"];
4
+ export type StagedActionType = (typeof STAGED_ACTION_TYPES)[number];
5
+ export declare const DEFERRED_ACTION_TYPES: readonly StagedActionType[];
6
+ export declare const DEFAULT_TTL_DAYS = 14;
7
+ export declare const STAGED_ACTION_STATUSES: readonly ["pending", "ratified", "rejected", "expired", "ratified-pending-tool"];
8
+ export type StagedActionStatus = (typeof STAGED_ACTION_STATUSES)[number];
9
+ export declare const SWEEP_PRINCIPAL = "system:lint-sweep";
10
+ export interface StagedAction {
11
+ id: string;
12
+ actionType: string;
13
+ targetPath: string;
14
+ proposedBy: string;
15
+ proposedAt: string;
16
+ expiresAt: string;
17
+ status: string;
18
+ rationale: string;
19
+ proposedDiff: unknown;
20
+ ratifiedAt: string | null;
21
+ ratifiedBy: string | null;
22
+ ratificationReason: string | null;
23
+ }
24
+ export interface StageActionInput {
25
+ actionType: StagedActionType;
26
+ targetPath: string;
27
+ proposedBy: string;
28
+ rationale: string;
29
+ proposedDiff: unknown;
30
+ ttlDays?: number;
31
+ proposedAt?: string;
32
+ }
33
+ export interface DecisionInput {
34
+ status: StagedActionStatus;
35
+ ratifiedAt: string;
36
+ ratifiedBy: string;
37
+ reason?: string;
38
+ }
39
+ export declare function stagedActionsPath(vaultRoot: string): string;
40
+ export declare function nowISO(): string;
41
+ export declare function daysSince(iso: string, now: Date): number;
42
+ export declare function daysUntil(iso: string, now: Date): number;
43
+ export declare function stageAction(vaultRoot: string, input: StageActionInput): Promise<Result<{
44
+ id: string;
45
+ expires_at: string;
46
+ }, Error>>;
47
+ export declare function recordDecision(vaultRoot: string, id: string, decision: DecisionInput): Promise<Result<StagedAction, Error>>;
48
+ export declare function listStagedActions(vaultRoot: string, status?: string): Promise<Result<StagedAction[], Error>>;
49
+ export interface StagedActionLintItem {
50
+ id: string;
51
+ actionType: string;
52
+ targetPath: string;
53
+ ageDays: number;
54
+ expiresInDays: number;
55
+ rationale: string;
56
+ }
57
+ export declare function listPendingForLint(vaultRoot: string, now?: Date): Promise<Result<StagedActionLintItem[], Error>>;
58
+ export declare function getStagedActionById(vaultRoot: string, id: string): Promise<Result<StagedAction | null, Error>>;
59
+ export declare function sweepExpiredActions(vaultRoot: string, now?: Date): Promise<Result<{
60
+ expired: string[];
61
+ }, Error>>;
62
+ export declare function rebuildStagedActionsIndex(db: IndexDb, vaultRoot: string): Result<{
63
+ count: number;
64
+ }, Error>;
65
+ export declare function materializeStagedActions(vaultRoot: string): Result<{
66
+ count: number;
67
+ }, Error>;
68
+ //# sourceMappingURL=staged-actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staged-actions.d.ts","sourceRoot":"","sources":["../../src/curation/staged-actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,394 @@
1
+ // Staged-action queue — the "always-stage" tier of the cortex consolidation
2
+ // loop (spec §11.2). A staged action is a proposed change to the vault that
3
+ // waits for a human to ratify (approve) or reject it through `vault_ratify`.
4
+ // Unratified actions auto-expire after a TTL (default 14 days).
5
+ //
6
+ // Two stores, mirroring the rest of Daftari:
7
+ //
8
+ // - Canonical: .daftari/staged-actions.jsonl — append-only, one JSON record
9
+ // per line, the durable source of truth. A proposal is one record; its
10
+ // later decision (ratify / reject / expire) is a SECOND record referencing
11
+ // the same id. Collapsing the log to current state is this module's job.
12
+ //
13
+ // - Index: the `staged_actions` table in .daftari/index.db. Like every table
14
+ // there it is a derived cache: a reindex collapses the jsonl and
15
+ // repopulates it (rebuildStagedActionsIndex / materializeStagedActions).
16
+ // v1 read paths (list / ratify validation / lint) read the jsonl directly —
17
+ // the same posture the tension log takes with tensions.md — so the
18
+ // advisory/curation layer never has to open the embedding-backed index db
19
+ // on a hot path. The sqlite index exists for the future loop's traversal
20
+ // engine (§11.3+), which wants concurrent SQL reads.
21
+ //
22
+ // All file I/O here is synchronous on purpose: it lets `stageAction` allocate a
23
+ // monotonic id and append in one critical section with no intervening await, so
24
+ // two stagings in the same instant can never collide on an id. This guarantee
25
+ // is per-process; it is sufficient because Daftari enforces one process per
26
+ // vault (.daftari/process.lock — see CLAUDE.md), so there is never a second
27
+ // writer racing this one. It is NOT a cross-process file lock.
28
+ import { appendFileSync, mkdirSync, readFileSync } from "node:fs";
29
+ import { join } from "node:path";
30
+ import { err, ok } from "../frontmatter/types.js";
31
+ import { getProvider } from "../search/vector.js";
32
+ import { clearStagedActions, openIndexDb, upsertStagedAction, } from "../storage/index-db.js";
33
+ // The action verbs the queue understands. `promote` and `deprecate` dispatch to
34
+ // existing write tools on ratify; the rest are STAGED ONLY in v1 and dispatch
35
+ // is deferred to §11.4 (vault_supersede / vault_merge / vault_set_confidence).
36
+ export const STAGED_ACTION_TYPES = [
37
+ "promote",
38
+ "deprecate",
39
+ "supersede",
40
+ "merge",
41
+ "confidence-up",
42
+ ];
43
+ // Action types whose ratify dispatch is deferred to §11.4. Approving one of
44
+ // these is recorded as `ratified-pending-tool` and applies nothing.
45
+ export const DEFERRED_ACTION_TYPES = [
46
+ "supersede",
47
+ "merge",
48
+ "confidence-up",
49
+ ];
50
+ export const DEFAULT_TTL_DAYS = 14;
51
+ // The lifecycle states a staged action moves through. `ratified-pending-tool`
52
+ // is the terminal state for an approved-but-deferred action (§11.4).
53
+ export const STAGED_ACTION_STATUSES = [
54
+ "pending",
55
+ "ratified",
56
+ "rejected",
57
+ "expired",
58
+ "ratified-pending-tool",
59
+ ];
60
+ // The principal recorded as the actor when the lint sweep auto-expires an
61
+ // action. Mirrors the agent:/human: convention with a system: prefix.
62
+ export const SWEEP_PRINCIPAL = "system:lint-sweep";
63
+ export function stagedActionsPath(vaultRoot) {
64
+ return join(vaultRoot, ".daftari", "staged-actions.jsonl");
65
+ }
66
+ // --- time helpers ----------------------------------------------------------
67
+ // ISO 8601 to the second (YYYY-MM-DDTHH:MM:SSZ) — drops the millisecond field
68
+ // that toISOString() adds, matching the spec's record format.
69
+ function toSecondISO(d) {
70
+ return d.toISOString().replace(/\.\d{3}Z$/, "Z");
71
+ }
72
+ // Current instant as a second-resolution ISO string. Exported so the tool
73
+ // layer stamps ratify/reject decisions in the same format the log uses.
74
+ export function nowISO() {
75
+ return toSecondISO(new Date());
76
+ }
77
+ function addDaysISO(iso, days) {
78
+ const d = new Date(iso);
79
+ d.setUTCDate(d.getUTCDate() + days);
80
+ return toSecondISO(d);
81
+ }
82
+ // Whole days between two instants, floored. Negative when `iso` is in the past
83
+ // relative to `now` (for daysUntil) or the future (for daysSince).
84
+ export function daysSince(iso, now) {
85
+ return Math.floor((now.getTime() - Date.parse(iso)) / 86_400_000);
86
+ }
87
+ export function daysUntil(iso, now) {
88
+ return Math.floor((Date.parse(iso) - now.getTime()) / 86_400_000);
89
+ }
90
+ function readRawRecords(vaultRoot) {
91
+ let raw;
92
+ try {
93
+ raw = readFileSync(stagedActionsPath(vaultRoot), "utf-8");
94
+ }
95
+ catch (e) {
96
+ if (e.code === "ENOENT")
97
+ return [];
98
+ throw e;
99
+ }
100
+ const records = [];
101
+ for (const line of raw.split("\n")) {
102
+ const trimmed = line.trim();
103
+ if (!trimmed)
104
+ continue;
105
+ try {
106
+ const rec = JSON.parse(trimmed);
107
+ if (typeof rec.id === "string")
108
+ records.push(rec);
109
+ }
110
+ catch {
111
+ // Skip a corrupt line; the log is append-only and best-effort.
112
+ }
113
+ }
114
+ return records;
115
+ }
116
+ // Collapses the append-only log to one current row per id. Records are applied
117
+ // in file order: a proposal seeds the row, each later decision overwrites the
118
+ // status + ratification fields. A decision with no matching proposal is
119
+ // ignored (it cannot stand alone).
120
+ function collapse(records) {
121
+ const byId = new Map();
122
+ for (const rec of records) {
123
+ if (rec.action_type !== undefined) {
124
+ // Proposal record.
125
+ byId.set(rec.id, {
126
+ id: rec.id,
127
+ action_type: rec.action_type,
128
+ target_path: rec.target_path ?? "",
129
+ proposed_by: rec.proposed_by ?? "",
130
+ proposed_at: rec.proposed_at ?? "",
131
+ expires_at: rec.expires_at ?? "",
132
+ status: rec.status ?? "pending",
133
+ rationale: rec.rationale ?? "",
134
+ proposed_diff: rec.proposed_diff ?? "null",
135
+ ratified_at: null,
136
+ ratified_by: null,
137
+ ratification_reason: null,
138
+ });
139
+ }
140
+ else {
141
+ // Decision record — only meaningful if the proposal was already seen.
142
+ const existing = byId.get(rec.id);
143
+ if (!existing)
144
+ continue;
145
+ existing.status = rec.status ?? existing.status;
146
+ existing.ratified_at = rec.ratified_at ?? null;
147
+ existing.ratified_by = rec.ratified_by ?? null;
148
+ existing.ratification_reason = rec.ratification_reason ?? null;
149
+ }
150
+ }
151
+ return byId;
152
+ }
153
+ function rowToStagedAction(row) {
154
+ let proposedDiff = null;
155
+ try {
156
+ proposedDiff = JSON.parse(row.proposed_diff);
157
+ }
158
+ catch {
159
+ proposedDiff = row.proposed_diff;
160
+ }
161
+ return {
162
+ id: row.id,
163
+ actionType: row.action_type,
164
+ targetPath: row.target_path,
165
+ proposedBy: row.proposed_by,
166
+ proposedAt: row.proposed_at,
167
+ expiresAt: row.expires_at,
168
+ status: row.status,
169
+ rationale: row.rationale,
170
+ proposedDiff,
171
+ ratifiedAt: row.ratified_at,
172
+ ratifiedBy: row.ratified_by,
173
+ ratificationReason: row.ratification_reason,
174
+ };
175
+ }
176
+ // Reads the log and returns current state as parsed actions, id order. A
177
+ // missing log is not an error — it just means nothing has been staged.
178
+ function currentRows(vaultRoot) {
179
+ return [...collapse(readRawRecords(vaultRoot)).values()].sort((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : 0);
180
+ }
181
+ // --- id allocation ---------------------------------------------------------
182
+ // Next `stage-NNN` id: the highest numeric suffix ever seen across the whole
183
+ // log (proposals and decisions both carry the id) plus one. Scans every record
184
+ // so a decision-only collapse can't reset the counter.
185
+ function nextStagedId(records) {
186
+ let max = 0;
187
+ for (const rec of records) {
188
+ const m = rec.id.match(/^stage-(\d+)$/);
189
+ if (!m)
190
+ continue;
191
+ const n = Number.parseInt(m[1], 10);
192
+ if (Number.isFinite(n) && n > max)
193
+ max = n;
194
+ }
195
+ return `stage-${String(max + 1).padStart(3, "0")}`;
196
+ }
197
+ // --- producer / consumer / sweep -------------------------------------------
198
+ // Stages a proposed action. Validation is defensive — the tool layer validates
199
+ // too — but this is the durable boundary, so it re-checks. The id-allocation +
200
+ // append run synchronously with no intervening await, so concurrent calls get
201
+ // distinct, monotonic ids.
202
+ export async function stageAction(vaultRoot, input) {
203
+ if (!STAGED_ACTION_TYPES.includes(input.actionType)) {
204
+ return err(new Error(`stageAction: action_type must be one of: ${STAGED_ACTION_TYPES.join(", ")}`));
205
+ }
206
+ for (const field of ["targetPath", "proposedBy", "rationale"]) {
207
+ const v = input[field];
208
+ if (typeof v !== "string" || v.trim().length === 0) {
209
+ return err(new Error(`stageAction requires a non-empty '${field}'`));
210
+ }
211
+ }
212
+ if (input.proposedDiff === undefined || input.proposedDiff === null) {
213
+ return err(new Error("stageAction requires a 'proposedDiff'"));
214
+ }
215
+ const ttlDays = input.ttlDays ?? DEFAULT_TTL_DAYS;
216
+ if (!Number.isFinite(ttlDays) || ttlDays <= 0) {
217
+ return err(new Error("stageAction 'ttlDays' must be a positive number"));
218
+ }
219
+ const proposedAt = input.proposedAt ?? nowISO();
220
+ const expiresAt = addDaysISO(proposedAt, ttlDays);
221
+ try {
222
+ mkdirSync(join(vaultRoot, ".daftari"), { recursive: true });
223
+ // Critical section: read max id and append in one synchronous breath so no
224
+ // concurrent stageAction can observe the same max.
225
+ const id = nextStagedId(readRawRecords(vaultRoot));
226
+ const record = {
227
+ id,
228
+ action_type: input.actionType,
229
+ target_path: input.targetPath.trim(),
230
+ proposed_by: input.proposedBy.trim(),
231
+ proposed_at: proposedAt,
232
+ expires_at: expiresAt,
233
+ status: "pending",
234
+ rationale: input.rationale.trim(),
235
+ proposed_diff: JSON.stringify(input.proposedDiff),
236
+ };
237
+ appendFileSync(stagedActionsPath(vaultRoot), `${JSON.stringify(record)}\n`);
238
+ return ok({ id, expires_at: expiresAt });
239
+ }
240
+ catch (e) {
241
+ const reason = e instanceof Error ? e.message : String(e);
242
+ return err(new Error(`cannot stage action: ${reason}`));
243
+ }
244
+ }
245
+ // Appends a decision record (ratify / reject / expire) for an existing action
246
+ // and returns the collapsed result. Does NOT validate that the action is
247
+ // pending — the caller (vault_ratify, the sweep) owns that policy. Errors only
248
+ // if the id was never proposed.
249
+ export async function recordDecision(vaultRoot, id, decision) {
250
+ try {
251
+ const before = collapse(readRawRecords(vaultRoot));
252
+ if (!before.has(id))
253
+ return err(new Error(`staged action not found: ${id}`));
254
+ const record = {
255
+ id,
256
+ status: decision.status,
257
+ ratified_at: decision.ratifiedAt,
258
+ ratified_by: decision.ratifiedBy,
259
+ ...(decision.reason ? { ratification_reason: decision.reason } : {}),
260
+ };
261
+ mkdirSync(join(vaultRoot, ".daftari"), { recursive: true });
262
+ appendFileSync(stagedActionsPath(vaultRoot), `${JSON.stringify(record)}\n`);
263
+ const after = collapse(readRawRecords(vaultRoot)).get(id);
264
+ if (!after)
265
+ return err(new Error(`staged action not found after write: ${id}`));
266
+ return ok(rowToStagedAction(after));
267
+ }
268
+ catch (e) {
269
+ const reason = e instanceof Error ? e.message : String(e);
270
+ return err(new Error(`cannot record decision: ${reason}`));
271
+ }
272
+ }
273
+ // Returns current actions, optionally filtered to one status, id order.
274
+ export async function listStagedActions(vaultRoot, status) {
275
+ try {
276
+ const rows = currentRows(vaultRoot);
277
+ const actions = rows.map(rowToStagedAction);
278
+ return ok(status ? actions.filter((a) => a.status === status) : actions);
279
+ }
280
+ catch (e) {
281
+ const reason = e instanceof Error ? e.message : String(e);
282
+ return err(new Error(`cannot read staged actions: ${reason}`));
283
+ }
284
+ }
285
+ // First sentence of a rationale: up to the first sentence-ending period
286
+ // followed by whitespace, else the whole trimmed string.
287
+ function firstSentence(text) {
288
+ const trimmed = text.trim();
289
+ const m = trimmed.match(/^(.*?[.!?])(\s|$)/);
290
+ return m ? m[1] : trimmed;
291
+ }
292
+ // Pending actions for the lint "Staged actions" section, soonest-to-expire
293
+ // first. Read-only — the sweep that expires stale actions is a separate step.
294
+ export async function listPendingForLint(vaultRoot, now = new Date()) {
295
+ try {
296
+ const items = currentRows(vaultRoot)
297
+ .filter((r) => r.status === "pending")
298
+ .sort((a, b) => (a.expires_at < b.expires_at ? -1 : a.expires_at > b.expires_at ? 1 : 0))
299
+ .map((r) => ({
300
+ id: r.id,
301
+ actionType: r.action_type,
302
+ targetPath: r.target_path,
303
+ ageDays: daysSince(r.proposed_at, now),
304
+ expiresInDays: daysUntil(r.expires_at, now),
305
+ rationale: firstSentence(r.rationale),
306
+ }));
307
+ return ok(items);
308
+ }
309
+ catch (e) {
310
+ const reason = e instanceof Error ? e.message : String(e);
311
+ return err(new Error(`cannot read staged actions: ${reason}`));
312
+ }
313
+ }
314
+ export async function getStagedActionById(vaultRoot, id) {
315
+ try {
316
+ const row = collapse(readRawRecords(vaultRoot)).get(id);
317
+ return ok(row ? rowToStagedAction(row) : null);
318
+ }
319
+ catch (e) {
320
+ const reason = e instanceof Error ? e.message : String(e);
321
+ return err(new Error(`cannot read staged action: ${reason}`));
322
+ }
323
+ }
324
+ // Sweeps every `pending` action whose expiry has passed into `expired`. One
325
+ // expiry decision record is appended per action. Returns the swept ids,
326
+ // soonest-expired first. Idempotent: an action already past expiry but not
327
+ // pending is left alone.
328
+ export async function sweepExpiredActions(vaultRoot, now = new Date()) {
329
+ try {
330
+ const rows = currentRows(vaultRoot);
331
+ const stale = rows
332
+ .filter((r) => r.status === "pending" && Date.parse(r.expires_at) < now.getTime())
333
+ .sort((a, b) => (a.expires_at < b.expires_at ? -1 : a.expires_at > b.expires_at ? 1 : 0));
334
+ const at = toSecondISO(now);
335
+ const expired = [];
336
+ if (stale.length > 0)
337
+ mkdirSync(join(vaultRoot, ".daftari"), { recursive: true });
338
+ for (const row of stale) {
339
+ const record = {
340
+ id: row.id,
341
+ status: "expired",
342
+ ratified_at: at,
343
+ ratified_by: SWEEP_PRINCIPAL,
344
+ };
345
+ appendFileSync(stagedActionsPath(vaultRoot), `${JSON.stringify(record)}\n`);
346
+ expired.push(row.id);
347
+ }
348
+ return ok({ expired });
349
+ }
350
+ catch (e) {
351
+ const reason = e instanceof Error ? e.message : String(e);
352
+ return err(new Error(`cannot sweep staged actions: ${reason}`));
353
+ }
354
+ }
355
+ // --- sqlite index rebuild --------------------------------------------------
356
+ // Collapses the jsonl and repopulates the `staged_actions` table from scratch.
357
+ // Synchronous (better-sqlite3 + readFileSync). The upserts run in one
358
+ // transaction so a mid-rebuild failure rolls back rather than leaving a
359
+ // half-populated index, and any sqlite throw surfaces as an err Result instead
360
+ // of silently dropping rows.
361
+ export function rebuildStagedActionsIndex(db, vaultRoot) {
362
+ try {
363
+ const rows = currentRows(vaultRoot);
364
+ const write = db.transaction(() => {
365
+ clearStagedActions(db);
366
+ for (const row of rows)
367
+ upsertStagedAction(db, row);
368
+ });
369
+ write();
370
+ return ok({ count: rows.length });
371
+ }
372
+ catch (e) {
373
+ const reason = e instanceof Error ? e.message : String(e);
374
+ return err(new Error(`cannot rebuild staged-actions index: ${reason}`));
375
+ }
376
+ }
377
+ // Opens the index db at the active provider's dim, rebuilds the staged_actions
378
+ // table, and closes. Used at startup when a reindex isn't otherwise running
379
+ // (the fresh-index path); the reindex path calls rebuildStagedActionsIndex
380
+ // directly against its already-open handle. The provider dim matters: opening
381
+ // at the wrong dim would drop and recreate the embeddings_vec mirror.
382
+ export function materializeStagedActions(vaultRoot) {
383
+ const opened = openIndexDb(vaultRoot, getProvider().dim);
384
+ if (!opened.ok)
385
+ return opened;
386
+ const db = opened.value;
387
+ try {
388
+ return rebuildStagedActionsIndex(db, vaultRoot);
389
+ }
390
+ finally {
391
+ db.close();
392
+ }
393
+ }
394
+ //# sourceMappingURL=staged-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staged-actions.js","sourceRoot":"","sources":["../../src/curation/staged-actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type Result } from "../frontmatter/types.js";
2
+ import type { LlmClient } from "./llm.js";
3
+ import type { Subgraph } from "./subgraph.js";
4
+ import { type CortexEvalError, type QuestionSet } from "./types.js";
5
+ export interface GenerateOptions {
6
+ n: number;
7
+ model: string;
8
+ vaultHash?: string;
9
+ seed?: string;
10
+ }
11
+ export declare function generateQuestions(subgraph: Subgraph, llm: LlmClient, opts: GenerateOptions): Promise<Result<QuestionSet, CortexEvalError>>;
12
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/eval/generate.ts"],"names":[],"mappings":"AAUA,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EACL,KAAK,eAAe,EAEpB,KAAK,WAAW,EAIjB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,eAAe;IAC9B,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC,CA0E/C"}