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,529 @@
1
+ import { Router } from 'express';
2
+ import { z } from 'zod';
3
+ import { generateText, zodSchema, streamText, stepCountIs } from 'ai';
4
+ import { getModel, getModelName } from '../llm/providerModels.js';
5
+ import { MissingApiKeyError } from '../llm/promptBuilder.js';
6
+ import { getToolCallingTier, buildJSONToolPrompt, isThinkingModel, stripThinkingBlocks } from '../../../shared/dist/llm/mambaDetect.js';
7
+ import { TOKEN_BUDGETS } from '../llm/promptSections.js';
8
+ // --- Context7 tool implementation ---
9
+ export async function context7SearchImpl(query, apiKey) {
10
+ try {
11
+ const resolveRes = await fetch('https://context7.com/api/v1/resolve', {
12
+ method: 'POST',
13
+ headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${apiKey}` },
14
+ body: JSON.stringify({ query: query.slice(0, 200) }),
15
+ });
16
+ if (!resolveRes.ok)
17
+ return `Context7: resolve failed (${resolveRes.status})`;
18
+ const resolveData = await resolveRes.json();
19
+ const libraryId = resolveData?.libraryId || resolveData?.id;
20
+ if (!libraryId)
21
+ return 'Context7: no matching library found';
22
+ const docsRes = await fetch('https://context7.com/api/v1/query', {
23
+ method: 'POST',
24
+ headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${apiKey}` },
25
+ body: JSON.stringify({ libraryId, query: query.slice(0, 200) }),
26
+ });
27
+ if (!docsRes.ok)
28
+ return `Context7: query failed (${docsRes.status})`;
29
+ const docsData = await docsRes.json();
30
+ const snippets = (docsData?.results || docsData?.snippets || []).slice(0, 3)
31
+ .map((r) => r.text || r.content || '').filter(Boolean);
32
+ return snippets.length > 0
33
+ ? snippets.join('\n---\n')
34
+ : 'Context7: no documentation snippets found';
35
+ }
36
+ catch (err) {
37
+ const msg = err instanceof Error ? err.message : 'Unknown error';
38
+ console.error('[blueprint] Context7 tool error:', msg);
39
+ return `Context7 error: ${msg}`;
40
+ }
41
+ }
42
+ // --- Exa tool implementation ---
43
+ export async function exaSearchImpl(query, apiKey) {
44
+ try {
45
+ const res = await fetch('https://api.exa.ai/search', {
46
+ method: 'POST',
47
+ headers: { 'Content-Type': 'application/json', 'x-api-key': apiKey },
48
+ body: JSON.stringify({
49
+ query: query.slice(0, 300),
50
+ numResults: 3,
51
+ type: 'neural',
52
+ contents: { text: { maxCharacters: 800 } },
53
+ }),
54
+ });
55
+ if (!res.ok)
56
+ return `Exa: search failed (${res.status})`;
57
+ const data = await res.json();
58
+ const results = (data?.results || []).slice(0, 3)
59
+ .map((r) => {
60
+ const title = r.title || '';
61
+ const text = r.text || '';
62
+ return text ? `${title}\n${text}` : '';
63
+ }).filter(Boolean);
64
+ return results.length > 0
65
+ ? results.join('\n---\n')
66
+ : 'Exa: no search results found';
67
+ }
68
+ catch (err) {
69
+ const msg = err instanceof Error ? err.message : 'Unknown error';
70
+ console.error('[blueprint] Exa tool error:', msg);
71
+ return `Exa error: ${msg}`;
72
+ }
73
+ }
74
+ // --- Build tool definitions for ai-sdk ---
75
+ export function buildGroundingTools(config) {
76
+ const tools = {};
77
+ if (config.context7ApiKey) {
78
+ tools.context7Search = {
79
+ description: 'Search Context7 docs for library versions, APIs, best practices. Use before tech stack decisions.',
80
+ parameters: zodSchema(z.object({
81
+ query: z.string().describe('Library name or API concept'),
82
+ })),
83
+ execute: async (input) => {
84
+ const query = input.query;
85
+ console.error('[blueprint] Context7 tool invoked:', query.slice(0, 100));
86
+ const result = await context7SearchImpl(query, config.context7ApiKey);
87
+ console.error('[blueprint] Context7 tool result length:', result.length);
88
+ return result;
89
+ },
90
+ };
91
+ }
92
+ if (config.exaApiKey) {
93
+ tools.exaWebSearch = {
94
+ description: 'Search web for current best practices and docs. Use to verify assumptions or find current patterns.',
95
+ parameters: zodSchema(z.object({
96
+ query: z.string().describe('Search query for current information'),
97
+ })),
98
+ execute: async (input) => {
99
+ const query = input.query;
100
+ console.error('[blueprint] Exa tool invoked:', query.slice(0, 100));
101
+ const result = await exaSearchImpl(query, config.exaApiKey);
102
+ console.error('[blueprint] Exa tool result length:', result.length);
103
+ return result;
104
+ },
105
+ };
106
+ }
107
+ return tools;
108
+ }
109
+ // --- Legacy grounding for streaming endpoint (no tool support) ---
110
+ async function gatherGrounding(notesContent, agentsMdContent, config) {
111
+ const sections = [];
112
+ const techHints = agentsMdContent?.trim()
113
+ ? `technologies mentioned in AGENTS.md: ${agentsMdContent.slice(0, 200)}`
114
+ : '';
115
+ const searchQuery = `modern best practices for: ${notesContent.slice(0, 300)}${techHints ? `. ${techHints}` : ''}`;
116
+ if (config.context7ApiKey) {
117
+ const ctx7 = await context7SearchImpl(searchQuery, config.context7ApiKey);
118
+ if (ctx7 && !ctx7.startsWith('Context7 error') && !ctx7.startsWith('Context7: no')) {
119
+ sections.push(`## Context7 Grounding\n${ctx7}`);
120
+ }
121
+ }
122
+ if (config.exaApiKey) {
123
+ const exa = await exaSearchImpl(searchQuery, config.exaApiKey);
124
+ if (exa && !exa.startsWith('Exa error') && !exa.startsWith('Exa: no')) {
125
+ sections.push(`## Exa Grounding\n${exa}`);
126
+ }
127
+ }
128
+ return sections.join('\n\n');
129
+ }
130
+ const BlueprintGenerateSchema = z.object({
131
+ notesContent: z.string().min(1, 'Notes content must not be empty'),
132
+ agentsMdContent: z.string().optional(),
133
+ phaseToRegenerate: z.number().int().positive().optional(),
134
+ });
135
+ const AgentsMdEditSchema = z.object({
136
+ agentsMdContent: z.string().min(1, 'AGENTS.md content must not be empty'),
137
+ editInstruction: z.string().min(1, 'Edit instruction must not be empty'),
138
+ });
139
+ function buildSpecPrompt(notesContent, agentsMdContent, phaseToRegenerate, groundingContext) {
140
+ const budget = TOKEN_BUDGETS.blueprint;
141
+ const agentsSection = agentsMdContent?.trim()
142
+ ? `\n## Constraints (AGENTS.md)\n${(agentsMdContent.length > budget.maxAgentsMdChars ? agentsMdContent.slice(0, budget.maxAgentsMdChars) + "…[truncated]" : agentsMdContent)}\n`
143
+ : '';
144
+ const phaseDirective = phaseToRegenerate
145
+ ? `\nRegenerate ONLY Phase ${phaseToRegenerate}.\n`
146
+ : '';
147
+ // Cap grounding context to prevent unbounded token waste
148
+ const cappedGrounding = groundingContext && groundingContext.length > budget.maxGroundingChars
149
+ ? groundingContext.slice(0, budget.maxGroundingChars) + '…[truncated]'
150
+ : groundingContext;
151
+ const groundingSection = cappedGrounding?.trim()
152
+ ? `\n## Grounding (verified)\n${cappedGrounding}\n`
153
+ : '';
154
+ return `Spec-Driven Development architect. Generate phased implementation spec from developer intent.
155
+
156
+ ${agentsSection}
157
+ ${groundingSection}
158
+ ## Intent
159
+ ${notesContent}
160
+
161
+ ${phaseDirective}
162
+ ## Task
163
+ 1. Analyze intent
164
+ 2. Break into numbered phases
165
+ 3. Per phase: number+title, techStack (lib@version), rationale, self-contained prompt
166
+ 4. If ambiguous intent, list ≤3 clarification questions
167
+
168
+ ## Output
169
+ Return a JSON object with keys:
170
+ - phases: array of (id, phaseNumber, title, techStack, rationale, prompt, tokenCount)
171
+ - clarifications: array of (id, type, anchorText, question, assumption, options)
172
+
173
+ Rules:
174
+ - Each phase prompt SELF-CONTAINED — no prior context assumed
175
+ - Prepend AGENTS.md to every prompt if present
176
+ - Ask only developer-answerable questions
177
+ - tokenCount ≈ prompt.length / 4
178
+ - Return ONLY JSON, no markdown fences`;
179
+ }
180
+ function buildAgentsMdEditPrompt(agentsMdContent, editInstruction) {
181
+ return `Edit AGENTS.md. Apply instruction faithfully.
182
+
183
+ Current:
184
+ ${agentsMdContent}
185
+
186
+ Instruction: ${editInstruction}
187
+
188
+ Rules: Preserve structure+valid markdown. Return ONLY updated content, no explanation, no fences.`;
189
+ }
190
+ export function createBlueprintRouter(config) {
191
+ const router = Router();
192
+ router.post('/generate', async (req, res) => {
193
+ const parseResult = BlueprintGenerateSchema.safeParse(req.body);
194
+ if (!parseResult.success) {
195
+ res.status(400).json({
196
+ error: `Validation failed: ${parseResult.error.issues.map(i => i.message).join(', ')}`,
197
+ });
198
+ return;
199
+ }
200
+ const { notesContent, agentsMdContent, phaseToRegenerate } = parseResult.data;
201
+ try {
202
+ const provider = config.llmProvider || 'ollama';
203
+ const model = getModel(provider, config);
204
+ // Build grounding tools if API keys are available and provider supports tool calling
205
+ const supportsToolCalling = ['anthropic', 'openai', 'gemini'].includes(provider);
206
+ const modelName = getModelName(provider, config);
207
+ const toolTier = getToolCallingTier(modelName, provider);
208
+ // Tier 1 (native): use AI SDK tools directly
209
+ // Tier 2 (json-schema): Mamba/small models → inject tool schema into prompt, no native tools
210
+ const groundingTools = (supportsToolCalling && toolTier === 'native') ? buildGroundingTools(config) : {};
211
+ const hasTools = Object.keys(groundingTools).length > 0;
212
+ // If not Tier 1 but grounding keys exist, use fallback prompt injection
213
+ let groundingContext;
214
+ if (!hasTools && (config.context7ApiKey || config.exaApiKey)) {
215
+ groundingContext = await gatherGrounding(notesContent, agentsMdContent, config);
216
+ }
217
+ const prompt = buildSpecPrompt(notesContent, agentsMdContent, phaseToRegenerate, groundingContext);
218
+ // Tier 2: inject grounding tool schemas into prompt for JSON-schema-guided calling
219
+ let effectivePrompt = prompt;
220
+ let rawOutput;
221
+ if (hasTools) {
222
+ // Tier 1: native tool calling with AI SDK
223
+ console.error('[blueprint] Generating with grounding tools (native):', Object.keys(groundingTools).join(', '));
224
+ const result = await generateText({
225
+ model,
226
+ prompt,
227
+ tools: groundingTools,
228
+ stopWhen: stepCountIs(5),
229
+ });
230
+ rawOutput = result.text;
231
+ }
232
+ else if (toolTier === 'json-schema' && (config.context7ApiKey || config.exaApiKey)) {
233
+ // Tier 2: JSON-schema-guided tool calling for Mamba/small models
234
+ console.error('[blueprint] Generating with JSON-schema grounding (Tier 2) for model:', modelName);
235
+ const groundingResult = await gatherGrounding(notesContent, agentsMdContent, config);
236
+ const toolsForPrompt = [];
237
+ if (config.context7ApiKey) {
238
+ toolsForPrompt.push({
239
+ name: 'context7Search',
240
+ description: 'Search Context7 documentation to verify library versions, APIs, and best practices.',
241
+ parameters: { type: 'object', properties: { query: { type: 'string', description: 'Search query' } }, required: ['query'] },
242
+ });
243
+ }
244
+ if (config.exaApiKey) {
245
+ toolsForPrompt.push({
246
+ name: 'exaWebSearch',
247
+ description: 'Search the web for current best practices and latest documentation.',
248
+ parameters: { type: 'object', properties: { query: { type: 'string', description: 'Search query' } }, required: ['query'] },
249
+ });
250
+ }
251
+ effectivePrompt = buildJSONToolPrompt(toolsForPrompt, prompt, 'You are a Spec-Driven Development architect.');
252
+ const result = await generateText({ model, prompt: effectivePrompt });
253
+ rawOutput = result.text;
254
+ }
255
+ else {
256
+ // No tools available — plain generation
257
+ console.error('[blueprint] Generating without grounding tools');
258
+ const result = await generateText({ model, prompt });
259
+ rawOutput = result.text;
260
+ }
261
+ // Strip thinking blocks from output for thinking models
262
+ if (isThinkingModel(modelName)) {
263
+ rawOutput = stripThinkingBlocks(rawOutput);
264
+ }
265
+ let parsed;
266
+ try {
267
+ const cleaned = rawOutput.replace(/^```json?\n?/, '').replace(/\n?```$/, '').trim();
268
+ parsed = JSON.parse(cleaned);
269
+ // Ensure token counts are populated
270
+ for (const phase of parsed.phases) {
271
+ if (!phase.tokenCount || phase.tokenCount === 0) {
272
+ phase.tokenCount = Math.ceil(phase.prompt.length / 4);
273
+ }
274
+ if (!phase.id) {
275
+ phase.id = `phase-${phase.phaseNumber}`;
276
+ }
277
+ }
278
+ for (const cl of parsed.clarifications) {
279
+ if (!cl.id) {
280
+ cl.id = `cl-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
281
+ }
282
+ }
283
+ }
284
+ catch {
285
+ // If JSON parse fails, return a single phase with raw output
286
+ parsed = {
287
+ phases: [{
288
+ id: 'phase-1',
289
+ phaseNumber: 1,
290
+ title: 'Implementation Plan',
291
+ techStack: [],
292
+ rationale: 'Generated from developer intent',
293
+ prompt: rawOutput,
294
+ tokenCount: Math.ceil(rawOutput.length / 4),
295
+ status: 'done',
296
+ }],
297
+ clarifications: [],
298
+ };
299
+ }
300
+ res.status(200).json(parsed);
301
+ }
302
+ catch (error) {
303
+ const message = error instanceof Error ? error.message : 'Unknown error';
304
+ if (error instanceof MissingApiKeyError) {
305
+ res.status(400).json({ error: `${error.provider} API key not configured. Set it in Settings.` });
306
+ return;
307
+ }
308
+ res.status(500).json({ error: `Blueprint generation failed: ${message}` });
309
+ }
310
+ });
311
+ router.post('/generate-stream', async (req, res) => {
312
+ const parseResult = BlueprintGenerateSchema.safeParse(req.body);
313
+ if (!parseResult.success) {
314
+ res.status(400).json({
315
+ error: `Validation failed: ${parseResult.error.issues.map(i => i.message).join(', ')}`,
316
+ });
317
+ return;
318
+ }
319
+ const { notesContent, agentsMdContent } = parseResult.data;
320
+ try {
321
+ const provider = config.llmProvider || 'ollama';
322
+ const model = getModel(provider, config);
323
+ const modelName = getModelName(provider, config);
324
+ const toolTier = getToolCallingTier(modelName, provider);
325
+ // Grounding: gather external context before generation
326
+ // Tier 2 models: use prompt injection (no native tool calling)
327
+ let groundingContext = '';
328
+ if (config.context7ApiKey || config.exaApiKey) {
329
+ groundingContext = await gatherGrounding(notesContent, agentsMdContent, config);
330
+ }
331
+ const prompt = buildSpecPrompt(notesContent, agentsMdContent, undefined, groundingContext);
332
+ res.setHeader('Content-Type', 'text/plain; charset=utf-8');
333
+ res.setHeader('Transfer-Encoding', 'chunked');
334
+ res.setHeader('Cache-Control', 'no-cache');
335
+ const stream = await streamText({ model, prompt });
336
+ for await (const chunk of stream.textStream) {
337
+ res.write(chunk);
338
+ }
339
+ res.end();
340
+ }
341
+ catch (error) {
342
+ const message = error instanceof Error ? error.message : 'Unknown error';
343
+ if (error instanceof MissingApiKeyError) {
344
+ res.status(400).json({ error: `${error.provider} API key not configured. Set it in Settings.` });
345
+ return;
346
+ }
347
+ if (!res.headersSent) {
348
+ res.status(500).json({ error: `Blueprint generation failed: ${message}` });
349
+ }
350
+ else {
351
+ res.end();
352
+ }
353
+ }
354
+ });
355
+ // Grounding endpoint — proxy Context7/Exa search for client-side spec generation
356
+ router.post('/ground', async (req, res) => {
357
+ const query = req.body?.query;
358
+ if (typeof query !== 'string' || !query.trim()) {
359
+ res.status(400).json({ error: 'query must be a non-empty string' });
360
+ return;
361
+ }
362
+ try {
363
+ const results = {};
364
+ if (config.context7ApiKey) {
365
+ const ctx7Result = await context7SearchImpl(query, config.context7ApiKey);
366
+ results.context7 = ctx7Result;
367
+ }
368
+ if (config.exaApiKey) {
369
+ const exaResult = await exaSearchImpl(query, config.exaApiKey);
370
+ results.exa = exaResult;
371
+ }
372
+ if (Object.keys(results).length === 0) {
373
+ res.json({ grounding: '', toolsAvailable: [], warning: 'No grounding API keys configured. Set Context7/Exa keys in Blueprint Model Settings.' });
374
+ return;
375
+ }
376
+ const sections = [];
377
+ if (results.context7 && !results.context7.startsWith('Context7 error') && !results.context7.startsWith('Context7: no')) {
378
+ sections.push(`## Context7\n${results.context7}`);
379
+ }
380
+ if (results.exa && !results.exa.startsWith('Exa error') && !results.exa.startsWith('Exa: no')) {
381
+ sections.push(`## Exa\n${results.exa}`);
382
+ }
383
+ res.json({
384
+ grounding: sections.join('\n\n'),
385
+ toolsAvailable: Object.keys(results),
386
+ toolResults: results,
387
+ });
388
+ }
389
+ catch (error) {
390
+ const message = error instanceof Error ? error.message : 'Unknown error';
391
+ res.status(500).json({ error: `Grounding failed: ${message}` });
392
+ }
393
+ });
394
+ router.post('/agents-md-edit', async (req, res) => {
395
+ const parseResult = AgentsMdEditSchema.safeParse(req.body);
396
+ if (!parseResult.success) {
397
+ res.status(400).json({
398
+ error: `Validation failed: ${parseResult.error.issues.map(i => i.message).join(', ')}`,
399
+ });
400
+ return;
401
+ }
402
+ const { agentsMdContent, editInstruction } = parseResult.data;
403
+ try {
404
+ const provider = config.llmProvider || 'ollama';
405
+ const model = getModel(provider, config);
406
+ const prompt = buildAgentsMdEditPrompt(agentsMdContent, editInstruction);
407
+ const { text: updatedContent } = await generateText({ model, prompt });
408
+ res.status(200).json({ updatedContent: updatedContent.trim() });
409
+ }
410
+ catch (error) {
411
+ const message = error instanceof Error ? error.message : 'Unknown error';
412
+ if (error instanceof MissingApiKeyError) {
413
+ res.status(400).json({ error: `${error.provider} API key not configured. Set it in Settings.` });
414
+ return;
415
+ }
416
+ res.status(500).json({ error: `AGENTS.md edit failed: ${message}` });
417
+ }
418
+ });
419
+ // Server-side LM Studio streaming proxy — avoids CORS issues with browser→LM Studio direct fetch.
420
+ // The browser POSTs to this route; the server proxies the request to LM Studio server-side
421
+ // and streams SSE chunks back progressively.
422
+ router.post('/lm-studio-stream', async (req, res) => {
423
+ const { baseUrl, model, prompt, contextLength } = req.body || {};
424
+ if (typeof baseUrl !== 'string' || !baseUrl.trim()) {
425
+ res.status(400).json({ error: 'LM Studio base URL is not configured' });
426
+ return;
427
+ }
428
+ if (typeof model !== 'string' || !model.trim()) {
429
+ res.status(400).json({ error: 'LM Studio model is not configured' });
430
+ return;
431
+ }
432
+ if (typeof prompt !== 'string' || !prompt.trim()) {
433
+ res.status(400).json({ error: 'Prompt must not be empty' });
434
+ return;
435
+ }
436
+ // Normalize base URL: ensure /v1 suffix
437
+ let normalizedUrl = baseUrl.trim().replace(/\/+$/, '');
438
+ if (!normalizedUrl.endsWith('/v1')) {
439
+ normalizedUrl += '/v1';
440
+ }
441
+ const endpoint = `${normalizedUrl}/chat/completions`;
442
+ // Build request body with sensible defaults for local models
443
+ const requestBody = {
444
+ model,
445
+ messages: [{ role: 'user', content: prompt }],
446
+ stream: true,
447
+ max_tokens: -1, // Let the model decide when to stop
448
+ };
449
+ // Pass context length if configured (helps small models allocate appropriate KV cache)
450
+ if (typeof contextLength === 'number' && contextLength > 0) {
451
+ requestBody.max_tokens = contextLength;
452
+ }
453
+ try {
454
+ const lmStudioRes = await fetch(endpoint, {
455
+ method: 'POST',
456
+ headers: {
457
+ 'Content-Type': 'application/json',
458
+ 'Authorization': 'Bearer lm-studio',
459
+ },
460
+ body: JSON.stringify(requestBody),
461
+ signal: AbortSignal.timeout(120_000),
462
+ });
463
+ if (!lmStudioRes.ok) {
464
+ const errorText = await lmStudioRes.text().catch(() => lmStudioRes.statusText);
465
+ if (lmStudioRes.status === 404) {
466
+ res.status(502).json({ error: `LM Studio model "${model}" not found. Verify the model is loaded.` });
467
+ return;
468
+ }
469
+ res.status(lmStudioRes.status).json({ error: `LM Studio returned ${lmStudioRes.status}: ${errorText.slice(0, 200)}` });
470
+ return;
471
+ }
472
+ // Set headers for SSE streaming — must flush before streaming
473
+ res.setHeader('Content-Type', 'text/event-stream');
474
+ res.setHeader('Cache-Control', 'no-cache');
475
+ res.setHeader('Connection', 'keep-alive');
476
+ res.setHeader('X-Accel-Buffering', 'no'); // Disable proxy buffering (nginx, etc.)
477
+ res.setHeader('Transfer-Encoding', 'chunked');
478
+ res.flushHeaders();
479
+ // Stream SSE chunks from LM Studio to the client progressively
480
+ const reader = lmStudioRes.body.getReader();
481
+ const decoder = new TextDecoder();
482
+ let parseBuffer = '';
483
+ try {
484
+ while (true) {
485
+ const { done, value } = await reader.read();
486
+ if (done)
487
+ break;
488
+ const chunk = decoder.decode(value, { stream: true });
489
+ // Write the raw chunk and flush immediately for progressive token delivery
490
+ const flushed = res.write(chunk);
491
+ // If the write wasn't flushed, drain the buffer periodically
492
+ if (!flushed) {
493
+ await new Promise((resolve) => res.once('drain', resolve));
494
+ }
495
+ }
496
+ // Send any remaining buffered data
497
+ if (parseBuffer.trim()) {
498
+ res.write(parseBuffer);
499
+ }
500
+ }
501
+ catch (streamErr) {
502
+ // Stream interrupted — client may have disconnected
503
+ console.error('[blueprint] LM Studio stream error:', streamErr instanceof Error ? streamErr.message : 'Unknown');
504
+ }
505
+ res.end();
506
+ }
507
+ catch (error) {
508
+ const message = error instanceof Error ? error.message : 'Unknown error';
509
+ if (message.includes('abort') || message.includes('timed out')) {
510
+ if (!res.headersSent) {
511
+ res.status(504).json({ error: 'LM Studio request timed out. The model may be loading or the prompt is too long.' });
512
+ }
513
+ else {
514
+ res.end();
515
+ }
516
+ return;
517
+ }
518
+ const baseUrl = normalizedUrl.replace(/\/v1$/, '');
519
+ if (!res.headersSent) {
520
+ res.status(502).json({ error: `LM Studio server is unreachable at ${baseUrl}. Check if the service is running and the endpoint URL is correct.` });
521
+ }
522
+ else {
523
+ res.end();
524
+ }
525
+ }
526
+ });
527
+ return router;
528
+ }
529
+ //# sourceMappingURL=blueprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blueprint.js","sourceRoot":"","sources":["../../src/routes/blueprint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
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
+ export interface AdapterController {
7
+ getAdapters: () => Record<string, unknown>;
8
+ setAdapter: (key: string, adapter: unknown) => void;
9
+ removeAdapter: (key: string) => void;
10
+ }
11
+ export interface ConfigRouterDeps {
12
+ controller: AdapterController;
13
+ /** Called when activeSource changes so the server can update sourceInfo and broadcast */
14
+ onSourceChange?: (newSource: string) => void;
15
+ }
16
+ export declare function createConfigRouter(cfg: AppConfig, ws: WsServerManager, _eventStore: EventStore, _summarizer: Summarizer, deps: ConfigRouterDeps): Router;
17
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/routes/config.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;AAuBvD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACpD,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,yFAAyF;IACzF,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,SAAS,EACd,EAAE,EAAE,eAAe,EACnB,WAAW,EAAE,UAAU,EACvB,WAAW,EAAE,UAAU,EACvB,IAAI,EAAE,gBAAgB,GACrB,MAAM,CA0QR"}