noterai 0.1.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 (191) hide show
  1. package/README.md +368 -0
  2. package/bin/noter.js +218 -0
  3. package/bin/noter.js.map +1 -0
  4. package/package.json +73 -0
  5. package/packages/client/dist/assets/geist-mono-latin-400-normal-CoULgQGM.woff +0 -0
  6. package/packages/client/dist/assets/geist-mono-latin-400-normal-LC9RFr9I.woff2 +0 -0
  7. package/packages/client/dist/assets/index-CBiNAMaA.js +264 -0
  8. package/packages/client/dist/assets/index-u7i5Fle2.css +1 -0
  9. package/packages/client/dist/assets/space-grotesk-latin-500-normal-CNSSEhBt.woff +0 -0
  10. package/packages/client/dist/assets/space-grotesk-latin-500-normal-lFbtlQH6.woff2 +0 -0
  11. package/packages/client/dist/assets/space-grotesk-latin-600-normal-BflQw4A9.woff +0 -0
  12. package/packages/client/dist/assets/space-grotesk-latin-600-normal-DjKNqYRj.woff2 +0 -0
  13. package/packages/client/dist/assets/vendor-react-DHeZC_T5.js +17 -0
  14. package/packages/client/dist/index.html +14 -0
  15. package/packages/server/dist/adapters/claudeAdapter.d.ts +34 -0
  16. package/packages/server/dist/adapters/claudeAdapter.d.ts.map +1 -0
  17. package/packages/server/dist/adapters/claudeAdapter.js +281 -0
  18. package/packages/server/dist/adapters/claudeAdapter.js.map +1 -0
  19. package/packages/server/dist/adapters/codexAdapter.d.ts +39 -0
  20. package/packages/server/dist/adapters/codexAdapter.d.ts.map +1 -0
  21. package/packages/server/dist/adapters/codexAdapter.js +347 -0
  22. package/packages/server/dist/adapters/codexAdapter.js.map +1 -0
  23. package/packages/server/dist/adapters/droidAdapter.d.ts +34 -0
  24. package/packages/server/dist/adapters/droidAdapter.d.ts.map +1 -0
  25. package/packages/server/dist/adapters/droidAdapter.js +109 -0
  26. package/packages/server/dist/adapters/droidAdapter.js.map +1 -0
  27. package/packages/server/dist/adapters/genericAdapter.d.ts +50 -0
  28. package/packages/server/dist/adapters/genericAdapter.d.ts.map +1 -0
  29. package/packages/server/dist/adapters/genericAdapter.js +203 -0
  30. package/packages/server/dist/adapters/genericAdapter.js.map +1 -0
  31. package/packages/server/dist/adapters/index.d.ts +7 -0
  32. package/packages/server/dist/adapters/index.d.ts.map +1 -0
  33. package/packages/server/dist/adapters/index.js +7 -0
  34. package/packages/server/dist/adapters/index.js.map +1 -0
  35. package/packages/server/dist/adapters/opencodeAdapter.d.ts +28 -0
  36. package/packages/server/dist/adapters/opencodeAdapter.d.ts.map +1 -0
  37. package/packages/server/dist/adapters/opencodeAdapter.js +265 -0
  38. package/packages/server/dist/adapters/opencodeAdapter.js.map +1 -0
  39. package/packages/server/dist/adapters/opencodeSessionManager.d.ts +13 -0
  40. package/packages/server/dist/adapters/opencodeSessionManager.d.ts.map +1 -0
  41. package/packages/server/dist/adapters/opencodeSessionManager.js +230 -0
  42. package/packages/server/dist/adapters/opencodeSessionManager.js.map +1 -0
  43. package/packages/server/dist/adapters/pathUtils.d.ts +54 -0
  44. package/packages/server/dist/adapters/pathUtils.d.ts.map +1 -0
  45. package/packages/server/dist/adapters/pathUtils.js +86 -0
  46. package/packages/server/dist/adapters/pathUtils.js.map +1 -0
  47. package/packages/server/dist/adapters/piAdapter.d.ts +34 -0
  48. package/packages/server/dist/adapters/piAdapter.d.ts.map +1 -0
  49. package/packages/server/dist/adapters/piAdapter.js +307 -0
  50. package/packages/server/dist/adapters/piAdapter.js.map +1 -0
  51. package/packages/server/dist/autoDetect.d.ts +15 -0
  52. package/packages/server/dist/autoDetect.d.ts.map +1 -0
  53. package/packages/server/dist/autoDetect.js +102 -0
  54. package/packages/server/dist/autoDetect.js.map +1 -0
  55. package/packages/server/dist/config.d.ts +29 -0
  56. package/packages/server/dist/config.d.ts.map +1 -0
  57. package/packages/server/dist/config.js +96 -0
  58. package/packages/server/dist/config.js.map +1 -0
  59. package/packages/server/dist/eventStore.d.ts +14 -0
  60. package/packages/server/dist/eventStore.d.ts.map +1 -0
  61. package/packages/server/dist/eventStore.js +35 -0
  62. package/packages/server/dist/eventStore.js.map +1 -0
  63. package/packages/server/dist/hookWatcher.d.ts +24 -0
  64. package/packages/server/dist/hookWatcher.d.ts.map +1 -0
  65. package/packages/server/dist/hookWatcher.js +152 -0
  66. package/packages/server/dist/hookWatcher.js.map +1 -0
  67. package/packages/server/dist/index.d.ts +58 -0
  68. package/packages/server/dist/index.d.ts.map +1 -0
  69. package/packages/server/dist/index.js +527 -0
  70. package/packages/server/dist/index.js.map +1 -0
  71. package/packages/server/dist/llm/jsonExtractor.d.ts +39 -0
  72. package/packages/server/dist/llm/jsonExtractor.d.ts.map +1 -0
  73. package/packages/server/dist/llm/jsonExtractor.js +83 -0
  74. package/packages/server/dist/llm/jsonExtractor.js.map +1 -0
  75. package/packages/server/dist/llm/ollamaCache.d.ts +19 -0
  76. package/packages/server/dist/llm/ollamaCache.d.ts.map +1 -0
  77. package/packages/server/dist/llm/ollamaCache.js +31 -0
  78. package/packages/server/dist/llm/ollamaCache.js.map +1 -0
  79. package/packages/server/dist/llm/ollamaClient.d.ts +29 -0
  80. package/packages/server/dist/llm/ollamaClient.d.ts.map +1 -0
  81. package/packages/server/dist/llm/ollamaClient.js +117 -0
  82. package/packages/server/dist/llm/ollamaClient.js.map +1 -0
  83. package/packages/server/dist/llm/ollamaQueue.d.ts +7 -0
  84. package/packages/server/dist/llm/ollamaQueue.d.ts.map +1 -0
  85. package/packages/server/dist/llm/ollamaQueue.js +28 -0
  86. package/packages/server/dist/llm/ollamaQueue.js.map +1 -0
  87. package/packages/server/dist/llm/promptBuilder.d.ts +8 -0
  88. package/packages/server/dist/llm/promptBuilder.d.ts.map +1 -0
  89. package/packages/server/dist/llm/promptBuilder.js +85 -0
  90. package/packages/server/dist/llm/promptBuilder.js.map +1 -0
  91. package/packages/server/dist/llm/promptSections.d.ts +64 -0
  92. package/packages/server/dist/llm/promptSections.d.ts.map +1 -0
  93. package/packages/server/dist/llm/promptSections.js +128 -0
  94. package/packages/server/dist/llm/promptSections.js.map +1 -0
  95. package/packages/server/dist/llm/providerModels.d.ts +14 -0
  96. package/packages/server/dist/llm/providerModels.d.ts.map +1 -0
  97. package/packages/server/dist/llm/providerModels.js +67 -0
  98. package/packages/server/dist/llm/providerModels.js.map +1 -0
  99. package/packages/server/dist/llm/suggester.d.ts +12 -0
  100. package/packages/server/dist/llm/suggester.d.ts.map +1 -0
  101. package/packages/server/dist/llm/suggester.js +263 -0
  102. package/packages/server/dist/llm/suggester.js.map +1 -0
  103. package/packages/server/dist/llm/summarizer.d.ts +53 -0
  104. package/packages/server/dist/llm/summarizer.d.ts.map +1 -0
  105. package/packages/server/dist/llm/summarizer.js +174 -0
  106. package/packages/server/dist/llm/summarizer.js.map +1 -0
  107. package/packages/server/dist/persistence.d.ts +42 -0
  108. package/packages/server/dist/persistence.d.ts.map +1 -0
  109. package/packages/server/dist/persistence.js +103 -0
  110. package/packages/server/dist/persistence.js.map +1 -0
  111. package/packages/server/dist/repoContext.d.ts +60 -0
  112. package/packages/server/dist/repoContext.d.ts.map +1 -0
  113. package/packages/server/dist/repoContext.js +197 -0
  114. package/packages/server/dist/repoContext.js.map +1 -0
  115. package/packages/server/dist/routes/blueprint.d.ts +7 -0
  116. package/packages/server/dist/routes/blueprint.d.ts.map +1 -0
  117. package/packages/server/dist/routes/blueprint.js +529 -0
  118. package/packages/server/dist/routes/blueprint.js.map +1 -0
  119. package/packages/server/dist/routes/config.d.ts +17 -0
  120. package/packages/server/dist/routes/config.d.ts.map +1 -0
  121. package/packages/server/dist/routes/config.js +282 -0
  122. package/packages/server/dist/routes/config.js.map +1 -0
  123. package/packages/server/dist/routes/lmstudio.d.ts +4 -0
  124. package/packages/server/dist/routes/lmstudio.d.ts.map +1 -0
  125. package/packages/server/dist/routes/lmstudio.js +67 -0
  126. package/packages/server/dist/routes/lmstudio.js.map +1 -0
  127. package/packages/server/dist/routes/notes.d.ts +5 -0
  128. package/packages/server/dist/routes/notes.d.ts.map +1 -0
  129. package/packages/server/dist/routes/notes.js +60 -0
  130. package/packages/server/dist/routes/notes.js.map +1 -0
  131. package/packages/server/dist/routes/ollama.d.ts +4 -0
  132. package/packages/server/dist/routes/ollama.d.ts.map +1 -0
  133. package/packages/server/dist/routes/ollama.js +207 -0
  134. package/packages/server/dist/routes/ollama.js.map +1 -0
  135. package/packages/server/dist/routes/prompt.d.ts +4 -0
  136. package/packages/server/dist/routes/prompt.d.ts.map +1 -0
  137. package/packages/server/dist/routes/prompt.js +75 -0
  138. package/packages/server/dist/routes/prompt.js.map +1 -0
  139. package/packages/server/dist/routes/refineNotes.d.ts +4 -0
  140. package/packages/server/dist/routes/refineNotes.d.ts.map +1 -0
  141. package/packages/server/dist/routes/refineNotes.js +87 -0
  142. package/packages/server/dist/routes/refineNotes.js.map +1 -0
  143. package/packages/server/dist/routes/repoContext.d.ts +3 -0
  144. package/packages/server/dist/routes/repoContext.d.ts.map +1 -0
  145. package/packages/server/dist/routes/repoContext.js +15 -0
  146. package/packages/server/dist/routes/repoContext.js.map +1 -0
  147. package/packages/server/dist/routes/sessions.d.ts +15 -0
  148. package/packages/server/dist/routes/sessions.d.ts.map +1 -0
  149. package/packages/server/dist/routes/sessions.js +420 -0
  150. package/packages/server/dist/routes/sessions.js.map +1 -0
  151. package/packages/server/dist/routes/summarize.d.ts +6 -0
  152. package/packages/server/dist/routes/summarize.d.ts.map +1 -0
  153. package/packages/server/dist/routes/summarize.js +85 -0
  154. package/packages/server/dist/routes/summarize.js.map +1 -0
  155. package/packages/server/dist/server.d.ts +2 -0
  156. package/packages/server/dist/server.d.ts.map +1 -0
  157. package/packages/server/dist/server.js +6 -0
  158. package/packages/server/dist/server.js.map +1 -0
  159. package/packages/server/dist/sessionManager.d.ts +41 -0
  160. package/packages/server/dist/sessionManager.d.ts.map +1 -0
  161. package/packages/server/dist/sessionManager.js +493 -0
  162. package/packages/server/dist/sessionManager.js.map +1 -0
  163. package/packages/server/dist/sessionScanner.d.ts +22 -0
  164. package/packages/server/dist/sessionScanner.d.ts.map +1 -0
  165. package/packages/server/dist/sessionScanner.js +165 -0
  166. package/packages/server/dist/sessionScanner.js.map +1 -0
  167. package/packages/server/dist/sessionTitle.d.ts +17 -0
  168. package/packages/server/dist/sessionTitle.d.ts.map +1 -0
  169. package/packages/server/dist/sessionTitle.js +321 -0
  170. package/packages/server/dist/sessionTitle.js.map +1 -0
  171. package/packages/server/dist/stateManager.d.ts +38 -0
  172. package/packages/server/dist/stateManager.d.ts.map +1 -0
  173. package/packages/server/dist/stateManager.js +83 -0
  174. package/packages/server/dist/stateManager.js.map +1 -0
  175. package/packages/server/dist/wsServer.d.ts +27 -0
  176. package/packages/server/dist/wsServer.d.ts.map +1 -0
  177. package/packages/server/dist/wsServer.js +144 -0
  178. package/packages/server/dist/wsServer.js.map +1 -0
  179. package/packages/shared/dist/index.d.ts +3 -0
  180. package/packages/shared/dist/index.d.ts.map +1 -0
  181. package/packages/shared/dist/index.js +3 -0
  182. package/packages/shared/dist/index.js.map +1 -0
  183. package/packages/shared/dist/llm/mambaDetect.d.ts +84 -0
  184. package/packages/shared/dist/llm/mambaDetect.d.ts.map +1 -0
  185. package/packages/shared/dist/llm/mambaDetect.js +205 -0
  186. package/packages/shared/dist/llm/mambaDetect.js.map +1 -0
  187. package/packages/shared/dist/types.d.ts +184 -0
  188. package/packages/shared/dist/types.d.ts.map +1 -0
  189. package/packages/shared/dist/types.js +2 -0
  190. package/packages/shared/dist/types.js.map +1 -0
  191. package/scripts/postbuild.js +70 -0
@@ -0,0 +1,282 @@
1
+ import { Router } from 'express';
2
+ import { z } from 'zod';
3
+ import { stateManager } from '../stateManager.js';
4
+ import { clearOllamaCache } from '../llm/ollamaCache.js';
5
+ import { saveSettings } from '../persistence.js';
6
+ const ConfigUpdateSchema = z.object({
7
+ activeSource: z.enum(['auto', 'opencode', 'claude-code', 'codex', 'factory-droid', 'pi', 'generic']).optional(),
8
+ llmProvider: z.enum(['ollama', 'anthropic', 'openai', 'gemini', 'lm-studio', 'custom']).optional(),
9
+ apiKey: z.string().min(1).optional(),
10
+ ollamaModel: z.string().min(1).optional(),
11
+ genericLogPath: z.string().min(1).optional(),
12
+ context7ApiKey: z.string().min(1).optional(),
13
+ exaApiKey: z.string().min(1).optional(),
14
+ lmStudioBaseUrl: z.string().min(1).optional(),
15
+ lmStudioModel: z.string().min(1).optional(),
16
+ ollamaContextSize: z.string().optional(),
17
+ lmStudioContextSize: z.string().optional(),
18
+ customProviderName: z.string().min(1).optional(),
19
+ customProviderBaseUrl: z.string().min(1).optional(),
20
+ customProviderApiKey: z.string().min(1).optional(),
21
+ customProviderModel: z.string().min(1).optional(),
22
+ }).strict();
23
+ export function createConfigRouter(cfg, ws, _eventStore, _summarizer, deps) {
24
+ const router = Router();
25
+ const { controller, onSourceChange } = deps;
26
+ router.post('/', async (req, res) => {
27
+ const parseResult = ConfigUpdateSchema.safeParse(req.body);
28
+ if (!parseResult.success) {
29
+ res.status(400).json({
30
+ error: `Validation failed: ${parseResult.error.issues.map((i) => i.message).join(', ')}`,
31
+ });
32
+ return;
33
+ }
34
+ const updates = parseResult.data;
35
+ const changedFields = [];
36
+ if (updates.activeSource !== undefined && updates.activeSource !== cfg.activeSource) {
37
+ cfg.activeSource = updates.activeSource;
38
+ changedFields.push('activeSource');
39
+ // Notify the server so it can update sourceInfo and reset sessionConnected
40
+ onSourceChange?.(cfg.activeSource);
41
+ // Fire-and-forget adapter swap — return immediately, let background work complete asynchronously
42
+ void (async () => {
43
+ // Trigger adapter swap via controller callback
44
+ const currentAdapters = controller.getAdapters();
45
+ // Stop all current adapters
46
+ for (const [key, adapter] of Object.entries(currentAdapters)) {
47
+ if (adapter && typeof adapter.stop === 'function') {
48
+ await adapter.stop().catch(() => { });
49
+ }
50
+ else if (adapter && typeof adapter.disconnect === 'function') {
51
+ adapter.disconnect();
52
+ }
53
+ controller.removeAdapter(key);
54
+ }
55
+ // Restart adapters for new source — reuse logic from createApp via dynamic import to avoid circular deps
56
+ const { createOpenCodeAdapter } = await import('../adapters/opencodeAdapter.js');
57
+ const { createClaudeAdapter } = await import('../adapters/claudeAdapter.js');
58
+ const { createCodexAdapter } = await import('../adapters/codexAdapter.js');
59
+ const { createDroidAdapter } = await import('../adapters/droidAdapter.js');
60
+ const { createPiAdapter } = await import('../adapters/piAdapter.js');
61
+ const { createGenericAdapter } = await import('../adapters/genericAdapter.js');
62
+ const source = cfg.activeSource;
63
+ const opencodeEnabled = source === 'opencode';
64
+ const claudeEnabled = source === 'claude-code';
65
+ const codexEnabled = source === 'codex';
66
+ const droidEnabled = source === 'factory-droid';
67
+ const piEnabled = source === 'pi';
68
+ const genericEnabled = source === 'generic';
69
+ if (opencodeEnabled) {
70
+ try {
71
+ const adapter = createOpenCodeAdapter({ config: cfg, eventStore: _eventStore, ws, summarizer: _summarizer });
72
+ controller.setAdapter('openCode', adapter);
73
+ adapter.connect().catch((err) => console.error('[ConfigRouter] Failed to connect OpenCode adapter:', err));
74
+ }
75
+ catch (err) {
76
+ console.error('[ConfigRouter] Failed to initialize OpenCode adapter:', err);
77
+ }
78
+ }
79
+ else {
80
+ controller.removeAdapter('openCode');
81
+ }
82
+ if (claudeEnabled) {
83
+ try {
84
+ const adapter = createClaudeAdapter({ config: cfg, eventStore: _eventStore, ws, summarizer: _summarizer });
85
+ controller.setAdapter('claude', adapter);
86
+ adapter.start().catch((err) => console.error('[ConfigRouter] Failed to start Claude adapter:', err));
87
+ }
88
+ catch (err) {
89
+ console.error('[ConfigRouter] Failed to initialize Claude adapter:', err);
90
+ }
91
+ }
92
+ else {
93
+ controller.removeAdapter('claude');
94
+ }
95
+ if (codexEnabled) {
96
+ try {
97
+ const adapter = createCodexAdapter({ config: cfg, eventStore: _eventStore, ws, summarizer: _summarizer, sessionDir: cfg.codexSessionDir });
98
+ controller.setAdapter('codex', adapter);
99
+ adapter.start().catch((err) => console.error('[ConfigRouter] Failed to start Codex adapter:', err));
100
+ }
101
+ catch (err) {
102
+ console.error('[ConfigRouter] Failed to initialize Codex adapter:', err);
103
+ }
104
+ }
105
+ else {
106
+ controller.removeAdapter('codex');
107
+ }
108
+ if (droidEnabled) {
109
+ try {
110
+ const adapter = createDroidAdapter({ config: cfg, eventStore: _eventStore, ws, summarizer: _summarizer });
111
+ controller.setAdapter('droid', adapter);
112
+ adapter.start().catch((err) => console.error('[ConfigRouter] Failed to start Droid adapter:', err));
113
+ }
114
+ catch (err) {
115
+ console.error('[ConfigRouter] Failed to start Droid adapter:', err);
116
+ }
117
+ }
118
+ else {
119
+ controller.removeAdapter('droid');
120
+ }
121
+ if (piEnabled) {
122
+ try {
123
+ const adapter = createPiAdapter({ config: cfg, eventStore: _eventStore, ws, summarizer: _summarizer, sessionDir: cfg.piSessionDir });
124
+ controller.setAdapter('pi', adapter);
125
+ adapter.start().catch((err) => console.error('[ConfigRouter] Failed to start Pi adapter:', err));
126
+ }
127
+ catch (err) {
128
+ console.error('[ConfigRouter] Failed to initialize Pi adapter:', err);
129
+ }
130
+ }
131
+ else {
132
+ controller.removeAdapter('pi');
133
+ }
134
+ if (genericEnabled) {
135
+ try {
136
+ const adapter = createGenericAdapter({ config: cfg, eventStore: _eventStore, ws, summarizer: _summarizer });
137
+ controller.setAdapter('generic', adapter);
138
+ adapter.start().catch((err) => console.error('[ConfigRouter] Failed to start Generic adapter:', err));
139
+ }
140
+ catch (err) {
141
+ console.error('[ConfigRouter] Failed to initialize Generic adapter:', err);
142
+ }
143
+ }
144
+ else {
145
+ controller.removeAdapter('generic');
146
+ }
147
+ })();
148
+ }
149
+ if (updates.apiKey !== undefined) {
150
+ const targetProvider = updates.llmProvider ?? cfg.llmProvider;
151
+ if (targetProvider === 'anthropic') {
152
+ cfg.anthropicApiKey = updates.apiKey;
153
+ }
154
+ else if (targetProvider === 'openai') {
155
+ cfg.openaiApiKey = updates.apiKey;
156
+ }
157
+ else if (targetProvider === 'gemini') {
158
+ cfg.geminiApiKey = updates.apiKey;
159
+ }
160
+ else if (targetProvider === 'lm-studio') {
161
+ // LM Studio typically doesn't need an API key, but store it if provided
162
+ }
163
+ else if (targetProvider === 'custom') {
164
+ cfg.customProviderApiKey = updates.apiKey;
165
+ }
166
+ changedFields.push('apiKey');
167
+ clearOllamaCache();
168
+ }
169
+ if (updates.llmProvider !== undefined && updates.llmProvider !== cfg.llmProvider) {
170
+ cfg.llmProvider = updates.llmProvider;
171
+ changedFields.push('llmProvider');
172
+ clearOllamaCache();
173
+ }
174
+ if (updates.ollamaModel !== undefined && updates.ollamaModel !== cfg.ollamaModel) {
175
+ cfg.ollamaModel = updates.ollamaModel;
176
+ changedFields.push('ollamaModel');
177
+ clearOllamaCache();
178
+ }
179
+ if (updates.genericLogPath !== undefined && updates.genericLogPath !== cfg.genericLogPath) {
180
+ cfg.genericLogPath = updates.genericLogPath;
181
+ changedFields.push('genericLogPath');
182
+ }
183
+ if (updates.context7ApiKey !== undefined && updates.context7ApiKey !== cfg.context7ApiKey) {
184
+ cfg.context7ApiKey = updates.context7ApiKey;
185
+ changedFields.push('context7ApiKey');
186
+ }
187
+ if (updates.exaApiKey !== undefined && updates.exaApiKey !== cfg.exaApiKey) {
188
+ cfg.exaApiKey = updates.exaApiKey;
189
+ changedFields.push('exaApiKey');
190
+ }
191
+ if (updates.lmStudioBaseUrl !== undefined && updates.lmStudioBaseUrl !== cfg.lmStudioBaseUrl) {
192
+ cfg.lmStudioBaseUrl = updates.lmStudioBaseUrl;
193
+ changedFields.push('lmStudioBaseUrl');
194
+ clearOllamaCache();
195
+ }
196
+ if (updates.lmStudioModel !== undefined && updates.lmStudioModel !== cfg.lmStudioModel) {
197
+ cfg.lmStudioModel = updates.lmStudioModel;
198
+ changedFields.push('lmStudioModel');
199
+ }
200
+ if (updates.ollamaContextSize !== undefined) {
201
+ // Store in memory only (AppConfig doesn't have ollamaContextSize field yet)
202
+ // Client reads this from its own localStorage
203
+ changedFields.push('ollamaContextSize');
204
+ }
205
+ if (updates.lmStudioContextSize !== undefined) {
206
+ // Store in memory only
207
+ changedFields.push('lmStudioContextSize');
208
+ }
209
+ if (updates.customProviderName !== undefined && updates.customProviderName !== cfg.customProviderName) {
210
+ cfg.customProviderName = updates.customProviderName;
211
+ changedFields.push('customProviderName');
212
+ }
213
+ if (updates.customProviderBaseUrl !== undefined && updates.customProviderBaseUrl !== cfg.customProviderBaseUrl) {
214
+ cfg.customProviderBaseUrl = updates.customProviderBaseUrl;
215
+ changedFields.push('customProviderBaseUrl');
216
+ clearOllamaCache();
217
+ }
218
+ if (updates.customProviderApiKey !== undefined && updates.customProviderApiKey !== cfg.customProviderApiKey) {
219
+ cfg.customProviderApiKey = updates.customProviderApiKey;
220
+ changedFields.push('customProviderApiKey');
221
+ }
222
+ if (updates.customProviderModel !== undefined && updates.customProviderModel !== cfg.customProviderModel) {
223
+ cfg.customProviderModel = updates.customProviderModel;
224
+ changedFields.push('customProviderModel');
225
+ }
226
+ // Update state manager snapshot so sync messages include new config
227
+ stateManager.setConfigSnapshot({
228
+ activeSource: cfg.activeSource,
229
+ resolvedSource: cfg.activeSource === 'auto' ? undefined : cfg.activeSource,
230
+ llmProvider: cfg.llmProvider,
231
+ ollamaModel: cfg.ollamaModel,
232
+ genericLogPath: cfg.genericLogPath,
233
+ lmStudioBaseUrl: cfg.lmStudioBaseUrl,
234
+ lmStudioModel: cfg.lmStudioModel,
235
+ customProviderName: cfg.customProviderName,
236
+ customProviderBaseUrl: cfg.customProviderBaseUrl,
237
+ customProviderModel: cfg.customProviderModel,
238
+ });
239
+ // Broadcast updated sync to all connected clients
240
+ ws.broadcast({
241
+ type: 'sync',
242
+ payload: { ...stateManager.getState(), events: _eventStore.getAll() },
243
+ });
244
+ // Persist settings to disk so they survive server restart
245
+ if (changedFields.length > 0) {
246
+ const persisted = {
247
+ activeSource: cfg.activeSource,
248
+ llmProvider: cfg.llmProvider,
249
+ ollamaModel: cfg.ollamaModel,
250
+ genericLogPath: cfg.genericLogPath,
251
+ context7ApiKey: cfg.context7ApiKey,
252
+ exaApiKey: cfg.exaApiKey,
253
+ lmStudioBaseUrl: cfg.lmStudioBaseUrl,
254
+ lmStudioModel: cfg.lmStudioModel,
255
+ customProviderName: cfg.customProviderName,
256
+ customProviderBaseUrl: cfg.customProviderBaseUrl,
257
+ customProviderApiKey: cfg.customProviderApiKey,
258
+ customProviderModel: cfg.customProviderModel,
259
+ };
260
+ saveSettings(persisted);
261
+ }
262
+ res.status(200).json({
263
+ applied: true,
264
+ persistent: true,
265
+ changedFields,
266
+ config: {
267
+ activeSource: cfg.activeSource,
268
+ resolvedSource: cfg.activeSource === 'auto' ? undefined : cfg.activeSource,
269
+ llmProvider: cfg.llmProvider,
270
+ ollamaModel: cfg.ollamaModel,
271
+ genericLogPath: cfg.genericLogPath,
272
+ lmStudioBaseUrl: cfg.lmStudioBaseUrl,
273
+ lmStudioModel: cfg.lmStudioModel,
274
+ customProviderName: cfg.customProviderName,
275
+ customProviderBaseUrl: cfg.customProviderBaseUrl,
276
+ customProviderModel: cfg.customProviderModel,
277
+ },
278
+ });
279
+ });
280
+ return router;
281
+ }
282
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/routes/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Router } from 'express';
2
+ import type { AppConfig } from '../config.js';
3
+ export declare function createLmStudioRouter(config: AppConfig): Router;
4
+ //# sourceMappingURL=lmstudio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lmstudio.d.ts","sourceRoot":"","sources":["../../src/routes/lmstudio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA+B,MAAM,SAAS,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAc9C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAsE9D"}
@@ -0,0 +1,67 @@
1
+ import { Router } from 'express';
2
+ export function createLmStudioRouter(config) {
3
+ const router = Router();
4
+ router.get('/models', async (_req, res) => {
5
+ const baseUrl = config.lmStudioBaseUrl || 'http://localhost:1234/v1';
6
+ // Derive the base without /v1 for LM Studio native API
7
+ const nativeBaseUrl = baseUrl.replace(/\/v1\/?$/, '');
8
+ try {
9
+ // Try LM Studio native v0 API first (rich metadata)
10
+ let enrichedModels = [];
11
+ try {
12
+ const v0Response = await fetch(`${nativeBaseUrl}/api/v0/models`, {
13
+ method: 'GET',
14
+ headers: { 'Accept': 'application/json' },
15
+ signal: AbortSignal.timeout(8000),
16
+ });
17
+ if (v0Response.ok) {
18
+ const v0Data = await v0Response.json();
19
+ enrichedModels = (v0Data.data ?? []).map(m => ({
20
+ id: m.id,
21
+ arch: m.arch,
22
+ maxContextLength: m.max_context_length,
23
+ type: m.type,
24
+ }));
25
+ }
26
+ }
27
+ catch {
28
+ // v0 API not available, fall through to OpenAI-compatible
29
+ }
30
+ // Fetch from OpenAI-compatible /v1/models
31
+ const response = await fetch(`${baseUrl}/models`, {
32
+ method: 'GET',
33
+ headers: { 'Accept': 'application/json' },
34
+ signal: AbortSignal.timeout(10000),
35
+ });
36
+ if (!response.ok) {
37
+ const errorText = await response.text().catch(() => response.statusText);
38
+ res.status(response.status).json({
39
+ error: `LM Studio at ${baseUrl} returned ${response.status}: ${errorText}`,
40
+ });
41
+ return;
42
+ }
43
+ const data = await response.json();
44
+ const modelIds = (data.data ?? []).map((m) => m.id).sort();
45
+ // Merge v0 metadata with model list
46
+ const enrichedMap = new Map(enrichedModels.map(m => [m.id, m]));
47
+ const modelsWithMeta = modelIds.map(id => {
48
+ const meta = enrichedMap.get(id);
49
+ return {
50
+ id,
51
+ arch: meta?.arch,
52
+ maxContextLength: meta?.maxContextLength,
53
+ type: meta?.type,
54
+ };
55
+ });
56
+ res.status(200).json({ models: modelIds, modelsWithMeta });
57
+ }
58
+ catch (error) {
59
+ const message = error instanceof Error ? error.message : 'Unknown error';
60
+ res.status(502).json({
61
+ error: `LM Studio not detected at ${baseUrl}: ${message}`,
62
+ });
63
+ }
64
+ });
65
+ return router;
66
+ }
67
+ //# sourceMappingURL=lmstudio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lmstudio.js","sourceRoot":"","sources":["../../src/routes/lmstudio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Router } from 'express';
2
+ import type { AppConfig } from '../config.js';
3
+ import type { WsServerManager } from '../wsServer.js';
4
+ export declare function createNotesRouter(config: AppConfig, ws: WsServerManager): Router;
5
+ //# sourceMappingURL=notes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notes.d.ts","sourceRoot":"","sources":["../../src/routes/notes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA+B,MAAM,SAAS,CAAC;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAkBtD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,eAAe,GAAG,MAAM,CAoDhF"}
@@ -0,0 +1,60 @@
1
+ import { Router } from 'express';
2
+ import { z } from 'zod';
3
+ import { stateManager } from '../stateManager.js';
4
+ import { suggest, mergeSuggestions } from '../llm/suggester.js';
5
+ import { saveNotes, saveSuggestions, loadPinnedTaskIds } from '../persistence.js';
6
+ const HumanNotesSchema = z.object({
7
+ content: z.string(),
8
+ updatedAt: z.number(),
9
+ });
10
+ function formatZodError(error) {
11
+ const messages = error.issues.map((issue) => {
12
+ const path = issue.path.length > 0 ? issue.path.join('.') : 'root';
13
+ return `${path}: ${issue.message}`;
14
+ });
15
+ return `Validation failed: ${messages.join(', ')}`;
16
+ }
17
+ export function createNotesRouter(config, ws) {
18
+ const router = Router();
19
+ router.post('/', async (req, res) => {
20
+ const parseResult = HumanNotesSchema.safeParse(req.body);
21
+ if (!parseResult.success) {
22
+ res.status(400).json({ error: formatZodError(parseResult.error) });
23
+ return;
24
+ }
25
+ const notes = parseResult.data;
26
+ stateManager.setNotes(notes);
27
+ saveNotes(notes);
28
+ // FIX: Return immediately to unblock frontend — fire-and-forget for suggestions
29
+ res.status(200).json({ saved: true, timestamp: Date.now() });
30
+ // FIX: Async suggestion generation — fire-and-forget, errors logged to stderr
31
+ void (async () => {
32
+ try {
33
+ const summary = stateManager.getSummary();
34
+ const origin = summary ? 'context' : 'notes';
35
+ // FIX: Broadcast start indicator so SUGGESTED_TASK panel can show GENERATING TASK…
36
+ ws.broadcast({ type: 'suggestions-status', payload: { generating: true, reason: 'notes-save' } });
37
+ // FIX: Generate suggestions even when summary is null — use notes-only prompt
38
+ const freshSuggestions = await suggest(summary, notes, config, origin);
39
+ // MERGE instead of full replace: preserve context-generated + pinned tasks
40
+ const existing = stateManager.getSuggestions();
41
+ const pinnedIds = new Set(loadPinnedTaskIds());
42
+ const merged = mergeSuggestions(existing, freshSuggestions, pinnedIds);
43
+ // setSuggestions cleans orphan prompts for removed task IDs automatically
44
+ stateManager.setSuggestions(merged);
45
+ saveSuggestions(merged);
46
+ ws.broadcast({ type: 'suggestions', payload: merged });
47
+ }
48
+ catch (error) {
49
+ const message = error instanceof Error ? error.message : 'Unknown error';
50
+ console.error('[notes] Suggestion generation failed:', message);
51
+ // FIX: Do NOT rethrow — this is fire-and-forget, errors must not propagate
52
+ }
53
+ finally {
54
+ ws.broadcast({ type: 'suggestions-status', payload: { generating: false, reason: 'notes-save' } });
55
+ }
56
+ })();
57
+ });
58
+ return router;
59
+ }
60
+ //# sourceMappingURL=notes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notes.js","sourceRoot":"","sources":["../../src/routes/notes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Router } from 'express';
2
+ import type { AppConfig } from '../config.js';
3
+ export declare function createOllamaRouter(config: AppConfig): Router;
4
+ //# sourceMappingURL=ollama.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/routes/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA+B,MAAM,SAAS,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAsE9C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAoM5D"}