@younndai/lyt 0.9.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 (96) hide show
  1. package/LICENSE +200 -0
  2. package/NOTICE +23 -0
  3. package/README.md +117 -0
  4. package/dist/automator-bodies/arc-builder.d.ts +13 -0
  5. package/dist/automator-bodies/arc-builder.d.ts.map +1 -0
  6. package/dist/automator-bodies/arc-builder.js +34 -0
  7. package/dist/automator-bodies/arc-builder.js.map +1 -0
  8. package/dist/automator-bodies/index.d.ts +20 -0
  9. package/dist/automator-bodies/index.d.ts.map +1 -0
  10. package/dist/automator-bodies/index.js +32 -0
  11. package/dist/automator-bodies/index.js.map +1 -0
  12. package/dist/automator-bodies/lane-builder.d.ts +12 -0
  13. package/dist/automator-bodies/lane-builder.d.ts.map +1 -0
  14. package/dist/automator-bodies/lane-builder.js +34 -0
  15. package/dist/automator-bodies/lane-builder.js.map +1 -0
  16. package/dist/automator-bodies/metadata-filler.d.ts +34 -0
  17. package/dist/automator-bodies/metadata-filler.d.ts.map +1 -0
  18. package/dist/automator-bodies/metadata-filler.js +211 -0
  19. package/dist/automator-bodies/metadata-filler.js.map +1 -0
  20. package/dist/automator-run.d.ts +27 -0
  21. package/dist/automator-run.d.ts.map +1 -0
  22. package/dist/automator-run.js +137 -0
  23. package/dist/automator-run.js.map +1 -0
  24. package/dist/bench/graded-corpus.d.ts +5 -0
  25. package/dist/bench/graded-corpus.d.ts.map +1 -0
  26. package/dist/bench/graded-corpus.js +121 -0
  27. package/dist/bench/graded-corpus.js.map +1 -0
  28. package/dist/bench/invariant-corpus.d.ts +18 -0
  29. package/dist/bench/invariant-corpus.d.ts.map +1 -0
  30. package/dist/bench/invariant-corpus.js +181 -0
  31. package/dist/bench/invariant-corpus.js.map +1 -0
  32. package/dist/bench/ir-metrics.d.ts +33 -0
  33. package/dist/bench/ir-metrics.d.ts.map +1 -0
  34. package/dist/bench/ir-metrics.js +79 -0
  35. package/dist/bench/ir-metrics.js.map +1 -0
  36. package/dist/bench/latency-bench.d.ts +15 -0
  37. package/dist/bench/latency-bench.d.ts.map +1 -0
  38. package/dist/bench/latency-bench.js +68 -0
  39. package/dist/bench/latency-bench.js.map +1 -0
  40. package/dist/bench/latency-corpus.d.ts +4 -0
  41. package/dist/bench/latency-corpus.d.ts.map +1 -0
  42. package/dist/bench/latency-corpus.js +109 -0
  43. package/dist/bench/latency-corpus.js.map +1 -0
  44. package/dist/bench/pod-harness.d.ts +16 -0
  45. package/dist/bench/pod-harness.d.ts.map +1 -0
  46. package/dist/bench/pod-harness.js +127 -0
  47. package/dist/bench/pod-harness.js.map +1 -0
  48. package/dist/bench/run-bench.d.ts +20 -0
  49. package/dist/bench/run-bench.d.ts.map +1 -0
  50. package/dist/bench/run-bench.js +86 -0
  51. package/dist/bench/run-bench.js.map +1 -0
  52. package/dist/cli-automator-run.d.ts +7 -0
  53. package/dist/cli-automator-run.d.ts.map +1 -0
  54. package/dist/cli-automator-run.js +80 -0
  55. package/dist/cli-automator-run.js.map +1 -0
  56. package/dist/cli.d.ts +3 -0
  57. package/dist/cli.d.ts.map +1 -0
  58. package/dist/cli.js +161 -0
  59. package/dist/cli.js.map +1 -0
  60. package/dist/commands/bench.d.ts +3 -0
  61. package/dist/commands/bench.d.ts.map +1 -0
  62. package/dist/commands/bench.js +92 -0
  63. package/dist/commands/bench.js.map +1 -0
  64. package/dist/commands/capture.d.ts +4 -0
  65. package/dist/commands/capture.d.ts.map +1 -0
  66. package/dist/commands/capture.js +251 -0
  67. package/dist/commands/capture.js.map +1 -0
  68. package/dist/commands/init.d.ts +12 -0
  69. package/dist/commands/init.d.ts.map +1 -0
  70. package/dist/commands/init.js +741 -0
  71. package/dist/commands/init.js.map +1 -0
  72. package/dist/commands/primer.d.ts +3 -0
  73. package/dist/commands/primer.d.ts.map +1 -0
  74. package/dist/commands/primer.js +199 -0
  75. package/dist/commands/primer.js.map +1 -0
  76. package/dist/commands/reindex.d.ts +3 -0
  77. package/dist/commands/reindex.d.ts.map +1 -0
  78. package/dist/commands/reindex.js +105 -0
  79. package/dist/commands/reindex.js.map +1 -0
  80. package/dist/commands/search.d.ts +3 -0
  81. package/dist/commands/search.d.ts.map +1 -0
  82. package/dist/commands/search.js +224 -0
  83. package/dist/commands/search.js.map +1 -0
  84. package/dist/flows/heal.d.ts +29 -0
  85. package/dist/flows/heal.d.ts.map +1 -0
  86. package/dist/flows/heal.js +146 -0
  87. package/dist/flows/heal.js.map +1 -0
  88. package/dist/flows/init-bootstrap.d.ts +93 -0
  89. package/dist/flows/init-bootstrap.d.ts.map +1 -0
  90. package/dist/flows/init-bootstrap.js +561 -0
  91. package/dist/flows/init-bootstrap.js.map +1 -0
  92. package/dist/index.d.ts +11 -0
  93. package/dist/index.d.ts.map +1 -0
  94. package/dist/index.js +27 -0
  95. package/dist/index.js.map +1 -0
  96. package/package.json +81 -0
@@ -0,0 +1,211 @@
1
+ /*
2
+ * Copyright 2026 MARLINK TRADING SRL (YounndAI)
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ // Metadata-filler automator body (block-B Commit 7).
17
+ //
18
+ // Per arc-thoughts §6.13 Example 1 (LOCKED 2026-05-27) + the bundled
19
+ // declaration at packages/lyt-vault/src/scaffold/defaults/automators/
20
+ // metadata-filler.yon — archetype=filler, runtime=deterministic,
21
+ // llm_capability=none. Walks <vault>/notes/**/*.md, detects which of the
22
+ // 8 mandatory frontmatter fields (arc §3 contract — title, created,
23
+ // modified, tags, purpose, topic, mesh-visibility, weight) are missing,
24
+ // fills missing ones with deterministic defaults, and writes back via
25
+ // the pre-write @STAMP hook so provenance + audit_log + last_provenance:
26
+ // land per arc §11.4.
27
+ //
28
+ // Why this lives in @younndai/lyt — and not lyt-runner — block-B v1:
29
+ // runFiveStep's `runBody` is body-shape-agnostic; the meta CLI is the
30
+ // single place that knows which archetype maps to which TS function for
31
+ // v1. Future archetypes (rollup, ingest, lane-builder) add their own
32
+ // modules here and get dispatched by automator-bodies/index.ts.
33
+ import { readdirSync, readFileSync, statSync } from "node:fs";
34
+ import { join, relative, sep, posix } from "node:path";
35
+ import { writeMarkdownWithStamp } from "@younndai/lyt-runner";
36
+ const MANDATORY_FIELDS = [
37
+ "title",
38
+ "created",
39
+ "modified",
40
+ "tags",
41
+ "purpose",
42
+ "topic",
43
+ "mesh-visibility",
44
+ "weight",
45
+ ];
46
+ export async function runMetadataFillerBody(ctx, args) {
47
+ const notesRoot = join(args.vaultPath, "notes");
48
+ const targets = walkMarkdownFiles(notesRoot);
49
+ const outcome = {
50
+ filesScanned: targets.length,
51
+ filesMutated: 0,
52
+ fieldsFilledTotal: 0,
53
+ filesWritten: [],
54
+ };
55
+ for (const absPath of targets) {
56
+ const raw = readFileSync(absPath, "utf8");
57
+ const filled = fillMissingMandatoryFields(raw, {
58
+ filenameSlug: filenameSlug(absPath),
59
+ now: new Date(ctx.startedAt).toISOString(),
60
+ });
61
+ if (filled.fieldsFilled.length === 0)
62
+ continue;
63
+ await writeMarkdownWithStamp(ctx, args.vaultDb, {
64
+ path: absPath,
65
+ content: filled.content,
66
+ vaultRoot: args.vaultPath,
67
+ stamp: {
68
+ src: `automator:${args.automatorName}/v${args.automatorVersion}`,
69
+ method: "filler",
70
+ confidence: 1.0,
71
+ details: { fields_filled: filled.fieldsFilled },
72
+ },
73
+ ...(args.ledgerClients !== undefined ? { ledgerClients: args.ledgerClients } : {}),
74
+ });
75
+ outcome.filesMutated += 1;
76
+ outcome.fieldsFilledTotal += filled.fieldsFilled.length;
77
+ outcome.filesWritten.push(toVaultRel(absPath, args.vaultPath));
78
+ }
79
+ return outcome;
80
+ }
81
+ // ---------------------------------------------------------------------------
82
+ // Frontmatter mutation (line-based; no full YAML parse — same posture as
83
+ // lyt-runner/hooks/frontmatter.ts upsertLastProvenance).
84
+ // ---------------------------------------------------------------------------
85
+ const FRONTMATTER_DELIM = "---";
86
+ export function fillMissingMandatoryFields(raw, defaults) {
87
+ const lines = raw.split(/\r?\n/);
88
+ let firstNonEmpty = -1;
89
+ for (let i = 0; i < lines.length; i++) {
90
+ if (lines[i].length > 0) {
91
+ firstNonEmpty = i;
92
+ break;
93
+ }
94
+ }
95
+ // No frontmatter at all — prepend a fresh block with every mandatory field.
96
+ if (firstNonEmpty === -1 || lines[firstNonEmpty] !== FRONTMATTER_DELIM) {
97
+ const fresh = renderFreshFrontmatter(defaults);
98
+ return {
99
+ content: `${fresh}\n${raw}`,
100
+ fieldsFilled: [...MANDATORY_FIELDS],
101
+ };
102
+ }
103
+ // Walk the open frontmatter looking for the closing delim.
104
+ let closeIdx = -1;
105
+ for (let i = firstNonEmpty + 1; i < lines.length; i++) {
106
+ if (lines[i] === FRONTMATTER_DELIM) {
107
+ closeIdx = i;
108
+ break;
109
+ }
110
+ }
111
+ if (closeIdx === -1) {
112
+ // Malformed (open with no close). Mirror upsertLastProvenance: prepend
113
+ // a fresh block and leave the broken doc untouched below it.
114
+ const fresh = renderFreshFrontmatter(defaults);
115
+ return {
116
+ content: `${fresh}\n${raw}`,
117
+ fieldsFilled: [...MANDATORY_FIELDS],
118
+ };
119
+ }
120
+ // Detect which mandatory fields are already present (key-only check; we
121
+ // never overwrite an existing handler-managed value).
122
+ const present = new Set();
123
+ for (let i = firstNonEmpty + 1; i < closeIdx; i++) {
124
+ const lineNoIndent = lines[i].replace(/^\s+/, "");
125
+ for (const f of MANDATORY_FIELDS) {
126
+ if (lineNoIndent.startsWith(`${f}:`) || lineNoIndent.startsWith(`${f} :`)) {
127
+ present.add(f);
128
+ break;
129
+ }
130
+ }
131
+ }
132
+ const missing = MANDATORY_FIELDS.filter((f) => !present.has(f));
133
+ if (missing.length === 0) {
134
+ return { content: raw, fieldsFilled: [] };
135
+ }
136
+ // Insert the missing fields right before the closing delim. Preserve the
137
+ // input's line ending shape best-effort by re-joining with `\n` — the
138
+ // hook re-serializes the file anyway.
139
+ const insertions = missing.map((f) => `${f}: ${renderDefault(f, defaults)}`);
140
+ lines.splice(closeIdx, 0, ...insertions);
141
+ return {
142
+ content: lines.join("\n"),
143
+ fieldsFilled: missing,
144
+ };
145
+ }
146
+ function renderFreshFrontmatter(defaults) {
147
+ const body = MANDATORY_FIELDS.map((f) => `${f}: ${renderDefault(f, defaults)}`).join("\n");
148
+ return `---\n${body}\n---`;
149
+ }
150
+ function renderDefault(field, defaults) {
151
+ switch (field) {
152
+ case "title":
153
+ return `"${defaults.filenameSlug}"`;
154
+ case "created":
155
+ return defaults.now;
156
+ case "modified":
157
+ return defaults.now;
158
+ case "tags":
159
+ return "[]";
160
+ case "purpose":
161
+ return '""';
162
+ case "topic":
163
+ return '""';
164
+ case "mesh-visibility":
165
+ return "local";
166
+ case "weight":
167
+ return "3";
168
+ }
169
+ }
170
+ // ---------------------------------------------------------------------------
171
+ // Filesystem helpers
172
+ // ---------------------------------------------------------------------------
173
+ function walkMarkdownFiles(root) {
174
+ const out = [];
175
+ let names;
176
+ try {
177
+ names = readdirSync(root);
178
+ }
179
+ catch {
180
+ return out;
181
+ }
182
+ for (const name of names) {
183
+ const p = join(root, name);
184
+ let stat;
185
+ try {
186
+ stat = statSync(p);
187
+ }
188
+ catch {
189
+ continue;
190
+ }
191
+ if (stat.isDirectory()) {
192
+ out.push(...walkMarkdownFiles(p));
193
+ }
194
+ else if (stat.isFile() && p.toLowerCase().endsWith(".md")) {
195
+ out.push(p);
196
+ }
197
+ }
198
+ return out;
199
+ }
200
+ function filenameSlug(absPath) {
201
+ const parts = absPath.split(/[\\/]/);
202
+ const base = parts[parts.length - 1];
203
+ return base.replace(/\.md$/i, "");
204
+ }
205
+ function toVaultRel(absPath, vaultRoot) {
206
+ return relative(vaultRoot, absPath).split(sep).join(posix.sep);
207
+ }
208
+ // Re-export for tests + future archetype consumers.
209
+ export { MANDATORY_FIELDS };
210
+ export { walkMarkdownFiles as _walkMarkdownFilesForTests };
211
+ //# sourceMappingURL=metadata-filler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata-filler.js","sourceRoot":"","sources":["../../src/automator-bodies/metadata-filler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { Client } from "@libsql/client";
2
+ import { type LytRunContext } from "@younndai/lyt-runner";
3
+ import { type AutomatorRunPlan } from "@younndai/lyt-vault";
4
+ import { resolveAutomatorBody } from "./automator-bodies/index.js";
5
+ export interface RunAutomatorArgs {
6
+ automator: string;
7
+ vault?: string;
8
+ vaultPathOverride?: string;
9
+ dryRun?: boolean;
10
+ noPush?: boolean;
11
+ machineId?: string;
12
+ getNow?: () => number;
13
+ registryDb?: Client;
14
+ }
15
+ export interface RunAutomatorResult {
16
+ ok: boolean;
17
+ runId: Uint8Array;
18
+ plan: AutomatorRunPlan;
19
+ body: unknown;
20
+ context: LytRunContext;
21
+ status: string;
22
+ errorSummary: string | null;
23
+ automatorVersion: string;
24
+ }
25
+ export declare function runAutomator(args: RunAutomatorArgs): Promise<RunAutomatorResult>;
26
+ export { resolveAutomatorBody };
27
+ //# sourceMappingURL=automator-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automator-run.d.ts","sourceRoot":"","sources":["../src/automator-run.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAiC,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAKL,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,oBAAoB,EAAwB,MAAM,6BAA6B,CAAC;AAEzF,MAAM,WAAW,gBAAgB;IAI/B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IAGjB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;IAGtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAOD,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAoFtF;AAsBD,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,137 @@
1
+ /*
2
+ * Copyright 2026 MARLINK TRADING SRL (YounndAI)
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ // Meta CLI automator-run composition (block-B Commit 7).
17
+ //
18
+ // This is the single function the `lyt automator run` CLI subcommand and
19
+ // the metadata-filler end-to-end integration test both consume. It glues
20
+ // together the lyt-vault `buildAutomatorRunPlan` (plan + opened DB clients),
21
+ // the meta-CLI archetype dispatcher (`resolveAutomatorBody`), and the
22
+ // lyt-runner `runFiveStep` orchestrator into one entry point.
23
+ //
24
+ // Composition pattern mirrors meshCmd at packages/lyt/src/cli.ts:38-47 —
25
+ // lyt-vault registers the `automator` parent (commands/automator.ts ships
26
+ // list/log/status); the meta CLI attaches the `run` subcommand here so the
27
+ // runFiveStep call site lives in a package that depends on both lyt-vault
28
+ // and lyt-runner. lyt-vault must not depend on lyt-runner (the reverse
29
+ // already holds), and this seam preserves that invariant.
30
+ import { hostname } from "node:os";
31
+ import { readFileSync } from "node:fs";
32
+ import { createLytRuntime, runFiveStep } from "@younndai/lyt-runner";
33
+ import { buildAutomatorRunPlan, closeAutomatorRunPlan, newUuidv7Bytes, recordCliInvocation, } from "@younndai/lyt-vault";
34
+ import { resolveAutomatorBody } from "./automator-bodies/index.js";
35
+ // ---------------------------------------------------------------------------
36
+ // Single-entry composition. The CLI invokes this and forwards exit codes;
37
+ // the integration test invokes it and inspects the result + side effects.
38
+ // ---------------------------------------------------------------------------
39
+ export async function runAutomator(args) {
40
+ const plan = await buildAutomatorRunPlan({
41
+ automator: args.automator,
42
+ ...(args.vault !== undefined ? { vault: args.vault } : {}),
43
+ ...(args.vaultPathOverride !== undefined ? { vaultPathOverride: args.vaultPathOverride } : {}),
44
+ });
45
+ try {
46
+ const body = resolveAutomatorBody(plan.automatorName);
47
+ if (body === null) {
48
+ throw new Error(`lyt automator run: no v1 body registered for automator '${plan.automatorName}'. ` +
49
+ "Known v1 archetypes: metadata-filler, lane-builder, arc-builder. Future archetypes " +
50
+ "(rollup, ingest, log-compactor) ship in later phases.");
51
+ }
52
+ const automatorVersion = extractAutomatorVersion(plan.automatorYonPath);
53
+ const machineId = args.machineId ?? `${hostname()}:lyt`;
54
+ const registryDb = args.registryDb ?? plan.registryDb;
55
+ const runtime = createLytRuntime({
56
+ db: registryDb,
57
+ vaultPath: plan.vaultPath,
58
+ machineId,
59
+ ...(args.getNow !== undefined ? { getNow: args.getNow } : {}),
60
+ });
61
+ const runId = newUuidv7Bytes();
62
+ const startTs = runtime.getNow();
63
+ const bodyFn = body;
64
+ const result = await runFiveStep(runtime, {
65
+ automatorRid: plan.automatorRid,
66
+ vaultRid: plan.vaultRid,
67
+ vaultPath: plan.vaultPath,
68
+ vaultDb: plan.vaultDb,
69
+ automatorName: `automator:${plan.automatorName}`,
70
+ runIdOverride: runId,
71
+ runBody: async (ctx) => bodyFn(ctx, {
72
+ vaultPath: plan.vaultPath,
73
+ vaultDb: plan.vaultDb,
74
+ automatorName: plan.automatorName,
75
+ automatorVersion,
76
+ // v1.A.5 OPT-1 caller-side: thread pre-opened audit + provenance
77
+ // clients to skip per-write open/close inside the @STAMP hook.
78
+ ledgerClients: {
79
+ auditDb: plan.auditDb,
80
+ provenanceDb: plan.provenanceDb,
81
+ },
82
+ }),
83
+ ...(args.dryRun === true ? { dryRun: true } : {}),
84
+ ...(args.noPush === true ? { noPush: true } : {}),
85
+ });
86
+ // cli.invoked event is logged AFTER runFiveStep returns so the
87
+ // automator_runs row (inserted at the start of runFiveStep when
88
+ // persistRunLedger is true) satisfies the automator_run_events.run_id
89
+ // FK constraint. The event's `ts` is the captured startTs so the
90
+ // chronological log still shows cli.invoked BEFORE step.acquire.*
91
+ // (events sort by ts, not by insertion order). Skipped on dryRun
92
+ // because runFiveStep skips the parent INSERT in that mode.
93
+ if (args.dryRun !== true) {
94
+ await recordCliInvocation(plan, {
95
+ runId,
96
+ ts: startTs,
97
+ dryRun: false,
98
+ noPush: args.noPush === true,
99
+ automatorVersion,
100
+ });
101
+ }
102
+ return {
103
+ ok: result.ok,
104
+ runId,
105
+ plan,
106
+ body: result.context.bodyResult,
107
+ context: result.context,
108
+ status: result.context.status,
109
+ errorSummary: result.context.errorSummary,
110
+ automatorVersion,
111
+ };
112
+ }
113
+ finally {
114
+ await closeAutomatorRunPlan(plan);
115
+ }
116
+ }
117
+ // ---------------------------------------------------------------------------
118
+ // Helpers
119
+ // ---------------------------------------------------------------------------
120
+ // Minimal hand-rolled version extractor — mirrors the rid-only extractor in
121
+ // flows/automator-run.ts:88-92. Looks for `version=<token>` within the first
122
+ // @AUTOMATOR block and returns the token (no quote stripping needed; YON
123
+ // version fields are bare per arc §6.13 Example 1). Falls back to "0.0.0"
124
+ // if the field is absent so the stamp src still renders deterministically.
125
+ function extractAutomatorVersion(yonPath) {
126
+ let raw;
127
+ try {
128
+ raw = readFileSync(yonPath, "utf8");
129
+ }
130
+ catch {
131
+ return "0.0.0";
132
+ }
133
+ const m = raw.match(/@AUTOMATOR[^@]*?\sversion=([^\s|]+)/);
134
+ return m !== null && m[1] !== undefined ? m[1] : "0.0.0";
135
+ }
136
+ export { resolveAutomatorBody };
137
+ //# sourceMappingURL=automator-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automator-run.js","sourceRoot":"","sources":["../src/automator-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,yDAAyD;AACzD,EAAE;AACF,yEAAyE;AACzE,yEAAyE;AACzE,6EAA6E;AAC7E,sEAAsE;AACtE,8DAA8D;AAC9D,EAAE;AACF,yEAAyE;AACzE,0EAA0E;AAC1E,2EAA2E;AAC3E,0EAA0E;AAC1E,uEAAuE;AACvE,0DAA0D;AAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAsB,MAAM,sBAAsB,CAAC;AACzF,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,mBAAmB,GAEpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,oBAAoB,EAAwB,MAAM,6BAA6B,CAAC;AAkCzF,8EAA8E;AAC9E,0EAA0E;AAC1E,0EAA0E;AAC1E,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAsB;IACvD,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC;QACvC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,GAAG,CAAC,IAAI,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/F,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACtD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACb,2DAA2D,IAAI,CAAC,aAAa,KAAK;gBAChF,qFAAqF;gBACrF,uDAAuD,CAC1D,CAAC;QACJ,CAAC;QAED,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACxE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,GAAG,QAAQ,EAAE,MAAM,CAAC;QACxD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC;QACtD,MAAM,OAAO,GAAG,gBAAgB,CAAC;YAC/B,EAAE,EAAE,UAAU;YACd,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS;YACT,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9D,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAEjC,MAAM,MAAM,GAAoB,IAAI,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE;YACxC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,aAAa,EAAE,aAAa,IAAI,CAAC,aAAa,EAAE;YAChD,aAAa,EAAE,KAAK;YACpB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CACrB,MAAM,CAAC,GAAG,EAAE;gBACV,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,gBAAgB;gBAChB,iEAAiE;gBACjE,+DAA+D;gBAC/D,aAAa,EAAE;oBACb,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,YAAY,EAAE,IAAI,CAAC,YAAY;iBAChC;aACF,CAAC;YACJ,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClD,CAAC,CAAC;QAEH,+DAA+D;QAC/D,gEAAgE;QAChE,sEAAsE;QACtE,iEAAiE;QACjE,kEAAkE;QAClE,iEAAiE;QACjE,4DAA4D;QAC5D,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACzB,MAAM,mBAAmB,CAAC,IAAI,EAAE;gBAC9B,KAAK;gBACL,EAAE,EAAE,OAAO;gBACX,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,IAAI;gBAC5B,gBAAgB;aACjB,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,KAAK;YACL,IAAI;YACJ,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU;YAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;YAC7B,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY;YACzC,gBAAgB;SACjB,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,4EAA4E;AAC5E,6EAA6E;AAC7E,yEAAyE;AACzE,0EAA0E;AAC1E,2EAA2E;AAC3E,SAAS,uBAAuB,CAAC,OAAe;IAC9C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IAC3D,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC3D,CAAC;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { VaultSeed } from "./invariant-corpus.js";
2
+ import type { GradedQuery } from "./ir-metrics.js";
3
+ export declare function gradedCorpus(): VaultSeed[];
4
+ export declare const GRADED_QUERIES: readonly GradedQuery[];
5
+ //# sourceMappingURL=graded-corpus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graded-corpus.d.ts","sourceRoot":"","sources":["../../src/bench/graded-corpus.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AA8EnD,wBAAgB,YAAY,IAAI,SAAS,EAAE,CAW1C;AAED,eAAO,MAAM,cAAc,EAAE,SAAS,WAAW,EA0BhD,CAAC"}
@@ -0,0 +1,121 @@
1
+ /*
2
+ * Copyright 2026 MARLINK TRADING SRL (YounndAI)
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ const TS = "created: 2026-02-01T00:00:00.000Z\nmodified: 2026-02-01T00:00:00.000Z";
17
+ // Planted graded docs live in `graded-main`; topic terms are isolated per query
18
+ // so BM25 frequency cleanly tracks the intended grade (except Q-replica).
19
+ const PLANTED = [
20
+ // Q-turso — aced. turso-1 (×5) > turso-2 (×2) > turso-3 (×1) ⇒ grade order 3,2,1.
21
+ {
22
+ vault: "graded-main",
23
+ rel: "notes/turso-1.md",
24
+ body: "turso is an edge database. turso turso turso scales globally with turso.",
25
+ },
26
+ {
27
+ vault: "graded-main",
28
+ rel: "notes/turso-2.md",
29
+ body: "We evaluated turso for production. turso handles writes.",
30
+ },
31
+ { vault: "graded-main", rel: "notes/turso-3.md", body: "A passing mention of turso here." },
32
+ // Q-libsql — aced.
33
+ {
34
+ vault: "graded-main",
35
+ rel: "notes/libsql-1.md",
36
+ body: "libsql is a sqlite fork. libsql client and libsql server libsql.",
37
+ },
38
+ { vault: "graded-main", rel: "notes/libsql-2.md", body: "built on libsql internally." },
39
+ // Q-federation — aced.
40
+ {
41
+ vault: "graded-main",
42
+ rel: "notes/fed-1.md",
43
+ body: "federation connects vaults. federation edges and federation subscriptions federation.",
44
+ },
45
+ { vault: "graded-main", rel: "notes/fed-2.md", body: "the federation layer spans vaults." },
46
+ // Q-replica — NON-ACED. replica-rep (×6, grade 1) outranks replica-design
47
+ // (×3, grade 3) by raw BM25 ⇒ nDCG ≈ 0.71 for this query. Intentional.
48
+ {
49
+ vault: "graded-main",
50
+ rel: "notes/replica-design.md",
51
+ body: "Embedded replica design. The replica model is the canonical local-first replica approach.",
52
+ },
53
+ {
54
+ vault: "graded-main",
55
+ rel: "notes/replica-rep.md",
56
+ body: "replica replica replica replica replica replica shards.",
57
+ },
58
+ // Cleanliness trap — "turso" appears ONLY inside a code fence (stripped by FTS
59
+ // hygiene). If it surfaces for Q-turso, cleanliness > 0 and the bench fails.
60
+ {
61
+ vault: "graded-main",
62
+ rel: "notes/fence-trap.md",
63
+ body: "Tea notes and beverages.\n\n```\nturso()\n```\n",
64
+ },
65
+ ];
66
+ // Off-topic filler (a second vault) — realistic noise; shares no query term.
67
+ const FILLER_TOPICS = [
68
+ "recipe brunch",
69
+ "travel itinerary",
70
+ "meeting agenda",
71
+ "garden notes",
72
+ "book review",
73
+ "budget summary",
74
+ ];
75
+ function fillerDocs() {
76
+ return FILLER_TOPICS.map((t, i) => ({
77
+ vault: "graded-side",
78
+ rel: `notes/filler-${String(i + 1).padStart(2, "0")}.md`,
79
+ body: `Notes on ${t}. ${t} details and ${t} follow-ups.`,
80
+ }));
81
+ }
82
+ export function gradedCorpus() {
83
+ const byVault = new Map();
84
+ for (const d of [...PLANTED, ...fillerDocs()]) {
85
+ let seed = byVault.get(d.vault);
86
+ if (seed === undefined) {
87
+ seed = { vault: d.vault, notes: [] };
88
+ byVault.set(d.vault, seed);
89
+ }
90
+ seed.notes.push({ rel: d.rel, frontmatter: TS, body: d.body });
91
+ }
92
+ return [...byVault.values()];
93
+ }
94
+ export const GRADED_QUERIES = [
95
+ {
96
+ id: "Q-turso",
97
+ query: "turso",
98
+ scope: "federation",
99
+ grades: { "turso-1.md": 3, "turso-2.md": 2, "turso-3.md": 1 },
100
+ traps: ["fence-trap.md"],
101
+ },
102
+ {
103
+ id: "Q-libsql",
104
+ query: "libsql",
105
+ scope: "federation",
106
+ grades: { "libsql-1.md": 3, "libsql-2.md": 1 },
107
+ },
108
+ {
109
+ id: "Q-federation",
110
+ query: "federation",
111
+ scope: "federation",
112
+ grades: { "fed-1.md": 3, "fed-2.md": 2 },
113
+ },
114
+ {
115
+ id: "Q-replica",
116
+ query: "replica",
117
+ scope: "federation",
118
+ grades: { "replica-design.md": 3, "replica-rep.md": 1 },
119
+ },
120
+ ];
121
+ //# sourceMappingURL=graded-corpus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graded-corpus.js","sourceRoot":"","sources":["../../src/bench/graded-corpus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { BenchPod } from "./pod-harness.js";
2
+ export interface InvariantResult {
3
+ id: string;
4
+ name: string;
5
+ passed: boolean;
6
+ detail: string;
7
+ }
8
+ export interface VaultSeed {
9
+ vault: string;
10
+ notes: {
11
+ rel: string;
12
+ frontmatter: string;
13
+ body: string;
14
+ }[];
15
+ }
16
+ export declare const INVARIANT_CORPUS: readonly VaultSeed[];
17
+ export declare function runInvariants(pod: BenchPod): Promise<InvariantResult[]>;
18
+ //# sourceMappingURL=invariant-corpus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invariant-corpus.d.ts","sourceRoot":"","sources":["../../src/bench/invariant-corpus.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGjD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAEhB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC7D;AAKD,eAAO,MAAM,gBAAgB,EAAE,SAAS,SAAS,EA2EhD,CAAC;AAEF,wBAAsB,aAAa,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAqG7E"}