daftari 1.0.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 (101) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/LICENSE +21 -0
  3. package/README.md +259 -0
  4. package/dist/access/locks.d.ts +19 -0
  5. package/dist/access/locks.d.ts.map +1 -0
  6. package/dist/access/locks.js +112 -0
  7. package/dist/access/locks.js.map +1 -0
  8. package/dist/access/rbac.d.ts +18 -0
  9. package/dist/access/rbac.d.ts.map +1 -0
  10. package/dist/access/rbac.js +48 -0
  11. package/dist/access/rbac.js.map +1 -0
  12. package/dist/cli.d.ts +4 -0
  13. package/dist/cli.d.ts.map +1 -0
  14. package/dist/cli.js +216 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/curation/lint.d.ts +20 -0
  17. package/dist/curation/lint.d.ts.map +1 -0
  18. package/dist/curation/lint.js +176 -0
  19. package/dist/curation/lint.js.map +1 -0
  20. package/dist/curation/provenance.d.ts +21 -0
  21. package/dist/curation/provenance.d.ts.map +1 -0
  22. package/dist/curation/provenance.js +80 -0
  23. package/dist/curation/provenance.js.map +1 -0
  24. package/dist/curation/staleness.d.ts +19 -0
  25. package/dist/curation/staleness.d.ts.map +1 -0
  26. package/dist/curation/staleness.js +67 -0
  27. package/dist/curation/staleness.js.map +1 -0
  28. package/dist/curation/tension.d.ts +20 -0
  29. package/dist/curation/tension.d.ts.map +1 -0
  30. package/dist/curation/tension.js +134 -0
  31. package/dist/curation/tension.js.map +1 -0
  32. package/dist/frontmatter/parser.d.ts +10 -0
  33. package/dist/frontmatter/parser.d.ts.map +1 -0
  34. package/dist/frontmatter/parser.js +29 -0
  35. package/dist/frontmatter/parser.js.map +1 -0
  36. package/dist/frontmatter/schema.d.ts +7 -0
  37. package/dist/frontmatter/schema.d.ts.map +1 -0
  38. package/dist/frontmatter/schema.js +115 -0
  39. package/dist/frontmatter/schema.js.map +1 -0
  40. package/dist/frontmatter/types.d.ts +41 -0
  41. package/dist/frontmatter/types.d.ts.map +1 -0
  42. package/dist/frontmatter/types.js +8 -0
  43. package/dist/frontmatter/types.js.map +1 -0
  44. package/dist/index.d.ts +4 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +94 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/search/bm25.d.ts +19 -0
  49. package/dist/search/bm25.d.ts.map +1 -0
  50. package/dist/search/bm25.js +115 -0
  51. package/dist/search/bm25.js.map +1 -0
  52. package/dist/search/hybrid.d.ts +38 -0
  53. package/dist/search/hybrid.d.ts.map +1 -0
  54. package/dist/search/hybrid.js +162 -0
  55. package/dist/search/hybrid.js.map +1 -0
  56. package/dist/search/reindex.d.ts +15 -0
  57. package/dist/search/reindex.d.ts.map +1 -0
  58. package/dist/search/reindex.js +189 -0
  59. package/dist/search/reindex.js.map +1 -0
  60. package/dist/search/vector.d.ts +9 -0
  61. package/dist/search/vector.d.ts.map +1 -0
  62. package/dist/search/vector.js +128 -0
  63. package/dist/search/vector.js.map +1 -0
  64. package/dist/server.d.ts +6 -0
  65. package/dist/server.d.ts.map +1 -0
  66. package/dist/server.js +72 -0
  67. package/dist/server.js.map +1 -0
  68. package/dist/storage/index-db.d.ts +37 -0
  69. package/dist/storage/index-db.d.ts.map +1 -0
  70. package/dist/storage/index-db.js +145 -0
  71. package/dist/storage/index-db.js.map +1 -0
  72. package/dist/storage/local.d.ts +6 -0
  73. package/dist/storage/local.d.ts.map +1 -0
  74. package/dist/storage/local.js +57 -0
  75. package/dist/storage/local.js.map +1 -0
  76. package/dist/tools/curation.d.ts +22 -0
  77. package/dist/tools/curation.d.ts.map +1 -0
  78. package/dist/tools/curation.js +202 -0
  79. package/dist/tools/curation.js.map +1 -0
  80. package/dist/tools/read.d.ts +74 -0
  81. package/dist/tools/read.d.ts.map +1 -0
  82. package/dist/tools/read.js +254 -0
  83. package/dist/tools/read.js.map +1 -0
  84. package/dist/tools/search.d.ts +13 -0
  85. package/dist/tools/search.d.ts.map +1 -0
  86. package/dist/tools/search.js +190 -0
  87. package/dist/tools/search.js.map +1 -0
  88. package/dist/tools/write.d.ts +18 -0
  89. package/dist/tools/write.d.ts.map +1 -0
  90. package/dist/tools/write.js +465 -0
  91. package/dist/tools/write.js.map +1 -0
  92. package/dist/utils/config.d.ts +12 -0
  93. package/dist/utils/config.d.ts.map +1 -0
  94. package/dist/utils/config.js +94 -0
  95. package/dist/utils/config.js.map +1 -0
  96. package/dist/utils/git.d.ts +23 -0
  97. package/dist/utils/git.d.ts.map +1 -0
  98. package/dist/utils/git.js +114 -0
  99. package/dist/utils/git.js.map +1 -0
  100. package/package.json +69 -0
  101. package/templates/config.yaml +31 -0
@@ -0,0 +1,465 @@
1
+ // Write-path tools: vault_write, vault_append, vault_promote, vault_deprecate.
2
+ //
3
+ // Every write follows the same shape: validate inputs, acquire a file-level
4
+ // lock, mutate the markdown file on disk, refresh the search index, auto-commit
5
+ // to git, append a provenance line, then release the lock. The lock is always
6
+ // released — even on failure — and handlers return Result, never throw.
7
+ //
8
+ // Git is the version-control layer: the auto-commit *is* the document history.
9
+ // The provenance log is a separate advisory audit trail.
10
+ import { mkdir, writeFile } from "node:fs/promises";
11
+ import { dirname } from "node:path";
12
+ import matter from "gray-matter";
13
+ import { acquireLock, openLockDb, releaseLock } from "../access/locks.js";
14
+ import { canPromote, canWrite } from "../access/rbac.js";
15
+ import { frontmatterDiff, recordProvenance } from "../curation/provenance.js";
16
+ import { parseDocument } from "../frontmatter/parser.js";
17
+ import { validateFrontmatter } from "../frontmatter/schema.js";
18
+ import { CONFIDENCES, err, ok, } from "../frontmatter/types.js";
19
+ import { indexDocument } from "../search/reindex.js";
20
+ import { readFile, resolveVaultPath } from "../storage/local.js";
21
+ import { commit } from "../utils/git.js";
22
+ // ---------------------------------------------------------------------------
23
+ // shared helpers
24
+ // ---------------------------------------------------------------------------
25
+ function todayISO() {
26
+ return new Date().toISOString().slice(0, 10);
27
+ }
28
+ // A document's RBAC collection: its frontmatter `collection`, falling back to
29
+ // the top-level directory of its vault-relative path.
30
+ function collectionOf(relPath, fm) {
31
+ return fm.collection || (relPath.split("/")[0] ?? "");
32
+ }
33
+ // Serializes a frontmatter block and markdown body back into file text.
34
+ // Fields are written in schema order so a round-tripped document has stable,
35
+ // predictable frontmatter.
36
+ function serializeDocument(fm, body) {
37
+ const ordered = {
38
+ title: fm.title,
39
+ domain: fm.domain,
40
+ collection: fm.collection,
41
+ status: fm.status,
42
+ confidence: fm.confidence,
43
+ created: fm.created,
44
+ updated: fm.updated,
45
+ updated_by: fm.updated_by,
46
+ provenance: fm.provenance,
47
+ sources: fm.sources,
48
+ superseded_by: fm.superseded_by,
49
+ ttl_days: fm.ttl_days,
50
+ tags: fm.tags,
51
+ };
52
+ return matter.stringify(body.startsWith("\n") ? body : `\n${body}`, ordered);
53
+ }
54
+ // Runs the durable part of a write under an exclusive file lock: write the
55
+ // file, refresh the index, commit, log provenance. The lock is released in a
56
+ // finally block so a failure mid-write never wedges the file.
57
+ //
58
+ // Commit failure is fatal (the write is not durably recorded). Index and
59
+ // provenance failures are not — the index is a rebuildable cache and the log
60
+ // is advisory — so they are reported via `indexUpdated` rather than aborting.
61
+ async function performWrite(params) {
62
+ const lockDbResult = openLockDb(params.vaultRoot);
63
+ if (!lockDbResult.ok)
64
+ return lockDbResult;
65
+ const lockDb = lockDbResult.value;
66
+ try {
67
+ const lock = acquireLock(lockDb, params.relPath, params.agent);
68
+ if (!lock.ok)
69
+ return lock;
70
+ try {
71
+ await mkdir(dirname(params.absPath), { recursive: true });
72
+ await writeFile(params.absPath, params.fileText, "utf-8");
73
+ const indexed = await indexDocument(params.vaultRoot, params.relPath);
74
+ const committed = await commit(params.vaultRoot, [params.relPath], params.commitMessage, params.agent);
75
+ if (!committed.ok)
76
+ return committed;
77
+ await recordProvenance(params.vaultRoot, {
78
+ tool: params.tool,
79
+ file: params.relPath,
80
+ agent: params.agent,
81
+ action: params.action,
82
+ frontmatter_diff: frontmatterDiff(params.oldFrontmatter, params.newFrontmatter),
83
+ });
84
+ return ok({
85
+ path: params.relPath,
86
+ action: params.action,
87
+ commit: committed.value.hash,
88
+ status: params.newFrontmatter.status,
89
+ updated: params.newFrontmatter.updated,
90
+ validation: params.validation,
91
+ indexUpdated: indexed.ok,
92
+ });
93
+ }
94
+ finally {
95
+ releaseLock(lockDb, params.relPath, params.agent);
96
+ }
97
+ }
98
+ catch (e) {
99
+ const reason = e instanceof Error ? e.message : String(e);
100
+ return err(new Error(`write failed: ${reason}`));
101
+ }
102
+ finally {
103
+ lockDb.close();
104
+ }
105
+ }
106
+ function requireString(args, field, tool) {
107
+ const v = args[field];
108
+ if (typeof v !== "string" || v.trim().length === 0) {
109
+ return err(new Error(`${tool} requires a non-empty '${field}' argument`));
110
+ }
111
+ return ok(v);
112
+ }
113
+ // ---------------------------------------------------------------------------
114
+ // vault_write
115
+ // ---------------------------------------------------------------------------
116
+ // Creates a new document or overwrites an existing one. The caller supplies
117
+ // the full frontmatter; `updated` and `updated_by` are always stamped by the
118
+ // server, and `created` is preserved from the existing document on an update.
119
+ export async function vaultWrite(vaultRoot, args, access) {
120
+ const path = requireString(args, "path", "vault_write");
121
+ if (!path.ok)
122
+ return path;
123
+ const agent = requireString(args, "agent", "vault_write");
124
+ if (!agent.ok)
125
+ return agent;
126
+ const body = args.body;
127
+ if (typeof body !== "string") {
128
+ return err(new Error("vault_write requires a string 'body' argument"));
129
+ }
130
+ if (args.frontmatter === null || typeof args.frontmatter !== "object") {
131
+ return err(new Error("vault_write requires a 'frontmatter' object argument"));
132
+ }
133
+ const rawFrontmatter = args.frontmatter;
134
+ // RBAC is checked before any file I/O or frontmatter validation: an
135
+ // unauthorized caller is denied without learning anything about the target.
136
+ if (access) {
137
+ const declared = rawFrontmatter.collection;
138
+ const collection = typeof declared === "string" && declared.length > 0
139
+ ? declared
140
+ : (path.value.split("/")[0] ?? "");
141
+ if (!canWrite(access.role, collection)) {
142
+ return err(new Error(`access denied: role '${access.roleName}' cannot write to ` +
143
+ `collection '${collection}'`));
144
+ }
145
+ }
146
+ const resolved = resolveVaultPath(vaultRoot, path.value);
147
+ if (!resolved.ok)
148
+ return resolved;
149
+ const existing = await readFile(resolved.value);
150
+ let oldFrontmatter = null;
151
+ if (existing.ok) {
152
+ const parsed = parseDocument(existing.value);
153
+ if (parsed.ok)
154
+ oldFrontmatter = parsed.value.frontmatter;
155
+ }
156
+ const isUpdate = oldFrontmatter !== null;
157
+ const { frontmatter, report } = validateFrontmatter(rawFrontmatter);
158
+ if (!report.valid) {
159
+ const summary = report.issues.map((i) => `${i.field}: ${i.message}`).join("; ");
160
+ return err(new Error(`invalid frontmatter: ${summary}`));
161
+ }
162
+ const stamped = {
163
+ ...frontmatter,
164
+ created: isUpdate ? oldFrontmatter.created : frontmatter.created,
165
+ updated: todayISO(),
166
+ updated_by: agent.value,
167
+ };
168
+ return performWrite({
169
+ vaultRoot,
170
+ relPath: path.value,
171
+ absPath: resolved.value,
172
+ agent: agent.value,
173
+ tool: "vault_write",
174
+ action: isUpdate ? "update" : "create",
175
+ fileText: serializeDocument(stamped, body),
176
+ newFrontmatter: stamped,
177
+ oldFrontmatter,
178
+ validation: report,
179
+ commitMessage: `vault_write: ${isUpdate ? "update" : "create"} ${path.value} ` + `by ${agent.value}`,
180
+ });
181
+ }
182
+ // ---------------------------------------------------------------------------
183
+ // vault_append
184
+ // ---------------------------------------------------------------------------
185
+ // Appends a markdown section to an existing document's body, leaving the
186
+ // frontmatter intact apart from the stamped `updated` / `updated_by` fields.
187
+ export async function vaultAppend(vaultRoot, args, access) {
188
+ const path = requireString(args, "path", "vault_append");
189
+ if (!path.ok)
190
+ return path;
191
+ const agent = requireString(args, "agent", "vault_append");
192
+ if (!agent.ok)
193
+ return agent;
194
+ const section = requireString(args, "section", "vault_append");
195
+ if (!section.ok)
196
+ return section;
197
+ const resolved = resolveVaultPath(vaultRoot, path.value);
198
+ if (!resolved.ok)
199
+ return resolved;
200
+ const existing = await readFile(resolved.value);
201
+ if (!existing.ok) {
202
+ return err(new Error(`vault_append: document not found: ${path.value}`));
203
+ }
204
+ const parsed = parseDocument(existing.value);
205
+ if (!parsed.ok)
206
+ return parsed;
207
+ const oldFrontmatter = parsed.value.frontmatter;
208
+ if (access) {
209
+ const collection = collectionOf(path.value, oldFrontmatter);
210
+ if (!canWrite(access.role, collection)) {
211
+ return err(new Error(`access denied: role '${access.roleName}' cannot write to ` +
212
+ `collection '${collection}'`));
213
+ }
214
+ }
215
+ const newFrontmatter = {
216
+ ...oldFrontmatter,
217
+ updated: todayISO(),
218
+ updated_by: agent.value,
219
+ };
220
+ const newBody = `${parsed.value.content.replace(/\s+$/, "")}\n\n${section.value.trim()}\n`;
221
+ return performWrite({
222
+ vaultRoot,
223
+ relPath: path.value,
224
+ absPath: resolved.value,
225
+ agent: agent.value,
226
+ tool: "vault_append",
227
+ action: "append",
228
+ fileText: serializeDocument(newFrontmatter, newBody),
229
+ newFrontmatter,
230
+ oldFrontmatter,
231
+ validation: parsed.value.validation,
232
+ commitMessage: `vault_append: ${path.value} by ${agent.value}`,
233
+ });
234
+ }
235
+ // ---------------------------------------------------------------------------
236
+ // vault_promote
237
+ // ---------------------------------------------------------------------------
238
+ // Promotes a draft document to canonical. Promotion is deliberate: it is only
239
+ // reachable through this tool, and it refuses unless the document's
240
+ // frontmatter is complete and a confidence level has been explicitly set.
241
+ export async function vaultPromote(vaultRoot, args, access) {
242
+ const path = requireString(args, "path", "vault_promote");
243
+ if (!path.ok)
244
+ return path;
245
+ const agent = requireString(args, "agent", "vault_promote");
246
+ if (!agent.ok)
247
+ return agent;
248
+ if (access && !canPromote(access.role)) {
249
+ return err(new Error(`access denied: role '${access.roleName}' cannot promote documents`));
250
+ }
251
+ const resolved = resolveVaultPath(vaultRoot, path.value);
252
+ if (!resolved.ok)
253
+ return resolved;
254
+ const existing = await readFile(resolved.value);
255
+ if (!existing.ok) {
256
+ return err(new Error(`vault_promote: document not found: ${path.value}`));
257
+ }
258
+ const parsed = parseDocument(existing.value);
259
+ if (!parsed.ok)
260
+ return parsed;
261
+ const oldFrontmatter = parsed.value.frontmatter;
262
+ if (oldFrontmatter.status !== "draft") {
263
+ return err(new Error(`vault_promote: only draft documents can be promoted ` +
264
+ `(${path.value} is '${oldFrontmatter.status}')`));
265
+ }
266
+ if (!parsed.value.validation.valid) {
267
+ const summary = parsed.value.validation.issues
268
+ .map((i) => `${i.field}: ${i.message}`)
269
+ .join("; ");
270
+ return err(new Error(`vault_promote: frontmatter is incomplete: ${summary}`));
271
+ }
272
+ // `confidence set` — the document must declare a confidence explicitly, not
273
+ // ride on the validator's default.
274
+ const rawConfidence = parsed.value.raw.confidence;
275
+ if (typeof rawConfidence !== "string" ||
276
+ !CONFIDENCES.includes(rawConfidence)) {
277
+ return err(new Error("vault_promote: confidence must be set before promotion"));
278
+ }
279
+ const newFrontmatter = {
280
+ ...oldFrontmatter,
281
+ status: "canonical",
282
+ updated: todayISO(),
283
+ updated_by: agent.value,
284
+ };
285
+ return performWrite({
286
+ vaultRoot,
287
+ relPath: path.value,
288
+ absPath: resolved.value,
289
+ agent: agent.value,
290
+ tool: "vault_promote",
291
+ action: "promote",
292
+ fileText: serializeDocument(newFrontmatter, parsed.value.content),
293
+ newFrontmatter,
294
+ oldFrontmatter,
295
+ validation: parsed.value.validation,
296
+ commitMessage: `vault_promote: ${path.value} draft→canonical by ${agent.value}`,
297
+ });
298
+ }
299
+ // ---------------------------------------------------------------------------
300
+ // vault_deprecate
301
+ // ---------------------------------------------------------------------------
302
+ // Marks a document deprecated. A reason is mandatory and is recorded in the
303
+ // commit message; an optional `superseded_by` points at the document that
304
+ // replaces this one.
305
+ export async function vaultDeprecate(vaultRoot, args, access) {
306
+ const path = requireString(args, "path", "vault_deprecate");
307
+ if (!path.ok)
308
+ return path;
309
+ const agent = requireString(args, "agent", "vault_deprecate");
310
+ if (!agent.ok)
311
+ return agent;
312
+ const reason = requireString(args, "reason", "vault_deprecate");
313
+ if (!reason.ok)
314
+ return reason;
315
+ let supersededBy = null;
316
+ if (args.superseded_by !== undefined && args.superseded_by !== null) {
317
+ if (typeof args.superseded_by !== "string") {
318
+ return err(new Error("vault_deprecate: 'superseded_by' must be a string or null"));
319
+ }
320
+ supersededBy = args.superseded_by;
321
+ }
322
+ const resolved = resolveVaultPath(vaultRoot, path.value);
323
+ if (!resolved.ok)
324
+ return resolved;
325
+ const existing = await readFile(resolved.value);
326
+ if (!existing.ok) {
327
+ return err(new Error(`vault_deprecate: document not found: ${path.value}`));
328
+ }
329
+ const parsed = parseDocument(existing.value);
330
+ if (!parsed.ok)
331
+ return parsed;
332
+ const oldFrontmatter = parsed.value.frontmatter;
333
+ if (access) {
334
+ const collection = collectionOf(path.value, oldFrontmatter);
335
+ if (!canWrite(access.role, collection)) {
336
+ return err(new Error(`access denied: role '${access.roleName}' cannot write to ` +
337
+ `collection '${collection}'`));
338
+ }
339
+ }
340
+ const newFrontmatter = {
341
+ ...oldFrontmatter,
342
+ status: "deprecated",
343
+ superseded_by: supersededBy,
344
+ updated: todayISO(),
345
+ updated_by: agent.value,
346
+ };
347
+ return performWrite({
348
+ vaultRoot,
349
+ relPath: path.value,
350
+ absPath: resolved.value,
351
+ agent: agent.value,
352
+ tool: "vault_deprecate",
353
+ action: "deprecate",
354
+ fileText: serializeDocument(newFrontmatter, parsed.value.content),
355
+ newFrontmatter,
356
+ oldFrontmatter,
357
+ validation: parsed.value.validation,
358
+ commitMessage: `vault_deprecate: ${path.value} by ${agent.value} — ${reason.value}` +
359
+ (supersededBy ? ` (superseded by ${supersededBy})` : ""),
360
+ });
361
+ }
362
+ // ---------------------------------------------------------------------------
363
+ // MCP tool definitions
364
+ // ---------------------------------------------------------------------------
365
+ const agentProperty = {
366
+ type: "string",
367
+ description: "Acting identity, e.g. 'agent:claude-code' or 'human:mihir'. Recorded " +
368
+ "as updated_by, the git author, and in the provenance log.",
369
+ };
370
+ export const writeTools = [
371
+ {
372
+ name: "vault_write",
373
+ description: "Create a new vault document or overwrite an existing one. Supply the " +
374
+ "full frontmatter and markdown body; the server stamps 'updated' and " +
375
+ "'updated_by', preserves 'created' on updates, refreshes the search " +
376
+ "index, and auto-commits the change to git.",
377
+ inputSchema: {
378
+ type: "object",
379
+ properties: {
380
+ path: {
381
+ type: "string",
382
+ description: "Vault-relative path of the markdown file to write",
383
+ },
384
+ body: { type: "string", description: "Markdown body (no frontmatter)" },
385
+ frontmatter: {
386
+ type: "object",
387
+ description: "Full frontmatter block. Required: title, domain, collection, " +
388
+ "status, confidence, created, provenance.",
389
+ },
390
+ agent: agentProperty,
391
+ },
392
+ required: ["path", "body", "frontmatter", "agent"],
393
+ additionalProperties: false,
394
+ },
395
+ handler: (vaultRoot, args, access) => vaultWrite(vaultRoot, args, access),
396
+ },
397
+ {
398
+ name: "vault_append",
399
+ description: "Append a markdown section to an existing vault document. Frontmatter " +
400
+ "is preserved; 'updated' and 'updated_by' are re-stamped. Auto-commits.",
401
+ inputSchema: {
402
+ type: "object",
403
+ properties: {
404
+ path: {
405
+ type: "string",
406
+ description: "Vault-relative path of the document to append to",
407
+ },
408
+ section: {
409
+ type: "string",
410
+ description: "Markdown text to append to the document body",
411
+ },
412
+ agent: agentProperty,
413
+ },
414
+ required: ["path", "section", "agent"],
415
+ additionalProperties: false,
416
+ },
417
+ handler: (vaultRoot, args, access) => vaultAppend(vaultRoot, args, access),
418
+ },
419
+ {
420
+ name: "vault_promote",
421
+ description: "Promote a draft document to canonical status. Refuses unless the " +
422
+ "document is currently a draft, its frontmatter is complete, and a " +
423
+ "confidence level has been explicitly set. Auto-commits.",
424
+ inputSchema: {
425
+ type: "object",
426
+ properties: {
427
+ path: {
428
+ type: "string",
429
+ description: "Vault-relative path of the draft document to promote",
430
+ },
431
+ agent: agentProperty,
432
+ },
433
+ required: ["path", "agent"],
434
+ additionalProperties: false,
435
+ },
436
+ handler: (vaultRoot, args, access) => vaultPromote(vaultRoot, args, access),
437
+ },
438
+ {
439
+ name: "vault_deprecate",
440
+ description: "Mark a document deprecated. A reason is required; optionally record " +
441
+ "the document that supersedes it. Auto-commits.",
442
+ inputSchema: {
443
+ type: "object",
444
+ properties: {
445
+ path: {
446
+ type: "string",
447
+ description: "Vault-relative path of the document to deprecate",
448
+ },
449
+ reason: {
450
+ type: "string",
451
+ description: "Why the document is being deprecated",
452
+ },
453
+ superseded_by: {
454
+ type: "string",
455
+ description: "Optional vault-relative path of the document that replaces this one",
456
+ },
457
+ agent: agentProperty,
458
+ },
459
+ required: ["path", "reason", "agent"],
460
+ additionalProperties: false,
461
+ },
462
+ handler: (vaultRoot, args, access) => vaultDeprecate(vaultRoot, args, access),
463
+ },
464
+ ];
465
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type Result } from "../frontmatter/types.js";
2
+ export interface RoleConfig {
3
+ read: string[];
4
+ write: string[];
5
+ promote: boolean;
6
+ }
7
+ export interface DaftariConfig {
8
+ roles: Record<string, RoleConfig>;
9
+ }
10
+ export declare function configPath(vaultRoot: string): string;
11
+ export declare function loadConfig(vaultRoot: string): Result<DaftariConfig, Error>;
12
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAWA,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAI/D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACnC;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEpD;AAyCD,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,CA2C1E"}
@@ -0,0 +1,94 @@
1
+ // Loads and validates .daftari/config.yaml — the source of RBAC truth.
2
+ //
3
+ // The config declares named roles and their per-collection permissions. It is
4
+ // loaded once at server start. A malformed config fails loud (Result.err): a
5
+ // permission system that silently loads a broken policy is worse than one that
6
+ // refuses to start. A *missing* config is not malformed — it just yields an
7
+ // empty role set, so every --role resolves to the deny-all guest.
8
+ import { readFileSync } from "node:fs";
9
+ import { join } from "node:path";
10
+ import { load as parseYaml } from "js-yaml";
11
+ import { err, ok } from "../frontmatter/types.js";
12
+ export function configPath(vaultRoot) {
13
+ return join(vaultRoot, ".daftari", "config.yaml");
14
+ }
15
+ function asStringArray(value, where) {
16
+ if (value === undefined)
17
+ return ok([]);
18
+ if (!Array.isArray(value)) {
19
+ return err(new Error(`${where} must be a list`));
20
+ }
21
+ for (const item of value) {
22
+ if (typeof item !== "string") {
23
+ return err(new Error(`${where} must contain only strings`));
24
+ }
25
+ }
26
+ return ok(value);
27
+ }
28
+ function validateRole(name, raw) {
29
+ if (raw === null || typeof raw !== "object" || Array.isArray(raw)) {
30
+ return err(new Error(`role '${name}' must be a mapping`));
31
+ }
32
+ const obj = raw;
33
+ const read = asStringArray(obj.read, `role '${name}' read`);
34
+ if (!read.ok)
35
+ return read;
36
+ const write = asStringArray(obj.write, `role '${name}' write`);
37
+ if (!write.ok)
38
+ return write;
39
+ let promote = false;
40
+ if (obj.promote !== undefined) {
41
+ if (typeof obj.promote !== "boolean") {
42
+ return err(new Error(`role '${name}' promote must be true or false`));
43
+ }
44
+ promote = obj.promote;
45
+ }
46
+ return ok({ read: read.value, write: write.value, promote });
47
+ }
48
+ // Loads and validates the vault's RBAC config. A missing file is not an error
49
+ // — it produces an empty role set. A file that parses but violates the schema,
50
+ // or fails to parse at all, returns Result.err so the server can refuse to
51
+ // start.
52
+ export function loadConfig(vaultRoot) {
53
+ let text;
54
+ try {
55
+ text = readFileSync(configPath(vaultRoot), "utf-8");
56
+ }
57
+ catch (e) {
58
+ if (e.code === "ENOENT") {
59
+ return ok({ roles: {} });
60
+ }
61
+ const reason = e instanceof Error ? e.message : String(e);
62
+ return err(new Error(`cannot read config: ${reason}`));
63
+ }
64
+ let parsed;
65
+ try {
66
+ parsed = parseYaml(text);
67
+ }
68
+ catch (e) {
69
+ const reason = e instanceof Error ? e.message : String(e);
70
+ return err(new Error(`malformed config: invalid YAML: ${reason}`));
71
+ }
72
+ if (parsed === null || parsed === undefined) {
73
+ return ok({ roles: {} });
74
+ }
75
+ if (typeof parsed !== "object" || Array.isArray(parsed)) {
76
+ return err(new Error("malformed config: root must be a mapping"));
77
+ }
78
+ const rawRoles = parsed.roles;
79
+ if (rawRoles === undefined) {
80
+ return ok({ roles: {} });
81
+ }
82
+ if (rawRoles === null || typeof rawRoles !== "object" || Array.isArray(rawRoles)) {
83
+ return err(new Error("malformed config: 'roles' must be a mapping"));
84
+ }
85
+ const roles = {};
86
+ for (const [name, raw] of Object.entries(rawRoles)) {
87
+ const role = validateRole(name, raw);
88
+ if (!role.ok)
89
+ return err(new Error(`malformed config: ${role.error.message}`));
90
+ roles[name] = role.value;
91
+ }
92
+ return ok({ roles });
93
+ }
94
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type Result } from "../frontmatter/types.js";
2
+ export interface GitCommitInfo {
3
+ hash: string;
4
+ author: string;
5
+ email: string;
6
+ date: string;
7
+ subject: string;
8
+ }
9
+ export interface GitIdentity {
10
+ name: string;
11
+ email: string;
12
+ }
13
+ export declare function gitIdentity(identity: string): GitIdentity;
14
+ export declare function isGitRepo(vaultRoot: string): Promise<boolean>;
15
+ export declare function ensureGitRepo(vaultRoot: string): Promise<Result<void, Error>>;
16
+ export declare function commit(vaultRoot: string, paths: string[], message: string, identity: string): Promise<Result<{
17
+ hash: string;
18
+ }, Error>>;
19
+ export declare function log(vaultRoot: string, opts?: {
20
+ limit?: number;
21
+ path?: string;
22
+ }): Promise<Result<GitCommitInfo[], Error>>;
23
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAUA,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAI/D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAKD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAMzD;AAmBD,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGnE;AAID,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAKnF;AAMD,wBAAsB,MAAM,CAC1B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,CAAC,CAAC,CA2B1C;AAID,wBAAsB,GAAG,CACvB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3C,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,KAAK,CAAC,CAAC,CA4BzC"}