daftari 1.30.0 → 1.31.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.
- package/CHANGELOG.md +106 -0
- package/README.md +139 -4
- package/dist/access/rbac.d.ts +1 -0
- package/dist/access/rbac.d.ts.map +1 -1
- package/dist/access/rbac.js +7 -0
- package/dist/access/rbac.js.map +1 -1
- package/dist/audit/checks/broken_refs.d.ts +1 -1
- package/dist/audit/checks/broken_refs.d.ts.map +1 -1
- package/dist/audit/checks/broken_refs.js +77 -22
- package/dist/audit/checks/broken_refs.js.map +1 -1
- package/dist/audit/collect.d.ts +1 -0
- package/dist/audit/collect.d.ts.map +1 -1
- package/dist/audit/collect.js +22 -2
- package/dist/audit/collect.js.map +1 -1
- package/dist/audit/index.d.ts.map +1 -1
- package/dist/audit/index.js +9 -3
- package/dist/audit/index.js.map +1 -1
- package/dist/audit/links.d.ts.map +1 -1
- package/dist/audit/links.js +9 -3
- package/dist/audit/links.js.map +1 -1
- package/dist/audit/report.d.ts.map +1 -1
- package/dist/audit/report.js +2 -0
- package/dist/audit/report.js.map +1 -1
- package/dist/audit/types.d.ts +4 -1
- package/dist/audit/types.d.ts.map +1 -1
- package/dist/audit/types.js.map +1 -1
- package/dist/backfill/derive.d.ts.map +1 -1
- package/dist/backfill/derive.js +1 -0
- package/dist/backfill/derive.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +18 -0
- package/dist/cli.js.map +1 -1
- package/dist/court/precedent.d.ts.map +1 -1
- package/dist/court/precedent.js +6 -1
- package/dist/court/precedent.js.map +1 -1
- package/dist/curation/consumes.d.ts +24 -0
- package/dist/curation/consumes.d.ts.map +1 -0
- package/dist/curation/consumes.js +122 -0
- package/dist/curation/consumes.js.map +1 -0
- package/dist/curation/edge-staleness.d.ts +47 -0
- package/dist/curation/edge-staleness.d.ts.map +1 -0
- package/dist/curation/edge-staleness.js +258 -0
- package/dist/curation/edge-staleness.js.map +1 -0
- package/dist/curation/edges.d.ts.map +1 -1
- package/dist/curation/edges.js +164 -10
- package/dist/curation/edges.js.map +1 -1
- package/dist/curation/lint.d.ts +4 -1
- package/dist/curation/lint.d.ts.map +1 -1
- package/dist/curation/lint.js +61 -6
- package/dist/curation/lint.js.map +1 -1
- package/dist/curation/provenance.d.ts +2 -0
- package/dist/curation/provenance.d.ts.map +1 -1
- package/dist/curation/provenance.js +2 -0
- package/dist/curation/provenance.js.map +1 -1
- package/dist/curation/read-log.d.ts +19 -0
- package/dist/curation/read-log.d.ts.map +1 -0
- package/dist/curation/read-log.js +120 -0
- package/dist/curation/read-log.js.map +1 -0
- package/dist/curation/review-throughput.d.ts +24 -0
- package/dist/curation/review-throughput.d.ts.map +1 -0
- package/dist/curation/review-throughput.js +102 -0
- package/dist/curation/review-throughput.js.map +1 -0
- package/dist/curation/staged-actions.d.ts +11 -1
- package/dist/curation/staged-actions.d.ts.map +1 -1
- package/dist/curation/staged-actions.js +102 -24
- package/dist/curation/staged-actions.js.map +1 -1
- package/dist/curation/structural.d.ts +16 -0
- package/dist/curation/structural.d.ts.map +1 -0
- package/dist/curation/structural.js +64 -0
- package/dist/curation/structural.js.map +1 -0
- package/dist/curation/tension-blast.d.ts +4 -0
- package/dist/curation/tension-blast.d.ts.map +1 -1
- package/dist/curation/tension-blast.js +9 -0
- package/dist/curation/tension-blast.js.map +1 -1
- package/dist/curation/tension.d.ts +5 -2
- package/dist/curation/tension.d.ts.map +1 -1
- package/dist/curation/tension.js +68 -25
- package/dist/curation/tension.js.map +1 -1
- package/dist/curation/tier0.d.ts +27 -0
- package/dist/curation/tier0.d.ts.map +1 -0
- package/dist/curation/tier0.js +196 -0
- package/dist/curation/tier0.js.map +1 -0
- package/dist/curation/tier1.d.ts +30 -0
- package/dist/curation/tier1.d.ts.map +1 -0
- package/dist/curation/tier1.js +142 -0
- package/dist/curation/tier1.js.map +1 -0
- package/dist/curation/tier2.d.ts +43 -0
- package/dist/curation/tier2.d.ts.map +1 -0
- package/dist/curation/tier2.js +182 -0
- package/dist/curation/tier2.js.map +1 -0
- package/dist/curation/vault-docs.d.ts +5 -1
- package/dist/curation/vault-docs.d.ts.map +1 -1
- package/dist/curation/vault-docs.js +14 -0
- package/dist/curation/vault-docs.js.map +1 -1
- package/dist/eval/generate.js +22 -5
- package/dist/eval/generate.js.map +1 -1
- package/dist/eval/index.d.ts.map +1 -1
- package/dist/eval/index.js +173 -25
- package/dist/eval/index.js.map +1 -1
- package/dist/eval/llm.js +1 -1
- package/dist/eval/llm.js.map +1 -1
- package/dist/eval/prune.d.ts +24 -0
- package/dist/eval/prune.d.ts.map +1 -0
- package/dist/eval/prune.js +83 -0
- package/dist/eval/prune.js.map +1 -0
- package/dist/eval/storage.d.ts +3 -0
- package/dist/eval/storage.d.ts.map +1 -1
- package/dist/eval/storage.js +14 -0
- package/dist/eval/storage.js.map +1 -1
- package/dist/frontmatter/schema.d.ts.map +1 -1
- package/dist/frontmatter/schema.js +19 -1
- package/dist/frontmatter/schema.js.map +1 -1
- package/dist/frontmatter/types.d.ts +4 -1
- package/dist/frontmatter/types.d.ts.map +1 -1
- package/dist/frontmatter/types.js +8 -0
- package/dist/frontmatter/types.js.map +1 -1
- package/dist/import/index.d.ts.map +1 -1
- package/dist/import/index.js +44 -9
- package/dist/import/index.js.map +1 -1
- package/dist/import/langgraph-store.d.ts +53 -0
- package/dist/import/langgraph-store.d.ts.map +1 -0
- package/dist/import/langgraph-store.js +292 -0
- package/dist/import/langgraph-store.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +56 -18
- package/dist/index.js.map +1 -1
- package/dist/lifecycle/lock.d.ts +9 -1
- package/dist/lifecycle/lock.d.ts.map +1 -1
- package/dist/lifecycle/lock.js +34 -9
- package/dist/lifecycle/lock.js.map +1 -1
- package/dist/okf/export.d.ts +12 -0
- package/dist/okf/export.d.ts.map +1 -0
- package/dist/okf/export.js +115 -0
- package/dist/okf/export.js.map +1 -0
- package/dist/okf/import.d.ts +24 -0
- package/dist/okf/import.d.ts.map +1 -0
- package/dist/okf/import.js +107 -0
- package/dist/okf/import.js.map +1 -0
- package/dist/okf/index.d.ts +2 -0
- package/dist/okf/index.d.ts.map +1 -0
- package/dist/okf/index.js +147 -0
- package/dist/okf/index.js.map +1 -0
- package/dist/okf/map.d.ts +16 -0
- package/dist/okf/map.d.ts.map +1 -0
- package/dist/okf/map.js +149 -0
- package/dist/okf/map.js.map +1 -0
- package/dist/okf/types.d.ts +9 -0
- package/dist/okf/types.d.ts.map +1 -0
- package/dist/okf/types.js +48 -0
- package/dist/okf/types.js.map +1 -0
- package/dist/search/coverage.d.ts.map +1 -1
- package/dist/search/coverage.js +1 -1
- package/dist/search/coverage.js.map +1 -1
- package/dist/search/hybrid.d.ts +19 -0
- package/dist/search/hybrid.d.ts.map +1 -1
- package/dist/search/hybrid.js +58 -10
- package/dist/search/hybrid.js.map +1 -1
- package/dist/search/reindex.d.ts +1 -0
- package/dist/search/reindex.d.ts.map +1 -1
- package/dist/search/reindex.js +41 -11
- package/dist/search/reindex.js.map +1 -1
- package/dist/search/watcher.d.ts +2 -0
- package/dist/search/watcher.d.ts.map +1 -1
- package/dist/search/watcher.js +21 -10
- package/dist/search/watcher.js.map +1 -1
- package/dist/serve/index.d.ts +36 -0
- package/dist/serve/index.d.ts.map +1 -0
- package/dist/serve/index.js +507 -0
- package/dist/serve/index.js.map +1 -0
- package/dist/server.d.ts +10 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +89 -14
- package/dist/server.js.map +1 -1
- package/dist/sleep/index.d.ts +2 -0
- package/dist/sleep/index.d.ts.map +1 -1
- package/dist/sleep/index.js +212 -21
- package/dist/sleep/index.js.map +1 -1
- package/dist/sleep/report.d.ts +3 -0
- package/dist/sleep/report.d.ts.map +1 -1
- package/dist/sleep/report.js +52 -0
- package/dist/sleep/report.js.map +1 -1
- package/dist/sleep/tension-scan-state.d.ts +19 -0
- package/dist/sleep/tension-scan-state.d.ts.map +1 -0
- package/dist/sleep/tension-scan-state.js +0 -0
- package/dist/sleep/tension-scan-state.js.map +1 -0
- package/dist/sleep/tension-scan.d.ts +44 -0
- package/dist/sleep/tension-scan.d.ts.map +1 -0
- package/dist/sleep/tension-scan.js +0 -0
- package/dist/sleep/tension-scan.js.map +1 -0
- package/dist/storage/backend.d.ts +12 -0
- package/dist/storage/backend.d.ts.map +1 -0
- package/dist/storage/backend.js +231 -0
- package/dist/storage/backend.js.map +1 -0
- package/dist/storage/backends/fs.d.ts +4 -0
- package/dist/storage/backends/fs.d.ts.map +1 -0
- package/dist/storage/backends/fs.js +99 -0
- package/dist/storage/backends/fs.js.map +1 -0
- package/dist/storage/fs-walk.d.ts +5 -0
- package/dist/storage/fs-walk.d.ts.map +1 -0
- package/dist/storage/fs-walk.js +28 -0
- package/dist/storage/fs-walk.js.map +1 -0
- package/dist/storage/index-db.d.ts +16 -0
- package/dist/storage/index-db.d.ts.map +1 -1
- package/dist/storage/index-db.js +94 -5
- package/dist/storage/index-db.js.map +1 -1
- package/dist/storage/local.d.ts +1 -0
- package/dist/storage/local.d.ts.map +1 -1
- package/dist/storage/local.js +12 -0
- package/dist/storage/local.js.map +1 -1
- package/dist/storage/sync.d.ts +25 -0
- package/dist/storage/sync.d.ts.map +1 -0
- package/dist/storage/sync.js +308 -0
- package/dist/storage/sync.js.map +1 -0
- package/dist/sync/index.d.ts +2 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +136 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/themes/clustering.d.ts +6 -11
- package/dist/themes/clustering.d.ts.map +1 -1
- package/dist/themes/clustering.js +76 -84
- package/dist/themes/clustering.js.map +1 -1
- package/dist/tools/consumes.d.ts +14 -0
- package/dist/tools/consumes.d.ts.map +1 -0
- package/dist/tools/consumes.js +99 -0
- package/dist/tools/consumes.js.map +1 -0
- package/dist/tools/curation.d.ts +2 -0
- package/dist/tools/curation.d.ts.map +1 -1
- package/dist/tools/curation.js +53 -15
- package/dist/tools/curation.js.map +1 -1
- package/dist/tools/edge-staleness.d.ts +28 -0
- package/dist/tools/edge-staleness.d.ts.map +1 -0
- package/dist/tools/edge-staleness.js +205 -0
- package/dist/tools/edge-staleness.js.map +1 -0
- package/dist/tools/edges.d.ts.map +1 -1
- package/dist/tools/edges.js +27 -21
- package/dist/tools/edges.js.map +1 -1
- package/dist/tools/read.d.ts +15 -1
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js +142 -29
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/receipt.d.ts.map +1 -1
- package/dist/tools/receipt.js +16 -7
- package/dist/tools/receipt.js.map +1 -1
- package/dist/tools/search.d.ts +1 -0
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +147 -5
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/staged-actions.d.ts +3 -0
- package/dist/tools/staged-actions.d.ts.map +1 -1
- package/dist/tools/staged-actions.js +227 -22
- package/dist/tools/staged-actions.js.map +1 -1
- package/dist/tools/themes.d.ts +8 -0
- package/dist/tools/themes.d.ts.map +1 -1
- package/dist/tools/themes.js +208 -122
- package/dist/tools/themes.js.map +1 -1
- package/dist/tools/tier1.d.ts +14 -0
- package/dist/tools/tier1.d.ts.map +1 -0
- package/dist/tools/tier1.js +169 -0
- package/dist/tools/tier1.js.map +1 -0
- package/dist/tools/tier2.d.ts +27 -0
- package/dist/tools/tier2.d.ts.map +1 -0
- package/dist/tools/tier2.js +344 -0
- package/dist/tools/tier2.js.map +1 -0
- package/dist/tools/write.d.ts +9 -1
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/tools/write.js +492 -6
- package/dist/tools/write.js.map +1 -1
- package/dist/utils/config.d.ts +52 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +372 -2
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/run-id.d.ts +3 -0
- package/dist/utils/run-id.d.ts.map +1 -0
- package/dist/utils/run-id.js +19 -0
- package/dist/utils/run-id.js.map +1 -0
- package/dist/utils/vault-gitignore.d.ts +1 -1
- package/dist/utils/vault-gitignore.d.ts.map +1 -1
- package/dist/utils/vault-gitignore.js +4 -1
- package/dist/utils/vault-gitignore.js.map +1 -1
- package/package.json +21 -1
- package/templates/config.yaml +8 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/okf/index.ts"],"names":[],"mappings":"AAsJA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAmB5D"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
// src/okf/index.ts
|
|
2
|
+
//
|
|
3
|
+
// `daftari okf <export|import> ...` — bridge a Daftari vault and Google Cloud's
|
|
4
|
+
// Open Knowledge Format (OKF) bundle. Export renders the vault as a portable OKF
|
|
5
|
+
// bundle any OKF consumer can read; import adopts an OKF bundle into a vault.
|
|
6
|
+
// The command owns arg parsing, existence checks, and human output; the actual
|
|
7
|
+
// translation lives in export.ts / import.ts.
|
|
8
|
+
import { resolve } from "node:path";
|
|
9
|
+
import { directoryExists } from "../storage/local.js";
|
|
10
|
+
import { exportBundle } from "./export.js";
|
|
11
|
+
import { importBundle } from "./import.js";
|
|
12
|
+
import { OKF_VERSION } from "./types.js";
|
|
13
|
+
const SUBCOMMANDS = ["export", "import"];
|
|
14
|
+
const HELP = `daftari okf — bridge a Daftari vault and the Open Knowledge Format (OKF v${OKF_VERSION}).
|
|
15
|
+
|
|
16
|
+
OKF is Google Cloud's vendor-neutral spec for the LLM-wiki pattern: a directory
|
|
17
|
+
of markdown files with YAML frontmatter that any producer can emit and any
|
|
18
|
+
consumer can read without translation.
|
|
19
|
+
|
|
20
|
+
Usage:
|
|
21
|
+
daftari okf export <vault> --out <dir> [--collection <name>]
|
|
22
|
+
daftari okf import <bundle> --into <vault> [--dry-run] [--agent <id>]
|
|
23
|
+
|
|
24
|
+
export — write the vault as an OKF bundle (never mutates the vault):
|
|
25
|
+
--out <dir> Output directory for the bundle (required).
|
|
26
|
+
--collection <name> Export only this collection (top-level folder).
|
|
27
|
+
|
|
28
|
+
Each doc becomes an OKF concept doc (core fields + a verbatim 'daftari'
|
|
29
|
+
sidecar for lossless round-trip) plus generated index.md and log.md.
|
|
30
|
+
|
|
31
|
+
import — adopt an OKF bundle into a vault (auto-commits + reindexes):
|
|
32
|
+
--into <vault> Target Daftari vault (required).
|
|
33
|
+
--dry-run Report the plan; write, commit, and index nothing.
|
|
34
|
+
--agent <id> Acting identity for authorship + commit (default agent:okf-import).
|
|
35
|
+
|
|
36
|
+
A bundle from 'daftari okf export' round-trips exactly; a foreign bundle is
|
|
37
|
+
mapped conservatively (docs land as drafts in the accumulation domain).
|
|
38
|
+
|
|
39
|
+
--help, -h Show this help.
|
|
40
|
+
`;
|
|
41
|
+
function readStringArg(argv, flag) {
|
|
42
|
+
const raw = argv.find((a) => a === flag || a.startsWith(`${flag}=`));
|
|
43
|
+
if (raw === undefined)
|
|
44
|
+
return undefined;
|
|
45
|
+
const idx = argv.indexOf(raw);
|
|
46
|
+
return raw.includes("=") ? raw.slice(raw.indexOf("=") + 1) : argv[idx + 1];
|
|
47
|
+
}
|
|
48
|
+
// First non-flag argument (the positional vault/bundle path), or a default.
|
|
49
|
+
function readPositional(argv, fallback) {
|
|
50
|
+
for (let i = 0; i < argv.length; i++) {
|
|
51
|
+
const a = argv[i];
|
|
52
|
+
if (a.startsWith("-")) {
|
|
53
|
+
// Skip the value of a value-taking flag so it is not mistaken for the
|
|
54
|
+
// positional. --dry-run takes no value; everything else here does.
|
|
55
|
+
if (!a.includes("=") && a !== "--dry-run")
|
|
56
|
+
i++;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
return a;
|
|
60
|
+
}
|
|
61
|
+
return fallback;
|
|
62
|
+
}
|
|
63
|
+
async function runExport(argv) {
|
|
64
|
+
const vault = readPositional(argv, ".");
|
|
65
|
+
const out = readStringArg(argv, "--out");
|
|
66
|
+
const collection = readStringArg(argv, "--collection");
|
|
67
|
+
if (!out) {
|
|
68
|
+
process.stderr.write("daftari okf export: --out <dir> is required\n");
|
|
69
|
+
return 1;
|
|
70
|
+
}
|
|
71
|
+
const resolvedVault = resolve(vault);
|
|
72
|
+
if (!(await directoryExists(resolvedVault))) {
|
|
73
|
+
process.stderr.write(`daftari okf export: vault directory not found: ${vault}\n`);
|
|
74
|
+
return 1;
|
|
75
|
+
}
|
|
76
|
+
const result = await exportBundle(resolvedVault, resolve(out), { collection });
|
|
77
|
+
if (!result.ok) {
|
|
78
|
+
process.stderr.write(`daftari okf export: ${result.error.message}\n`);
|
|
79
|
+
return 1;
|
|
80
|
+
}
|
|
81
|
+
for (const w of result.value.warnings) {
|
|
82
|
+
process.stderr.write(`daftari okf export: warning: ${w}\n`);
|
|
83
|
+
}
|
|
84
|
+
process.stdout.write(`Exported ${result.value.documentCount} document(s) as an OKF v${OKF_VERSION} bundle to ${result.value.outDir}\n` +
|
|
85
|
+
(result.value.skipped > 0 ? ` skipped: ${result.value.skipped} unparseable file(s)\n` : ""));
|
|
86
|
+
return 0;
|
|
87
|
+
}
|
|
88
|
+
async function runImportCmd(argv) {
|
|
89
|
+
const bundle = readPositional(argv, ".");
|
|
90
|
+
const into = readStringArg(argv, "--into");
|
|
91
|
+
const agent = readStringArg(argv, "--agent");
|
|
92
|
+
const dryRun = argv.includes("--dry-run");
|
|
93
|
+
if (!into) {
|
|
94
|
+
process.stderr.write("daftari okf import: --into <vault> is required\n");
|
|
95
|
+
return 1;
|
|
96
|
+
}
|
|
97
|
+
const resolvedBundle = resolve(bundle);
|
|
98
|
+
if (!(await directoryExists(resolvedBundle))) {
|
|
99
|
+
process.stderr.write(`daftari okf import: bundle directory not found: ${bundle}\n`);
|
|
100
|
+
return 1;
|
|
101
|
+
}
|
|
102
|
+
const resolvedVault = resolve(into);
|
|
103
|
+
if (!(await directoryExists(resolvedVault))) {
|
|
104
|
+
process.stderr.write(`daftari okf import: target vault not found: ${into}\n`);
|
|
105
|
+
return 1;
|
|
106
|
+
}
|
|
107
|
+
const result = await importBundle(resolvedBundle, resolvedVault, { agent, dryRun });
|
|
108
|
+
if (!result.ok) {
|
|
109
|
+
process.stderr.write(`daftari okf import: ${result.error.message}\n`);
|
|
110
|
+
return 1;
|
|
111
|
+
}
|
|
112
|
+
for (const w of result.value.warnings) {
|
|
113
|
+
process.stderr.write(`daftari okf import: warning: ${w}\n`);
|
|
114
|
+
}
|
|
115
|
+
const r = result.value;
|
|
116
|
+
if (r.dryRun) {
|
|
117
|
+
process.stdout.write(`Dry run — would import ${r.imported} document(s) into ${r.vaultRoot}:\n`);
|
|
118
|
+
for (const item of r.plan) {
|
|
119
|
+
const tag = item.roundTrip ? " (round-trip)" : "";
|
|
120
|
+
process.stdout.write(` ${item.relPath} → collection '${item.collection}'${tag}\n`);
|
|
121
|
+
}
|
|
122
|
+
return 0;
|
|
123
|
+
}
|
|
124
|
+
process.stdout.write(`Imported ${r.imported} document(s) into ${r.vaultRoot}` +
|
|
125
|
+
(r.commit ? ` (commit ${r.commit})` : "") +
|
|
126
|
+
(r.reindexed ? ", reindexed" : "") +
|
|
127
|
+
"\n" +
|
|
128
|
+
(r.skipped > 0 ? ` skipped: ${r.skipped} file(s)\n` : ""));
|
|
129
|
+
return 0;
|
|
130
|
+
}
|
|
131
|
+
export async function runOkf(argv) {
|
|
132
|
+
if (argv.length === 0) {
|
|
133
|
+
process.stderr.write(HELP);
|
|
134
|
+
return 1;
|
|
135
|
+
}
|
|
136
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
137
|
+
process.stdout.write(HELP);
|
|
138
|
+
return 0;
|
|
139
|
+
}
|
|
140
|
+
const sub = argv[0];
|
|
141
|
+
if (!SUBCOMMANDS.includes(sub)) {
|
|
142
|
+
process.stderr.write(`daftari okf: unknown subcommand '${sub}' — expected: ${SUBCOMMANDS.join(", ")}\n`);
|
|
143
|
+
return 1;
|
|
144
|
+
}
|
|
145
|
+
return sub === "export" ? runExport(argv.slice(1)) : runImportCmd(argv.slice(1));
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/okf/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Frontmatter } from "../frontmatter/types.js";
|
|
2
|
+
export declare function isUri(s: string): boolean;
|
|
3
|
+
export declare function deriveDescription(fm: Frontmatter, body: string): string | undefined;
|
|
4
|
+
export declare function toIsoTimestamp(date: string): string | undefined;
|
|
5
|
+
export declare function daftariToOkf(raw: Record<string, unknown>, fm: Frontmatter, body: string): Record<string, unknown>;
|
|
6
|
+
export declare function titleFromPath(relPath: string): string;
|
|
7
|
+
export declare function collectionFromPath(relPath: string): string | null;
|
|
8
|
+
export declare function slugify(s: string): string | null;
|
|
9
|
+
export declare function dateFromTimestamp(value: unknown): string | undefined;
|
|
10
|
+
export interface OkfImportContext {
|
|
11
|
+
relPath: string;
|
|
12
|
+
today: string;
|
|
13
|
+
updatedBy: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function okfToDaftari(okfRaw: Record<string, unknown>, ctx: OkfImportContext): Record<string, unknown>;
|
|
16
|
+
//# sourceMappingURL=map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/okf/map.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAO3D,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAExC;AAMD,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAYnF;AAKD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG/D;AAOD,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,EAAE,EAAE,WAAW,EACf,IAAI,EAAE,MAAM,GACX,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAyBzB;AAID,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGrD;AAID,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGjE;AAID,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMhD;AAKD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAQpE;AAOD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AASD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,GAAG,EAAE,gBAAgB,GACpB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA4CzB"}
|
package/dist/okf/map.js
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// Pure frontmatter mappers between Daftari and OKF. No filesystem, no I/O — the
|
|
2
|
+
// export/import modules own that. Keeping the field translation here makes it
|
|
3
|
+
// unit-testable in isolation and keeps the two directions symmetric.
|
|
4
|
+
import { normalizeIsoDate } from "../utils/dates.js";
|
|
5
|
+
import { DAFTARI_SIDECAR_KEY, DEFAULT_IMPORT_COLLECTION, DEFAULT_OKF_TYPE } from "./types.js";
|
|
6
|
+
// True when `s` looks like an absolute URI (has a scheme + "://"). Daftari
|
|
7
|
+
// `sources` are often bare ids ("aurora-product-page"); only URI-shaped ones map
|
|
8
|
+
// to OKF's `resource`, which is defined as a URI identifying the asset.
|
|
9
|
+
export function isUri(s) {
|
|
10
|
+
return /^[a-z][a-z0-9+.-]*:\/\//i.test(s);
|
|
11
|
+
}
|
|
12
|
+
// A single-sentence summary for OKF's `description`. Prefers the first
|
|
13
|
+
// non-heading, non-list paragraph of the body (cut at the first sentence
|
|
14
|
+
// boundary); falls back to the doc's first `questions_answered` entry. Returns
|
|
15
|
+
// undefined when there is nothing usable, so the field is simply omitted.
|
|
16
|
+
export function deriveDescription(fm, body) {
|
|
17
|
+
for (const rawLine of body.split("\n")) {
|
|
18
|
+
const line = rawLine.trim();
|
|
19
|
+
if (line === "")
|
|
20
|
+
continue;
|
|
21
|
+
if (line.startsWith("#"))
|
|
22
|
+
continue; // heading
|
|
23
|
+
if (/^([-*+]|\d+\.)\s/.test(line))
|
|
24
|
+
continue; // list item
|
|
25
|
+
const sentence = /^(.*?[.!?])(\s|$)/.exec(line);
|
|
26
|
+
const text = (sentence ? sentence[1] : line).trim();
|
|
27
|
+
return text.length > 280 ? `${text.slice(0, 277)}...` : text;
|
|
28
|
+
}
|
|
29
|
+
if (fm.questions_answered.length > 0)
|
|
30
|
+
return fm.questions_answered[0];
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
// Daftari `YYYY-MM-DD` → OKF ISO 8601 datetime. Returns undefined for anything
|
|
34
|
+
// that isn't a real calendar date so an invalid `updated` never emits a bogus
|
|
35
|
+
// timestamp.
|
|
36
|
+
export function toIsoTimestamp(date) {
|
|
37
|
+
const norm = normalizeIsoDate(date);
|
|
38
|
+
return norm === null ? undefined : `${norm}T00:00:00Z`;
|
|
39
|
+
}
|
|
40
|
+
// Daftari document → OKF concept-doc frontmatter. `raw` is the document's
|
|
41
|
+
// original frontmatter verbatim; it is stashed under the `daftari` key so an
|
|
42
|
+
// `okf import` of this bundle can reconstruct the source exactly rather than
|
|
43
|
+
// re-deriving it from the lossy OKF core fields. `body` is unchanged by export;
|
|
44
|
+
// it is passed only to derive the description.
|
|
45
|
+
export function daftariToOkf(raw, fm, body) {
|
|
46
|
+
const out = {};
|
|
47
|
+
// `type` is the only required OKF field. Daftari's `collection` is the closest
|
|
48
|
+
// notion of a document kind; fall back to a generic type when it is empty.
|
|
49
|
+
out.type = fm.collection.trim() || DEFAULT_OKF_TYPE;
|
|
50
|
+
if (fm.title.trim() !== "")
|
|
51
|
+
out.title = fm.title;
|
|
52
|
+
const description = deriveDescription(fm, body);
|
|
53
|
+
if (description !== undefined)
|
|
54
|
+
out.description = description;
|
|
55
|
+
const resource = fm.sources.find(isUri);
|
|
56
|
+
if (resource !== undefined)
|
|
57
|
+
out.resource = resource;
|
|
58
|
+
if (fm.tags.length > 0)
|
|
59
|
+
out.tags = fm.tags;
|
|
60
|
+
const timestamp = toIsoTimestamp(fm.updated);
|
|
61
|
+
if (timestamp !== undefined)
|
|
62
|
+
out.timestamp = timestamp;
|
|
63
|
+
// Lossless round-trip channel. Never overwritten by the derived fields above
|
|
64
|
+
// because it lives under its own key.
|
|
65
|
+
out[DAFTARI_SIDECAR_KEY] = raw;
|
|
66
|
+
return out;
|
|
67
|
+
}
|
|
68
|
+
// Basename without extension, humanized, as a fallback title for a foreign OKF
|
|
69
|
+
// doc that omitted `title` (OKF says title is derived from the filename then).
|
|
70
|
+
export function titleFromPath(relPath) {
|
|
71
|
+
const base = relPath.split("/").pop() ?? relPath;
|
|
72
|
+
return base.replace(/\.md$/i, "").replace(/[-_]+/g, " ").trim();
|
|
73
|
+
}
|
|
74
|
+
// Top-level bundle directory of a doc, used as the Daftari collection so a
|
|
75
|
+
// bundle's folder structure survives import. Null for a doc at the bundle root.
|
|
76
|
+
export function collectionFromPath(relPath) {
|
|
77
|
+
const parts = relPath.split("/").filter((p) => p !== "");
|
|
78
|
+
return parts.length > 1 ? parts[0] : null;
|
|
79
|
+
}
|
|
80
|
+
// Lowercase kebab slug of an arbitrary OKF `type` string, for use as a Daftari
|
|
81
|
+
// collection when the doc has no directory. Returns null if nothing survives.
|
|
82
|
+
export function slugify(s) {
|
|
83
|
+
const slug = s
|
|
84
|
+
.toLowerCase()
|
|
85
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
86
|
+
.replace(/^-+|-+$/g, "");
|
|
87
|
+
return slug === "" ? null : slug;
|
|
88
|
+
}
|
|
89
|
+
// OKF `timestamp` → Daftari `YYYY-MM-DD`. Accepts a js-yaml Date (unquoted ISO
|
|
90
|
+
// datetimes parse to Date), an ISO string, or a bare date; returns undefined
|
|
91
|
+
// when it cannot recover a real calendar date.
|
|
92
|
+
export function dateFromTimestamp(value) {
|
|
93
|
+
if (value instanceof Date && !Number.isNaN(value.getTime())) {
|
|
94
|
+
return value.toISOString().slice(0, 10);
|
|
95
|
+
}
|
|
96
|
+
if (typeof value === "string") {
|
|
97
|
+
return normalizeIsoDate(value.slice(0, 10)) ?? undefined;
|
|
98
|
+
}
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
function asStringArray(value) {
|
|
102
|
+
if (!Array.isArray(value))
|
|
103
|
+
return [];
|
|
104
|
+
return value.filter((v) => typeof v === "string");
|
|
105
|
+
}
|
|
106
|
+
// OKF concept-doc frontmatter → Daftari frontmatter (as a raw record ready for
|
|
107
|
+
// serializeDocument). When the doc carries a `daftari` sidecar (it came from
|
|
108
|
+
// `daftari okf export`), that verbatim frontmatter is used directly for an exact
|
|
109
|
+
// round-trip. Otherwise a Daftari frontmatter is synthesized from the OKF core
|
|
110
|
+
// fields, conservatively: imported knowledge lands as a `draft` in the
|
|
111
|
+
// `accumulation` domain, and the original OKF `type` is preserved in an
|
|
112
|
+
// `okf_type` field so nothing is silently lost.
|
|
113
|
+
export function okfToDaftari(okfRaw, ctx) {
|
|
114
|
+
const sidecar = okfRaw[DAFTARI_SIDECAR_KEY];
|
|
115
|
+
if (sidecar !== null && typeof sidecar === "object" && !Array.isArray(sidecar)) {
|
|
116
|
+
return { ...sidecar };
|
|
117
|
+
}
|
|
118
|
+
const title = typeof okfRaw.title === "string" && okfRaw.title.trim() !== ""
|
|
119
|
+
? okfRaw.title
|
|
120
|
+
: titleFromPath(ctx.relPath);
|
|
121
|
+
const okfType = typeof okfRaw.type === "string" ? okfRaw.type : "";
|
|
122
|
+
const collection = collectionFromPath(ctx.relPath) ?? slugify(okfType) ?? DEFAULT_IMPORT_COLLECTION;
|
|
123
|
+
const date = dateFromTimestamp(okfRaw.timestamp) ?? ctx.today;
|
|
124
|
+
const sources = typeof okfRaw.resource === "string" && okfRaw.resource.trim() !== "" ? [okfRaw.resource] : [];
|
|
125
|
+
const out = {
|
|
126
|
+
title,
|
|
127
|
+
domain: "accumulation",
|
|
128
|
+
collection,
|
|
129
|
+
status: "draft",
|
|
130
|
+
confidence: "medium",
|
|
131
|
+
created: date,
|
|
132
|
+
updated: date,
|
|
133
|
+
updated_by: ctx.updatedBy,
|
|
134
|
+
provenance: "direct",
|
|
135
|
+
sources,
|
|
136
|
+
superseded_by: null,
|
|
137
|
+
ttl_days: null,
|
|
138
|
+
tags: asStringArray(okfRaw.tags),
|
|
139
|
+
describes: [],
|
|
140
|
+
questions_answered: [],
|
|
141
|
+
questions_raised: [],
|
|
142
|
+
};
|
|
143
|
+
// Preserve the OKF kind so the import is not lossy. serializeDocument writes
|
|
144
|
+
// unknown fields through untouched.
|
|
145
|
+
if (okfType.trim() !== "")
|
|
146
|
+
out.okf_type = okfType;
|
|
147
|
+
return out;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.js","sourceRoot":"","sources":["../../src/okf/map.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const OKF_VERSION = "0.1";
|
|
2
|
+
export declare const OKF_INDEX_FILE = "index.md";
|
|
3
|
+
export declare const OKF_LOG_FILE = "log.md";
|
|
4
|
+
export declare const OKF_RESERVED_FILES: readonly ["index.md", "log.md"];
|
|
5
|
+
export declare const DAFTARI_SIDECAR_KEY = "daftari";
|
|
6
|
+
export declare const DEFAULT_OKF_TYPE = "note";
|
|
7
|
+
export declare const DEFAULT_IMPORT_COLLECTION = "imported";
|
|
8
|
+
export declare const OKF_CORE_FIELDS: readonly ["type", "title", "description", "resource", "tags", "timestamp"];
|
|
9
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/okf/types.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,WAAW,QAAQ,CAAC;AAIjC,eAAO,MAAM,cAAc,aAAa,CAAC;AACzC,eAAO,MAAM,YAAY,WAAW,CAAC;AACrC,eAAO,MAAM,kBAAkB,iCAA0C,CAAC;AAO1E,eAAO,MAAM,mBAAmB,YAAY,CAAC;AAM7C,eAAO,MAAM,gBAAgB,SAAS,CAAC;AAIvC,eAAO,MAAM,yBAAyB,aAAa,CAAC;AAIpD,eAAO,MAAM,eAAe,4EAOlB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// Open Knowledge Format (OKF) — shared constants and types.
|
|
2
|
+
//
|
|
3
|
+
// OKF is Google Cloud's vendor-neutral specification (v0.1) for the LLM-wiki
|
|
4
|
+
// pattern: a directory of markdown files with YAML frontmatter that any
|
|
5
|
+
// producer can emit and any consumer can read without translation. Daftari's
|
|
6
|
+
// vault *is* this pattern, so `daftari okf export|import` bridges the two.
|
|
7
|
+
//
|
|
8
|
+
// Spec essentials that this module implements:
|
|
9
|
+
// - A concept doc is any non-reserved `.md` file with a frontmatter block.
|
|
10
|
+
// - The single required frontmatter field is `type` (a free-form kind string).
|
|
11
|
+
// - Recommended fields: title, description, resource, tags, timestamp.
|
|
12
|
+
// - Reserved filenames: index.md (progressive-disclosure listing) and log.md
|
|
13
|
+
// (chronological change history, newest first).
|
|
14
|
+
// - Consumers must tolerate unknown fields and unknown `type` values.
|
|
15
|
+
// The OKF spec version this producer targets and this consumer understands.
|
|
16
|
+
// Written into the exported bundle's root index.md frontmatter (the spec's
|
|
17
|
+
// place for a bundle to declare its target version).
|
|
18
|
+
export const OKF_VERSION = "0.1";
|
|
19
|
+
// Reserved filenames with defined structural meaning. They are NOT concept
|
|
20
|
+
// docs: export generates them, import skips them.
|
|
21
|
+
export const OKF_INDEX_FILE = "index.md";
|
|
22
|
+
export const OKF_LOG_FILE = "log.md";
|
|
23
|
+
export const OKF_RESERVED_FILES = [OKF_INDEX_FILE, OKF_LOG_FILE];
|
|
24
|
+
// The frontmatter key under which export stashes the document's original,
|
|
25
|
+
// verbatim Daftari frontmatter. It is an ordinary producer-defined field as far
|
|
26
|
+
// as OKF is concerned (consumers preserve it), but it lets `okf import` of a
|
|
27
|
+
// Daftari-produced bundle reconstruct the source frontmatter exactly rather than
|
|
28
|
+
// re-synthesizing it from the lossy OKF core fields. Absent on foreign bundles.
|
|
29
|
+
export const DAFTARI_SIDECAR_KEY = "daftari";
|
|
30
|
+
// The `type` value assigned to a concept doc that has no natural kind to map
|
|
31
|
+
// from (an untitled/uncollected doc on export, a foreign doc with no directory
|
|
32
|
+
// on import). OKF requires a non-empty `type`; this keeps every emitted doc
|
|
33
|
+
// conformant without inventing a false-specific kind.
|
|
34
|
+
export const DEFAULT_OKF_TYPE = "note";
|
|
35
|
+
// The Daftari collection assigned to a foreign OKF concept doc that carries no
|
|
36
|
+
// directory and no usable `type` to derive one from.
|
|
37
|
+
export const DEFAULT_IMPORT_COLLECTION = "imported";
|
|
38
|
+
// The canonical OKF frontmatter fields, in the order export writes them. `type`
|
|
39
|
+
// is the only required one; the rest are recommended and omitted when empty.
|
|
40
|
+
export const OKF_CORE_FIELDS = [
|
|
41
|
+
"type",
|
|
42
|
+
"title",
|
|
43
|
+
"description",
|
|
44
|
+
"resource",
|
|
45
|
+
"tags",
|
|
46
|
+
"timestamp",
|
|
47
|
+
];
|
|
48
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/okf/types.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,EAAE;AACF,6EAA6E;AAC7E,wEAAwE;AACxE,6EAA6E;AAC7E,2EAA2E;AAC3E,EAAE;AACF,+CAA+C;AAC/C,6EAA6E;AAC7E,iFAAiF;AACjF,yEAAyE;AACzE,+EAA+E;AAC/E,oDAAoD;AACpD,wEAAwE;AAExE,4EAA4E;AAC5E,2EAA2E;AAC3E,qDAAqD;AACrD,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AAEjC,2EAA2E;AAC3E,kDAAkD;AAClD,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;AACzC,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC;AACrC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,cAAc,EAAE,YAAY,CAAU,CAAC;AAE1E,0EAA0E;AAC1E,gFAAgF;AAChF,6EAA6E;AAC7E,iFAAiF;AACjF,gFAAgF;AAChF,MAAM,CAAC,MAAM,mBAAmB,GAAG,SAAS,CAAC;AAE7C,6EAA6E;AAC7E,+EAA+E;AAC/E,4EAA4E;AAC5E,sDAAsD;AACtD,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEvC,+EAA+E;AAC/E,qDAAqD;AACrD,MAAM,CAAC,MAAM,yBAAyB,GAAG,UAAU,CAAC;AAEpD,gFAAgF;AAChF,6EAA6E;AAC7E,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,MAAM;IACN,OAAO;IACP,aAAa;IACb,UAAU;IACV,MAAM;IACN,WAAW;CACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../src/search/coverage.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,KAAK,OAAO,EAEb,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,wBAAwB,EAAE,eAOtC,CAAC;AAMF,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgB/F;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAuBD,wBAAgB,aAAa,CAC3B,EAAE,EAAE,OAAO,EACX,IAAI,EAAE,SAAS,EAAE,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,eAAe,GACpB,UAAU,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../src/search/coverage.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,KAAK,OAAO,EAEb,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,wBAAwB,EAAE,eAOtC,CAAC;AAMF,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgB/F;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAuBD,wBAAgB,aAAa,CAC3B,EAAE,EAAE,OAAO,EACX,IAAI,EAAE,SAAS,EAAE,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,eAAe,GACpB,UAAU,GAAG,IAAI,CAanB;AA8CD,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,OAAO,EACX,IAAI,EAAE,SAAS,EAAE,EACjB,IAAI,GAAE,eAA0C,GAC/C,SAAS,EAAE,CAUb;AAMD,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,eAAe,GAAG,SAAS,EAAE,CAwBrF"}
|
package/dist/search/coverage.js
CHANGED
|
@@ -59,7 +59,7 @@ export function computeWindow(db, hits, entity, opts) {
|
|
|
59
59
|
const dates = [];
|
|
60
60
|
for (const h of hits.slice(0, opts.seedK)) {
|
|
61
61
|
const d = getDocument(db, h.path);
|
|
62
|
-
if (d
|
|
62
|
+
if (d?.tags.includes(entity) && d.created && isValidIsoDate(d.created))
|
|
63
63
|
dates.push(d.created);
|
|
64
64
|
}
|
|
65
65
|
if (dates.length === 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../src/search/coverage.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,yEAAyE;AACzE,4EAA4E;AAC5E,uEAAuE;AACvE,kCAAkC;AAElC,OAAO,EACL,WAAW,EACX,uBAAuB,GAGxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAYrD,MAAM,CAAC,MAAM,wBAAwB,GAAoB;IACvD,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;IACV,WAAW,EAAE,EAAE,EAAE,mDAAmD;IACpE,aAAa,EAAE,IAAI;CACpB,CAAC;AAEF,+EAA+E;AAC/E,+EAA+E;AAC/E,gFAAgF;AAChF,oDAAoD;AACpD,MAAM,UAAU,kBAAkB,CAAC,EAAW,EAAE,IAAiB,EAAE,KAAa;IAC9E,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,KAAK,MAAM,GAAG,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,cAAc;IAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;YACxB,IAAI,GAAG,GAAG,CAAC;YACX,KAAK,GAAG,CAAC,CAAC;QACZ,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAOD,wEAAwE;AACxE,gFAAgF;AAChF,8EAA8E;AAC9E,iFAAiF;AACjF,6EAA6E;AAC7E,mCAAmC;AACnC,SAAS,cAAc,CAAC,CAAS;IAC/B,OAAO,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,gFAAgF;AAChF,sBAAsB;AACtB,SAAS,SAAS,CAAC,GAAW,EAAE,IAAY;IAC1C,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC;IACvC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC;IACpC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,8EAA8E;AAC9E,gFAAgF;AAChF,2DAA2D;AAC3D,MAAM,UAAU,aAAa,CAC3B,EAAW,EACX,IAAiB,EACjB,MAAc,EACd,IAAqB;IAErB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../src/search/coverage.ts"],"names":[],"mappings":"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"}
|
package/dist/search/hybrid.d.ts
CHANGED
|
@@ -21,15 +21,34 @@ export interface HybridHit {
|
|
|
21
21
|
currentSource?: CurrentSource;
|
|
22
22
|
contested?: ContestedTension[];
|
|
23
23
|
contestedCount?: number;
|
|
24
|
+
pendingBrokenUpstream?: "some" | "many";
|
|
25
|
+
hiddenPendingUpstream?: "some" | "many";
|
|
26
|
+
orphan?: boolean;
|
|
27
|
+
deprecatedStillLinked?: boolean;
|
|
24
28
|
viaCoverage?: boolean;
|
|
25
29
|
coverageReason?: "edge" | "entity-window";
|
|
26
30
|
}
|
|
31
|
+
export interface RerankCandidate {
|
|
32
|
+
rank: number;
|
|
33
|
+
path: string;
|
|
34
|
+
title: string;
|
|
35
|
+
collection: string;
|
|
36
|
+
status: string;
|
|
37
|
+
score: number;
|
|
38
|
+
bm25Score: number;
|
|
39
|
+
vectorScore: number;
|
|
40
|
+
snippet: string;
|
|
41
|
+
}
|
|
27
42
|
export interface HybridSearchResult {
|
|
28
43
|
query: string;
|
|
29
44
|
count: number;
|
|
30
45
|
vectorUsed: boolean;
|
|
31
46
|
weights: HybridWeights;
|
|
32
47
|
hits: HybridHit[];
|
|
48
|
+
rerank?: {
|
|
49
|
+
instructions: string;
|
|
50
|
+
candidates: RerankCandidate[];
|
|
51
|
+
};
|
|
33
52
|
}
|
|
34
53
|
export interface HybridSearchOptions {
|
|
35
54
|
weights?: HybridWeights;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hybrid.d.ts","sourceRoot":"","sources":["../../src/search/hybrid.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAM,KAAK,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAKL,KAAK,OAAO,EACb,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,eAAe,EAAE,aAA0C,CAAC;AAEzE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"hybrid.d.ts","sourceRoot":"","sources":["../../src/search/hybrid.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAM,KAAK,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAKL,KAAK,OAAO,EACb,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,eAAe,EAAE,aAA0C,CAAC;AAEzE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IAOxB,qBAAqB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAGxC,qBAAqB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAKxC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,GAAG,eAAe,CAAC;CAC3C;AAOD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,EAAE,SAAS,EAAE,CAAC;IAKlB,MAAM,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,eAAe,EAAE,CAAA;KAAE,CAAC;CAClE;AAiUD,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;IAQ1C,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAGD,wBAAsB,YAAY,CAChC,EAAE,EAAE,OAAO,EACX,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC,CAqC5C;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,EAAE,SAAS,EAAE,CAAC;CACnB;AAOD,wBAAgB,aAAa,CAC3B,EAAE,EAAE,OAAO,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,mBAAwB,GAChC,MAAM,CAAC,mBAAmB,EAAE,KAAK,CAAC,CA+CpC"}
|
package/dist/search/hybrid.js
CHANGED
|
@@ -151,23 +151,43 @@ function vecRanking(db, queryEmbedding, modelId) {
|
|
|
151
151
|
}
|
|
152
152
|
return result;
|
|
153
153
|
}
|
|
154
|
+
// snippet() excerpt budget, in tokens. ~48 stemmed tokens lands near the
|
|
155
|
+
// ~280 chars the JS fallback (SNIPPET_RADIUS * 2) produces, so lexical and
|
|
156
|
+
// fallback snippets read at comparable length.
|
|
157
|
+
const FTS_SNIPPET_TOKENS = 48;
|
|
154
158
|
// Chunk-level lexical ranking. Runs an FTS5 MATCH over `chunks_fts` (one row
|
|
155
159
|
// per chunk), reads the inverse bm25 (flip to larger=better), joins back to
|
|
156
160
|
// `chunks` on rowid to map onto document paths, and collapses to each
|
|
157
161
|
// document's BEST chunk score (max) — mirroring vecRanking's best-per-doc.
|
|
158
162
|
// A relevant topic's own chunk scores high even when its whole document is
|
|
159
|
-
// long and multi-topic. Null query (no usable tokens) returns
|
|
163
|
+
// long and multi-topic. Null query (no usable tokens) returns empty maps.
|
|
164
|
+
//
|
|
165
|
+
// The same pass captures each document's excerpt via FTS5 snippet() from its
|
|
166
|
+
// best-scoring chunk (#108): the inverted index centres the excerpt on the
|
|
167
|
+
// actual match — stemmed variants included, which the JS fallback's literal
|
|
168
|
+
// indexOf cannot see — and no full body is scanned in JS. snippet() is
|
|
169
|
+
// legal here because chunks_fts is EXTERNAL-CONTENT (content='chunks') with
|
|
170
|
+
// a matching column name; documents_fts declares content_body over a base
|
|
171
|
+
// column named content, so the document-granularity path deliberately keeps
|
|
172
|
+
// the JS fallback instead of a schema migration.
|
|
160
173
|
function chunkFtsRanking(db, query) {
|
|
161
174
|
if (query === null)
|
|
162
|
-
return new Map();
|
|
175
|
+
return { scores: new Map(), snippets: new Map() };
|
|
163
176
|
const rows = db
|
|
164
|
-
.prepare(`SELECT c.path AS path, -bm25(chunks_fts) AS score
|
|
177
|
+
.prepare(`SELECT c.path AS path, chunks_fts.rowid AS crowid, -bm25(chunks_fts) AS score
|
|
165
178
|
FROM chunks_fts
|
|
166
179
|
JOIN chunks AS c ON c.rowid = chunks_fts.rowid
|
|
167
180
|
WHERE chunks_fts MATCH ?
|
|
168
181
|
ORDER BY bm25(chunks_fts)`)
|
|
169
182
|
.all(query);
|
|
170
|
-
const
|
|
183
|
+
const scores = new Map();
|
|
184
|
+
// The winning chunk's FTS rowid per path — the snippet pass below is
|
|
185
|
+
// restricted to exactly these rows, so snippet()'s tokenize/format cost is
|
|
186
|
+
// paid once per DOCUMENT, not once per matched chunk. (A ROW_NUMBER()
|
|
187
|
+
// window subquery would not help here: the projected snippet() is still
|
|
188
|
+
// evaluated per inner row before the window filter, and FTS5 auxiliary
|
|
189
|
+
// functions cannot move outside the MATCH cursor.)
|
|
190
|
+
const winners = new Map();
|
|
171
191
|
for (const r of rows) {
|
|
172
192
|
// Some rows may produce a non-positive flipped score if FTS5 returned a
|
|
173
193
|
// positive bm25 (rare with prefix matches); drop them so the normalize
|
|
@@ -179,11 +199,31 @@ function chunkFtsRanking(db, query) {
|
|
|
179
199
|
// their raw scores are never directly compared.
|
|
180
200
|
if (r.score <= 0)
|
|
181
201
|
continue;
|
|
182
|
-
const prev =
|
|
183
|
-
if (r.score > prev)
|
|
184
|
-
|
|
202
|
+
const prev = scores.get(r.path) ?? -Infinity;
|
|
203
|
+
if (r.score > prev) {
|
|
204
|
+
scores.set(r.path, r.score);
|
|
205
|
+
// Keying on the max KEPT score guarantees the snippet always comes
|
|
206
|
+
// from the same chunk the document's score does.
|
|
207
|
+
winners.set(r.path, r.crowid);
|
|
208
|
+
}
|
|
185
209
|
}
|
|
186
|
-
|
|
210
|
+
const snippets = new Map();
|
|
211
|
+
if (winners.size > 0) {
|
|
212
|
+
const ids = [...winners.values()];
|
|
213
|
+
const placeholders = ids.map(() => "?").join(",");
|
|
214
|
+
const snips = db
|
|
215
|
+
.prepare(`SELECT c.path AS path, snippet(chunks_fts, 0, '', '', '…', ?) AS snip
|
|
216
|
+
FROM chunks_fts
|
|
217
|
+
JOIN chunks AS c ON c.rowid = chunks_fts.rowid
|
|
218
|
+
WHERE chunks_fts MATCH ? AND chunks_fts.rowid IN (${placeholders})`)
|
|
219
|
+
.all(FTS_SNIPPET_TOKENS, query, ...ids);
|
|
220
|
+
for (const s of snips) {
|
|
221
|
+
const collapsed = s.snip.replace(/\s+/g, " ").trim();
|
|
222
|
+
if (collapsed.length > 0)
|
|
223
|
+
snippets.set(s.path, collapsed);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return { scores, snippets };
|
|
187
227
|
}
|
|
188
228
|
// Core ranker shared by query search and related-document search.
|
|
189
229
|
// `matchQuery` is the FTS5 MATCH string (already prefix-OR'd, or null);
|
|
@@ -193,13 +233,18 @@ function chunkFtsRanking(db, query) {
|
|
|
193
233
|
// matching term — it doesn't drive ranking.
|
|
194
234
|
function rankDocuments(db, matchQuery, queryEmbedding, queryTokensForSnippet, opts) {
|
|
195
235
|
let bm25Norm;
|
|
236
|
+
// Best-chunk excerpts from the lexical pass (#108); empty for the
|
|
237
|
+
// document-granularity path, whose hits fall back to the JS scan.
|
|
238
|
+
let lexicalSnippets = new Map();
|
|
196
239
|
if (opts.lexicalGranularity === "chunk") {
|
|
197
240
|
// Body granularity (the dilution fix) TIERED with a clean title/tag signal
|
|
198
241
|
// (the native-shape fix). Each is normalized to its own max to reconcile the
|
|
199
242
|
// two FTS score scales; tieredLexical then ranks every body match above every
|
|
200
243
|
// title-only match. The title/tag signal reuses ftsRanking with a column-
|
|
201
244
|
// restricted query so it scores title+tags only (no body dilution).
|
|
202
|
-
const
|
|
245
|
+
const chunkRanked = chunkFtsRanking(db, matchQuery);
|
|
246
|
+
lexicalSnippets = chunkRanked.snippets;
|
|
247
|
+
const chunkNorm = normalize(chunkRanked.scores);
|
|
203
248
|
const titleTagNorm = normalize(ftsRanking(db, columnRestrict(matchQuery, "{title tags}")));
|
|
204
249
|
bm25Norm = tieredLexical(chunkNorm, titleTagNorm);
|
|
205
250
|
}
|
|
@@ -246,7 +291,10 @@ function rankDocuments(db, matchQuery, queryEmbedding, queryTokensForSnippet, op
|
|
|
246
291
|
score,
|
|
247
292
|
bm25Score,
|
|
248
293
|
vectorScore,
|
|
249
|
-
|
|
294
|
+
// FTS5's excerpt for lexical hits (#108); the JS body scan remains the
|
|
295
|
+
// fallback for vector-only and title/tag-only hits, which have no
|
|
296
|
+
// matched body chunk to centre on.
|
|
297
|
+
snippet: lexicalSnippets.get(path) ?? makeSnippet(doc.content, queryTokensForSnippet),
|
|
250
298
|
decay: computeDecay({
|
|
251
299
|
status: doc.status,
|
|
252
300
|
confidence: doc.confidence,
|