@isaacriehm/cairn-state 0.22.5

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 (94) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +11 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/alignment-pending.d.ts +28 -0
  5. package/dist/alignment-pending.js +83 -0
  6. package/dist/alignment-pending.js.map +1 -0
  7. package/dist/anchor-map.d.ts +14 -0
  8. package/dist/anchor-map.js +56 -0
  9. package/dist/anchor-map.js.map +1 -0
  10. package/dist/archive.d.ts +48 -0
  11. package/dist/archive.js +96 -0
  12. package/dist/archive.js.map +1 -0
  13. package/dist/cache.d.ts +48 -0
  14. package/dist/cache.js +241 -0
  15. package/dist/cache.js.map +1 -0
  16. package/dist/component-registry.d.ts +93 -0
  17. package/dist/component-registry.js +0 -0
  18. package/dist/component-registry.js.map +1 -0
  19. package/dist/components.d.ts +192 -0
  20. package/dist/components.js +603 -0
  21. package/dist/components.js.map +1 -0
  22. package/dist/config.d.ts +9 -0
  23. package/dist/config.js +26 -0
  24. package/dist/config.js.map +1 -0
  25. package/dist/drift.d.ts +8 -0
  26. package/dist/drift.js +23 -0
  27. package/dist/drift.js.map +1 -0
  28. package/dist/file-candidates-map.d.ts +23 -0
  29. package/dist/file-candidates-map.js +76 -0
  30. package/dist/file-candidates-map.js.map +1 -0
  31. package/dist/frontmatter.d.ts +32 -0
  32. package/dist/frontmatter.js +77 -0
  33. package/dist/frontmatter.js.map +1 -0
  34. package/dist/fs.d.ts +36 -0
  35. package/dist/fs.js +47 -0
  36. package/dist/fs.js.map +1 -0
  37. package/dist/glob.d.ts +10 -0
  38. package/dist/glob.js +46 -0
  39. package/dist/glob.js.map +1 -0
  40. package/dist/home.d.ts +69 -0
  41. package/dist/home.js +168 -0
  42. package/dist/home.js.map +1 -0
  43. package/dist/index.d.ts +29 -0
  44. package/dist/index.js +30 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/languages.d.ts +113 -0
  47. package/dist/languages.js +512 -0
  48. package/dist/languages.js.map +1 -0
  49. package/dist/ledgers.d.ts +14 -0
  50. package/dist/ledgers.js +105 -0
  51. package/dist/ledgers.js.map +1 -0
  52. package/dist/logger.d.ts +13 -0
  53. package/dist/logger.js +17 -0
  54. package/dist/logger.js.map +1 -0
  55. package/dist/manifest.d.ts +10 -0
  56. package/dist/manifest.js +84 -0
  57. package/dist/manifest.js.map +1 -0
  58. package/dist/missions.d.ts +119 -0
  59. package/dist/missions.js +414 -0
  60. package/dist/missions.js.map +1 -0
  61. package/dist/paths.d.ts +117 -0
  62. package/dist/paths.js +241 -0
  63. package/dist/paths.js.map +1 -0
  64. package/dist/quality-grades.d.ts +11 -0
  65. package/dist/quality-grades.js +100 -0
  66. package/dist/quality-grades.js.map +1 -0
  67. package/dist/rejected.d.ts +42 -0
  68. package/dist/rejected.js +100 -0
  69. package/dist/rejected.js.map +1 -0
  70. package/dist/schemas.d.ts +789 -0
  71. package/dist/schemas.js +506 -0
  72. package/dist/schemas.js.map +1 -0
  73. package/dist/scope-index.d.ts +96 -0
  74. package/dist/scope-index.js +299 -0
  75. package/dist/scope-index.js.map +1 -0
  76. package/dist/slug.d.ts +81 -0
  77. package/dist/slug.js +138 -0
  78. package/dist/slug.js.map +1 -0
  79. package/dist/sot-bindings.d.ts +14 -0
  80. package/dist/sot-bindings.js +79 -0
  81. package/dist/sot-bindings.js.map +1 -0
  82. package/dist/sot-cache.d.ts +18 -0
  83. package/dist/sot-cache.js +62 -0
  84. package/dist/sot-cache.js.map +1 -0
  85. package/dist/text.d.ts +27 -0
  86. package/dist/text.js +63 -0
  87. package/dist/text.js.map +1 -0
  88. package/dist/topic-index.d.ts +27 -0
  89. package/dist/topic-index.js +82 -0
  90. package/dist/topic-index.js.map +1 -0
  91. package/dist/walk.d.ts +7 -0
  92. package/dist/walk.js +34 -0
  93. package/dist/walk.js.map +1 -0
  94. package/package.json +35 -0
@@ -0,0 +1,100 @@
1
+ /**
2
+ * `.cairn/ground/_rejected.yaml` — slug-keyed ledger of topic-index
3
+ * entries the operator (or AI curator) has marked as not-a-decision.
4
+ *
5
+ * Phase 6 / `cairn ingest` skip any slug present here. The PR 2
6
+ * `cairn_propose_decision` MCP tool refuses rejected slugs with
7
+ * `{ ok: false, reason: "rejected" }`. Phase 5b's GC pass at the end
8
+ * of `buildTopicIndex` drops any entry whose slug is no longer in the
9
+ * freshly-built topic-index — so rotating docs / deleted markdown
10
+ * files don't accumulate dead rejection records.
11
+ *
12
+ * Dedup: first writer wins the `reason`; subsequent writes for the
13
+ * same slug only refresh `rejected_at`.
14
+ */
15
+ import { existsSync, readFileSync } from "node:fs";
16
+ import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
17
+ import { writeFileSafe } from "./fs.js";
18
+ import { getLogger } from "./logger.js";
19
+ import { rejectedYamlPath } from "./paths.js";
20
+ import { RejectedYaml } from "./schemas.js";
21
+ const log = getLogger();
22
+ export function emptyRejectedYaml() {
23
+ return { version: 1, generated: new Date().toISOString(), rejected: [] };
24
+ }
25
+ /**
26
+ * Read `_rejected.yaml` and return a slug-keyed Map for O(1) lookups.
27
+ * Missing file → empty Map. Malformed file → empty Map + warn (the
28
+ * sensor surface treats this as a deliberate clean slate rather than
29
+ * an error so the operator can recover by deleting the file).
30
+ */
31
+ export function readRejectedYaml(repoRoot) {
32
+ const path = rejectedYamlPath(repoRoot);
33
+ if (!existsSync(path))
34
+ return new Map();
35
+ let parsed;
36
+ try {
37
+ parsed = parseYaml(readFileSync(path, "utf8"));
38
+ }
39
+ catch (err) {
40
+ log.warn({ path, err }, "_rejected.yaml read failed; treating as empty");
41
+ return new Map();
42
+ }
43
+ const result = RejectedYaml.safeParse(parsed);
44
+ if (!result.success) {
45
+ log.warn({ path, error: result.error.message }, "_rejected.yaml invalid; treating as empty");
46
+ return new Map();
47
+ }
48
+ const out = new Map();
49
+ for (const entry of result.data.rejected)
50
+ out.set(entry.slug, entry);
51
+ return out;
52
+ }
53
+ /**
54
+ * Persist a slug-keyed Map to `_rejected.yaml`. Rebuilds `generated`.
55
+ * Sorted by slug for stable diffs.
56
+ */
57
+ export function writeRejectedYaml(repoRoot, rejected) {
58
+ const path = rejectedYamlPath(repoRoot);
59
+ const sortedSlugs = [...rejected.keys()].sort();
60
+ const next = {
61
+ version: 1,
62
+ generated: new Date().toISOString(),
63
+ rejected: sortedSlugs.map((s) => rejected.get(s)),
64
+ };
65
+ writeFileSafe(path, stringifyYaml(next));
66
+ log.debug({ path, count: next.rejected.length }, "wrote _rejected.yaml");
67
+ return path;
68
+ }
69
+ /**
70
+ * Append (or refresh) a rejection record. Dedup by slug — first writer
71
+ * wins the `reason` string; subsequent writes update `rejected_at`
72
+ * only. Returns the merged Map without persisting; callers handle the
73
+ * write so concurrent paths can batch under a single lock.
74
+ */
75
+ export function appendRejected(current, entry) {
76
+ const next = new Map(current);
77
+ const existing = next.get(entry.slug);
78
+ if (existing === undefined) {
79
+ next.set(entry.slug, entry);
80
+ }
81
+ else {
82
+ next.set(entry.slug, { ...existing, rejected_at: entry.rejected_at });
83
+ }
84
+ return next;
85
+ }
86
+ /**
87
+ * Garbage-collect rejection records whose slug is no longer present in
88
+ * the freshly-built topic-index. Phase 5b runs this at the end of
89
+ * `buildTopicIndex` so the index-builder owns rejection lifecycle —
90
+ * keeps the sensor surface clean as docs rotate.
91
+ */
92
+ export function gcRejectedYaml(rejected, liveSlugs) {
93
+ const next = new Map();
94
+ for (const [slug, entry] of rejected.entries()) {
95
+ if (liveSlugs.has(slug))
96
+ next.set(slug, entry);
97
+ }
98
+ return next;
99
+ }
100
+ //# sourceMappingURL=rejected.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rejected.js","sourceRoot":"","sources":["../src/rejected.ts"],"names":[],"mappings":"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"}