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,21 @@
|
|
|
1
|
+
export interface TagRegistryEntry {
|
|
2
|
+
raw_tag: string;
|
|
3
|
+
normalized_tag: string;
|
|
4
|
+
aliases: string[];
|
|
5
|
+
related_terms: string[];
|
|
6
|
+
usage_count: number;
|
|
7
|
+
created_at: string;
|
|
8
|
+
last_used: string;
|
|
9
|
+
examples: string[];
|
|
10
|
+
confidence: number;
|
|
11
|
+
}
|
|
12
|
+
export interface TagRegistry {
|
|
13
|
+
schema_version: 1;
|
|
14
|
+
project_id: string;
|
|
15
|
+
generated_at: string;
|
|
16
|
+
entries: TagRegistryEntry[];
|
|
17
|
+
skipped_files: string[];
|
|
18
|
+
}
|
|
19
|
+
export declare function rebuildTagRegistry(root: string, projectId: string): Promise<TagRegistry>;
|
|
20
|
+
export declare function readTagRegistry(root: string, projectId: string): Promise<TagRegistry | undefined>;
|
|
21
|
+
export declare function normalizeTag(value: string): string;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { assertWritableInside, atomicJson, readJson } from "./io.js";
|
|
3
|
+
import { effectiveMemoryStates } from "./memory-events.js";
|
|
4
|
+
import { applyEnrichment, readEnrichmentOverlays } from "./enrichment.js";
|
|
5
|
+
import { assertSafeId, vaultPaths } from "./paths.js";
|
|
6
|
+
import { assertProcessedMemory, assertTagRegistry } from "./schema-validation.js";
|
|
7
|
+
import { assertProcessedRecordPath, assertTagRegistryPath } from "./record-paths.js";
|
|
8
|
+
import { listJsonFiles } from "./vault.js";
|
|
9
|
+
export async function rebuildTagRegistry(root, projectId) {
|
|
10
|
+
const project = assertSafeId(projectId, "project id");
|
|
11
|
+
const p = vaultPaths(root);
|
|
12
|
+
const states = await effectiveMemoryStates(root, project);
|
|
13
|
+
const overlays = await readEnrichmentOverlays(root, project);
|
|
14
|
+
const entries = new Map();
|
|
15
|
+
const skipped = [];
|
|
16
|
+
for (const file of await listJsonFiles(path.join(p.processed, project), p.root)) {
|
|
17
|
+
try {
|
|
18
|
+
const baseline = await readJson(file);
|
|
19
|
+
assertProcessedMemory(baseline);
|
|
20
|
+
assertProcessedRecordPath(p, file, baseline);
|
|
21
|
+
const memory = applyEnrichment(baseline, overlays.get(baseline.id));
|
|
22
|
+
if (memory.status !== "active" || states.has(memory.id))
|
|
23
|
+
continue;
|
|
24
|
+
for (const raw of [...new Set([...memory.tags, ...memory.predictive_tags])]) {
|
|
25
|
+
const normalized = normalizeTag(raw);
|
|
26
|
+
if (!normalized)
|
|
27
|
+
continue;
|
|
28
|
+
const current = entries.get(normalized);
|
|
29
|
+
if (current) {
|
|
30
|
+
current.usage_count += 1;
|
|
31
|
+
current.last_used = later(current.last_used, memory.updated_at);
|
|
32
|
+
current.examples = [...new Set([...current.examples, memory.id])].slice(0, 5);
|
|
33
|
+
if (raw !== normalized)
|
|
34
|
+
current.aliases = [...new Set([...current.aliases, raw])].sort();
|
|
35
|
+
current.confidence = Math.max(current.confidence, memory.confidence);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
entries.set(normalized, { raw_tag: raw, normalized_tag: normalized, aliases: raw === normalized ? [] : [raw], related_terms: [], usage_count: 1, created_at: memory.created_at, last_used: memory.updated_at, examples: [memory.id], confidence: memory.confidence });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
skipped.push(path.relative(p.root, file));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const registry = { schema_version: 1, project_id: project, generated_at: new Date().toISOString(), entries: [...entries.values()].sort((a, b) => b.usage_count - a.usage_count || a.normalized_tag.localeCompare(b.normalized_tag)), skipped_files: skipped };
|
|
47
|
+
const file = path.join(p.registry, "tags", `${project}.json`);
|
|
48
|
+
await assertWritableInside(p.root, file);
|
|
49
|
+
await atomicJson(file, registry);
|
|
50
|
+
return registry;
|
|
51
|
+
}
|
|
52
|
+
export async function readTagRegistry(root, projectId) {
|
|
53
|
+
const p = vaultPaths(root);
|
|
54
|
+
const file = path.join(p.registry, "tags", `${assertSafeId(projectId, "project id")}.json`);
|
|
55
|
+
await assertWritableInside(p.root, file);
|
|
56
|
+
try {
|
|
57
|
+
const value = await readJson(file);
|
|
58
|
+
assertTagRegistry(value);
|
|
59
|
+
assertTagRegistryPath(p, file, value);
|
|
60
|
+
return value;
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
if (error.code === "ENOENT")
|
|
64
|
+
return undefined;
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function normalizeTag(value) { return value.trim().toLowerCase().replace(/\s+/g, "-").replace(/^-+|-+$/g, ""); }
|
|
69
|
+
function later(a, b) { return a.localeCompare(b) >= 0 ? a : b; }
|
|
70
|
+
//# sourceMappingURL=tag-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tag-registry.js","sourceRoot":"","sources":["../src/tag-registry.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAsB3C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAY,EAAE,SAAiB;IACtE,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACtD,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,IAAI,GAAG,EAA4B,CAAC;IACpD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QAChF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAU,IAAI,CAAC,CAAC;YAC/C,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YAChC,yBAAyB,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC7C,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;YACpE,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAAE,SAAS;YAClE,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5E,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;gBACrC,IAAI,CAAC,UAAU;oBAAE,SAAS;gBAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACxC,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;oBACzB,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;oBAChE,OAAO,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC9E,IAAI,GAAG,KAAK,UAAU;wBAAE,OAAO,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACzF,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;gBACvE,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;gBACxQ,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAAC,CAAC;IACxD,CAAC;IACD,MAAM,QAAQ,GAAgB,EAAE,cAAc,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;IAC3Q,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;IAC9D,MAAM,oBAAoB,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzC,MAAM,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACjC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,SAAiB;IACnE,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IAC5F,MAAM,oBAAoB,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC;QAAC,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAU,IAAI,CAAC,CAAC;QAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAAC,qBAAqB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;IACnI,OAAO,KAAK,EAAE,CAAC;QAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAAC,MAAM,KAAK,CAAC;IAAC,CAAC;AAC1G,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa,IAAY,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACvI,SAAS,KAAK,CAAC,CAAS,EAAE,CAAS,IAAY,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type TermRelationType = "synonym" | "alias" | "abbreviation" | "related" | "contextual_equivalent" | "location_mapping" | "product_name" | "ambiguous";
|
|
2
|
+
export interface TermRelation {
|
|
3
|
+
schema_version: 1;
|
|
4
|
+
relation_id: string;
|
|
5
|
+
project_id: string;
|
|
6
|
+
term_a: string;
|
|
7
|
+
term_b: string;
|
|
8
|
+
relation_type: TermRelationType;
|
|
9
|
+
confidence: number;
|
|
10
|
+
context_tags: string[];
|
|
11
|
+
evidence_refs: string[];
|
|
12
|
+
created_at: string;
|
|
13
|
+
last_verified: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function addTermRelation(root: string, input: Omit<TermRelation, "schema_version" | "relation_id" | "created_at" | "last_verified"> & {
|
|
16
|
+
timestamp?: string;
|
|
17
|
+
}): Promise<TermRelation>;
|
|
18
|
+
export declare function expandTerms(root: string, projectId: string, queryTerms: string[], contextTags?: string[]): Promise<Map<string, number>>;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { assertWritableInside, atomicJson, readJson } from "./io.js";
|
|
4
|
+
import { assertSafeId, vaultPaths } from "./paths.js";
|
|
5
|
+
import { assertTermRelation } from "./schema-validation.js";
|
|
6
|
+
import { assertTermRelationPath } from "./record-paths.js";
|
|
7
|
+
import { listJsonFiles } from "./vault.js";
|
|
8
|
+
const RELATION_TYPES = new Set(["synonym", "alias", "abbreviation", "related", "contextual_equivalent", "location_mapping", "product_name", "ambiguous"]);
|
|
9
|
+
export async function addTermRelation(root, input) {
|
|
10
|
+
const project = assertSafeId(input.project_id, "project id");
|
|
11
|
+
const a = normalize(input.term_a);
|
|
12
|
+
const b = normalize(input.term_b);
|
|
13
|
+
if (!a || !b || a === b)
|
|
14
|
+
throw new Error("Term relation requires two distinct terms");
|
|
15
|
+
if (!RELATION_TYPES.has(input.relation_type))
|
|
16
|
+
throw new Error("Invalid term relation type");
|
|
17
|
+
if (input.confidence < 0 || input.confidence > 1)
|
|
18
|
+
throw new Error("Confidence must be between 0 and 1");
|
|
19
|
+
if (!input.evidence_refs.length)
|
|
20
|
+
throw new Error("Term relation requires evidence");
|
|
21
|
+
const timestamp = input.timestamp ?? new Date().toISOString();
|
|
22
|
+
const relation = {
|
|
23
|
+
schema_version: 1, relation_id: `tr_${randomUUID()}`, project_id: project, term_a: a, term_b: b,
|
|
24
|
+
relation_type: input.relation_type, confidence: input.confidence, context_tags: [...new Set(input.context_tags.map(normalize).filter(Boolean))],
|
|
25
|
+
evidence_refs: [...new Set(input.evidence_refs)], created_at: timestamp, last_verified: timestamp
|
|
26
|
+
};
|
|
27
|
+
assertTermRelation(relation);
|
|
28
|
+
const p = vaultPaths(root);
|
|
29
|
+
const file = path.join(p.registry, "term-graph", project, `${relation.relation_id}.json`);
|
|
30
|
+
await assertWritableInside(p.root, file);
|
|
31
|
+
await atomicJson(file, relation);
|
|
32
|
+
return relation;
|
|
33
|
+
}
|
|
34
|
+
export async function expandTerms(root, projectId, queryTerms, contextTags = []) {
|
|
35
|
+
const project = assertSafeId(projectId, "project id");
|
|
36
|
+
const p = vaultPaths(root);
|
|
37
|
+
const query = new Set(queryTerms.map(normalize).filter(Boolean));
|
|
38
|
+
const context = new Set(contextTags.map(normalize).filter(Boolean));
|
|
39
|
+
const expanded = new Map();
|
|
40
|
+
for (const file of await listJsonFiles(path.join(p.registry, "term-graph", project), p.root)) {
|
|
41
|
+
let relation;
|
|
42
|
+
try {
|
|
43
|
+
const value = await readJson(file);
|
|
44
|
+
assertTermRelation(value);
|
|
45
|
+
assertTermRelationPath(p, file, value);
|
|
46
|
+
relation = value;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (relation.relation_type === "ambiguous" || relation.confidence < 0.6)
|
|
52
|
+
continue;
|
|
53
|
+
if (relation.context_tags.length && !relation.context_tags.some(tag => context.has(tag)))
|
|
54
|
+
continue;
|
|
55
|
+
if (query.has(relation.term_a))
|
|
56
|
+
expanded.set(relation.term_b, Math.max(expanded.get(relation.term_b) ?? 0, relation.confidence));
|
|
57
|
+
if (query.has(relation.term_b) && relation.relation_type !== "related")
|
|
58
|
+
expanded.set(relation.term_a, Math.max(expanded.get(relation.term_a) ?? 0, relation.confidence));
|
|
59
|
+
}
|
|
60
|
+
return expanded;
|
|
61
|
+
}
|
|
62
|
+
function normalize(value) { return value.trim().toLowerCase(); }
|
|
63
|
+
//# sourceMappingURL=term-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"term-graph.js","sourceRoot":"","sources":["../src/term-graph.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export type Role = "user" | "assistant" | "system";
|
|
2
|
+
export type SavepointStatus = "pending" | "complete" | "partial";
|
|
3
|
+
export type MemorySource = "user_explicit" | "agent_inferred";
|
|
4
|
+
export interface RawEvent {
|
|
5
|
+
schema_version: 1;
|
|
6
|
+
event_id: string;
|
|
7
|
+
session_id: string;
|
|
8
|
+
project_id: string;
|
|
9
|
+
seq_id: number;
|
|
10
|
+
turn_id: string;
|
|
11
|
+
role: Role;
|
|
12
|
+
timestamp: string;
|
|
13
|
+
source_agent: string;
|
|
14
|
+
source_model?: string;
|
|
15
|
+
content: string;
|
|
16
|
+
content_hash: string;
|
|
17
|
+
savepoint_status: SavepointStatus;
|
|
18
|
+
capture_status: "captured";
|
|
19
|
+
sensitivity: "normal" | "sensitive" | "secret";
|
|
20
|
+
raw_ref: string;
|
|
21
|
+
}
|
|
22
|
+
export interface QueueItem {
|
|
23
|
+
schema_version: 1;
|
|
24
|
+
task_id: string;
|
|
25
|
+
event_id: string;
|
|
26
|
+
project_id: string;
|
|
27
|
+
priority: "normal" | "explicit";
|
|
28
|
+
status: "pending" | "processing" | "failed" | "done";
|
|
29
|
+
attempts: number;
|
|
30
|
+
created_at: string;
|
|
31
|
+
updated_at: string;
|
|
32
|
+
error?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface ProcessedMemory {
|
|
35
|
+
schema_version: 1;
|
|
36
|
+
id: string;
|
|
37
|
+
type: "conversation" | "idea" | "preference" | "proposal" | "rationale" | "constraint" | "rejection" | "decision" | "current_state" | "todo" | "correction";
|
|
38
|
+
scope: "project" | "global";
|
|
39
|
+
project_id: string;
|
|
40
|
+
title: string;
|
|
41
|
+
summary: string;
|
|
42
|
+
tags: string[];
|
|
43
|
+
predictive_tags: string[];
|
|
44
|
+
retrieval_phrases: string[];
|
|
45
|
+
source_events: string[];
|
|
46
|
+
source_hash?: string;
|
|
47
|
+
source_savepoint_status: SavepointStatus;
|
|
48
|
+
confidence: number;
|
|
49
|
+
source: MemorySource;
|
|
50
|
+
status: "active" | "revoked" | "superseded";
|
|
51
|
+
sensitivity: "normal" | "sensitive";
|
|
52
|
+
supersedes: string[];
|
|
53
|
+
superseded_by: string[];
|
|
54
|
+
created_at: string;
|
|
55
|
+
updated_at: string;
|
|
56
|
+
agent: string;
|
|
57
|
+
model?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface SearchHit {
|
|
60
|
+
match_type: "exact_record" | "similar_record" | "possible_match" | "unprocessed_raw";
|
|
61
|
+
confidence: number;
|
|
62
|
+
score: number;
|
|
63
|
+
source: string;
|
|
64
|
+
snippet: string;
|
|
65
|
+
raw_ref: string[];
|
|
66
|
+
warning_flags: string[];
|
|
67
|
+
sensitivity_flags: string[];
|
|
68
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function listVaultJsonCandidates(target: string, boundaryRoot: string): Promise<string[]>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { lstat, readdir } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { assertReadableInside, assertWritableInside } from "./io.js";
|
|
4
|
+
export async function listVaultJsonCandidates(target, boundaryRoot) {
|
|
5
|
+
try {
|
|
6
|
+
await assertWritableInside(boundaryRoot, target);
|
|
7
|
+
await assertReadableInside(boundaryRoot, target);
|
|
8
|
+
const info = await lstat(target);
|
|
9
|
+
if (info.isSymbolicLink())
|
|
10
|
+
return [target];
|
|
11
|
+
if (info.isFile())
|
|
12
|
+
return target.endsWith(".json") ? [target] : [];
|
|
13
|
+
if (!info.isDirectory())
|
|
14
|
+
return [];
|
|
15
|
+
const entries = await readdir(target, { withFileTypes: true });
|
|
16
|
+
const files = [];
|
|
17
|
+
for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
18
|
+
const child = path.join(target, entry.name);
|
|
19
|
+
if (entry.isSymbolicLink())
|
|
20
|
+
files.push(child);
|
|
21
|
+
else if (entry.isDirectory())
|
|
22
|
+
files.push(...await listVaultJsonCandidates(child, boundaryRoot));
|
|
23
|
+
else if (entry.isFile() && entry.name.endsWith(".json"))
|
|
24
|
+
files.push(child);
|
|
25
|
+
}
|
|
26
|
+
return files;
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
const symlink = await firstSymlink(boundaryRoot, target);
|
|
30
|
+
if (symlink)
|
|
31
|
+
return [symlink];
|
|
32
|
+
if (error.code === "ENOENT")
|
|
33
|
+
return [];
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async function firstSymlink(root, target) {
|
|
38
|
+
const rootResolved = path.resolve(root);
|
|
39
|
+
const relative = path.relative(rootResolved, path.resolve(target));
|
|
40
|
+
if (!relative || relative.startsWith("..") || path.isAbsolute(relative))
|
|
41
|
+
return undefined;
|
|
42
|
+
let current = rootResolved;
|
|
43
|
+
for (const part of relative.split(path.sep)) {
|
|
44
|
+
current = path.join(current, part);
|
|
45
|
+
try {
|
|
46
|
+
if ((await lstat(current)).isSymbolicLink())
|
|
47
|
+
return current;
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
if (error.code === "ENOENT")
|
|
51
|
+
return undefined;
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=vault-candidates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-candidates.js","sourceRoot":"","sources":["../src/vault-candidates.ts"],"names":[],"mappings":"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"}
|
package/dist/vault.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface VaultConfig {
|
|
2
|
+
schema_version: 1;
|
|
3
|
+
paused: boolean;
|
|
4
|
+
project_only_recall: boolean;
|
|
5
|
+
sensitive_exclusion: boolean;
|
|
6
|
+
max_snippets: number;
|
|
7
|
+
max_characters: number;
|
|
8
|
+
max_files: number;
|
|
9
|
+
max_raw_fragment_characters: number;
|
|
10
|
+
search_timeout_ms: number;
|
|
11
|
+
created_at: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ProjectRecord {
|
|
14
|
+
schema_version: 1;
|
|
15
|
+
project_id: string;
|
|
16
|
+
display_name: string;
|
|
17
|
+
root_path: string;
|
|
18
|
+
identity_source: "git_remote_root" | "git_root" | "absolute_path";
|
|
19
|
+
created_at: string;
|
|
20
|
+
last_seen: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function initVault(root: string): Promise<VaultConfig>;
|
|
23
|
+
export declare function setPaused(root: string, paused: boolean): Promise<VaultConfig>;
|
|
24
|
+
export declare function projectId(cwd: string): Promise<string>;
|
|
25
|
+
export declare function registerProject(root: string, cwd: string): Promise<ProjectRecord>;
|
|
26
|
+
export declare function listProjects(root: string): Promise<ProjectRecord[]>;
|
|
27
|
+
export declare function listJsonFiles(dir: string, boundaryRoot: string): Promise<string[]>;
|
|
28
|
+
export declare function vaultStats(root: string): Promise<Record<string, number | boolean>>;
|
package/dist/vault.js
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { readdir, realpath, stat } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
|
+
import { assertReadableInside, assertWritableInside, atomicJson, ensureDir, readJson } from "./io.js";
|
|
5
|
+
import { vaultPaths } from "./paths.js";
|
|
6
|
+
import { assertProjectRecord, assertQueueItem, assertVaultConfig } from "./schema-validation.js";
|
|
7
|
+
import { assertProjectRecordPath, assertQueueRecordPath } from "./record-paths.js";
|
|
8
|
+
function defaultConfig(createdAt = new Date().toISOString()) {
|
|
9
|
+
return {
|
|
10
|
+
schema_version: 1,
|
|
11
|
+
paused: false,
|
|
12
|
+
project_only_recall: true,
|
|
13
|
+
sensitive_exclusion: true,
|
|
14
|
+
max_snippets: 8,
|
|
15
|
+
max_characters: 12000,
|
|
16
|
+
max_files: 5000,
|
|
17
|
+
max_raw_fragment_characters: 500,
|
|
18
|
+
search_timeout_ms: 2000,
|
|
19
|
+
created_at: createdAt
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export async function initVault(root) {
|
|
23
|
+
const p = vaultPaths(root);
|
|
24
|
+
await Promise.all([
|
|
25
|
+
p.projects, p.raw, p.processed, p.enrichments, p.queue, p.tmp, p.registry, p.decisions, p.quarantine
|
|
26
|
+
].map(ensureDir));
|
|
27
|
+
await assertWritableInside(p.root, p.config);
|
|
28
|
+
try {
|
|
29
|
+
const existing = await readJson(p.config);
|
|
30
|
+
if (existing.schema_version !== 1)
|
|
31
|
+
throw new Error(`Unsupported vault config schema: ${String(existing.schema_version)}`);
|
|
32
|
+
const next = { ...defaultConfig(typeof existing.created_at === "string" ? existing.created_at : undefined), ...existing };
|
|
33
|
+
assertVaultConfig(next);
|
|
34
|
+
if (JSON.stringify(existing) !== JSON.stringify(next)) {
|
|
35
|
+
await assertWritableInside(p.root, p.config);
|
|
36
|
+
await atomicJson(p.config, next);
|
|
37
|
+
}
|
|
38
|
+
return next;
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
if (error.code !== "ENOENT")
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
const config = defaultConfig();
|
|
45
|
+
await assertWritableInside(p.root, p.config);
|
|
46
|
+
await atomicJson(p.config, config);
|
|
47
|
+
return config;
|
|
48
|
+
}
|
|
49
|
+
export async function setPaused(root, paused) {
|
|
50
|
+
const p = vaultPaths(root);
|
|
51
|
+
const config = await initVault(root);
|
|
52
|
+
const next = { ...config, paused };
|
|
53
|
+
await assertWritableInside(p.root, p.config);
|
|
54
|
+
await atomicJson(p.config, next);
|
|
55
|
+
return next;
|
|
56
|
+
}
|
|
57
|
+
export async function projectId(cwd) {
|
|
58
|
+
return (await projectIdentity(cwd)).project_id;
|
|
59
|
+
}
|
|
60
|
+
export async function registerProject(root, cwd) {
|
|
61
|
+
await initVault(root);
|
|
62
|
+
const identity = await projectIdentity(cwd);
|
|
63
|
+
const p = vaultPaths(root);
|
|
64
|
+
const file = path.join(p.projects, `${identity.project_id}.json`);
|
|
65
|
+
await assertWritableInside(p.root, file);
|
|
66
|
+
const now = new Date().toISOString();
|
|
67
|
+
let createdAt = now;
|
|
68
|
+
try {
|
|
69
|
+
const existing = await readJson(file);
|
|
70
|
+
assertProjectRecord(existing);
|
|
71
|
+
assertProjectRecordPath(p, file, existing);
|
|
72
|
+
createdAt = existing.created_at;
|
|
73
|
+
}
|
|
74
|
+
catch { }
|
|
75
|
+
const record = { schema_version: 1, ...identity, created_at: createdAt, last_seen: now };
|
|
76
|
+
await assertWritableInside(p.root, file);
|
|
77
|
+
await atomicJson(file, record);
|
|
78
|
+
return record;
|
|
79
|
+
}
|
|
80
|
+
export async function listProjects(root) {
|
|
81
|
+
const p = vaultPaths(root);
|
|
82
|
+
return (await Promise.all((await listJsonFiles(p.projects, p.root)).map(async (file) => {
|
|
83
|
+
try {
|
|
84
|
+
const value = await readJson(file);
|
|
85
|
+
assertProjectRecord(value);
|
|
86
|
+
assertProjectRecordPath(p, file, value);
|
|
87
|
+
return value;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
}))).filter((record) => Boolean(record)).sort((a, b) => b.last_seen.localeCompare(a.last_seen) || a.project_id.localeCompare(b.project_id));
|
|
93
|
+
}
|
|
94
|
+
async function projectIdentity(cwd) {
|
|
95
|
+
const requested = path.resolve(cwd);
|
|
96
|
+
const resolved = await realpath(requested).catch(() => requested);
|
|
97
|
+
const remote = await gitValue(resolved, ["config", "--get", "remote.origin.url"]);
|
|
98
|
+
const gitRoot = await gitValue(resolved, ["rev-parse", "--show-toplevel"]);
|
|
99
|
+
const rootPath = gitRoot ?? resolved;
|
|
100
|
+
const material = remote && gitRoot ? `${remote}\0${gitRoot}` : rootPath;
|
|
101
|
+
return {
|
|
102
|
+
project_id: `p_${createHash("sha256").update(material).digest("hex").slice(0, 16)}`,
|
|
103
|
+
display_name: path.basename(rootPath) || rootPath,
|
|
104
|
+
root_path: rootPath,
|
|
105
|
+
identity_source: remote && gitRoot ? "git_remote_root" : gitRoot ? "git_root" : "absolute_path"
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
async function gitValue(cwd, args) {
|
|
109
|
+
const { execFile } = await import("node:child_process");
|
|
110
|
+
return await new Promise((resolve) => {
|
|
111
|
+
execFile("git", args, { cwd }, (error, stdout) => resolve(error ? undefined : stdout.trim() || undefined));
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
export async function listJsonFiles(dir, boundaryRoot) {
|
|
115
|
+
try {
|
|
116
|
+
await assertWritableInside(boundaryRoot, dir);
|
|
117
|
+
await assertReadableInside(boundaryRoot, dir);
|
|
118
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
119
|
+
const files = [];
|
|
120
|
+
for (const entry of entries) {
|
|
121
|
+
const target = path.join(dir, entry.name);
|
|
122
|
+
if (entry.isDirectory())
|
|
123
|
+
files.push(...await listJsonFiles(target, boundaryRoot));
|
|
124
|
+
else if (entry.isFile() && entry.name.endsWith(".json"))
|
|
125
|
+
files.push(target);
|
|
126
|
+
}
|
|
127
|
+
return files.sort();
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
if (error.code === "ENOENT")
|
|
131
|
+
return [];
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
export async function vaultStats(root) {
|
|
136
|
+
const p = vaultPaths(root);
|
|
137
|
+
const config = await initVault(root);
|
|
138
|
+
const [raw, processed, enrichments, queue, pendingCaptures] = await Promise.all([
|
|
139
|
+
listJsonFiles(p.raw, p.root), listJsonFiles(p.processed, p.root), listJsonFiles(p.enrichments, p.root), listJsonFiles(p.queue, p.root), listJsonFiles(path.join(p.tmp, "pending"), p.root)
|
|
140
|
+
]);
|
|
141
|
+
const queueCounts = { pending: 0, processing: 0, failed: 0, done: 0, invalid: 0 };
|
|
142
|
+
for (const file of queue) {
|
|
143
|
+
try {
|
|
144
|
+
const item = await readJson(file);
|
|
145
|
+
assertQueueItem(item);
|
|
146
|
+
assertQueueRecordPath(p, file, item);
|
|
147
|
+
queueCounts[item.status] += 1;
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
queueCounts.invalid += 1;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
let bytes = 0;
|
|
154
|
+
for (const file of [...raw, ...processed, ...enrichments])
|
|
155
|
+
bytes += (await stat(file)).size;
|
|
156
|
+
return { paused: config.paused, raw_events: raw.length, processed_memories: processed.length, enriched_memories: enrichments.length, queue_items: queue.length, queue_pending: queueCounts.pending, queue_processing: queueCounts.processing, queue_failed: queueCounts.failed, queue_done: queueCounts.done, queue_invalid: queueCounts.invalid, pending_captures: pendingCaptures.length, bytes };
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=vault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function windowsCommand(input) {
|
|
2
|
+
const adapter = ps(input.adapter);
|
|
3
|
+
const node = ps(input.node);
|
|
4
|
+
const hook = ps(input.hook);
|
|
5
|
+
const identity = input.runtimeIdentity ? `$env:LINGER_RUNTIME_ID='${ps(input.runtimeIdentity)}'; ` : "";
|
|
6
|
+
return `powershell.exe -NoProfile -Command "$env:LINGER_ADAPTER='${adapter}'; ${identity}& '${node}' '${hook}'"`;
|
|
7
|
+
}
|
|
8
|
+
function ps(value) { return value.replaceAll("'", "''"); }
|
|
9
|
+
//# sourceMappingURL=windows-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows-command.js","sourceRoot":"","sources":["../src/windows-command.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,KAAgF;IAC7G,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,2BAA2B,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACxG,OAAO,4DAA4D,OAAO,MAAM,QAAQ,MAAM,IAAI,MAAM,IAAI,IAAI,CAAC;AACnH,CAAC;AAED,SAAS,EAAE,CAAC,KAAa,IAAY,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "linger-skill",
|
|
3
|
+
"version": "0.2.2",
|
|
4
|
+
"description": "File-native sidecar conversation archive and decision trail for coding agents.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/arishana1969/linger-skill.git"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/arishana1969/linger-skill#readme",
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/arishana1969/linger-skill/issues"
|
|
13
|
+
},
|
|
14
|
+
"publishConfig": {
|
|
15
|
+
"access": "public",
|
|
16
|
+
"registry": "https://registry.npmjs.org/"
|
|
17
|
+
},
|
|
18
|
+
"type": "module",
|
|
19
|
+
"bin": {
|
|
20
|
+
"linger-skill": "dist/cli.js",
|
|
21
|
+
"linger": "dist/cli.js",
|
|
22
|
+
"linger-eval": "dist/eval-cli.js"
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist",
|
|
26
|
+
"!dist/*.test.*",
|
|
27
|
+
"skills",
|
|
28
|
+
"README.md",
|
|
29
|
+
"README.zh-CN.md",
|
|
30
|
+
"CHANGELOG.md",
|
|
31
|
+
"PRIVACY.md",
|
|
32
|
+
"SECURITY.md",
|
|
33
|
+
"LICENSE",
|
|
34
|
+
"scripts/release-readiness.mjs"
|
|
35
|
+
],
|
|
36
|
+
"engines": {
|
|
37
|
+
"node": ">=20"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@types/node": "^24.0.0",
|
|
41
|
+
"typescript": "^5.8.0"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "tsc -p tsconfig.json",
|
|
45
|
+
"check": "tsc -p tsconfig.json --noEmit",
|
|
46
|
+
"test": "pnpm run build && node --test dist/*.test.js",
|
|
47
|
+
"eval:year": "node dist/eval-cli.js generate --output eval-data && node dist/eval-cli.js run --fixture eval-data/fixtures/linger-year-2025.json --oracle eval-data/oracle/linger-year-2025.oracle.json",
|
|
48
|
+
"eval:adversarial": "node dist/eval-cli.js adversarial",
|
|
49
|
+
"eval:heldout": "node dist/eval-cli.js heldout",
|
|
50
|
+
"verify:package": "node scripts/package-smoke.mjs",
|
|
51
|
+
"verify:release-metadata": "node scripts/release-readiness.mjs"
|
|
52
|
+
}
|
|
53
|
+
}
|