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.
Files changed (155) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/LICENSE +21 -0
  3. package/PRIVACY.md +31 -0
  4. package/README.md +300 -0
  5. package/README.zh-CN.md +300 -0
  6. package/SECURITY.md +25 -0
  7. package/dist/adapter-evidence.d.ts +31 -0
  8. package/dist/adapter-evidence.js +166 -0
  9. package/dist/adapter-evidence.js.map +1 -0
  10. package/dist/adapters.d.ts +20 -0
  11. package/dist/adapters.js +105 -0
  12. package/dist/adapters.js.map +1 -0
  13. package/dist/capture.d.ts +16 -0
  14. package/dist/capture.js +108 -0
  15. package/dist/capture.js.map +1 -0
  16. package/dist/cli.d.ts +2 -0
  17. package/dist/cli.js +217 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/control.d.ts +9 -0
  20. package/dist/control.js +38 -0
  21. package/dist/control.js.map +1 -0
  22. package/dist/decision-extraction.d.ts +4 -0
  23. package/dist/decision-extraction.js +63 -0
  24. package/dist/decision-extraction.js.map +1 -0
  25. package/dist/decisions.d.ts +60 -0
  26. package/dist/decisions.js +166 -0
  27. package/dist/decisions.js.map +1 -0
  28. package/dist/delete.d.ts +21 -0
  29. package/dist/delete.js +96 -0
  30. package/dist/delete.js.map +1 -0
  31. package/dist/doctor.d.ts +6 -0
  32. package/dist/doctor.js +208 -0
  33. package/dist/doctor.js.map +1 -0
  34. package/dist/enrichment.d.ts +82 -0
  35. package/dist/enrichment.js +359 -0
  36. package/dist/enrichment.js.map +1 -0
  37. package/dist/eval-adversarial.d.ts +2 -0
  38. package/dist/eval-adversarial.js +20 -0
  39. package/dist/eval-adversarial.js.map +1 -0
  40. package/dist/eval-cli.d.ts +2 -0
  41. package/dist/eval-cli.js +83 -0
  42. package/dist/eval-cli.js.map +1 -0
  43. package/dist/eval-generator.d.ts +41 -0
  44. package/dist/eval-generator.js +36 -0
  45. package/dist/eval-generator.js.map +1 -0
  46. package/dist/eval-heldout.d.ts +2 -0
  47. package/dist/eval-heldout.js +56 -0
  48. package/dist/eval-heldout.js.map +1 -0
  49. package/dist/eval-io.d.ts +6 -0
  50. package/dist/eval-io.js +15 -0
  51. package/dist/eval-io.js.map +1 -0
  52. package/dist/eval-runner.d.ts +8 -0
  53. package/dist/eval-runner.js +56 -0
  54. package/dist/eval-runner.js.map +1 -0
  55. package/dist/eval-scorer.d.ts +27 -0
  56. package/dist/eval-scorer.js +28 -0
  57. package/dist/eval-scorer.js.map +1 -0
  58. package/dist/hook-cli.d.ts +2 -0
  59. package/dist/hook-cli.js +28 -0
  60. package/dist/hook-cli.js.map +1 -0
  61. package/dist/hook-command.d.ts +9 -0
  62. package/dist/hook-command.js +31 -0
  63. package/dist/hook-command.js.map +1 -0
  64. package/dist/hook-handler.d.ts +24 -0
  65. package/dist/hook-handler.js +93 -0
  66. package/dist/hook-handler.js.map +1 -0
  67. package/dist/hook-installer.d.ts +4 -0
  68. package/dist/hook-installer.js +120 -0
  69. package/dist/hook-installer.js.map +1 -0
  70. package/dist/hook-ownership.d.ts +8 -0
  71. package/dist/hook-ownership.js +51 -0
  72. package/dist/hook-ownership.js.map +1 -0
  73. package/dist/install-consent.d.ts +4 -0
  74. package/dist/install-consent.js +20 -0
  75. package/dist/install-consent.js.map +1 -0
  76. package/dist/installer.d.ts +33 -0
  77. package/dist/installer.js +140 -0
  78. package/dist/installer.js.map +1 -0
  79. package/dist/io.d.ts +7 -0
  80. package/dist/io.js +86 -0
  81. package/dist/io.js.map +1 -0
  82. package/dist/memory-events.d.ts +31 -0
  83. package/dist/memory-events.js +109 -0
  84. package/dist/memory-events.js.map +1 -0
  85. package/dist/memory-intent.d.ts +1 -0
  86. package/dist/memory-intent.js +4 -0
  87. package/dist/memory-intent.js.map +1 -0
  88. package/dist/paths.d.ts +15 -0
  89. package/dist/paths.js +24 -0
  90. package/dist/paths.js.map +1 -0
  91. package/dist/pending.d.ts +21 -0
  92. package/dist/pending.js +76 -0
  93. package/dist/pending.js.map +1 -0
  94. package/dist/processed-markdown.d.ts +3 -0
  95. package/dist/processed-markdown.js +29 -0
  96. package/dist/processed-markdown.js.map +1 -0
  97. package/dist/processing-policy.d.ts +19 -0
  98. package/dist/processing-policy.js +79 -0
  99. package/dist/processing-policy.js.map +1 -0
  100. package/dist/processing.d.ts +4 -0
  101. package/dist/processing.js +143 -0
  102. package/dist/processing.js.map +1 -0
  103. package/dist/purge.d.ts +7 -0
  104. package/dist/purge.js +16 -0
  105. package/dist/purge.js.map +1 -0
  106. package/dist/recall-sampling.d.ts +53 -0
  107. package/dist/recall-sampling.js +201 -0
  108. package/dist/recall-sampling.js.map +1 -0
  109. package/dist/recall.d.ts +19 -0
  110. package/dist/recall.js +70 -0
  111. package/dist/recall.js.map +1 -0
  112. package/dist/record-paths.d.ts +18 -0
  113. package/dist/record-paths.js +38 -0
  114. package/dist/record-paths.js.map +1 -0
  115. package/dist/repair.d.ts +4 -0
  116. package/dist/repair.js +83 -0
  117. package/dist/repair.js.map +1 -0
  118. package/dist/runtime-identity.d.ts +1 -0
  119. package/dist/runtime-identity.js +31 -0
  120. package/dist/runtime-identity.js.map +1 -0
  121. package/dist/runtime-installer.d.ts +7 -0
  122. package/dist/runtime-installer.js +43 -0
  123. package/dist/runtime-installer.js.map +1 -0
  124. package/dist/schema-validation.d.ts +26 -0
  125. package/dist/schema-validation.js +222 -0
  126. package/dist/schema-validation.js.map +1 -0
  127. package/dist/search.d.ts +16 -0
  128. package/dist/search.js +192 -0
  129. package/dist/search.js.map +1 -0
  130. package/dist/sensitivity.d.ts +6 -0
  131. package/dist/sensitivity.js +27 -0
  132. package/dist/sensitivity.js.map +1 -0
  133. package/dist/tag-registry.d.ts +21 -0
  134. package/dist/tag-registry.js +70 -0
  135. package/dist/tag-registry.js.map +1 -0
  136. package/dist/term-graph.d.ts +18 -0
  137. package/dist/term-graph.js +63 -0
  138. package/dist/term-graph.js.map +1 -0
  139. package/dist/types.d.ts +68 -0
  140. package/dist/types.js +2 -0
  141. package/dist/types.js.map +1 -0
  142. package/dist/vault-candidates.d.ts +1 -0
  143. package/dist/vault-candidates.js +57 -0
  144. package/dist/vault-candidates.js.map +1 -0
  145. package/dist/vault.d.ts +28 -0
  146. package/dist/vault.js +158 -0
  147. package/dist/vault.js.map +1 -0
  148. package/dist/windows-command.d.ts +6 -0
  149. package/dist/windows-command.js +9 -0
  150. package/dist/windows-command.js.map +1 -0
  151. package/package.json +53 -0
  152. package/scripts/release-readiness.mjs +58 -0
  153. package/skills/linger/SKILL.md +56 -0
  154. package/skills/linger/agents/openai.yaml +4 -0
  155. 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":"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"}
@@ -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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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAErE,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,MAAc,EAAE,YAAoB;IAChF,IAAI,CAAC;QACH,MAAM,oBAAoB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACjD,MAAM,oBAAoB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,IAAI,CAAC,cAAc,EAAE;YAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,MAAM,EAAE;YAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,OAAO,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACzE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,KAAK,CAAC,cAAc,EAAE;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;iBACzC,IAAI,KAAK,CAAC,WAAW,EAAE;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,uBAAuB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;iBAC3F,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACzD,IAAI,OAAO;YAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAClE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,MAAc;IACtD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACnE,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1F,IAAI,OAAO,GAAG,YAAY,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5C,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC;YAAC,IAAI,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,EAAE;gBAAE,OAAO,OAAO,CAAC;QAAC,CAAC;QACpE,OAAO,KAAK,EAAE,CAAC;YAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC;YAAC,MAAM,KAAK,CAAC;QAAC,CAAC;IAC1G,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -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,6 @@
1
+ export declare function windowsCommand(input: {
2
+ adapter: string;
3
+ node: string;
4
+ hook: string;
5
+ runtimeIdentity?: string;
6
+ }): string;
@@ -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
+ }