gnosys 4.0.0
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/LICENSE +21 -0
- package/README.md +1387 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +3753 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2267 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/archive.d.ts +95 -0
- package/dist/lib/archive.d.ts.map +1 -0
- package/dist/lib/archive.js +311 -0
- package/dist/lib/archive.js.map +1 -0
- package/dist/lib/ask.d.ts +77 -0
- package/dist/lib/ask.d.ts.map +1 -0
- package/dist/lib/ask.js +316 -0
- package/dist/lib/ask.js.map +1 -0
- package/dist/lib/audit.d.ts +47 -0
- package/dist/lib/audit.d.ts.map +1 -0
- package/dist/lib/audit.js +136 -0
- package/dist/lib/audit.js.map +1 -0
- package/dist/lib/bootstrap.d.ts +56 -0
- package/dist/lib/bootstrap.d.ts.map +1 -0
- package/dist/lib/bootstrap.js +163 -0
- package/dist/lib/bootstrap.js.map +1 -0
- package/dist/lib/config.d.ts +239 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +371 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/dashboard.d.ts +81 -0
- package/dist/lib/dashboard.d.ts.map +1 -0
- package/dist/lib/dashboard.js +314 -0
- package/dist/lib/dashboard.js.map +1 -0
- package/dist/lib/db.d.ts +182 -0
- package/dist/lib/db.d.ts.map +1 -0
- package/dist/lib/db.js +620 -0
- package/dist/lib/db.js.map +1 -0
- package/dist/lib/dbSearch.d.ts +65 -0
- package/dist/lib/dbSearch.d.ts.map +1 -0
- package/dist/lib/dbSearch.js +239 -0
- package/dist/lib/dbSearch.js.map +1 -0
- package/dist/lib/dbWrite.d.ts +56 -0
- package/dist/lib/dbWrite.d.ts.map +1 -0
- package/dist/lib/dbWrite.js +171 -0
- package/dist/lib/dbWrite.js.map +1 -0
- package/dist/lib/dream.d.ts +170 -0
- package/dist/lib/dream.d.ts.map +1 -0
- package/dist/lib/dream.js +706 -0
- package/dist/lib/dream.js.map +1 -0
- package/dist/lib/embeddings.d.ts +84 -0
- package/dist/lib/embeddings.d.ts.map +1 -0
- package/dist/lib/embeddings.js +226 -0
- package/dist/lib/embeddings.js.map +1 -0
- package/dist/lib/export.d.ts +92 -0
- package/dist/lib/export.d.ts.map +1 -0
- package/dist/lib/export.js +362 -0
- package/dist/lib/export.js.map +1 -0
- package/dist/lib/federated.d.ts +113 -0
- package/dist/lib/federated.d.ts.map +1 -0
- package/dist/lib/federated.js +346 -0
- package/dist/lib/federated.js.map +1 -0
- package/dist/lib/graph.d.ts +50 -0
- package/dist/lib/graph.d.ts.map +1 -0
- package/dist/lib/graph.js +118 -0
- package/dist/lib/graph.js.map +1 -0
- package/dist/lib/history.d.ts +39 -0
- package/dist/lib/history.d.ts.map +1 -0
- package/dist/lib/history.js +112 -0
- package/dist/lib/history.js.map +1 -0
- package/dist/lib/hybridSearch.d.ts +80 -0
- package/dist/lib/hybridSearch.d.ts.map +1 -0
- package/dist/lib/hybridSearch.js +296 -0
- package/dist/lib/hybridSearch.js.map +1 -0
- package/dist/lib/import.d.ts +52 -0
- package/dist/lib/import.d.ts.map +1 -0
- package/dist/lib/import.js +365 -0
- package/dist/lib/import.js.map +1 -0
- package/dist/lib/ingest.d.ts +51 -0
- package/dist/lib/ingest.d.ts.map +1 -0
- package/dist/lib/ingest.js +144 -0
- package/dist/lib/ingest.js.map +1 -0
- package/dist/lib/lensing.d.ts +35 -0
- package/dist/lib/lensing.d.ts.map +1 -0
- package/dist/lib/lensing.js +85 -0
- package/dist/lib/lensing.js.map +1 -0
- package/dist/lib/llm.d.ts +84 -0
- package/dist/lib/llm.d.ts.map +1 -0
- package/dist/lib/llm.js +386 -0
- package/dist/lib/llm.js.map +1 -0
- package/dist/lib/lock.d.ts +28 -0
- package/dist/lib/lock.d.ts.map +1 -0
- package/dist/lib/lock.js +145 -0
- package/dist/lib/lock.js.map +1 -0
- package/dist/lib/maintenance.d.ts +124 -0
- package/dist/lib/maintenance.d.ts.map +1 -0
- package/dist/lib/maintenance.js +587 -0
- package/dist/lib/maintenance.js.map +1 -0
- package/dist/lib/migrate.d.ts +19 -0
- package/dist/lib/migrate.d.ts.map +1 -0
- package/dist/lib/migrate.js +260 -0
- package/dist/lib/migrate.js.map +1 -0
- package/dist/lib/preferences.d.ts +49 -0
- package/dist/lib/preferences.d.ts.map +1 -0
- package/dist/lib/preferences.js +149 -0
- package/dist/lib/preferences.js.map +1 -0
- package/dist/lib/projectIdentity.d.ts +66 -0
- package/dist/lib/projectIdentity.d.ts.map +1 -0
- package/dist/lib/projectIdentity.js +148 -0
- package/dist/lib/projectIdentity.js.map +1 -0
- package/dist/lib/recall.d.ts +82 -0
- package/dist/lib/recall.d.ts.map +1 -0
- package/dist/lib/recall.js +289 -0
- package/dist/lib/recall.js.map +1 -0
- package/dist/lib/resolver.d.ts +116 -0
- package/dist/lib/resolver.d.ts.map +1 -0
- package/dist/lib/resolver.js +372 -0
- package/dist/lib/resolver.js.map +1 -0
- package/dist/lib/retry.d.ts +24 -0
- package/dist/lib/retry.d.ts.map +1 -0
- package/dist/lib/retry.js +60 -0
- package/dist/lib/retry.js.map +1 -0
- package/dist/lib/rulesGen.d.ts +51 -0
- package/dist/lib/rulesGen.d.ts.map +1 -0
- package/dist/lib/rulesGen.js +167 -0
- package/dist/lib/rulesGen.js.map +1 -0
- package/dist/lib/search.d.ts +51 -0
- package/dist/lib/search.d.ts.map +1 -0
- package/dist/lib/search.js +190 -0
- package/dist/lib/search.js.map +1 -0
- package/dist/lib/staticSearch.d.ts +70 -0
- package/dist/lib/staticSearch.d.ts.map +1 -0
- package/dist/lib/staticSearch.js +162 -0
- package/dist/lib/staticSearch.js.map +1 -0
- package/dist/lib/store.d.ts +79 -0
- package/dist/lib/store.d.ts.map +1 -0
- package/dist/lib/store.js +227 -0
- package/dist/lib/store.js.map +1 -0
- package/dist/lib/structuredIngest.d.ts +37 -0
- package/dist/lib/structuredIngest.d.ts.map +1 -0
- package/dist/lib/structuredIngest.js +208 -0
- package/dist/lib/structuredIngest.js.map +1 -0
- package/dist/lib/tags.d.ts +26 -0
- package/dist/lib/tags.d.ts.map +1 -0
- package/dist/lib/tags.js +109 -0
- package/dist/lib/tags.js.map +1 -0
- package/dist/lib/timeline.d.ts +34 -0
- package/dist/lib/timeline.d.ts.map +1 -0
- package/dist/lib/timeline.js +116 -0
- package/dist/lib/timeline.js.map +1 -0
- package/dist/lib/trace.d.ts +42 -0
- package/dist/lib/trace.d.ts.map +1 -0
- package/dist/lib/trace.js +338 -0
- package/dist/lib/trace.js.map +1 -0
- package/dist/lib/webIndex.d.ts +28 -0
- package/dist/lib/webIndex.d.ts.map +1 -0
- package/dist/lib/webIndex.js +208 -0
- package/dist/lib/webIndex.js.map +1 -0
- package/dist/lib/webIngest.d.ts +51 -0
- package/dist/lib/webIngest.d.ts.map +1 -0
- package/dist/lib/webIngest.js +533 -0
- package/dist/lib/webIngest.js.map +1 -0
- package/dist/lib/wikilinks.d.ts +63 -0
- package/dist/lib/wikilinks.d.ts.map +1 -0
- package/dist/lib/wikilinks.js +146 -0
- package/dist/lib/wikilinks.js.map +1 -0
- package/dist/sandbox/client.d.ts +82 -0
- package/dist/sandbox/client.d.ts.map +1 -0
- package/dist/sandbox/client.js +128 -0
- package/dist/sandbox/client.js.map +1 -0
- package/dist/sandbox/helper-template.d.ts +14 -0
- package/dist/sandbox/helper-template.d.ts.map +1 -0
- package/dist/sandbox/helper-template.js +285 -0
- package/dist/sandbox/helper-template.js.map +1 -0
- package/dist/sandbox/index.d.ts +10 -0
- package/dist/sandbox/index.d.ts.map +1 -0
- package/dist/sandbox/index.js +10 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/sandbox/manager.d.ts +40 -0
- package/dist/sandbox/manager.d.ts.map +1 -0
- package/dist/sandbox/manager.js +220 -0
- package/dist/sandbox/manager.js.map +1 -0
- package/dist/sandbox/server.d.ts +44 -0
- package/dist/sandbox/server.d.ts.map +1 -0
- package/dist/sandbox/server.js +661 -0
- package/dist/sandbox/server.js.map +1 -0
- package/package.json +103 -0
- package/prompts/synthesize.md +21 -0
package/dist/lib/lock.js
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Lock — File-level locking for concurrent write safety.
|
|
3
|
+
*
|
|
4
|
+
* Prevents multiple agents (or agent + maintenance) from corrupting
|
|
5
|
+
* active markdown files during simultaneous writes. Uses a simple
|
|
6
|
+
* .gnosys/.config/write.lock file with PID tracking.
|
|
7
|
+
*
|
|
8
|
+
* Design: advisory lock with timeout + stale lock detection.
|
|
9
|
+
*/
|
|
10
|
+
import fs from "fs";
|
|
11
|
+
import path from "path";
|
|
12
|
+
const LOCK_FILENAME = "write.lock";
|
|
13
|
+
const LOCK_TIMEOUT_MS = 30_000; // 30 seconds max wait
|
|
14
|
+
const LOCK_POLL_MS = 50; // Poll every 50ms
|
|
15
|
+
const LOCK_STALE_MS = 120_000; // Consider lock stale after 2 minutes
|
|
16
|
+
/**
|
|
17
|
+
* Acquire a write lock for the given store path.
|
|
18
|
+
* Returns a release function that MUST be called when done.
|
|
19
|
+
*
|
|
20
|
+
* Usage:
|
|
21
|
+
* const release = await acquireWriteLock(storePath, "maintain");
|
|
22
|
+
* try {
|
|
23
|
+
* // ... do writes ...
|
|
24
|
+
* } finally {
|
|
25
|
+
* release();
|
|
26
|
+
* }
|
|
27
|
+
*/
|
|
28
|
+
export async function acquireWriteLock(storePath, operation = "write") {
|
|
29
|
+
const configDir = path.join(storePath, ".config");
|
|
30
|
+
const lockPath = path.join(configDir, LOCK_FILENAME);
|
|
31
|
+
// Ensure .config dir exists
|
|
32
|
+
try {
|
|
33
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// Already exists
|
|
37
|
+
}
|
|
38
|
+
const startTime = Date.now();
|
|
39
|
+
while (true) {
|
|
40
|
+
// Try to acquire the lock
|
|
41
|
+
try {
|
|
42
|
+
// Check for existing lock
|
|
43
|
+
const existing = readLock(lockPath);
|
|
44
|
+
if (existing) {
|
|
45
|
+
// Check if stale (PID dead or too old)
|
|
46
|
+
if (isLockStale(existing)) {
|
|
47
|
+
// Remove stale lock and retry
|
|
48
|
+
try {
|
|
49
|
+
fs.unlinkSync(lockPath);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Race condition — another process removed it
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// Lock is held by another process — wait
|
|
57
|
+
if (Date.now() - startTime > LOCK_TIMEOUT_MS) {
|
|
58
|
+
throw new Error(`Gnosys write lock timeout after ${LOCK_TIMEOUT_MS}ms. ` +
|
|
59
|
+
`Lock held by PID ${existing.pid} for operation "${existing.operation}". ` +
|
|
60
|
+
`If this is stale, delete ${lockPath}`);
|
|
61
|
+
}
|
|
62
|
+
await sleep(LOCK_POLL_MS);
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Write lock file atomically
|
|
67
|
+
const lockInfo = {
|
|
68
|
+
pid: process.pid,
|
|
69
|
+
timestamp: Date.now(),
|
|
70
|
+
operation,
|
|
71
|
+
};
|
|
72
|
+
// Use writeFileSync with exclusive flag for atomic creation
|
|
73
|
+
fs.writeFileSync(lockPath, JSON.stringify(lockInfo), { flag: "wx" });
|
|
74
|
+
// Lock acquired — return release function
|
|
75
|
+
return () => {
|
|
76
|
+
try {
|
|
77
|
+
fs.unlinkSync(lockPath);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Lock file already removed — that's fine
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
const error = err;
|
|
86
|
+
if (error.code === "EEXIST") {
|
|
87
|
+
// Another process created the lock between our check and write
|
|
88
|
+
if (Date.now() - startTime > LOCK_TIMEOUT_MS) {
|
|
89
|
+
throw new Error(`Gnosys write lock timeout after ${LOCK_TIMEOUT_MS}ms. ` +
|
|
90
|
+
`Delete ${lockPath} if lock is stale.`);
|
|
91
|
+
}
|
|
92
|
+
await sleep(LOCK_POLL_MS);
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
throw err;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Read the current lock info, or null if no lock exists.
|
|
101
|
+
*/
|
|
102
|
+
function readLock(lockPath) {
|
|
103
|
+
try {
|
|
104
|
+
const raw = fs.readFileSync(lockPath, "utf-8");
|
|
105
|
+
return JSON.parse(raw);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Check if a lock is stale (PID dead or too old).
|
|
113
|
+
*/
|
|
114
|
+
function isLockStale(lock) {
|
|
115
|
+
// Check if lock is too old
|
|
116
|
+
if (Date.now() - lock.timestamp > LOCK_STALE_MS) {
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
// Check if PID is still alive
|
|
120
|
+
try {
|
|
121
|
+
process.kill(lock.pid, 0); // Signal 0 = check if process exists
|
|
122
|
+
return false; // Process is alive
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return true; // Process is dead
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Enable WAL mode on a better-sqlite3 database instance.
|
|
130
|
+
* WAL (Write-Ahead Logging) allows concurrent reads during writes.
|
|
131
|
+
*/
|
|
132
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
133
|
+
export function enableWAL(db) {
|
|
134
|
+
try {
|
|
135
|
+
db.pragma("journal_mode = WAL");
|
|
136
|
+
db.pragma("busy_timeout = 5000"); // Wait up to 5s if DB is busy
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// WAL not supported or DB not available
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function sleep(ms) {
|
|
143
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/lib/lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Maintenance Engine — Keeps the vault clean and useful forever.
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Duplicate detection (semantic similarity + title overlap)
|
|
6
|
+
* - Stale marking (confidence decay based on days since last reinforced)
|
|
7
|
+
* - Reinforcement (increment counter when memories are used)
|
|
8
|
+
* - Auto-consolidation (LLM-powered merge of similar memories)
|
|
9
|
+
*
|
|
10
|
+
* All operations produce safe Git commits with rollback on failure.
|
|
11
|
+
*/
|
|
12
|
+
import { GnosysStore, Memory } from "./store.js";
|
|
13
|
+
import { GnosysConfig } from "./config.js";
|
|
14
|
+
import { GnosysResolver } from "./resolver.js";
|
|
15
|
+
export interface MaintenanceOptions {
|
|
16
|
+
/** Show what would change without modifying anything */
|
|
17
|
+
dryRun?: boolean;
|
|
18
|
+
/** Automatically apply all changes (no interactive prompts) */
|
|
19
|
+
autoApply?: boolean;
|
|
20
|
+
/** Progress callback */
|
|
21
|
+
onProgress?: (step: string, current: number, total: number) => void;
|
|
22
|
+
/** Log callback */
|
|
23
|
+
onLog?: (level: "info" | "warn" | "action", message: string) => void;
|
|
24
|
+
}
|
|
25
|
+
export interface DuplicatePair {
|
|
26
|
+
memoryA: Memory;
|
|
27
|
+
memoryB: Memory;
|
|
28
|
+
similarity: number;
|
|
29
|
+
titleOverlap: number;
|
|
30
|
+
}
|
|
31
|
+
export interface StaleMemory {
|
|
32
|
+
memory: Memory;
|
|
33
|
+
originalConfidence: number;
|
|
34
|
+
decayedConfidence: number;
|
|
35
|
+
daysSinceReinforced: number;
|
|
36
|
+
}
|
|
37
|
+
export interface MaintenanceReport {
|
|
38
|
+
/** Total memories scanned */
|
|
39
|
+
totalMemories: number;
|
|
40
|
+
/** Duplicate pairs detected */
|
|
41
|
+
duplicates: DuplicatePair[];
|
|
42
|
+
/** Memories with decayed confidence below threshold */
|
|
43
|
+
staleMemories: StaleMemory[];
|
|
44
|
+
/** Average confidence across all active memories */
|
|
45
|
+
avgConfidence: number;
|
|
46
|
+
/** Average decayed confidence */
|
|
47
|
+
avgDecayedConfidence: number;
|
|
48
|
+
/** Number of memories that were consolidated */
|
|
49
|
+
consolidated: number;
|
|
50
|
+
/** Number of memories with updated decay */
|
|
51
|
+
decayUpdated: number;
|
|
52
|
+
/** Number of memories archived in this run */
|
|
53
|
+
archived: number;
|
|
54
|
+
/** Total memories in archive after this run */
|
|
55
|
+
totalArchived: number;
|
|
56
|
+
/** Actions taken (or that would be taken in dry run) */
|
|
57
|
+
actions: string[];
|
|
58
|
+
}
|
|
59
|
+
export declare class GnosysMaintenanceEngine {
|
|
60
|
+
private resolver;
|
|
61
|
+
private config;
|
|
62
|
+
private embeddings;
|
|
63
|
+
private provider;
|
|
64
|
+
constructor(resolver: GnosysResolver, config?: GnosysConfig);
|
|
65
|
+
/**
|
|
66
|
+
* Run the full maintenance cycle.
|
|
67
|
+
*/
|
|
68
|
+
maintain(options?: MaintenanceOptions): Promise<MaintenanceReport>;
|
|
69
|
+
/**
|
|
70
|
+
* Find duplicate pairs using semantic similarity + title overlap.
|
|
71
|
+
*/
|
|
72
|
+
private detectDuplicates;
|
|
73
|
+
/**
|
|
74
|
+
* Calculate decayed confidence for all memories.
|
|
75
|
+
* Formula: decayed = base_confidence * e^(-lambda * days_since_reinforced)
|
|
76
|
+
*/
|
|
77
|
+
private calculateDecay;
|
|
78
|
+
/**
|
|
79
|
+
* Use LLM to merge two duplicate memories into one.
|
|
80
|
+
* Creates a new memory that supersedes both.
|
|
81
|
+
*/
|
|
82
|
+
private consolidatePair;
|
|
83
|
+
/**
|
|
84
|
+
* Update a stale memory's confidence to its decayed value.
|
|
85
|
+
*/
|
|
86
|
+
private updateDecayedConfidence;
|
|
87
|
+
/**
|
|
88
|
+
* Reinforce a memory — increment its usage counter and update last_reinforced.
|
|
89
|
+
* This is a lightweight operation called by search/ask/import.
|
|
90
|
+
*/
|
|
91
|
+
static reinforce(store: GnosysStore, relativePath: string): Promise<void>;
|
|
92
|
+
/**
|
|
93
|
+
* Batch reinforce multiple memories (e.g., all results from a search).
|
|
94
|
+
* Lightweight — just updates counters, no LLM calls.
|
|
95
|
+
*/
|
|
96
|
+
static reinforceBatch(store: GnosysStore, relativePaths: string[]): Promise<number>;
|
|
97
|
+
/**
|
|
98
|
+
* Archive old/low-confidence memories to archive.db.
|
|
99
|
+
*/
|
|
100
|
+
private archiveOldMemories;
|
|
101
|
+
/**
|
|
102
|
+
* Get a quick health snapshot (used by gnosys doctor).
|
|
103
|
+
* No LLM calls, no embeddings loading — just frontmatter analysis.
|
|
104
|
+
*/
|
|
105
|
+
getHealthReport(): Promise<{
|
|
106
|
+
totalActive: number;
|
|
107
|
+
totalArchived: number;
|
|
108
|
+
staleCount: number;
|
|
109
|
+
avgConfidence: number;
|
|
110
|
+
avgDecayedConfidence: number;
|
|
111
|
+
neverReinforced: number;
|
|
112
|
+
totalReinforcements: number;
|
|
113
|
+
archiveEligible: number;
|
|
114
|
+
}>;
|
|
115
|
+
/**
|
|
116
|
+
* Load all active (non-superseded, non-archived) memories from all stores.
|
|
117
|
+
*/
|
|
118
|
+
private loadAllActiveMemories;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Format a maintenance report as a human-readable string.
|
|
122
|
+
*/
|
|
123
|
+
export declare function formatMaintenanceReport(report: MaintenanceReport): string;
|
|
124
|
+
//# sourceMappingURL=maintenance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maintenance.d.ts","sourceRoot":"","sources":["../../src/lib/maintenance.ts"],"names":[],"mappings":"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"}
|