@framers/agentos 0.1.101 → 0.1.102

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/README.md +16 -0
  2. package/dist/memory/config.d.ts +39 -0
  3. package/dist/memory/config.d.ts.map +1 -1
  4. package/dist/memory/config.js.map +1 -1
  5. package/dist/memory/consolidation/ConsolidationLoop.d.ts +177 -0
  6. package/dist/memory/consolidation/ConsolidationLoop.d.ts.map +1 -0
  7. package/dist/memory/consolidation/ConsolidationLoop.js +517 -0
  8. package/dist/memory/consolidation/ConsolidationLoop.js.map +1 -0
  9. package/dist/memory/consolidation/ConsolidationPipeline.d.ts.map +1 -1
  10. package/dist/memory/consolidation/ConsolidationPipeline.js +7 -0
  11. package/dist/memory/consolidation/ConsolidationPipeline.js.map +1 -1
  12. package/dist/memory/consolidation/index.d.ts +8 -0
  13. package/dist/memory/consolidation/index.d.ts.map +1 -0
  14. package/dist/memory/consolidation/index.js +7 -0
  15. package/dist/memory/consolidation/index.js.map +1 -0
  16. package/dist/memory/decay/DecayModel.d.ts +33 -0
  17. package/dist/memory/decay/DecayModel.d.ts.map +1 -1
  18. package/dist/memory/decay/DecayModel.js +31 -0
  19. package/dist/memory/decay/DecayModel.js.map +1 -1
  20. package/dist/memory/facade/Memory.d.ts +228 -0
  21. package/dist/memory/facade/Memory.d.ts.map +1 -0
  22. package/dist/memory/facade/Memory.js +823 -0
  23. package/dist/memory/facade/Memory.js.map +1 -0
  24. package/dist/memory/facade/index.d.ts +13 -0
  25. package/dist/memory/facade/index.d.ts.map +1 -0
  26. package/dist/memory/facade/index.js +11 -0
  27. package/dist/memory/facade/index.js.map +1 -0
  28. package/dist/memory/facade/types.d.ts +606 -0
  29. package/dist/memory/facade/types.d.ts.map +1 -0
  30. package/dist/memory/facade/types.js +11 -0
  31. package/dist/memory/facade/types.js.map +1 -0
  32. package/dist/memory/feedback/RetrievalFeedbackSignal.d.ts +132 -0
  33. package/dist/memory/feedback/RetrievalFeedbackSignal.d.ts.map +1 -0
  34. package/dist/memory/feedback/RetrievalFeedbackSignal.js +178 -0
  35. package/dist/memory/feedback/RetrievalFeedbackSignal.js.map +1 -0
  36. package/dist/memory/feedback/index.d.ts +13 -0
  37. package/dist/memory/feedback/index.d.ts.map +1 -0
  38. package/dist/memory/feedback/index.js +12 -0
  39. package/dist/memory/feedback/index.js.map +1 -0
  40. package/dist/memory/index.d.ts +22 -0
  41. package/dist/memory/index.d.ts.map +1 -1
  42. package/dist/memory/index.js +24 -0
  43. package/dist/memory/index.js.map +1 -1
  44. package/dist/memory/ingestion/ChunkingEngine.d.ts +143 -0
  45. package/dist/memory/ingestion/ChunkingEngine.d.ts.map +1 -0
  46. package/dist/memory/ingestion/ChunkingEngine.js +508 -0
  47. package/dist/memory/ingestion/ChunkingEngine.js.map +1 -0
  48. package/dist/memory/ingestion/DoclingLoader.d.ts +44 -0
  49. package/dist/memory/ingestion/DoclingLoader.d.ts.map +1 -0
  50. package/dist/memory/ingestion/DoclingLoader.js +228 -0
  51. package/dist/memory/ingestion/DoclingLoader.js.map +1 -0
  52. package/dist/memory/ingestion/DocxLoader.d.ts +37 -0
  53. package/dist/memory/ingestion/DocxLoader.d.ts.map +1 -0
  54. package/dist/memory/ingestion/DocxLoader.js +111 -0
  55. package/dist/memory/ingestion/DocxLoader.js.map +1 -0
  56. package/dist/memory/ingestion/FolderScanner.d.ts +116 -0
  57. package/dist/memory/ingestion/FolderScanner.d.ts.map +1 -0
  58. package/dist/memory/ingestion/FolderScanner.js +127 -0
  59. package/dist/memory/ingestion/FolderScanner.js.map +1 -0
  60. package/dist/memory/ingestion/HtmlLoader.d.ts +49 -0
  61. package/dist/memory/ingestion/HtmlLoader.d.ts.map +1 -0
  62. package/dist/memory/ingestion/HtmlLoader.js +202 -0
  63. package/dist/memory/ingestion/HtmlLoader.js.map +1 -0
  64. package/dist/memory/ingestion/IDocumentLoader.d.ts +63 -0
  65. package/dist/memory/ingestion/IDocumentLoader.d.ts.map +1 -0
  66. package/dist/memory/ingestion/IDocumentLoader.js +11 -0
  67. package/dist/memory/ingestion/IDocumentLoader.js.map +1 -0
  68. package/dist/memory/ingestion/LoaderRegistry.d.ts +140 -0
  69. package/dist/memory/ingestion/LoaderRegistry.d.ts.map +1 -0
  70. package/dist/memory/ingestion/LoaderRegistry.js +229 -0
  71. package/dist/memory/ingestion/LoaderRegistry.js.map +1 -0
  72. package/dist/memory/ingestion/MarkdownLoader.d.ts +50 -0
  73. package/dist/memory/ingestion/MarkdownLoader.d.ts.map +1 -0
  74. package/dist/memory/ingestion/MarkdownLoader.js +169 -0
  75. package/dist/memory/ingestion/MarkdownLoader.js.map +1 -0
  76. package/dist/memory/ingestion/MultimodalAggregator.d.ts +88 -0
  77. package/dist/memory/ingestion/MultimodalAggregator.d.ts.map +1 -0
  78. package/dist/memory/ingestion/MultimodalAggregator.js +96 -0
  79. package/dist/memory/ingestion/MultimodalAggregator.js.map +1 -0
  80. package/dist/memory/ingestion/OcrPdfLoader.d.ts +41 -0
  81. package/dist/memory/ingestion/OcrPdfLoader.d.ts.map +1 -0
  82. package/dist/memory/ingestion/OcrPdfLoader.js +149 -0
  83. package/dist/memory/ingestion/OcrPdfLoader.js.map +1 -0
  84. package/dist/memory/ingestion/PdfLoader.d.ts +78 -0
  85. package/dist/memory/ingestion/PdfLoader.d.ts.map +1 -0
  86. package/dist/memory/ingestion/PdfLoader.js +179 -0
  87. package/dist/memory/ingestion/PdfLoader.js.map +1 -0
  88. package/dist/memory/ingestion/TextLoader.d.ts +66 -0
  89. package/dist/memory/ingestion/TextLoader.d.ts.map +1 -0
  90. package/dist/memory/ingestion/TextLoader.js +207 -0
  91. package/dist/memory/ingestion/TextLoader.js.map +1 -0
  92. package/dist/memory/ingestion/UrlLoader.d.ts +95 -0
  93. package/dist/memory/ingestion/UrlLoader.d.ts.map +1 -0
  94. package/dist/memory/ingestion/UrlLoader.js +174 -0
  95. package/dist/memory/ingestion/UrlLoader.js.map +1 -0
  96. package/dist/memory/io/ChatGptImporter.d.ts +85 -0
  97. package/dist/memory/io/ChatGptImporter.d.ts.map +1 -0
  98. package/dist/memory/io/ChatGptImporter.js +231 -0
  99. package/dist/memory/io/ChatGptImporter.js.map +1 -0
  100. package/dist/memory/io/JsonExporter.d.ts +67 -0
  101. package/dist/memory/io/JsonExporter.d.ts.map +1 -0
  102. package/dist/memory/io/JsonExporter.js +132 -0
  103. package/dist/memory/io/JsonExporter.js.map +1 -0
  104. package/dist/memory/io/JsonImporter.d.ts +84 -0
  105. package/dist/memory/io/JsonImporter.d.ts.map +1 -0
  106. package/dist/memory/io/JsonImporter.js +234 -0
  107. package/dist/memory/io/JsonImporter.js.map +1 -0
  108. package/dist/memory/io/MarkdownExporter.d.ts +95 -0
  109. package/dist/memory/io/MarkdownExporter.d.ts.map +1 -0
  110. package/dist/memory/io/MarkdownExporter.js +130 -0
  111. package/dist/memory/io/MarkdownExporter.js.map +1 -0
  112. package/dist/memory/io/MarkdownImporter.d.ts +84 -0
  113. package/dist/memory/io/MarkdownImporter.d.ts.map +1 -0
  114. package/dist/memory/io/MarkdownImporter.js +166 -0
  115. package/dist/memory/io/MarkdownImporter.js.map +1 -0
  116. package/dist/memory/io/ObsidianExporter.d.ts +80 -0
  117. package/dist/memory/io/ObsidianExporter.d.ts.map +1 -0
  118. package/dist/memory/io/ObsidianExporter.js +127 -0
  119. package/dist/memory/io/ObsidianExporter.js.map +1 -0
  120. package/dist/memory/io/ObsidianImporter.d.ts +93 -0
  121. package/dist/memory/io/ObsidianImporter.d.ts.map +1 -0
  122. package/dist/memory/io/ObsidianImporter.js +221 -0
  123. package/dist/memory/io/ObsidianImporter.js.map +1 -0
  124. package/dist/memory/io/SqliteExporter.d.ts +47 -0
  125. package/dist/memory/io/SqliteExporter.d.ts.map +1 -0
  126. package/dist/memory/io/SqliteExporter.js +56 -0
  127. package/dist/memory/io/SqliteExporter.js.map +1 -0
  128. package/dist/memory/io/SqliteImporter.d.ts +82 -0
  129. package/dist/memory/io/SqliteImporter.d.ts.map +1 -0
  130. package/dist/memory/io/SqliteImporter.js +232 -0
  131. package/dist/memory/io/SqliteImporter.js.map +1 -0
  132. package/dist/memory/io/index.d.ts +31 -0
  133. package/dist/memory/io/index.d.ts.map +1 -0
  134. package/dist/memory/io/index.js +31 -0
  135. package/dist/memory/io/index.js.map +1 -0
  136. package/dist/memory/store/SqliteBrain.d.ts +125 -0
  137. package/dist/memory/store/SqliteBrain.d.ts.map +1 -0
  138. package/dist/memory/store/SqliteBrain.js +407 -0
  139. package/dist/memory/store/SqliteBrain.js.map +1 -0
  140. package/dist/memory/store/SqliteKnowledgeGraph.d.ts +259 -0
  141. package/dist/memory/store/SqliteKnowledgeGraph.d.ts.map +1 -0
  142. package/dist/memory/store/SqliteKnowledgeGraph.js +1062 -0
  143. package/dist/memory/store/SqliteKnowledgeGraph.js.map +1 -0
  144. package/dist/memory/store/SqliteMemoryGraph.d.ts +251 -0
  145. package/dist/memory/store/SqliteMemoryGraph.d.ts.map +1 -0
  146. package/dist/memory/store/SqliteMemoryGraph.js +637 -0
  147. package/dist/memory/store/SqliteMemoryGraph.js.map +1 -0
  148. package/dist/memory/tools/MemoryAddTool.d.ts +98 -0
  149. package/dist/memory/tools/MemoryAddTool.d.ts.map +1 -0
  150. package/dist/memory/tools/MemoryAddTool.js +131 -0
  151. package/dist/memory/tools/MemoryAddTool.js.map +1 -0
  152. package/dist/memory/tools/MemoryDeleteTool.d.ts +83 -0
  153. package/dist/memory/tools/MemoryDeleteTool.d.ts.map +1 -0
  154. package/dist/memory/tools/MemoryDeleteTool.js +96 -0
  155. package/dist/memory/tools/MemoryDeleteTool.js.map +1 -0
  156. package/dist/memory/tools/MemoryMergeTool.d.ts +95 -0
  157. package/dist/memory/tools/MemoryMergeTool.d.ts.map +1 -0
  158. package/dist/memory/tools/MemoryMergeTool.js +164 -0
  159. package/dist/memory/tools/MemoryMergeTool.js.map +1 -0
  160. package/dist/memory/tools/MemoryReflectTool.d.ts +86 -0
  161. package/dist/memory/tools/MemoryReflectTool.d.ts.map +1 -0
  162. package/dist/memory/tools/MemoryReflectTool.js +102 -0
  163. package/dist/memory/tools/MemoryReflectTool.js.map +1 -0
  164. package/dist/memory/tools/MemorySearchTool.d.ts +117 -0
  165. package/dist/memory/tools/MemorySearchTool.d.ts.map +1 -0
  166. package/dist/memory/tools/MemorySearchTool.js +162 -0
  167. package/dist/memory/tools/MemorySearchTool.js.map +1 -0
  168. package/dist/memory/tools/MemoryUpdateTool.d.ts +92 -0
  169. package/dist/memory/tools/MemoryUpdateTool.d.ts.map +1 -0
  170. package/dist/memory/tools/MemoryUpdateTool.js +125 -0
  171. package/dist/memory/tools/MemoryUpdateTool.js.map +1 -0
  172. package/dist/memory/tools/index.d.ts +32 -0
  173. package/dist/memory/tools/index.d.ts.map +1 -0
  174. package/dist/memory/tools/index.js +26 -0
  175. package/dist/memory/tools/index.js.map +1 -0
  176. package/package.json +6 -1
@@ -0,0 +1,166 @@
1
+ /**
2
+ * @fileoverview Markdown importer for AgentOS memory brain.
3
+ *
4
+ * Recursively walks a directory of Markdown files and inserts each file as a
5
+ * memory trace in the target `SqliteBrain`. Front-matter fields (parsed via
6
+ * `gray-matter`) are mapped to trace columns; the document body becomes the
7
+ * trace content.
8
+ *
9
+ * Deduplication uses SHA-256 of the content body — files already present in
10
+ * the target brain (same hash in `metadata.import_hash`) are skipped.
11
+ *
12
+ * @module memory/io/MarkdownImporter
13
+ */
14
+ import fs from 'node:fs/promises';
15
+ import path from 'node:path';
16
+ import crypto from 'node:crypto';
17
+ import { v4 as uuidv4 } from 'uuid';
18
+ import matter from 'gray-matter';
19
+ // ---------------------------------------------------------------------------
20
+ // MarkdownImporter
21
+ // ---------------------------------------------------------------------------
22
+ /**
23
+ * Imports Markdown files from a directory into a `SqliteBrain`.
24
+ *
25
+ * **Usage:**
26
+ * ```ts
27
+ * const importer = new MarkdownImporter(brain);
28
+ * const result = await importer.import('/path/to/vault');
29
+ * console.log(result.imported, result.skipped);
30
+ * ```
31
+ */
32
+ export class MarkdownImporter {
33
+ /**
34
+ * @param brain - The target `SqliteBrain` to import into.
35
+ */
36
+ constructor(brain) {
37
+ this.brain = brain;
38
+ }
39
+ // -------------------------------------------------------------------------
40
+ // Public API
41
+ // -------------------------------------------------------------------------
42
+ /**
43
+ * Recursively walk `sourceDir`, parse every `.md` file, and insert traces.
44
+ *
45
+ * Non-Markdown files are silently ignored. Files that fail to parse are
46
+ * recorded in `result.errors` and processing continues.
47
+ *
48
+ * @param sourceDir - Directory to recursively scan for `.md` files.
49
+ * @returns `ImportResult` with counts of imported, skipped, and errored items.
50
+ */
51
+ async import(sourceDir) {
52
+ const result = { imported: 0, skipped: 0, errors: [] };
53
+ const files = await this._collectMarkdownFiles(sourceDir);
54
+ for (const filePath of files) {
55
+ await this._processFile(filePath, result);
56
+ }
57
+ return result;
58
+ }
59
+ // -------------------------------------------------------------------------
60
+ // Protected helpers (overridden by ObsidianImporter)
61
+ // -------------------------------------------------------------------------
62
+ /**
63
+ * Post-process a parsed file before it is inserted into the database.
64
+ *
65
+ * The base implementation is a no-op. `ObsidianImporter` overrides this
66
+ * to extract `[[wikilinks]]` and `#tags`.
67
+ *
68
+ * @param _filePath - Absolute path of the source file.
69
+ * @param _frontmatter - Parsed front-matter data.
70
+ * @param _body - Markdown body content.
71
+ * @param _result - Mutable result accumulator.
72
+ * @param _traceId - The ID assigned (or taken from front-matter) for this trace.
73
+ */
74
+ async postProcess(_filePath, _frontmatter, _body, _result, _traceId) {
75
+ // No-op in base class.
76
+ }
77
+ // -------------------------------------------------------------------------
78
+ // Private helpers
79
+ // -------------------------------------------------------------------------
80
+ /**
81
+ * Recursively collect all `.md` file paths under `dir`.
82
+ *
83
+ * @param dir - Root directory to scan.
84
+ * @returns Sorted list of absolute file paths.
85
+ */
86
+ async _collectMarkdownFiles(dir) {
87
+ const results = [];
88
+ async function walk(current) {
89
+ let entries;
90
+ try {
91
+ entries = await fs.readdir(current, { withFileTypes: true });
92
+ }
93
+ catch {
94
+ return; // Directory not readable — skip.
95
+ }
96
+ for (const entry of entries) {
97
+ const full = path.join(current, entry.name);
98
+ if (entry.isDirectory()) {
99
+ await walk(full);
100
+ }
101
+ else if (entry.isFile() && entry.name.endsWith('.md')) {
102
+ results.push(full);
103
+ }
104
+ }
105
+ }
106
+ await walk(dir);
107
+ return results.sort();
108
+ }
109
+ /**
110
+ * Parse and insert a single Markdown file.
111
+ *
112
+ * @param filePath - Absolute path to the `.md` file.
113
+ * @param result - Mutable `ImportResult` accumulator.
114
+ */
115
+ async _processFile(filePath, result) {
116
+ let raw;
117
+ try {
118
+ raw = await fs.readFile(filePath, 'utf8');
119
+ }
120
+ catch (err) {
121
+ result.errors.push(`Cannot read ${filePath}: ${String(err)}`);
122
+ return;
123
+ }
124
+ let parsed;
125
+ try {
126
+ parsed = matter(raw);
127
+ }
128
+ catch (err) {
129
+ result.errors.push(`Cannot parse front-matter in ${filePath}: ${String(err)}`);
130
+ return;
131
+ }
132
+ const fm = parsed.data;
133
+ const body = parsed.content.trim();
134
+ if (!body) {
135
+ result.skipped++;
136
+ return;
137
+ }
138
+ const hash = crypto.createHash('sha256').update(body, 'utf8').digest('hex');
139
+ // Dedup check.
140
+ const existing = this.brain.db
141
+ .prepare(`SELECT id FROM memory_traces WHERE json_extract(metadata, '$.import_hash') = ? LIMIT 1`)
142
+ .get(hash);
143
+ if (existing) {
144
+ result.skipped++;
145
+ return;
146
+ }
147
+ const traceId = (typeof fm.id === 'string' && fm.id) ? fm.id : `mt_${uuidv4()}`;
148
+ const tags = Array.isArray(fm.tags) ? fm.tags : [];
149
+ const meta = { import_hash: hash, source_file: filePath };
150
+ try {
151
+ this.brain.db
152
+ .prepare(`INSERT INTO memory_traces
153
+ (id, type, scope, content, embedding, strength, created_at, last_accessed,
154
+ retrieval_count, tags, emotions, metadata, deleted)
155
+ VALUES (?, ?, ?, ?, NULL, ?, ?, NULL, 0, ?, '{}', ?, 0)`)
156
+ .run(traceId, typeof fm.type === 'string' ? fm.type : 'episodic', typeof fm.scope === 'string' ? fm.scope : 'user', body, typeof fm.strength === 'number' ? fm.strength : 1.0, typeof fm.createdAt === 'number' ? fm.createdAt : Date.now(), JSON.stringify(tags), JSON.stringify(meta));
157
+ // Give subclasses a chance to handle wikilinks, extra tags, etc.
158
+ await this.postProcess(filePath, fm, body, result, traceId);
159
+ result.imported++;
160
+ }
161
+ catch (err) {
162
+ result.errors.push(`Insert error for ${filePath}: ${String(err)}`);
163
+ }
164
+ }
165
+ }
166
+ //# sourceMappingURL=MarkdownImporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarkdownImporter.js","sourceRoot":"","sources":["../../../src/memory/io/MarkdownImporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * @fileoverview Obsidian vault exporter for AgentOS memory brain.
3
+ *
4
+ * Extends `MarkdownExporter` with Obsidian-specific enrichments:
5
+ *
6
+ * 1. **`#tag` decorations** — each trace tag is appended to the document body
7
+ * as an Obsidian-recognisable inline hashtag.
8
+ *
9
+ * 2. **`[[wikilinks]]`** — for each trace, the exporter queries
10
+ * `knowledge_edges` for related entities that share the same trace ID as
11
+ * a source. Related knowledge-node labels are appended as `[[label]]`
12
+ * links so Obsidian's graph view can visualise the semantic network.
13
+ *
14
+ * The folder layout mirrors `MarkdownExporter`:
15
+ * ```
16
+ * {outputDir}/
17
+ * user/
18
+ * episodic/
19
+ * mt_abc123.md ← includes [[related-node]] + #tag at bottom
20
+ * ```
21
+ *
22
+ * @module memory/io/ObsidianExporter
23
+ */
24
+ import type { ExportOptions } from '../facade/types.js';
25
+ import { MarkdownExporter } from './MarkdownExporter.js';
26
+ /** Raw row shape from the `memory_traces` table (subset used here). */
27
+ interface TraceRow {
28
+ id: string;
29
+ type: string;
30
+ scope: string;
31
+ content: string;
32
+ strength: number;
33
+ created_at: number;
34
+ tags: string;
35
+ }
36
+ /**
37
+ * Exports memory traces as an Obsidian-compatible Markdown vault.
38
+ *
39
+ * **Usage:**
40
+ * ```ts
41
+ * const exporter = new ObsidianExporter(brain);
42
+ * await exporter.export('/path/to/obsidian-vault');
43
+ * ```
44
+ */
45
+ export declare class ObsidianExporter extends MarkdownExporter {
46
+ /**
47
+ * Export all memory traces as Obsidian-flavoured `.md` files.
48
+ *
49
+ * Delegates to the parent `export()` method — directory creation and file
50
+ * writing are handled there; only `buildFileContent` is overridden.
51
+ *
52
+ * @param outputDir - Root directory to write the Obsidian vault into.
53
+ * @param options - Optional export configuration.
54
+ */
55
+ export(outputDir: string, options?: ExportOptions): Promise<void>;
56
+ /**
57
+ * Build Obsidian-flavoured Markdown for a trace.
58
+ *
59
+ * Additions over the base implementation:
60
+ * - Tags are rendered as `#tagName` inline hashtags in the body.
61
+ * - Related knowledge nodes (found via `knowledge_edges`) are rendered as
62
+ * `[[Node Label]]` wikilinks appended at the bottom of the note.
63
+ *
64
+ * @param trace - Parsed trace row.
65
+ * @returns Full Markdown file content with front-matter.
66
+ */
67
+ protected buildFileContent(trace: TraceRow): string;
68
+ /**
69
+ * Query `knowledge_edges` for nodes related to the given trace ID.
70
+ *
71
+ * Only edges whose `source_id` matches the trace ID are considered.
72
+ * The target node's `label` is returned for wikilink generation.
73
+ *
74
+ * @param traceId - The memory trace ID to look up edges for.
75
+ * @returns Array of knowledge node labels linked to this trace.
76
+ */
77
+ private _fetchRelatedNodes;
78
+ }
79
+ export {};
80
+ //# sourceMappingURL=ObsidianExporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ObsidianExporter.d.ts","sourceRoot":"","sources":["../../../src/memory/io/ObsidianExporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAMzD,uEAAuE;AACvE,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAWD;;;;;;;;GAQG;AACH,qBAAa,gBAAiB,SAAQ,gBAAgB;IAKpD;;;;;;;;OAQG;IACY,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAQhF;;;;;;;;;;OAUG;cACgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM;IAyC5D;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;CAkB3B"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * @fileoverview Obsidian vault exporter for AgentOS memory brain.
3
+ *
4
+ * Extends `MarkdownExporter` with Obsidian-specific enrichments:
5
+ *
6
+ * 1. **`#tag` decorations** — each trace tag is appended to the document body
7
+ * as an Obsidian-recognisable inline hashtag.
8
+ *
9
+ * 2. **`[[wikilinks]]`** — for each trace, the exporter queries
10
+ * `knowledge_edges` for related entities that share the same trace ID as
11
+ * a source. Related knowledge-node labels are appended as `[[label]]`
12
+ * links so Obsidian's graph view can visualise the semantic network.
13
+ *
14
+ * The folder layout mirrors `MarkdownExporter`:
15
+ * ```
16
+ * {outputDir}/
17
+ * user/
18
+ * episodic/
19
+ * mt_abc123.md ← includes [[related-node]] + #tag at bottom
20
+ * ```
21
+ *
22
+ * @module memory/io/ObsidianExporter
23
+ */
24
+ import matter from 'gray-matter';
25
+ import { MarkdownExporter } from './MarkdownExporter.js';
26
+ // ---------------------------------------------------------------------------
27
+ // ObsidianExporter
28
+ // ---------------------------------------------------------------------------
29
+ /**
30
+ * Exports memory traces as an Obsidian-compatible Markdown vault.
31
+ *
32
+ * **Usage:**
33
+ * ```ts
34
+ * const exporter = new ObsidianExporter(brain);
35
+ * await exporter.export('/path/to/obsidian-vault');
36
+ * ```
37
+ */
38
+ export class ObsidianExporter extends MarkdownExporter {
39
+ // -------------------------------------------------------------------------
40
+ // Public API
41
+ // -------------------------------------------------------------------------
42
+ /**
43
+ * Export all memory traces as Obsidian-flavoured `.md` files.
44
+ *
45
+ * Delegates to the parent `export()` method — directory creation and file
46
+ * writing are handled there; only `buildFileContent` is overridden.
47
+ *
48
+ * @param outputDir - Root directory to write the Obsidian vault into.
49
+ * @param options - Optional export configuration.
50
+ */
51
+ async export(outputDir, options) {
52
+ await super.export(outputDir, options);
53
+ }
54
+ // -------------------------------------------------------------------------
55
+ // Overridden helpers
56
+ // -------------------------------------------------------------------------
57
+ /**
58
+ * Build Obsidian-flavoured Markdown for a trace.
59
+ *
60
+ * Additions over the base implementation:
61
+ * - Tags are rendered as `#tagName` inline hashtags in the body.
62
+ * - Related knowledge nodes (found via `knowledge_edges`) are rendered as
63
+ * `[[Node Label]]` wikilinks appended at the bottom of the note.
64
+ *
65
+ * @param trace - Parsed trace row.
66
+ * @returns Full Markdown file content with front-matter.
67
+ */
68
+ buildFileContent(trace) {
69
+ let tags = [];
70
+ try {
71
+ tags = JSON.parse(trace.tags);
72
+ }
73
+ catch {
74
+ tags = [];
75
+ }
76
+ // Render inline #hashtags so Obsidian picks them up in tag search.
77
+ const tagLine = tags.length > 0
78
+ ? '\n\n' + tags.map((t) => `#${t.replace(/\s+/g, '-')}`).join(' ')
79
+ : '';
80
+ // Fetch related knowledge nodes via edges where source === trace ID.
81
+ // We query knowledge_edges by source_id and join knowledge_nodes to get
82
+ // the human-readable label for the wikilink.
83
+ const relatedNodes = this._fetchRelatedNodes(trace.id);
84
+ const wikiLinks = relatedNodes.length > 0
85
+ ? '\n\n**Related:**\n' +
86
+ relatedNodes.map((label) => `- [[${label}]]`).join('\n')
87
+ : '';
88
+ const body = trace.content + tagLine + wikiLinks;
89
+ return matter.stringify(body, {
90
+ id: trace.id,
91
+ type: trace.type,
92
+ scope: trace.scope,
93
+ strength: trace.strength,
94
+ tags,
95
+ createdAt: trace.created_at,
96
+ });
97
+ }
98
+ // -------------------------------------------------------------------------
99
+ // Private helpers
100
+ // -------------------------------------------------------------------------
101
+ /**
102
+ * Query `knowledge_edges` for nodes related to the given trace ID.
103
+ *
104
+ * Only edges whose `source_id` matches the trace ID are considered.
105
+ * The target node's `label` is returned for wikilink generation.
106
+ *
107
+ * @param traceId - The memory trace ID to look up edges for.
108
+ * @returns Array of knowledge node labels linked to this trace.
109
+ */
110
+ _fetchRelatedNodes(traceId) {
111
+ try {
112
+ const rows = this.brain.db
113
+ .prepare(`SELECT kn.label
114
+ FROM knowledge_edges ke
115
+ JOIN knowledge_nodes kn ON kn.id = ke.target_id
116
+ WHERE ke.source_id = ?
117
+ LIMIT 50`)
118
+ .all(traceId);
119
+ return rows.map((r) => r.label);
120
+ }
121
+ catch {
122
+ // If the knowledge graph isn't populated, return empty gracefully.
123
+ return [];
124
+ }
125
+ }
126
+ }
127
+ //# sourceMappingURL=ObsidianExporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ObsidianExporter.js","sourceRoot":"","sources":["../../../src/memory/io/ObsidianExporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAsBzD,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,OAAO,gBAAiB,SAAQ,gBAAgB;IACpD,4EAA4E;IAC5E,aAAa;IACb,4EAA4E;IAE5E;;;;;;;;OAQG;IACM,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,OAAuB;QAC9D,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,4EAA4E;IAC5E,qBAAqB;IACrB,4EAA4E;IAE5E;;;;;;;;;;OAUG;IACgB,gBAAgB,CAAC,KAAe;QACjD,IAAI,IAAI,GAAa,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAa,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,GAAG,EAAE,CAAC;QACZ,CAAC;QAED,mEAAmE;QACnE,MAAM,OAAO,GACX,IAAI,CAAC,MAAM,GAAG,CAAC;YACb,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAClE,CAAC,CAAC,EAAE,CAAC;QAET,qEAAqE;QACrE,wEAAwE;QACxE,6CAA6C;QAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAEvD,MAAM,SAAS,GACb,YAAY,CAAC,MAAM,GAAG,CAAC;YACrB,CAAC,CAAC,oBAAoB;gBACpB,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC1D,CAAC,CAAC,EAAE,CAAC;QAET,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;QAEjD,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE;YAC5B,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,IAAI;YACJ,SAAS,EAAE,KAAK,CAAC,UAAU;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,kBAAkB;IAClB,4EAA4E;IAE5E;;;;;;;;OAQG;IACK,kBAAkB,CAAC,OAAe;QACxC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE;iBACvB,OAAO,CACN;;;;oBAIU,CACX;iBACA,GAAG,CAAC,OAAO,CAAC,CAAC;YAEhB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,mEAAmE;YACnE,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * @fileoverview Obsidian vault importer for AgentOS memory brain.
3
+ *
4
+ * Extends `MarkdownImporter` with Obsidian-specific parsing:
5
+ *
6
+ * 1. **`[[wikilinks]]`** — each `[[Target Note]]` (or `[[Target|Alias]]`) in
7
+ * a note's body is parsed. For each wikilink, the importer looks up (or
8
+ * creates) a `knowledge_nodes` entry for the target label and then creates
9
+ * a `knowledge_edges` row of type `'related_to'` linking the source trace
10
+ * node to the target node.
11
+ *
12
+ * 2. **`#tags`** — inline hashtags are extracted from the body and merged
13
+ * into the trace's `tags` JSON column (in addition to any front-matter tags).
14
+ *
15
+ * 3. **`![[image.png]]`** — embedded-image syntax is detected and a warning
16
+ * is logged. Embedded images are not imported in the current version.
17
+ *
18
+ * @module memory/io/ObsidianImporter
19
+ */
20
+ import type { ImportResult } from '../facade/types.js';
21
+ import type { SqliteBrain } from '../store/SqliteBrain.js';
22
+ import { MarkdownImporter } from './MarkdownImporter.js';
23
+ /**
24
+ * Parsed front-matter fields (same shape as MarkdownImporter expects).
25
+ */
26
+ interface TraceFrontmatter {
27
+ id?: string;
28
+ type?: string;
29
+ scope?: string;
30
+ strength?: number;
31
+ tags?: string[];
32
+ createdAt?: number;
33
+ [key: string]: unknown;
34
+ }
35
+ /**
36
+ * Imports an Obsidian vault (directory of Markdown files) into a `SqliteBrain`.
37
+ *
38
+ * **Usage:**
39
+ * ```ts
40
+ * const importer = new ObsidianImporter(brain);
41
+ * const result = await importer.import('/path/to/obsidian-vault');
42
+ * ```
43
+ */
44
+ export declare class ObsidianImporter extends MarkdownImporter {
45
+ /**
46
+ * @param brain - The target `SqliteBrain` to import into.
47
+ */
48
+ constructor(brain: SqliteBrain);
49
+ /**
50
+ * Post-process a successfully imported Markdown file:
51
+ *
52
+ * 1. Warn about any embedded images (`![[...]]`).
53
+ * 2. Extract inline `#hashtags` and merge them into the trace's tag list.
54
+ * 3. Parse `[[wikilinks]]` and create `knowledge_edges` entries.
55
+ *
56
+ * @param _filePath - Absolute path of the source file (unused here).
57
+ * @param _frontmatter - Parsed front-matter data.
58
+ * @param body - Markdown body (content after front-matter).
59
+ * @param result - Mutable `ImportResult` accumulator.
60
+ * @param traceId - The ID of the just-inserted trace.
61
+ */
62
+ protected postProcess(_filePath: string, _frontmatter: TraceFrontmatter, body: string, result: ImportResult, traceId: string): Promise<void>;
63
+ /**
64
+ * Merge a list of inline hashtag names into a trace's `tags` JSON column.
65
+ *
66
+ * Reads the current tags array, deduplicates, and writes back.
67
+ *
68
+ * @param traceId - ID of the trace to update.
69
+ * @param newTags - Hashtag names to add (without the leading `#`).
70
+ * @param result - Mutable result accumulator (errors recorded here).
71
+ */
72
+ private _mergeTagsIntoTrace;
73
+ /**
74
+ * Ensure `knowledge_nodes` entries exist for both the source trace and the
75
+ * target label, then create a `knowledge_edges` row (type `'related_to'`)
76
+ * linking them.
77
+ *
78
+ * Because `knowledge_edges.source_id` has a FK reference to
79
+ * `knowledge_nodes(id)`, we first upsert a node for the source trace (using
80
+ * the trace content as the label) before creating the edge. This lets
81
+ * Obsidian's graph view visualise which note links to which concept.
82
+ *
83
+ * Both node upserts and the edge insert use `INSERT OR IGNORE` so repeated
84
+ * imports don't create duplicates.
85
+ *
86
+ * @param sourceTraceId - The memory trace ID that contains the wikilink.
87
+ * @param targetLabel - The label of the linked note (wikilink target).
88
+ * @param result - Mutable result accumulator.
89
+ */
90
+ private _upsertWikiEdge;
91
+ }
92
+ export {};
93
+ //# sourceMappingURL=ObsidianImporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ObsidianImporter.d.ts","sourceRoot":"","sources":["../../../src/memory/io/ObsidianImporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AA6BzD;;GAEG;AACH,UAAU,gBAAgB;IACxB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAMD;;;;;;;;GAQG;AACH,qBAAa,gBAAiB,SAAQ,gBAAgB;IACpD;;OAEG;gBACS,KAAK,EAAE,WAAW;IAQ9B;;;;;;;;;;;;OAYG;cACsB,WAAW,CAClC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,gBAAgB,EAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAuChB;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;IAgC3B;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,eAAe;CAsGxB"}