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.
- package/README.md +368 -0
- package/bin/noter.js +218 -0
- package/bin/noter.js.map +1 -0
- package/package.json +73 -0
- package/packages/client/dist/assets/geist-mono-latin-400-normal-CoULgQGM.woff +0 -0
- package/packages/client/dist/assets/geist-mono-latin-400-normal-LC9RFr9I.woff2 +0 -0
- package/packages/client/dist/assets/index-CBiNAMaA.js +264 -0
- package/packages/client/dist/assets/index-u7i5Fle2.css +1 -0
- package/packages/client/dist/assets/space-grotesk-latin-500-normal-CNSSEhBt.woff +0 -0
- package/packages/client/dist/assets/space-grotesk-latin-500-normal-lFbtlQH6.woff2 +0 -0
- package/packages/client/dist/assets/space-grotesk-latin-600-normal-BflQw4A9.woff +0 -0
- package/packages/client/dist/assets/space-grotesk-latin-600-normal-DjKNqYRj.woff2 +0 -0
- package/packages/client/dist/assets/vendor-react-DHeZC_T5.js +17 -0
- package/packages/client/dist/index.html +14 -0
- package/packages/server/dist/adapters/claudeAdapter.d.ts +34 -0
- package/packages/server/dist/adapters/claudeAdapter.d.ts.map +1 -0
- package/packages/server/dist/adapters/claudeAdapter.js +281 -0
- package/packages/server/dist/adapters/claudeAdapter.js.map +1 -0
- package/packages/server/dist/adapters/codexAdapter.d.ts +39 -0
- package/packages/server/dist/adapters/codexAdapter.d.ts.map +1 -0
- package/packages/server/dist/adapters/codexAdapter.js +347 -0
- package/packages/server/dist/adapters/codexAdapter.js.map +1 -0
- package/packages/server/dist/adapters/droidAdapter.d.ts +34 -0
- package/packages/server/dist/adapters/droidAdapter.d.ts.map +1 -0
- package/packages/server/dist/adapters/droidAdapter.js +109 -0
- package/packages/server/dist/adapters/droidAdapter.js.map +1 -0
- package/packages/server/dist/adapters/genericAdapter.d.ts +50 -0
- package/packages/server/dist/adapters/genericAdapter.d.ts.map +1 -0
- package/packages/server/dist/adapters/genericAdapter.js +203 -0
- package/packages/server/dist/adapters/genericAdapter.js.map +1 -0
- package/packages/server/dist/adapters/index.d.ts +7 -0
- package/packages/server/dist/adapters/index.d.ts.map +1 -0
- package/packages/server/dist/adapters/index.js +7 -0
- package/packages/server/dist/adapters/index.js.map +1 -0
- package/packages/server/dist/adapters/opencodeAdapter.d.ts +28 -0
- package/packages/server/dist/adapters/opencodeAdapter.d.ts.map +1 -0
- package/packages/server/dist/adapters/opencodeAdapter.js +265 -0
- package/packages/server/dist/adapters/opencodeAdapter.js.map +1 -0
- package/packages/server/dist/adapters/opencodeSessionManager.d.ts +13 -0
- package/packages/server/dist/adapters/opencodeSessionManager.d.ts.map +1 -0
- package/packages/server/dist/adapters/opencodeSessionManager.js +230 -0
- package/packages/server/dist/adapters/opencodeSessionManager.js.map +1 -0
- package/packages/server/dist/adapters/pathUtils.d.ts +54 -0
- package/packages/server/dist/adapters/pathUtils.d.ts.map +1 -0
- package/packages/server/dist/adapters/pathUtils.js +86 -0
- package/packages/server/dist/adapters/pathUtils.js.map +1 -0
- package/packages/server/dist/adapters/piAdapter.d.ts +34 -0
- package/packages/server/dist/adapters/piAdapter.d.ts.map +1 -0
- package/packages/server/dist/adapters/piAdapter.js +307 -0
- package/packages/server/dist/adapters/piAdapter.js.map +1 -0
- package/packages/server/dist/autoDetect.d.ts +15 -0
- package/packages/server/dist/autoDetect.d.ts.map +1 -0
- package/packages/server/dist/autoDetect.js +102 -0
- package/packages/server/dist/autoDetect.js.map +1 -0
- package/packages/server/dist/config.d.ts +29 -0
- package/packages/server/dist/config.d.ts.map +1 -0
- package/packages/server/dist/config.js +96 -0
- package/packages/server/dist/config.js.map +1 -0
- package/packages/server/dist/eventStore.d.ts +14 -0
- package/packages/server/dist/eventStore.d.ts.map +1 -0
- package/packages/server/dist/eventStore.js +35 -0
- package/packages/server/dist/eventStore.js.map +1 -0
- package/packages/server/dist/hookWatcher.d.ts +24 -0
- package/packages/server/dist/hookWatcher.d.ts.map +1 -0
- package/packages/server/dist/hookWatcher.js +152 -0
- package/packages/server/dist/hookWatcher.js.map +1 -0
- package/packages/server/dist/index.d.ts +58 -0
- package/packages/server/dist/index.d.ts.map +1 -0
- package/packages/server/dist/index.js +527 -0
- package/packages/server/dist/index.js.map +1 -0
- package/packages/server/dist/llm/jsonExtractor.d.ts +39 -0
- package/packages/server/dist/llm/jsonExtractor.d.ts.map +1 -0
- package/packages/server/dist/llm/jsonExtractor.js +83 -0
- package/packages/server/dist/llm/jsonExtractor.js.map +1 -0
- package/packages/server/dist/llm/ollamaCache.d.ts +19 -0
- package/packages/server/dist/llm/ollamaCache.d.ts.map +1 -0
- package/packages/server/dist/llm/ollamaCache.js +31 -0
- package/packages/server/dist/llm/ollamaCache.js.map +1 -0
- package/packages/server/dist/llm/ollamaClient.d.ts +29 -0
- package/packages/server/dist/llm/ollamaClient.d.ts.map +1 -0
- package/packages/server/dist/llm/ollamaClient.js +117 -0
- package/packages/server/dist/llm/ollamaClient.js.map +1 -0
- package/packages/server/dist/llm/ollamaQueue.d.ts +7 -0
- package/packages/server/dist/llm/ollamaQueue.d.ts.map +1 -0
- package/packages/server/dist/llm/ollamaQueue.js +28 -0
- package/packages/server/dist/llm/ollamaQueue.js.map +1 -0
- package/packages/server/dist/llm/promptBuilder.d.ts +8 -0
- package/packages/server/dist/llm/promptBuilder.d.ts.map +1 -0
- package/packages/server/dist/llm/promptBuilder.js +85 -0
- package/packages/server/dist/llm/promptBuilder.js.map +1 -0
- package/packages/server/dist/llm/promptSections.d.ts +64 -0
- package/packages/server/dist/llm/promptSections.d.ts.map +1 -0
- package/packages/server/dist/llm/promptSections.js +128 -0
- package/packages/server/dist/llm/promptSections.js.map +1 -0
- package/packages/server/dist/llm/providerModels.d.ts +14 -0
- package/packages/server/dist/llm/providerModels.d.ts.map +1 -0
- package/packages/server/dist/llm/providerModels.js +67 -0
- package/packages/server/dist/llm/providerModels.js.map +1 -0
- package/packages/server/dist/llm/suggester.d.ts +12 -0
- package/packages/server/dist/llm/suggester.d.ts.map +1 -0
- package/packages/server/dist/llm/suggester.js +263 -0
- package/packages/server/dist/llm/suggester.js.map +1 -0
- package/packages/server/dist/llm/summarizer.d.ts +53 -0
- package/packages/server/dist/llm/summarizer.d.ts.map +1 -0
- package/packages/server/dist/llm/summarizer.js +174 -0
- package/packages/server/dist/llm/summarizer.js.map +1 -0
- package/packages/server/dist/persistence.d.ts +42 -0
- package/packages/server/dist/persistence.d.ts.map +1 -0
- package/packages/server/dist/persistence.js +103 -0
- package/packages/server/dist/persistence.js.map +1 -0
- package/packages/server/dist/repoContext.d.ts +60 -0
- package/packages/server/dist/repoContext.d.ts.map +1 -0
- package/packages/server/dist/repoContext.js +197 -0
- package/packages/server/dist/repoContext.js.map +1 -0
- package/packages/server/dist/routes/blueprint.d.ts +7 -0
- package/packages/server/dist/routes/blueprint.d.ts.map +1 -0
- package/packages/server/dist/routes/blueprint.js +529 -0
- package/packages/server/dist/routes/blueprint.js.map +1 -0
- package/packages/server/dist/routes/config.d.ts +17 -0
- package/packages/server/dist/routes/config.d.ts.map +1 -0
- package/packages/server/dist/routes/config.js +282 -0
- package/packages/server/dist/routes/config.js.map +1 -0
- package/packages/server/dist/routes/lmstudio.d.ts +4 -0
- package/packages/server/dist/routes/lmstudio.d.ts.map +1 -0
- package/packages/server/dist/routes/lmstudio.js +67 -0
- package/packages/server/dist/routes/lmstudio.js.map +1 -0
- package/packages/server/dist/routes/notes.d.ts +5 -0
- package/packages/server/dist/routes/notes.d.ts.map +1 -0
- package/packages/server/dist/routes/notes.js +60 -0
- package/packages/server/dist/routes/notes.js.map +1 -0
- package/packages/server/dist/routes/ollama.d.ts +4 -0
- package/packages/server/dist/routes/ollama.d.ts.map +1 -0
- package/packages/server/dist/routes/ollama.js +207 -0
- package/packages/server/dist/routes/ollama.js.map +1 -0
- package/packages/server/dist/routes/prompt.d.ts +4 -0
- package/packages/server/dist/routes/prompt.d.ts.map +1 -0
- package/packages/server/dist/routes/prompt.js +75 -0
- package/packages/server/dist/routes/prompt.js.map +1 -0
- package/packages/server/dist/routes/refineNotes.d.ts +4 -0
- package/packages/server/dist/routes/refineNotes.d.ts.map +1 -0
- package/packages/server/dist/routes/refineNotes.js +87 -0
- package/packages/server/dist/routes/refineNotes.js.map +1 -0
- package/packages/server/dist/routes/repoContext.d.ts +3 -0
- package/packages/server/dist/routes/repoContext.d.ts.map +1 -0
- package/packages/server/dist/routes/repoContext.js +15 -0
- package/packages/server/dist/routes/repoContext.js.map +1 -0
- package/packages/server/dist/routes/sessions.d.ts +15 -0
- package/packages/server/dist/routes/sessions.d.ts.map +1 -0
- package/packages/server/dist/routes/sessions.js +420 -0
- package/packages/server/dist/routes/sessions.js.map +1 -0
- package/packages/server/dist/routes/summarize.d.ts +6 -0
- package/packages/server/dist/routes/summarize.d.ts.map +1 -0
- package/packages/server/dist/routes/summarize.js +85 -0
- package/packages/server/dist/routes/summarize.js.map +1 -0
- package/packages/server/dist/server.d.ts +2 -0
- package/packages/server/dist/server.d.ts.map +1 -0
- package/packages/server/dist/server.js +6 -0
- package/packages/server/dist/server.js.map +1 -0
- package/packages/server/dist/sessionManager.d.ts +41 -0
- package/packages/server/dist/sessionManager.d.ts.map +1 -0
- package/packages/server/dist/sessionManager.js +493 -0
- package/packages/server/dist/sessionManager.js.map +1 -0
- package/packages/server/dist/sessionScanner.d.ts +22 -0
- package/packages/server/dist/sessionScanner.d.ts.map +1 -0
- package/packages/server/dist/sessionScanner.js +165 -0
- package/packages/server/dist/sessionScanner.js.map +1 -0
- package/packages/server/dist/sessionTitle.d.ts +17 -0
- package/packages/server/dist/sessionTitle.d.ts.map +1 -0
- package/packages/server/dist/sessionTitle.js +321 -0
- package/packages/server/dist/sessionTitle.js.map +1 -0
- package/packages/server/dist/stateManager.d.ts +38 -0
- package/packages/server/dist/stateManager.d.ts.map +1 -0
- package/packages/server/dist/stateManager.js +83 -0
- package/packages/server/dist/stateManager.js.map +1 -0
- package/packages/server/dist/wsServer.d.ts +27 -0
- package/packages/server/dist/wsServer.d.ts.map +1 -0
- package/packages/server/dist/wsServer.js +144 -0
- package/packages/server/dist/wsServer.js.map +1 -0
- package/packages/shared/dist/index.d.ts +3 -0
- package/packages/shared/dist/index.d.ts.map +1 -0
- package/packages/shared/dist/index.js +3 -0
- package/packages/shared/dist/index.js.map +1 -0
- package/packages/shared/dist/llm/mambaDetect.d.ts +84 -0
- package/packages/shared/dist/llm/mambaDetect.d.ts.map +1 -0
- package/packages/shared/dist/llm/mambaDetect.js +205 -0
- package/packages/shared/dist/llm/mambaDetect.js.map +1 -0
- package/packages/shared/dist/types.d.ts +184 -0
- package/packages/shared/dist/types.d.ts.map +1 -0
- package/packages/shared/dist/types.js +2 -0
- package/packages/shared/dist/types.js.map +1 -0
- 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"}
|