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 @@
1
+ {"version":3,"file":"purge.js","sourceRoot":"","sources":["../src/purge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACtC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAY,EAAE,YAA8C;IACtF,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,YAAY,CAAC,MAAM,KAAK,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IACtH,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACnD,IAAI,QAAQ,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACnE,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC;IAC9B,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAChC,CAAC"}
@@ -0,0 +1,53 @@
1
+ import type { RecallPackage } from "./recall.js";
2
+ export type RecallFeedbackOutcome = "useful" | "partial" | "wrong" | "missed";
3
+ export type RawLocated = "yes" | "no" | "unknown";
4
+ export interface RecallAttempt {
5
+ schema_version: 1;
6
+ attempt_id: string;
7
+ project_id: string;
8
+ query: string;
9
+ query_sensitivity: "normal" | "sensitive" | "secret";
10
+ classification: RecallPackage["classification"];
11
+ hit_sources: string[];
12
+ raw_refs: string[];
13
+ decision_topic?: string;
14
+ created_at: string;
15
+ }
16
+ export interface RecallFeedback {
17
+ schema_version: 1;
18
+ feedback_id: string;
19
+ attempt_id: string;
20
+ project_id: string;
21
+ outcome: RecallFeedbackOutcome;
22
+ raw_located: RawLocated;
23
+ decision_trail_used: boolean;
24
+ note?: string;
25
+ created_at: string;
26
+ }
27
+ export declare function recordRecallAttempt(root: string, input: {
28
+ projectId: string;
29
+ query: string;
30
+ result: RecallPackage;
31
+ }, now?: Date): Promise<RecallAttempt>;
32
+ export declare function recordRecallFeedback(root: string, input: {
33
+ projectId: string;
34
+ attemptId: string;
35
+ outcome: RecallFeedbackOutcome;
36
+ rawLocated?: RawLocated;
37
+ decisionTrailUsed?: boolean;
38
+ note?: string;
39
+ }, now?: Date): Promise<RecallFeedback>;
40
+ export declare function recallSamplingReport(root: string, projectId: string): Promise<{
41
+ project_id: string;
42
+ total_attempts: number;
43
+ unresolved_attempts: number;
44
+ classifications: Record<string, number>;
45
+ outcomes: Record<string, number>;
46
+ raw_located_yes: number;
47
+ decision_trail_used: number;
48
+ }>;
49
+ export declare function assertRecallAttempt(value: unknown): asserts value is RecallAttempt;
50
+ export declare function assertRecallFeedback(value: unknown): asserts value is RecallFeedback;
51
+ export declare function assertRecallAttemptPath(root: string, file: string, attempt: RecallAttempt): void;
52
+ export declare function assertRecallFeedbackPath(root: string, file: string, feedback: RecallFeedback): void;
53
+ export declare function assertRecallSampleRecord(root: string, file: string, value: unknown): void;
@@ -0,0 +1,201 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { readdir } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { assertReadableInside, assertWritableInside, atomicJson, readJson } from "./io.js";
5
+ import { assertSafeId, vaultPaths } from "./paths.js";
6
+ import { classifySensitivity, redactSecrets } from "./sensitivity.js";
7
+ export async function recordRecallAttempt(root, input, now = new Date()) {
8
+ const project = assertSafeId(input.projectId, "project id");
9
+ const detected = classifySensitivity(input.query);
10
+ const attempt = {
11
+ schema_version: 1,
12
+ attempt_id: `ra_${randomUUID().replaceAll("-", "")}`,
13
+ project_id: project,
14
+ query: detected.level === "secret" ? redactSecrets(input.query) : input.query,
15
+ query_sensitivity: detected.level,
16
+ classification: input.result.classification,
17
+ hit_sources: [...new Set(input.result.hits.map(hit => hit.source))],
18
+ raw_refs: [...new Set(input.result.hits.flatMap(hit => hit.raw_ref))],
19
+ ...(input.result.decision_topic ? { decision_topic: input.result.decision_topic } : {}),
20
+ created_at: now.toISOString()
21
+ };
22
+ const file = path.join(sampleRoot(root, project), "attempts", `${attempt.attempt_id}.json`);
23
+ await assertWritableInside(root, file);
24
+ await atomicJson(file, attempt);
25
+ return attempt;
26
+ }
27
+ export async function recordRecallFeedback(root, input, now = new Date()) {
28
+ const project = assertSafeId(input.projectId, "project id");
29
+ const attemptId = assertSafeId(input.attemptId, "recall attempt id");
30
+ if (!["useful", "partial", "wrong", "missed"].includes(input.outcome))
31
+ throw new Error("Invalid recall feedback outcome");
32
+ const rawLocated = input.rawLocated ?? "unknown";
33
+ if (!["yes", "no", "unknown"].includes(rawLocated))
34
+ throw new Error("Invalid raw-located value");
35
+ if (input.note && input.note.length > 2000)
36
+ throw new Error("Recall feedback note is too long");
37
+ const attemptFile = path.join(sampleRoot(root, project), "attempts", `${attemptId}.json`);
38
+ await assertReadableInside(root, attemptFile);
39
+ const attempt = await readJson(attemptFile);
40
+ assertRecallAttempt(attempt);
41
+ assertRecallAttemptPath(root, attemptFile, attempt);
42
+ if (attempt.attempt_id !== attemptId || attempt.project_id !== project)
43
+ throw new Error("Invalid recall attempt");
44
+ const noteSensitivity = input.note ? classifySensitivity(input.note) : undefined;
45
+ const note = input.note && noteSensitivity?.level === "secret" ? redactSecrets(input.note) : input.note;
46
+ const feedback = {
47
+ schema_version: 1,
48
+ feedback_id: `rf_${randomUUID().replaceAll("-", "")}`,
49
+ attempt_id: attemptId,
50
+ project_id: project,
51
+ outcome: input.outcome,
52
+ raw_located: rawLocated,
53
+ decision_trail_used: input.decisionTrailUsed ?? false,
54
+ ...(note ? { note } : {}),
55
+ created_at: now.toISOString()
56
+ };
57
+ const file = path.join(sampleRoot(root, project), "feedback", attemptId, `${feedback.feedback_id}.json`);
58
+ await assertWritableInside(root, file);
59
+ await atomicJson(file, feedback);
60
+ return feedback;
61
+ }
62
+ export async function recallSamplingReport(root, projectId) {
63
+ const project = assertSafeId(projectId, "project id");
64
+ const base = sampleRoot(root, project);
65
+ const attempts = await readAttempts(root, path.join(base, "attempts"));
66
+ const feedback = await readFeedback(root, path.join(base, "feedback"));
67
+ if (attempts.some(item => item.project_id !== project) || feedback.some(item => item.project_id !== project))
68
+ throw new Error("Recall sampling project mismatch");
69
+ const attemptIds = new Set(attempts.map(item => item.attempt_id));
70
+ if (feedback.some(item => !attemptIds.has(item.attempt_id)))
71
+ throw new Error("Recall feedback references a missing attempt");
72
+ const latest = new Map();
73
+ for (const item of feedback.sort((a, b) => a.created_at.localeCompare(b.created_at)))
74
+ latest.set(item.attempt_id, item);
75
+ return {
76
+ project_id: project,
77
+ total_attempts: attempts.length,
78
+ unresolved_attempts: attempts.filter(attempt => !latest.has(attempt.attempt_id)).length,
79
+ classifications: counts(attempts.map(attempt => attempt.classification)),
80
+ outcomes: counts([...latest.values()].map(item => item.outcome)),
81
+ raw_located_yes: [...latest.values()].filter(item => item.raw_located === "yes").length,
82
+ decision_trail_used: [...latest.values()].filter(item => item.decision_trail_used).length
83
+ };
84
+ }
85
+ function sampleRoot(root, project) {
86
+ return path.join(vaultPaths(root).registry, "recall-samples", project);
87
+ }
88
+ async function readAttempts(root, dir) {
89
+ try {
90
+ await assertReadableInside(root, dir);
91
+ const names = (await readdir(dir)).filter(name => name.endsWith(".json")).sort();
92
+ return await Promise.all(names.map(async (name) => {
93
+ const file = path.join(dir, name);
94
+ await assertReadableInside(root, file);
95
+ const attempt = await readJson(file);
96
+ assertRecallAttempt(attempt);
97
+ assertRecallAttemptPath(root, file, attempt);
98
+ return attempt;
99
+ }));
100
+ }
101
+ catch (error) {
102
+ if (error.code === "ENOENT")
103
+ return [];
104
+ throw error;
105
+ }
106
+ }
107
+ async function readFeedback(root, dir) {
108
+ try {
109
+ await assertReadableInside(root, dir);
110
+ const attempts = await readdir(dir, { withFileTypes: true });
111
+ const result = [];
112
+ for (const attempt of attempts.filter(item => item.isDirectory()).sort((a, b) => a.name.localeCompare(b.name))) {
113
+ const attemptDir = path.join(dir, attempt.name);
114
+ await assertReadableInside(root, attemptDir);
115
+ const names = (await readdir(attemptDir)).filter(name => name.endsWith(".json")).sort();
116
+ for (const name of names) {
117
+ const file = path.join(attemptDir, name);
118
+ await assertReadableInside(root, file);
119
+ const item = await readJson(file);
120
+ assertRecallFeedback(item);
121
+ assertRecallFeedbackPath(root, file, item);
122
+ result.push(item);
123
+ }
124
+ }
125
+ return result;
126
+ }
127
+ catch (error) {
128
+ if (error.code === "ENOENT")
129
+ return [];
130
+ throw error;
131
+ }
132
+ }
133
+ function counts(values) {
134
+ const result = {};
135
+ for (const value of values)
136
+ result[value] = (result[value] ?? 0) + 1;
137
+ return result;
138
+ }
139
+ export function assertRecallAttempt(value) {
140
+ if (!value || typeof value !== "object" || Array.isArray(value))
141
+ throw new Error("Invalid recall attempt");
142
+ const item = value;
143
+ if (item.schema_version !== 1 || typeof item.attempt_id !== "string" || typeof item.project_id !== "string" || typeof item.query !== "string" || typeof item.created_at !== "string")
144
+ throw new Error("Invalid recall attempt");
145
+ assertSafeId(item.attempt_id, "recall attempt id");
146
+ assertSafeId(item.project_id, "project id");
147
+ assertIsoTimestamp(item.created_at, "recall attempt timestamp");
148
+ if (!["normal", "sensitive", "secret"].includes(item.query_sensitivity))
149
+ throw new Error("Invalid recall attempt sensitivity");
150
+ if (!["exact_record_found", "similar_record_found", "possible_match", "no_reliable_memory_found", "conflicting_memories_found", "unprocessed_raw_match"].includes(item.classification))
151
+ throw new Error("Invalid recall attempt classification");
152
+ if (!Array.isArray(item.hit_sources) || !item.hit_sources.every(value => typeof value === "string") || !Array.isArray(item.raw_refs) || !item.raw_refs.every(value => typeof value === "string"))
153
+ throw new Error("Invalid recall attempt references");
154
+ if (item.decision_topic !== undefined && typeof item.decision_topic !== "string")
155
+ throw new Error("Invalid recall attempt decision topic");
156
+ }
157
+ export function assertRecallFeedback(value) {
158
+ if (!value || typeof value !== "object" || Array.isArray(value))
159
+ throw new Error("Invalid recall feedback");
160
+ const item = value;
161
+ if (item.schema_version !== 1 || typeof item.feedback_id !== "string" || typeof item.attempt_id !== "string" || typeof item.project_id !== "string" || typeof item.created_at !== "string")
162
+ throw new Error("Invalid recall feedback");
163
+ assertSafeId(item.feedback_id, "recall feedback id");
164
+ assertSafeId(item.attempt_id, "recall attempt id");
165
+ assertSafeId(item.project_id, "project id");
166
+ assertIsoTimestamp(item.created_at, "recall feedback timestamp");
167
+ if (!["useful", "partial", "wrong", "missed"].includes(item.outcome) || !["yes", "no", "unknown"].includes(item.raw_located) || typeof item.decision_trail_used !== "boolean")
168
+ throw new Error("Invalid recall feedback values");
169
+ if (item.note !== undefined && (typeof item.note !== "string" || item.note.length > 2000))
170
+ throw new Error("Invalid recall feedback note");
171
+ }
172
+ export function assertRecallAttemptPath(root, file, attempt) {
173
+ const expected = path.join(sampleRoot(root, attempt.project_id), "attempts", `${attempt.attempt_id}.json`);
174
+ if (path.resolve(file) !== path.resolve(expected))
175
+ throw new Error("Invalid recall attempt path");
176
+ }
177
+ export function assertRecallFeedbackPath(root, file, feedback) {
178
+ const expected = path.join(sampleRoot(root, feedback.project_id), "feedback", feedback.attempt_id, `${feedback.feedback_id}.json`);
179
+ if (path.resolve(file) !== path.resolve(expected))
180
+ throw new Error("Invalid recall feedback path");
181
+ }
182
+ export function assertRecallSampleRecord(root, file, value) {
183
+ const relative = path.relative(path.join(vaultPaths(root).registry, "recall-samples"), file);
184
+ const parts = relative.split(path.sep);
185
+ if (parts.length === 3 && parts[1] === "attempts") {
186
+ assertRecallAttempt(value);
187
+ assertRecallAttemptPath(root, file, value);
188
+ return;
189
+ }
190
+ if (parts.length === 4 && parts[1] === "feedback") {
191
+ assertRecallFeedback(value);
192
+ assertRecallFeedbackPath(root, file, value);
193
+ return;
194
+ }
195
+ throw new Error("Invalid recall sample path");
196
+ }
197
+ function assertIsoTimestamp(value, label) {
198
+ if (typeof value !== "string" || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?(?:Z|[+-]\d{2}:\d{2})$/.test(value) || !Number.isFinite(Date.parse(value)))
199
+ throw new Error(`Invalid ${label}`);
200
+ }
201
+ //# sourceMappingURL=recall-sampling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recall-sampling.js","sourceRoot":"","sources":["../src/recall-sampling.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type SearchOptions } from "./search.js";
2
+ import type { SearchHit } from "./types.js";
3
+ export interface RecallPackage {
4
+ classification: "exact_record_found" | "similar_record_found" | "possible_match" | "no_reliable_memory_found" | "conflicting_memories_found" | "unprocessed_raw_match";
5
+ hits: SearchHit[];
6
+ candidates: {
7
+ topics: string[];
8
+ decisions: string[];
9
+ tags: string[];
10
+ time_ranges: string[];
11
+ };
12
+ truncated: boolean;
13
+ total_characters: number;
14
+ current_state?: string;
15
+ decision_topic?: string;
16
+ }
17
+ export declare function recall(root: string, options: SearchOptions & {
18
+ maxCharacters?: number;
19
+ }): Promise<RecallPackage>;
package/dist/recall.js ADDED
@@ -0,0 +1,70 @@
1
+ import { listDecisionViews } from "./decisions.js";
2
+ import { search } from "./search.js";
3
+ import { readTagRegistry } from "./tag-registry.js";
4
+ export async function recall(root, options) {
5
+ let found = await search(root, options);
6
+ if (/(?:为什么|原因|理由|why|reason)/i.test(options.query)) {
7
+ const rationale = found.filter(hit => /(?:因为|由于|\b因|because|reason|cost|complexity|constraint)/i.test(hit.snippet));
8
+ if (rationale.length)
9
+ found = rationale;
10
+ }
11
+ const decisions = await listDecisionViews(root, options.projectId);
12
+ const initialEvidence = new Set(found.flatMap(hit => hit.raw_ref));
13
+ const evidenceRank = new Map();
14
+ found.forEach((hit, index) => hit.raw_ref.forEach(event => evidenceRank.set(event, Math.min(evidenceRank.get(event) ?? Number.POSITIVE_INFINITY, index))));
15
+ const decisionRank = (sourceEvents) => Math.min(...sourceEvents.map(event => evidenceRank.get(event) ?? Number.POSITIVE_INFINITY));
16
+ const matchedDecision = decisions
17
+ .filter(view => view.source_events.some(event => initialEvidence.has(event)))
18
+ .sort((a, b) => decisionRank(a.source_events) - decisionRank(b.source_events) || b.updated_at.localeCompare(a.updated_at))[0];
19
+ const asksForCurrent = /(?:当前|现在|目前|current|currently|now)/i.test(options.query);
20
+ const asksForRationale = /(?:为什么|原因|理由|why|reason)/i.test(options.query);
21
+ if (matchedDecision?.current_evidence_refs?.length && (asksForCurrent || asksForRationale)) {
22
+ const currentEvidence = new Set(matchedDecision.current_evidence_refs);
23
+ const currentHits = found.filter(hit => hit.raw_ref.some(event => currentEvidence.has(event)));
24
+ if (currentHits.length)
25
+ found = currentHits;
26
+ }
27
+ const max = options.maxCharacters ?? 12000;
28
+ const hits = [];
29
+ let characters = 0;
30
+ let truncated = false;
31
+ for (const hit of found) {
32
+ const remaining = max - characters;
33
+ if (remaining <= 0) {
34
+ truncated = true;
35
+ break;
36
+ }
37
+ const snippet = hit.snippet.slice(0, remaining);
38
+ hits.push({ ...hit, snippet });
39
+ characters += snippet.length;
40
+ if (snippet.length < hit.snippet.length) {
41
+ truncated = true;
42
+ break;
43
+ }
44
+ }
45
+ const registry = await readTagRegistry(root, options.projectId).catch(() => undefined);
46
+ const classification = classify(hits, Boolean(matchedDecision?.conflicts.length));
47
+ return {
48
+ classification, hits, truncated, total_characters: characters, current_state: matchedDecision?.current_state, decision_topic: matchedDecision?.topic,
49
+ candidates: hits.length ? { topics: [], decisions: [], tags: [], time_ranges: [] } : {
50
+ topics: decisions.map(view => view.topic).slice(0, 5),
51
+ decisions: decisions.map(view => view.current_state).filter((value) => Boolean(value)).slice(0, 5),
52
+ tags: (registry?.entries ?? []).slice(0, 8).map(entry => entry.normalized_tag),
53
+ time_ranges: [...new Set((registry?.entries ?? []).map(entry => entry.last_used.slice(0, 7)).filter(value => /^\d{4}-\d{2}$/.test(value)))].sort().reverse().slice(0, 5)
54
+ }
55
+ };
56
+ }
57
+ function classify(hits, conflicting) {
58
+ if (!hits.length)
59
+ return "no_reliable_memory_found";
60
+ if (conflicting)
61
+ return "conflicting_memories_found";
62
+ if (hits.some(hit => hit.match_type === "exact_record"))
63
+ return "exact_record_found";
64
+ if (hits.some(hit => hit.match_type === "similar_record"))
65
+ return "similar_record_found";
66
+ if (hits.every(hit => hit.match_type === "unprocessed_raw"))
67
+ return "unprocessed_raw_match";
68
+ return "possible_match";
69
+ }
70
+ //# sourceMappingURL=recall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recall.js","sourceRoot":"","sources":["../src/recall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { VaultPaths } from "./paths.js";
2
+ import type { DecisionEvent, DecisionView } from "./decisions.js";
3
+ import type { MemoryControlEvent } from "./memory-events.js";
4
+ import type { PendingCapture } from "./pending.js";
5
+ import type { TagRegistry } from "./tag-registry.js";
6
+ import type { TermRelation } from "./term-graph.js";
7
+ import type { ProcessedMemory, QueueItem, RawEvent } from "./types.js";
8
+ import type { ProjectRecord } from "./vault.js";
9
+ export declare function assertRawRecordPath(paths: VaultPaths, file: string, event: RawEvent): void;
10
+ export declare function assertQueueRecordPath(paths: VaultPaths, file: string, item: QueueItem): void;
11
+ export declare function assertProcessedRecordPath(paths: VaultPaths, file: string, memory: ProcessedMemory): void;
12
+ export declare function assertPendingRecordPath(paths: VaultPaths, file: string, pending: PendingCapture): void;
13
+ export declare function assertDecisionEventPath(paths: VaultPaths, file: string, event: DecisionEvent): void;
14
+ export declare function assertDecisionViewPath(paths: VaultPaths, file: string, view: DecisionView): void;
15
+ export declare function assertMemoryControlPath(paths: VaultPaths, file: string, event: MemoryControlEvent): void;
16
+ export declare function assertTermRelationPath(paths: VaultPaths, file: string, relation: TermRelation): void;
17
+ export declare function assertTagRegistryPath(paths: VaultPaths, file: string, registry: TagRegistry): void;
18
+ export declare function assertProjectRecordPath(paths: VaultPaths, file: string, project: ProjectRecord): void;
@@ -0,0 +1,38 @@
1
+ import path from "node:path";
2
+ export function assertRawRecordPath(paths, file, event) {
3
+ assertCanonicalPath(file, path.join(paths.raw, event.project_id, event.session_id, `${event.event_id}.json`), "raw record");
4
+ if (event.raw_ref !== path.relative(paths.root, file))
5
+ throw new Error("Invalid raw record reference");
6
+ }
7
+ export function assertQueueRecordPath(paths, file, item) {
8
+ assertCanonicalPath(file, path.join(paths.queue, item.project_id, `${item.task_id}.json`), "queue record");
9
+ }
10
+ export function assertProcessedRecordPath(paths, file, memory) {
11
+ assertCanonicalPath(file, path.join(paths.processed, memory.project_id, `${memory.id}.json`), "processed record");
12
+ }
13
+ export function assertPendingRecordPath(paths, file, pending) {
14
+ assertCanonicalPath(file, path.join(paths.tmp, "pending", pending.event.project_id, `${pending.pending_id}.json`), "pending record");
15
+ }
16
+ export function assertDecisionEventPath(paths, file, event) {
17
+ assertCanonicalPath(file, path.join(paths.decisions, event.project_id, event.canonical_id, "events", `${event.timestamp.replaceAll(":", "-")}-${event.event_id}.json`), "decision event");
18
+ }
19
+ export function assertDecisionViewPath(paths, file, view) {
20
+ assertCanonicalPath(file, path.join(paths.decisions, view.project_id, view.canonical_id, "current.json"), "decision view");
21
+ }
22
+ export function assertMemoryControlPath(paths, file, event) {
23
+ assertCanonicalPath(file, path.join(paths.registry, "memory-events", event.project_id, `${event.timestamp.replaceAll(":", "-")}-${event.event_id}.json`), "memory control record");
24
+ }
25
+ export function assertTermRelationPath(paths, file, relation) {
26
+ assertCanonicalPath(file, path.join(paths.registry, "term-graph", relation.project_id, `${relation.relation_id}.json`), "term relation record");
27
+ }
28
+ export function assertTagRegistryPath(paths, file, registry) {
29
+ assertCanonicalPath(file, path.join(paths.registry, "tags", `${registry.project_id}.json`), "tag registry record");
30
+ }
31
+ export function assertProjectRecordPath(paths, file, project) {
32
+ assertCanonicalPath(file, path.join(paths.projects, `${project.project_id}.json`), "project record");
33
+ }
34
+ function assertCanonicalPath(actual, expected, label) {
35
+ if (path.resolve(actual) !== path.resolve(expected))
36
+ throw new Error(`Invalid ${label} path`);
37
+ }
38
+ //# sourceMappingURL=record-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-paths.js","sourceRoot":"","sources":["../src/record-paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function quarantineInvalidFiles(root: string): Promise<{
2
+ quarantined: string[];
3
+ skipped: string[];
4
+ }>;
package/dist/repair.js ADDED
@@ -0,0 +1,83 @@
1
+ import { rename } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { assertReadableInside, assertWritableInside, readJson } from "./io.js";
4
+ import { assertCodexAdapterEvidence, assertCodexAdapterEvidencePath } from "./adapter-evidence.js";
5
+ import { assertEnrichmentBatchPath, assertEnrichmentBatchRecord, assertEnrichmentOverlay, assertEnrichmentOverlayPath } from "./enrichment.js";
6
+ import { vaultPaths } from "./paths.js";
7
+ import { assertRecallSampleRecord } from "./recall-sampling.js";
8
+ import { assertDecisionEvent, assertDecisionView, assertMemoryControlEvent, assertPendingCapture, assertProcessedMemory, assertProcessingRunHistory, assertProjectRecord, assertQueueItem, assertRawEvent, assertSequenceState, assertTagRegistry, assertTermRelation, assertVaultConfig } from "./schema-validation.js";
9
+ import { assertDecisionEventPath, assertDecisionViewPath, assertMemoryControlPath, assertPendingRecordPath, assertProcessedRecordPath, assertProjectRecordPath, assertQueueRecordPath, assertRawRecordPath, assertTagRegistryPath, assertTermRelationPath } from "./record-paths.js";
10
+ import { listVaultJsonCandidates } from "./vault-candidates.js";
11
+ export async function quarantineInvalidFiles(root) {
12
+ const p = vaultPaths(root);
13
+ const quarantined = [];
14
+ const skipped = [];
15
+ try {
16
+ await assertReadableInside(p.root, p.config);
17
+ const value = await readJson(p.config);
18
+ assertVaultConfig(value);
19
+ }
20
+ catch (error) {
21
+ if (error.code !== "ENOENT")
22
+ await quarantineFile(p, "vault-config", p.root, p.config, quarantined, skipped);
23
+ }
24
+ const groups = [
25
+ { dir: p.raw, kind: "raw", read: async (file) => { const value = await readJson(file); assertRawEvent(value); assertRawRecordPath(p, file, value); } },
26
+ { dir: p.processed, kind: "processed", read: async (file) => { const value = await readJson(file); assertProcessedMemory(value); assertProcessedRecordPath(p, file, value); } },
27
+ { dir: p.enrichments, kind: "enrichment", read: async (file) => { const value = await readJson(file); assertEnrichmentOverlay(value); assertEnrichmentOverlayPath(p.root, file, value); } },
28
+ { dir: p.queue, kind: "queue", read: async (file) => { const value = await readJson(file); assertQueueItem(value); assertQueueRecordPath(p, file, value); } },
29
+ { dir: path.join(p.tmp, "pending"), kind: "pending", read: async (file) => { const value = await readJson(file); assertPendingCapture(value); assertPendingRecordPath(p, file, value); } },
30
+ { dir: p.decisions, kind: "decision", read: async (file) => { const value = await readJson(file); if (path.basename(file) === "current.json") {
31
+ assertDecisionView(value);
32
+ assertDecisionViewPath(p, file, value);
33
+ }
34
+ else {
35
+ assertDecisionEvent(value);
36
+ assertDecisionEventPath(p, file, value);
37
+ } } },
38
+ { dir: path.join(p.registry, "tags"), kind: "tag-registry", read: async (file) => { const value = await readJson(file); assertTagRegistry(value); assertTagRegistryPath(p, file, value); } },
39
+ { dir: path.join(p.registry, "memory-events"), kind: "memory-control", read: async (file) => { const value = await readJson(file); assertMemoryControlEvent(value); assertMemoryControlPath(p, file, value); } },
40
+ { dir: path.join(p.registry, "term-graph"), kind: "term-relation", read: async (file) => { const value = await readJson(file); assertTermRelation(value); assertTermRelationPath(p, file, value); } },
41
+ { dir: p.projects, kind: "project-record", read: async (file) => { const value = await readJson(file); assertProjectRecord(value); assertProjectRecordPath(p, file, value); } },
42
+ { dir: path.join(p.registry, "processing-runs"), kind: "processing-history", read: async (file) => { const value = await readJson(file); assertProcessingRunHistory(value); } },
43
+ { dir: path.join(p.registry, "adapter-evidence"), kind: "adapter-evidence", read: async (file) => { const value = await readJson(file); assertCodexAdapterEvidence(value); assertCodexAdapterEvidencePath(p.root, file); } },
44
+ { dir: path.join(p.registry, "recall-samples"), kind: "recall-sample", read: async (file) => { assertRecallSampleRecord(p.root, file, await readJson(file)); } },
45
+ { dir: path.join(p.registry, "enrichment-batches"), kind: "enrichment-batch", read: async (file) => { const value = await readJson(file); assertEnrichmentBatchRecord(value); assertEnrichmentBatchPath(p.root, file, value); } }
46
+ ];
47
+ for (const group of groups) {
48
+ for (const file of await listVaultJsonCandidates(group.dir, p.root)) {
49
+ try {
50
+ await assertReadableInside(p.root, file);
51
+ await group.read(file);
52
+ }
53
+ catch {
54
+ await quarantineFile(p, group.kind, p.root, file, quarantined, skipped);
55
+ }
56
+ }
57
+ }
58
+ for (const file of (await listVaultJsonCandidates(p.registry, p.root)).filter(file => path.dirname(file) === p.registry && file.endsWith(".sequence.json"))) {
59
+ try {
60
+ await assertReadableInside(p.root, file);
61
+ const value = await readJson(file);
62
+ assertSequenceState(value);
63
+ }
64
+ catch {
65
+ await quarantineFile(p, "sequence", p.root, file, quarantined, skipped);
66
+ }
67
+ }
68
+ return { quarantined, skipped };
69
+ }
70
+ async function quarantineFile(p, kind, base, file, quarantined, skipped) {
71
+ const relative = path.relative(base, file);
72
+ if (relative.startsWith("..") || path.isAbsolute(relative)) {
73
+ skipped.push(file);
74
+ return;
75
+ }
76
+ const destination = path.join(p.quarantine, kind, `${Date.now()}-${relative}`);
77
+ await assertWritableInside(p.root, destination);
78
+ const { ensureDir } = await import("./io.js");
79
+ await ensureDir(path.dirname(destination));
80
+ await rename(file, destination);
81
+ quarantined.push(path.relative(p.root, destination));
82
+ }
83
+ //# sourceMappingURL=repair.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair.js","sourceRoot":"","sources":["../src/repair.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function runtimeFingerprint(packageRoot: string, node: string): Promise<string>;
@@ -0,0 +1,31 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFile, readdir } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { assertReadableInside } from "./io.js";
5
+ export async function runtimeFingerprint(packageRoot, node) {
6
+ const root = path.resolve(packageRoot);
7
+ await assertReadableInside(root, path.join(root, "dist"));
8
+ const files = await runtimeFiles(path.join(root, "dist"));
9
+ const hook = path.resolve(root, "dist", "hook-cli.js");
10
+ if (!files.some(file => path.resolve(file) === hook))
11
+ throw new Error("Linger runtime is missing dist/hook-cli.js");
12
+ const hash = createHash("sha256").update(root).update("\0").update(path.resolve(node));
13
+ for (const file of files) {
14
+ await assertReadableInside(root, file);
15
+ hash.update("\0").update(path.relative(root, file)).update("\0").update(await readFile(file));
16
+ }
17
+ return hash.digest("hex");
18
+ }
19
+ async function runtimeFiles(dir) {
20
+ const entries = await readdir(dir, { withFileTypes: true });
21
+ const files = [];
22
+ for (const entry of entries) {
23
+ const target = path.join(dir, entry.name);
24
+ if (entry.isDirectory())
25
+ files.push(...await runtimeFiles(target));
26
+ else if (entry.isFile())
27
+ files.push(target);
28
+ }
29
+ return files.sort();
30
+ }
31
+ //# sourceMappingURL=runtime-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-identity.js","sourceRoot":"","sources":["../src/runtime-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,WAAmB,EAAE,IAAY;IACxE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IACvD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IACpH,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACvF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,GAAW;IACrC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,KAAK,CAAC,WAAW,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;aAC9D,IAAI,KAAK,CAAC,MAAM,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface RuntimeInstall {
2
+ root: string;
3
+ version: string;
4
+ files: string[];
5
+ }
6
+ export declare function installRuntime(home: string, packageRoot: string): Promise<RuntimeInstall>;
7
+ export declare function uninstallRuntime(home: string, runtimeRoot: string): Promise<boolean>;