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
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Ask Engine — Freeform natural-language Q&A over the entire vault.
|
|
3
|
+
* Pipeline: hybridSearch → context assembly → LLM synthesis → cited answer.
|
|
4
|
+
*
|
|
5
|
+
* Supports streaming and "deep query" mode (auto follow-up on insufficient context).
|
|
6
|
+
* Uses the LLM abstraction layer — works with Anthropic, Ollama, or any future provider.
|
|
7
|
+
*/
|
|
8
|
+
import { GnosysHybridSearch } from "./hybridSearch.js";
|
|
9
|
+
import { GnosysConfig } from "./config.js";
|
|
10
|
+
import { GnosysResolver } from "./resolver.js";
|
|
11
|
+
export interface AskResult {
|
|
12
|
+
answer: string;
|
|
13
|
+
sources: {
|
|
14
|
+
relativePath: string;
|
|
15
|
+
title: string;
|
|
16
|
+
}[];
|
|
17
|
+
deepQueryUsed: boolean;
|
|
18
|
+
searchMode: string;
|
|
19
|
+
/** Memory IDs that were dearchived (moved from archive → active) during this query */
|
|
20
|
+
dearchivedIds: string[];
|
|
21
|
+
}
|
|
22
|
+
export interface AskStreamCallbacks {
|
|
23
|
+
onToken?: (token: string) => void;
|
|
24
|
+
onSearchComplete?: (count: number, mode: string) => void;
|
|
25
|
+
onDeepQuery?: (refinedQuery: string) => void;
|
|
26
|
+
onSourcesReady?: (sources: {
|
|
27
|
+
relativePath: string;
|
|
28
|
+
title: string;
|
|
29
|
+
}[]) => void;
|
|
30
|
+
}
|
|
31
|
+
export declare class GnosysAsk {
|
|
32
|
+
private provider;
|
|
33
|
+
private hybridSearch;
|
|
34
|
+
private config;
|
|
35
|
+
private promptTemplate;
|
|
36
|
+
private resolver;
|
|
37
|
+
private storePath;
|
|
38
|
+
constructor(hybridSearch: GnosysHybridSearch, config?: GnosysConfig, resolver?: GnosysResolver, storePath?: string);
|
|
39
|
+
get isLLMAvailable(): boolean;
|
|
40
|
+
get providerName(): string;
|
|
41
|
+
get modelName(): string;
|
|
42
|
+
/**
|
|
43
|
+
* Load the synthesis prompt template.
|
|
44
|
+
*/
|
|
45
|
+
private loadPromptTemplate;
|
|
46
|
+
/**
|
|
47
|
+
* Format retrieved memories as numbered context blocks.
|
|
48
|
+
*/
|
|
49
|
+
private formatContext;
|
|
50
|
+
/**
|
|
51
|
+
* Extract a refined search query from a partial answer that needs more info.
|
|
52
|
+
*/
|
|
53
|
+
private extractRefinedQuery;
|
|
54
|
+
/**
|
|
55
|
+
* Ask a question and get a synthesized answer with citations.
|
|
56
|
+
*/
|
|
57
|
+
ask(question: string, options?: {
|
|
58
|
+
limit?: number;
|
|
59
|
+
mode?: "keyword" | "semantic" | "hybrid";
|
|
60
|
+
stream?: boolean;
|
|
61
|
+
callbacks?: AskStreamCallbacks;
|
|
62
|
+
/** Additional context to prepend (e.g. from federated search) */
|
|
63
|
+
additionalContext?: string;
|
|
64
|
+
}): Promise<AskResult>;
|
|
65
|
+
/**
|
|
66
|
+
* Dearchive memories that were used in the synthesis.
|
|
67
|
+
* Uses deterministic fallback: if cited paths don't match archive results,
|
|
68
|
+
* falls back to title-matching from the answer text to ensure anything
|
|
69
|
+
* the answer actually references gets dearchived.
|
|
70
|
+
*/
|
|
71
|
+
private dearchiveUsedMemories;
|
|
72
|
+
/**
|
|
73
|
+
* Extract sources that were actually cited in the answer.
|
|
74
|
+
*/
|
|
75
|
+
private extractCitedSources;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=ask.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../../src/lib/ask.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,kBAAkB,EAAsB,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAkB,MAAM,aAAa,CAAC;AAI3D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAM/C,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACnD,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,sFAAsF;IACtF,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,KAAK,IAAI,CAAC;CAC/E;AAgBD,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,SAAS,CAAuB;gBAGtC,YAAY,EAAE,kBAAkB,EAChC,MAAM,CAAC,EAAE,YAAY,EACrB,QAAQ,CAAC,EAAE,cAAc,EACzB,SAAS,CAAC,EAAE,MAAM;IAgBpB,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;OAEG;YACW,kBAAkB;IAiChC;;OAEG;IACH,OAAO,CAAC,aAAa;IASrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;OAEG;IACG,GAAG,CACP,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;QACzC,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,SAAS,CAAC,EAAE,kBAAkB,CAAC;QAC/B,iEAAiE;QACjE,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,GACA,OAAO,CAAC,SAAS,CAAC;IAyIrB;;;;;OAKG;YACW,qBAAqB;IAiEnC;;OAEG;IACH,OAAO,CAAC,mBAAmB;CA2C5B"}
|
package/dist/lib/ask.js
ADDED
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Ask Engine — Freeform natural-language Q&A over the entire vault.
|
|
3
|
+
* Pipeline: hybridSearch → context assembly → LLM synthesis → cited answer.
|
|
4
|
+
*
|
|
5
|
+
* Supports streaming and "deep query" mode (auto follow-up on insufficient context).
|
|
6
|
+
* Uses the LLM abstraction layer — works with Anthropic, Ollama, or any future provider.
|
|
7
|
+
*/
|
|
8
|
+
import fs from "fs/promises";
|
|
9
|
+
import path from "path";
|
|
10
|
+
import { fileURLToPath } from "url";
|
|
11
|
+
import { DEFAULT_CONFIG } from "./config.js";
|
|
12
|
+
import { getLLMProvider } from "./llm.js";
|
|
13
|
+
import { GnosysArchive } from "./archive.js";
|
|
14
|
+
import { GnosysMaintenanceEngine } from "./maintenance.js";
|
|
15
|
+
import { auditLog } from "./audit.js";
|
|
16
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
17
|
+
const __dirname = path.dirname(__filename);
|
|
18
|
+
/**
|
|
19
|
+
* Phrases that trigger a deep query follow-up.
|
|
20
|
+
*/
|
|
21
|
+
const NEED_MORE_INFO_PHRASES = [
|
|
22
|
+
"i need more information",
|
|
23
|
+
"i don't have enough",
|
|
24
|
+
"insufficient information",
|
|
25
|
+
"not enough context",
|
|
26
|
+
"no relevant information",
|
|
27
|
+
"cannot find",
|
|
28
|
+
"none of the provided memories",
|
|
29
|
+
"the provided context does not",
|
|
30
|
+
];
|
|
31
|
+
export class GnosysAsk {
|
|
32
|
+
provider = null;
|
|
33
|
+
hybridSearch;
|
|
34
|
+
config;
|
|
35
|
+
promptTemplate = null;
|
|
36
|
+
resolver = null;
|
|
37
|
+
storePath = null;
|
|
38
|
+
constructor(hybridSearch, config, resolver, storePath) {
|
|
39
|
+
this.hybridSearch = hybridSearch;
|
|
40
|
+
this.config = config || DEFAULT_CONFIG;
|
|
41
|
+
this.resolver = resolver || null;
|
|
42
|
+
this.storePath = storePath || null;
|
|
43
|
+
// Initialize LLM provider via abstraction layer
|
|
44
|
+
try {
|
|
45
|
+
this.provider = getLLMProvider(this.config, "synthesis");
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Provider not available (e.g., no API key for Anthropic)
|
|
49
|
+
this.provider = null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
get isLLMAvailable() {
|
|
53
|
+
return this.provider !== null;
|
|
54
|
+
}
|
|
55
|
+
get providerName() {
|
|
56
|
+
return this.provider?.name || "none";
|
|
57
|
+
}
|
|
58
|
+
get modelName() {
|
|
59
|
+
return this.provider?.model || "none";
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Load the synthesis prompt template.
|
|
63
|
+
*/
|
|
64
|
+
async loadPromptTemplate() {
|
|
65
|
+
if (this.promptTemplate)
|
|
66
|
+
return this.promptTemplate;
|
|
67
|
+
// Try loading from the installed package prompts/ directory
|
|
68
|
+
const candidates = [
|
|
69
|
+
path.resolve(__dirname, "..", "..", "prompts", "synthesize.md"),
|
|
70
|
+
path.resolve(__dirname, "..", "prompts", "synthesize.md"),
|
|
71
|
+
path.resolve(process.cwd(), "prompts", "synthesize.md"),
|
|
72
|
+
];
|
|
73
|
+
for (const candidate of candidates) {
|
|
74
|
+
try {
|
|
75
|
+
this.promptTemplate = await fs.readFile(candidate, "utf-8");
|
|
76
|
+
return this.promptTemplate;
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// Try next
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Fallback inline prompt
|
|
83
|
+
this.promptTemplate = `You are Gnosys, a knowledge synthesis engine. Answer the question using ONLY the provided context memories. Cite every claim with Obsidian wikilinks [[filename.md]]. If the context is insufficient, say "I need more information to fully answer this question."
|
|
84
|
+
|
|
85
|
+
## Context Memories
|
|
86
|
+
|
|
87
|
+
{{CONTEXT}}
|
|
88
|
+
|
|
89
|
+
## Question
|
|
90
|
+
|
|
91
|
+
{{QUESTION}}`;
|
|
92
|
+
return this.promptTemplate;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Format retrieved memories as numbered context blocks.
|
|
96
|
+
*/
|
|
97
|
+
formatContext(results) {
|
|
98
|
+
return results
|
|
99
|
+
.map((r, i) => {
|
|
100
|
+
const content = r.fullContent || r.snippet;
|
|
101
|
+
return `### [${i + 1}] ${r.title}\n**File:** ${r.relativePath}\n**Score:** ${r.score.toFixed(4)}\n\n${content}`;
|
|
102
|
+
})
|
|
103
|
+
.join("\n\n---\n\n");
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Extract a refined search query from a partial answer that needs more info.
|
|
107
|
+
*/
|
|
108
|
+
extractRefinedQuery(question, _partialAnswer) {
|
|
109
|
+
// Take the original question but add "related" to broaden the search
|
|
110
|
+
return `${question} related details`;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Ask a question and get a synthesized answer with citations.
|
|
114
|
+
*/
|
|
115
|
+
async ask(question, options) {
|
|
116
|
+
if (!this.provider) {
|
|
117
|
+
const providerName = this.config.llm.defaultProvider;
|
|
118
|
+
throw new Error(providerName === "anthropic"
|
|
119
|
+
? "No ANTHROPIC_API_KEY set. gnosys_ask requires an LLM for synthesis. " +
|
|
120
|
+
"Set the ANTHROPIC_API_KEY environment variable or switch to Ollama: gnosys config set provider ollama"
|
|
121
|
+
: `LLM provider "${providerName}" is not available. Check your configuration.`);
|
|
122
|
+
}
|
|
123
|
+
const limit = options?.limit || 15;
|
|
124
|
+
const mode = options?.mode || "hybrid";
|
|
125
|
+
const callbacks = options?.callbacks;
|
|
126
|
+
// Step 1: Hybrid search for relevant memories
|
|
127
|
+
let results = await this.hybridSearch.hybridSearch(question, limit, mode);
|
|
128
|
+
callbacks?.onSearchComplete?.(results.length, mode);
|
|
129
|
+
if (results.length === 0) {
|
|
130
|
+
return {
|
|
131
|
+
answer: "No relevant memories found. Try importing some data first with `gnosys import` or creating memories with `gnosys add`.",
|
|
132
|
+
sources: [],
|
|
133
|
+
deepQueryUsed: false,
|
|
134
|
+
searchMode: mode,
|
|
135
|
+
dearchivedIds: [],
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
// Step 2: Load full content for top results
|
|
139
|
+
results = await this.hybridSearch.loadContent(results);
|
|
140
|
+
// Step 3: Build prompt
|
|
141
|
+
const template = await this.loadPromptTemplate();
|
|
142
|
+
let context = this.formatContext(results);
|
|
143
|
+
// Prepend federated/cross-scope context if provided
|
|
144
|
+
if (options?.additionalContext) {
|
|
145
|
+
context = `## Cross-Scope Context (Federated Search)\n${options.additionalContext}\n\n## Local Context\n${context}`;
|
|
146
|
+
}
|
|
147
|
+
const systemPrompt = template
|
|
148
|
+
.replace("{{CONTEXT}}", context)
|
|
149
|
+
.replace("{{QUESTION}}", question);
|
|
150
|
+
// Step 4: LLM synthesis via abstraction layer
|
|
151
|
+
let answer;
|
|
152
|
+
if (options?.stream && callbacks?.onToken) {
|
|
153
|
+
answer = await this.provider.generate(question, { system: systemPrompt, stream: true }, { onToken: callbacks.onToken });
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
answer = await this.provider.generate(question, { system: systemPrompt });
|
|
157
|
+
}
|
|
158
|
+
// Step 5: Check for deep query trigger
|
|
159
|
+
let deepQueryUsed = false;
|
|
160
|
+
const answerLower = answer.toLowerCase();
|
|
161
|
+
const needsMoreInfo = NEED_MORE_INFO_PHRASES.some((phrase) => answerLower.includes(phrase));
|
|
162
|
+
if (needsMoreInfo) {
|
|
163
|
+
const refinedQuery = this.extractRefinedQuery(question, answer);
|
|
164
|
+
callbacks?.onDeepQuery?.(refinedQuery);
|
|
165
|
+
// Run follow-up search
|
|
166
|
+
const moreResults = await this.hybridSearch.hybridSearch(refinedQuery, limit, mode);
|
|
167
|
+
if (moreResults.length > 0) {
|
|
168
|
+
// Merge with original results (dedup by path)
|
|
169
|
+
const existingPaths = new Set(results.map((r) => r.relativePath));
|
|
170
|
+
const newResults = moreResults.filter((r) => !existingPaths.has(r.relativePath));
|
|
171
|
+
if (newResults.length > 0) {
|
|
172
|
+
const enrichedNew = await this.hybridSearch.loadContent(newResults);
|
|
173
|
+
const allResults = [...results, ...enrichedNew];
|
|
174
|
+
// Re-synthesize with expanded context
|
|
175
|
+
const expandedContext = this.formatContext(allResults);
|
|
176
|
+
const expandedPrompt = template
|
|
177
|
+
.replace("{{CONTEXT}}", expandedContext)
|
|
178
|
+
.replace("{{QUESTION}}", question);
|
|
179
|
+
if (options?.stream && callbacks?.onToken) {
|
|
180
|
+
answer = await this.provider.generate(question, { system: expandedPrompt, stream: true }, { onToken: callbacks.onToken });
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
answer = await this.provider.generate(question, {
|
|
184
|
+
system: expandedPrompt,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
results = allResults;
|
|
188
|
+
deepQueryUsed = true;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Step 6: Extract sources from the answer (only cited files)
|
|
193
|
+
const sources = this.extractCitedSources(answer, results);
|
|
194
|
+
callbacks?.onSourcesReady?.(sources);
|
|
195
|
+
// Step 7: Auto-dearchive — move used archive memories back to active
|
|
196
|
+
const dearchivedIds = await this.dearchiveUsedMemories(results, sources);
|
|
197
|
+
// Audit log
|
|
198
|
+
auditLog({
|
|
199
|
+
operation: "ask",
|
|
200
|
+
query: question,
|
|
201
|
+
resultCount: sources.length,
|
|
202
|
+
details: {
|
|
203
|
+
deepQueryUsed,
|
|
204
|
+
dearchivedCount: dearchivedIds.length,
|
|
205
|
+
searchMode: mode,
|
|
206
|
+
},
|
|
207
|
+
});
|
|
208
|
+
return {
|
|
209
|
+
answer,
|
|
210
|
+
sources,
|
|
211
|
+
deepQueryUsed,
|
|
212
|
+
searchMode: mode,
|
|
213
|
+
dearchivedIds,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Dearchive memories that were used in the synthesis.
|
|
218
|
+
* Uses deterministic fallback: if cited paths don't match archive results,
|
|
219
|
+
* falls back to title-matching from the answer text to ensure anything
|
|
220
|
+
* the answer actually references gets dearchived.
|
|
221
|
+
*/
|
|
222
|
+
async dearchiveUsedMemories(results, sources) {
|
|
223
|
+
if (!this.storePath || !this.resolver)
|
|
224
|
+
return [];
|
|
225
|
+
// Find archive results that were cited (or all archive results if they contributed to the answer)
|
|
226
|
+
const archiveResults = results.filter((r) => r.fromArchive && r.memoryId);
|
|
227
|
+
if (archiveResults.length === 0)
|
|
228
|
+
return [];
|
|
229
|
+
// Determine which archive results were actually used
|
|
230
|
+
const citedPaths = new Set(sources.map((s) => s.relativePath));
|
|
231
|
+
let usedArchiveIds = archiveResults
|
|
232
|
+
.filter((r) => citedPaths.has(r.relativePath))
|
|
233
|
+
.map((r) => r.memoryId)
|
|
234
|
+
.filter(Boolean);
|
|
235
|
+
// Deterministic fallback: if no archive results matched by path,
|
|
236
|
+
// check if any archive memory titles appear in the cited sources' titles
|
|
237
|
+
if (usedArchiveIds.length === 0) {
|
|
238
|
+
const citedTitles = new Set(sources.map((s) => s.title.toLowerCase()));
|
|
239
|
+
usedArchiveIds = archiveResults
|
|
240
|
+
.filter((r) => citedTitles.has(r.title.toLowerCase()))
|
|
241
|
+
.map((r) => r.memoryId)
|
|
242
|
+
.filter(Boolean);
|
|
243
|
+
}
|
|
244
|
+
// Final fallback: dearchive ALL archive results that were in the search context
|
|
245
|
+
// (they contributed to the LLM's answer even if not explicitly cited)
|
|
246
|
+
if (usedArchiveIds.length === 0 && archiveResults.length > 0) {
|
|
247
|
+
usedArchiveIds = archiveResults
|
|
248
|
+
.map((r) => r.memoryId)
|
|
249
|
+
.filter(Boolean);
|
|
250
|
+
}
|
|
251
|
+
if (usedArchiveIds.length === 0)
|
|
252
|
+
return [];
|
|
253
|
+
try {
|
|
254
|
+
const archive = new GnosysArchive(this.storePath);
|
|
255
|
+
if (!archive.isAvailable())
|
|
256
|
+
return [];
|
|
257
|
+
const writeTarget = this.resolver.getWriteTarget();
|
|
258
|
+
if (!writeTarget) {
|
|
259
|
+
archive.close();
|
|
260
|
+
return [];
|
|
261
|
+
}
|
|
262
|
+
const restored = await archive.dearchiveBatch(usedArchiveIds, writeTarget.store);
|
|
263
|
+
archive.close();
|
|
264
|
+
// Reinforce the restored memories
|
|
265
|
+
if (restored.length > 0) {
|
|
266
|
+
try {
|
|
267
|
+
await GnosysMaintenanceEngine.reinforceBatch(writeTarget.store, restored);
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
// Reinforcement is best-effort
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return usedArchiveIds;
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
return [];
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Extract sources that were actually cited in the answer.
|
|
281
|
+
*/
|
|
282
|
+
extractCitedSources(answer, results) {
|
|
283
|
+
const cited = [];
|
|
284
|
+
const seen = new Set();
|
|
285
|
+
// Match [[filename.md]] patterns
|
|
286
|
+
const wikiLinkRegex = /\[\[([^\]]+)\]\]/g;
|
|
287
|
+
let match;
|
|
288
|
+
while ((match = wikiLinkRegex.exec(answer)) !== null) {
|
|
289
|
+
const cited_file = match[1];
|
|
290
|
+
// Find matching result
|
|
291
|
+
for (const r of results) {
|
|
292
|
+
const filename = r.relativePath.split("/").pop() || r.relativePath;
|
|
293
|
+
if ((r.relativePath === cited_file ||
|
|
294
|
+
r.relativePath.endsWith(cited_file) ||
|
|
295
|
+
filename === cited_file ||
|
|
296
|
+
filename === cited_file + ".md") &&
|
|
297
|
+
!seen.has(r.relativePath)) {
|
|
298
|
+
seen.add(r.relativePath);
|
|
299
|
+
cited.push({ relativePath: r.relativePath, title: r.title });
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
// If no wikilinks found in answer, include all search results as sources
|
|
305
|
+
if (cited.length === 0) {
|
|
306
|
+
for (const r of results) {
|
|
307
|
+
if (!seen.has(r.relativePath)) {
|
|
308
|
+
seen.add(r.relativePath);
|
|
309
|
+
cited.push({ relativePath: r.relativePath, title: r.title });
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return cited;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=ask.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/lib/ask.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Audit — Structured JSON logging for every memory operation.
|
|
3
|
+
*
|
|
4
|
+
* Provides observability for enterprise agent systems. Every read, write,
|
|
5
|
+
* reinforce, dearchive, and recall operation is logged with timestamps
|
|
6
|
+
* and optional traceIds for correlation with the outer orchestrator.
|
|
7
|
+
*
|
|
8
|
+
* Logs are stored in .gnosys/.config/audit.jsonl (append-only).
|
|
9
|
+
*/
|
|
10
|
+
export interface AuditEntry {
|
|
11
|
+
timestamp: string;
|
|
12
|
+
operation: AuditOperation;
|
|
13
|
+
memoryId?: string;
|
|
14
|
+
memoryTitle?: string;
|
|
15
|
+
query?: string;
|
|
16
|
+
resultCount?: number;
|
|
17
|
+
durationMs?: number;
|
|
18
|
+
traceId?: string;
|
|
19
|
+
details?: Record<string, unknown>;
|
|
20
|
+
}
|
|
21
|
+
export type AuditOperation = "read" | "write" | "update" | "delete" | "reinforce" | "dearchive" | "archive" | "maintain" | "search" | "ask" | "recall" | "consolidate" | "decay";
|
|
22
|
+
/**
|
|
23
|
+
* Initialize the audit log for a specific store path.
|
|
24
|
+
* Creates .gnosys/.config/audit.jsonl if it doesn't exist.
|
|
25
|
+
*/
|
|
26
|
+
export declare function initAudit(storePath: string): void;
|
|
27
|
+
/**
|
|
28
|
+
* Log an audit entry. Fire-and-forget — never blocks the caller.
|
|
29
|
+
*/
|
|
30
|
+
export declare function auditLog(entry: Omit<AuditEntry, "timestamp">): void;
|
|
31
|
+
/**
|
|
32
|
+
* Read audit entries, optionally filtered by days.
|
|
33
|
+
*/
|
|
34
|
+
export declare function readAuditLog(storePath: string, options?: {
|
|
35
|
+
days?: number;
|
|
36
|
+
operation?: AuditOperation;
|
|
37
|
+
limit?: number;
|
|
38
|
+
}): AuditEntry[];
|
|
39
|
+
/**
|
|
40
|
+
* Format audit entries as a human-readable timeline.
|
|
41
|
+
*/
|
|
42
|
+
export declare function formatAuditTimeline(entries: AuditEntry[]): string;
|
|
43
|
+
/**
|
|
44
|
+
* Close the audit stream cleanly.
|
|
45
|
+
*/
|
|
46
|
+
export declare function closeAudit(): void;
|
|
47
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/lib/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,cAAc,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,WAAW,GACX,SAAS,GACT,UAAU,GACV,QAAQ,GACR,KAAK,GACL,QAAQ,GACR,aAAa,GACb,OAAO,CAAC;AAOZ;;;GAGG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAcjD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,GACnC,IAAI,CASN;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,cAAc,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACtE,UAAU,EAAE,CAwCd;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CA6CjE;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAKjC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Audit — Structured JSON logging for every memory operation.
|
|
3
|
+
*
|
|
4
|
+
* Provides observability for enterprise agent systems. Every read, write,
|
|
5
|
+
* reinforce, dearchive, and recall operation is logged with timestamps
|
|
6
|
+
* and optional traceIds for correlation with the outer orchestrator.
|
|
7
|
+
*
|
|
8
|
+
* Logs are stored in .gnosys/.config/audit.jsonl (append-only).
|
|
9
|
+
*/
|
|
10
|
+
import fs from "fs";
|
|
11
|
+
import path from "path";
|
|
12
|
+
// ─── Module State ───────────────────────────────────────────────────────
|
|
13
|
+
let auditFilePath = null;
|
|
14
|
+
let auditStream = null;
|
|
15
|
+
/**
|
|
16
|
+
* Initialize the audit log for a specific store path.
|
|
17
|
+
* Creates .gnosys/.config/audit.jsonl if it doesn't exist.
|
|
18
|
+
*/
|
|
19
|
+
export function initAudit(storePath) {
|
|
20
|
+
const configDir = path.join(storePath, ".config");
|
|
21
|
+
// Ensure .config dir exists (sync — called once at startup)
|
|
22
|
+
try {
|
|
23
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// Already exists
|
|
27
|
+
}
|
|
28
|
+
auditFilePath = path.join(configDir, "audit.jsonl");
|
|
29
|
+
// Open append-only write stream
|
|
30
|
+
auditStream = fs.createWriteStream(auditFilePath, { flags: "a" });
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Log an audit entry. Fire-and-forget — never blocks the caller.
|
|
34
|
+
*/
|
|
35
|
+
export function auditLog(entry) {
|
|
36
|
+
const full = {
|
|
37
|
+
timestamp: new Date().toISOString(),
|
|
38
|
+
...entry,
|
|
39
|
+
};
|
|
40
|
+
if (auditStream && !auditStream.destroyed) {
|
|
41
|
+
auditStream.write(JSON.stringify(full) + "\n");
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Read audit entries, optionally filtered by days.
|
|
46
|
+
*/
|
|
47
|
+
export function readAuditLog(storePath, options) {
|
|
48
|
+
const logPath = path.join(storePath, ".config", "audit.jsonl");
|
|
49
|
+
let raw;
|
|
50
|
+
try {
|
|
51
|
+
raw = fs.readFileSync(logPath, "utf-8");
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
const lines = raw.trim().split("\n").filter(Boolean);
|
|
57
|
+
let entries = [];
|
|
58
|
+
for (const line of lines) {
|
|
59
|
+
try {
|
|
60
|
+
entries.push(JSON.parse(line));
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Skip malformed lines
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Filter by days
|
|
67
|
+
if (options?.days) {
|
|
68
|
+
const cutoff = new Date();
|
|
69
|
+
cutoff.setDate(cutoff.getDate() - options.days);
|
|
70
|
+
const cutoffStr = cutoff.toISOString();
|
|
71
|
+
entries = entries.filter((e) => e.timestamp >= cutoffStr);
|
|
72
|
+
}
|
|
73
|
+
// Filter by operation
|
|
74
|
+
if (options?.operation) {
|
|
75
|
+
entries = entries.filter((e) => e.operation === options.operation);
|
|
76
|
+
}
|
|
77
|
+
// Limit (take most recent)
|
|
78
|
+
if (options?.limit) {
|
|
79
|
+
entries = entries.slice(-options.limit);
|
|
80
|
+
}
|
|
81
|
+
return entries;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Format audit entries as a human-readable timeline.
|
|
85
|
+
*/
|
|
86
|
+
export function formatAuditTimeline(entries) {
|
|
87
|
+
if (entries.length === 0) {
|
|
88
|
+
return "No audit entries found for the specified period.";
|
|
89
|
+
}
|
|
90
|
+
const lines = [
|
|
91
|
+
`Gnosys Audit Trail — ${entries.length} operations`,
|
|
92
|
+
"═".repeat(60),
|
|
93
|
+
"",
|
|
94
|
+
];
|
|
95
|
+
// Group by date
|
|
96
|
+
const byDate = new Map();
|
|
97
|
+
for (const entry of entries) {
|
|
98
|
+
const date = entry.timestamp.split("T")[0];
|
|
99
|
+
if (!byDate.has(date))
|
|
100
|
+
byDate.set(date, []);
|
|
101
|
+
byDate.get(date).push(entry);
|
|
102
|
+
}
|
|
103
|
+
for (const [date, dayEntries] of byDate) {
|
|
104
|
+
lines.push(`── ${date} (${dayEntries.length} ops) ──`);
|
|
105
|
+
for (const e of dayEntries) {
|
|
106
|
+
const time = e.timestamp.split("T")[1]?.split(".")[0] || "";
|
|
107
|
+
const duration = e.durationMs ? ` (${e.durationMs.toFixed(1)}ms)` : "";
|
|
108
|
+
const trace = e.traceId ? ` [trace:${e.traceId.substring(0, 8)}]` : "";
|
|
109
|
+
const memory = e.memoryId ? ` → ${e.memoryId}` : "";
|
|
110
|
+
const query = e.query ? ` q="${e.query.substring(0, 30)}"` : "";
|
|
111
|
+
const count = e.resultCount !== undefined ? ` (${e.resultCount} results)` : "";
|
|
112
|
+
lines.push(` ${time} ${e.operation.toUpperCase().padEnd(12)}${memory}${query}${count}${duration}${trace}`);
|
|
113
|
+
}
|
|
114
|
+
lines.push("");
|
|
115
|
+
}
|
|
116
|
+
// Summary
|
|
117
|
+
const opCounts = new Map();
|
|
118
|
+
for (const e of entries) {
|
|
119
|
+
opCounts.set(e.operation, (opCounts.get(e.operation) || 0) + 1);
|
|
120
|
+
}
|
|
121
|
+
lines.push("Summary:");
|
|
122
|
+
for (const [op, count] of [...opCounts.entries()].sort((a, b) => b[1] - a[1])) {
|
|
123
|
+
lines.push(` ${op}: ${count}`);
|
|
124
|
+
}
|
|
125
|
+
return lines.join("\n");
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Close the audit stream cleanly.
|
|
129
|
+
*/
|
|
130
|
+
export function closeAudit() {
|
|
131
|
+
if (auditStream && !auditStream.destroyed) {
|
|
132
|
+
auditStream.end();
|
|
133
|
+
auditStream = null;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/lib/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AA+BxB,2EAA2E;AAE3E,IAAI,aAAa,GAAkB,IAAI,CAAC;AACxC,IAAI,WAAW,GAA0B,IAAI,CAAC;AAE9C;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,SAAiB;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAElD,4DAA4D;IAC5D,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;IAED,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAEpD,gCAAgC;IAChC,WAAW,GAAG,EAAE,CAAC,iBAAiB,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CACtB,KAAoC;IAEpC,MAAM,IAAI,GAAe;QACvB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,GAAG,KAAK;KACT,CAAC;IAEF,IAAI,WAAW,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;QAC1C,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,SAAiB,EACjB,OAAuE;IAEvE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;IAE/D,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrD,IAAI,OAAO,GAAiB,EAAE,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAe,CAAC,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,IAAI,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QAC1B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACvC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC;IAC5D,CAAC;IAED,sBAAsB;IACtB,IAAI,OAAO,EAAE,SAAS,EAAE,CAAC;QACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACrE,CAAC;IAED,2BAA2B;IAC3B,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAqB;IACvD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,kDAAkD,CAAC;IAC5D,CAAC;IAED,MAAM,KAAK,GAAa;QACtB,wBAAwB,OAAO,CAAC,MAAM,aAAa;QACnD,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACd,EAAE;KACH,CAAC;IAEF,gBAAgB;IAChB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC/C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,UAAU,CAAC,MAAM,UAAU,CAAC,CAAC;QACvD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5D,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,MAAM,KAAK,GAAG,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;YAE/E,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,KAAK,EAAE,CAAC,CAAC;QAC/G,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,UAAU;IACV,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvB,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,KAAK,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,IAAI,WAAW,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;QAC1C,WAAW,CAAC,GAAG,EAAE,CAAC;QAClB,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Bootstrap — Batch-ingest existing documents into the memory store.
|
|
3
|
+
*
|
|
4
|
+
* Scans a directory for markdown/text files and creates memories from them.
|
|
5
|
+
* Supports both raw import (no LLM) and enriched import (LLM structures content).
|
|
6
|
+
*/
|
|
7
|
+
import { GnosysStore, MemoryFrontmatter } from "./store.js";
|
|
8
|
+
export interface BootstrapOptions {
|
|
9
|
+
/** Source directory to scan */
|
|
10
|
+
sourceDir: string;
|
|
11
|
+
/** File glob patterns to include */
|
|
12
|
+
patterns?: string[];
|
|
13
|
+
/** Whether to skip files that already exist in the store */
|
|
14
|
+
skipExisting?: boolean;
|
|
15
|
+
/** Default category for ingested files */
|
|
16
|
+
defaultCategory?: string;
|
|
17
|
+
/** Default author */
|
|
18
|
+
defaultAuthor?: "human" | "ai" | "human+ai";
|
|
19
|
+
/** Default authority level */
|
|
20
|
+
defaultAuthority?: "declared" | "observed" | "imported" | "inferred";
|
|
21
|
+
/** Default confidence */
|
|
22
|
+
defaultConfidence?: number;
|
|
23
|
+
/** Whether to preserve existing frontmatter if present */
|
|
24
|
+
preserveFrontmatter?: boolean;
|
|
25
|
+
/** Dry run - report what would be imported without writing */
|
|
26
|
+
dryRun?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface BootstrapResult {
|
|
29
|
+
/** Files that were successfully imported */
|
|
30
|
+
imported: string[];
|
|
31
|
+
/** Files that were skipped (already exist) */
|
|
32
|
+
skipped: string[];
|
|
33
|
+
/** Files that failed to import */
|
|
34
|
+
failed: Array<{
|
|
35
|
+
path: string;
|
|
36
|
+
error: string;
|
|
37
|
+
}>;
|
|
38
|
+
/** Total files scanned */
|
|
39
|
+
totalScanned: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Scan a directory and discover importable files.
|
|
43
|
+
*/
|
|
44
|
+
export declare function discoverFiles(sourceDir: string, patterns?: string[]): Promise<string[]>;
|
|
45
|
+
/**
|
|
46
|
+
* Parse a single file and prepare it for import.
|
|
47
|
+
*/
|
|
48
|
+
export declare function parseFileForImport(content: string, relativePath: string, options: BootstrapOptions): {
|
|
49
|
+
frontmatter: Partial<MemoryFrontmatter>;
|
|
50
|
+
body: string;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Bootstrap: batch-import files from a directory into a Gnosys store.
|
|
54
|
+
*/
|
|
55
|
+
export declare function bootstrap(store: GnosysStore, options: BootstrapOptions): Promise<BootstrapResult>;
|
|
56
|
+
//# sourceMappingURL=bootstrap.d.ts.map
|