@delfos-ai/cli 1.0.3

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 (190) hide show
  1. package/README.md +93 -0
  2. package/dist/api/delfos-api.client.d.ts +32 -0
  3. package/dist/api/delfos-api.client.d.ts.map +1 -0
  4. package/dist/api/delfos-api.client.js +43 -0
  5. package/dist/api/delfos-api.client.js.map +1 -0
  6. package/dist/commands/login.command.d.ts +15 -0
  7. package/dist/commands/login.command.d.ts.map +1 -0
  8. package/dist/commands/login.command.js +164 -0
  9. package/dist/commands/login.command.js.map +1 -0
  10. package/dist/commands/logout.command.d.ts +8 -0
  11. package/dist/commands/logout.command.d.ts.map +1 -0
  12. package/dist/commands/logout.command.js +46 -0
  13. package/dist/commands/logout.command.js.map +1 -0
  14. package/dist/commands/mcp/mcp-memory.command.d.ts +11 -0
  15. package/dist/commands/mcp/mcp-memory.command.d.ts.map +1 -0
  16. package/dist/commands/mcp/mcp-memory.command.js +22 -0
  17. package/dist/commands/mcp/mcp-memory.command.js.map +1 -0
  18. package/dist/commands/memory/index.d.ts +3 -0
  19. package/dist/commands/memory/index.d.ts.map +1 -0
  20. package/dist/commands/memory/index.js +14 -0
  21. package/dist/commands/memory/index.js.map +1 -0
  22. package/dist/commands/memory/memory-index.command.d.ts +3 -0
  23. package/dist/commands/memory/memory-index.command.d.ts.map +1 -0
  24. package/dist/commands/memory/memory-index.command.js +57 -0
  25. package/dist/commands/memory/memory-index.command.js.map +1 -0
  26. package/dist/commands/memory/memory-init.command.d.ts +3 -0
  27. package/dist/commands/memory/memory-init.command.d.ts.map +1 -0
  28. package/dist/commands/memory/memory-init.command.js +72 -0
  29. package/dist/commands/memory/memory-init.command.js.map +1 -0
  30. package/dist/commands/memory/memory-read.command.d.ts +3 -0
  31. package/dist/commands/memory/memory-read.command.d.ts.map +1 -0
  32. package/dist/commands/memory/memory-read.command.js +52 -0
  33. package/dist/commands/memory/memory-read.command.js.map +1 -0
  34. package/dist/commands/memory/memory-status.command.d.ts +7 -0
  35. package/dist/commands/memory/memory-status.command.d.ts.map +1 -0
  36. package/dist/commands/memory/memory-status.command.js +43 -0
  37. package/dist/commands/memory/memory-status.command.js.map +1 -0
  38. package/dist/commands/memory/memory-write.command.d.ts +3 -0
  39. package/dist/commands/memory/memory-write.command.d.ts.map +1 -0
  40. package/dist/commands/memory/memory-write.command.js +66 -0
  41. package/dist/commands/memory/memory-write.command.js.map +1 -0
  42. package/dist/config/cli-config.d.ts +13 -0
  43. package/dist/config/cli-config.d.ts.map +1 -0
  44. package/dist/config/cli-config.js +31 -0
  45. package/dist/config/cli-config.js.map +1 -0
  46. package/dist/config/memory.config.d.ts +61 -0
  47. package/dist/config/memory.config.d.ts.map +1 -0
  48. package/dist/config/memory.config.js +22 -0
  49. package/dist/config/memory.config.js.map +1 -0
  50. package/dist/features/memory-index/index.d.ts +5 -0
  51. package/dist/features/memory-index/index.d.ts.map +1 -0
  52. package/dist/features/memory-index/index.js +3 -0
  53. package/dist/features/memory-index/index.js.map +1 -0
  54. package/dist/features/memory-index/memory-index.schema.d.ts +96 -0
  55. package/dist/features/memory-index/memory-index.schema.d.ts.map +1 -0
  56. package/dist/features/memory-index/memory-index.schema.js +14 -0
  57. package/dist/features/memory-index/memory-index.schema.js.map +1 -0
  58. package/dist/features/memory-index/vault-indexer.d.ts +17 -0
  59. package/dist/features/memory-index/vault-indexer.d.ts.map +1 -0
  60. package/dist/features/memory-index/vault-indexer.js +140 -0
  61. package/dist/features/memory-index/vault-indexer.js.map +1 -0
  62. package/dist/features/memory-init/vault-scaffolder.d.ts +20 -0
  63. package/dist/features/memory-init/vault-scaffolder.d.ts.map +1 -0
  64. package/dist/features/memory-init/vault-scaffolder.js +109 -0
  65. package/dist/features/memory-init/vault-scaffolder.js.map +1 -0
  66. package/dist/features/memory-read/index.d.ts +4 -0
  67. package/dist/features/memory-read/index.d.ts.map +1 -0
  68. package/dist/features/memory-read/index.js +3 -0
  69. package/dist/features/memory-read/index.js.map +1 -0
  70. package/dist/features/memory-read/memory-read.schema.d.ts +79 -0
  71. package/dist/features/memory-read/memory-read.schema.d.ts.map +1 -0
  72. package/dist/features/memory-read/memory-read.schema.js +25 -0
  73. package/dist/features/memory-read/memory-read.schema.js.map +1 -0
  74. package/dist/features/memory-read/rag-reader.d.ts +8 -0
  75. package/dist/features/memory-read/rag-reader.d.ts.map +1 -0
  76. package/dist/features/memory-read/rag-reader.js +79 -0
  77. package/dist/features/memory-read/rag-reader.js.map +1 -0
  78. package/dist/features/memory-server/config-loader.d.ts +6 -0
  79. package/dist/features/memory-server/config-loader.d.ts.map +1 -0
  80. package/dist/features/memory-server/config-loader.js +39 -0
  81. package/dist/features/memory-server/config-loader.js.map +1 -0
  82. package/dist/features/memory-server/index.d.ts +5 -0
  83. package/dist/features/memory-server/index.d.ts.map +1 -0
  84. package/dist/features/memory-server/index.js +4 -0
  85. package/dist/features/memory-server/index.js.map +1 -0
  86. package/dist/features/memory-server/memory-server.d.ts +6 -0
  87. package/dist/features/memory-server/memory-server.d.ts.map +1 -0
  88. package/dist/features/memory-server/memory-server.js +197 -0
  89. package/dist/features/memory-server/memory-server.js.map +1 -0
  90. package/dist/features/memory-server/memory-server.schema.d.ts +194 -0
  91. package/dist/features/memory-server/memory-server.schema.d.ts.map +1 -0
  92. package/dist/features/memory-server/memory-server.schema.js +58 -0
  93. package/dist/features/memory-server/memory-server.schema.js.map +1 -0
  94. package/dist/features/memory-server/tools/memory-index.handler.d.ts +10 -0
  95. package/dist/features/memory-server/tools/memory-index.handler.d.ts.map +1 -0
  96. package/dist/features/memory-server/tools/memory-index.handler.js +27 -0
  97. package/dist/features/memory-server/tools/memory-index.handler.js.map +1 -0
  98. package/dist/features/memory-server/tools/memory-read.handler.d.ts +10 -0
  99. package/dist/features/memory-server/tools/memory-read.handler.d.ts.map +1 -0
  100. package/dist/features/memory-server/tools/memory-read.handler.js +33 -0
  101. package/dist/features/memory-server/tools/memory-read.handler.js.map +1 -0
  102. package/dist/features/memory-server/tools/memory-status.handler.d.ts +9 -0
  103. package/dist/features/memory-server/tools/memory-status.handler.d.ts.map +1 -0
  104. package/dist/features/memory-server/tools/memory-status.handler.js +35 -0
  105. package/dist/features/memory-server/tools/memory-status.handler.js.map +1 -0
  106. package/dist/features/memory-server/tools/memory-write.handler.d.ts +8 -0
  107. package/dist/features/memory-server/tools/memory-write.handler.d.ts.map +1 -0
  108. package/dist/features/memory-server/tools/memory-write.handler.js +42 -0
  109. package/dist/features/memory-server/tools/memory-write.handler.js.map +1 -0
  110. package/dist/features/memory-shared/chunker.d.ts +16 -0
  111. package/dist/features/memory-shared/chunker.d.ts.map +1 -0
  112. package/dist/features/memory-shared/chunker.js +93 -0
  113. package/dist/features/memory-shared/chunker.js.map +1 -0
  114. package/dist/features/memory-shared/markdown-parser.d.ts +7 -0
  115. package/dist/features/memory-shared/markdown-parser.d.ts.map +1 -0
  116. package/dist/features/memory-shared/markdown-parser.js +24 -0
  117. package/dist/features/memory-shared/markdown-parser.js.map +1 -0
  118. package/dist/features/memory-shared/vault-path-validator.d.ts +14 -0
  119. package/dist/features/memory-shared/vault-path-validator.d.ts.map +1 -0
  120. package/dist/features/memory-shared/vault-path-validator.js +56 -0
  121. package/dist/features/memory-shared/vault-path-validator.js.map +1 -0
  122. package/dist/features/memory-shared/vault-scanner.d.ts +8 -0
  123. package/dist/features/memory-shared/vault-scanner.d.ts.map +1 -0
  124. package/dist/features/memory-shared/vault-scanner.js +35 -0
  125. package/dist/features/memory-shared/vault-scanner.js.map +1 -0
  126. package/dist/features/memory-shared/vault-slug.d.ts +9 -0
  127. package/dist/features/memory-shared/vault-slug.d.ts.map +1 -0
  128. package/dist/features/memory-shared/vault-slug.js +17 -0
  129. package/dist/features/memory-shared/vault-slug.js.map +1 -0
  130. package/dist/features/memory-write/index.d.ts +6 -0
  131. package/dist/features/memory-write/index.d.ts.map +1 -0
  132. package/dist/features/memory-write/index.js +4 -0
  133. package/dist/features/memory-write/index.js.map +1 -0
  134. package/dist/features/memory-write/memory-write.schema.d.ts +36 -0
  135. package/dist/features/memory-write/memory-write.schema.d.ts.map +1 -0
  136. package/dist/features/memory-write/memory-write.schema.js +14 -0
  137. package/dist/features/memory-write/memory-write.schema.js.map +1 -0
  138. package/dist/features/memory-write/note-formatter.d.ts +11 -0
  139. package/dist/features/memory-write/note-formatter.d.ts.map +1 -0
  140. package/dist/features/memory-write/note-formatter.js +38 -0
  141. package/dist/features/memory-write/note-formatter.js.map +1 -0
  142. package/dist/features/memory-write/vault-writer.d.ts +6 -0
  143. package/dist/features/memory-write/vault-writer.d.ts.map +1 -0
  144. package/dist/features/memory-write/vault-writer.js +61 -0
  145. package/dist/features/memory-write/vault-writer.js.map +1 -0
  146. package/dist/index.d.ts +3 -0
  147. package/dist/index.d.ts.map +1 -0
  148. package/dist/index.js +24 -0
  149. package/dist/index.js.map +1 -0
  150. package/dist/infrastructure/embeddings/embedding-provider.d.ts +9 -0
  151. package/dist/infrastructure/embeddings/embedding-provider.d.ts.map +1 -0
  152. package/dist/infrastructure/embeddings/embedding-provider.js +5 -0
  153. package/dist/infrastructure/embeddings/embedding-provider.js.map +1 -0
  154. package/dist/infrastructure/embeddings/local-embedding.provider.d.ts +18 -0
  155. package/dist/infrastructure/embeddings/local-embedding.provider.d.ts.map +1 -0
  156. package/dist/infrastructure/embeddings/local-embedding.provider.js +38 -0
  157. package/dist/infrastructure/embeddings/local-embedding.provider.js.map +1 -0
  158. package/dist/infrastructure/logger/index.d.ts +21 -0
  159. package/dist/infrastructure/logger/index.d.ts.map +1 -0
  160. package/dist/infrastructure/logger/index.js +116 -0
  161. package/dist/infrastructure/logger/index.js.map +1 -0
  162. package/dist/infrastructure/vector-db/chroma.adapter.d.ts +76 -0
  163. package/dist/infrastructure/vector-db/chroma.adapter.d.ts.map +1 -0
  164. package/dist/infrastructure/vector-db/chroma.adapter.js +137 -0
  165. package/dist/infrastructure/vector-db/chroma.adapter.js.map +1 -0
  166. package/dist/utils/config.d.ts +13 -0
  167. package/dist/utils/config.d.ts.map +1 -0
  168. package/dist/utils/config.js +13 -0
  169. package/dist/utils/config.js.map +1 -0
  170. package/dist/utils/pkce.d.ts +17 -0
  171. package/dist/utils/pkce.d.ts.map +1 -0
  172. package/dist/utils/pkce.js +28 -0
  173. package/dist/utils/pkce.js.map +1 -0
  174. package/dist/utils/port.d.ts +7 -0
  175. package/dist/utils/port.d.ts.map +1 -0
  176. package/dist/utils/port.js +33 -0
  177. package/dist/utils/port.js.map +1 -0
  178. package/package.json +59 -0
  179. package/templates/.gitkeep +0 -0
  180. package/templates/obsidian-vault/AI-Context/global-rules.md +129 -0
  181. package/templates/obsidian-vault/AI-Context/tool-preferences.md +128 -0
  182. package/templates/obsidian-vault/Patterns/architecture-patterns.md +147 -0
  183. package/templates/obsidian-vault/Patterns/coding-standards.md +90 -0
  184. package/templates/obsidian-vault/Projects/example-project/Decisions/example-decision.md +51 -0
  185. package/templates/obsidian-vault/Projects/example-project/Migrations/example-migration.md +85 -0
  186. package/templates/obsidian-vault/Projects/example-project/Overview.md +43 -0
  187. package/templates/obsidian-vault/Projects/example-project/Sessions/session-1.md +66 -0
  188. package/templates/obsidian-vault/Templates/decision.md +57 -0
  189. package/templates/obsidian-vault/Templates/migration.md +86 -0
  190. package/templates/obsidian-vault/Templates/session.md +87 -0
@@ -0,0 +1,42 @@
1
+ /**
2
+ * memory-write.handler.ts — MCP tool handler for memory_write (CLI version).
3
+ * Delegates to note-formatter.ts + vault-writer.ts.
4
+ */
5
+ import { formatNote } from '../../memory-write/note-formatter.js';
6
+ import { writeNote } from '../../memory-write/vault-writer.js';
7
+ import { createSliceLogger } from '../../../infrastructure/logger/index.js';
8
+ const logger = createSliceLogger('memory-write-handler');
9
+ export async function handleMemoryWrite(input, config) {
10
+ const startTime = Date.now();
11
+ try {
12
+ const formattedContent = formatNote({
13
+ title: input.title,
14
+ content: input.content,
15
+ tags: input.tags,
16
+ extraFrontmatter: input.frontmatter,
17
+ });
18
+ const jobData = {
19
+ vaultPath: config.vault_path,
20
+ title: input.title,
21
+ folder: input.folder,
22
+ content: input.content,
23
+ tags: input.tags,
24
+ overwrite: false,
25
+ };
26
+ const result = await writeNote(jobData, formattedContent);
27
+ const durationMs = Date.now() - startTime;
28
+ logger.info({
29
+ tool: 'memory_write',
30
+ params: { title: input.title, folder: input.folder },
31
+ duration_ms: durationMs,
32
+ result_summary: `created: ${result.created}`,
33
+ }, 'MCP tool call completed');
34
+ return result;
35
+ }
36
+ catch (err) {
37
+ const durationMs = Date.now() - startTime;
38
+ logger.error({ tool: 'memory_write', params: input, duration_ms: durationMs, err }, 'MCP tool call failed');
39
+ throw err;
40
+ }
41
+ }
42
+ //# sourceMappingURL=memory-write.handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-write.handler.js","sourceRoot":"","sources":["../../../../src/features/memory-server/tools/memory-write.handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAM/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAE5E,MAAM,MAAM,GAAG,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;AAEzD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAA2B,EAC3B,MAAoB;IAEpB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,gBAAgB,GAAG,UAAU,CAAC;YAClC,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,gBAAgB,EAAE,KAAK,CAAC,WAAW;SACpC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG;YACd,SAAS,EAAE,MAAM,CAAC,UAAU;YAC5B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,SAAS,EAAE,KAAK;SACjB,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QAE1D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAC1C,MAAM,CAAC,IAAI,CACT;YACE,IAAI,EAAE,cAAc;YACpB,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE;YACpD,WAAW,EAAE,UAAU;YACvB,cAAc,EAAE,YAAY,MAAM,CAAC,OAAO,EAAE;SAC7C,EACD,yBAAyB,CAC1B,CAAC;QAEF,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAC1C,MAAM,CAAC,KAAK,CACV,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE,EACrE,sBAAsB,CACvB,CAAC;QACF,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { ParsedNote } from './markdown-parser.js';
2
+ export interface NoteChunk {
3
+ content: string;
4
+ heading: string;
5
+ chunkIndex: number;
6
+ noteMetadata: {
7
+ path: string;
8
+ title: string;
9
+ folder: string;
10
+ tags: string[];
11
+ modified_at: string;
12
+ type: string;
13
+ };
14
+ }
15
+ export declare function chunkNote(parsed: ParsedNote, filePath: string, modifiedAt: Date): NoteChunk[];
16
+ //# sourceMappingURL=chunker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunker.d.ts","sourceRoot":"","sources":["../../../src/features/memory-shared/chunker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAiCD,wBAAgB,SAAS,CACvB,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,IAAI,GACf,SAAS,EAAE,CAqEb"}
@@ -0,0 +1,93 @@
1
+ import * as path from 'node:path';
2
+ const MIN_CHUNK_CHARS = 100;
3
+ const MAX_CHUNK_CHARS = 2000;
4
+ function splitByParagraph(text, maxChars) {
5
+ const paragraphs = text.split(/\n\n+/);
6
+ const parts = [];
7
+ let current = '';
8
+ for (const para of paragraphs) {
9
+ const candidate = current ? `${current}\n\n${para}` : para;
10
+ if (candidate.length <= maxChars) {
11
+ current = candidate;
12
+ }
13
+ else {
14
+ if (current)
15
+ parts.push(current);
16
+ if (para.length <= maxChars) {
17
+ current = para;
18
+ }
19
+ else {
20
+ const chunks = para.match(new RegExp(`.{1,${maxChars}}`, 'gs')) ?? [
21
+ para,
22
+ ];
23
+ const last = chunks.pop();
24
+ parts.push(...chunks);
25
+ current = last;
26
+ }
27
+ }
28
+ }
29
+ if (current)
30
+ parts.push(current);
31
+ return parts;
32
+ }
33
+ export function chunkNote(parsed, filePath, modifiedAt) {
34
+ const { body, frontmatter, title } = parsed;
35
+ const relativePath = filePath;
36
+ const folder = path.dirname(filePath).replace(/^\.\//, '');
37
+ const tags = Array.isArray(frontmatter.tags)
38
+ ? frontmatter.tags.map(String)
39
+ : [];
40
+ const type = typeof frontmatter.type === 'string' ? frontmatter.type : 'note';
41
+ const modified_at = modifiedAt.toISOString();
42
+ const noteMetadata = {
43
+ path: relativePath,
44
+ title,
45
+ folder,
46
+ tags,
47
+ modified_at,
48
+ type,
49
+ };
50
+ const rawSections = body.split(/(?=\n## )/);
51
+ const rawChunks = rawSections.map((section) => {
52
+ const lines = section.trimStart().split('\n');
53
+ const heading = lines[0]?.startsWith('## ')
54
+ ? lines[0].slice(3).trim()
55
+ : '';
56
+ const content = heading
57
+ ? lines.slice(1).join('\n').trim()
58
+ : section.trim();
59
+ return { heading, content };
60
+ });
61
+ const merged = [];
62
+ for (const chunk of rawChunks) {
63
+ const text = chunk.content;
64
+ if (merged.length > 0 &&
65
+ text.length < MIN_CHUNK_CHARS &&
66
+ merged[merged.length - 1].content.length + text.length <= MAX_CHUNK_CHARS) {
67
+ merged[merged.length - 1].content += `\n\n${text}`;
68
+ }
69
+ else {
70
+ merged.push({ ...chunk });
71
+ }
72
+ }
73
+ const finalChunks = [];
74
+ let idx = 0;
75
+ for (const { heading, content } of merged) {
76
+ if (content.length > MAX_CHUNK_CHARS) {
77
+ const subParts = splitByParagraph(content, MAX_CHUNK_CHARS);
78
+ for (const part of subParts) {
79
+ finalChunks.push({
80
+ content: part,
81
+ heading,
82
+ chunkIndex: idx++,
83
+ noteMetadata,
84
+ });
85
+ }
86
+ }
87
+ else {
88
+ finalChunks.push({ content, heading, chunkIndex: idx++, noteMetadata });
89
+ }
90
+ }
91
+ return finalChunks.filter((c) => c.content.length >= MIN_CHUNK_CHARS);
92
+ }
93
+ //# sourceMappingURL=chunker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunker.js","sourceRoot":"","sources":["../../../src/features/memory-shared/chunker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface ParsedNote {
2
+ frontmatter: Record<string, unknown>;
3
+ body: string;
4
+ title: string;
5
+ }
6
+ export declare function parseNote(content: string, filePath: string): ParsedNote;
7
+ //# sourceMappingURL=markdown-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-parser.d.ts","sourceRoot":"","sources":["../../../src/features/memory-shared/markdown-parser.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAsBvE"}
@@ -0,0 +1,24 @@
1
+ import * as path from 'node:path';
2
+ import matter from 'gray-matter';
3
+ export function parseNote(content, filePath) {
4
+ let data = {};
5
+ let body = content;
6
+ try {
7
+ const parsed = matter(content);
8
+ data = parsed.data;
9
+ body = parsed.content;
10
+ }
11
+ catch {
12
+ body = content;
13
+ }
14
+ const h1Match = body.match(/^#\s+(.+)$/m);
15
+ const title = h1Match
16
+ ? h1Match[1].trim()
17
+ : path.basename(filePath, path.extname(filePath));
18
+ return {
19
+ frontmatter: data,
20
+ body: body.trim(),
21
+ title,
22
+ };
23
+ }
24
+ //# sourceMappingURL=markdown-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-parser.js","sourceRoot":"","sources":["../../../src/features/memory-shared/markdown-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,MAAM,MAAM,aAAa,CAAC;AAQjC,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,QAAgB;IACzD,IAAI,IAAI,GAA4B,EAAE,CAAC;IACvC,IAAI,IAAI,GAAG,OAAO,CAAC;IAEnB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,GAAG,MAAM,CAAC,IAA+B,CAAC;QAC9C,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,GAAG,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,OAAO;QACnB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;QACnB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEpD,OAAO;QACL,WAAW,EAAE,IAA+B;QAC5C,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;QACjB,KAAK;KACN,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * vault-path-validator.ts — Validates vault path for security.
3
+ */
4
+ export interface ValidationResult {
5
+ valid: boolean;
6
+ resolvedPath: string;
7
+ errors: string[];
8
+ warnings: string[];
9
+ }
10
+ /**
11
+ * Validates that the vault path is safe and accessible.
12
+ */
13
+ export declare function validateVaultPath(vaultPath: string): Promise<ValidationResult>;
14
+ //# sourceMappingURL=vault-path-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-path-validator.d.ts","sourceRoot":"","sources":["../../../src/features/memory-shared/vault-path-validator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,CAAC,CAoD3B"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * vault-path-validator.ts — Validates vault path for security.
3
+ */
4
+ import * as fs from 'node:fs/promises';
5
+ import * as path from 'node:path';
6
+ /**
7
+ * Validates that the vault path is safe and accessible.
8
+ */
9
+ export async function validateVaultPath(vaultPath) {
10
+ const errors = [];
11
+ const warnings = [];
12
+ // Check for path traversal BEFORE resolving (path.resolve removes .. segments)
13
+ const segments = vaultPath.split(/[/\\]/);
14
+ if (segments.includes('..')) {
15
+ errors.push('path traversal detected');
16
+ }
17
+ // Resolve absolute path
18
+ const resolvedPath = path.resolve(vaultPath);
19
+ if (errors.length > 0) {
20
+ return { valid: false, resolvedPath, errors, warnings };
21
+ }
22
+ // Check if path exists and is accessible
23
+ try {
24
+ await fs.access(resolvedPath);
25
+ }
26
+ catch {
27
+ errors.push('path does not exist or is not accessible');
28
+ return { valid: false, resolvedPath, errors, warnings };
29
+ }
30
+ // Check if it's a directory
31
+ try {
32
+ const stats = await fs.stat(resolvedPath);
33
+ if (!stats.isDirectory()) {
34
+ errors.push('path is not a directory');
35
+ return { valid: false, resolvedPath, errors, warnings };
36
+ }
37
+ }
38
+ catch {
39
+ errors.push('cannot stat path');
40
+ return { valid: false, resolvedPath, errors, warnings };
41
+ }
42
+ // Warn if .obsidian/ directory is absent (not a hard error)
43
+ try {
44
+ await fs.access(path.join(resolvedPath, '.obsidian'));
45
+ }
46
+ catch {
47
+ warnings.push('No .obsidian/ directory found — may not be a valid Obsidian vault');
48
+ }
49
+ return {
50
+ valid: errors.length === 0,
51
+ resolvedPath,
52
+ errors,
53
+ warnings,
54
+ };
55
+ }
56
+ //# sourceMappingURL=vault-path-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-path-validator.js","sourceRoot":"","sources":["../../../src/features/memory-shared/vault-path-validator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AASlC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAiB;IAEjB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,+EAA+E;IAC/E,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACzC,CAAC;IAED,wBAAwB;IACxB,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE7C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC1D,CAAC;IAED,yCAAyC;IACzC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QACxD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC1D,CAAC;IAED,4BAA4B;IAC5B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACvC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC1D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAChC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC1D,CAAC;IAED,4DAA4D;IAC5D,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ,CAAC,IAAI,CACX,mEAAmE,CACpE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,YAAY;QACZ,MAAM;QACN,QAAQ;KACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface ScannedNote {
2
+ absolutePath: string;
3
+ relativePath: string;
4
+ modifiedAt: Date;
5
+ sizeBytes: number;
6
+ }
7
+ export declare function scanVault(vaultPath: string): Promise<ScannedNote[]>;
8
+ //# sourceMappingURL=vault-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-scanner.d.ts","sourceRoot":"","sources":["../../../src/features/memory-shared/vault-scanner.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,IAAI,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA+BzE"}
@@ -0,0 +1,35 @@
1
+ import * as path from 'node:path';
2
+ import * as fs from 'node:fs/promises';
3
+ const IGNORED_DIRS = new Set(['.obsidian', '.trash']);
4
+ export async function scanVault(vaultPath) {
5
+ const notes = [];
6
+ async function walk(dir) {
7
+ let entries;
8
+ try {
9
+ entries = await fs.readdir(dir, { withFileTypes: true });
10
+ }
11
+ catch {
12
+ return;
13
+ }
14
+ for (const entry of entries) {
15
+ const fullPath = path.join(dir, entry.name);
16
+ if (entry.isDirectory()) {
17
+ if (IGNORED_DIRS.has(entry.name))
18
+ continue;
19
+ await walk(fullPath);
20
+ }
21
+ else if (entry.isFile() && entry.name.endsWith('.md')) {
22
+ const stat = await fs.stat(fullPath);
23
+ notes.push({
24
+ absolutePath: fullPath,
25
+ relativePath: path.relative(vaultPath, fullPath),
26
+ modifiedAt: stat.mtime,
27
+ sizeBytes: stat.size,
28
+ });
29
+ }
30
+ }
31
+ }
32
+ await walk(vaultPath);
33
+ return notes;
34
+ }
35
+ //# sourceMappingURL=vault-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-scanner.js","sourceRoot":"","sources":["../../../src/features/memory-shared/vault-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AASvC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,SAAiB;IAC/C,MAAM,KAAK,GAAkB,EAAE,CAAC;IAEhC,KAAK,UAAU,IAAI,CAAC,GAAW;QAC7B,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAE5C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAC3C,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACrC,KAAK,CAAC,IAAI,CAAC;oBACT,YAAY,EAAE,QAAQ;oBACtB,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;oBAChD,UAAU,EAAE,IAAI,CAAC,KAAK;oBACtB,SAAS,EAAE,IAAI,CAAC,IAAI;iBACrB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC;IACtB,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * vault-slug.ts — Generates a unique slug for a vault path.
3
+ */
4
+ /**
5
+ * Generates a deterministic, human-readable slug for a vault path.
6
+ * Used as collection name in ChromaDB.
7
+ */
8
+ export declare function getVaultSlug(vaultPath: string): string;
9
+ //# sourceMappingURL=vault-slug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-slug.d.ts","sourceRoot":"","sources":["../../../src/features/memory-shared/vault-slug.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;GAGG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAOtD"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * vault-slug.ts — Generates a unique slug for a vault path.
3
+ */
4
+ import * as path from 'node:path';
5
+ /**
6
+ * Generates a deterministic, human-readable slug for a vault path.
7
+ * Used as collection name in ChromaDB.
8
+ */
9
+ export function getVaultSlug(vaultPath) {
10
+ const basename = path.basename(vaultPath.replace(/\/+$/, ''));
11
+ const slug = basename
12
+ .toLowerCase()
13
+ .replace(/[^a-z0-9]+/g, '_')
14
+ .replace(/^_+|_+$/g, '');
15
+ return `delfos_${slug}`;
16
+ }
17
+ //# sourceMappingURL=vault-slug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-slug.js","sourceRoot":"","sources":["../../../src/features/memory-shared/vault-slug.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,QAAQ;SAClB,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,OAAO,UAAU,IAAI,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { writeNote } from './vault-writer.js';
2
+ export { formatNote } from './note-formatter.js';
3
+ export type { FormatNoteInput } from './note-formatter.js';
4
+ export { MemoryWriteJobDataSchema, MemoryWriteResultSchema, } from './memory-write.schema.js';
5
+ export type { MemoryWriteJobData, MemoryWriteResult, } from './memory-write.schema.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/memory-write/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EACL,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { writeNote } from './vault-writer.js';
2
+ export { formatNote } from './note-formatter.js';
3
+ export { MemoryWriteJobDataSchema, MemoryWriteResultSchema, } from './memory-write.schema.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/features/memory-write/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EACL,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { z } from 'zod';
2
+ export declare const MemoryWriteJobDataSchema: z.ZodObject<{
3
+ vaultPath: z.ZodString;
4
+ title: z.ZodString;
5
+ content: z.ZodString;
6
+ folder: z.ZodDefault<z.ZodString>;
7
+ tags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
8
+ overwrite: z.ZodDefault<z.ZodBoolean>;
9
+ }, "strip", z.ZodTypeAny, {
10
+ vaultPath: string;
11
+ title: string;
12
+ tags: string[];
13
+ content: string;
14
+ folder: string;
15
+ overwrite: boolean;
16
+ }, {
17
+ vaultPath: string;
18
+ title: string;
19
+ content: string;
20
+ tags?: string[] | undefined;
21
+ folder?: string | undefined;
22
+ overwrite?: boolean | undefined;
23
+ }>;
24
+ export type MemoryWriteJobData = z.infer<typeof MemoryWriteJobDataSchema>;
25
+ export declare const MemoryWriteResultSchema: z.ZodObject<{
26
+ path: z.ZodString;
27
+ created: z.ZodBoolean;
28
+ }, "strip", z.ZodTypeAny, {
29
+ path: string;
30
+ created: boolean;
31
+ }, {
32
+ path: string;
33
+ created: boolean;
34
+ }>;
35
+ export type MemoryWriteResult = z.infer<typeof MemoryWriteResultSchema>;
36
+ //# sourceMappingURL=memory-write.schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-write.schema.d.ts","sourceRoot":"","sources":["../../../src/features/memory-write/memory-write.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;EAOnC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E,eAAO,MAAM,uBAAuB;;;;;;;;;EAGlC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { z } from 'zod';
2
+ export const MemoryWriteJobDataSchema = z.object({
3
+ vaultPath: z.string(),
4
+ title: z.string(),
5
+ content: z.string(),
6
+ folder: z.string().default(''),
7
+ tags: z.array(z.string()).default([]),
8
+ overwrite: z.boolean().default(false),
9
+ });
10
+ export const MemoryWriteResultSchema = z.object({
11
+ path: z.string(),
12
+ created: z.boolean(),
13
+ });
14
+ //# sourceMappingURL=memory-write.schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-write.schema.js","sourceRoot":"","sources":["../../../src/features/memory-write/memory-write.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACrC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACtC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;CACrB,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * note-formatter.ts — Generates Markdown with YAML frontmatter for Obsidian notes.
3
+ */
4
+ export interface FormatNoteInput {
5
+ title: string;
6
+ content: string;
7
+ tags: string[];
8
+ extraFrontmatter?: Record<string, unknown>;
9
+ }
10
+ export declare function formatNote(data: FormatNoteInput): string;
11
+ //# sourceMappingURL=note-formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"note-formatter.d.ts","sourceRoot":"","sources":["../../../src/features/memory-write/note-formatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAkCxD"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * note-formatter.ts — Generates Markdown with YAML frontmatter for Obsidian notes.
3
+ */
4
+ export function formatNote(data) {
5
+ const { title, content, tags, extraFrontmatter } = data;
6
+ // Generate date in YYYY-MM-DD format
7
+ const date = new Date().toISOString().split('T')[0];
8
+ // Build frontmatter object with defaults
9
+ const frontmatter = {
10
+ date,
11
+ type: extraFrontmatter?.type ?? 'note',
12
+ tags,
13
+ source: 'delfos-cli',
14
+ ...extraFrontmatter,
15
+ };
16
+ // Convert frontmatter to YAML
17
+ const yamlLines = ['---'];
18
+ for (const [key, value] of Object.entries(frontmatter)) {
19
+ if (Array.isArray(value)) {
20
+ // Output array as YAML list without quotes for string values
21
+ yamlLines.push(`${key}: [${value.join(', ')}]`);
22
+ }
23
+ else if (typeof value === 'string') {
24
+ yamlLines.push(`${key}: ${value}`);
25
+ }
26
+ else if (typeof value === 'boolean' || typeof value === 'number') {
27
+ yamlLines.push(`${key}: ${value}`);
28
+ }
29
+ else {
30
+ yamlLines.push(`${key}: ${JSON.stringify(value)}`);
31
+ }
32
+ }
33
+ yamlLines.push('---');
34
+ // Combine frontmatter and content
35
+ const frontmatterStr = yamlLines.join('\n');
36
+ return `${frontmatterStr}\n\n# ${title}\n\n${content}`;
37
+ }
38
+ //# sourceMappingURL=note-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"note-formatter.js","sourceRoot":"","sources":["../../../src/features/memory-write/note-formatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,MAAM,UAAU,UAAU,CAAC,IAAqB;IAC9C,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC;IAExD,qCAAqC;IACrC,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpD,yCAAyC;IACzC,MAAM,WAAW,GAA4B;QAC3C,IAAI;QACJ,IAAI,EAAE,gBAAgB,EAAE,IAAI,IAAI,MAAM;QACtC,IAAI;QACJ,MAAM,EAAE,YAAY;QACpB,GAAG,gBAAgB;KACpB,CAAC;IAEF,8BAA8B;IAC9B,MAAM,SAAS,GAAa,CAAC,KAAK,CAAC,CAAC;IACpC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACvD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,6DAA6D;YAC7D,SAAS,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrC,SAAS,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC;QACrC,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnE,SAAS,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IACD,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEtB,kCAAkC;IAClC,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,OAAO,GAAG,cAAc,SAAS,KAAK,OAAO,OAAO,EAAE,CAAC;AACzD,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * vault-writer.ts — Writes Markdown notes to Obsidian vault with path validation.
3
+ */
4
+ import type { MemoryWriteJobData, MemoryWriteResult } from './memory-write.schema.js';
5
+ export declare function writeNote(jobData: MemoryWriteJobData, formattedContent: string): Promise<MemoryWriteResult>;
6
+ //# sourceMappingURL=vault-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-writer.d.ts","sourceRoot":"","sources":["../../../src/features/memory-write/vault-writer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,0BAA0B,CAAC;AAiBlC,wBAAsB,SAAS,CAC7B,OAAO,EAAE,kBAAkB,EAC3B,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,iBAAiB,CAAC,CA+C5B"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * vault-writer.ts — Writes Markdown notes to Obsidian vault with path validation.
3
+ */
4
+ import * as fs from 'node:fs/promises';
5
+ import * as path from 'node:path';
6
+ import { validateVaultPath } from '../memory-shared/vault-path-validator.js';
7
+ function slugify(title) {
8
+ // Convert to lowercase, replace spaces and special chars with hyphens
9
+ const slug = title
10
+ .toLowerCase()
11
+ .normalize('NFD')
12
+ .replace(/[\u0300-\u036f]/g, '') // Remove diacritics
13
+ .replace(/[^a-z0-9\s-]/g, '') // Remove invalid chars
14
+ .trim()
15
+ .replace(/\s+/g, '-') // Replace spaces with hyphens
16
+ .replace(/-+/g, '-'); // Replace multiple hyphens with single
17
+ // Limit to 80 chars
18
+ return slug.substring(0, 80);
19
+ }
20
+ export async function writeNote(jobData, formattedContent) {
21
+ // Step 1: Validate vault path
22
+ const validation = await validateVaultPath(jobData.vaultPath);
23
+ if (!validation.valid) {
24
+ throw new Error(`Invalid vault path: ${validation.errors.join(', ')}`);
25
+ }
26
+ // Step 2: Sanitize title for filename
27
+ const slug = slugify(jobData.title);
28
+ const date = new Date().toISOString().split('T')[0];
29
+ const filename = `${date}-${slug}.md`;
30
+ // Step 3: Calculate target path
31
+ const targetDir = path.join(jobData.vaultPath, jobData.folder);
32
+ const targetPath = path.join(targetDir, filename);
33
+ // Prevent path traversal via folder parameter
34
+ const resolvedTargetDir = path.resolve(targetDir);
35
+ const resolvedVaultPath = path.resolve(jobData.vaultPath);
36
+ if (!resolvedTargetDir.startsWith(resolvedVaultPath)) {
37
+ throw new Error('Invalid folder path: path traversal detected');
38
+ }
39
+ // Step 4: Check if file exists
40
+ let fileExisted = false;
41
+ try {
42
+ await fs.access(targetPath);
43
+ fileExisted = true;
44
+ }
45
+ catch {
46
+ // File doesn't exist
47
+ }
48
+ // Step 5: Skip if overwrite is false and file exists
49
+ if (fileExisted && !jobData.overwrite) {
50
+ const relativePath = path.relative(jobData.vaultPath, targetPath);
51
+ return { path: relativePath, created: false };
52
+ }
53
+ // Step 6: Create directory if needed
54
+ await fs.mkdir(targetDir, { recursive: true });
55
+ // Step 7: Write file
56
+ await fs.writeFile(targetPath, formattedContent, 'utf-8');
57
+ // Step 8: Return result
58
+ const relativePath = path.relative(jobData.vaultPath, targetPath);
59
+ return { path: relativePath, created: !fileExisted };
60
+ }
61
+ //# sourceMappingURL=vault-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-writer.js","sourceRoot":"","sources":["../../../src/features/memory-write/vault-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}