@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
package/README.md ADDED
@@ -0,0 +1,93 @@
1
+ # Delfos CLI
2
+
3
+ CLI oficial do Delfos AI Layers para gerenciamento de memória RAG e autenticação na nuvem.
4
+
5
+ ## Instalação
6
+
7
+ ```bash
8
+ npm install -g @delfos-ai/cli
9
+ ```
10
+
11
+ ## Uso
12
+
13
+ ### Autenticação
14
+
15
+ ```bash
16
+ # Login via navegador (OAuth)
17
+ delfos login --browser
18
+
19
+ # Login com credenciais (API key)
20
+ delfos login --email user@example.com --api-key YOUR_KEY
21
+
22
+ # Logout
23
+ delfos logout
24
+ ```
25
+
26
+ ### Memória RAG
27
+
28
+ ```bash
29
+ # Inicializar vault
30
+ delfos memory init --vault-path ~/my-vault
31
+
32
+ # Indexar vault
33
+ delfos memory index
34
+
35
+ # Buscar notas
36
+ delfos memory read "database decisions"
37
+
38
+ # Criar nota
39
+ delfos memory write "Use PostgreSQL" "## Decision\nWe will use PostgreSQL..." \
40
+ --folder "Projects/my-project/Decisions" \
41
+ --tags "architecture,database"
42
+
43
+ # Status
44
+ delfos memory status
45
+ ```
46
+
47
+ ### MCP Server
48
+
49
+ ```bash
50
+ # Iniciar MCP server
51
+ delfos mcp-server
52
+ ```
53
+
54
+ Configurar no IDE:
55
+ ```json
56
+ // ~/.windsurf/mcp.json
57
+ {
58
+ "mcpServers": {
59
+ "delfos-memory": {
60
+ "command": "delfos",
61
+ "args": ["mcp-server"]
62
+ }
63
+ }
64
+ }
65
+ ```
66
+
67
+ ## Configuração
68
+
69
+ Config armazenada em `~/.delfos/config.json`:
70
+
71
+ ```json
72
+ {
73
+ "apiBaseUrl": "https://api.delfos.ai",
74
+ "token": "eyJhbGciOiJIUzI1NiIs...",
75
+ "userId": "uuid",
76
+ "email": "user@example.com"
77
+ }
78
+ ```
79
+
80
+ ## Requisitos
81
+
82
+ - Node.js 22+
83
+ - npm
84
+
85
+ ## Documentação
86
+
87
+ - [Documentação completa](https://docs.delfos.ai/cli)
88
+ - [Backend API](https://api.delfos.ai/docs)
89
+ - [Repositório](https://github.com/delfos-io/delfos-cli)
90
+
91
+ ## Licença
92
+
93
+ MIT
@@ -0,0 +1,32 @@
1
+ import type { CliConfig } from '../config/cli-config.js';
2
+ export interface LoginResponse {
3
+ access_token: string;
4
+ refresh_token: string;
5
+ }
6
+ export interface ObsidianConnection {
7
+ id: string;
8
+ vault_name: string;
9
+ vault_path: string;
10
+ connection_type: 'mcp' | 'cli';
11
+ sync_status: 'connected' | 'synced' | 'disconnected' | 'error';
12
+ last_sync_at: string | null;
13
+ mcp_server_url: string | null;
14
+ is_active: boolean;
15
+ }
16
+ export interface UpsertConnectionData {
17
+ vault_name: string;
18
+ vault_path: string;
19
+ connection_type: 'mcp' | 'cli';
20
+ sync_status: 'connected' | 'disconnected' | 'error';
21
+ mcp_server_url?: string;
22
+ }
23
+ export declare class DelfosApiClient {
24
+ private readonly config;
25
+ constructor(config: CliConfig);
26
+ login(email: string, password: string): Promise<LoginResponse>;
27
+ createObsidianConnection(data: UpsertConnectionData): Promise<ObsidianConnection>;
28
+ listObsidianConnections(): Promise<ObsidianConnection[]>;
29
+ deleteObsidianConnection(id: string): Promise<void>;
30
+ private apiFetch;
31
+ }
32
+ //# sourceMappingURL=delfos-api.client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delfos-api.client.d.ts","sourceRoot":"","sources":["../../src/api/delfos-api.client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAKzD,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,KAAK,GAAG,KAAK,CAAC;IAC/B,WAAW,EAAE,WAAW,GAAG,QAAQ,GAAG,cAAc,GAAG,OAAO,CAAC;IAC/D,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,KAAK,GAAG,KAAK,CAAC;IAC/B,WAAW,EAAE,WAAW,GAAG,cAAc,GAAG,OAAO,CAAC;IACpD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,SAAS;IAExC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAU9D,wBAAwB,CAC5B,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,kBAAkB,CAAC;IAUxB,uBAAuB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAUxD,wBAAwB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAS3C,QAAQ;CAsBvB"}
@@ -0,0 +1,43 @@
1
+ import { createSliceLogger } from '../infrastructure/logger/index.js';
2
+ const logger = createSliceLogger('delfos-api-client');
3
+ export class DelfosApiClient {
4
+ config;
5
+ constructor(config) {
6
+ this.config = config;
7
+ }
8
+ async login(email, password) {
9
+ const result = await this.apiFetch(this.config.directusUrl, '/auth/login', { method: 'POST', body: JSON.stringify({ email, password }) });
10
+ logger.debug({ email }, 'login successful');
11
+ return result.data;
12
+ }
13
+ async createObsidianConnection(data) {
14
+ const result = await this.apiFetch(this.config.apiBaseUrl, '/api/v1/cli/obsidian-connections', { method: 'POST', body: JSON.stringify(data) }, this.config.token);
15
+ return result.data;
16
+ }
17
+ async listObsidianConnections() {
18
+ const result = await this.apiFetch(this.config.apiBaseUrl, '/api/v1/cli/obsidian-connections', { method: 'GET' }, this.config.token);
19
+ return result.data;
20
+ }
21
+ async deleteObsidianConnection(id) {
22
+ await this.apiFetch(this.config.apiBaseUrl, `/api/v1/cli/obsidian-connections/${id}`, { method: 'DELETE' }, this.config.token);
23
+ }
24
+ async apiFetch(baseUrl, path, init, bearerToken) {
25
+ const url = `${baseUrl}${path}`;
26
+ const res = await fetch(url, {
27
+ ...init,
28
+ headers: {
29
+ 'Content-Type': 'application/json',
30
+ ...(bearerToken ? { Authorization: `Bearer ${bearerToken}` } : {}),
31
+ ...(init?.headers ?? {}),
32
+ },
33
+ });
34
+ if (!res.ok) {
35
+ const body = await res.text().catch(() => '');
36
+ throw new Error(`DelfosApiClient: [${res.status}] ${path}: ${body}`);
37
+ }
38
+ if (res.status === 204)
39
+ return undefined;
40
+ return res.json();
41
+ }
42
+ }
43
+ //# sourceMappingURL=delfos-api.client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delfos-api.client.js","sourceRoot":"","sources":["../../src/api/delfos-api.client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,MAAM,MAAM,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;AA0BtD,MAAM,OAAO,eAAe;IACG;IAA7B,YAA6B,MAAiB;QAAjB,WAAM,GAAN,MAAM,CAAW;IAAG,CAAC;IAElD,KAAK,CAAC,KAAK,CAAC,KAAa,EAAE,QAAgB;QACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAChC,IAAI,CAAC,MAAM,CAAC,WAAW,EACvB,aAAa,EACb,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,CAC9D,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAC5C,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,wBAAwB,CAC5B,IAA0B;QAE1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAChC,IAAI,CAAC,MAAM,CAAC,UAAU,EACtB,kCAAkC,EAClC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAC9C,IAAI,CAAC,MAAM,CAAC,KAAK,CAClB,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,uBAAuB;QAC3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAChC,IAAI,CAAC,MAAM,CAAC,UAAU,EACtB,kCAAkC,EAClC,EAAE,MAAM,EAAE,KAAK,EAAE,EACjB,IAAI,CAAC,MAAM,CAAC,KAAK,CAClB,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,wBAAwB,CAAC,EAAU;QACvC,MAAM,IAAI,CAAC,QAAQ,CACjB,IAAI,CAAC,MAAM,CAAC,UAAU,EACtB,oCAAoC,EAAE,EAAE,EACxC,EAAE,MAAM,EAAE,QAAQ,EAAE,EACpB,IAAI,CAAC,MAAM,CAAC,KAAK,CAClB,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,QAAQ,CACpB,OAAe,EACf,IAAY,EACZ,IAAkB,EAClB,WAAoB;QAEpB,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,IAAI,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,GAAG,IAAI;YACP,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClE,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;aACzB;SACF,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,MAAM,KAAK,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,SAAc,CAAC;QAC9C,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * login.command.ts — CLI command `delfos login`.
3
+ * Authenticates directly with Directus or stores an API key.
4
+ */
5
+ import { Command } from 'commander';
6
+ export interface LoginOptions {
7
+ email?: string;
8
+ password?: string;
9
+ apiKey?: string;
10
+ browser?: boolean;
11
+ timeout?: number;
12
+ }
13
+ export declare const loginCommand: Command;
14
+ export declare function runLogin(options: LoginOptions): Promise<void>;
15
+ //# sourceMappingURL=login.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.command.d.ts","sourceRoot":"","sources":["../../src/commands/login.command.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,YAAY,SAYN,CAAC;AAEpB,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA8DnE"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * login.command.ts — CLI command `delfos login`.
3
+ * Authenticates directly with Directus or stores an API key.
4
+ */
5
+ import { Command } from 'commander';
6
+ import chalk from 'chalk';
7
+ import * as http from 'node:http';
8
+ import { readConfig, writeConfig } from '../config/cli-config.js';
9
+ import { DelfosApiClient } from '../api/delfos-api.client.js';
10
+ import { createSliceLogger } from '../infrastructure/logger/index.js';
11
+ import { generateCodeVerifier, generateCodeChallenge, generateState, } from '../utils/pkce.js';
12
+ import { findAvailablePort } from '../utils/port.js';
13
+ import { storeToken, CONFIG_PATH } from '../utils/config.js';
14
+ const logger = createSliceLogger('login-cli');
15
+ export const loginCommand = new Command('login')
16
+ .description('Authenticate with the Delfos platform')
17
+ .option('--email <email>', 'Email address')
18
+ .option('--password <password>', 'Password')
19
+ .option('--api-key <key>', 'API key (for service accounts and CI)')
20
+ .option('--browser', 'Use browser-based OAuth flow')
21
+ .option('--timeout <seconds>', 'Browser auth timeout in seconds', parseInt, 300)
22
+ .action(runLogin);
23
+ export async function runLogin(options) {
24
+ if (options.browser) {
25
+ await loginWithBrowser(options.timeout ?? 300);
26
+ return;
27
+ }
28
+ try {
29
+ // --api-key mode: store directly, skip Directus auth
30
+ if (options.apiKey) {
31
+ writeConfig({ token: options.apiKey });
32
+ // eslint-disable-next-line no-console
33
+ console.log(chalk.green('✓ API key stored successfully'));
34
+ return;
35
+ }
36
+ // Resolve email + password from flags or interactive prompt
37
+ let email = options.email;
38
+ let password = options.password;
39
+ if (!email || !password) {
40
+ const { default: inquirer } = await import('inquirer');
41
+ const prompts = [];
42
+ if (!email)
43
+ prompts.push({ type: 'input', name: 'email', message: 'Email:' });
44
+ if (!password)
45
+ prompts.push({
46
+ type: 'password',
47
+ name: 'password',
48
+ message: 'Password:',
49
+ });
50
+ const answers = await inquirer.prompt(prompts);
51
+ email = email ?? answers.email;
52
+ password = password ?? answers.password;
53
+ }
54
+ const config = readConfig();
55
+ const client = new DelfosApiClient(config);
56
+ const { access_token } = await client.login(email, password);
57
+ // Fetch user identity from Directus
58
+ const meRes = await fetch(`${config.directusUrl}/users/me`, {
59
+ headers: { Authorization: `Bearer ${access_token}` },
60
+ });
61
+ if (!meRes.ok) {
62
+ throw new Error(`Failed to fetch user info: ${meRes.status}`);
63
+ }
64
+ const { data: user } = (await meRes.json());
65
+ writeConfig({ token: access_token, userId: user.id, email: user.email });
66
+ // eslint-disable-next-line no-console
67
+ console.log(chalk.green('✓ Logged in successfully'));
68
+ }
69
+ catch (err) {
70
+ logger.error({ err }, 'Login failed');
71
+ // eslint-disable-next-line no-console
72
+ console.error(chalk.red('✗ Login failed:'), err instanceof Error ? err.message : String(err));
73
+ process.exit(1);
74
+ }
75
+ }
76
+ async function loginWithBrowser(timeoutSeconds) {
77
+ const verifier = generateCodeVerifier();
78
+ const challenge = generateCodeChallenge(verifier);
79
+ const state = generateState();
80
+ const port = await findAvailablePort(8787);
81
+ const config = readConfig();
82
+ const appUrl = config.appUrl ?? 'https://app.delfos.ai';
83
+ let timer;
84
+ return new Promise((resolve, reject) => {
85
+ const server = http.createServer(async (req, res) => {
86
+ const url = new URL(req.url, `http://localhost:${port}`);
87
+ if (url.pathname !== '/callback') {
88
+ res.writeHead(404);
89
+ res.end();
90
+ return;
91
+ }
92
+ const code = url.searchParams.get('code');
93
+ const returnedState = url.searchParams.get('state');
94
+ const error = url.searchParams.get('error');
95
+ if (error) {
96
+ res.writeHead(302, {
97
+ Location: `${appUrl}/cli-auth/callback?error=${error}`,
98
+ });
99
+ res.end();
100
+ server.close();
101
+ clearTimeout(timer);
102
+ logger.error(chalk.red('Authentication cancelled'));
103
+ reject(new Error(`Authentication cancelled: ${error}`));
104
+ return;
105
+ }
106
+ if (returnedState !== state) {
107
+ res.writeHead(400);
108
+ res.end('Invalid state');
109
+ server.close();
110
+ clearTimeout(timer);
111
+ reject(new Error('CSRF state mismatch'));
112
+ return;
113
+ }
114
+ try {
115
+ const { token, userId, email } = await exchangeCodeForToken(code, verifier);
116
+ storeToken({ token, userId, email });
117
+ res.writeHead(302, {
118
+ Location: `${appUrl}/cli-auth/callback?success=true`,
119
+ });
120
+ res.end();
121
+ server.close(() => {
122
+ clearTimeout(timer);
123
+ logger.info(chalk.green(`✓ Authenticated as ${email}. Token stored at ${CONFIG_PATH}`));
124
+ resolve();
125
+ });
126
+ }
127
+ catch (err) {
128
+ res.writeHead(500);
129
+ res.end('Exchange failed');
130
+ server.close();
131
+ clearTimeout(timer);
132
+ reject(err);
133
+ }
134
+ });
135
+ server.listen(port, '127.0.0.1', () => {
136
+ timer = setTimeout(() => {
137
+ server.close();
138
+ logger.error(`Browser auth timed out after ${timeoutSeconds}s. Run 'delfos login --browser' again.`);
139
+ process.exit(1);
140
+ }, timeoutSeconds * 1000);
141
+ timer.unref();
142
+ const authUrl = `${appUrl}/cli-auth?code_challenge=${challenge}&state=${state}&port=${port}`;
143
+ import('open')
144
+ .then(({ default: open }) => open(authUrl))
145
+ .then(() => logger.info(`Opening browser... If it doesn't open, visit:\n${authUrl}`))
146
+ .catch((err) => logger.error({ err }, 'Failed to open browser'));
147
+ });
148
+ });
149
+ }
150
+ async function exchangeCodeForToken(code, verifier) {
151
+ const config = readConfig();
152
+ const apiBaseUrl = config.apiBaseUrl ?? 'https://api.delfos.ai';
153
+ const res = await fetch(`${apiBaseUrl}/api/v1/cli/auth/exchange`, {
154
+ method: 'POST',
155
+ headers: { 'Content-Type': 'application/json' },
156
+ body: JSON.stringify({ code, code_verifier: verifier }),
157
+ });
158
+ if (!res.ok) {
159
+ const body = await res.text();
160
+ throw new Error(`Exchange failed [${res.status}]: ${body}`);
161
+ }
162
+ return res.json();
163
+ }
164
+ //# sourceMappingURL=login.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.command.js","sourceRoot":"","sources":["../../src/commands/login.command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * logout.command.ts — CLI command `delfos logout`.
3
+ * Removes the stored token from ~/.delfos/config.json after confirmation.
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare const logoutCommand: Command;
7
+ export declare function runLogout(): Promise<void>;
8
+ //# sourceMappingURL=logout.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.command.d.ts","sourceRoot":"","sources":["../../src/commands/logout.command.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,aAAa,SAEN,CAAC;AAErB,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAuC/C"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * logout.command.ts — CLI command `delfos logout`.
3
+ * Removes the stored token from ~/.delfos/config.json after confirmation.
4
+ */
5
+ import { Command } from 'commander';
6
+ import chalk from 'chalk';
7
+ import { readConfig, writeConfig } from '../config/cli-config.js';
8
+ import { createSliceLogger } from '../infrastructure/logger/index.js';
9
+ const logger = createSliceLogger('logout-cli');
10
+ export const logoutCommand = new Command('logout')
11
+ .description('Log out from the Delfos platform')
12
+ .action(runLogout);
13
+ export async function runLogout() {
14
+ try {
15
+ const config = readConfig();
16
+ if (!config.token) {
17
+ // eslint-disable-next-line no-console
18
+ console.log(chalk.yellow('You are not currently logged in'));
19
+ return;
20
+ }
21
+ const { default: inquirer } = await import('inquirer');
22
+ const { confirmed } = await inquirer.prompt([
23
+ {
24
+ type: 'confirm',
25
+ name: 'confirmed',
26
+ message: 'Are you sure you want to log out?',
27
+ default: true,
28
+ },
29
+ ]);
30
+ if (!confirmed) {
31
+ // eslint-disable-next-line no-console
32
+ console.log(chalk.gray('Logout cancelled'));
33
+ return;
34
+ }
35
+ writeConfig({ token: undefined, userId: undefined });
36
+ // eslint-disable-next-line no-console
37
+ console.log(chalk.green('✓ Logged out successfully'));
38
+ }
39
+ catch (err) {
40
+ logger.error({ err }, 'Logout failed');
41
+ // eslint-disable-next-line no-console
42
+ console.error(chalk.red('✗ Logout failed:'), err instanceof Error ? err.message : String(err));
43
+ process.exit(1);
44
+ }
45
+ }
46
+ //# sourceMappingURL=logout.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.command.js","sourceRoot":"","sources":["../../src/commands/logout.command.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,MAAM,MAAM,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;AAE/C,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,SAAS,CAAC,CAAC;AAErB,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAE5B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QACvD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YAC1C;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,mCAAmC;gBAC5C,OAAO,EAAE,IAAI;aACd;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,WAAW,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAErD,sCAAsC;QACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC;QACvC,sCAAsC;QACtC,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAC7B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CACjD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * mcp-memory.command.ts — CLI command `delfos mcp memory`.
3
+ * Starts the delfos-memory MCP server.
4
+ */
5
+ import { Command } from 'commander';
6
+ export interface McpMemoryOptions {
7
+ vaultPath?: string;
8
+ }
9
+ export declare const mcpMemoryCommand: Command;
10
+ export declare function runMcpMemory(options: McpMemoryOptions): Promise<void>;
11
+ //# sourceMappingURL=mcp-memory.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-memory.command.d.ts","sourceRoot":"","sources":["../../../src/commands/mcp/mcp-memory.command.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,gBAAgB,SAGN,CAAC;AAExB,wBAAsB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAO3E"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * mcp-memory.command.ts — CLI command `delfos mcp memory`.
3
+ * Starts the delfos-memory MCP server.
4
+ */
5
+ import { Command } from 'commander';
6
+ import { startMemoryServer } from '../../features/memory-server/memory-server.js';
7
+ import { createSliceLogger } from '../../infrastructure/logger/index.js';
8
+ const logger = createSliceLogger('mcp-memory-cli');
9
+ export const mcpMemoryCommand = new Command('memory')
10
+ .description('Start the delfos-memory MCP server')
11
+ .option('--vault-path <path>', 'Vault path (default: current directory)')
12
+ .action(runMcpMemory);
13
+ export async function runMcpMemory(options) {
14
+ try {
15
+ await startMemoryServer(options.vaultPath);
16
+ }
17
+ catch (err) {
18
+ logger.error({ err }, 'MCP memory server failed to start');
19
+ process.exit(1);
20
+ }
21
+ }
22
+ //# sourceMappingURL=mcp-memory.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-memory.command.js","sourceRoot":"","sources":["../../../src/commands/mcp/mcp-memory.command.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAEzE,MAAM,MAAM,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;AAMnD,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAClD,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,qBAAqB,EAAE,yCAAyC,CAAC;KACxE,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAyB;IAC1D,IAAI,CAAC;QACH,MAAM,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,mCAAmC,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const memoryCommand: Command;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/memory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,aAAa,SAMQ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { Command } from 'commander';
2
+ import { memoryInitCommand } from './memory-init.command.js';
3
+ import { memoryIndexCommand } from './memory-index.command.js';
4
+ import { memoryReadCommand } from './memory-read.command.js';
5
+ import { memoryWriteCommand } from './memory-write.command.js';
6
+ import { memoryStatusCommand } from './memory-status.command.js';
7
+ export const memoryCommand = new Command('memory')
8
+ .description('Manage Delfos memory — index, read, write, init, and status')
9
+ .addCommand(memoryInitCommand)
10
+ .addCommand(memoryIndexCommand)
11
+ .addCommand(memoryReadCommand)
12
+ .addCommand(memoryWriteCommand)
13
+ .addCommand(memoryStatusCommand);
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/memory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,6DAA6D,CAAC;KAC1E,UAAU,CAAC,iBAAiB,CAAC;KAC7B,UAAU,CAAC,kBAAkB,CAAC;KAC9B,UAAU,CAAC,iBAAiB,CAAC;KAC7B,UAAU,CAAC,kBAAkB,CAAC;KAC9B,UAAU,CAAC,mBAAmB,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const memoryIndexCommand: Command;
3
+ //# sourceMappingURL=memory-index.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-index.command.d.ts","sourceRoot":"","sources":["../../../src/commands/memory/memory-index.command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,eAAO,MAAM,kBAAkB,SA6D3B,CAAC"}
@@ -0,0 +1,57 @@
1
+ import { Command } from 'commander';
2
+ import { readConfig } from '../../config/cli-config.js';
3
+ import { chromaDBAdapter } from '../../infrastructure/vector-db/chroma.adapter.js';
4
+ import { localEmbeddingProvider } from '../../infrastructure/embeddings/local-embedding.provider.js';
5
+ import { indexVault } from '../../features/memory-index/vault-indexer.js';
6
+ import { loadMemoryConfig } from '../../features/memory-server/config-loader.js';
7
+ import { createSliceLogger } from '../../infrastructure/logger/index.js';
8
+ const logger = createSliceLogger('memory-index-command');
9
+ export const memoryIndexCommand = new Command('index')
10
+ .description('Index an Obsidian vault into ChromaDB')
11
+ .option('--mode <mode>', 'Index mode: full or incremental', 'incremental')
12
+ .option('--vault-path <path>', 'Override vault path from config')
13
+ .action(async (options) => {
14
+ try {
15
+ const rawMode = options.mode ?? 'incremental';
16
+ if (rawMode !== 'full' && rawMode !== 'incremental') {
17
+ console.error(`Invalid --mode value: "${rawMode}". Must be "full" or "incremental".`);
18
+ process.exit(1);
19
+ }
20
+ const mode = rawMode;
21
+ const vaultPath = options.vaultPath;
22
+ const memoryConfig = await loadMemoryConfig(vaultPath);
23
+ const cliPersistDir = readConfig().chromaPersistDir;
24
+ const config = cliPersistDir
25
+ ? {
26
+ ...memoryConfig,
27
+ vector_db: {
28
+ ...memoryConfig.vector_db,
29
+ persist_dir: cliPersistDir,
30
+ },
31
+ }
32
+ : memoryConfig;
33
+ console.log(`Indexing vault: ${config.vault_path} (mode: ${mode})`);
34
+ const startTime = Date.now();
35
+ const result = await indexVault(config, mode, chromaDBAdapter, localEmbeddingProvider);
36
+ const duration = ((Date.now() - startTime) / 1000).toFixed(1);
37
+ console.log(`✓ Scanned ${result.total_notes} notes`);
38
+ console.log(`✓ ${result.indexed} notes modified since last index`);
39
+ console.log(`✓ ${result.skipped} notes skipped`);
40
+ if (result.errors > 0) {
41
+ console.warn(`⚠ ${result.errors} notes failed to index`);
42
+ }
43
+ else {
44
+ console.log('✓ 0 errors');
45
+ }
46
+ console.log(`Indexed ${result.indexed} notes in ${duration}s`);
47
+ if (result.errors > 0) {
48
+ process.exit(1);
49
+ }
50
+ }
51
+ catch (err) {
52
+ logger.error({ err }, 'Indexing failed');
53
+ console.error('Indexing failed:', err instanceof Error ? err.message : String(err));
54
+ process.exit(1);
55
+ }
56
+ });
57
+ //# sourceMappingURL=memory-index.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-index.command.js","sourceRoot":"","sources":["../../../src/commands/memory/memory-index.command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const memoryInitCommand: Command;
3
+ //# sourceMappingURL=memory-init.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-init.command.d.ts","sourceRoot":"","sources":["../../../src/commands/memory/memory-init.command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC,eAAO,MAAM,iBAAiB,SA6F1B,CAAC"}