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,43 @@
|
|
|
1
|
+
import { cp, mkdir, readFile, rm, stat, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { assertSafeId } from "./paths.js";
|
|
4
|
+
export async function installRuntime(home, packageRoot) {
|
|
5
|
+
const packageJson = JSON.parse(await readFile(path.join(packageRoot, "package.json"), "utf8"));
|
|
6
|
+
if (!packageJson || typeof packageJson !== "object" || Array.isArray(packageJson) || typeof packageJson.version !== "string")
|
|
7
|
+
throw new Error("Invalid package version");
|
|
8
|
+
const version = assertSafeId(packageJson.version, "package version");
|
|
9
|
+
const sourceDist = path.join(packageRoot, "dist");
|
|
10
|
+
await stat(path.join(sourceDist, "hook-cli.js"));
|
|
11
|
+
const root = path.join(home, ".linger", "runtime", version);
|
|
12
|
+
const managed = path.join(root, ".linger-managed");
|
|
13
|
+
if (await exists(root)) {
|
|
14
|
+
if (!await exists(managed))
|
|
15
|
+
throw new Error(`Refusing to replace unmanaged runtime: ${root}`);
|
|
16
|
+
await rm(root, { recursive: true, force: true });
|
|
17
|
+
}
|
|
18
|
+
await mkdir(root, { recursive: true, mode: 0o700 });
|
|
19
|
+
await cp(sourceDist, path.join(root, "dist"), { recursive: true });
|
|
20
|
+
await writeFile(managed, "managed by linger-skill\n", { mode: 0o600 });
|
|
21
|
+
return { root, version, files: [path.join(root, "dist"), managed] };
|
|
22
|
+
}
|
|
23
|
+
export async function uninstallRuntime(home, runtimeRoot) {
|
|
24
|
+
const allowed = path.join(home, ".linger", "runtime");
|
|
25
|
+
if (path.resolve(path.dirname(runtimeRoot)) !== path.resolve(allowed))
|
|
26
|
+
throw new Error("Refusing to remove runtime outside managed root");
|
|
27
|
+
assertSafeId(path.basename(runtimeRoot), "runtime version");
|
|
28
|
+
const relative = path.relative(path.resolve(allowed), path.resolve(runtimeRoot));
|
|
29
|
+
if (!relative || relative.startsWith("..") || path.isAbsolute(relative))
|
|
30
|
+
throw new Error("Refusing to remove runtime outside managed root");
|
|
31
|
+
if (!await exists(path.join(runtimeRoot, ".linger-managed")))
|
|
32
|
+
return false;
|
|
33
|
+
await rm(runtimeRoot, { recursive: true, force: true });
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
async function exists(file) { try {
|
|
37
|
+
await stat(file);
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return false;
|
|
42
|
+
} }
|
|
43
|
+
//# sourceMappingURL=runtime-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-installer.js","sourceRoot":"","sources":["../src/runtime-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { PendingCapture } from "./pending.js";
|
|
2
|
+
import type { DecisionEvent, DecisionView } from "./decisions.js";
|
|
3
|
+
import type { TagRegistry } from "./tag-registry.js";
|
|
4
|
+
import type { MemoryControlEvent } from "./memory-events.js";
|
|
5
|
+
import type { TermRelation } from "./term-graph.js";
|
|
6
|
+
import type { ProjectRecord, VaultConfig } from "./vault.js";
|
|
7
|
+
import type { ProcessedMemory, QueueItem, RawEvent } from "./types.js";
|
|
8
|
+
export declare function assertRawEvent(value: unknown): asserts value is RawEvent;
|
|
9
|
+
export declare function assertProcessedMemory(value: unknown): asserts value is ProcessedMemory;
|
|
10
|
+
export declare function assertQueueItem(value: unknown): asserts value is QueueItem;
|
|
11
|
+
export declare function assertPendingCapture(value: unknown): asserts value is PendingCapture;
|
|
12
|
+
export declare function assertDecisionEvent(value: unknown): asserts value is DecisionEvent;
|
|
13
|
+
export declare function assertDecisionView(value: unknown): asserts value is DecisionView;
|
|
14
|
+
export declare function assertTagRegistry(value: unknown): asserts value is TagRegistry;
|
|
15
|
+
export declare function assertMemoryControlEvent(value: unknown): asserts value is MemoryControlEvent;
|
|
16
|
+
export declare function assertTermRelation(value: unknown): asserts value is TermRelation;
|
|
17
|
+
export declare function assertProjectRecord(value: unknown): asserts value is ProjectRecord;
|
|
18
|
+
export declare function assertVaultConfig(value: unknown): asserts value is VaultConfig;
|
|
19
|
+
export declare function assertSequenceState(value: unknown): asserts value is {
|
|
20
|
+
schema_version?: 1;
|
|
21
|
+
value: number;
|
|
22
|
+
};
|
|
23
|
+
export declare function assertProcessingRunHistory(value: unknown): asserts value is {
|
|
24
|
+
schema_version?: 1;
|
|
25
|
+
runs: string[];
|
|
26
|
+
};
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { assertSafeId } from "./paths.js";
|
|
2
|
+
const ROLES = new Set(["user", "assistant", "system"]);
|
|
3
|
+
const SAVEPOINTS = new Set(["pending", "complete", "partial"]);
|
|
4
|
+
const SENSITIVITIES = new Set(["normal", "sensitive", "secret"]);
|
|
5
|
+
const MEMORY_TYPES = new Set(["conversation", "idea", "preference", "proposal", "rationale", "constraint", "rejection", "decision", "current_state", "todo", "correction"]);
|
|
6
|
+
const MEMORY_SOURCES = new Set(["user_explicit", "agent_inferred"]);
|
|
7
|
+
const MEMORY_STATUSES = new Set(["active", "revoked", "superseded"]);
|
|
8
|
+
const QUEUE_PRIORITIES = new Set(["normal", "explicit"]);
|
|
9
|
+
const QUEUE_STATUSES = new Set(["pending", "processing", "failed", "done"]);
|
|
10
|
+
const DECISION_KINDS = new Set(["idea", "preference", "proposal", "rationale", "constraint", "rejection", "decision", "current_state", "todo", "correction"]);
|
|
11
|
+
const DECISION_STATUSES = new Set(["proposed", "accepted", "rejected", "superseded", "reopened", "current", "unknown"]);
|
|
12
|
+
const DECISION_SOURCES = new Set(["user_explicit", "agent_inferred"]);
|
|
13
|
+
const MEMORY_CONTROL_KINDS = new Set(["forget", "correct", "delete"]);
|
|
14
|
+
const TERM_RELATION_TYPES = new Set(["synonym", "alias", "abbreviation", "related", "contextual_equivalent", "location_mapping", "product_name", "ambiguous"]);
|
|
15
|
+
export function assertRawEvent(value) {
|
|
16
|
+
const item = record(value, "raw event");
|
|
17
|
+
schemaOne(item, "raw event");
|
|
18
|
+
strings(item, ["event_id", "session_id", "project_id", "turn_id", "timestamp", "source_agent", "content", "content_hash", "raw_ref"], "raw event");
|
|
19
|
+
safeIds(item, ["event_id", "session_id", "project_id", "turn_id"], "raw event");
|
|
20
|
+
isoTimestamp(item.timestamp, "raw event timestamp");
|
|
21
|
+
if (!Number.isInteger(item.seq_id) || Number(item.seq_id) < 1)
|
|
22
|
+
invalid("raw event seq_id");
|
|
23
|
+
enumeration(item.role, ROLES, "raw event role");
|
|
24
|
+
enumeration(item.savepoint_status, SAVEPOINTS, "raw event savepoint_status");
|
|
25
|
+
enumeration(item.sensitivity, SENSITIVITIES, "raw event sensitivity");
|
|
26
|
+
if (item.capture_status !== "captured")
|
|
27
|
+
invalid("raw event capture_status");
|
|
28
|
+
}
|
|
29
|
+
export function assertProcessedMemory(value) {
|
|
30
|
+
const item = record(value, "processed memory");
|
|
31
|
+
schemaOne(item, "processed memory");
|
|
32
|
+
strings(item, ["id", "project_id", "title", "summary", "created_at", "updated_at", "agent"], "processed memory");
|
|
33
|
+
safeIds(item, ["id", "project_id"], "processed memory");
|
|
34
|
+
isoTimestamp(item.created_at, "processed memory created_at");
|
|
35
|
+
isoTimestamp(item.updated_at, "processed memory updated_at");
|
|
36
|
+
stringArrays(item, ["tags", "predictive_tags", "retrieval_phrases", "source_events", "supersedes", "superseded_by"], "processed memory");
|
|
37
|
+
enumeration(item.type, MEMORY_TYPES, "processed memory type");
|
|
38
|
+
enumeration(item.scope, new Set(["project", "global"]), "processed memory scope");
|
|
39
|
+
enumeration(item.source_savepoint_status, SAVEPOINTS, "processed memory source_savepoint_status");
|
|
40
|
+
enumeration(item.source, MEMORY_SOURCES, "processed memory source");
|
|
41
|
+
enumeration(item.status, MEMORY_STATUSES, "processed memory status");
|
|
42
|
+
enumeration(item.sensitivity, new Set(["normal", "sensitive"]), "processed memory sensitivity");
|
|
43
|
+
if (typeof item.confidence !== "number" || item.confidence < 0 || item.confidence > 1)
|
|
44
|
+
invalid("processed memory confidence");
|
|
45
|
+
if (item.source_hash !== undefined && typeof item.source_hash !== "string")
|
|
46
|
+
invalid("processed memory source_hash");
|
|
47
|
+
}
|
|
48
|
+
export function assertQueueItem(value) {
|
|
49
|
+
const item = record(value, "queue item");
|
|
50
|
+
schemaOne(item, "queue item");
|
|
51
|
+
strings(item, ["task_id", "event_id", "project_id", "created_at", "updated_at"], "queue item");
|
|
52
|
+
safeIds(item, ["task_id", "event_id", "project_id"], "queue item");
|
|
53
|
+
isoTimestamp(item.created_at, "queue item created_at");
|
|
54
|
+
isoTimestamp(item.updated_at, "queue item updated_at");
|
|
55
|
+
enumeration(item.priority, QUEUE_PRIORITIES, "queue item priority");
|
|
56
|
+
enumeration(item.status, QUEUE_STATUSES, "queue item status");
|
|
57
|
+
if (!Number.isInteger(item.attempts) || Number(item.attempts) < 0)
|
|
58
|
+
invalid("queue item attempts");
|
|
59
|
+
if (item.error !== undefined && typeof item.error !== "string")
|
|
60
|
+
invalid("queue item error");
|
|
61
|
+
}
|
|
62
|
+
export function assertPendingCapture(value) {
|
|
63
|
+
const item = record(value, "pending capture");
|
|
64
|
+
schemaOne(item, "pending capture");
|
|
65
|
+
strings(item, ["pending_id", "raw_file", "queue_file", "created_at"], "pending capture");
|
|
66
|
+
safeIds(item, ["pending_id"], "pending capture");
|
|
67
|
+
isoTimestamp(item.created_at, "pending capture created_at");
|
|
68
|
+
if (item.sequence_file !== undefined && typeof item.sequence_file !== "string")
|
|
69
|
+
invalid("pending capture sequence_file");
|
|
70
|
+
if (item.sequence_value !== undefined && (!Number.isInteger(item.sequence_value) || Number(item.sequence_value) < 0))
|
|
71
|
+
invalid("pending capture sequence_value");
|
|
72
|
+
assertRawEvent(item.event);
|
|
73
|
+
assertQueueItem(item.queue_item);
|
|
74
|
+
if (item.event.event_id !== item.queue_item.event_id || item.event.project_id !== item.queue_item.project_id)
|
|
75
|
+
invalid("pending capture event/queue identity");
|
|
76
|
+
}
|
|
77
|
+
export function assertDecisionEvent(value) {
|
|
78
|
+
const item = record(value, "decision event");
|
|
79
|
+
schemaOne(item, "decision event");
|
|
80
|
+
strings(item, ["event_id", "canonical_id", "project_id", "topic", "statement", "timestamp"], "decision event");
|
|
81
|
+
safeIds(item, ["event_id", "canonical_id", "project_id"], "decision event");
|
|
82
|
+
isoTimestamp(item.timestamp, "decision event timestamp");
|
|
83
|
+
stringArrays(item, ["aliases", "evidence_refs", "supersedes"], "decision event");
|
|
84
|
+
enumeration(item.kind, DECISION_KINDS, "decision event kind");
|
|
85
|
+
enumeration(item.status, DECISION_STATUSES, "decision event status");
|
|
86
|
+
enumeration(item.source, DECISION_SOURCES, "decision event source");
|
|
87
|
+
if (typeof item.confidence !== "number" || item.confidence < 0 || item.confidence > 1)
|
|
88
|
+
invalid("decision event confidence");
|
|
89
|
+
if (item.rationale !== undefined && typeof item.rationale !== "string")
|
|
90
|
+
invalid("decision event rationale");
|
|
91
|
+
}
|
|
92
|
+
export function assertDecisionView(value) {
|
|
93
|
+
const item = record(value, "decision view");
|
|
94
|
+
schemaOne(item, "decision view");
|
|
95
|
+
strings(item, ["canonical_id", "project_id", "topic", "updated_at"], "decision view");
|
|
96
|
+
safeIds(item, ["canonical_id", "project_id"], "decision view");
|
|
97
|
+
isoTimestamp(item.updated_at, "decision view updated_at");
|
|
98
|
+
stringArrays(item, ["aliases", "event_ids", "source_events", "conflicts"], "decision view");
|
|
99
|
+
enumeration(item.current_status, DECISION_STATUSES, "decision view current_status");
|
|
100
|
+
if (typeof item.confidence !== "number" || item.confidence < 0 || item.confidence > 1)
|
|
101
|
+
invalid("decision view confidence");
|
|
102
|
+
for (const field of ["current_event_id", "current_state"])
|
|
103
|
+
if (item[field] !== undefined && typeof item[field] !== "string")
|
|
104
|
+
invalid(`decision view ${field}`);
|
|
105
|
+
if (item.current_evidence_refs !== undefined && (!Array.isArray(item.current_evidence_refs) || !item.current_evidence_refs.every(value => typeof value === "string")))
|
|
106
|
+
invalid("decision view current_evidence_refs");
|
|
107
|
+
}
|
|
108
|
+
export function assertTagRegistry(value) {
|
|
109
|
+
const item = record(value, "tag registry");
|
|
110
|
+
schemaOne(item, "tag registry");
|
|
111
|
+
strings(item, ["project_id", "generated_at"], "tag registry");
|
|
112
|
+
safeIds(item, ["project_id"], "tag registry");
|
|
113
|
+
isoTimestamp(item.generated_at, "tag registry generated_at");
|
|
114
|
+
stringArrays(item, ["skipped_files"], "tag registry");
|
|
115
|
+
if (!Array.isArray(item.entries))
|
|
116
|
+
invalid("tag registry entries");
|
|
117
|
+
for (const value of item.entries) {
|
|
118
|
+
const entry = record(value, "tag registry entry");
|
|
119
|
+
strings(entry, ["raw_tag", "normalized_tag", "created_at", "last_used"], "tag registry entry");
|
|
120
|
+
isoTimestamp(entry.created_at, "tag registry entry created_at");
|
|
121
|
+
isoTimestamp(entry.last_used, "tag registry entry last_used");
|
|
122
|
+
stringArrays(entry, ["aliases", "related_terms", "examples"], "tag registry entry");
|
|
123
|
+
if (!Number.isInteger(entry.usage_count) || Number(entry.usage_count) < 0)
|
|
124
|
+
invalid("tag registry entry usage_count");
|
|
125
|
+
if (typeof entry.confidence !== "number" || entry.confidence < 0 || entry.confidence > 1)
|
|
126
|
+
invalid("tag registry entry confidence");
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
export function assertMemoryControlEvent(value) {
|
|
130
|
+
const item = record(value, "memory control event");
|
|
131
|
+
schemaOne(item, "memory control event");
|
|
132
|
+
strings(item, ["event_id", "project_id", "target_memory_id", "timestamp"], "memory control event");
|
|
133
|
+
safeIds(item, ["event_id", "project_id", "target_memory_id"], "memory control event");
|
|
134
|
+
isoTimestamp(item.timestamp, "memory control event timestamp");
|
|
135
|
+
stringArrays(item, ["evidence_refs"], "memory control event");
|
|
136
|
+
enumeration(item.kind, MEMORY_CONTROL_KINDS, "memory control event kind");
|
|
137
|
+
for (const field of ["replacement_memory_id", "reason"])
|
|
138
|
+
if (item[field] !== undefined && typeof item[field] !== "string")
|
|
139
|
+
invalid(`memory control event ${field}`);
|
|
140
|
+
if (item.kind === "correct" && typeof item.replacement_memory_id !== "string")
|
|
141
|
+
invalid("memory control event replacement_memory_id");
|
|
142
|
+
}
|
|
143
|
+
export function assertTermRelation(value) {
|
|
144
|
+
const item = record(value, "term relation");
|
|
145
|
+
schemaOne(item, "term relation");
|
|
146
|
+
strings(item, ["relation_id", "project_id", "term_a", "term_b", "created_at", "last_verified"], "term relation");
|
|
147
|
+
safeIds(item, ["relation_id", "project_id"], "term relation");
|
|
148
|
+
isoTimestamp(item.created_at, "term relation created_at");
|
|
149
|
+
isoTimestamp(item.last_verified, "term relation last_verified");
|
|
150
|
+
stringArrays(item, ["context_tags", "evidence_refs"], "term relation");
|
|
151
|
+
enumeration(item.relation_type, TERM_RELATION_TYPES, "term relation type");
|
|
152
|
+
if (typeof item.confidence !== "number" || item.confidence < 0 || item.confidence > 1)
|
|
153
|
+
invalid("term relation confidence");
|
|
154
|
+
}
|
|
155
|
+
export function assertProjectRecord(value) {
|
|
156
|
+
const item = record(value, "project record");
|
|
157
|
+
schemaOne(item, "project record");
|
|
158
|
+
strings(item, ["project_id", "display_name", "root_path", "created_at", "last_seen"], "project record");
|
|
159
|
+
safeIds(item, ["project_id"], "project record");
|
|
160
|
+
isoTimestamp(item.created_at, "project record created_at");
|
|
161
|
+
isoTimestamp(item.last_seen, "project record last_seen");
|
|
162
|
+
enumeration(item.identity_source, new Set(["git_remote_root", "git_root", "absolute_path"]), "project record identity_source");
|
|
163
|
+
}
|
|
164
|
+
export function assertVaultConfig(value) {
|
|
165
|
+
const item = record(value, "vault config");
|
|
166
|
+
schemaOne(item, "vault config");
|
|
167
|
+
for (const field of ["paused", "project_only_recall", "sensitive_exclusion"])
|
|
168
|
+
if (typeof item[field] !== "boolean")
|
|
169
|
+
invalid(`vault config ${field}`);
|
|
170
|
+
for (const field of ["max_snippets", "max_characters", "max_files", "max_raw_fragment_characters"])
|
|
171
|
+
positiveInteger(item[field], `vault config ${field}`);
|
|
172
|
+
if (!Number.isInteger(item.search_timeout_ms) || Number(item.search_timeout_ms) < 0)
|
|
173
|
+
invalid("vault config search_timeout_ms");
|
|
174
|
+
isoTimestamp(item.created_at, "vault config created_at");
|
|
175
|
+
}
|
|
176
|
+
export function assertSequenceState(value) {
|
|
177
|
+
const item = record(value, "sequence state");
|
|
178
|
+
optionalSchemaOne(item, "sequence state");
|
|
179
|
+
if (!Number.isInteger(item.value) || Number(item.value) < 0)
|
|
180
|
+
invalid("sequence state value");
|
|
181
|
+
}
|
|
182
|
+
export function assertProcessingRunHistory(value) {
|
|
183
|
+
const item = record(value, "processing run history");
|
|
184
|
+
optionalSchemaOne(item, "processing run history");
|
|
185
|
+
if (!Array.isArray(item.runs))
|
|
186
|
+
invalid("processing run history runs");
|
|
187
|
+
for (const value of item.runs)
|
|
188
|
+
isoTimestamp(value, "processing run history timestamp");
|
|
189
|
+
}
|
|
190
|
+
function record(value, label) {
|
|
191
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
192
|
+
invalid(label);
|
|
193
|
+
return value;
|
|
194
|
+
}
|
|
195
|
+
function schemaOne(item, label) { if (item.schema_version !== 1)
|
|
196
|
+
invalid(`${label} schema_version`); }
|
|
197
|
+
function optionalSchemaOne(item, label) { if (item.schema_version !== undefined && item.schema_version !== 1)
|
|
198
|
+
invalid(`${label} schema_version`); }
|
|
199
|
+
function strings(item, fields, label) { for (const field of fields)
|
|
200
|
+
if (typeof item[field] !== "string" || !item[field].length)
|
|
201
|
+
invalid(`${label} ${field}`); }
|
|
202
|
+
function stringArrays(item, fields, label) { for (const field of fields)
|
|
203
|
+
if (!Array.isArray(item[field]) || !item[field].every(value => typeof value === "string"))
|
|
204
|
+
invalid(`${label} ${field}`); }
|
|
205
|
+
function safeIds(item, fields, label) { for (const field of fields) {
|
|
206
|
+
try {
|
|
207
|
+
assertSafeId(item[field], `${label} ${field}`);
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
invalid(`${label} ${field}`);
|
|
211
|
+
}
|
|
212
|
+
} }
|
|
213
|
+
function isoTimestamp(value, label) {
|
|
214
|
+
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)))
|
|
215
|
+
invalid(label);
|
|
216
|
+
}
|
|
217
|
+
function positiveInteger(value, label) { if (!Number.isInteger(value) || Number(value) < 1)
|
|
218
|
+
invalid(label); }
|
|
219
|
+
function enumeration(value, allowed, label) { if (typeof value !== "string" || !allowed.has(value))
|
|
220
|
+
invalid(label); }
|
|
221
|
+
function invalid(label) { throw new Error(`Invalid ${label}`); }
|
|
222
|
+
//# sourceMappingURL=schema-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validation.js","sourceRoot":"","sources":["../src/schema-validation.ts"],"names":[],"mappings":"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"}
|
package/dist/search.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { SearchHit } from "./types.js";
|
|
2
|
+
export interface SearchOptions {
|
|
3
|
+
projectId: string;
|
|
4
|
+
query: string;
|
|
5
|
+
includeSensitive?: boolean;
|
|
6
|
+
includeRaw?: boolean;
|
|
7
|
+
limit?: number;
|
|
8
|
+
contextTags?: string[];
|
|
9
|
+
from?: string;
|
|
10
|
+
to?: string;
|
|
11
|
+
maxFiles?: number;
|
|
12
|
+
maxRawFragmentCharacters?: number;
|
|
13
|
+
timeoutMs?: number;
|
|
14
|
+
}
|
|
15
|
+
export declare function search(root: string, options: SearchOptions): Promise<SearchHit[]>;
|
|
16
|
+
export declare function tokenize(text: string): string[];
|
package/dist/search.js
ADDED
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { readJson } from "./io.js";
|
|
4
|
+
import { effectiveMemoryStates } from "./memory-events.js";
|
|
5
|
+
import { applyEnrichment, readEnrichmentOverlays } from "./enrichment.js";
|
|
6
|
+
import { assertSafeId, vaultPaths } from "./paths.js";
|
|
7
|
+
import { expandTerms } from "./term-graph.js";
|
|
8
|
+
import { assertProcessedMemory, assertRawEvent } from "./schema-validation.js";
|
|
9
|
+
import { assertProcessedRecordPath, assertRawRecordPath } from "./record-paths.js";
|
|
10
|
+
import { initVault, listJsonFiles } from "./vault.js";
|
|
11
|
+
const QUERY_STOP = new Set(["a", "an", "did", "do", "does", "for", "is", "of", "our", "the", "to", "was", "we", "were", "what", "which", "why", "我们", "们讨", "讨论", "论过", "之前", "前为", "为什么", "什么", "么没", "没有", "最后", "后定", "定了", "了什", "吗"]);
|
|
12
|
+
export async function search(root, options) {
|
|
13
|
+
const project = assertSafeId(options.projectId, "project id");
|
|
14
|
+
const config = await initVault(root);
|
|
15
|
+
const timeoutMs = nonNegativeInteger(options.timeoutMs ?? config.search_timeout_ms ?? 2000, "timeoutMs");
|
|
16
|
+
const deadline = Date.now() + timeoutMs;
|
|
17
|
+
assertBeforeDeadline(deadline);
|
|
18
|
+
const p = vaultPaths(root);
|
|
19
|
+
const from = dateBoundary(options.from, "from");
|
|
20
|
+
const to = dateBoundary(options.to, "to");
|
|
21
|
+
if (from !== undefined && to !== undefined && from > to)
|
|
22
|
+
throw new Error("from must not be after to");
|
|
23
|
+
const maxFiles = positiveInteger(options.maxFiles ?? config.max_files ?? 5000, "maxFiles");
|
|
24
|
+
const maxRawFragmentCharacters = positiveInteger(options.maxRawFragmentCharacters ?? config.max_raw_fragment_characters ?? 500, "maxRawFragmentCharacters");
|
|
25
|
+
const originalTokens = tokenize(options.query).filter(token => !QUERY_STOP.has(token));
|
|
26
|
+
if (!originalTokens.length)
|
|
27
|
+
return [];
|
|
28
|
+
const expansions = await within(expandTerms(root, project, lexicalTerms(options.query), options.contextTags), deadline);
|
|
29
|
+
const weights = new Map(originalTokens.map(token => [token, 1]));
|
|
30
|
+
for (const [term, confidence] of expansions)
|
|
31
|
+
for (const token of tokenize(term))
|
|
32
|
+
weights.set(token, Math.max(weights.get(token) ?? 0, confidence * 0.75));
|
|
33
|
+
const searchTokens = [...weights.keys()];
|
|
34
|
+
const files = (await within(listJsonFiles(path.join(p.processed, project), p.root), deadline)).slice(0, maxFiles);
|
|
35
|
+
const baselineMemories = (await within(Promise.all(files.map(async (file) => {
|
|
36
|
+
try {
|
|
37
|
+
const value = await readJson(file);
|
|
38
|
+
assertProcessedMemory(value);
|
|
39
|
+
assertProcessedRecordPath(p, file, value);
|
|
40
|
+
return value;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
})), deadline)).filter((memory) => Boolean(memory));
|
|
46
|
+
const overlays = await within(readEnrichmentOverlays(root, project), deadline);
|
|
47
|
+
const memories = baselineMemories.map(memory => applyEnrichment(memory, overlays.get(memory.id)));
|
|
48
|
+
const rawFiles = (await within(listJsonFiles(path.join(p.raw, project), p.root), deadline)).slice(0, maxFiles);
|
|
49
|
+
const rawEvents = (await within(Promise.all(rawFiles.map(async (file) => {
|
|
50
|
+
try {
|
|
51
|
+
const value = await readJson(file);
|
|
52
|
+
assertRawEvent(value);
|
|
53
|
+
assertRawRecordPath(p, file, value);
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
})), deadline)).filter((event) => Boolean(event));
|
|
60
|
+
const rawHashes = new Map(rawEvents.map(event => [event.event_id, { declared: event.content_hash, computed: createHash("sha256").update(event.content).digest("hex") }]));
|
|
61
|
+
const integrity = new Map(memories.map(memory => [memory.id, sourceIntegrity(memory, rawHashes)]));
|
|
62
|
+
const controlStates = await within(effectiveMemoryStates(root, project), deadline);
|
|
63
|
+
const active = memories.filter(memory => memory.status === "active" && !controlStates.has(memory.id) && integrity.get(memory.id) !== "tampered" && inRange(memory.created_at, from, to) && (options.includeSensitive || memory.sensitivity === "normal"));
|
|
64
|
+
const documentFrequency = new Map();
|
|
65
|
+
for (const token of searchTokens) {
|
|
66
|
+
assertBeforeDeadline(deadline);
|
|
67
|
+
documentFrequency.set(token, active.filter(memory => tokenize(searchable(memory)).includes(token)).length);
|
|
68
|
+
}
|
|
69
|
+
const hits = [];
|
|
70
|
+
const explicitPriority = new Map();
|
|
71
|
+
for (const memory of active) {
|
|
72
|
+
assertBeforeDeadline(deadline);
|
|
73
|
+
const hit = scoreMemory(memory, originalTokens, searchTokens, weights, documentFrequency, active.length, expansions.size > 0, integrity.get(memory.id) === "verified" ? "verified" : "unverified");
|
|
74
|
+
if (hit.score > 0) {
|
|
75
|
+
hits.push(hit);
|
|
76
|
+
explicitPriority.set(hit.source, memory.source === "user_explicit" ? 1 : 0);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (options.includeRaw) {
|
|
80
|
+
for (const event of rawEvents) {
|
|
81
|
+
assertBeforeDeadline(deadline);
|
|
82
|
+
if (!inRange(event.timestamp, from, to))
|
|
83
|
+
continue;
|
|
84
|
+
if (event.sensitivity !== "normal" && !options.includeSensitive)
|
|
85
|
+
continue;
|
|
86
|
+
const eventTokens = tokenize(event.content);
|
|
87
|
+
const overlap = searchTokens.filter(token => eventTokens.includes(token)).length;
|
|
88
|
+
if (overlap)
|
|
89
|
+
hits.push({ match_type: "unprocessed_raw", confidence: Math.min(0.6, overlap / searchTokens.length) * (event.savepoint_status === "partial" ? 0.6 : 1), score: overlap, source: event.event_id, snippet: event.content.slice(0, maxRawFragmentCharacters), raw_ref: [event.raw_ref], warning_flags: ["unprocessed_raw", ...(event.savepoint_status === "partial" ? ["partial_source"] : [])], sensitivity_flags: event.sensitivity === "normal" ? [] : [event.sensitivity] });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return hits.sort((a, b) => matchRank(b.match_type) - matchRank(a.match_type) || (explicitPriority.get(b.source) ?? 0) - (explicitPriority.get(a.source) ?? 0) || b.score - a.score || b.confidence - a.confidence).slice(0, options.limit ?? config.max_snippets);
|
|
93
|
+
}
|
|
94
|
+
function matchRank(type) {
|
|
95
|
+
return type === "exact_record" ? 3 : type === "similar_record" ? 2 : type === "possible_match" ? 1 : 0;
|
|
96
|
+
}
|
|
97
|
+
async function within(promise, deadline) {
|
|
98
|
+
const remaining = deadline - Date.now();
|
|
99
|
+
if (remaining <= 0)
|
|
100
|
+
throw new Error("Search timed out");
|
|
101
|
+
let timer;
|
|
102
|
+
try {
|
|
103
|
+
return await Promise.race([
|
|
104
|
+
promise,
|
|
105
|
+
new Promise((_, reject) => { timer = setTimeout(() => reject(new Error("Search timed out")), remaining); })
|
|
106
|
+
]);
|
|
107
|
+
}
|
|
108
|
+
finally {
|
|
109
|
+
if (timer)
|
|
110
|
+
clearTimeout(timer);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
function assertBeforeDeadline(deadline) {
|
|
114
|
+
if (Date.now() >= deadline)
|
|
115
|
+
throw new Error("Search timed out");
|
|
116
|
+
}
|
|
117
|
+
function dateBoundary(value, label) {
|
|
118
|
+
if (value === undefined)
|
|
119
|
+
return undefined;
|
|
120
|
+
const parsed = Date.parse(value);
|
|
121
|
+
if (!Number.isFinite(parsed))
|
|
122
|
+
throw new Error(`${label} must be an ISO date or timestamp`);
|
|
123
|
+
return parsed;
|
|
124
|
+
}
|
|
125
|
+
function positiveInteger(value, label) {
|
|
126
|
+
if (!Number.isInteger(value) || value < 1)
|
|
127
|
+
throw new Error(`${label} must be a positive integer`);
|
|
128
|
+
return value;
|
|
129
|
+
}
|
|
130
|
+
function nonNegativeInteger(value, label) {
|
|
131
|
+
if (!Number.isInteger(value) || value < 0)
|
|
132
|
+
throw new Error(`${label} must be a non-negative integer`);
|
|
133
|
+
return value;
|
|
134
|
+
}
|
|
135
|
+
function inRange(timestamp, from, to) {
|
|
136
|
+
const value = Date.parse(timestamp);
|
|
137
|
+
return Number.isFinite(value) && (from === undefined || value >= from) && (to === undefined || value <= to);
|
|
138
|
+
}
|
|
139
|
+
function scoreMemory(memory, original, candidates, weights, df, total, expanded, integrity) {
|
|
140
|
+
const textTokens = tokenize(searchable(memory));
|
|
141
|
+
let score = 0;
|
|
142
|
+
let expansionHit = false;
|
|
143
|
+
for (const token of candidates) {
|
|
144
|
+
const tf = textTokens.filter(value => value === token).length;
|
|
145
|
+
if (!tf)
|
|
146
|
+
continue;
|
|
147
|
+
const idf = Math.log(1 + (total - (df.get(token) ?? 0) + 0.5) / ((df.get(token) ?? 0) + 0.5));
|
|
148
|
+
score += idf * ((tf * 2.2) / (tf + 1.2)) * (weights.get(token) ?? 1);
|
|
149
|
+
if (memory.tags.includes(token))
|
|
150
|
+
score += 2 * (weights.get(token) ?? 1);
|
|
151
|
+
if (!original.includes(token))
|
|
152
|
+
expansionHit = true;
|
|
153
|
+
}
|
|
154
|
+
const latinOriginal = original.filter(token => /^[a-z0-9]/.test(token));
|
|
155
|
+
const latinCoverage = latinOriginal.length ? latinOriginal.filter(token => textTokens.includes(token)).length / latinOriginal.length : 1;
|
|
156
|
+
if (latinCoverage < 0.5 && !expansionHit)
|
|
157
|
+
score = 0;
|
|
158
|
+
if (memory.source === "user_explicit")
|
|
159
|
+
score *= 1.35;
|
|
160
|
+
const coverage = original.filter(token => textTokens.includes(token)).length / original.length;
|
|
161
|
+
return {
|
|
162
|
+
match_type: coverage === 1 ? "exact_record" : coverage >= 0.5 ? "similar_record" : "possible_match",
|
|
163
|
+
confidence: Math.min(1, memory.confidence * (0.5 + coverage / 2) * (expansionHit && coverage === 0 ? 0.8 : 1) * (memory.source_savepoint_status === "partial" ? 0.6 : 1) * (integrity === "unverified" ? 0.75 : 1)),
|
|
164
|
+
score, source: memory.id, snippet: memory.summary.slice(0, 500), raw_ref: memory.source_events,
|
|
165
|
+
warning_flags: [...(expanded && expansionHit ? ["term_expansion"] : []), ...(memory.source_savepoint_status === "partial" ? ["partial_source"] : []), ...(integrity === "unverified" ? ["unverified_source"] : [])], sensitivity_flags: memory.sensitivity === "normal" ? [] : [memory.sensitivity]
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
function sourceIntegrity(memory, rawHashes) {
|
|
169
|
+
if (!memory.source_hash)
|
|
170
|
+
return "unverified";
|
|
171
|
+
const sources = memory.source_events.map(id => rawHashes.get(id)).filter((value) => Boolean(value));
|
|
172
|
+
if (!sources.length)
|
|
173
|
+
return "unverified";
|
|
174
|
+
return sources.some(source => source.declared === source.computed && source.computed === memory.source_hash) ? "verified" : "tampered";
|
|
175
|
+
}
|
|
176
|
+
function searchable(memory) { return [memory.title, memory.summary, ...memory.tags, ...memory.predictive_tags, ...memory.retrieval_phrases].join(" "); }
|
|
177
|
+
function lexicalTerms(text) { return [...new Set([...(text.toLowerCase().match(/[a-z0-9][a-z0-9_-]*/g) ?? []), ...(text.match(/[\p{Script=Han}]+/gu) ?? []).map(value => value.toLowerCase())])]; }
|
|
178
|
+
export function tokenize(text) {
|
|
179
|
+
const normalized = text.toLowerCase();
|
|
180
|
+
const latin = normalized.match(/[a-z0-9][a-z0-9_-]*/g) ?? [];
|
|
181
|
+
const chunks = normalized.match(/[\p{Script=Han}]+/gu) ?? [];
|
|
182
|
+
const cjk = [];
|
|
183
|
+
for (const chunk of chunks) {
|
|
184
|
+
if (chunk.length <= 2)
|
|
185
|
+
cjk.push(chunk);
|
|
186
|
+
else
|
|
187
|
+
for (let index = 0; index < chunk.length - 1; index += 1)
|
|
188
|
+
cjk.push(chunk.slice(index, index + 2));
|
|
189
|
+
}
|
|
190
|
+
return [...latin, ...cjk];
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const SECRET_PATTERNS = [
|
|
2
|
+
["private_key", /-----BEGIN (?:RSA |EC |OPENSSH |DSA )?PRIVATE KEY-----/i],
|
|
3
|
+
["credential_assignment", /\b(?:api[_-]?key|access[_-]?token|auth[_-]?token|password|passwd|secret)\b\s*[:=]\s*["']?[^\s"']{6,}/i],
|
|
4
|
+
["bearer_token", /\bBearer\s+[A-Za-z0-9._~+/=-]{12,}/i],
|
|
5
|
+
["jwt", /\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/],
|
|
6
|
+
["github_token", /\b(?:ghp|github_pat)_[A-Za-z0-9_]{20,}\b/],
|
|
7
|
+
["openai_key", /\bsk-[A-Za-z0-9_-]{20,}\b/]
|
|
8
|
+
];
|
|
9
|
+
const SENSITIVE_PATTERNS = [
|
|
10
|
+
["email", /\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/i],
|
|
11
|
+
["phone", /(?<!\d)(?:\+?86[- ]?)?1[3-9]\d{9}(?!\d)/],
|
|
12
|
+
["address_hint", /(?:住址|家庭地址|home address)\s*[::]/i]
|
|
13
|
+
];
|
|
14
|
+
export function classifySensitivity(content) {
|
|
15
|
+
const secrets = SECRET_PATTERNS.filter(([, pattern]) => pattern.test(content)).map(([name]) => name);
|
|
16
|
+
if (secrets.length)
|
|
17
|
+
return { level: "secret", detectors: secrets };
|
|
18
|
+
const sensitive = SENSITIVE_PATTERNS.filter(([, pattern]) => pattern.test(content)).map(([name]) => name);
|
|
19
|
+
return sensitive.length ? { level: "sensitive", detectors: sensitive } : { level: "normal", detectors: [] };
|
|
20
|
+
}
|
|
21
|
+
export function redactSecrets(content) {
|
|
22
|
+
let redacted = content;
|
|
23
|
+
for (const [name, pattern] of SECRET_PATTERNS)
|
|
24
|
+
redacted = redacted.replace(new RegExp(pattern.source, pattern.flags.includes("g") ? pattern.flags : `${pattern.flags}g`), `[REDACTED:${name}]`);
|
|
25
|
+
return redacted;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=sensitivity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sensitivity.js","sourceRoot":"","sources":["../src/sensitivity.ts"],"names":[],"mappings":"AAKA,MAAM,eAAe,GAA4B;IAC/C,CAAC,aAAa,EAAE,yDAAyD,CAAC;IAC1E,CAAC,uBAAuB,EAAE,uGAAuG,CAAC;IAClI,CAAC,cAAc,EAAE,qCAAqC,CAAC;IACvD,CAAC,KAAK,EAAE,gEAAgE,CAAC;IACzE,CAAC,cAAc,EAAE,0CAA0C,CAAC;IAC5D,CAAC,YAAY,EAAE,2BAA2B,CAAC;CAC5C,CAAC;AAEF,MAAM,kBAAkB,GAA4B;IAClD,CAAC,OAAO,EAAE,4CAA4C,CAAC;IACvD,CAAC,OAAO,EAAE,yCAAyC,CAAC;IACpD,CAAC,cAAc,EAAE,kCAAkC,CAAC;CACrD,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACrG,IAAI,OAAO,CAAC,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IACnE,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAC1G,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;AAC9G,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,IAAI,QAAQ,GAAG,OAAO,CAAC;IACvB,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,eAAe;QAAE,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,EAAE,aAAa,IAAI,GAAG,CAAC,CAAC;IAChM,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|