devsmind-mcp 2.4.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +326 -234
- package/dist/cli/activity.d.ts +9 -0
- package/dist/cli/activity.js +69 -0
- package/dist/cli/activity.js.map +1 -0
- package/dist/cli/describe.d.ts +31 -0
- package/dist/cli/describe.js +201 -0
- package/dist/cli/describe.js.map +1 -0
- package/dist/cli/diff.d.ts +14 -0
- package/dist/cli/diff.js +161 -0
- package/dist/cli/diff.js.map +1 -0
- package/dist/cli/embed.d.ts +6 -0
- package/dist/cli/embed.js +109 -0
- package/dist/cli/embed.js.map +1 -0
- package/dist/cli/extract-agent.d.ts +66 -0
- package/dist/cli/extract-agent.js +192 -0
- package/dist/cli/extract-agent.js.map +1 -0
- package/dist/cli/feedback.d.ts +11 -0
- package/dist/cli/feedback.js +90 -0
- package/dist/cli/feedback.js.map +1 -0
- package/dist/cli/index.js +128 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts +30 -0
- package/dist/cli/init.js +89 -18
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/integrations/memory-topics.d.ts +44 -0
- package/dist/cli/integrations/memory-topics.js +295 -0
- package/dist/cli/integrations/memory-topics.js.map +1 -0
- package/dist/cli/integrations/memory.d.ts +11 -5
- package/dist/cli/integrations/memory.js +132 -37
- package/dist/cli/integrations/memory.js.map +1 -1
- package/dist/cli/integrations/prompt.d.ts +8 -0
- package/dist/cli/integrations/prompt.js +24 -3
- package/dist/cli/integrations/prompt.js.map +1 -1
- package/dist/cli/integrations/registry.d.ts +19 -5
- package/dist/cli/integrations/registry.js +23 -13
- package/dist/cli/integrations/registry.js.map +1 -1
- package/dist/cli/llm-client.d.ts +116 -0
- package/dist/cli/llm-client.js +322 -0
- package/dist/cli/llm-client.js.map +1 -0
- package/dist/cli/rule.d.ts +22 -2
- package/dist/cli/rule.js +113 -32
- package/dist/cli/rule.js.map +1 -1
- package/dist/cli/runner.d.ts +21 -0
- package/dist/cli/runner.js +94 -276
- package/dist/cli/runner.js.map +1 -1
- package/dist/cli/sync-progress.d.ts +9 -0
- package/dist/cli/sync-progress.js +41 -0
- package/dist/cli/sync-progress.js.map +1 -0
- package/dist/cli/sync.js +5 -2
- package/dist/cli/sync.js.map +1 -1
- package/dist/cli/view.js +3 -2
- package/dist/cli/view.js.map +1 -1
- package/dist/cli/workflow.js +26 -20
- package/dist/cli/workflow.js.map +1 -1
- package/dist/db/activity.d.ts +200 -0
- package/dist/db/activity.js +347 -0
- package/dist/db/activity.js.map +1 -0
- package/dist/db/analyze.js +18 -6
- package/dist/db/analyze.js.map +1 -1
- package/dist/db/database.d.ts +583 -99
- package/dist/db/database.js +1825 -553
- package/dist/db/database.js.map +1 -1
- package/dist/db/edges.d.ts +24 -0
- package/dist/db/edges.js +84 -0
- package/dist/db/edges.js.map +1 -1
- package/dist/db/embedder.d.ts +39 -0
- package/dist/db/embedder.js +0 -0
- package/dist/db/embedder.js.map +1 -0
- package/dist/db/feedback.d.ts +128 -0
- package/dist/db/feedback.js +182 -0
- package/dist/db/feedback.js.map +1 -0
- package/dist/db/file-diff.d.ts +32 -0
- package/dist/db/file-diff.js +110 -0
- package/dist/db/file-diff.js.map +1 -0
- package/dist/db/grep.d.ts +78 -0
- package/dist/db/grep.js +475 -0
- package/dist/db/grep.js.map +1 -0
- package/dist/db/message-revert.d.ts +63 -0
- package/dist/db/message-revert.js +258 -0
- package/dist/db/message-revert.js.map +1 -0
- package/dist/db/revert.d.ts +31 -0
- package/dist/db/revert.js +108 -0
- package/dist/db/revert.js.map +1 -0
- package/dist/db/schema.d.ts +49 -4
- package/dist/db/schema.js +125 -73
- package/dist/db/schema.js.map +1 -1
- package/dist/db/search-index.d.ts +65 -0
- package/dist/db/search-index.js +74 -0
- package/dist/db/search-index.js.map +1 -0
- package/dist/db/staging.d.ts +90 -5
- package/dist/db/staging.js +148 -22
- package/dist/db/staging.js.map +1 -1
- package/dist/mcp/server.d.ts +29 -7
- package/dist/mcp/server.js +2584 -809
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/vendor/3d-force-graph.min.js +5 -0
- package/dist/mcp/vendor/force-graph.min.js +5 -0
- package/dist/mcp/vendor/model/model_int8.onnx +0 -0
- package/dist/mcp/vendor/model/vocab.txt +30522 -0
- package/dist/mcp/vendor/three.min.js +7 -0
- package/dist/mcp/view.css +419 -0
- package/dist/mcp/view.html +161 -0
- package/dist/mcp/view.js +245 -0
- package/dist/mcp/view_chat.js +382 -0
- package/dist/mcp/view_graph.js +576 -0
- package/dist/mcp/visualizer.d.ts +25 -2
- package/dist/mcp/visualizer.js +31 -4
- package/dist/mcp/visualizer.js.map +1 -1
- package/dist/utils/ast.d.ts +89 -0
- package/dist/utils/ast.js +378 -10
- package/dist/utils/ast.js.map +1 -1
- package/dist/utils/diff.d.ts +44 -0
- package/dist/utils/diff.js +78 -0
- package/dist/utils/diff.js.map +1 -0
- package/dist/utils/edit.d.ts +6 -0
- package/dist/utils/edit.js +47 -14
- package/dist/utils/edit.js.map +1 -1
- package/dist/utils/scanner.js +12 -4
- package/dist/utils/scanner.js.map +1 -1
- package/dist/utils/tokenize.d.ts +45 -0
- package/dist/utils/tokenize.js +129 -0
- package/dist/utils/tokenize.js.map +1 -0
- package/dist/utils/version.d.ts +14 -0
- package/dist/utils/version.js +61 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +18 -5
- package/dist/mcp/visualizer_2d.html +0 -635
- package/dist/mcp/visualizer_3d.html +0 -613
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.resolveLlmCredentials = resolveLlmCredentials;
|
|
37
|
+
exports.sendPrompt = sendPrompt;
|
|
38
|
+
exports.sendPromptWithRetry = sendPromptWithRetry;
|
|
39
|
+
exports.buildGeminiContents = buildGeminiContents;
|
|
40
|
+
exports.buildGeminiTools = buildGeminiTools;
|
|
41
|
+
exports.parseGeminiParts = parseGeminiParts;
|
|
42
|
+
exports.buildOllamaMessages = buildOllamaMessages;
|
|
43
|
+
exports.buildOllamaTools = buildOllamaTools;
|
|
44
|
+
exports.parseOllamaMessage = parseOllamaMessage;
|
|
45
|
+
exports.sendConversationTurn = sendConversationTurn;
|
|
46
|
+
exports.sendConversationTurnWithRetry = sendConversationTurnWithRetry;
|
|
47
|
+
const fs = __importStar(require("fs"));
|
|
48
|
+
const crypto = __importStar(require("crypto"));
|
|
49
|
+
const runner_1 = require("./runner");
|
|
50
|
+
const json_1 = require("../utils/json");
|
|
51
|
+
/**
|
|
52
|
+
* Resolves credentials for a provider from an explicit `--key`/`--url` or the environment,
|
|
53
|
+
* mirroring the precedence `runBackgroundIndexing`/`runBackgroundReindexing` already use —
|
|
54
|
+
* but THROWS instead of calling `process.exit`, so a library caller (like `devsmind describe`)
|
|
55
|
+
* can catch it and decide how to report the failure itself, rather than the process dying
|
|
56
|
+
* inside a function with no return value.
|
|
57
|
+
*/
|
|
58
|
+
function resolveLlmCredentials(opts) {
|
|
59
|
+
if (opts.provider === 'gemini') {
|
|
60
|
+
const model = opts.model || 'gemini-2.0-flash';
|
|
61
|
+
const apiKey = opts.key || process.env.GEMINI_API_KEY || '';
|
|
62
|
+
if (!apiKey)
|
|
63
|
+
throw new Error('Gemini API key is required. Pass --key or set GEMINI_API_KEY environment variable.');
|
|
64
|
+
return { provider: 'gemini', model, apiKey };
|
|
65
|
+
}
|
|
66
|
+
if (opts.provider === 'vertex') {
|
|
67
|
+
const model = opts.model || 'gemini-1.5-flash';
|
|
68
|
+
const inputKey = opts.key || process.env.GOOGLE_APPLICATION_CREDENTIALS || process.env.VERTEX_API_KEY || process.env.GEMINI_API_KEY || '';
|
|
69
|
+
if (!inputKey) {
|
|
70
|
+
throw new Error('Vertex AI requires a Service Account JSON path or Bearer Token. Pass --key or set GOOGLE_APPLICATION_CREDENTIALS / VERTEX_API_KEY environment variable.');
|
|
71
|
+
}
|
|
72
|
+
let vertexSaData = null;
|
|
73
|
+
try {
|
|
74
|
+
if (inputKey.trim().startsWith('{')) {
|
|
75
|
+
vertexSaData = JSON.parse(inputKey);
|
|
76
|
+
}
|
|
77
|
+
else if (fs.existsSync(inputKey)) {
|
|
78
|
+
vertexSaData = JSON.parse(fs.readFileSync(inputKey, 'utf-8'));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Treat as a raw token below.
|
|
83
|
+
}
|
|
84
|
+
const vertexProjectId = vertexSaData?.project_id || process.env.GCP_PROJECT_ID || process.env.VERTEX_PROJECT_ID || '';
|
|
85
|
+
const vertexLocation = process.env.GCP_LOCATION || process.env.VERTEX_LOCATION || 'us-central1';
|
|
86
|
+
if (!vertexSaData && !inputKey.startsWith('ya29.')) {
|
|
87
|
+
throw new Error('Vertex key must be a valid Service Account JSON file path, inline JSON, or raw OAuth access token starting with "ya29."');
|
|
88
|
+
}
|
|
89
|
+
if (!vertexProjectId) {
|
|
90
|
+
throw new Error('Vertex Project ID could not be determined. Please set GCP_PROJECT_ID environment variable or specify it in your service account JSON.');
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
provider: 'vertex',
|
|
94
|
+
model,
|
|
95
|
+
vertexSaData: vertexSaData || undefined,
|
|
96
|
+
vertexToken: vertexSaData ? undefined : inputKey,
|
|
97
|
+
vertexProjectId,
|
|
98
|
+
vertexLocation
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
// ollama
|
|
102
|
+
return { provider: 'ollama', model: opts.model || 'qwen2.5-coder', url: opts.url || 'http://localhost:11434' };
|
|
103
|
+
}
|
|
104
|
+
/** One prompt round-trip to whichever provider `creds` resolved to. Every provider is asked
|
|
105
|
+
* for a raw JSON response (no markdown fences) — callers parse with `safeJsonParse`, which
|
|
106
|
+
* already tolerates a fenced or slightly truncated response if a provider ignores that ask. */
|
|
107
|
+
async function sendPrompt(creds, systemPrompt, userPrompt) {
|
|
108
|
+
if (creds.provider === 'gemini') {
|
|
109
|
+
const url = `https://generativelanguage.googleapis.com/v1beta/models/${creds.model}:generateContent?key=${creds.apiKey}`;
|
|
110
|
+
const payload = {
|
|
111
|
+
contents: [{ parts: [{ text: userPrompt }] }],
|
|
112
|
+
systemInstruction: { parts: [{ text: systemPrompt }] },
|
|
113
|
+
generationConfig: { responseMimeType: 'application/json' }
|
|
114
|
+
};
|
|
115
|
+
const responseText = await (0, runner_1.makeHttpRequest)(url, 'POST', { 'Content-Type': 'application/json' }, JSON.stringify(payload));
|
|
116
|
+
const parsed = (0, json_1.safeJsonParse)(responseText, {});
|
|
117
|
+
return parsed.candidates?.[0]?.content?.parts?.[0]?.text || '';
|
|
118
|
+
}
|
|
119
|
+
if (creds.provider === 'vertex') {
|
|
120
|
+
const token = creds.vertexToken || await (0, runner_1.getVertexTokenCached)(creds.vertexSaData);
|
|
121
|
+
const url = `https://${creds.vertexLocation}-aiplatform.googleapis.com/v1/projects/${creds.vertexProjectId}/locations/${creds.vertexLocation}/publishers/google/models/${creds.model}:generateContent`;
|
|
122
|
+
const payload = {
|
|
123
|
+
contents: [{ role: 'user', parts: [{ text: userPrompt }] }],
|
|
124
|
+
systemInstruction: { parts: [{ text: systemPrompt }] },
|
|
125
|
+
generationConfig: { responseMimeType: 'application/json' }
|
|
126
|
+
};
|
|
127
|
+
const responseText = await (0, runner_1.makeHttpRequest)(url, 'POST', { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, JSON.stringify(payload));
|
|
128
|
+
const parsed = (0, json_1.safeJsonParse)(responseText, {});
|
|
129
|
+
return parsed.candidates?.[0]?.content?.parts?.[0]?.text || '';
|
|
130
|
+
}
|
|
131
|
+
// ollama
|
|
132
|
+
const endpoint = `${(creds.url || 'http://localhost:11434').replace(/\/$/, '')}/api/chat`;
|
|
133
|
+
const payload = {
|
|
134
|
+
model: creds.model,
|
|
135
|
+
messages: [
|
|
136
|
+
{ role: 'system', content: systemPrompt },
|
|
137
|
+
{ role: 'user', content: userPrompt }
|
|
138
|
+
],
|
|
139
|
+
stream: false,
|
|
140
|
+
format: 'json'
|
|
141
|
+
};
|
|
142
|
+
const responseText = await (0, runner_1.makeHttpRequest)(endpoint, 'POST', { 'Content-Type': 'application/json' }, JSON.stringify(payload));
|
|
143
|
+
const parsed = (0, json_1.safeJsonParse)(responseText, {});
|
|
144
|
+
return parsed.message?.content || '';
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* `sendPrompt` with a small, independent retry — deliberately NOT the 5-attempt/`ProgressDisplay`
|
|
148
|
+
* -coupled retry loop `extractNodesFromCode` uses; this caller has no TTY progress bar to update,
|
|
149
|
+
* so it just logs via `onRetry` and backs off (longer on a 429, since that means "slow down",
|
|
150
|
+
* shorter on anything else — a transient network blip is usually gone in a couple seconds).
|
|
151
|
+
*/
|
|
152
|
+
async function sendPromptWithRetry(creds, systemPrompt, userPrompt, opts = {}) {
|
|
153
|
+
const maxAttempts = opts.retries ?? 3;
|
|
154
|
+
let backoffMs = 5000;
|
|
155
|
+
let lastErr = null;
|
|
156
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
157
|
+
try {
|
|
158
|
+
return await sendPrompt(creds, systemPrompt, userPrompt);
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
lastErr = err;
|
|
162
|
+
const isRateLimited = (lastErr.message || '').includes('429');
|
|
163
|
+
if (attempt < maxAttempts) {
|
|
164
|
+
opts.onRetry?.(`attempt ${attempt}/${maxAttempts} failed (${lastErr.message}) — retrying in ${isRateLimited ? backoffMs / 1000 : 2}s`);
|
|
165
|
+
await (0, runner_1.sleep)(isRateLimited ? backoffMs : 2000);
|
|
166
|
+
if (isRateLimited)
|
|
167
|
+
backoffMs *= 2;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
throw lastErr || new Error('sendPrompt failed after retries');
|
|
172
|
+
}
|
|
173
|
+
// ── Gemini / Vertex (same Generative Language API request/response shape) ──────
|
|
174
|
+
/** Builds the `contents` array for a Gemini/Vertex tool-calling request. Exported so the
|
|
175
|
+
* translation logic (the actual risk area) is unit-testable without a live call. */
|
|
176
|
+
function buildGeminiContents(messages) {
|
|
177
|
+
return messages.map(m => {
|
|
178
|
+
if (m.role === 'user')
|
|
179
|
+
return { role: 'user', parts: [{ text: m.content }] };
|
|
180
|
+
if (m.role === 'assistant') {
|
|
181
|
+
const parts = [];
|
|
182
|
+
if (m.content)
|
|
183
|
+
parts.push({ text: m.content });
|
|
184
|
+
for (const tc of m.toolCalls)
|
|
185
|
+
parts.push({ functionCall: { name: tc.name, args: tc.args } });
|
|
186
|
+
return { role: 'model', parts };
|
|
187
|
+
}
|
|
188
|
+
// Tool result. Gemini's function-response part carries no call id — it matches the most
|
|
189
|
+
// recent pending call BY NAME, which is why only one call for a given name should ever be
|
|
190
|
+
// outstanding at once (the curation loop below satisfies this: it always awaits ALL of a
|
|
191
|
+
// turn's tool calls before sending the next).
|
|
192
|
+
let response;
|
|
193
|
+
try {
|
|
194
|
+
response = JSON.parse(m.content);
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
response = { result: m.content };
|
|
198
|
+
}
|
|
199
|
+
return { role: 'user', parts: [{ functionResponse: { name: m.toolName, response } }] };
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
/** Builds the `tools` field shared by Gemini and Vertex. */
|
|
203
|
+
function buildGeminiTools(tools) {
|
|
204
|
+
return [{ functionDeclarations: tools.map(t => ({ name: t.name, description: t.description, parameters: t.parameters })) }];
|
|
205
|
+
}
|
|
206
|
+
/** Parses a Gemini/Vertex `candidates[0].content.parts` array into the provider-agnostic turn
|
|
207
|
+
* result. A part is either `{text}` or `{functionCall:{name,args}}` — Gemini assigns no id of
|
|
208
|
+
* its own, so one is minted here purely as a local correlation key for the tool-result message. */
|
|
209
|
+
function parseGeminiParts(parts) {
|
|
210
|
+
let text = null;
|
|
211
|
+
const toolCalls = [];
|
|
212
|
+
for (const p of parts || []) {
|
|
213
|
+
if (p.text)
|
|
214
|
+
text = (text ?? '') + p.text;
|
|
215
|
+
if (p.functionCall)
|
|
216
|
+
toolCalls.push({ id: crypto.randomUUID(), name: p.functionCall.name, args: p.functionCall.args ?? {} });
|
|
217
|
+
}
|
|
218
|
+
return { text, toolCalls };
|
|
219
|
+
}
|
|
220
|
+
async function sendGeminiTurn(model, apiKey, systemPrompt, messages, tools) {
|
|
221
|
+
const url = `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${apiKey}`;
|
|
222
|
+
const payload = {
|
|
223
|
+
contents: buildGeminiContents(messages),
|
|
224
|
+
systemInstruction: { parts: [{ text: systemPrompt }] },
|
|
225
|
+
tools: buildGeminiTools(tools)
|
|
226
|
+
};
|
|
227
|
+
const responseText = await (0, runner_1.makeHttpRequest)(url, 'POST', { 'Content-Type': 'application/json' }, JSON.stringify(payload));
|
|
228
|
+
const parsed = (0, json_1.safeJsonParse)(responseText, {});
|
|
229
|
+
return parseGeminiParts(parsed.candidates?.[0]?.content?.parts || []);
|
|
230
|
+
}
|
|
231
|
+
async function sendVertexTurn(model, token, projectId, location, systemPrompt, messages, tools) {
|
|
232
|
+
const url = `https://${location}-aiplatform.googleapis.com/v1/projects/${projectId}/locations/${location}/publishers/google/models/${model}:generateContent`;
|
|
233
|
+
const payload = {
|
|
234
|
+
contents: buildGeminiContents(messages),
|
|
235
|
+
systemInstruction: { parts: [{ text: systemPrompt }] },
|
|
236
|
+
tools: buildGeminiTools(tools)
|
|
237
|
+
};
|
|
238
|
+
const responseText = await (0, runner_1.makeHttpRequest)(url, 'POST', { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, JSON.stringify(payload));
|
|
239
|
+
const parsed = (0, json_1.safeJsonParse)(responseText, {});
|
|
240
|
+
return parseGeminiParts(parsed.candidates?.[0]?.content?.parts || []);
|
|
241
|
+
}
|
|
242
|
+
// ── Ollama (OpenAI-style `tools`/`tool_calls`) ──────────────────────────────
|
|
243
|
+
/** Builds the `messages` array for an Ollama tool-calling chat request. */
|
|
244
|
+
function buildOllamaMessages(systemPrompt, messages) {
|
|
245
|
+
const out = [{ role: 'system', content: systemPrompt }];
|
|
246
|
+
for (const m of messages) {
|
|
247
|
+
if (m.role === 'user') {
|
|
248
|
+
out.push({ role: 'user', content: m.content });
|
|
249
|
+
}
|
|
250
|
+
else if (m.role === 'assistant') {
|
|
251
|
+
out.push({
|
|
252
|
+
role: 'assistant',
|
|
253
|
+
content: m.content || '',
|
|
254
|
+
tool_calls: m.toolCalls.map(tc => ({ function: { name: tc.name, arguments: tc.args } }))
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
// Ollama's tool-result message has no call-id field to correlate against (same
|
|
259
|
+
// one-outstanding-call-per-name constraint as Gemini above) — `tool_name` is what ties it
|
|
260
|
+
// back to the request.
|
|
261
|
+
out.push({ role: 'tool', tool_name: m.toolName, content: m.content });
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return out;
|
|
265
|
+
}
|
|
266
|
+
/** Builds the OpenAI-style `tools` field Ollama expects. */
|
|
267
|
+
function buildOllamaTools(tools) {
|
|
268
|
+
return tools.map(t => ({ type: 'function', function: { name: t.name, description: t.description, parameters: t.parameters } }));
|
|
269
|
+
}
|
|
270
|
+
/** Parses an Ollama chat response's `message` into the provider-agnostic turn result. */
|
|
271
|
+
function parseOllamaMessage(message) {
|
|
272
|
+
const toolCalls = (message.tool_calls || [])
|
|
273
|
+
.filter(tc => tc.function?.name)
|
|
274
|
+
.map(tc => ({ id: crypto.randomUUID(), name: tc.function.name, args: tc.function.arguments ?? {} }));
|
|
275
|
+
return { text: message.content || null, toolCalls };
|
|
276
|
+
}
|
|
277
|
+
async function sendOllamaTurn(url, model, systemPrompt, messages, tools) {
|
|
278
|
+
const endpoint = `${url.replace(/\/$/, '')}/api/chat`;
|
|
279
|
+
const payload = {
|
|
280
|
+
model,
|
|
281
|
+
messages: buildOllamaMessages(systemPrompt, messages),
|
|
282
|
+
tools: buildOllamaTools(tools),
|
|
283
|
+
stream: false
|
|
284
|
+
};
|
|
285
|
+
const responseText = await (0, runner_1.makeHttpRequest)(endpoint, 'POST', { 'Content-Type': 'application/json' }, JSON.stringify(payload));
|
|
286
|
+
const parsed = (0, json_1.safeJsonParse)(responseText, {});
|
|
287
|
+
return parseOllamaMessage(parsed.message || {});
|
|
288
|
+
}
|
|
289
|
+
/** One turn of a tool-calling conversation with whichever provider `creds` resolved to. */
|
|
290
|
+
async function sendConversationTurn(creds, systemPrompt, messages, tools) {
|
|
291
|
+
if (creds.provider === 'gemini') {
|
|
292
|
+
return sendGeminiTurn(creds.model, creds.apiKey, systemPrompt, messages, tools);
|
|
293
|
+
}
|
|
294
|
+
if (creds.provider === 'vertex') {
|
|
295
|
+
const token = creds.vertexToken || await (0, runner_1.getVertexTokenCached)(creds.vertexSaData);
|
|
296
|
+
return sendVertexTurn(creds.model, token, creds.vertexProjectId, creds.vertexLocation, systemPrompt, messages, tools);
|
|
297
|
+
}
|
|
298
|
+
return sendOllamaTurn(creds.url || 'http://localhost:11434', creds.model, systemPrompt, messages, tools);
|
|
299
|
+
}
|
|
300
|
+
/** `sendConversationTurn` with the same retry/backoff shape as `sendPromptWithRetry`. */
|
|
301
|
+
async function sendConversationTurnWithRetry(creds, systemPrompt, messages, tools, opts = {}) {
|
|
302
|
+
const maxAttempts = opts.retries ?? 3;
|
|
303
|
+
let backoffMs = 5000;
|
|
304
|
+
let lastErr = null;
|
|
305
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
306
|
+
try {
|
|
307
|
+
return await sendConversationTurn(creds, systemPrompt, messages, tools);
|
|
308
|
+
}
|
|
309
|
+
catch (err) {
|
|
310
|
+
lastErr = err;
|
|
311
|
+
const isRateLimited = (lastErr.message || '').includes('429');
|
|
312
|
+
if (attempt < maxAttempts) {
|
|
313
|
+
opts.onRetry?.(`attempt ${attempt}/${maxAttempts} failed (${lastErr.message}) — retrying in ${isRateLimited ? backoffMs / 1000 : 2}s`);
|
|
314
|
+
await (0, runner_1.sleep)(isRateLimited ? backoffMs : 2000);
|
|
315
|
+
if (isRateLimited)
|
|
316
|
+
backoffMs *= 2;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
throw lastErr || new Error('sendConversationTurn failed after retries');
|
|
321
|
+
}
|
|
322
|
+
//# sourceMappingURL=llm-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-client.js","sourceRoot":"","sources":["../../src/cli/llm-client.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/rule.d.ts
CHANGED
|
@@ -1,16 +1,36 @@
|
|
|
1
1
|
import { DevMindConfig } from '../utils/config';
|
|
2
|
+
import { WorkflowStyle } from './integrations/prompt';
|
|
2
3
|
/**
|
|
3
4
|
* Build the ready-to-paste DevsMind workspace rule from a project's config.
|
|
4
5
|
* Pure string builder — no I/O — so it can be printed or written to a file.
|
|
6
|
+
*
|
|
7
|
+
* `workflowStyle` picks which of two rules gets built:
|
|
8
|
+
* - `'automatic'` (default): the AI stages, commits, and tracks every edit without being asked —
|
|
9
|
+
* the original, still-recommended default for a team's shared graph.
|
|
10
|
+
* - `'manual'`: the AI uses DevsMind's search/read tools freely (that part is never optional —
|
|
11
|
+
* it's why the tool exists) but never stages or commits on its own initiative; the developer
|
|
12
|
+
* stays the one deciding what reaches the graph and when. `session_id` (on writes) and `message`
|
|
13
|
+
* are still mechanically required by the protocol either way — that's not something a rule can
|
|
14
|
+
* opt out of, only WHEN commit_changes gets called is a style choice.
|
|
5
15
|
*/
|
|
6
|
-
export declare function buildRule(config: DevMindConfig, devmindDir: string): string;
|
|
16
|
+
export declare function buildRule(config: DevMindConfig, devmindDir: string, workflowStyle?: WorkflowStyle): string;
|
|
17
|
+
/**
|
|
18
|
+
* A short block meant to be pasted at the START of a fresh AI chat — deliberately separate from
|
|
19
|
+
* the persistent rule file above. The rule file only helps once the agent actually reads it, and
|
|
20
|
+
* a long session can lose track of something it read once at the very beginning; this is the
|
|
21
|
+
* human's manual lever to make a brand-new conversation commit to the rule from its first move,
|
|
22
|
+
* rather than drifting into using DevsMind slowly (or not at all) over the first few turns.
|
|
23
|
+
*/
|
|
24
|
+
export declare function buildKickoffPrompt(workflowStyle?: WorkflowStyle): string;
|
|
7
25
|
/**
|
|
8
26
|
* `devsmind rule` — print the workspace rule and, interactively, help place it
|
|
9
27
|
* in the chosen tool's native rules file (manual snippet or automatic write).
|
|
10
28
|
* Falls back to plain printing when piped/non-TTY or when `--print` is passed,
|
|
11
|
-
* preserving `devsmind rule > file` usage.
|
|
29
|
+
* preserving `devsmind rule > file` usage. `--manual` picks the manual workflow
|
|
30
|
+
* style non-interactively (the fallback path has no prompt to ask with).
|
|
12
31
|
*/
|
|
13
32
|
export declare function handleRule(opts: {
|
|
14
33
|
path?: string;
|
|
15
34
|
print?: boolean;
|
|
35
|
+
manual?: boolean;
|
|
16
36
|
}): Promise<void>;
|