grounder 0.4.0 → 0.6.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 (221) hide show
  1. package/README.md +150 -271
  2. package/dist/agents/claude.d.ts +4 -4
  3. package/dist/agents/claude.d.ts.map +1 -1
  4. package/dist/agents/claude.js +158 -178
  5. package/dist/agents/claude.js.map +1 -1
  6. package/dist/agents/cursor.d.ts +3 -3
  7. package/dist/agents/cursor.d.ts.map +1 -1
  8. package/dist/agents/cursor.js +97 -143
  9. package/dist/agents/cursor.js.map +1 -1
  10. package/dist/agents/home-skills.d.ts +46 -0
  11. package/dist/agents/home-skills.d.ts.map +1 -0
  12. package/dist/agents/home-skills.js +83 -0
  13. package/dist/agents/home-skills.js.map +1 -0
  14. package/dist/agents/hook-fragment.d.ts +52 -0
  15. package/dist/agents/hook-fragment.d.ts.map +1 -0
  16. package/dist/agents/hook-fragment.js +76 -0
  17. package/dist/agents/hook-fragment.js.map +1 -0
  18. package/dist/agents/hook-install.d.ts +62 -0
  19. package/dist/agents/hook-install.d.ts.map +1 -0
  20. package/dist/agents/hook-install.js +74 -0
  21. package/dist/agents/hook-install.js.map +1 -0
  22. package/dist/agents/hook-runtime.d.ts +80 -13
  23. package/dist/agents/hook-runtime.d.ts.map +1 -1
  24. package/dist/agents/hook-runtime.js +278 -74
  25. package/dist/agents/hook-runtime.js.map +1 -1
  26. package/dist/agents/index.d.ts +8 -14
  27. package/dist/agents/index.d.ts.map +1 -1
  28. package/dist/agents/index.js +13 -19
  29. package/dist/agents/index.js.map +1 -1
  30. package/dist/agents/types.d.ts +56 -16
  31. package/dist/agents/types.d.ts.map +1 -1
  32. package/dist/cli.js +15 -10
  33. package/dist/cli.js.map +1 -1
  34. package/dist/commands/apply.d.ts +69 -0
  35. package/dist/commands/apply.d.ts.map +1 -0
  36. package/dist/commands/apply.js +238 -0
  37. package/dist/commands/apply.js.map +1 -0
  38. package/dist/commands/doctor.d.ts.map +1 -1
  39. package/dist/commands/doctor.js +197 -101
  40. package/dist/commands/doctor.js.map +1 -1
  41. package/dist/commands/handoff/list.d.ts +23 -13
  42. package/dist/commands/handoff/list.d.ts.map +1 -1
  43. package/dist/commands/handoff/list.js +28 -16
  44. package/dist/commands/handoff/list.js.map +1 -1
  45. package/dist/commands/handoff/peek.d.ts +1 -1
  46. package/dist/commands/handoff/peek.d.ts.map +1 -1
  47. package/dist/commands/handoff/peek.js +28 -12
  48. package/dist/commands/handoff/peek.js.map +1 -1
  49. package/dist/commands/handoff.d.ts +2 -0
  50. package/dist/commands/handoff.d.ts.map +1 -1
  51. package/dist/commands/handoff.js +10 -1
  52. package/dist/commands/handoff.js.map +1 -1
  53. package/dist/commands/install-drift.d.ts +34 -0
  54. package/dist/commands/install-drift.d.ts.map +1 -0
  55. package/dist/commands/install-drift.js +72 -0
  56. package/dist/commands/install-drift.js.map +1 -0
  57. package/dist/commands/link.d.ts +12 -0
  58. package/dist/commands/link.d.ts.map +1 -0
  59. package/dist/commands/{repo/init.js → link.js} +35 -27
  60. package/dist/commands/link.js.map +1 -0
  61. package/dist/commands/migrate.d.ts +11 -3
  62. package/dist/commands/migrate.d.ts.map +1 -1
  63. package/dist/commands/migrate.js +66 -34
  64. package/dist/commands/migrate.js.map +1 -1
  65. package/dist/commands/note/list.d.ts +17 -9
  66. package/dist/commands/note/list.d.ts.map +1 -1
  67. package/dist/commands/note/list.js +19 -14
  68. package/dist/commands/note/list.js.map +1 -1
  69. package/dist/commands/note.d.ts +2 -0
  70. package/dist/commands/note.d.ts.map +1 -1
  71. package/dist/commands/note.js +10 -1
  72. package/dist/commands/note.js.map +1 -1
  73. package/dist/commands/output.d.ts +22 -2
  74. package/dist/commands/output.d.ts.map +1 -1
  75. package/dist/commands/output.js +18 -6
  76. package/dist/commands/output.js.map +1 -1
  77. package/dist/commands/overview.d.ts +33 -0
  78. package/dist/commands/overview.d.ts.map +1 -0
  79. package/dist/commands/overview.js +150 -0
  80. package/dist/commands/overview.js.map +1 -0
  81. package/dist/commands/plan/list.d.ts +20 -12
  82. package/dist/commands/plan/list.d.ts.map +1 -1
  83. package/dist/commands/plan/list.js +22 -17
  84. package/dist/commands/plan/list.js.map +1 -1
  85. package/dist/commands/plan.d.ts +2 -0
  86. package/dist/commands/plan.d.ts.map +1 -1
  87. package/dist/commands/plan.js +12 -2
  88. package/dist/commands/plan.js.map +1 -1
  89. package/dist/commands/render-artifact-table.d.ts +85 -0
  90. package/dist/commands/render-artifact-table.d.ts.map +1 -0
  91. package/dist/commands/render-artifact-table.js +232 -0
  92. package/dist/commands/render-artifact-table.js.map +1 -0
  93. package/dist/commands/require-linked.js +2 -2
  94. package/dist/commands/require-linked.js.map +1 -1
  95. package/dist/commands/search.d.ts +23 -0
  96. package/dist/commands/search.d.ts.map +1 -0
  97. package/dist/commands/search.js +288 -0
  98. package/dist/commands/search.js.map +1 -0
  99. package/dist/commands/{vault/init.d.ts → setup.d.ts} +5 -4
  100. package/dist/commands/setup.d.ts.map +1 -0
  101. package/dist/commands/setup.js +210 -0
  102. package/dist/commands/setup.js.map +1 -0
  103. package/dist/commands/status.d.ts +7 -0
  104. package/dist/commands/status.d.ts.map +1 -1
  105. package/dist/commands/status.js +273 -83
  106. package/dist/commands/status.js.map +1 -1
  107. package/dist/commands/upgrade-banner.d.ts +2 -2
  108. package/dist/commands/upgrade-banner.js +2 -2
  109. package/dist/connector/home.d.ts +12 -0
  110. package/dist/connector/home.d.ts.map +1 -1
  111. package/dist/connector/home.js +26 -2
  112. package/dist/connector/home.js.map +1 -1
  113. package/dist/connector/ledger-migrations.d.ts +55 -0
  114. package/dist/connector/ledger-migrations.d.ts.map +1 -0
  115. package/dist/connector/ledger-migrations.js +94 -0
  116. package/dist/connector/ledger-migrations.js.map +1 -0
  117. package/dist/connector/state.d.ts +97 -60
  118. package/dist/connector/state.d.ts.map +1 -1
  119. package/dist/connector/state.js +165 -107
  120. package/dist/connector/state.js.map +1 -1
  121. package/dist/connector/vault.d.ts +2 -0
  122. package/dist/connector/vault.d.ts.map +1 -1
  123. package/dist/connector/vault.js +6 -1
  124. package/dist/connector/vault.js.map +1 -1
  125. package/dist/help.d.ts +3 -3
  126. package/dist/help.d.ts.map +1 -1
  127. package/dist/help.js +97 -56
  128. package/dist/help.js.map +1 -1
  129. package/dist/reconcile/apply.d.ts +31 -0
  130. package/dist/reconcile/apply.d.ts.map +1 -0
  131. package/dist/reconcile/apply.js +97 -0
  132. package/dist/reconcile/apply.js.map +1 -0
  133. package/dist/reconcile/core.d.ts +82 -0
  134. package/dist/reconcile/core.d.ts.map +1 -0
  135. package/dist/reconcile/core.js +163 -0
  136. package/dist/reconcile/core.js.map +1 -0
  137. package/dist/reconcile/disk.d.ts +13 -0
  138. package/dist/reconcile/disk.d.ts.map +1 -0
  139. package/dist/reconcile/disk.js +28 -0
  140. package/dist/reconcile/disk.js.map +1 -0
  141. package/dist/util/frontmatter.d.ts +9 -7
  142. package/dist/util/frontmatter.d.ts.map +1 -1
  143. package/dist/util/frontmatter.js +29 -4
  144. package/dist/util/frontmatter.js.map +1 -1
  145. package/dist/util/fs.d.ts +14 -0
  146. package/dist/util/fs.d.ts.map +1 -1
  147. package/dist/util/fs.js +27 -1
  148. package/dist/util/fs.js.map +1 -1
  149. package/dist/util/merge-json.d.ts +13 -2
  150. package/dist/util/merge-json.d.ts.map +1 -1
  151. package/dist/util/merge-json.js +24 -10
  152. package/dist/util/merge-json.js.map +1 -1
  153. package/dist/util/path.d.ts +23 -0
  154. package/dist/util/path.d.ts.map +1 -1
  155. package/dist/util/path.js +39 -0
  156. package/dist/util/path.js.map +1 -1
  157. package/dist/vault/list-handoffs.d.ts +14 -2
  158. package/dist/vault/list-handoffs.d.ts.map +1 -1
  159. package/dist/vault/list-handoffs.js +40 -23
  160. package/dist/vault/list-handoffs.js.map +1 -1
  161. package/dist/vault/list-markdown.d.ts +8 -0
  162. package/dist/vault/list-markdown.d.ts.map +1 -0
  163. package/dist/vault/list-markdown.js +35 -0
  164. package/dist/vault/list-markdown.js.map +1 -0
  165. package/dist/vault/list-notes.d.ts +15 -6
  166. package/dist/vault/list-notes.d.ts.map +1 -1
  167. package/dist/vault/list-notes.js +23 -27
  168. package/dist/vault/list-notes.js.map +1 -1
  169. package/dist/vault/list-plans.d.ts +12 -3
  170. package/dist/vault/list-plans.d.ts.map +1 -1
  171. package/dist/vault/list-plans.js +20 -24
  172. package/dist/vault/list-plans.js.map +1 -1
  173. package/dist/vault/search.d.ts +55 -0
  174. package/dist/vault/search.d.ts.map +1 -0
  175. package/dist/vault/search.js +432 -0
  176. package/dist/vault/search.js.map +1 -0
  177. package/dist/vault/write-handoff.d.ts +2 -0
  178. package/dist/vault/write-handoff.d.ts.map +1 -1
  179. package/dist/vault/write-handoff.js +5 -0
  180. package/dist/vault/write-handoff.js.map +1 -1
  181. package/dist/vault/write-note.d.ts +2 -0
  182. package/dist/vault/write-note.d.ts.map +1 -1
  183. package/dist/vault/write-note.js +9 -1
  184. package/dist/vault/write-note.js.map +1 -1
  185. package/dist/vault/write-plan.d.ts +4 -0
  186. package/dist/vault/write-plan.d.ts.map +1 -1
  187. package/dist/vault/write-plan.js +14 -1
  188. package/dist/vault/write-plan.js.map +1 -1
  189. package/package.json +11 -4
  190. package/templates/agents/claude/skills/grounder-handoff/SKILL.md +73 -0
  191. package/templates/agents/claude/{commands/grounder-note.md → skills/grounder-note/SKILL.md} +12 -2
  192. package/templates/agents/claude/skills/grounder-overview/SKILL.md +21 -0
  193. package/templates/agents/claude/{commands/grounder-plan.md → skills/grounder-plan/SKILL.md} +13 -5
  194. package/templates/agents/claude/skills/grounder-recall/SKILL.md +34 -0
  195. package/templates/agents/claude/skills/grounder-search/SKILL.md +152 -0
  196. package/templates/agents/cursor/skills/grounder-handoff/SKILL.md +73 -0
  197. package/templates/agents/cursor/{commands/grounder-note.md → skills/grounder-note/SKILL.md} +12 -2
  198. package/templates/agents/cursor/skills/grounder-overview/SKILL.md +21 -0
  199. package/templates/agents/cursor/{commands/grounder-plan.md → skills/grounder-plan/SKILL.md} +13 -5
  200. package/templates/agents/cursor/skills/grounder-recall/SKILL.md +34 -0
  201. package/templates/agents/cursor/skills/grounder-search/SKILL.md +152 -0
  202. package/templates/vault/plan.md +1 -1
  203. package/templates/vault/session-handoff.md +2 -1
  204. package/dist/agents/install-command.d.ts +0 -35
  205. package/dist/agents/install-command.d.ts.map +0 -1
  206. package/dist/agents/install-command.js +0 -65
  207. package/dist/agents/install-command.js.map +0 -1
  208. package/dist/commands/apply-agent-installs.d.ts +0 -34
  209. package/dist/commands/apply-agent-installs.d.ts.map +0 -1
  210. package/dist/commands/apply-agent-installs.js +0 -137
  211. package/dist/commands/apply-agent-installs.js.map +0 -1
  212. package/dist/commands/repo/init.d.ts +0 -11
  213. package/dist/commands/repo/init.d.ts.map +0 -1
  214. package/dist/commands/repo/init.js.map +0 -1
  215. package/dist/commands/vault/init.d.ts.map +0 -1
  216. package/dist/commands/vault/init.js +0 -90
  217. package/dist/commands/vault/init.js.map +0 -1
  218. package/templates/agents/claude/commands/grounder-task-handoff.md +0 -54
  219. package/templates/agents/claude/commands/grounder-task.md +0 -22
  220. package/templates/agents/cursor/commands/grounder-task-handoff.md +0 -54
  221. package/templates/agents/cursor/commands/grounder-task.md +0 -22
@@ -1,14 +1,27 @@
1
- import { mkdir, readFile, writeFile } from "node:fs/promises";
1
+ import { readFile } from "node:fs/promises";
2
2
  import path from "node:path";
3
- import { fileExists } from "../util/fs.js";
3
+ import { fileExists, writeFileAtomic } from "../util/fs.js";
4
+ import { packageVersionRelation } from "../util/semver.js";
4
5
  import { resolveHomeDir } from "./home.js";
6
+ import { applyLedgerUpgrades, LEDGER_SCHEMA, MIN_SUPPORTED_LEDGER_SCHEMA, } from "./ledger-migrations.js";
5
7
  import { UnsupportedSchemaError } from "./unsupported-schema.js";
8
+ export { LEDGER_SCHEMA, MIN_SUPPORTED_LEDGER_SCHEMA } from "./ledger-migrations.js";
6
9
  export function statePath(homeDir) {
7
10
  return path.join(resolveHomeDir(homeDir), ".grounder", "state.json");
8
11
  }
9
12
  /**
10
13
  * Read `~/.grounder/state.json`. Missing file → `null` (legacy / pre-ledger
11
- * install callers should treat missing agent entries as schema 0).
14
+ * install). A `ledgerSchema` older than current (only v0.5.0's real shape
15
+ * `commandsSchema`/`hooksSchema`, no `ledgerSchema` field — has ever existed
16
+ * on disk) is upgraded to the current shape in memory only; disk is untouched
17
+ * until a real ledger write (`setup`/`migrate`/`setLedgerFileHash`/etc).
18
+ * `status`, `doctor`, and `handoff peek` must never write `state.json` as a
19
+ * side effect of reading it.
20
+ *
21
+ * The gate runs immediately after `JSON.parse`, ahead of the
22
+ * `grounderVersion`/`agents` validation below: a schema-2 file that
23
+ * restructures `agents` must report "upgrade grounder", not "missing
24
+ * agents — fix or remove it".
12
25
  */
13
26
  export async function readGrounderState(homeDir) {
14
27
  const filePath = statePath(homeDir);
@@ -23,149 +36,194 @@ export async function readGrounderState(homeDir) {
23
36
  const detail = error instanceof Error ? error.message : String(error);
24
37
  throw new Error(`Invalid grounder state at ${filePath}: ${detail}. Fix or remove it, then run: grounder migrate --force`);
25
38
  }
26
- if (typeof raw.grounderVersion !== "string" || raw.grounderVersion.length === 0) {
39
+ if (raw === null || typeof raw !== "object" || Array.isArray(raw)) {
40
+ // Same "missing grounderVersion" message a non-object payload already
41
+ // gets further down (`raw.grounderVersion` on a boxed number/string
42
+ // reads as `undefined`, not a throw) — `null` is the one JSON value
43
+ // whose property access throws before reaching that check, so it's
44
+ // guarded here explicitly rather than falling through.
45
+ throw new Error(`Invalid grounder state at ${filePath}: missing grounderVersion. Fix or remove it, then run: grounder migrate --force`);
46
+ }
47
+ let ledgerSchema;
48
+ if (raw.ledgerSchema === undefined) {
49
+ ledgerSchema = 0;
50
+ }
51
+ else if (typeof raw.ledgerSchema === "number" && Number.isInteger(raw.ledgerSchema)) {
52
+ ledgerSchema = raw.ledgerSchema;
53
+ }
54
+ else {
55
+ // Deliberate tightening, not preserved behavior: previously a non-number
56
+ // silently became `0`.
57
+ throw new Error(`Invalid grounder state at ${filePath}: ledgerSchema must be an integer. Fix or remove it, then run: grounder migrate --force`);
58
+ }
59
+ if (ledgerSchema > LEDGER_SCHEMA) {
60
+ throw new UnsupportedSchemaError(`${filePath} requires ledger schema ${ledgerSchema}; this grounder supports ${LEDGER_SCHEMA}. Upgrade grounder.`);
61
+ }
62
+ if (ledgerSchema < MIN_SUPPORTED_LEDGER_SCHEMA) {
63
+ throw new Error(`Invalid grounder state at ${filePath}: ledger schema ${ledgerSchema} is older than this grounder supports (minimum ${MIN_SUPPORTED_LEDGER_SCHEMA}). Fix or remove it, then run: grounder migrate --force`);
64
+ }
65
+ const upgraded = applyLedgerUpgrades(raw, ledgerSchema);
66
+ if (typeof upgraded.grounderVersion !== "string" || upgraded.grounderVersion.length === 0) {
27
67
  throw new Error(`Invalid grounder state at ${filePath}: missing grounderVersion. Fix or remove it, then run: grounder migrate --force`);
28
68
  }
29
- if (raw.agents === null || typeof raw.agents !== "object" || Array.isArray(raw.agents)) {
69
+ if (upgraded.agents === null ||
70
+ typeof upgraded.agents !== "object" ||
71
+ Array.isArray(upgraded.agents)) {
30
72
  throw new Error(`Invalid grounder state at ${filePath}: missing agents`);
31
73
  }
74
+ // Explicit field-by-field construction (not a spread of `upgraded`'s agent
75
+ // entries) so an upgraded-but-unknown key can never round-trip back to disk
76
+ // through `withUpdatedAgent`'s `...existing.agents` spread.
32
77
  const agents = {};
33
- for (const [id, entry] of Object.entries(raw.agents)) {
78
+ for (const [id, entry] of Object.entries(upgraded.agents)) {
34
79
  if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
35
80
  throw new Error(`Invalid grounder state at ${filePath}: bad agent entry "${id}"`);
36
81
  }
37
- const commandsSchema = entry.commandsSchema;
38
- if (typeof commandsSchema !== "number" || !Number.isInteger(commandsSchema)) {
39
- throw new Error(`Invalid grounder state at ${filePath}: agent "${id}" missing commandsSchema`);
82
+ const e = entry;
83
+ const filesRaw = e.files;
84
+ // Drop, rather than cast through, any file entry whose `hash` isn't a
85
+ // string — a corrupted or hand-edited `{ hash: 123 }` / `{}` entry would
86
+ // otherwise persist forever via `withUpdatedAgent`'s `...prev.files`
87
+ // spread and compare unequal to every real hash anyway.
88
+ const files = {};
89
+ if (filesRaw && typeof filesRaw === "object" && !Array.isArray(filesRaw)) {
90
+ for (const [entryPath, fileEntry] of Object.entries(filesRaw)) {
91
+ const hash = fileEntry?.hash;
92
+ if (typeof hash === "string") {
93
+ files[entryPath] = { hash };
94
+ }
95
+ }
40
96
  }
41
- const hooksSchema = entry.hooksSchema;
42
- if (hooksSchema !== undefined &&
43
- (typeof hooksSchema !== "number" || !Number.isInteger(hooksSchema))) {
44
- throw new Error(`Invalid grounder state at ${filePath}: agent "${id}" has invalid hooksSchema`);
45
- }
46
- const filesRaw = entry.files;
47
- const files = filesRaw && typeof filesRaw === "object" && !Array.isArray(filesRaw) ? { ...filesRaw } : {};
97
+ const hooksEnabled = typeof e.hooksEnabled === "boolean" ? e.hooksEnabled : undefined;
98
+ // Empty string treated as missing, not as a real (empty) override a
99
+ // hand-edited `"lastInvocation": ""` would otherwise pass `?? ` in
100
+ // `desiredArtifacts()`'s override check and render with no interpreter
101
+ // baked in at all.
102
+ const lastInvocation = typeof e.lastInvocation === "string" && e.lastInvocation.length > 0
103
+ ? e.lastInvocation
104
+ : undefined;
48
105
  agents[id] = {
49
- commandsSchema,
50
- ...(hooksSchema !== undefined ? { hooksSchema } : {}),
51
106
  files,
107
+ ...(hooksEnabled !== undefined ? { hooksEnabled } : {}),
108
+ ...(lastInvocation !== undefined ? { lastInvocation } : {}),
52
109
  };
53
110
  }
54
- return { grounderVersion: raw.grounderVersion, agents };
111
+ return { ledgerSchema: LEDGER_SCHEMA, grounderVersion: upgraded.grounderVersion, agents };
55
112
  }
113
+ /** Atomic write — tmp file + rename, so a crash mid-write never leaves a truncated ledger. */
56
114
  export async function writeGrounderState(state, homeDir) {
57
- const filePath = statePath(homeDir);
58
- await mkdir(path.dirname(filePath), { recursive: true });
59
- await writeFile(filePath, `${JSON.stringify(state, null, 2)}\n`, "utf8");
115
+ await writeFileAtomic(statePath(homeDir), `${JSON.stringify(state, null, 2)}\n`);
60
116
  }
61
- /** Recorded commands schema for an agent, or `0` when missing (legacy). */
62
- export function recordedCommandsSchema(state, agentId) {
63
- return state?.agents[agentId]?.commandsSchema ?? 0;
117
+ /** Last-recorded content hash for a managed file, or `undefined` if unknown. */
118
+ export function recordedFileHash(state, agentId, filePath) {
119
+ return state?.agents[agentId]?.files[filePath]?.hash;
64
120
  }
65
- /** Hooks version stored for an agent, or `0` if missing (never stored / never installed). */
66
- export function recordedHooksSchema(state, agentId) {
67
- return state?.agents[agentId]?.hooksSchema ?? 0;
121
+ /** One agent's last-applied manifest, or `undefined` when this agent has no ledger entry at all. */
122
+ export function ledgerFilesFor(state, agentId) {
123
+ return state?.agents[agentId]?.files;
68
124
  }
69
- /**
70
- * Merge one agent's install info into `~/.grounder/state.json`. Creates the
71
- * file when missing. Keeps other agents and merges any provided `files` over
72
- * this agent's existing map.
73
- */
74
- export async function recordAgentInstall(opts) {
75
- const existing = await readGrounderState(opts.homeDir);
76
- const prev = existing?.agents[opts.agentId];
77
- const nextEntry = {
78
- commandsSchema: opts.commandsSchema !== undefined ? opts.commandsSchema : (prev?.commandsSchema ?? 0),
79
- files: {
80
- ...(prev?.files ? { ...prev.files } : {}),
81
- ...(opts.files ?? {}),
82
- },
83
- };
84
- if (opts.hooksSchema !== undefined) {
85
- nextEntry.hooksSchema = opts.hooksSchema;
86
- }
87
- else if (prev?.hooksSchema !== undefined) {
88
- nextEntry.hooksSchema = prev.hooksSchema;
89
- }
90
- const next = {
91
- grounderVersion: opts.grounderVersion,
125
+ /** Tri-state hooks intent for an agent: `undefined` (never recorded) / `true` / `false`. */
126
+ export function recordedHooksEnabled(state, agentId) {
127
+ return state?.agents[agentId]?.hooksEnabled;
128
+ }
129
+ /** The `{{GROUNDER_CLI}}` invocation used at this agent's last real install, or `undefined`. */
130
+ export function recordedInvocation(state, agentId) {
131
+ return state?.agents[agentId]?.lastInvocation;
132
+ }
133
+ function withUpdatedAgent(existing, agentId, updateEntry, grounderVersion) {
134
+ const prevAgent = existing?.agents[agentId] ?? { files: {} };
135
+ return {
136
+ ledgerSchema: LEDGER_SCHEMA,
137
+ grounderVersion,
92
138
  agents: {
93
139
  ...(existing?.agents ?? {}),
94
- [opts.agentId]: nextEntry,
140
+ [agentId]: updateEntry(prevAgent),
95
141
  },
96
142
  };
143
+ }
144
+ /**
145
+ * Persist one file's hash for one agent, right after that file's own write
146
+ * succeeds — per-artifact, not batched, so a mid-run crash leaves the ledger
147
+ * consistent with whatever actually completed. No-op if already current.
148
+ */
149
+ export async function setLedgerFileHash(opts) {
150
+ const existing = await readGrounderState(opts.homeDir);
151
+ if (existing?.agents[opts.agentId]?.files[opts.filePath]?.hash === opts.hash) {
152
+ return;
153
+ }
154
+ const next = withUpdatedAgent(existing, opts.agentId, (prev) => ({ ...prev, files: { ...prev.files, [opts.filePath]: { hash: opts.hash } } }), opts.grounderVersion);
97
155
  await writeGrounderState(next, opts.homeDir);
98
- return next;
99
156
  }
100
157
  /**
101
- * True when `state.json` says this machine's install is behind what this
102
- * Grounder version expects. Used by peek/status they only read `state.json`,
103
- * they do not look at Cursor/Claude files on disk.
104
- *
105
- * If there is no state file, returns false (callers handle that separately).
106
- * Only agents listed in state are checked.
107
- *
108
- * Session hooks: if an agent has no `hooksSchema` in state, that means hooks
109
- * were never turned on for them. That is not "behind" — otherwise peek would
110
- * keep telling people who never enabled hooks to run migrate. Doctor verifies
111
- * on-disk command/hook drift via migrate dry-run, and also warns when files
112
- * already match but these ledger schema numbers still lag.
158
+ * Drop one path's ledger entry for a file deleted outright (tombstone
159
+ * retirement), where there is no new hash to overwrite it with. No-op when
160
+ * there's no state, no such agent, or no recorded entry for that path.
113
161
  */
114
- export function isInstallSchemaStale(state, agents) {
115
- if (!state) {
116
- return false;
162
+ export async function forgetLedgerFile(opts) {
163
+ const existing = await readGrounderState(opts.homeDir);
164
+ const prevAgent = existing?.agents[opts.agentId];
165
+ if (!existing || !prevAgent || !(opts.filePath in prevAgent.files)) {
166
+ return;
117
167
  }
118
- for (const agent of agents) {
119
- const entry = state.agents[agent.id];
120
- if (!entry) {
121
- continue;
122
- }
123
- if (entry.commandsSchema < agent.commandsSchema) {
124
- return true;
125
- }
126
- if (agent.hooksSchema !== undefined &&
127
- entry.hooksSchema !== undefined &&
128
- entry.hooksSchema < agent.hooksSchema) {
129
- return true;
130
- }
168
+ const files = Object.fromEntries(Object.entries(prevAgent.files).filter(([p]) => p !== opts.filePath));
169
+ const next = withUpdatedAgent(existing, opts.agentId, (prev) => ({ ...prev, files }), opts.grounderVersion);
170
+ await writeGrounderState(next, opts.homeDir);
171
+ }
172
+ /** Persist an agent's hooks intent (tri-state). Setup/migrate only — never called from doctor. */
173
+ export async function setHooksEnabled(opts) {
174
+ const existing = await readGrounderState(opts.homeDir);
175
+ if (existing?.agents[opts.agentId]?.hooksEnabled === opts.enabled) {
176
+ return;
131
177
  }
132
- return false;
178
+ const next = withUpdatedAgent(existing, opts.agentId, (prev) => ({ ...prev, hooksEnabled: opts.enabled }), opts.grounderVersion);
179
+ await writeGrounderState(next, opts.homeDir);
133
180
  }
134
181
  /**
135
- * True when state says hooks are newer than this Grounder understands.
136
- * No stored hooks version is not "newer".
182
+ * Persist the exact invocation used for this agent's just-completed real
183
+ * install, so the cheap drift check can replay it later instead of the
184
+ * checking process's own `process.execPath`. No-op if already current.
137
185
  */
138
- export function isHooksSchemaAhead(recorded, expected) {
139
- if (expected === undefined || recorded === undefined) {
140
- return false;
186
+ export async function setLedgerInvocation(opts) {
187
+ const existing = await readGrounderState(opts.homeDir);
188
+ if (existing?.agents[opts.agentId]?.lastInvocation === opts.invocation) {
189
+ return;
141
190
  }
142
- return recorded > expected;
191
+ const next = withUpdatedAgent(existing, opts.agentId, (prev) => ({ ...prev, lastInvocation: opts.invocation }), opts.grounderVersion);
192
+ await writeGrounderState(next, opts.homeDir);
143
193
  }
144
- /** Last-recorded content hash for a managed file, or `undefined` if unknown. */
145
- export function recordedFileHash(state, agentId, filePath) {
146
- return state?.agents[agentId]?.files[filePath]?.hash;
194
+ /**
195
+ * Shared by `touchGrounderVersion`'s own no-op guard and `migrate`/`setup`'s
196
+ * reported "did the ledger change" row, so the two can't independently drift
197
+ * on the same comparison.
198
+ */
199
+ export function ledgerVersionChanged(existing, grounderVersion) {
200
+ return existing?.grounderVersion !== grounderVersion;
201
+ }
202
+ /**
203
+ * Stamp `grounderVersion` unconditionally — the hook for an all-noop plan
204
+ * (nothing else in a per-artifact write loop touches it when every entry was
205
+ * `noop`), so the upgrade banner still clears on a fully-current machine.
206
+ */
207
+ export async function touchGrounderVersion(grounderVersion, homeDir) {
208
+ const existing = await readGrounderState(homeDir);
209
+ if (!ledgerVersionChanged(existing, grounderVersion)) {
210
+ return;
211
+ }
212
+ await writeGrounderState({ ledgerSchema: LEDGER_SCHEMA, grounderVersion, agents: existing?.agents ?? {} }, homeDir);
147
213
  }
148
214
  /**
149
- * Hard stop when `state.json` has install versions newer than this Grounder
150
- * understands. Missing state or unknown agents are fine (older installs).
215
+ * Write-path-only hard stop (gap 2): an older binary reconciling a ledger
216
+ * written by a newer one must refuse to write, not silently overwrite newer
217
+ * skill files with older ones. Never called from `doctor`/`status`/`peek` —
218
+ * those keep today's warning and stay fully functional against a newer
219
+ * ledger (see `package-version-notice.ts`'s `"behind"` branch).
151
220
  */
152
- export function assertAgentSchemasSupported(state, agents) {
221
+ export function assertVersionSupportsWrite(runningVersion, state) {
153
222
  if (!state) {
154
223
  return;
155
224
  }
156
- for (const agent of agents) {
157
- const recorded = state.agents[agent.id];
158
- if (!recorded) {
159
- continue;
160
- }
161
- if (recorded.commandsSchema > agent.commandsSchema) {
162
- throw new UnsupportedSchemaError(`${agent.name} commands schema ${recorded.commandsSchema} is newer than this grounder supports (${agent.commandsSchema}). Upgrade grounder.`);
163
- }
164
- if (recorded.hooksSchema !== undefined &&
165
- agent.hooksSchema !== undefined &&
166
- recorded.hooksSchema > agent.hooksSchema) {
167
- throw new UnsupportedSchemaError(`${agent.name} hooks schema ${recorded.hooksSchema} is newer than this grounder supports (${agent.hooksSchema}). Upgrade grounder.`);
168
- }
225
+ if (packageVersionRelation(runningVersion, state.grounderVersion) === "behind") {
226
+ throw new UnsupportedSchemaError(`This Grounder (${runningVersion}) is older than your configuration (${state.grounderVersion}). Install a newer Grounder.`);
169
227
  }
170
228
  }
171
229
  //# sourceMappingURL=state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/connector/state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/connector/state.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,8 @@ import type { RepoConfig } from "./repo.js";
7
7
  export declare function resolveVaultRoot(home: HomeConfig, override?: string): string;
8
8
  /** Project notes directory under the effective vault root. */
9
9
  export declare function resolveNotesDir(home: HomeConfig, repo: RepoConfig, vaultOverride?: string): string;
10
+ /** Project vault root directory under the effective vault root. */
11
+ export declare function resolveProjectVaultRoot(home: HomeConfig, repo: RepoConfig, vaultOverride?: string): string;
10
12
  /** Project logs (handoff) directory under the effective vault root. */
11
13
  export declare function resolveLogsDir(home: HomeConfig, repo: RepoConfig, vaultOverride?: string): string;
12
14
  /** Project plans directory under the effective vault root. */
@@ -1 +1 @@
1
- {"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../src/connector/vault.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ5E;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAC7B,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,UAAU,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CAGR;AAED,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAGjG;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAC7B,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,UAAU,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CAGR"}
1
+ {"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../src/connector/vault.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ5E;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAC7B,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,UAAU,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CAGR;AAED,mEAAmE;AACnE,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,UAAU,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CAGR;AAED,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAGjG;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAC7B,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,UAAU,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CAGR"}
@@ -1,6 +1,6 @@
1
1
  // Config-aware vault resolution: effective vault root and artifact paths from connector state.
2
2
  import { resolveUserPath } from "../util/path.js";
3
- import { logsDir, notesDir, plansDir } from "../vault/layout.js";
3
+ import { logsDir, notesDir, plansDir, projectDir } from "../vault/layout.js";
4
4
  /**
5
5
  * Effective vault root, in order: explicit `override`, `GROUNDER_VAULT`, then home config.
6
6
  * Expands a leading `~` so vault paths like `~/Documents/…` resolve to the user home.
@@ -19,6 +19,11 @@ export function resolveNotesDir(home, repo, vaultOverride) {
19
19
  const vaultRoot = resolveVaultRoot(home, vaultOverride);
20
20
  return notesDir(vaultRoot, repo.projectId);
21
21
  }
22
+ /** Project vault root directory under the effective vault root. */
23
+ export function resolveProjectVaultRoot(home, repo, vaultOverride) {
24
+ const vaultRoot = resolveVaultRoot(home, vaultOverride);
25
+ return projectDir(vaultRoot, repo.projectId);
26
+ }
22
27
  /** Project logs (handoff) directory under the effective vault root. */
23
28
  export function resolveLogsDir(home, repo, vaultOverride) {
24
29
  const vaultRoot = resolveVaultRoot(home, vaultOverride);
@@ -1 +1 @@
1
- {"version":3,"file":"vault.js","sourceRoot":"","sources":["../../src/connector/vault.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAE/F,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAIjE;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAgB,EAAE,QAAiB;IAClE,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,eAAe,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAC/B,OAAO,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACzC,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,eAAe,CAC7B,IAAgB,EAChB,IAAgB,EAChB,aAAsB;IAEtB,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxD,OAAO,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AAC7C,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,cAAc,CAAC,IAAgB,EAAE,IAAgB,EAAE,aAAsB;IACvF,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxD,OAAO,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,eAAe,CAC7B,IAAgB,EAChB,IAAgB,EAChB,aAAsB;IAEtB,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxD,OAAO,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AAC7C,CAAC"}
1
+ {"version":3,"file":"vault.js","sourceRoot":"","sources":["../../src/connector/vault.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAE/F,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAI7E;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAgB,EAAE,QAAiB;IAClE,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,eAAe,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAC/B,OAAO,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACzC,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,eAAe,CAC7B,IAAgB,EAChB,IAAgB,EAChB,aAAsB;IAEtB,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxD,OAAO,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AAC7C,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,uBAAuB,CACrC,IAAgB,EAChB,IAAgB,EAChB,aAAsB;IAEtB,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxD,OAAO,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AAC/C,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,cAAc,CAAC,IAAgB,EAAE,IAAgB,EAAE,aAAsB;IACvF,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxD,OAAO,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,eAAe,CAC7B,IAAgB,EAChB,IAAgB,EAChB,aAAsB;IAEtB,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxD,OAAO,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AAC7C,CAAC"}
package/dist/help.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /** Help tiers and command metadata for the grounder CLI. */
2
- export type HelpGroup = "Setup" | "Write" | "Paths" | "Maintain" | "Advanced";
2
+ export type HelpGroup = "Setup" | "Write" | "Retrieve" | "Paths" | "Maintain" | "Advanced";
3
3
  export interface CommandMeta {
4
- /** Canonical id (`note`, `handoff list`, `vault init`, …). */
4
+ /** Canonical id (`note`, `handoff list`, `setup`, …). */
5
5
  id: string;
6
6
  group: HelpGroup;
7
7
  /** One-line summary for synopsis / full command lists. */
@@ -24,7 +24,7 @@ export declare const COMMANDS: readonly CommandMeta[];
24
24
  * Command ids the CLI dispatches (including parent topics). Keep in sync with
25
25
  * `cli.ts` / `helpExitCode(...)` call sites — the invariant test locks this.
26
26
  */
27
- export declare const DISPATCHED_COMMAND_IDS: readonly ["vault", "vault init", "init", "note", "note list", "handoff", "handoff list", "handoff peek", "plan", "plan list", "path", "path notes", "path logs", "path plans", "status", "doctor", "migrate", "help"];
27
+ export declare const DISPATCHED_COMMAND_IDS: readonly ["setup", "link", "note", "note list", "handoff", "handoff list", "handoff peek", "plan", "plan list", "search", "overview", "path", "path notes", "path logs", "path plans", "status", "doctor", "migrate", "help"];
28
28
  /** True when argv contains an exact `-h` or `--help` token. */
29
29
  export declare function wantsHelp(argv: string[]): boolean;
30
30
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAE5D,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,CAAC;AAE9E,MAAM,WAAW,WAAW;IAC1B,8DAA8D;IAC9D,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAaD;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,SAAS,WAAW,EAkM1C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,uNAmBzB,CAAC;AAIX,+DAA+D;AAC/D,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAEjD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,WAAW,GAAG,SAAS,CAY9E;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CASxD;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAMrD;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM7E;AAgDD,8EAA8E;AAC9E,wBAAgB,aAAa,IAAI,IAAI,CAepC;AAED,sFAAsF;AACtF,wBAAgB,aAAa,IAAI,IAAI,CAepC;AAED,2DAA2D;AAC3D,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAe9C"}
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAE5D,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,CAAC;AAE3F,MAAM,WAAW,WAAW;IAC1B,yDAAyD;IACzD,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAaD;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,SAAS,WAAW,EA0O1C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,+NAoBzB,CAAC;AAIX,+DAA+D;AAC/D,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAEjD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,WAAW,GAAG,SAAS,CAY9E;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CASxD;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAMrD;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM7E;AAkDD,8EAA8E;AAC9E,wBAAgB,aAAa,IAAI,IAAI,CAepC;AAED,sFAAsF;AACtF,wBAAgB,aAAa,IAAI,IAAI,CAepC;AAED,2DAA2D;AAC3D,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAe9C"}