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,207 @@
1
+ import { Router } from 'express';
2
+ async function getOllamaPs(config) {
3
+ const response = await fetch(`${config.ollamaBaseUrl}/api/ps`, {
4
+ method: 'GET',
5
+ headers: { 'Accept': 'application/json' },
6
+ });
7
+ if (!response.ok) {
8
+ throw new Error(`Ollama /api/ps failed: ${response.status}`);
9
+ }
10
+ return response.json();
11
+ }
12
+ async function getOllamaTags(config) {
13
+ const response = await fetch(`${config.ollamaBaseUrl}/api/tags`, {
14
+ method: 'GET',
15
+ headers: { 'Accept': 'application/json' },
16
+ });
17
+ if (!response.ok) {
18
+ throw new Error(`Ollama /api/tags failed: ${response.status}`);
19
+ }
20
+ return response.json();
21
+ }
22
+ const CACHED_VRAM_LIMIT_GB = process.env.VRAM_LIMIT_GB ? parseFloat(process.env.VRAM_LIMIT_GB) : 6;
23
+ export function createOllamaRouter(config) {
24
+ const router = Router();
25
+ router.get('/status', async (_req, res) => {
26
+ try {
27
+ // Query both /api/ps (loaded models) and /api/tags (available models)
28
+ // If /api/ps fails, we still try /api/tags to show the configured model.
29
+ // Only if BOTH fail do we return an error.
30
+ let psStatus = { models: [] };
31
+ let tagsStatus = { models: [] };
32
+ let psError = null;
33
+ try {
34
+ psStatus = await getOllamaPs(config);
35
+ }
36
+ catch (err) {
37
+ psError = err instanceof Error ? err : new Error(String(err));
38
+ }
39
+ try {
40
+ tagsStatus = await getOllamaTags(config);
41
+ }
42
+ catch (err) {
43
+ // If both failed, propagate the error from /api/ps
44
+ if (psError) {
45
+ throw psError;
46
+ }
47
+ // Otherwise just use empty tags
48
+ }
49
+ // Build model list from /api/ps (actively loaded in VRAM)
50
+ const loadedModels = psStatus.models.map(model => ({
51
+ name: model.name,
52
+ size: model.size,
53
+ sizeVram: model.size_vram,
54
+ contextLength: model.context_length || null,
55
+ parameterSize: model.details?.parameter_size || 'unknown',
56
+ quantization: model.details?.quantization_level || 'unknown',
57
+ family: model.details?.family || 'unknown',
58
+ expiresAt: model.expires_at,
59
+ }));
60
+ // For cloud models that don't stay loaded in VRAM, also include the
61
+ // configured model from /api/tags so the UI always shows what's in use.
62
+ const configuredModel = config.ollamaModel;
63
+ const configuredTag = tagsStatus.models.find(m => m.name === configuredModel);
64
+ let formattedModels = loadedModels;
65
+ if (loadedModels.length === 0 && configuredTag) {
66
+ formattedModels = [{
67
+ name: configuredTag.name,
68
+ size: configuredTag.size,
69
+ sizeVram: 0, // Cloud model — not loaded in local VRAM
70
+ contextLength: null,
71
+ parameterSize: configuredTag.details?.parameter_size || 'unknown',
72
+ quantization: configuredTag.details?.quantization_level || 'unknown',
73
+ family: configuredTag.details?.family || 'unknown',
74
+ expiresAt: '',
75
+ }];
76
+ }
77
+ // UI: Compute aggregate memory stats for the frontend memory allocation bar
78
+ const totalSize = formattedModels.reduce((sum, m) => sum + (m.size || 0), 0);
79
+ const totalVram = formattedModels.reduce((sum, m) => sum + (m.sizeVram || 0), 0);
80
+ const memoryLimitBytes = CACHED_VRAM_LIMIT_GB * (1024 ** 3); // total VRAM from env/config (F19 fix)
81
+ const usedPercent = memoryLimitBytes > 0 ? Math.min(100, (totalVram / memoryLimitBytes) * 100) : 0;
82
+ res.status(200).json({
83
+ models: formattedModels,
84
+ memory: {
85
+ totalSize,
86
+ totalVram,
87
+ memoryLimitBytes,
88
+ usedPercent,
89
+ },
90
+ vram: {
91
+ // totalGb comes from cached VRAM_LIMIT_GB env var (F19 fix)
92
+ totalGb: CACHED_VRAM_LIMIT_GB,
93
+ // usedGb comes from Ollama /api/ps size_vram (actual GPU memory used by loaded models)
94
+ usedGb: totalVram / (1024 ** 3),
95
+ available: true,
96
+ },
97
+ });
98
+ }
99
+ catch (error) {
100
+ const message = error instanceof Error ? error.message : 'Unknown error';
101
+ res.status(200).json({
102
+ models: [],
103
+ memory: {
104
+ totalSize: 0,
105
+ totalVram: 0,
106
+ memoryLimitBytes: CACHED_VRAM_LIMIT_GB * (1024 ** 3),
107
+ usedPercent: 0,
108
+ },
109
+ vram: {
110
+ totalGb: CACHED_VRAM_LIMIT_GB,
111
+ usedGb: 0,
112
+ available: false,
113
+ },
114
+ error: `Failed to get Ollama status: ${message}`,
115
+ });
116
+ }
117
+ });
118
+ router.get('/tags', async (_req, res) => {
119
+ try {
120
+ const tagsStatus = await getOllamaTags(config);
121
+ const models = tagsStatus.models.map((m) => m.name).sort();
122
+ res.status(200).json({ models });
123
+ }
124
+ catch (error) {
125
+ const message = error instanceof Error ? error.message : 'Unknown error';
126
+ res.status(500).json({ error: `Failed to get Ollama tags: ${message}` });
127
+ }
128
+ });
129
+ router.post('/show', async (req, res) => {
130
+ const modelName = req.body?.model;
131
+ if (typeof modelName !== 'string' || !modelName.trim()) {
132
+ res.status(400).json({ error: 'model must be a non-empty string' });
133
+ return;
134
+ }
135
+ try {
136
+ const response = await fetch(`${config.ollamaBaseUrl}/api/show`, {
137
+ method: 'POST',
138
+ headers: { 'Content-Type': 'application/json' },
139
+ body: JSON.stringify({ model: modelName, verbose: false }),
140
+ signal: AbortSignal.timeout(10000),
141
+ });
142
+ if (!response.ok) {
143
+ const errorText = await response.text().catch(() => response.statusText);
144
+ res.status(response.status).json({ error: `Ollama /api/show failed: ${errorText}` });
145
+ return;
146
+ }
147
+ const data = await response.json();
148
+ res.status(200).json(data);
149
+ }
150
+ catch (error) {
151
+ const message = error instanceof Error ? error.message : 'Unknown error';
152
+ res.status(502).json({ error: `Ollama not reachable: ${message}` });
153
+ }
154
+ });
155
+ router.post('/offload', async (_req, res) => {
156
+ try {
157
+ const status = await getOllamaPs(config);
158
+ if (status.models.length === 0) {
159
+ res.status(200).json({ message: 'No models loaded' });
160
+ return;
161
+ }
162
+ const offloadResults = [];
163
+ for (const model of status.models) {
164
+ const offloadResult = await fetch(`${config.ollamaBaseUrl}/api/generate`, {
165
+ method: 'POST',
166
+ headers: { 'Content-Type': 'application/json' },
167
+ body: JSON.stringify({
168
+ model: model.name,
169
+ keep_alive: 0,
170
+ }),
171
+ });
172
+ if (!offloadResult.ok) {
173
+ offloadResults.push({
174
+ model: model.name,
175
+ success: false,
176
+ error: `HTTP ${offloadResult.status}`,
177
+ });
178
+ }
179
+ else {
180
+ offloadResults.push({
181
+ model: model.name,
182
+ success: true,
183
+ });
184
+ }
185
+ }
186
+ const allSuccess = offloadResults.every(r => r.success);
187
+ if (allSuccess) {
188
+ res.status(200).json({
189
+ message: 'All models offloaded successfully',
190
+ models: offloadResults.map(r => r.model),
191
+ });
192
+ }
193
+ else {
194
+ res.status(500).json({
195
+ error: 'Some models failed to offload',
196
+ results: offloadResults,
197
+ });
198
+ }
199
+ }
200
+ catch (error) {
201
+ const message = error instanceof Error ? error.message : 'Unknown error';
202
+ res.status(500).json({ error: `Failed to offload models: ${message}` });
203
+ }
204
+ });
205
+ return router;
206
+ }
207
+ //# sourceMappingURL=ollama.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/routes/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA+B,MAAM,SAAS,CAAC;AA2C9D,KAAK,UAAU,WAAW,CAAC,MAAiB;IAC1C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,aAAa,SAAS,EAAE;QAC7D,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE;KAC1C,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAA+B,CAAC;AACtD,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,MAAiB;IAC5C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,aAAa,WAAW,EAAE;QAC/D,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE;KAC1C,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAiC,CAAC;AACxD,CAAC;AAED,MAAM,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEnG,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,IAAa,EAAE,GAAa,EAAiB,EAAE;QAC1E,IAAI,CAAC;YACH,sEAAsE;YACtE,yEAAyE;YACzE,2CAA2C;YAC3C,IAAI,QAAQ,GAAqB,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YAChD,IAAI,UAAU,GAAuB,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YACpD,IAAI,OAAO,GAAiB,IAAI,CAAC;YAEjC,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,CAAC;YAED,IAAI,CAAC;gBACH,UAAU,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,mDAAmD;gBACnD,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,OAAO,CAAC;gBAChB,CAAC;gBACD,gCAAgC;YAClC,CAAC;YAED,0DAA0D;YAC1D,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACjD,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,QAAQ,EAAE,KAAK,CAAC,SAAS;gBACzB,aAAa,EAAE,KAAK,CAAC,cAAc,IAAI,IAAI;gBAC3C,aAAa,EAAE,KAAK,CAAC,OAAO,EAAE,cAAc,IAAI,SAAS;gBACzD,YAAY,EAAE,KAAK,CAAC,OAAO,EAAE,kBAAkB,IAAI,SAAS;gBAC5D,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,IAAI,SAAS;gBAC1C,SAAS,EAAE,KAAK,CAAC,UAAU;aAC5B,CAAC,CAAC,CAAC;YAEJ,oEAAoE;YACpE,wEAAwE;YACxE,MAAM,eAAe,GAAG,MAAM,CAAC,WAAW,CAAC;YAC3C,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;YAE9E,IAAI,eAAe,GAAG,YAAY,CAAC;YACnC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,EAAE,CAAC;gBAC/C,eAAe,GAAG,CAAC;wBACjB,IAAI,EAAE,aAAa,CAAC,IAAI;wBACxB,IAAI,EAAE,aAAa,CAAC,IAAI;wBACxB,QAAQ,EAAE,CAAC,EAAE,yCAAyC;wBACtD,aAAa,EAAE,IAAI;wBACnB,aAAa,EAAE,aAAa,CAAC,OAAO,EAAE,cAAc,IAAI,SAAS;wBACjE,YAAY,EAAE,aAAa,CAAC,OAAO,EAAE,kBAAkB,IAAI,SAAS;wBACpE,MAAM,EAAE,aAAa,CAAC,OAAO,EAAE,MAAM,IAAI,SAAS;wBAClD,SAAS,EAAE,EAAE;qBACd,CAAC,CAAC;YACL,CAAC;YAED,4EAA4E;YAC5E,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7E,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACjF,MAAM,gBAAgB,GAAG,oBAAoB,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,uCAAuC;YACpG,MAAM,WAAW,GAAG,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,SAAS,GAAG,gBAAgB,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAEnG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,MAAM,EAAE,eAAe;gBACvB,MAAM,EAAE;oBACN,SAAS;oBACT,SAAS;oBACT,gBAAgB;oBAChB,WAAW;iBACZ;gBACD,IAAI,EAAE;oBACJ,4DAA4D;oBAC5D,OAAO,EAAE,oBAAoB;oBAC7B,uFAAuF;oBACvF,MAAM,EAAE,SAAS,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;oBAC/B,SAAS,EAAE,IAAI;iBAChB;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE;oBACN,SAAS,EAAE,CAAC;oBACZ,SAAS,EAAE,CAAC;oBACZ,gBAAgB,EAAE,oBAAoB,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;oBACpD,WAAW,EAAE,CAAC;iBACf;gBACD,IAAI,EAAE;oBACJ,OAAO,EAAE,oBAAoB;oBAC7B,MAAM,EAAE,CAAC;oBACT,SAAS,EAAE,KAAK;iBACjB;gBACD,KAAK,EAAE,gCAAgC,OAAO,EAAE;aACjD,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,IAAa,EAAE,GAAa,EAAiB,EAAE;QACxE,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,8BAA8B,OAAO,EAAE,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAiB,EAAE;QACxE,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC;QAClC,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YACvD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kCAAkC,EAAE,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,aAAa,WAAW,EAAE;gBAC/D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;gBAC1D,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;aACnC,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBACzE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,4BAA4B,SAAS,EAAE,EAAE,CAAC,CAAC;gBACrF,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yBAAyB,OAAO,EAAE,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,IAAa,EAAE,GAAa,EAAiB,EAAE;QAC5E,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;YAEzC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBACtD,OAAO;YACT,CAAC;YAED,MAAM,cAAc,GAAG,EAAE,CAAC;YAE1B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,aAAa,eAAe,EAAE;oBACxE,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,KAAK,EAAE,KAAK,CAAC,IAAI;wBACjB,UAAU,EAAE,CAAC;qBACd,CAAC;iBACH,CAAC,CAAC;gBAEH,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;oBACtB,cAAc,CAAC,IAAI,CAAC;wBAClB,KAAK,EAAE,KAAK,CAAC,IAAI;wBACjB,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,QAAQ,aAAa,CAAC,MAAM,EAAE;qBACtC,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,cAAc,CAAC,IAAI,CAAC;wBAClB,KAAK,EAAE,KAAK,CAAC,IAAI;wBACjB,OAAO,EAAE,IAAI;qBACd,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAExD,IAAI,UAAU,EAAE,CAAC;gBACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,OAAO,EAAE,mCAAmC;oBAC5C,MAAM,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;iBACzC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,+BAA+B;oBACtC,OAAO,EAAE,cAAc;iBACxB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,6BAA6B,OAAO,EAAE,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Router } from 'express';
2
+ import type { AppConfig } from '../config.js';
3
+ export declare function createPromptRouter(config: AppConfig): Router;
4
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/routes/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA+B,MAAM,SAAS,CAAC;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAY9C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAgF5D"}
@@ -0,0 +1,75 @@
1
+ import { Router } from 'express';
2
+ import { z } from 'zod';
3
+ import { stateManager } from '../stateManager.js';
4
+ import { buildPrompt, MissingApiKeyError } from '../llm/promptBuilder.js';
5
+ import { INFERENCE_QUEUE } from '../llm/ollamaQueue.js';
6
+ import { stableTaskId } from '../llm/suggester.js';
7
+ const PromptRequestSchema = z.object({
8
+ taskId: z.string().min(1, 'taskId is required'),
9
+ taskTitle: z.string().optional(),
10
+ });
11
+ export function createPromptRouter(config) {
12
+ const router = Router();
13
+ router.post('/', async (req, res) => {
14
+ const parseResult = PromptRequestSchema.safeParse(req.body);
15
+ if (!parseResult.success) {
16
+ res.status(400).json({
17
+ error: `Validation failed: ${parseResult.error.issues.map((i) => i.message).join(', ')}`,
18
+ });
19
+ return;
20
+ }
21
+ const { taskId, taskTitle } = parseResult.data;
22
+ const suggestions = stateManager.getSuggestions();
23
+ let task = suggestions.find((s) => s.id === taskId);
24
+ // Recovery: if exact ID lookup failed, try matching by stableTaskId(title).
25
+ // This handles regenerated suggestions where titles match but IDs differ.
26
+ if (!task) {
27
+ task = suggestions.find((s) => stableTaskId(s.title) === taskId);
28
+ }
29
+ // Recovery: if stableTaskId didn't match, try matching by title directly.
30
+ // This handles regenerated suggestions where LLM slightly changed the title.
31
+ if (!task && taskTitle) {
32
+ task = suggestions.find((s) => s.title === taskTitle);
33
+ }
34
+ if (!task) {
35
+ res.status(404).json({ error: `Task not found: ${taskId}. Suggestions may have been regenerated — try refreshing tasks.` });
36
+ return;
37
+ }
38
+ const summary = stateManager.getSummary();
39
+ if (!summary) {
40
+ res.status(500).json({ error: 'No context summary available. Wait for summarization.' });
41
+ return;
42
+ }
43
+ try {
44
+ // FIX: Use shared inference queue — serialized with summarizer
45
+ const generatedPrompt = await INFERENCE_QUEUE.enqueue('prompt-builder', () => buildPrompt(task, summary, config));
46
+ // FIX: Task-to-prompt relationship — store prompt for taskId
47
+ stateManager.setPromptForTask(task.id, generatedPrompt);
48
+ res.status(200).json(generatedPrompt);
49
+ }
50
+ catch (error) {
51
+ if (error instanceof MissingApiKeyError) {
52
+ res.status(500).json({ error: `${error.provider} API key not configured` });
53
+ return;
54
+ }
55
+ const message = error instanceof Error ? error.message : 'Unknown error';
56
+ res.status(500).json({ error: `Failed to generate prompt: ${message}` });
57
+ }
58
+ });
59
+ // FIX: Task-to-prompt relationship — GET endpoint for stored prompt
60
+ router.get('/:taskId', async (req, res) => {
61
+ const taskId = Array.isArray(req.params.taskId) ? req.params.taskId[0] : req.params.taskId;
62
+ if (!taskId) {
63
+ res.status(400).json({ error: 'taskId is required' });
64
+ return;
65
+ }
66
+ const prompt = stateManager.getPromptForTask(taskId);
67
+ if (!prompt) {
68
+ res.status(404).json({ error: 'No prompt generated for this task' });
69
+ return;
70
+ }
71
+ res.status(200).json(prompt);
72
+ });
73
+ return router;
74
+ }
75
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/routes/prompt.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 createRefineNotesRouter(config: AppConfig): Router;
4
+ //# sourceMappingURL=refineNotes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refineNotes.d.ts","sourceRoot":"","sources":["../../src/routes/refineNotes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA+B,MAAM,SAAS,CAAC;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAwD9C,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAkCjE"}
@@ -0,0 +1,87 @@
1
+ import { Router } from 'express';
2
+ import { z } from 'zod';
3
+ import { generateText } from 'ai';
4
+ import { anthropic } from '@ai-sdk/anthropic';
5
+ import { openai } from '@ai-sdk/openai';
6
+ import { google } from '@ai-sdk/google';
7
+ import { getOllamaProvider } from '../llm/ollamaCache.js';
8
+ import { MissingApiKeyError } from '../llm/promptBuilder.js';
9
+ const RefineRequestSchema = z.object({
10
+ content: z.string().min(1, 'Content must not be empty'),
11
+ });
12
+ const REFINEMENT_PROMPT = `You are a notes refinement assistant. Improve the following developer notes for clarity and conciseness while preserving their exact structure and meaning.
13
+
14
+ Rules:
15
+ - Preserve all headings (#, ##, ###), lists (-, 1.), checklists (- [ ], - [x]), quotes (>), code blocks (\`\`\`), dividers (---), and callouts (> **!**)
16
+ - Improve wording clarity and remove redundancy
17
+ - Fix grammar and typos
18
+ - Do NOT add new content, hallucinate information, or change the meaning
19
+ - Do NOT remove structure markers — keep all markdown formatting intact
20
+ - Stay concise and practical
21
+ - Return ONLY the refined notes text, nothing else
22
+
23
+ Notes to refine:
24
+
25
+ `;
26
+ const PROVIDER_MODELS = {
27
+ anthropic: { modelId: 'claude-sonnet-4-20250514', requiresKey: true },
28
+ openai: { modelId: 'gpt-4o', requiresKey: true },
29
+ gemini: { modelId: 'gemini-2.5-flash', requiresKey: true },
30
+ ollama: { modelId: '', requiresKey: false },
31
+ };
32
+ function getModel(provider, config) {
33
+ switch (provider) {
34
+ case 'anthropic': {
35
+ if (!config.anthropicApiKey)
36
+ throw new MissingApiKeyError('Anthropic');
37
+ return anthropic(PROVIDER_MODELS.anthropic.modelId);
38
+ }
39
+ case 'openai': {
40
+ if (!config.openaiApiKey)
41
+ throw new MissingApiKeyError('OpenAI');
42
+ return openai(PROVIDER_MODELS.openai.modelId);
43
+ }
44
+ case 'gemini': {
45
+ if (!config.geminiApiKey)
46
+ throw new MissingApiKeyError('Gemini');
47
+ return google(PROVIDER_MODELS.gemini.modelId);
48
+ }
49
+ case 'ollama':
50
+ default: {
51
+ const ollamaProvider = getOllamaProvider({ baseURL: config.ollamaBaseUrl });
52
+ return ollamaProvider(config.ollamaModel);
53
+ }
54
+ }
55
+ }
56
+ export function createRefineNotesRouter(config) {
57
+ const router = Router();
58
+ router.post('/', async (req, res) => {
59
+ const parseResult = RefineRequestSchema.safeParse(req.body);
60
+ if (!parseResult.success) {
61
+ res.status(400).json({
62
+ error: `Validation failed: ${parseResult.error.issues.map(i => i.message).join(', ')}`,
63
+ });
64
+ return;
65
+ }
66
+ const { content } = parseResult.data;
67
+ try {
68
+ const provider = config.llmProvider || 'ollama';
69
+ const model = getModel(provider, config);
70
+ const { text: refinedContent } = await generateText({
71
+ model,
72
+ prompt: REFINEMENT_PROMPT + content,
73
+ });
74
+ res.status(200).json({ refinedContent });
75
+ }
76
+ catch (error) {
77
+ const message = error instanceof Error ? error.message : 'Unknown error';
78
+ if (error instanceof MissingApiKeyError) {
79
+ res.status(400).json({ error: `${error.provider} API key not configured. Set it in Settings.` });
80
+ return;
81
+ }
82
+ res.status(500).json({ error: `Refinement failed: ${message}` });
83
+ }
84
+ });
85
+ return router;
86
+ }
87
+ //# sourceMappingURL=refineNotes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refineNotes.js","sourceRoot":"","sources":["../../src/routes/refineNotes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Router } from 'express';
2
+ export declare function createRepoContextRouter(): Router;
3
+ //# sourceMappingURL=repoContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repoContext.d.ts","sourceRoot":"","sources":["../../src/routes/repoContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA+B,MAAM,SAAS,CAAC;AAG9D,wBAAgB,uBAAuB,IAAI,MAAM,CAehD"}
@@ -0,0 +1,15 @@
1
+ import { Router } from 'express';
2
+ import { stateManager } from '../stateManager.js';
3
+ export function createRepoContextRouter() {
4
+ const router = Router();
5
+ router.get('/', (_req, res) => {
6
+ const repoCtx = stateManager.getRepoContext();
7
+ if (!repoCtx) {
8
+ res.status(200).json({ repoContext: null });
9
+ return;
10
+ }
11
+ res.status(200).json({ repoContext: repoCtx });
12
+ });
13
+ return router;
14
+ }
15
+ //# sourceMappingURL=repoContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repoContext.js","sourceRoot":"","sources":["../../src/routes/repoContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA+B,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,UAAU,uBAAuB;IACrC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAa,EAAE,GAAa,EAAQ,EAAE;QACrD,MAAM,OAAO,GAAG,YAAY,CAAC,cAAc,EAAE,CAAC;QAE9C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { Router } from "express";
2
+ import type { AppConfig } from "../config.js";
3
+ import type { WsServerManager } from "../wsServer.js";
4
+ import type { EventStore } from "../eventStore.js";
5
+ import type { Summarizer } from "../llm/summarizer.js";
6
+ import type { SessionManager } from "../sessionManager.js";
7
+ export interface SessionController {
8
+ getActiveFile: () => string | undefined;
9
+ setActiveFile: (path: string | undefined) => void;
10
+ restartAdapter: () => Promise<void>;
11
+ /** Optional: adapters that use SessionManager expose it here for richer session data */
12
+ getSessionManager?: () => SessionManager | undefined;
13
+ }
14
+ export declare function createSessionsRouter(cfg: AppConfig, ws: WsServerManager, eventStore: EventStore, summarizer: Summarizer, controller: SessionController): Router;
15
+ //# sourceMappingURL=sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/routes/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA+B,MAAM,SAAS,CAAC;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AA6C3D,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACxC,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAClD,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,wFAAwF;IACxF,iBAAiB,CAAC,EAAE,MAAM,cAAc,GAAG,SAAS,CAAC;CACtD;AAgGD,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,SAAS,EACd,EAAE,EAAE,eAAe,EACnB,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,iBAAiB,GAC5B,MAAM,CA+XR"}