daftari 1.28.0 → 1.30.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 (171) hide show
  1. package/CHANGELOG.md +197 -0
  2. package/README.md +167 -28
  3. package/dist/asof/git-read.d.ts +17 -0
  4. package/dist/asof/git-read.d.ts.map +1 -0
  5. package/dist/asof/git-read.js +163 -0
  6. package/dist/asof/git-read.js.map +1 -0
  7. package/dist/asof/index.d.ts +2 -0
  8. package/dist/asof/index.d.ts.map +1 -0
  9. package/dist/asof/index.js +151 -0
  10. package/dist/asof/index.js.map +1 -0
  11. package/dist/asof/report.d.ts +11 -0
  12. package/dist/asof/report.d.ts.map +1 -0
  13. package/dist/asof/report.js +119 -0
  14. package/dist/asof/report.js.map +1 -0
  15. package/dist/asof/snapshot.d.ts +72 -0
  16. package/dist/asof/snapshot.d.ts.map +1 -0
  17. package/dist/asof/snapshot.js +207 -0
  18. package/dist/asof/snapshot.js.map +1 -0
  19. package/dist/backfill/apply.js +2 -2
  20. package/dist/backfill/apply.js.map +1 -1
  21. package/dist/backfill/plan.js +2 -2
  22. package/dist/backfill/plan.js.map +1 -1
  23. package/dist/cli.d.ts.map +1 -1
  24. package/dist/cli.js +18 -0
  25. package/dist/cli.js.map +1 -1
  26. package/dist/consolidate/call-budget.d.ts +3 -0
  27. package/dist/consolidate/call-budget.d.ts.map +1 -0
  28. package/dist/consolidate/call-budget.js +37 -0
  29. package/dist/consolidate/call-budget.js.map +1 -0
  30. package/dist/consolidate/constants.d.ts +1 -0
  31. package/dist/consolidate/constants.d.ts.map +1 -1
  32. package/dist/consolidate/constants.js +5 -0
  33. package/dist/consolidate/constants.js.map +1 -1
  34. package/dist/consolidate/index.d.ts.map +1 -1
  35. package/dist/consolidate/index.js +96 -27
  36. package/dist/consolidate/index.js.map +1 -1
  37. package/dist/court/docket.d.ts +39 -0
  38. package/dist/court/docket.d.ts.map +1 -0
  39. package/dist/court/docket.js +103 -0
  40. package/dist/court/docket.js.map +1 -0
  41. package/dist/court/index.d.ts +2 -0
  42. package/dist/court/index.d.ts.map +1 -0
  43. package/dist/court/index.js +169 -0
  44. package/dist/court/index.js.map +1 -0
  45. package/dist/court/precedent.d.ts +18 -0
  46. package/dist/court/precedent.d.ts.map +1 -0
  47. package/dist/court/precedent.js +84 -0
  48. package/dist/court/precedent.js.map +1 -0
  49. package/dist/court/report.d.ts +10 -0
  50. package/dist/court/report.d.ts.map +1 -0
  51. package/dist/court/report.js +77 -0
  52. package/dist/court/report.js.map +1 -0
  53. package/dist/curation/staged-actions.d.ts.map +1 -1
  54. package/dist/curation/staged-actions.js +15 -6
  55. package/dist/curation/staged-actions.js.map +1 -1
  56. package/dist/curation/staleness.js +1 -1
  57. package/dist/curation/staleness.js.map +1 -1
  58. package/dist/curation/tension-access.d.ts +7 -0
  59. package/dist/curation/tension-access.d.ts.map +1 -0
  60. package/dist/curation/tension-access.js +44 -0
  61. package/dist/curation/tension-access.js.map +1 -0
  62. package/dist/curation/tension-blast.d.ts +2 -1
  63. package/dist/curation/tension-blast.d.ts.map +1 -1
  64. package/dist/curation/tension-blast.js +2 -2
  65. package/dist/curation/tension-blast.js.map +1 -1
  66. package/dist/curation/tension-clusters.d.ts +1 -1
  67. package/dist/curation/tension-clusters.d.ts.map +1 -1
  68. package/dist/curation/tension-clusters.js +5 -2
  69. package/dist/curation/tension-clusters.js.map +1 -1
  70. package/dist/curation/tension.d.ts +1 -0
  71. package/dist/curation/tension.d.ts.map +1 -1
  72. package/dist/curation/tension.js +18 -10
  73. package/dist/curation/tension.js.map +1 -1
  74. package/dist/curation/vault-docs.js +1 -1
  75. package/dist/curation/vault-docs.js.map +1 -1
  76. package/dist/eval/llm-openrouter.d.ts +9 -0
  77. package/dist/eval/llm-openrouter.d.ts.map +1 -0
  78. package/dist/eval/llm-openrouter.js +171 -0
  79. package/dist/eval/llm-openrouter.js.map +1 -0
  80. package/dist/frontmatter/parser.d.ts +1 -0
  81. package/dist/frontmatter/parser.d.ts.map +1 -1
  82. package/dist/frontmatter/parser.js +12 -0
  83. package/dist/frontmatter/parser.js.map +1 -1
  84. package/dist/frontmatter/schema.d.ts.map +1 -1
  85. package/dist/frontmatter/schema.js +19 -2
  86. package/dist/frontmatter/schema.js.map +1 -1
  87. package/dist/index.js +1 -1
  88. package/dist/search/contested.d.ts +18 -0
  89. package/dist/search/contested.d.ts.map +1 -0
  90. package/dist/search/contested.js +119 -0
  91. package/dist/search/contested.js.map +1 -0
  92. package/dist/search/hybrid.d.ts +5 -0
  93. package/dist/search/hybrid.d.ts.map +1 -1
  94. package/dist/search/hybrid.js +112 -9
  95. package/dist/search/hybrid.js.map +1 -1
  96. package/dist/search/reindex.d.ts.map +1 -1
  97. package/dist/search/reindex.js +16 -13
  98. package/dist/search/reindex.js.map +1 -1
  99. package/dist/search/watcher.js +2 -2
  100. package/dist/search/watcher.js.map +1 -1
  101. package/dist/server.d.ts.map +1 -1
  102. package/dist/server.js +4 -0
  103. package/dist/server.js.map +1 -1
  104. package/dist/sleep/cycle.d.ts +59 -0
  105. package/dist/sleep/cycle.d.ts.map +1 -0
  106. package/dist/sleep/cycle.js +127 -0
  107. package/dist/sleep/cycle.js.map +1 -0
  108. package/dist/sleep/index.d.ts +3 -0
  109. package/dist/sleep/index.d.ts.map +1 -0
  110. package/dist/sleep/index.js +129 -0
  111. package/dist/sleep/index.js.map +1 -0
  112. package/dist/sleep/report.d.ts +11 -0
  113. package/dist/sleep/report.d.ts.map +1 -0
  114. package/dist/sleep/report.js +87 -0
  115. package/dist/sleep/report.js.map +1 -0
  116. package/dist/storage/index-db.d.ts +2 -0
  117. package/dist/storage/index-db.d.ts.map +1 -1
  118. package/dist/storage/index-db.js +106 -19
  119. package/dist/storage/index-db.js.map +1 -1
  120. package/dist/storage/local.d.ts +6 -1
  121. package/dist/storage/local.d.ts.map +1 -1
  122. package/dist/storage/local.js +30 -4
  123. package/dist/storage/local.js.map +1 -1
  124. package/dist/tools/curation.d.ts.map +1 -1
  125. package/dist/tools/curation.js +60 -3
  126. package/dist/tools/curation.js.map +1 -1
  127. package/dist/tools/edges.js +2 -2
  128. package/dist/tools/edges.js.map +1 -1
  129. package/dist/tools/read.js +2 -2
  130. package/dist/tools/read.js.map +1 -1
  131. package/dist/tools/receipt.d.ts +65 -0
  132. package/dist/tools/receipt.d.ts.map +1 -0
  133. package/dist/tools/receipt.js +248 -0
  134. package/dist/tools/receipt.js.map +1 -0
  135. package/dist/tools/search.d.ts.map +1 -1
  136. package/dist/tools/search.js +40 -8
  137. package/dist/tools/search.js.map +1 -1
  138. package/dist/tools/staged-actions.js +1 -1
  139. package/dist/tools/staged-actions.js.map +1 -1
  140. package/dist/tools/themes.d.ts +1 -0
  141. package/dist/tools/themes.d.ts.map +1 -1
  142. package/dist/tools/themes.js +159 -45
  143. package/dist/tools/themes.js.map +1 -1
  144. package/dist/tools/witness.d.ts +9 -0
  145. package/dist/tools/witness.d.ts.map +1 -0
  146. package/dist/tools/witness.js +66 -0
  147. package/dist/tools/witness.js.map +1 -0
  148. package/dist/tools/write.d.ts.map +1 -1
  149. package/dist/tools/write.js +101 -53
  150. package/dist/tools/write.js.map +1 -1
  151. package/dist/utils/config.d.ts +2 -0
  152. package/dist/utils/config.d.ts.map +1 -1
  153. package/dist/utils/config.js +48 -2
  154. package/dist/utils/config.js.map +1 -1
  155. package/dist/utils/paths.d.ts +2 -0
  156. package/dist/utils/paths.d.ts.map +1 -0
  157. package/dist/utils/paths.js +15 -0
  158. package/dist/utils/paths.js.map +1 -0
  159. package/dist/utils/redos.d.ts +2 -0
  160. package/dist/utils/redos.d.ts.map +1 -0
  161. package/dist/utils/redos.js +101 -0
  162. package/dist/utils/redos.js.map +1 -0
  163. package/dist/utils/vault-gitignore.d.ts +1 -1
  164. package/dist/utils/vault-gitignore.d.ts.map +1 -1
  165. package/dist/utils/vault-gitignore.js +2 -0
  166. package/dist/utils/vault-gitignore.js.map +1 -1
  167. package/dist/witness/track-record.d.ts +42 -0
  168. package/dist/witness/track-record.d.ts.map +1 -0
  169. package/dist/witness/track-record.js +189 -0
  170. package/dist/witness/track-record.js.map +1 -0
  171. package/package.json +7 -2
@@ -0,0 +1,151 @@
1
+ // Top-level entry for `daftari asof` — belief archaeology over the vault's
2
+ // git history. Strictly read-only: never checks anything out, never writes
3
+ // to the repo, needs no index and no API key.
4
+ //
5
+ // Exit codes (the audit convention):
6
+ // 0 — report produced
7
+ // 2 — config/usage error (bad ref or date, not a git repo, unknown doc)
8
+ // 3 — runtime error (IO failure writing the report)
9
+ import { writeFile } from "node:fs/promises";
10
+ import { resolve } from "node:path";
11
+ import { listTensions } from "../curation/tension.js";
12
+ import { isGitRepo } from "../utils/git.js";
13
+ import { resolveAsofCommit } from "./git-read.js";
14
+ import { renderJson, renderMarkdown } from "./report.js";
15
+ import { beliefSnapshot, counterfactualReplay, docTrajectory } from "./snapshot.js";
16
+ const HELP = `daftari asof — what did the vault believe at a past point?
17
+
18
+ Usage:
19
+ daftari asof <ref-or-date> [--vault <path>] [options]
20
+ daftari asof --help
21
+
22
+ <ref-or-date> is either a git ref (HEAD~5, a branch, a commit hash, a tag)
23
+ or a YYYY-MM-DD date, meaning the last commit on or before the end of that
24
+ day (committer clock).
25
+
26
+ The default report is a belief snapshot: the vault's document and tension
27
+ state at that point, plus the drift since — documents added/removed, status
28
+ and confidence transitions, and tensions opened or resolved.
29
+
30
+ Flags:
31
+ --vault <path> Vault root (default: current directory).
32
+ --doc <relpath> Add a single-document trajectory: its frontmatter
33
+ then vs now, and every commit touching it since.
34
+ --blast <relpath> Add a counterfactual replay: the blast radius of the
35
+ document computed over the tree AS OF the commit
36
+ (same source/link edge semantics as
37
+ vault_tension_blast), each downstream doc annotated
38
+ with its status today. "This fact turned out wrong —
39
+ who had inherited it, and where are they now?"
40
+ --output <md> Markdown report destination (default: stdout).
41
+ --output-json <json> JSON report destination (default: not written).
42
+
43
+ Read-only. Works on any daftari vault that uses git as its version layer.
44
+
45
+ Exit codes:
46
+ 0 — report produced
47
+ 2 — config/usage error (bad ref/date, not a git repo, unknown doc)
48
+ 3 — runtime error (IO failure)
49
+ `;
50
+ function readStringArg(argv, flag) {
51
+ const raw = argv.find((a) => a === flag || a.startsWith(`${flag}=`));
52
+ if (raw === undefined)
53
+ return undefined;
54
+ const idx = argv.indexOf(raw);
55
+ return raw.includes("=") ? raw.slice(raw.indexOf("=") + 1) : argv[idx + 1];
56
+ }
57
+ export async function runAsof(argv) {
58
+ if (argv.length === 0 || argv.includes("--help") || argv.includes("-h")) {
59
+ process.stdout.write(HELP);
60
+ return 0;
61
+ }
62
+ const refOrDate = findPositional(argv);
63
+ if (!refOrDate) {
64
+ process.stderr.write("daftari asof: missing <ref-or-date>\n");
65
+ return 2;
66
+ }
67
+ const vaultRoot = resolve(readStringArg(argv, "--vault") ?? ".");
68
+ if (!(await isGitRepo(vaultRoot))) {
69
+ process.stderr.write(`daftari asof: not a git repository: ${vaultRoot}\n`);
70
+ return 2;
71
+ }
72
+ const commit = await resolveAsofCommit(vaultRoot, refOrDate);
73
+ if (!commit.ok) {
74
+ process.stderr.write(`daftari asof: ${commit.error.message}\n`);
75
+ return 2;
76
+ }
77
+ const tensionsNow = await listTensions(vaultRoot);
78
+ if (!tensionsNow.ok) {
79
+ process.stderr.write(`daftari asof: ${tensionsNow.error.message}\n`);
80
+ return 3;
81
+ }
82
+ const snapshot = await beliefSnapshot(vaultRoot, commit.value, tensionsNow.value);
83
+ if (!snapshot.ok) {
84
+ process.stderr.write(`daftari asof: ${snapshot.error.message}\n`);
85
+ return 3;
86
+ }
87
+ const docPath = readStringArg(argv, "--doc");
88
+ let trajectory = null;
89
+ if (docPath) {
90
+ const t = await docTrajectory(vaultRoot, commit.value, docPath);
91
+ if (!t.ok) {
92
+ process.stderr.write(`daftari asof: ${t.error.message}\n`);
93
+ return 2;
94
+ }
95
+ trajectory = t.value;
96
+ }
97
+ const blastPath = readStringArg(argv, "--blast");
98
+ let replay = null;
99
+ if (blastPath) {
100
+ const r = await counterfactualReplay(vaultRoot, commit.value, blastPath);
101
+ if (!r.ok) {
102
+ process.stderr.write(`daftari asof: ${r.error.message}\n`);
103
+ return 2;
104
+ }
105
+ replay = r.value;
106
+ }
107
+ const report = {
108
+ generatedAt: new Date().toISOString(),
109
+ vault: vaultRoot,
110
+ snapshot: snapshot.value,
111
+ trajectory,
112
+ replay,
113
+ };
114
+ const md = renderMarkdown(report);
115
+ const outputMd = readStringArg(argv, "--output");
116
+ const outputJson = readStringArg(argv, "--output-json");
117
+ try {
118
+ if (outputMd) {
119
+ await writeFile(resolve(outputMd), md, "utf-8");
120
+ }
121
+ else {
122
+ process.stdout.write(md);
123
+ }
124
+ if (outputJson) {
125
+ await writeFile(resolve(outputJson), renderJson(report), "utf-8");
126
+ }
127
+ }
128
+ catch (e) {
129
+ const reason = e instanceof Error ? e.message : String(e);
130
+ process.stderr.write(`daftari asof: write failed: ${reason}\n`);
131
+ return 3;
132
+ }
133
+ return 0;
134
+ }
135
+ // The positional <ref-or-date> is the first argv entry that is neither a
136
+ // --flag nor the value of a value-taking flag (the `--flag value` form; the
137
+ // `--flag=value` form never occupies its own entry).
138
+ const VALUE_FLAGS = ["--vault", "--doc", "--blast", "--output", "--output-json"];
139
+ function findPositional(argv) {
140
+ for (let i = 0; i < argv.length; i++) {
141
+ const a = argv[i];
142
+ if (a.startsWith("--"))
143
+ continue;
144
+ const prev = i > 0 ? argv[i - 1] : undefined;
145
+ if (prev !== undefined && VALUE_FLAGS.includes(prev))
146
+ continue;
147
+ return a;
148
+ }
149
+ return undefined;
150
+ }
151
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/asof/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { AsofReplay, AsofSnapshot, DocTrajectory } from "./snapshot.js";
2
+ export interface AsofReport {
3
+ generatedAt: string;
4
+ vault: string;
5
+ snapshot: AsofSnapshot;
6
+ trajectory: DocTrajectory | null;
7
+ replay: AsofReplay | null;
8
+ }
9
+ export declare function renderMarkdown(report: AsofReport): string;
10
+ export declare function renderJson(report: AsofReport): string;
11
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/asof/report.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI7E,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,YAAY,CAAC;IACvB,UAAU,EAAE,aAAa,GAAG,IAAI,CAAC;IACjC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;CAC3B;AAeD,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CA2GzD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAErD"}
@@ -0,0 +1,119 @@
1
+ // Markdown + JSON rendering for `daftari asof`. Mirrors the audit report's
2
+ // conventions: markdown to stdout by default, JSON carries the same
3
+ // structure with full detail, long lists are capped in markdown (never in
4
+ // JSON) with an explicit "+n more" so truncation is visible, not silent.
5
+ const LIST_CAP = 50;
6
+ function cappedList(items, render) {
7
+ const shown = items.slice(0, LIST_CAP).map(render);
8
+ if (items.length > LIST_CAP)
9
+ shown.push(`- …and ${items.length - LIST_CAP} more`);
10
+ return shown;
11
+ }
12
+ function countLine(counts) {
13
+ const parts = Object.entries(counts)
14
+ .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
15
+ .map(([k, n]) => `${k} ${n}`);
16
+ return parts.length > 0 ? parts.join(" · ") : "(none)";
17
+ }
18
+ export function renderMarkdown(report) {
19
+ const { snapshot, trajectory, replay } = report;
20
+ const short = snapshot.commit.hash.slice(0, 8);
21
+ const lines = [];
22
+ lines.push(`# Belief Snapshot — as of ${snapshot.commit.date} (${short})`);
23
+ lines.push("");
24
+ lines.push(`> ${snapshot.commit.subject}`);
25
+ lines.push("");
26
+ lines.push("## The vault then");
27
+ lines.push(`- documents: **${snapshot.docCount}**`);
28
+ lines.push(`- by status: ${countLine(snapshot.byStatus)}`);
29
+ lines.push(`- by collection: ${countLine(snapshot.byCollection)}`);
30
+ lines.push("");
31
+ lines.push(`## Drift since (${short}..now)`);
32
+ const d = snapshot.drift;
33
+ lines.push(`- added: **${d.added.length}** · removed: **${d.removed.length}** · ` +
34
+ `belief transitions: **${d.transitions.length}** · bodies changed: **${d.bodiesChanged}**`);
35
+ lines.push("");
36
+ if (d.transitions.length > 0) {
37
+ lines.push("### Belief transitions");
38
+ lines.push("| doc | field | then | now |");
39
+ lines.push("|-----|-------|------|-----|");
40
+ for (const t of d.transitions.slice(0, LIST_CAP)) {
41
+ lines.push(`| ${t.path} | ${t.field} | ${t.from} | ${t.to} |`);
42
+ }
43
+ if (d.transitions.length > LIST_CAP) {
44
+ lines.push(`| …and ${d.transitions.length - LIST_CAP} more | | | |`);
45
+ }
46
+ lines.push("");
47
+ }
48
+ if (d.added.length > 0) {
49
+ lines.push("### Added since");
50
+ lines.push(...cappedList(d.added, (p) => `- ${p}`));
51
+ lines.push("");
52
+ }
53
+ if (d.removed.length > 0) {
54
+ lines.push("### Removed since");
55
+ lines.push(...cappedList(d.removed, (p) => `- ${p}`));
56
+ lines.push("");
57
+ }
58
+ const tn = snapshot.tensions;
59
+ lines.push("## Tensions");
60
+ lines.push(`- open then: **${tn.openThen}** · open now: **${tn.openNow}**`);
61
+ if (tn.openedSince.length > 0) {
62
+ lines.push(`- opened since: **${tn.openedSince.length}**`);
63
+ for (const t of tn.openedSince.slice(0, LIST_CAP)) {
64
+ lines.push(` - ${t.date} · ${t.kind} · ${t.title}`);
65
+ }
66
+ }
67
+ if (tn.resolvedSince.length > 0) {
68
+ lines.push(`- resolved since: **${tn.resolvedSince.length}**`);
69
+ for (const t of tn.resolvedSince.slice(0, LIST_CAP)) {
70
+ lines.push(` - ${t.date} · ${t.kind} · ${t.title} → ${t.resolutionKind}`);
71
+ }
72
+ }
73
+ lines.push("");
74
+ if (replay) {
75
+ lines.push(`## Counterfactual replay — ${replay.document}`);
76
+ lines.push(`Downstream of this document **as of ${snapshot.commit.date}**: ` +
77
+ `**${replay.downstreamThen.length}** documents ` +
78
+ `(primary ${replay.primaryBlast}, advisory ${replay.advisoryBlast}, ` +
79
+ `max depth ${replay.maxDepth}). ` +
80
+ `Of those, **${replay.stillCanonicalNow}** are still canonical today and ` +
81
+ `**${replay.goneNow}** are gone.`);
82
+ lines.push("");
83
+ if (replay.downstreamThen.length > 0) {
84
+ lines.push("| downstream doc (then) | dependency | distance | status now |");
85
+ lines.push("|----------------------|------------|----------|------------|");
86
+ for (const e of replay.downstreamThen.slice(0, LIST_CAP)) {
87
+ lines.push(`| ${e.path} | ${e.dependency_type} | ${e.distance} | ${e.statusNow} |`);
88
+ }
89
+ if (replay.downstreamThen.length > LIST_CAP) {
90
+ lines.push(`| …and ${replay.downstreamThen.length - LIST_CAP} more | | | |`);
91
+ }
92
+ lines.push("");
93
+ }
94
+ }
95
+ if (trajectory) {
96
+ lines.push(`## Document trajectory — ${trajectory.path}`);
97
+ lines.push("| | then | now |");
98
+ lines.push("|-|------|-----|");
99
+ const fields = ["title", "status", "confidence", "updated", "provenance"];
100
+ for (const f of fields) {
101
+ const a = trajectory.asOf ? trajectory.asOf[f] : "(absent)";
102
+ const b = trajectory.current ? trajectory.current[f] : "(gone)";
103
+ lines.push(`| ${f} | ${a} | ${b} |`);
104
+ }
105
+ lines.push("");
106
+ if (trajectory.commitsBetween.length > 0) {
107
+ lines.push(`### Commits touching it since (${trajectory.commitsBetween.length})`);
108
+ for (const c of trajectory.commitsBetween.slice(0, LIST_CAP)) {
109
+ lines.push(`- ${c.date} · ${c.hash.slice(0, 8)} · ${c.author} · ${c.subject}`);
110
+ }
111
+ lines.push("");
112
+ }
113
+ }
114
+ return `${lines.join("\n")}\n`;
115
+ }
116
+ export function renderJson(report) {
117
+ return `${JSON.stringify(report, null, 2)}\n`;
118
+ }
119
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/asof/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import { type TensionEntry } from "../curation/tension.js";
2
+ import { type BlastDependencyType } from "../curation/tension-blast.js";
3
+ import { type LoadedDoc } from "../curation/vault-docs.js";
4
+ import { type Result } from "../frontmatter/types.js";
5
+ import { type AsofCommit, type RangeCommit } from "./git-read.js";
6
+ export declare function loadDocumentsAt(vaultRoot: string, commit: string): Promise<Result<LoadedDoc[], Error>>;
7
+ export interface BeliefTransition {
8
+ path: string;
9
+ field: "status" | "confidence";
10
+ from: string;
11
+ to: string;
12
+ }
13
+ export interface AsofSnapshot {
14
+ commit: AsofCommit;
15
+ docCount: number;
16
+ byStatus: Record<string, number>;
17
+ byCollection: Record<string, number>;
18
+ drift: {
19
+ added: string[];
20
+ removed: string[];
21
+ transitions: BeliefTransition[];
22
+ bodiesChanged: number;
23
+ };
24
+ tensions: {
25
+ openThen: number;
26
+ openNow: number;
27
+ openedSince: {
28
+ title: string;
29
+ date: string;
30
+ kind: string;
31
+ }[];
32
+ resolvedSince: {
33
+ title: string;
34
+ date: string;
35
+ kind: string;
36
+ resolutionKind: string;
37
+ }[];
38
+ };
39
+ }
40
+ export declare function computeTransitions(then: LoadedDoc[], now: LoadedDoc[]): BeliefTransition[];
41
+ export declare function beliefSnapshot(vaultRoot: string, commit: AsofCommit, tensionsNow: TensionEntry[]): Promise<Result<AsofSnapshot, Error>>;
42
+ export interface ReplayEntry {
43
+ path: string;
44
+ dependency_type: BlastDependencyType;
45
+ distance: number;
46
+ statusNow: string;
47
+ }
48
+ export interface AsofReplay {
49
+ document: string;
50
+ downstreamThen: ReplayEntry[];
51
+ primaryBlast: number;
52
+ advisoryBlast: number;
53
+ maxDepth: number;
54
+ stillCanonicalNow: number;
55
+ goneNow: number;
56
+ }
57
+ export declare function counterfactualReplay(vaultRoot: string, commit: AsofCommit, document: string): Promise<Result<AsofReplay, Error>>;
58
+ export interface DocState {
59
+ title: string;
60
+ status: string;
61
+ confidence: string;
62
+ updated: string;
63
+ provenance: string;
64
+ }
65
+ export interface DocTrajectory {
66
+ path: string;
67
+ asOf: DocState | null;
68
+ current: DocState | null;
69
+ commitsBetween: RangeCommit[];
70
+ }
71
+ export declare function docTrajectory(vaultRoot: string, commit: AsofCommit, path: string): Promise<Result<DocTrajectory, Error>>;
72
+ //# sourceMappingURL=snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/asof/snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,207 @@
1
+ // Belief archaeology core — what the vault believed at a past commit, and
2
+ // how belief has drifted since.
3
+ //
4
+ // Everything here resolves by discovery: the "then" state is read from the
5
+ // git tree (the same markdown, parsed by the same parser as the live tools),
6
+ // the "now" state from the working tree, and every reported difference is a
7
+ // literal comparison between the two. Nothing is synthesized.
8
+ import { parseTensionLog } from "../curation/tension.js";
9
+ import { buildReverseLinkMap, buildReverseSourceMap, computeBlast, } from "../curation/tension-blast.js";
10
+ import { loadDocuments } from "../curation/vault-docs.js";
11
+ import { parseDocument } from "../frontmatter/parser.js";
12
+ import { err, ok } from "../frontmatter/types.js";
13
+ import { listTreeDocs, logRangeForPath, readBlobsAt, } from "./git-read.js";
14
+ const TENSIONS_LOG = ".daftari/tensions.md";
15
+ // Loads every managed document from the tree at `commit`, parsed with the
16
+ // same parser and the same skip-malformed tolerance as the live loader.
17
+ export async function loadDocumentsAt(vaultRoot, commit) {
18
+ const paths = await listTreeDocs(vaultRoot, commit);
19
+ if (!paths.ok)
20
+ return paths;
21
+ const blobs = await readBlobsAt(vaultRoot, commit, paths.value);
22
+ if (!blobs.ok)
23
+ return blobs;
24
+ const docs = [];
25
+ for (const path of paths.value) {
26
+ const raw = blobs.value.get(path);
27
+ if (raw === undefined)
28
+ continue;
29
+ const parsed = parseDocument(raw);
30
+ if (!parsed.ok)
31
+ continue;
32
+ docs.push({
33
+ path,
34
+ frontmatter: parsed.value.frontmatter,
35
+ content: parsed.value.content,
36
+ validation: parsed.value.validation,
37
+ });
38
+ }
39
+ return ok(docs);
40
+ }
41
+ function countBy(docs, key) {
42
+ const out = {};
43
+ for (const d of docs) {
44
+ const k = key(d);
45
+ out[k] = (out[k] ?? 0) + 1;
46
+ }
47
+ return out;
48
+ }
49
+ function collectionOf(d) {
50
+ return d.frontmatter.collection || (d.path.split("/")[0] ?? "");
51
+ }
52
+ function tensionIdentity(t) {
53
+ return t.id ?? `${t.date}:${t.title}`;
54
+ }
55
+ export function computeTransitions(then, now) {
56
+ const nowByPath = new Map(now.map((d) => [d.path, d]));
57
+ const transitions = [];
58
+ for (const t of then) {
59
+ const n = nowByPath.get(t.path);
60
+ if (!n)
61
+ continue;
62
+ if (t.frontmatter.status !== n.frontmatter.status) {
63
+ transitions.push({
64
+ path: t.path,
65
+ field: "status",
66
+ from: t.frontmatter.status,
67
+ to: n.frontmatter.status,
68
+ });
69
+ }
70
+ if (t.frontmatter.confidence !== n.frontmatter.confidence) {
71
+ transitions.push({
72
+ path: t.path,
73
+ field: "confidence",
74
+ from: t.frontmatter.confidence,
75
+ to: n.frontmatter.confidence,
76
+ });
77
+ }
78
+ }
79
+ transitions.sort((a, b) => a.path === b.path ? (a.field < b.field ? -1 : 1) : a.path < b.path ? -1 : 1);
80
+ return transitions;
81
+ }
82
+ // The tension log at a past commit, parsed with the live parser. A vault
83
+ // with no committed log at that point reads as zero tensions.
84
+ async function tensionsAt(vaultRoot, commit) {
85
+ const blob = await readBlobsAt(vaultRoot, commit, [TENSIONS_LOG]);
86
+ if (!blob.ok)
87
+ return [];
88
+ const raw = blob.value.get(TENSIONS_LOG);
89
+ return raw === undefined ? [] : parseTensionLog(raw);
90
+ }
91
+ export async function beliefSnapshot(vaultRoot, commit, tensionsNow) {
92
+ const thenDocs = await loadDocumentsAt(vaultRoot, commit.hash);
93
+ if (!thenDocs.ok)
94
+ return thenDocs;
95
+ const nowDocs = await loadDocuments(vaultRoot);
96
+ if (!nowDocs.ok)
97
+ return nowDocs;
98
+ const thenPaths = new Set(thenDocs.value.map((d) => d.path));
99
+ const nowPaths = new Set(nowDocs.value.map((d) => d.path));
100
+ const added = [...nowPaths].filter((p) => !thenPaths.has(p)).sort();
101
+ const removed = [...thenPaths].filter((p) => !nowPaths.has(p)).sort();
102
+ const nowByPath = new Map(nowDocs.value.map((d) => [d.path, d]));
103
+ let bodiesChanged = 0;
104
+ for (const t of thenDocs.value) {
105
+ const n = nowByPath.get(t.path);
106
+ if (n && n.content !== t.content)
107
+ bodiesChanged += 1;
108
+ }
109
+ const thenTensions = await tensionsAt(vaultRoot, commit.hash);
110
+ const thenIds = new Set(thenTensions.map(tensionIdentity));
111
+ const thenUnresolvedIds = new Set(thenTensions.filter((t) => !t.resolved).map(tensionIdentity));
112
+ const openedSince = tensionsNow
113
+ .filter((t) => !thenIds.has(tensionIdentity(t)))
114
+ .map((t) => ({ title: t.title, date: t.date, kind: t.kind }));
115
+ const resolvedSince = tensionsNow
116
+ .filter((t) => t.resolved && thenUnresolvedIds.has(tensionIdentity(t)))
117
+ .map((t) => ({
118
+ title: t.title,
119
+ date: t.date,
120
+ kind: t.kind,
121
+ resolutionKind: t.resolution?.kind ?? "",
122
+ }));
123
+ return ok({
124
+ commit,
125
+ docCount: thenDocs.value.length,
126
+ byStatus: countBy(thenDocs.value, (d) => d.frontmatter.status),
127
+ byCollection: countBy(thenDocs.value, collectionOf),
128
+ drift: {
129
+ added,
130
+ removed,
131
+ transitions: computeTransitions(thenDocs.value, nowDocs.value),
132
+ bodiesChanged,
133
+ },
134
+ tensions: {
135
+ openThen: thenTensions.filter((t) => !t.resolved).length,
136
+ openNow: tensionsNow.filter((t) => !t.resolved).length,
137
+ openedSince,
138
+ resolvedSince,
139
+ },
140
+ });
141
+ }
142
+ // "This fact turned out wrong — who had inherited it at the time, and where
143
+ // are they now?" Blast is computed over the tree AS OF the commit (the same
144
+ // source/link edge semantics as vault_tension_blast), then each downstream
145
+ // doc is annotated with its present-day status.
146
+ export async function counterfactualReplay(vaultRoot, commit, document) {
147
+ const thenDocs = await loadDocumentsAt(vaultRoot, commit.hash);
148
+ if (!thenDocs.ok)
149
+ return thenDocs;
150
+ if (!thenDocs.value.some((d) => d.path === document)) {
151
+ return err(new Error(`document not found in the vault at ${commit.hash.slice(0, 8)}: ${document}`));
152
+ }
153
+ const nowDocs = await loadDocuments(vaultRoot);
154
+ if (!nowDocs.ok)
155
+ return nowDocs;
156
+ const statusNowByPath = new Map(nowDocs.value.map((d) => [d.path, d.frontmatter.status]));
157
+ const blast = computeBlast({
158
+ seeds: [document],
159
+ reverseSource: buildReverseSourceMap(thenDocs.value),
160
+ reverseLink: buildReverseLinkMap(thenDocs.value),
161
+ });
162
+ const downstreamThen = blast.downstream.map((e) => ({
163
+ ...e,
164
+ statusNow: statusNowByPath.get(e.path) ?? "gone",
165
+ }));
166
+ return ok({
167
+ document,
168
+ downstreamThen,
169
+ primaryBlast: blast.primary_blast,
170
+ advisoryBlast: blast.advisory_blast,
171
+ maxDepth: blast.max_depth,
172
+ stillCanonicalNow: downstreamThen.filter((e) => e.statusNow === "canonical").length,
173
+ goneNow: downstreamThen.filter((e) => e.statusNow === "gone").length,
174
+ });
175
+ }
176
+ function docState(d) {
177
+ return {
178
+ title: d.frontmatter.title,
179
+ status: d.frontmatter.status,
180
+ confidence: d.frontmatter.confidence,
181
+ updated: d.frontmatter.updated,
182
+ provenance: d.frontmatter.provenance,
183
+ };
184
+ }
185
+ export async function docTrajectory(vaultRoot, commit, path) {
186
+ const thenDocs = await loadDocumentsAt(vaultRoot, commit.hash);
187
+ if (!thenDocs.ok)
188
+ return thenDocs;
189
+ const nowDocs = await loadDocuments(vaultRoot);
190
+ if (!nowDocs.ok)
191
+ return nowDocs;
192
+ const thenDoc = thenDocs.value.find((d) => d.path === path) ?? null;
193
+ const nowDoc = nowDocs.value.find((d) => d.path === path) ?? null;
194
+ if (!thenDoc && !nowDoc) {
195
+ return err(new Error(`document not found then or now: ${path}`));
196
+ }
197
+ const commits = await logRangeForPath(vaultRoot, commit.hash, path);
198
+ if (!commits.ok)
199
+ return commits;
200
+ return ok({
201
+ path,
202
+ asOf: thenDoc ? docState(thenDoc) : null,
203
+ current: nowDoc ? docState(nowDoc) : null,
204
+ commitsBetween: commits.value,
205
+ });
206
+ }
207
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/asof/snapshot.ts"],"names":[],"mappings":"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"}
@@ -78,7 +78,7 @@ export async function applyPlan(vaultRoot, scope, agent) {
78
78
  skipped.push({ path: entry.path, reason: resolved.error.message });
79
79
  continue;
80
80
  }
81
- const existing = await readFile(resolved.value);
81
+ const existing = await readFile(resolved.value.absPath);
82
82
  if (!existing.ok) {
83
83
  skipped.push({ path: entry.path, reason: existing.error.message });
84
84
  continue;
@@ -94,7 +94,7 @@ export async function applyPlan(vaultRoot, scope, agent) {
94
94
  continue;
95
95
  }
96
96
  try {
97
- await writeFile(resolved.value, rendered.value, "utf-8");
97
+ await writeFile(resolved.value.absPath, rendered.value, "utf-8");
98
98
  }
99
99
  catch (e) {
100
100
  const reason = e instanceof Error ? e.message : String(e);