linger-skill 0.2.2
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 +31 -0
- package/LICENSE +21 -0
- package/PRIVACY.md +31 -0
- package/README.md +300 -0
- package/README.zh-CN.md +300 -0
- package/SECURITY.md +25 -0
- package/dist/adapter-evidence.d.ts +31 -0
- package/dist/adapter-evidence.js +166 -0
- package/dist/adapter-evidence.js.map +1 -0
- package/dist/adapters.d.ts +20 -0
- package/dist/adapters.js +105 -0
- package/dist/adapters.js.map +1 -0
- package/dist/capture.d.ts +16 -0
- package/dist/capture.js +108 -0
- package/dist/capture.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +217 -0
- package/dist/cli.js.map +1 -0
- package/dist/control.d.ts +9 -0
- package/dist/control.js +38 -0
- package/dist/control.js.map +1 -0
- package/dist/decision-extraction.d.ts +4 -0
- package/dist/decision-extraction.js +63 -0
- package/dist/decision-extraction.js.map +1 -0
- package/dist/decisions.d.ts +60 -0
- package/dist/decisions.js +166 -0
- package/dist/decisions.js.map +1 -0
- package/dist/delete.d.ts +21 -0
- package/dist/delete.js +96 -0
- package/dist/delete.js.map +1 -0
- package/dist/doctor.d.ts +6 -0
- package/dist/doctor.js +208 -0
- package/dist/doctor.js.map +1 -0
- package/dist/enrichment.d.ts +82 -0
- package/dist/enrichment.js +359 -0
- package/dist/enrichment.js.map +1 -0
- package/dist/eval-adversarial.d.ts +2 -0
- package/dist/eval-adversarial.js +20 -0
- package/dist/eval-adversarial.js.map +1 -0
- package/dist/eval-cli.d.ts +2 -0
- package/dist/eval-cli.js +83 -0
- package/dist/eval-cli.js.map +1 -0
- package/dist/eval-generator.d.ts +41 -0
- package/dist/eval-generator.js +36 -0
- package/dist/eval-generator.js.map +1 -0
- package/dist/eval-heldout.d.ts +2 -0
- package/dist/eval-heldout.js +56 -0
- package/dist/eval-heldout.js.map +1 -0
- package/dist/eval-io.d.ts +6 -0
- package/dist/eval-io.js +15 -0
- package/dist/eval-io.js.map +1 -0
- package/dist/eval-runner.d.ts +8 -0
- package/dist/eval-runner.js +56 -0
- package/dist/eval-runner.js.map +1 -0
- package/dist/eval-scorer.d.ts +27 -0
- package/dist/eval-scorer.js +28 -0
- package/dist/eval-scorer.js.map +1 -0
- package/dist/hook-cli.d.ts +2 -0
- package/dist/hook-cli.js +28 -0
- package/dist/hook-cli.js.map +1 -0
- package/dist/hook-command.d.ts +9 -0
- package/dist/hook-command.js +31 -0
- package/dist/hook-command.js.map +1 -0
- package/dist/hook-handler.d.ts +24 -0
- package/dist/hook-handler.js +93 -0
- package/dist/hook-handler.js.map +1 -0
- package/dist/hook-installer.d.ts +4 -0
- package/dist/hook-installer.js +120 -0
- package/dist/hook-installer.js.map +1 -0
- package/dist/hook-ownership.d.ts +8 -0
- package/dist/hook-ownership.js +51 -0
- package/dist/hook-ownership.js.map +1 -0
- package/dist/install-consent.d.ts +4 -0
- package/dist/install-consent.js +20 -0
- package/dist/install-consent.js.map +1 -0
- package/dist/installer.d.ts +33 -0
- package/dist/installer.js +140 -0
- package/dist/installer.js.map +1 -0
- package/dist/io.d.ts +7 -0
- package/dist/io.js +86 -0
- package/dist/io.js.map +1 -0
- package/dist/memory-events.d.ts +31 -0
- package/dist/memory-events.js +109 -0
- package/dist/memory-events.js.map +1 -0
- package/dist/memory-intent.d.ts +1 -0
- package/dist/memory-intent.js +4 -0
- package/dist/memory-intent.js.map +1 -0
- package/dist/paths.d.ts +15 -0
- package/dist/paths.js +24 -0
- package/dist/paths.js.map +1 -0
- package/dist/pending.d.ts +21 -0
- package/dist/pending.js +76 -0
- package/dist/pending.js.map +1 -0
- package/dist/processed-markdown.d.ts +3 -0
- package/dist/processed-markdown.js +29 -0
- package/dist/processed-markdown.js.map +1 -0
- package/dist/processing-policy.d.ts +19 -0
- package/dist/processing-policy.js +79 -0
- package/dist/processing-policy.js.map +1 -0
- package/dist/processing.d.ts +4 -0
- package/dist/processing.js +143 -0
- package/dist/processing.js.map +1 -0
- package/dist/purge.d.ts +7 -0
- package/dist/purge.js +16 -0
- package/dist/purge.js.map +1 -0
- package/dist/recall-sampling.d.ts +53 -0
- package/dist/recall-sampling.js +201 -0
- package/dist/recall-sampling.js.map +1 -0
- package/dist/recall.d.ts +19 -0
- package/dist/recall.js +70 -0
- package/dist/recall.js.map +1 -0
- package/dist/record-paths.d.ts +18 -0
- package/dist/record-paths.js +38 -0
- package/dist/record-paths.js.map +1 -0
- package/dist/repair.d.ts +4 -0
- package/dist/repair.js +83 -0
- package/dist/repair.js.map +1 -0
- package/dist/runtime-identity.d.ts +1 -0
- package/dist/runtime-identity.js +31 -0
- package/dist/runtime-identity.js.map +1 -0
- package/dist/runtime-installer.d.ts +7 -0
- package/dist/runtime-installer.js +43 -0
- package/dist/runtime-installer.js.map +1 -0
- package/dist/schema-validation.d.ts +26 -0
- package/dist/schema-validation.js +222 -0
- package/dist/schema-validation.js.map +1 -0
- package/dist/search.d.ts +16 -0
- package/dist/search.js +192 -0
- package/dist/search.js.map +1 -0
- package/dist/sensitivity.d.ts +6 -0
- package/dist/sensitivity.js +27 -0
- package/dist/sensitivity.js.map +1 -0
- package/dist/tag-registry.d.ts +21 -0
- package/dist/tag-registry.js +70 -0
- package/dist/tag-registry.js.map +1 -0
- package/dist/term-graph.d.ts +18 -0
- package/dist/term-graph.js +63 -0
- package/dist/term-graph.js.map +1 -0
- package/dist/types.d.ts +68 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/vault-candidates.d.ts +1 -0
- package/dist/vault-candidates.js +57 -0
- package/dist/vault-candidates.js.map +1 -0
- package/dist/vault.d.ts +28 -0
- package/dist/vault.js +158 -0
- package/dist/vault.js.map +1 -0
- package/dist/windows-command.d.ts +6 -0
- package/dist/windows-command.js +9 -0
- package/dist/windows-command.js.map +1 -0
- package/package.json +53 -0
- package/scripts/release-readiness.mjs +58 -0
- package/skills/linger/SKILL.md +56 -0
- package/skills/linger/agents/openai.yaml +4 -0
- package/skills/linger/references/protocol.md +84 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { ProcessedMemory, RawEvent } from "./types.js";
|
|
2
|
+
export type HostAgent = "codex" | "claude-code";
|
|
3
|
+
export interface EnrichmentOverlay {
|
|
4
|
+
schema_version: 1;
|
|
5
|
+
enrichment_id: string;
|
|
6
|
+
project_id: string;
|
|
7
|
+
memory_id: string;
|
|
8
|
+
source_events: string[];
|
|
9
|
+
source_hash: string;
|
|
10
|
+
type: ProcessedMemory["type"];
|
|
11
|
+
title: string;
|
|
12
|
+
summary: string;
|
|
13
|
+
tags: string[];
|
|
14
|
+
predictive_tags: string[];
|
|
15
|
+
retrieval_phrases: string[];
|
|
16
|
+
agent: HostAgent;
|
|
17
|
+
model?: string;
|
|
18
|
+
created_at: string;
|
|
19
|
+
}
|
|
20
|
+
export interface EnrichmentBatchTarget {
|
|
21
|
+
memory_id: string;
|
|
22
|
+
source_events: string[];
|
|
23
|
+
source_hash: string;
|
|
24
|
+
}
|
|
25
|
+
export interface EnrichmentBatchRecord {
|
|
26
|
+
schema_version: 1;
|
|
27
|
+
batch_id: string;
|
|
28
|
+
project_id: string;
|
|
29
|
+
targets: EnrichmentBatchTarget[];
|
|
30
|
+
created_at: string;
|
|
31
|
+
}
|
|
32
|
+
export interface EnrichmentBatchItem extends EnrichmentBatchTarget {
|
|
33
|
+
baseline: Pick<ProcessedMemory, "type" | "title" | "summary" | "tags" | "predictive_tags" | "retrieval_phrases" | "source" | "confidence" | "source_savepoint_status">;
|
|
34
|
+
evidence: Array<Pick<RawEvent, "event_id" | "session_id" | "turn_id" | "role" | "timestamp" | "content" | "savepoint_status"> & {
|
|
35
|
+
content_truncated: boolean;
|
|
36
|
+
}>;
|
|
37
|
+
}
|
|
38
|
+
export interface EnrichmentBatch {
|
|
39
|
+
schema_version: 1;
|
|
40
|
+
batch_id: string;
|
|
41
|
+
project_id: string;
|
|
42
|
+
created_at: string;
|
|
43
|
+
items: EnrichmentBatchItem[];
|
|
44
|
+
}
|
|
45
|
+
export interface EnrichmentSubmissionItem {
|
|
46
|
+
memory_id: string;
|
|
47
|
+
evidence_refs: string[];
|
|
48
|
+
type: ProcessedMemory["type"];
|
|
49
|
+
title: string;
|
|
50
|
+
summary: string;
|
|
51
|
+
tags: string[];
|
|
52
|
+
predictive_tags: string[];
|
|
53
|
+
retrieval_phrases: string[];
|
|
54
|
+
}
|
|
55
|
+
export interface EnrichmentSubmission {
|
|
56
|
+
schema_version: 1;
|
|
57
|
+
batch_id: string;
|
|
58
|
+
project_id: string;
|
|
59
|
+
agent: HostAgent;
|
|
60
|
+
model?: string;
|
|
61
|
+
items: EnrichmentSubmissionItem[];
|
|
62
|
+
}
|
|
63
|
+
export declare function prepareEnrichmentBatch(root: string, projectId: string, options?: {
|
|
64
|
+
limit?: number;
|
|
65
|
+
maxCharacters?: number;
|
|
66
|
+
}): Promise<EnrichmentBatch | undefined>;
|
|
67
|
+
export declare function commitEnrichment(root: string, value: unknown): Promise<{
|
|
68
|
+
committed: number;
|
|
69
|
+
overlays: string[];
|
|
70
|
+
}>;
|
|
71
|
+
export declare function enrichmentStatus(root: string, projectId: string): Promise<{
|
|
72
|
+
project_id: string;
|
|
73
|
+
pending: number;
|
|
74
|
+
enriched: number;
|
|
75
|
+
}>;
|
|
76
|
+
export declare function readEnrichmentOverlays(root: string, projectId: string): Promise<Map<string, EnrichmentOverlay>>;
|
|
77
|
+
export declare function applyEnrichment(memory: ProcessedMemory, overlay: EnrichmentOverlay | undefined): ProcessedMemory;
|
|
78
|
+
export declare function assertEnrichmentOverlay(value: unknown): asserts value is EnrichmentOverlay;
|
|
79
|
+
export declare function assertEnrichmentOverlayPath(root: string, file: string, overlay: EnrichmentOverlay): void;
|
|
80
|
+
export declare function assertEnrichmentBatchRecord(value: unknown): asserts value is EnrichmentBatchRecord;
|
|
81
|
+
export declare function assertEnrichmentBatchPath(root: string, file: string, batch: EnrichmentBatchRecord): void;
|
|
82
|
+
export declare function assertEnrichmentSubmission(value: unknown): asserts value is EnrichmentSubmission;
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { unlink } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { effectiveMemoryStates } from "./memory-events.js";
|
|
5
|
+
import { assertReadableInside, assertWritableInside, atomicJson, readJson } from "./io.js";
|
|
6
|
+
import { assertSafeId, vaultPaths } from "./paths.js";
|
|
7
|
+
import { assertProcessedMemory, assertRawEvent } from "./schema-validation.js";
|
|
8
|
+
import { assertProcessedRecordPath, assertRawRecordPath } from "./record-paths.js";
|
|
9
|
+
import { classifySensitivity } from "./sensitivity.js";
|
|
10
|
+
import { listJsonFiles } from "./vault.js";
|
|
11
|
+
const MEMORY_TYPES = new Set(["conversation", "idea", "preference", "proposal", "rationale", "constraint", "rejection", "decision", "current_state", "todo", "correction"]);
|
|
12
|
+
export async function prepareEnrichmentBatch(root, projectId, options = {}) {
|
|
13
|
+
const project = assertSafeId(projectId, "project id");
|
|
14
|
+
const limit = boundedInteger(options.limit ?? 6, 1, 20, "enrichment batch limit");
|
|
15
|
+
const maxCharacters = boundedInteger(options.maxCharacters ?? 12_000, 1_000, 50_000, "enrichment character budget");
|
|
16
|
+
const p = vaultPaths(root);
|
|
17
|
+
const states = await effectiveMemoryStates(root, project);
|
|
18
|
+
const overlays = await readEnrichmentOverlays(root, project);
|
|
19
|
+
const raw = await rawById(root, project);
|
|
20
|
+
const candidates = [];
|
|
21
|
+
for (const file of await listJsonFiles(path.join(p.processed, project), p.root)) {
|
|
22
|
+
try {
|
|
23
|
+
const memory = await readJson(file);
|
|
24
|
+
assertProcessedMemory(memory);
|
|
25
|
+
assertProcessedRecordPath(p, file, memory);
|
|
26
|
+
if (memory.status !== "active" || memory.sensitivity !== "normal" || states.has(memory.id) || !memory.source_hash)
|
|
27
|
+
continue;
|
|
28
|
+
if (validOverlayForMemory(overlays.get(memory.id), memory))
|
|
29
|
+
continue;
|
|
30
|
+
if (!verifiedSources(memory, raw))
|
|
31
|
+
continue;
|
|
32
|
+
candidates.push(memory);
|
|
33
|
+
}
|
|
34
|
+
catch { /* doctor reports invalid records */ }
|
|
35
|
+
}
|
|
36
|
+
candidates.sort((a, b) => a.created_at.localeCompare(b.created_at) || a.id.localeCompare(b.id));
|
|
37
|
+
const selected = candidates.slice(0, limit);
|
|
38
|
+
if (!selected.length)
|
|
39
|
+
return undefined;
|
|
40
|
+
let remaining = maxCharacters;
|
|
41
|
+
const items = [];
|
|
42
|
+
for (const memory of selected) {
|
|
43
|
+
const evidence = [];
|
|
44
|
+
for (const eventId of memory.source_events) {
|
|
45
|
+
const event = raw.get(eventId);
|
|
46
|
+
const content = event.content.slice(0, Math.max(0, remaining));
|
|
47
|
+
remaining -= content.length;
|
|
48
|
+
evidence.push({
|
|
49
|
+
event_id: event.event_id,
|
|
50
|
+
session_id: event.session_id,
|
|
51
|
+
turn_id: event.turn_id,
|
|
52
|
+
role: event.role,
|
|
53
|
+
timestamp: event.timestamp,
|
|
54
|
+
content,
|
|
55
|
+
savepoint_status: event.savepoint_status,
|
|
56
|
+
content_truncated: content.length < event.content.length
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
items.push({
|
|
60
|
+
memory_id: memory.id,
|
|
61
|
+
source_events: [...memory.source_events],
|
|
62
|
+
source_hash: memory.source_hash,
|
|
63
|
+
baseline: {
|
|
64
|
+
type: memory.type,
|
|
65
|
+
title: memory.title,
|
|
66
|
+
summary: memory.summary,
|
|
67
|
+
tags: memory.tags,
|
|
68
|
+
predictive_tags: memory.predictive_tags,
|
|
69
|
+
retrieval_phrases: memory.retrieval_phrases,
|
|
70
|
+
source: memory.source,
|
|
71
|
+
confidence: memory.confidence,
|
|
72
|
+
source_savepoint_status: memory.source_savepoint_status
|
|
73
|
+
},
|
|
74
|
+
evidence
|
|
75
|
+
});
|
|
76
|
+
if (remaining <= 0)
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
const createdAt = new Date().toISOString();
|
|
80
|
+
const batch = {
|
|
81
|
+
schema_version: 1,
|
|
82
|
+
batch_id: `eb_${randomUUID().replaceAll("-", "")}`,
|
|
83
|
+
project_id: project,
|
|
84
|
+
created_at: createdAt,
|
|
85
|
+
items
|
|
86
|
+
};
|
|
87
|
+
const record = {
|
|
88
|
+
schema_version: 1,
|
|
89
|
+
batch_id: batch.batch_id,
|
|
90
|
+
project_id: project,
|
|
91
|
+
targets: items.map(item => ({ memory_id: item.memory_id, source_events: item.source_events, source_hash: item.source_hash })),
|
|
92
|
+
created_at: createdAt
|
|
93
|
+
};
|
|
94
|
+
const file = path.join(p.registry, "enrichment-batches", project, `${batch.batch_id}.json`);
|
|
95
|
+
await assertWritableInside(p.root, file);
|
|
96
|
+
await atomicJson(file, record);
|
|
97
|
+
return batch;
|
|
98
|
+
}
|
|
99
|
+
export async function commitEnrichment(root, value) {
|
|
100
|
+
assertEnrichmentSubmission(value);
|
|
101
|
+
const input = value;
|
|
102
|
+
const p = vaultPaths(root);
|
|
103
|
+
const batchFile = path.join(p.registry, "enrichment-batches", input.project_id, `${input.batch_id}.json`);
|
|
104
|
+
await assertReadableInside(p.root, batchFile);
|
|
105
|
+
const batch = await readJson(batchFile);
|
|
106
|
+
assertEnrichmentBatchRecord(batch);
|
|
107
|
+
assertEnrichmentBatchPath(root, batchFile, batch);
|
|
108
|
+
if (batch.project_id !== input.project_id || batch.batch_id !== input.batch_id)
|
|
109
|
+
throw new Error("Enrichment submission does not match its batch");
|
|
110
|
+
const targets = new Map(batch.targets.map(target => [target.memory_id, target]));
|
|
111
|
+
const raw = await rawById(root, input.project_id);
|
|
112
|
+
const prepared = [];
|
|
113
|
+
for (const item of input.items) {
|
|
114
|
+
const target = targets.get(item.memory_id);
|
|
115
|
+
if (!target)
|
|
116
|
+
throw new Error(`Enrichment item is not part of batch: ${item.memory_id}`);
|
|
117
|
+
if (!sameSet(item.evidence_refs, target.source_events))
|
|
118
|
+
throw new Error(`Enrichment evidence mismatch: ${item.memory_id}`);
|
|
119
|
+
const memoryFile = path.join(p.processed, input.project_id, `${item.memory_id}.json`);
|
|
120
|
+
await assertReadableInside(p.root, memoryFile);
|
|
121
|
+
const memory = await readJson(memoryFile);
|
|
122
|
+
assertProcessedMemory(memory);
|
|
123
|
+
assertProcessedRecordPath(p, memoryFile, memory);
|
|
124
|
+
if (memory.sensitivity !== "normal" || memory.source_hash !== target.source_hash || !sameSet(memory.source_events, target.source_events) || !verifiedSources(memory, raw)) {
|
|
125
|
+
throw new Error(`Enrichment source is stale or unsafe: ${item.memory_id}`);
|
|
126
|
+
}
|
|
127
|
+
const createdAt = new Date().toISOString();
|
|
128
|
+
const overlay = {
|
|
129
|
+
schema_version: 1,
|
|
130
|
+
enrichment_id: enrichmentId(input, item, target.source_hash),
|
|
131
|
+
project_id: input.project_id,
|
|
132
|
+
memory_id: item.memory_id,
|
|
133
|
+
source_events: [...target.source_events],
|
|
134
|
+
source_hash: target.source_hash,
|
|
135
|
+
type: item.type,
|
|
136
|
+
title: item.title.trim(),
|
|
137
|
+
summary: item.summary.trim(),
|
|
138
|
+
tags: normalizedStrings(item.tags),
|
|
139
|
+
predictive_tags: normalizedStrings(item.predictive_tags),
|
|
140
|
+
retrieval_phrases: uniqueStrings(item.retrieval_phrases),
|
|
141
|
+
agent: input.agent,
|
|
142
|
+
...(input.model ? { model: input.model.trim() } : {}),
|
|
143
|
+
created_at: createdAt
|
|
144
|
+
};
|
|
145
|
+
assertEnrichmentOverlay(overlay);
|
|
146
|
+
const file = path.join(p.enrichments, input.project_id, `${item.memory_id}.json`);
|
|
147
|
+
await assertWritableInside(p.root, file);
|
|
148
|
+
prepared.push({ file, overlay });
|
|
149
|
+
}
|
|
150
|
+
const written = [];
|
|
151
|
+
for (const { file, overlay } of prepared) {
|
|
152
|
+
await atomicJson(file, overlay);
|
|
153
|
+
written.push(path.relative(p.root, file));
|
|
154
|
+
}
|
|
155
|
+
const { rebuildTagRegistry } = await import("./tag-registry.js");
|
|
156
|
+
await rebuildTagRegistry(root, input.project_id);
|
|
157
|
+
await unlink(batchFile);
|
|
158
|
+
return { committed: written.length, overlays: written };
|
|
159
|
+
}
|
|
160
|
+
export async function enrichmentStatus(root, projectId) {
|
|
161
|
+
const project = assertSafeId(projectId, "project id");
|
|
162
|
+
const p = vaultPaths(root);
|
|
163
|
+
const states = await effectiveMemoryStates(root, project);
|
|
164
|
+
const overlays = await readEnrichmentOverlays(root, project);
|
|
165
|
+
const raw = await rawById(root, project);
|
|
166
|
+
let pending = 0;
|
|
167
|
+
let enriched = 0;
|
|
168
|
+
for (const file of await listJsonFiles(path.join(p.processed, project), p.root)) {
|
|
169
|
+
try {
|
|
170
|
+
const memory = await readJson(file);
|
|
171
|
+
assertProcessedMemory(memory);
|
|
172
|
+
assertProcessedRecordPath(p, file, memory);
|
|
173
|
+
if (memory.status !== "active" || memory.sensitivity !== "normal" || states.has(memory.id) || !memory.source_hash || !verifiedSources(memory, raw))
|
|
174
|
+
continue;
|
|
175
|
+
if (validOverlayForMemory(overlays.get(memory.id), memory))
|
|
176
|
+
enriched += 1;
|
|
177
|
+
else
|
|
178
|
+
pending += 1;
|
|
179
|
+
}
|
|
180
|
+
catch { /* doctor reports invalid records */ }
|
|
181
|
+
}
|
|
182
|
+
return { project_id: project, pending, enriched };
|
|
183
|
+
}
|
|
184
|
+
export async function readEnrichmentOverlays(root, projectId) {
|
|
185
|
+
const project = assertSafeId(projectId, "project id");
|
|
186
|
+
const p = vaultPaths(root);
|
|
187
|
+
const overlays = new Map();
|
|
188
|
+
for (const file of await listJsonFiles(path.join(p.enrichments, project), p.root)) {
|
|
189
|
+
try {
|
|
190
|
+
const overlay = await readJson(file);
|
|
191
|
+
assertEnrichmentOverlay(overlay);
|
|
192
|
+
assertEnrichmentOverlayPath(root, file, overlay);
|
|
193
|
+
overlays.set(overlay.memory_id, overlay);
|
|
194
|
+
}
|
|
195
|
+
catch { /* doctor reports invalid records */ }
|
|
196
|
+
}
|
|
197
|
+
return overlays;
|
|
198
|
+
}
|
|
199
|
+
export function applyEnrichment(memory, overlay) {
|
|
200
|
+
if (!validOverlayForMemory(overlay, memory))
|
|
201
|
+
return memory;
|
|
202
|
+
return {
|
|
203
|
+
...memory,
|
|
204
|
+
type: overlay.type,
|
|
205
|
+
title: overlay.title,
|
|
206
|
+
summary: overlay.summary,
|
|
207
|
+
tags: overlay.tags,
|
|
208
|
+
predictive_tags: overlay.predictive_tags,
|
|
209
|
+
retrieval_phrases: overlay.retrieval_phrases,
|
|
210
|
+
updated_at: overlay.created_at,
|
|
211
|
+
agent: `linger-host-enrichment:${overlay.agent}`,
|
|
212
|
+
...(overlay.model ? { model: overlay.model } : {})
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
export function assertEnrichmentOverlay(value) {
|
|
216
|
+
const item = object(value, "enrichment overlay");
|
|
217
|
+
if (item.schema_version !== 1)
|
|
218
|
+
throw new Error("Invalid enrichment overlay schema");
|
|
219
|
+
for (const field of ["enrichment_id", "project_id", "memory_id", "source_hash", "title", "summary", "agent", "created_at"]) {
|
|
220
|
+
if (typeof item[field] !== "string" || !item[field])
|
|
221
|
+
throw new Error(`Invalid enrichment overlay ${field}`);
|
|
222
|
+
}
|
|
223
|
+
assertSafeId(item.enrichment_id, "enrichment id");
|
|
224
|
+
assertSafeId(item.project_id, "project id");
|
|
225
|
+
assertSafeId(item.memory_id, "memory id");
|
|
226
|
+
if (!/^[a-f0-9]{64}$/.test(item.source_hash))
|
|
227
|
+
throw new Error("Invalid enrichment source hash");
|
|
228
|
+
if (!MEMORY_TYPES.has(item.type))
|
|
229
|
+
throw new Error("Invalid enrichment memory type");
|
|
230
|
+
if (item.agent !== "codex" && item.agent !== "claude-code")
|
|
231
|
+
throw new Error("Invalid enrichment agent");
|
|
232
|
+
if (!Number.isFinite(Date.parse(item.created_at)))
|
|
233
|
+
throw new Error("Invalid enrichment timestamp");
|
|
234
|
+
if (item.title.length > 160 || item.summary.length > 2_000)
|
|
235
|
+
throw new Error("Enrichment text exceeds bounds");
|
|
236
|
+
stringArray(item.source_events, "enrichment source events", 20, 128, true);
|
|
237
|
+
stringArray(item.tags, "enrichment tags", 16, 64);
|
|
238
|
+
stringArray(item.predictive_tags, "enrichment predictive tags", 16, 64);
|
|
239
|
+
stringArray(item.retrieval_phrases, "enrichment retrieval phrases", 12, 240);
|
|
240
|
+
if (item.model !== undefined && (typeof item.model !== "string" || !item.model || item.model.length > 160))
|
|
241
|
+
throw new Error("Invalid enrichment model");
|
|
242
|
+
}
|
|
243
|
+
export function assertEnrichmentOverlayPath(root, file, overlay) {
|
|
244
|
+
const expected = path.join(vaultPaths(root).enrichments, overlay.project_id, `${overlay.memory_id}.json`);
|
|
245
|
+
if (path.resolve(file) !== path.resolve(expected))
|
|
246
|
+
throw new Error("Invalid enrichment overlay path");
|
|
247
|
+
}
|
|
248
|
+
export function assertEnrichmentBatchRecord(value) {
|
|
249
|
+
const item = object(value, "enrichment batch");
|
|
250
|
+
if (item.schema_version !== 1 || typeof item.batch_id !== "string" || typeof item.project_id !== "string" || typeof item.created_at !== "string" || !Array.isArray(item.targets))
|
|
251
|
+
throw new Error("Invalid enrichment batch");
|
|
252
|
+
assertSafeId(item.batch_id, "enrichment batch id");
|
|
253
|
+
assertSafeId(item.project_id, "project id");
|
|
254
|
+
if (!Number.isFinite(Date.parse(item.created_at)))
|
|
255
|
+
throw new Error("Invalid enrichment batch timestamp");
|
|
256
|
+
if (!item.targets.length || item.targets.length > 20)
|
|
257
|
+
throw new Error("Invalid enrichment batch targets");
|
|
258
|
+
for (const target of item.targets) {
|
|
259
|
+
const entry = object(target, "enrichment batch target");
|
|
260
|
+
if (typeof entry.memory_id !== "string" || typeof entry.source_hash !== "string")
|
|
261
|
+
throw new Error("Invalid enrichment batch target");
|
|
262
|
+
assertSafeId(entry.memory_id, "memory id");
|
|
263
|
+
if (!/^[a-f0-9]{64}$/.test(entry.source_hash))
|
|
264
|
+
throw new Error("Invalid enrichment batch source hash");
|
|
265
|
+
stringArray(entry.source_events, "enrichment batch source events", 20, 128, true);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
export function assertEnrichmentBatchPath(root, file, batch) {
|
|
269
|
+
const expected = path.join(vaultPaths(root).registry, "enrichment-batches", batch.project_id, `${batch.batch_id}.json`);
|
|
270
|
+
if (path.resolve(file) !== path.resolve(expected))
|
|
271
|
+
throw new Error("Invalid enrichment batch path");
|
|
272
|
+
}
|
|
273
|
+
export function assertEnrichmentSubmission(value) {
|
|
274
|
+
const item = object(value, "enrichment submission");
|
|
275
|
+
if (item.schema_version !== 1 || typeof item.batch_id !== "string" || typeof item.project_id !== "string" || !Array.isArray(item.items))
|
|
276
|
+
throw new Error("Invalid enrichment submission");
|
|
277
|
+
assertSafeId(item.batch_id, "enrichment batch id");
|
|
278
|
+
assertSafeId(item.project_id, "project id");
|
|
279
|
+
if (item.agent !== "codex" && item.agent !== "claude-code")
|
|
280
|
+
throw new Error("Invalid enrichment agent");
|
|
281
|
+
if (item.model !== undefined && (typeof item.model !== "string" || !item.model.trim() || item.model.length > 160))
|
|
282
|
+
throw new Error("Invalid enrichment model");
|
|
283
|
+
if (!item.items.length || item.items.length > 20)
|
|
284
|
+
throw new Error("Invalid enrichment submission items");
|
|
285
|
+
const ids = new Set();
|
|
286
|
+
for (const candidate of item.items) {
|
|
287
|
+
const result = object(candidate, "enrichment submission item");
|
|
288
|
+
if (typeof result.memory_id !== "string" || typeof result.title !== "string" || typeof result.summary !== "string")
|
|
289
|
+
throw new Error("Invalid enrichment submission item");
|
|
290
|
+
assertSafeId(result.memory_id, "memory id");
|
|
291
|
+
if (ids.has(result.memory_id))
|
|
292
|
+
throw new Error("Duplicate enrichment memory id");
|
|
293
|
+
ids.add(result.memory_id);
|
|
294
|
+
if (!result.title.trim() || result.title.length > 160 || !result.summary.trim() || result.summary.length > 2_000)
|
|
295
|
+
throw new Error("Invalid enrichment text");
|
|
296
|
+
if (!MEMORY_TYPES.has(result.type))
|
|
297
|
+
throw new Error("Invalid enrichment memory type");
|
|
298
|
+
stringArray(result.evidence_refs, "enrichment evidence refs", 20, 128, true);
|
|
299
|
+
stringArray(result.tags, "enrichment tags", 16, 64);
|
|
300
|
+
stringArray(result.predictive_tags, "enrichment predictive tags", 16, 64);
|
|
301
|
+
stringArray(result.retrieval_phrases, "enrichment retrieval phrases", 12, 240);
|
|
302
|
+
const submittedText = [result.title, result.summary, ...result.tags, ...result.predictive_tags, ...result.retrieval_phrases].join("\n");
|
|
303
|
+
if (classifySensitivity(submittedText).level !== "normal")
|
|
304
|
+
throw new Error("Enrichment output contains sensitive content");
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
function enrichmentId(input, item, sourceHash) {
|
|
308
|
+
return `en_${createHash("sha256").update(JSON.stringify({ input: { agent: input.agent, model: input.model }, item, sourceHash })).digest("hex").slice(0, 24)}`;
|
|
309
|
+
}
|
|
310
|
+
function validOverlayForMemory(overlay, memory) {
|
|
311
|
+
return Boolean(overlay && overlay.project_id === memory.project_id && overlay.memory_id === memory.id && overlay.source_hash === memory.source_hash && sameSet(overlay.source_events, memory.source_events));
|
|
312
|
+
}
|
|
313
|
+
async function rawById(root, project) {
|
|
314
|
+
const p = vaultPaths(root);
|
|
315
|
+
const result = new Map();
|
|
316
|
+
for (const file of await listJsonFiles(path.join(p.raw, project), p.root)) {
|
|
317
|
+
try {
|
|
318
|
+
const event = await readJson(file);
|
|
319
|
+
assertRawEvent(event);
|
|
320
|
+
assertRawRecordPath(p, file, event);
|
|
321
|
+
result.set(event.event_id, event);
|
|
322
|
+
}
|
|
323
|
+
catch { /* doctor reports invalid records */ }
|
|
324
|
+
}
|
|
325
|
+
return result;
|
|
326
|
+
}
|
|
327
|
+
function verifiedSources(memory, raw) {
|
|
328
|
+
if (!memory.source_hash || !memory.source_events.length)
|
|
329
|
+
return false;
|
|
330
|
+
return memory.source_events.every(eventId => {
|
|
331
|
+
const event = raw.get(eventId);
|
|
332
|
+
return Boolean(event && event.sensitivity === "normal" && createHash("sha256").update(event.content).digest("hex") === event.content_hash && event.content_hash === memory.source_hash);
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
function normalizedStrings(values) {
|
|
336
|
+
return [...new Set(values.map(value => value.trim().toLowerCase().replace(/\s+/g, "-")).filter(Boolean))];
|
|
337
|
+
}
|
|
338
|
+
function uniqueStrings(values) {
|
|
339
|
+
return [...new Set(values.map(value => value.trim()).filter(Boolean))];
|
|
340
|
+
}
|
|
341
|
+
function sameSet(left, right) {
|
|
342
|
+
return left.length === right.length && left.every(value => right.includes(value)) && new Set(left).size === left.length;
|
|
343
|
+
}
|
|
344
|
+
function boundedInteger(value, min, max, label) {
|
|
345
|
+
if (!Number.isInteger(value) || value < min || value > max)
|
|
346
|
+
throw new Error(`${label} must be an integer from ${min} to ${max}`);
|
|
347
|
+
return value;
|
|
348
|
+
}
|
|
349
|
+
function object(value, label) {
|
|
350
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
351
|
+
throw new Error(`Invalid ${label}`);
|
|
352
|
+
return value;
|
|
353
|
+
}
|
|
354
|
+
function stringArray(value, label, maxItems, maxLength, requireNonEmpty = false) {
|
|
355
|
+
if (!Array.isArray(value) || (requireNonEmpty && !value.length) || value.length > maxItems || !value.every(item => typeof item === "string" && item.length > 0 && item.length <= maxLength)) {
|
|
356
|
+
throw new Error(`Invalid ${label}`);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=enrichment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrichment.js","sourceRoot":"","sources":["../src/enrichment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function generateAdversarialDataset() {
|
|
2
|
+
const events = [
|
|
3
|
+
event("adv_01", "p_main", "2025-01-01T00:00:00.000Z", "数据库缓存决定使用 Redis,因为 latency 更低"),
|
|
4
|
+
event("adv_02", "p_main", "2025-03-01T00:00:00.000Z", "当前数据库缓存决定:不使用 Redis,改用本地文件,因为 portability 更重要"),
|
|
5
|
+
event("adv_noise", "p_main", "2025-04-01T00:00:00.000Z", "讨论 UI color 和 build pipeline"),
|
|
6
|
+
event("adv_other", "p_other", "2025-05-01T00:00:00.000Z", "另一个项目当前数据库缓存使用 Redis"),
|
|
7
|
+
{ ...event("adv_secret", "p_main", "2025-06-01T00:00:00.000Z", "API_KEY=super-secret-value-123456"), expected_sensitivity: "secret" },
|
|
8
|
+
{ ...event("adv_optout", "p_main", "2025-07-01T00:00:00.000Z", "这个不要保存:当前选择 Kafka"), save: false }
|
|
9
|
+
];
|
|
10
|
+
const oracle = [
|
|
11
|
+
query("adv_q_why", "为什么数据库缓存不用 Redis?", ["adv_02"], ["adv_other"], "当前数据库缓存决定:不使用 Redis,改用本地文件,因为 portability 更重要", ["portability"], ["Redis is current"]),
|
|
12
|
+
query("adv_q_current", "数据库缓存当前是什么?", ["adv_02"], ["adv_01", "adv_other"], "当前数据库缓存决定:不使用 Redis,改用本地文件,因为 portability 更重要", ["本地文件"], ["Redis is current"]),
|
|
13
|
+
{ ...query("adv_q_optout", "我们选过 Kafka 吗?", [], ["adv_optout"], undefined, ["no reliable memory"], ["Kafka selected"]), expected_classification: "no_reliable_memory_found" },
|
|
14
|
+
{ ...query("adv_q_secret", "之前的 API key 是什么?", [], ["adv_secret"], undefined, ["no reliable memory"], ["super-secret-value"]), expected_classification: "no_reliable_memory_found" }
|
|
15
|
+
];
|
|
16
|
+
return { schema_version: 1, name: "linger-adversarial-2025", start: "2025-01-01T00:00:00.000Z", end: "2025-12-31T23:59:59.999Z", events, oracle };
|
|
17
|
+
}
|
|
18
|
+
function event(id, project, timestamp, content) { return { event_id: id, project_id: project, session_id: `s_${id}`, turn_id: `t_${id}`, role: "user", timestamp, content, expected_sensitivity: "normal", save: true }; }
|
|
19
|
+
function query(id, text, required, forbidden, state, acceptable, unacceptable) { return { query_id: id, at: "2025-12-31T00:00:00.000Z", project_id: "p_main", query: text, required_evidence: required, forbidden_evidence: forbidden, expected_current_state: state, acceptable_claims: acceptable, unacceptable_claims: unacceptable, expected_classification: "similar_record_found" }; }
|
|
20
|
+
//# sourceMappingURL=eval-adversarial.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-adversarial.js","sourceRoot":"","sources":["../src/eval-adversarial.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,0BAA0B;IACxC,MAAM,MAAM,GAAgB;QAC1B,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,0BAA0B,EAAE,+BAA+B,CAAC;QACtF,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,0BAA0B,EAAE,+CAA+C,CAAC;QACtG,KAAK,CAAC,WAAW,EAAE,QAAQ,EAAE,0BAA0B,EAAE,8BAA8B,CAAC;QACxF,KAAK,CAAC,WAAW,EAAE,SAAS,EAAE,0BAA0B,EAAE,sBAAsB,CAAC;QACjF,EAAE,GAAG,KAAK,CAAC,YAAY,EAAE,QAAQ,EAAE,0BAA0B,EAAE,mCAAmC,CAAC,EAAE,oBAAoB,EAAE,QAAQ,EAAE;QACrI,EAAE,GAAG,KAAK,CAAC,YAAY,EAAE,QAAQ,EAAE,0BAA0B,EAAE,mBAAmB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE;KACnG,CAAC;IACF,MAAM,MAAM,GAAiB;QAC3B,KAAK,CAAC,WAAW,EAAE,mBAAmB,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,+CAA+C,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC;QAC1J,KAAK,CAAC,eAAe,EAAE,aAAa,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,+CAA+C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC;QAC3J,EAAE,GAAG,KAAK,CAAC,cAAc,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,uBAAuB,EAAE,0BAA0B,EAAE;QAC7K,EAAE,GAAG,KAAK,CAAC,cAAc,EAAE,kBAAkB,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,EAAE,uBAAuB,EAAE,0BAA0B,EAAE;KACrL,CAAC;IACF,OAAO,EAAE,cAAc,EAAE,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,KAAK,EAAE,0BAA0B,EAAE,GAAG,EAAE,0BAA0B,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACpJ,CAAC;AAED,SAAS,KAAK,CAAC,EAAU,EAAE,OAAe,EAAE,SAAiB,EAAE,OAAe,IAAe,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACrQ,SAAS,KAAK,CAAC,EAAU,EAAE,IAAY,EAAE,QAAkB,EAAE,SAAmB,EAAE,KAAyB,EAAE,UAAoB,EAAE,YAAsB,IAAgB,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,0BAA0B,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,SAAS,EAAE,sBAAsB,EAAE,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,mBAAmB,EAAE,YAAY,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC"}
|
package/dist/eval-cli.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { mkdtemp, readFile } from "node:fs/promises";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { generateAdversarialDataset } from "./eval-adversarial.js";
|
|
6
|
+
import { generateHeldoutDataset } from "./eval-heldout.js";
|
|
7
|
+
import { writeYearDataset } from "./eval-io.js";
|
|
8
|
+
import { runEvalDataset } from "./eval-runner.js";
|
|
9
|
+
const args = process.argv.slice(2);
|
|
10
|
+
const command = args.shift();
|
|
11
|
+
function option(name) {
|
|
12
|
+
const index = args.indexOf(name);
|
|
13
|
+
if (index < 0)
|
|
14
|
+
return undefined;
|
|
15
|
+
const value = args[index + 1];
|
|
16
|
+
if (!value || value.startsWith("--"))
|
|
17
|
+
throw new Error(`${name} requires a value`);
|
|
18
|
+
args.splice(index, 2);
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
function required(name) {
|
|
22
|
+
const value = option(name);
|
|
23
|
+
if (!value)
|
|
24
|
+
throw new Error(`${name} is required`);
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
async function readDataset(fixturePath, oraclePath) {
|
|
28
|
+
const fixture = JSON.parse(await readFile(path.resolve(fixturePath), "utf8"));
|
|
29
|
+
const oracle = JSON.parse(await readFile(path.resolve(oraclePath), "utf8"));
|
|
30
|
+
if (fixture.schema_version !== 1 || !fixture.name || !fixture.start || !fixture.end || !Array.isArray(fixture.events))
|
|
31
|
+
throw new Error("invalid fixture dataset");
|
|
32
|
+
if (!Array.isArray(oracle.oracle))
|
|
33
|
+
throw new Error("invalid oracle dataset");
|
|
34
|
+
const mutations = fixture.mutations;
|
|
35
|
+
if (mutations !== undefined && !Array.isArray(mutations))
|
|
36
|
+
throw new Error("invalid fixture mutations");
|
|
37
|
+
if (mutations?.some(item => !isEvalMutation(item)))
|
|
38
|
+
throw new Error("invalid fixture mutation");
|
|
39
|
+
return { schema_version: 1, name: fixture.name, start: fixture.start, end: fixture.end, events: fixture.events, oracle: oracle.oracle, ...(mutations ? { mutations } : {}) };
|
|
40
|
+
}
|
|
41
|
+
function isEvalMutation(value) {
|
|
42
|
+
if (!value || typeof value !== "object")
|
|
43
|
+
return false;
|
|
44
|
+
const item = value;
|
|
45
|
+
return ["tamper_raw_content", "delete_raw"].includes(String(item.type)) && typeof item.event_id === "string" && item.event_id.length > 0 && (item.replacement_content === undefined || typeof item.replacement_content === "string");
|
|
46
|
+
}
|
|
47
|
+
async function main() {
|
|
48
|
+
if (command === "generate") {
|
|
49
|
+
const year = Number(option("--year") ?? "2025");
|
|
50
|
+
if (!Number.isInteger(year) || year < 2000 || year > 9999)
|
|
51
|
+
throw new Error("--year must be an integer between 2000 and 9999");
|
|
52
|
+
console.log(JSON.stringify(await writeYearDataset(option("--output") ?? "eval-data", year), null, 2));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (command === "run") {
|
|
56
|
+
const dataset = await readDataset(required("--fixture"), required("--oracle"));
|
|
57
|
+
const vault = option("--vault") ?? await mkdtemp(path.join(os.tmpdir(), "linger-eval-"));
|
|
58
|
+
console.log(JSON.stringify({ dataset: dataset.name, vault, ...await runEvalDataset(vault, dataset) }, null, 2));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (command === "adversarial") {
|
|
62
|
+
const vault = option("--vault") ?? await mkdtemp(path.join(os.tmpdir(), "linger-eval-adversarial-"));
|
|
63
|
+
const dataset = generateAdversarialDataset();
|
|
64
|
+
console.log(JSON.stringify({ dataset: dataset.name, vault, ...await runEvalDataset(vault, dataset) }, null, 2));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (command === "heldout") {
|
|
68
|
+
const year = Number(option("--year") ?? "2025");
|
|
69
|
+
const noise = Number(option("--noise") ?? "240");
|
|
70
|
+
const vault = option("--vault") ?? await mkdtemp(path.join(os.tmpdir(), "linger-eval-heldout-"));
|
|
71
|
+
const dataset = generateHeldoutDataset(year, noise);
|
|
72
|
+
console.log(JSON.stringify({ dataset: dataset.name, vault, ...await runEvalDataset(vault, dataset) }, null, 2));
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
console.log("linger-eval <generate|run|adversarial|heldout> [options]");
|
|
76
|
+
if (command)
|
|
77
|
+
process.exitCode = 2;
|
|
78
|
+
}
|
|
79
|
+
main().catch(error => {
|
|
80
|
+
console.error(`linger-eval: ${error.message}`);
|
|
81
|
+
process.exitCode = 1;
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=eval-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-cli.js","sourceRoot":"","sources":["../src/eval-cli.ts"],"names":[],"mappings":"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"}
|