vault-forge 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +336 -0
  3. package/dist/actions/dummy.d.ts +2 -0
  4. package/dist/actions/dummy.d.ts.map +1 -0
  5. package/dist/actions/dummy.js +3 -0
  6. package/dist/actions/dummy.js.map +1 -0
  7. package/dist/actions/mainAction.d.ts +5 -0
  8. package/dist/actions/mainAction.d.ts.map +1 -0
  9. package/dist/actions/mainAction.js +68 -0
  10. package/dist/actions/mainAction.js.map +1 -0
  11. package/dist/commands/ai.d.ts +3 -0
  12. package/dist/commands/ai.d.ts.map +1 -0
  13. package/dist/commands/ai.js +20 -0
  14. package/dist/commands/ai.js.map +1 -0
  15. package/dist/commands/ask.d.ts +3 -0
  16. package/dist/commands/ask.d.ts.map +1 -0
  17. package/dist/commands/ask.js +15 -0
  18. package/dist/commands/ask.js.map +1 -0
  19. package/dist/commands/completion.d.ts +34 -0
  20. package/dist/commands/completion.d.ts.map +1 -0
  21. package/dist/commands/completion.js +134 -0
  22. package/dist/commands/completion.js.map +1 -0
  23. package/dist/commands/diary.d.ts +3 -0
  24. package/dist/commands/diary.d.ts.map +1 -0
  25. package/dist/commands/diary.js +15 -0
  26. package/dist/commands/diary.js.map +1 -0
  27. package/dist/commands/dummy.d.ts +2 -0
  28. package/dist/commands/dummy.d.ts.map +1 -0
  29. package/dist/commands/dummy.js +3 -0
  30. package/dist/commands/dummy.js.map +1 -0
  31. package/dist/commands/find.d.ts +2 -0
  32. package/dist/commands/find.d.ts.map +1 -0
  33. package/dist/commands/find.js +3 -0
  34. package/dist/commands/find.js.map +1 -0
  35. package/dist/commands/init.d.ts +3 -0
  36. package/dist/commands/init.d.ts.map +1 -0
  37. package/dist/commands/init.js +46 -0
  38. package/dist/commands/init.js.map +1 -0
  39. package/dist/commands/search.d.ts +3 -0
  40. package/dist/commands/search.d.ts.map +1 -0
  41. package/dist/commands/search.js +29 -0
  42. package/dist/commands/search.js.map +1 -0
  43. package/dist/commands/tag.d.ts +3 -0
  44. package/dist/commands/tag.d.ts.map +1 -0
  45. package/dist/commands/tag.js +37 -0
  46. package/dist/commands/tag.js.map +1 -0
  47. package/dist/config/locales/en.d.ts +188 -0
  48. package/dist/config/locales/en.d.ts.map +1 -0
  49. package/dist/config/locales/en.js +190 -0
  50. package/dist/config/locales/en.js.map +1 -0
  51. package/dist/config/locales/ja.d.ts +188 -0
  52. package/dist/config/locales/ja.d.ts.map +1 -0
  53. package/dist/config/locales/ja.js +190 -0
  54. package/dist/config/locales/ja.js.map +1 -0
  55. package/dist/config/prompts/en.d.ts +6 -0
  56. package/dist/config/prompts/en.d.ts.map +1 -0
  57. package/dist/config/prompts/en.js +25 -0
  58. package/dist/config/prompts/en.js.map +1 -0
  59. package/dist/config/prompts/ja.d.ts +6 -0
  60. package/dist/config/prompts/ja.d.ts.map +1 -0
  61. package/dist/config/prompts/ja.js +25 -0
  62. package/dist/config/prompts/ja.js.map +1 -0
  63. package/dist/config/text.d.ts +195 -0
  64. package/dist/config/text.d.ts.map +1 -0
  65. package/dist/config/text.js +15 -0
  66. package/dist/config/text.js.map +1 -0
  67. package/dist/core/PromptLoader.d.ts +30 -0
  68. package/dist/core/PromptLoader.d.ts.map +1 -0
  69. package/dist/core/PromptLoader.js +187 -0
  70. package/dist/core/PromptLoader.js.map +1 -0
  71. package/dist/core/PromptSmith.d.ts +21 -0
  72. package/dist/core/PromptSmith.d.ts.map +1 -0
  73. package/dist/core/PromptSmith.js +197 -0
  74. package/dist/core/PromptSmith.js.map +1 -0
  75. package/dist/core/VaultForge.d.ts +17 -0
  76. package/dist/core/VaultForge.d.ts.map +1 -0
  77. package/dist/core/VaultForge.js +75 -0
  78. package/dist/core/VaultForge.js.map +1 -0
  79. package/dist/index.d.ts +3 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +28 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/lib/completion.d.ts +8 -0
  84. package/dist/lib/completion.d.ts.map +1 -0
  85. package/dist/lib/completion.js +55 -0
  86. package/dist/lib/completion.js.map +1 -0
  87. package/dist/lib/dummy.d.ts +2 -0
  88. package/dist/lib/dummy.d.ts.map +1 -0
  89. package/dist/lib/dummy.js +3 -0
  90. package/dist/lib/dummy.js.map +1 -0
  91. package/dist/lib/mainAction.d.ts +8 -0
  92. package/dist/lib/mainAction.d.ts.map +1 -0
  93. package/dist/lib/mainAction.js +126 -0
  94. package/dist/lib/mainAction.js.map +1 -0
  95. package/dist/lib/search.d.ts +4 -0
  96. package/dist/lib/search.d.ts.map +1 -0
  97. package/dist/lib/search.js +87 -0
  98. package/dist/lib/search.js.map +1 -0
  99. package/dist/lib/stdin.d.ts +10 -0
  100. package/dist/lib/stdin.d.ts.map +1 -0
  101. package/dist/lib/stdin.js +20 -0
  102. package/dist/lib/stdin.js.map +1 -0
  103. package/dist/services/AIModelService.d.ts +33 -0
  104. package/dist/services/AIModelService.d.ts.map +1 -0
  105. package/dist/services/AIModelService.js +116 -0
  106. package/dist/services/AIModelService.js.map +1 -0
  107. package/dist/services/AIOrchestratorService.d.ts +57 -0
  108. package/dist/services/AIOrchestratorService.d.ts.map +1 -0
  109. package/dist/services/AIOrchestratorService.js +164 -0
  110. package/dist/services/AIOrchestratorService.js.map +1 -0
  111. package/dist/services/ConfigService.d.ts +61 -0
  112. package/dist/services/ConfigService.d.ts.map +1 -0
  113. package/dist/services/ConfigService.js +132 -0
  114. package/dist/services/ConfigService.js.map +1 -0
  115. package/dist/services/ObsidianService.d.ts +97 -0
  116. package/dist/services/ObsidianService.d.ts.map +1 -0
  117. package/dist/services/ObsidianService.js +264 -0
  118. package/dist/services/ObsidianService.js.map +1 -0
  119. package/dist/services/TagService.d.ts +26 -0
  120. package/dist/services/TagService.d.ts.map +1 -0
  121. package/dist/services/TagService.js +73 -0
  122. package/dist/services/TagService.js.map +1 -0
  123. package/dist/services/UserInteraction.d.ts +100 -0
  124. package/dist/services/UserInteraction.d.ts.map +1 -0
  125. package/dist/services/UserInteraction.js +169 -0
  126. package/dist/services/UserInteraction.js.map +1 -0
  127. package/dist/services/XService.d.ts +15 -0
  128. package/dist/services/XService.d.ts.map +1 -0
  129. package/dist/services/XService.js +40 -0
  130. package/dist/services/XService.js.map +1 -0
  131. package/dist/services/ai/AIServiceFactory.d.ts +26 -0
  132. package/dist/services/ai/AIServiceFactory.d.ts.map +1 -0
  133. package/dist/services/ai/AIServiceFactory.js +69 -0
  134. package/dist/services/ai/AIServiceFactory.js.map +1 -0
  135. package/dist/services/ai/ClaudeService.d.ts +9 -0
  136. package/dist/services/ai/ClaudeService.d.ts.map +1 -0
  137. package/dist/services/ai/ClaudeService.js +59 -0
  138. package/dist/services/ai/ClaudeService.js.map +1 -0
  139. package/dist/services/ai/GeminiService.d.ts +9 -0
  140. package/dist/services/ai/GeminiService.d.ts.map +1 -0
  141. package/dist/services/ai/GeminiService.js +46 -0
  142. package/dist/services/ai/GeminiService.js.map +1 -0
  143. package/dist/services/ai/GroqService.d.ts +9 -0
  144. package/dist/services/ai/GroqService.d.ts.map +1 -0
  145. package/dist/services/ai/GroqService.js +53 -0
  146. package/dist/services/ai/GroqService.js.map +1 -0
  147. package/dist/services/ai/MockAIService.d.ts +8 -0
  148. package/dist/services/ai/MockAIService.d.ts.map +1 -0
  149. package/dist/services/ai/MockAIService.js +24 -0
  150. package/dist/services/ai/MockAIService.js.map +1 -0
  151. package/dist/services/ai/OpenAIService.d.ts +9 -0
  152. package/dist/services/ai/OpenAIService.d.ts.map +1 -0
  153. package/dist/services/ai/OpenAIService.js +51 -0
  154. package/dist/services/ai/OpenAIService.js.map +1 -0
  155. package/dist/strategies/BaseStrategy.d.ts +36 -0
  156. package/dist/strategies/BaseStrategy.d.ts.map +1 -0
  157. package/dist/strategies/BaseStrategy.js +110 -0
  158. package/dist/strategies/BaseStrategy.js.map +1 -0
  159. package/dist/strategies/DebugStrategy.d.ts +13 -0
  160. package/dist/strategies/DebugStrategy.d.ts.map +1 -0
  161. package/dist/strategies/DebugStrategy.js +16 -0
  162. package/dist/strategies/DebugStrategy.js.map +1 -0
  163. package/dist/strategies/DiaryStrategy.d.ts +19 -0
  164. package/dist/strategies/DiaryStrategy.d.ts.map +1 -0
  165. package/dist/strategies/DiaryStrategy.js +69 -0
  166. package/dist/strategies/DiaryStrategy.js.map +1 -0
  167. package/dist/strategies/GeneralStrategy.d.ts +8 -0
  168. package/dist/strategies/GeneralStrategy.d.ts.map +1 -0
  169. package/dist/strategies/GeneralStrategy.js +11 -0
  170. package/dist/strategies/GeneralStrategy.js.map +1 -0
  171. package/dist/strategies/InitStrategy.d.ts +19 -0
  172. package/dist/strategies/InitStrategy.d.ts.map +1 -0
  173. package/dist/strategies/InitStrategy.js +122 -0
  174. package/dist/strategies/InitStrategy.js.map +1 -0
  175. package/dist/strategies/SearchStrategy.d.ts +19 -0
  176. package/dist/strategies/SearchStrategy.d.ts.map +1 -0
  177. package/dist/strategies/SearchStrategy.js +112 -0
  178. package/dist/strategies/SearchStrategy.js.map +1 -0
  179. package/dist/strategies/XPostStrategy.d.ts +27 -0
  180. package/dist/strategies/XPostStrategy.d.ts.map +1 -0
  181. package/dist/strategies/XPostStrategy.js +119 -0
  182. package/dist/strategies/XPostStrategy.js.map +1 -0
  183. package/dist/templates/completion.bash +24 -0
  184. package/dist/templates/dailyNote.d.ts +2 -0
  185. package/dist/templates/dailyNote.d.ts.map +1 -0
  186. package/dist/templates/dailyNote.js +8 -0
  187. package/dist/templates/dailyNote.js.map +1 -0
  188. package/dist/templates/defaultPrompt.d.ts +2 -0
  189. package/dist/templates/defaultPrompt.d.ts.map +1 -0
  190. package/dist/templates/defaultPrompt.js +28 -0
  191. package/dist/templates/defaultPrompt.js.map +1 -0
  192. package/dist/templates/obsidianNote.d.ts +3 -0
  193. package/dist/templates/obsidianNote.d.ts.map +1 -0
  194. package/dist/templates/obsidianNote.js +17 -0
  195. package/dist/templates/obsidianNote.js.map +1 -0
  196. package/dist/templates/tokenUsage.d.ts +20 -0
  197. package/dist/templates/tokenUsage.d.ts.map +1 -0
  198. package/dist/templates/tokenUsage.js +50 -0
  199. package/dist/templates/tokenUsage.js.map +1 -0
  200. package/dist/test-tabtab.d.ts +2 -0
  201. package/dist/test-tabtab.d.ts.map +1 -0
  202. package/dist/test-tabtab.js +50 -0
  203. package/dist/test-tabtab.js.map +1 -0
  204. package/dist/types/constants.d.ts +16 -0
  205. package/dist/types/constants.d.ts.map +1 -0
  206. package/dist/types/constants.js +14 -0
  207. package/dist/types/constants.js.map +1 -0
  208. package/dist/types/interfaces.d.ts +56 -0
  209. package/dist/types/interfaces.d.ts.map +1 -0
  210. package/dist/types/interfaces.js +6 -0
  211. package/dist/types/interfaces.js.map +1 -0
  212. package/dist/types/schemas.d.ts +18 -0
  213. package/dist/types/schemas.d.ts.map +1 -0
  214. package/dist/types/schemas.js +13 -0
  215. package/dist/types/schemas.js.map +1 -0
  216. package/dist/utils/completion.d.ts +8 -0
  217. package/dist/utils/completion.d.ts.map +1 -0
  218. package/dist/utils/completion.js +58 -0
  219. package/dist/utils/completion.js.map +1 -0
  220. package/dist/utils/dummy.d.ts +2 -0
  221. package/dist/utils/dummy.d.ts.map +1 -0
  222. package/dist/utils/dummy.js +3 -0
  223. package/dist/utils/dummy.js.map +1 -0
  224. package/package.json +55 -0
@@ -0,0 +1,87 @@
1
+ import { ObsidianService } from '../services/ObsidianService.js';
2
+ import { ConfigService } from '../services/ConfigService.js';
3
+ import { TEXT } from '../config/text.js';
4
+ import { select, isCancel, cancel } from '@clack/prompts';
5
+ import { exec } from 'child_process';
6
+ import { promisify } from 'util';
7
+ import * as path from 'path';
8
+ const execAsync = promisify(exec);
9
+ async function checkRipgrepAvailability() {
10
+ try {
11
+ await execAsync('rg --version');
12
+ return true;
13
+ }
14
+ catch (e) {
15
+ return false;
16
+ }
17
+ }
18
+ export async function search(query, obsidian, config) {
19
+ const hasRipgrep = await checkRipgrepAvailability();
20
+ if (hasRipgrep) {
21
+ await searchWithRipgrep(query, obsidian, config);
22
+ }
23
+ else {
24
+ await searchWithObsidianUri(query, obsidian);
25
+ }
26
+ }
27
+ async function searchWithRipgrep(query, obsidian, config) {
28
+ const vaultPath = obsidian.getVaultPath();
29
+ console.log(TEXT.logs.searchingWithRipgrep.replace('{query}', query));
30
+ try {
31
+ const { stdout } = await execAsync(`rg -i --vimgrep -g '*.md' "${query}" "${vaultPath}"`);
32
+ const lines = stdout.split('\n').filter(line => line.trim() !== '');
33
+ if (lines.length === 0) {
34
+ console.log(TEXT.logs.noResultsFound);
35
+ return;
36
+ }
37
+ const choices = lines.map(line => {
38
+ const parts = line.split(':');
39
+ if (parts.length < 4)
40
+ return null;
41
+ const filePath = parts[0];
42
+ const lineNum = parts[1];
43
+ const content = parts.slice(3).join(':').trim();
44
+ if (!filePath)
45
+ return null;
46
+ const relativePath = filePath.replace(vaultPath + '/', '');
47
+ return {
48
+ name: `${relativePath}:${lineNum} ${content.substring(0, 60)}...`,
49
+ value: filePath,
50
+ description: content
51
+ };
52
+ }).filter(c => c !== null);
53
+ const selectedFile = await select({
54
+ message: TEXT.ui.searchResultsFound.replace('{count}', choices.length.toString()),
55
+ options: choices,
56
+ });
57
+ if (isCancel(selectedFile)) {
58
+ cancel(TEXT.ui.operationCancelled);
59
+ return;
60
+ }
61
+ if (config.editor) {
62
+ await obsidian.openFileInEditor(selectedFile);
63
+ }
64
+ else {
65
+ await obsidian.openFileInObsidian(selectedFile);
66
+ }
67
+ }
68
+ catch (e) {
69
+ if (e.code === 1) {
70
+ console.log(TEXT.logs.noResultsFound);
71
+ }
72
+ else {
73
+ console.error(`${TEXT.errors.searchError} ${e.message}`);
74
+ }
75
+ }
76
+ }
77
+ async function searchWithObsidianUri(query, obsidian) {
78
+ const vaultPath = obsidian.getVaultPath();
79
+ console.log(TEXT.logs.ripgrepNotFoundOpeningObsidian);
80
+ const vaultName = path.basename(vaultPath);
81
+ const encodedQuery = encodeURIComponent(query);
82
+ const uri = `obsidian://search?vault=${vaultName}&query=${encodedQuery}`;
83
+ const openCommand = process.platform === 'darwin' ? 'open'
84
+ : (process.platform === 'win32' ? 'start' : 'xdg-open');
85
+ await execAsync(`${openCommand} "${uri}"`);
86
+ }
87
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/lib/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 標準入力からすべてのデータを読み込み、データとパイプ入力かどうかのフラグ
3
+ * Reads all data from standard input and returns the data and whether it's piped or not.
4
+ * @returns {Promise<{ data: string, isPiped: boolean }>}
5
+ */
6
+ export declare function readStdin(): Promise<{
7
+ data: string;
8
+ isPiped: boolean;
9
+ }>;
10
+ //# sourceMappingURL=stdin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdin.d.ts","sourceRoot":"","sources":["../../src/lib/stdin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAe7E"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * 標準入力からすべてのデータを読み込み、データとパイプ入力かどうかのフラグ
3
+ * Reads all data from standard input and returns the data and whether it's piped or not.
4
+ * @returns {Promise<{ data: string, isPiped: boolean }>}
5
+ */
6
+ export async function readStdin() {
7
+ const isPiped = !process.stdin.isTTY;
8
+ if (!isPiped) {
9
+ return { data: "", isPiped: false };
10
+ }
11
+ const chunks = [];
12
+ for await (const chunk of process.stdin) {
13
+ chunks.push(Buffer.from(chunk));
14
+ }
15
+ return {
16
+ data: Buffer.concat(chunks).toString('utf-8'),
17
+ isPiped: true
18
+ };
19
+ }
20
+ //# sourceMappingURL=stdin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdin.js","sourceRoot":"","sources":["../../src/lib/stdin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC3B,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;IAErC,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,OAAO;QACH,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC7C,OAAO,EAAE,IAAI;KAChB,CAAC;AACN,CAAC"}
@@ -0,0 +1,33 @@
1
+ export declare class AIModelService {
2
+ private modelsPath;
3
+ private templatePath;
4
+ constructor(vaultPath: string);
5
+ /**
6
+ * ai-models.jsonを初期化する
7
+ * @returns true if a new file was created
8
+ */
9
+ initialize(): Promise<boolean>;
10
+ /**
11
+ * 指定されたプロバイダーのモデルリストを取得する
12
+ * Gets the list of models for the specified provider.
13
+ */
14
+ getModels(provider: string): Promise<string[]>;
15
+ /**
16
+ * 新しいモデルを追加する
17
+ * Adds a new model.
18
+ */
19
+ addModel(provider: string, model: string): Promise<void>;
20
+ /**
21
+ * モデルを削除する
22
+ * Removes a model.
23
+ */
24
+ removeModel(provider: string, model: string): Promise<void>;
25
+ /**
26
+ * モデル名からプロバイダーを推測する
27
+ * Infers the provider from the model name.
28
+ */
29
+ inferProvider(modelName: string): Promise<string | null>;
30
+ private loadAllModels;
31
+ private saveAllModels;
32
+ }
33
+ //# sourceMappingURL=AIModelService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIModelService.d.ts","sourceRoot":"","sources":["../../src/services/AIModelService.ts"],"names":[],"mappings":"AAKA,qBAAa,cAAc;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAS;gBAEjB,SAAS,EAAE,MAAM;IAW7B;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAUpC;;;OAGG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAMpD;;;OAGG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa9D;;;OAGG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYjE;;;OAGG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YAoBhD,aAAa;YAiBb,aAAa;CAK9B"}
@@ -0,0 +1,116 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ import { AIProvider } from '../types/constants.js';
5
+ export class AIModelService {
6
+ modelsPath;
7
+ templatePath;
8
+ constructor(vaultPath) {
9
+ this.modelsPath = path.join(vaultPath, '_AI_Prompts', 'ai-models.json');
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = path.dirname(__filename);
12
+ // src/config/ai-models.json へのパス (ビルド後の構成に依存)
13
+ // 注意: index.ts での修正に合わせて、ここも .ts ファイルからのインポートに変更するのが理想だが、
14
+ // 今回は既存のパス解決ロジックを踏襲しつつ、inferProvider を追加する
15
+ this.templatePath = path.join(__dirname, '../config/ai-models.json');
16
+ }
17
+ /**
18
+ * ai-models.jsonを初期化する
19
+ * @returns true if a new file was created
20
+ */
21
+ async initialize() {
22
+ try {
23
+ await fs.access(this.modelsPath);
24
+ return false;
25
+ }
26
+ catch (e) {
27
+ await this.loadAllModels();
28
+ return true;
29
+ }
30
+ }
31
+ /**
32
+ * 指定されたプロバイダーのモデルリストを取得する
33
+ * Gets the list of models for the specified provider.
34
+ */
35
+ async getModels(provider) {
36
+ const allModels = await this.loadAllModels();
37
+ const models = allModels[provider] || [];
38
+ return models.filter(model => model !== '');
39
+ }
40
+ /**
41
+ * 新しいモデルを追加する
42
+ * Adds a new model.
43
+ */
44
+ async addModel(provider, model) {
45
+ const allModels = await this.loadAllModels();
46
+ if (!allModels[provider]) {
47
+ allModels[provider] = [];
48
+ }
49
+ if (!allModels[provider].includes(model)) {
50
+ allModels[provider].push(model);
51
+ await this.saveAllModels(allModels);
52
+ }
53
+ }
54
+ /**
55
+ * モデルを削除する
56
+ * Removes a model.
57
+ */
58
+ async removeModel(provider, model) {
59
+ const allModels = await this.loadAllModels();
60
+ if (allModels[provider]) {
61
+ const index = allModels[provider].indexOf(model);
62
+ if (index > -1) {
63
+ allModels[provider].splice(index, 1);
64
+ await this.saveAllModels(allModels);
65
+ }
66
+ }
67
+ }
68
+ /**
69
+ * モデル名からプロバイダーを推測する
70
+ * Infers the provider from the model name.
71
+ */
72
+ async inferProvider(modelName) {
73
+ const allModels = await this.loadAllModels();
74
+ // 1. 完全一致チェック
75
+ for (const [provider, models] of Object.entries(allModels)) {
76
+ if (Array.isArray(models) && models.includes(modelName)) {
77
+ return provider;
78
+ }
79
+ }
80
+ // 2. プレフィックスによる推測
81
+ const lowerName = modelName.toLowerCase();
82
+ if (lowerName.startsWith('gpt'))
83
+ return AIProvider.OPENAI;
84
+ if (lowerName.startsWith('gemini'))
85
+ return AIProvider.GEMINI;
86
+ if (lowerName.startsWith('claude'))
87
+ return AIProvider.CLAUDE;
88
+ if (lowerName.startsWith('llama') || lowerName.startsWith('mixtral') || lowerName.startsWith('gemma'))
89
+ return AIProvider.GROQ;
90
+ return null;
91
+ }
92
+ async loadAllModels() {
93
+ try {
94
+ const data = await fs.readFile(this.modelsPath, 'utf-8');
95
+ return JSON.parse(data);
96
+ }
97
+ catch (e) {
98
+ try {
99
+ const templateData = await fs.readFile(this.templatePath, 'utf-8');
100
+ const models = JSON.parse(templateData);
101
+ await this.saveAllModels(models);
102
+ return models;
103
+ }
104
+ catch (templateError) {
105
+ // console.error("Failed to load model template:", templateError);
106
+ return {};
107
+ }
108
+ }
109
+ }
110
+ async saveAllModels(models) {
111
+ const dirPath = path.dirname(this.modelsPath);
112
+ await fs.mkdir(dirPath, { recursive: true });
113
+ await fs.writeFile(this.modelsPath, JSON.stringify(models, null, 2), 'utf-8');
114
+ }
115
+ }
116
+ //# sourceMappingURL=AIModelService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIModelService.js","sourceRoot":"","sources":["../../src/services/AIModelService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { AIService } from '../types/interfaces.js';
2
+ import { ConfigService } from './ConfigService.js';
3
+ /**
4
+ * AI関連の責務(モデル管理、プロバイダー推測、サービス生成)を統括するクラス。
5
+ * This class orchestrates AI-related responsibilities, including model management, provider inference, and service creation.
6
+ */
7
+ export declare class AIOrchestratorService {
8
+ private modelsPath;
9
+ private templatePath;
10
+ private configService;
11
+ constructor(vaultPath: string, configService: ConfigService);
12
+ /**
13
+ * `ai-models.json` ファイルを初期化する。ファイルが存在しない場合、テンプレートから作成する。
14
+ * Initializes the `ai-models.json` file. If the file does not exist, it is created from a template.
15
+ * @returns {Promise<boolean>} 新規にファイルが作成された場合はtrueを返す / Returns true if a new file was created.
16
+ */
17
+ initialize(): Promise<boolean>;
18
+ /**
19
+ * 指定されたプロバイダーのモデルリストを取得する。
20
+ * Gets the list of models for the specified provider.
21
+ * @param {string} provider - AIプロバイダー名 / The name of the AI provider.
22
+ * @returns {Promise<string[]>} モデル名の配列 / An array of model names.
23
+ */
24
+ getModels(provider: string): Promise<string[]>;
25
+ /**
26
+ * 新しいモデルを `ai-models.json` に追加する。
27
+ * Adds a new model to `ai-models.json`.
28
+ * @param {string} provider - AIプロバイダー名 / The name of the AI provider.
29
+ * @param {string} model - 追加するモデル名 / The name of the model to add.
30
+ */
31
+ addModel(provider: string, model: string): Promise<void>;
32
+ /**
33
+ * モデルを `ai-models.json` から削除する。
34
+ * Removes a model from `ai-models.json`.
35
+ * @param {string} provider - AIプロバイダー名 / The name of the AI provider.
36
+ * @param {string} model - 削除するモデル名 / The name of the model to remove.
37
+ */
38
+ removeModel(provider: string, model: string): Promise<void>;
39
+ /**
40
+ * モデル名からプロバイダーを推測する。
41
+ * Infers the provider from the model name.
42
+ * @param {string} modelName - モデル名 / The model name.
43
+ * @returns {Promise<string | null>} 推測されたプロバイダー名、またはnull / The inferred provider name, or null.
44
+ */
45
+ inferProvider(modelName: string): Promise<string | null>;
46
+ private loadAllModels;
47
+ private saveAllModels;
48
+ /**
49
+ * 指定されたプロバイダーとモデルに対応するAIServiceインスタンスを生成する。
50
+ * Creates an AIService instance for the specified provider and model.
51
+ * @param {string} provider - AIプロバイダー名 / The name of the AI provider.
52
+ * @param {string} [model] - モデル名 / The model name.
53
+ * @returns {AIService} AIServiceのインスタンス / An instance of AIService.
54
+ */
55
+ createAIService(provider: string, model?: string): AIService;
56
+ }
57
+ //# sourceMappingURL=AIOrchestratorService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIOrchestratorService.d.ts","sourceRoot":"","sources":["../../src/services/AIOrchestratorService.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAOxD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;;GAGG;AACH,qBAAa,qBAAqB;IAC9B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,aAAa,CAAgB;gBAEzB,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa;IAS3D;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAUpC;;;;;OAKG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAMpD;;;;;OAKG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa9D;;;;;OAKG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYjE;;;;;OAKG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YAsBhD,aAAa;YAgBb,aAAa;IAM3B;;;;;;OAMG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS;CAyB/D"}
@@ -0,0 +1,164 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ import { AIProvider } from '../types/constants.js';
5
+ import { TEXT } from '../config/text.js';
6
+ import { GeminiService } from './ai/GeminiService.js';
7
+ import { OpenAIService } from './ai/OpenAIService.js';
8
+ import { GroqService } from './ai/GroqService.js';
9
+ import { ClaudeService } from './ai/ClaudeService.js';
10
+ import { MockAIService } from './ai/MockAIService.js';
11
+ import { ConfigService } from './ConfigService.js';
12
+ /**
13
+ * AI関連の責務(モデル管理、プロバイダー推測、サービス生成)を統括するクラス。
14
+ * This class orchestrates AI-related responsibilities, including model management, provider inference, and service creation.
15
+ */
16
+ export class AIOrchestratorService {
17
+ modelsPath;
18
+ templatePath;
19
+ configService;
20
+ constructor(vaultPath, configService) {
21
+ this.modelsPath = path.join(vaultPath, '_AI_Prompts', 'ai-models.json');
22
+ this.configService = configService;
23
+ const __filename = fileURLToPath(import.meta.url);
24
+ const __dirname = path.dirname(__filename);
25
+ this.templatePath = path.join(__dirname, '../config/ai-models.json');
26
+ }
27
+ /**
28
+ * `ai-models.json` ファイルを初期化する。ファイルが存在しない場合、テンプレートから作成する。
29
+ * Initializes the `ai-models.json` file. If the file does not exist, it is created from a template.
30
+ * @returns {Promise<boolean>} 新規にファイルが作成された場合はtrueを返す / Returns true if a new file was created.
31
+ */
32
+ async initialize() {
33
+ try {
34
+ await fs.access(this.modelsPath);
35
+ return false;
36
+ }
37
+ catch (e) {
38
+ await this.loadAllModels();
39
+ return true;
40
+ }
41
+ }
42
+ /**
43
+ * 指定されたプロバイダーのモデルリストを取得する。
44
+ * Gets the list of models for the specified provider.
45
+ * @param {string} provider - AIプロバイダー名 / The name of the AI provider.
46
+ * @returns {Promise<string[]>} モデル名の配列 / An array of model names.
47
+ */
48
+ async getModels(provider) {
49
+ const allModels = await this.loadAllModels();
50
+ const models = allModels[provider] || [];
51
+ return models.filter(model => model !== '');
52
+ }
53
+ /**
54
+ * 新しいモデルを `ai-models.json` に追加する。
55
+ * Adds a new model to `ai-models.json`.
56
+ * @param {string} provider - AIプロバイダー名 / The name of the AI provider.
57
+ * @param {string} model - 追加するモデル名 / The name of the model to add.
58
+ */
59
+ async addModel(provider, model) {
60
+ const allModels = await this.loadAllModels();
61
+ if (!allModels[provider]) {
62
+ allModels[provider] = [];
63
+ }
64
+ if (!allModels[provider].includes(model)) {
65
+ allModels[provider].push(model);
66
+ await this.saveAllModels(allModels);
67
+ }
68
+ }
69
+ /**
70
+ * モデルを `ai-models.json` から削除する。
71
+ * Removes a model from `ai-models.json`.
72
+ * @param {string} provider - AIプロバイダー名 / The name of the AI provider.
73
+ * @param {string} model - 削除するモデル名 / The name of the model to remove.
74
+ */
75
+ async removeModel(provider, model) {
76
+ const allModels = await this.loadAllModels();
77
+ if (allModels[provider]) {
78
+ const index = allModels[provider].indexOf(model);
79
+ if (index > -1) {
80
+ allModels[provider].splice(index, 1);
81
+ await this.saveAllModels(allModels);
82
+ }
83
+ }
84
+ }
85
+ /**
86
+ * モデル名からプロバイダーを推測する。
87
+ * Infers the provider from the model name.
88
+ * @param {string} modelName - モデル名 / The model name.
89
+ * @returns {Promise<string | null>} 推測されたプロバイダー名、またはnull / The inferred provider name, or null.
90
+ */
91
+ async inferProvider(modelName) {
92
+ if (this.configService.isTestEnv) {
93
+ return 'mock';
94
+ }
95
+ const allModels = await this.loadAllModels();
96
+ for (const [provider, models] of Object.entries(allModels)) {
97
+ if (Array.isArray(models) && models.includes(modelName)) {
98
+ return provider;
99
+ }
100
+ }
101
+ const lowerName = modelName.toLowerCase();
102
+ if (lowerName.startsWith('gpt'))
103
+ return AIProvider.OPENAI;
104
+ if (lowerName.startsWith('gemini'))
105
+ return AIProvider.GEMINI;
106
+ if (lowerName.startsWith('claude'))
107
+ return AIProvider.CLAUDE;
108
+ if (lowerName.startsWith('llama') || lowerName.startsWith('mixtral') || lowerName.startsWith('gemma'))
109
+ return AIProvider.GROQ;
110
+ return null;
111
+ }
112
+ async loadAllModels() {
113
+ try {
114
+ const data = await fs.readFile(this.modelsPath, 'utf-8');
115
+ return JSON.parse(data);
116
+ }
117
+ catch (e) {
118
+ try {
119
+ const templateData = await fs.readFile(this.templatePath, 'utf-8');
120
+ const models = JSON.parse(templateData);
121
+ await this.saveAllModels(models);
122
+ return models;
123
+ }
124
+ catch (templateError) {
125
+ return {};
126
+ }
127
+ }
128
+ }
129
+ async saveAllModels(models) {
130
+ const dirPath = path.dirname(this.modelsPath);
131
+ await fs.mkdir(dirPath, { recursive: true });
132
+ await fs.writeFile(this.modelsPath, JSON.stringify(models, null, 2), 'utf-8');
133
+ }
134
+ /**
135
+ * 指定されたプロバイダーとモデルに対応するAIServiceインスタンスを生成する。
136
+ * Creates an AIService instance for the specified provider and model.
137
+ * @param {string} provider - AIプロバイダー名 / The name of the AI provider.
138
+ * @param {string} [model] - モデル名 / The model name.
139
+ * @returns {AIService} AIServiceのインスタンス / An instance of AIService.
140
+ */
141
+ createAIService(provider, model) {
142
+ if (this.configService.isTestEnv) {
143
+ return new MockAIService();
144
+ }
145
+ if (!model) {
146
+ throw new Error(TEXT.errors.modelNotSpecified.replace('{provider}', provider));
147
+ }
148
+ const apiKey = this.configService.getApiKey(provider);
149
+ switch (provider) {
150
+ case AIProvider.GEMINI:
151
+ return new GeminiService(apiKey, model);
152
+ case AIProvider.OPENAI:
153
+ return new OpenAIService(apiKey, model);
154
+ case AIProvider.GROQ:
155
+ return new GroqService(apiKey, model);
156
+ case AIProvider.CLAUDE:
157
+ return new ClaudeService(apiKey, model);
158
+ default:
159
+ console.warn(TEXT.logs.unknownProviderFallback.replace('{provider}', provider));
160
+ return new GeminiService(apiKey, model);
161
+ }
162
+ }
163
+ }
164
+ //# sourceMappingURL=AIOrchestratorService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIOrchestratorService.js","sourceRoot":"","sources":["../../src/services/AIOrchestratorService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * 環境変数や設定値を一元管理するサービスクラス。
3
+ * アプリケーション全体で process.env を直接参照せず、このクラスを通じて値を取得する。
4
+ * Service class for centralized management of environment variables and configuration values.
5
+ * The application should access values through this class instead of referencing process.env directly.
6
+ */
7
+ export declare class ConfigService {
8
+ constructor();
9
+ /**
10
+ * .env ファイルが存在するかどうかを確認する。
11
+ * Checks if the .env file exists.
12
+ */
13
+ hasEnvFile(): boolean;
14
+ /**
15
+ * Vault Path が設定されているかどうかを確認する。
16
+ * Checks if the Vault Path is set.
17
+ */
18
+ hasVaultPath(): boolean;
19
+ /**
20
+ * Obsidian Vaultのパスを取得する。
21
+ * Gets the path to the Obsidian Vault.
22
+ * @throws {Error} 環境変数が設定されていない場合 / If the environment variable is not set.
23
+ */
24
+ get vaultPath(): string;
25
+ /**
26
+ * 使用するエディタのコマンドを取得する。
27
+ * Gets the editor command to use.
28
+ * @returns {string | undefined} エディタコマンド、または未設定の場合はundefined / Editor command, or undefined if not set.
29
+ */
30
+ get editor(): string | undefined;
31
+ /**
32
+ * アプリケーションの言語設定を取得する。
33
+ * Gets the application language setting.
34
+ * @returns {string} 言語コード (デフォルトは 'en') / Language code (defaults to 'en').
35
+ */
36
+ get language(): string;
37
+ /**
38
+ * テスト環境かどうかを判定する。
39
+ * Determines if the application is running in a test environment.
40
+ */
41
+ get isTestEnv(): boolean;
42
+ /**
43
+ * バックグラウンド(デタッチ)モードで実行されているかどうかを判定する。
44
+ * Determines if the application is running in detached mode.
45
+ */
46
+ get isDetachedMode(): boolean;
47
+ /**
48
+ * 指定されたプロバイダーのAPIキーを取得する。
49
+ * Gets the API key for the specified provider.
50
+ * @param {string} provider - AIプロバイダー名 / The name of the AI provider.
51
+ * @returns {string} APIキー / The API key.
52
+ * @throws {Error} APIキーが設定されていない場合 / If the API key is not set.
53
+ */
54
+ getApiKey(provider: string): string;
55
+ /**
56
+ * 利用可能な(APIキーが設定されている)プロバイダーのリストを取得する。
57
+ * Gets a list of available providers (those with API keys set).
58
+ */
59
+ getAvailableProviders(): string[];
60
+ }
61
+ //# sourceMappingURL=ConfigService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigService.d.ts","sourceRoot":"","sources":["../../src/services/ConfigService.ts"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,qBAAa,aAAa;;IAmBtB;;;OAGG;IACH,UAAU,IAAI,OAAO;IAOrB;;;OAGG;IACH,YAAY,IAAI,OAAO;IAIvB;;;;OAIG;IACH,IAAI,SAAS,IAAI,MAAM,CAMtB;IAED;;;;OAIG;IACH,IAAI,MAAM,IAAI,MAAM,GAAG,SAAS,CAE/B;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;;OAGG;IACH,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED;;;OAGG;IACH,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED;;;;;;OAMG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IA0BnC;;;OAGG;IACH,qBAAqB,IAAI,MAAM,EAAE;CAUpC"}