@memoarchitect/tools 0.6.3 → 0.6.4
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 +1 -1
- package/package.json +1 -1
- package/packages/tools/lib/bin/memo.js +38 -2
- package/packages/tools/lib/bin/memo.js.map +1 -1
- package/packages/tools/lib/browser/index.d.ts +3 -0
- package/packages/tools/lib/browser/index.d.ts.map +1 -1
- package/packages/tools/lib/commands/init.d.ts +2 -0
- package/packages/tools/lib/commands/init.d.ts.map +1 -1
- package/packages/tools/lib/commands/init.js +32 -16
- package/packages/tools/lib/commands/init.js.map +1 -1
- package/packages/tools/lib/commands/mcp.d.ts +15 -0
- package/packages/tools/lib/commands/mcp.d.ts.map +1 -0
- package/packages/tools/lib/commands/mcp.js +128 -0
- package/packages/tools/lib/commands/mcp.js.map +1 -0
- package/packages/tools/lib/index.d.ts.map +1 -1
- package/packages/tools/lib/index.js +4 -0
- package/packages/tools/lib/index.js.map +1 -1
- package/packages/tools/lib/llm/chat-engine.d.ts +97 -0
- package/packages/tools/lib/llm/chat-engine.d.ts.map +1 -0
- package/packages/tools/lib/llm/chat-engine.js +463 -0
- package/packages/tools/lib/llm/chat-engine.js.map +1 -0
- package/packages/tools/lib/llm/index.d.ts +2 -0
- package/packages/tools/lib/llm/index.d.ts.map +1 -1
- package/packages/tools/lib/llm/index.js +2 -0
- package/packages/tools/lib/llm/index.js.map +1 -1
- package/packages/tools/lib/llm/llm-provider.d.ts +40 -4
- package/packages/tools/lib/llm/llm-provider.d.ts.map +1 -1
- package/packages/tools/lib/llm/llm-provider.js +180 -37
- package/packages/tools/lib/llm/llm-provider.js.map +1 -1
- package/packages/tools/lib/llm/llm-settings.d.ts +84 -0
- package/packages/tools/lib/llm/llm-settings.d.ts.map +1 -0
- package/packages/tools/lib/llm/llm-settings.js +249 -0
- package/packages/tools/lib/llm/llm-settings.js.map +1 -0
- package/packages/tools/lib/mcp/index.d.ts +4 -0
- package/packages/tools/lib/mcp/index.d.ts.map +1 -0
- package/packages/tools/lib/mcp/index.js +9 -0
- package/packages/tools/lib/mcp/index.js.map +1 -0
- package/packages/tools/lib/mcp/model-loader.d.ts +11 -0
- package/packages/tools/lib/mcp/model-loader.d.ts.map +1 -0
- package/packages/tools/lib/mcp/model-loader.js +87 -0
- package/packages/tools/lib/mcp/model-loader.js.map +1 -0
- package/packages/tools/lib/mcp/server.d.ts +8 -0
- package/packages/tools/lib/mcp/server.d.ts.map +1 -0
- package/packages/tools/lib/mcp/server.js +132 -0
- package/packages/tools/lib/mcp/server.js.map +1 -0
- package/packages/tools/lib/mcp/tools.d.ts +18 -0
- package/packages/tools/lib/mcp/tools.d.ts.map +1 -0
- package/packages/tools/lib/mcp/tools.js +220 -0
- package/packages/tools/lib/mcp/tools.js.map +1 -0
- package/packages/tools/lib/model/builder.js +1 -1
- package/packages/tools/lib/model/builder.js.map +1 -1
- package/packages/tools/lib/model/view-deriver.d.ts +3 -2
- package/packages/tools/lib/model/view-deriver.d.ts.map +1 -1
- package/packages/tools/lib/model/view-deriver.js +33 -10
- package/packages/tools/lib/model/view-deriver.js.map +1 -1
- package/packages/tools/lib/protocol/messages.d.ts +88 -2
- package/packages/tools/lib/protocol/messages.d.ts.map +1 -1
- package/packages/tools/lib/server/dev-server.d.ts.map +1 -1
- package/packages/tools/lib/server/dev-server.js +194 -10
- package/packages/tools/lib/server/dev-server.js.map +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-engine.d.ts","sourceRoot":"","sources":["../../src/llm/chat-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
// ─── Model Chat Engine ───────────────────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// Multi-turn conversation over the MEMO model with tool calling.
|
|
4
|
+
//
|
|
5
|
+
// Two classes of tool:
|
|
6
|
+
// Read tools — executed here, against the in-memory QueryContext.
|
|
7
|
+
// Write tools — never applied. They validate the request and return a
|
|
8
|
+
// *proposed change* for the user to approve in the workbench.
|
|
9
|
+
//
|
|
10
|
+
// Nothing in this file mutates the model. That separation is deliberate: the
|
|
11
|
+
// SysML source is the regulated record, so every edit an LLM suggests passes
|
|
12
|
+
// through explicit human approval before it reaches a file.
|
|
13
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
14
|
+
import { serializeModelContext } from './model-context.js';
|
|
15
|
+
const DEFAULT_MAX_ITERATIONS = 8;
|
|
16
|
+
const SYSTEM_PROMPT = `You are MEMO Model Analyst, an expert in medical device systems engineering, SysML v2 modeling, and regulatory compliance (ISO 14971, IEC 62304, ISO 13485).
|
|
17
|
+
|
|
18
|
+
You are working with a live medical device architecture model. A summary of it is provided below, and you have tools to look up anything the summary omits.
|
|
19
|
+
|
|
20
|
+
Guidelines:
|
|
21
|
+
- Reference specific element names and IDs when relevant.
|
|
22
|
+
- Prefer calling a tool over guessing. The summary is truncated; the tools see the whole model.
|
|
23
|
+
- When asked about traceability, follow relationship chains with the trace tool.
|
|
24
|
+
- Use tables for structured data when appropriate.
|
|
25
|
+
- Be precise — never invent elements or relationships that are not in the model.
|
|
26
|
+
- If the model does not contain enough information to answer, say so clearly.
|
|
27
|
+
|
|
28
|
+
Proposing changes:
|
|
29
|
+
- The edit tools do NOT modify the model. They stage a proposal that the engineer reviews and approves in the workbench.
|
|
30
|
+
- After staging proposals, briefly describe what you staged and why. Do not claim the model has been changed.
|
|
31
|
+
- Propose the smallest change that satisfies the request. Do not add elements or relationships the engineer did not ask for.`;
|
|
32
|
+
// ─── Tool definitions ────────────────────────────────────────────────────────
|
|
33
|
+
const READ_TOOLS = [
|
|
34
|
+
{
|
|
35
|
+
name: 'search_elements',
|
|
36
|
+
description: 'Search model elements by name/id substring, kind, or layer. Use this whenever you need elements the summary does not list.',
|
|
37
|
+
inputSchema: {
|
|
38
|
+
type: 'object',
|
|
39
|
+
properties: {
|
|
40
|
+
query: { type: 'string', description: 'Case-insensitive substring matched against element id and name.' },
|
|
41
|
+
kind: { type: 'string', description: 'Restrict to one kind, e.g. "Hazard".' },
|
|
42
|
+
layer: { type: 'string', description: 'Restrict to one architecture layer, e.g. "risk".' },
|
|
43
|
+
limit: { type: 'number', description: 'Maximum results (default 50).' },
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: 'get_element',
|
|
49
|
+
description: 'Get one element in full: attributes, documentation, and every incoming and outgoing relationship.',
|
|
50
|
+
inputSchema: {
|
|
51
|
+
type: 'object',
|
|
52
|
+
properties: { id: { type: 'string', description: 'The element id.' } },
|
|
53
|
+
required: ['id'],
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: 'trace',
|
|
58
|
+
description: 'Follow the relationship chain out of an element, for traceability questions such as requirement-to-verification coverage.',
|
|
59
|
+
inputSchema: {
|
|
60
|
+
type: 'object',
|
|
61
|
+
properties: {
|
|
62
|
+
id: { type: 'string', description: 'The element id to trace from.' },
|
|
63
|
+
maxDepth: { type: 'number', description: 'How many hops to follow (default 3).' },
|
|
64
|
+
},
|
|
65
|
+
required: ['id'],
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: 'list_gaps',
|
|
70
|
+
description: 'List validation violations — the compliance and completeness gaps in the model.',
|
|
71
|
+
inputSchema: {
|
|
72
|
+
type: 'object',
|
|
73
|
+
properties: {
|
|
74
|
+
severity: { type: 'string', enum: ['error', 'warning', 'info'], description: 'Filter by severity.' },
|
|
75
|
+
limit: { type: 'number', description: 'Maximum results (default 50).' },
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: 'layer_summary',
|
|
81
|
+
description: 'Element counts and completeness percentage for every architecture layer.',
|
|
82
|
+
inputSchema: { type: 'object', properties: {} },
|
|
83
|
+
},
|
|
84
|
+
];
|
|
85
|
+
function writeTools(config) {
|
|
86
|
+
const kindNames = config?.kinds ? Object.keys(config.kinds) : [];
|
|
87
|
+
const relNames = config?.relationshipTypes?.map(r => r.name) ?? [];
|
|
88
|
+
// Listing the legal vocabulary in the description keeps the model inside the
|
|
89
|
+
// ontology instead of inventing plausible-sounding kinds.
|
|
90
|
+
const kindHint = kindNames.length ? ` Must be one of: ${kindNames.join(', ')}.` : '';
|
|
91
|
+
const relHint = relNames.length ? ` Must be one of: ${relNames.join(', ')}.` : '';
|
|
92
|
+
return [
|
|
93
|
+
{
|
|
94
|
+
name: 'propose_create_element',
|
|
95
|
+
description: 'Stage a new element for the engineer to approve. Does not modify the model.',
|
|
96
|
+
inputSchema: {
|
|
97
|
+
type: 'object',
|
|
98
|
+
properties: {
|
|
99
|
+
id: { type: 'string', description: 'Unique element id (SysML usage name), e.g. "HAZ_OverInfusion".' },
|
|
100
|
+
name: { type: 'string', description: 'Human-readable name.' },
|
|
101
|
+
kind: { type: 'string', description: `The ontology kind.${kindHint}` },
|
|
102
|
+
layer: { type: 'string', description: 'Architecture layer. Defaults to the kind\'s own layer.' },
|
|
103
|
+
attributes: { type: 'object', description: 'Attribute key/value pairs.', additionalProperties: { type: 'string' } },
|
|
104
|
+
doc: { type: 'string', description: 'Documentation comment.' },
|
|
105
|
+
rationale: { type: 'string', description: 'One sentence on why this element is needed.' },
|
|
106
|
+
},
|
|
107
|
+
required: ['id', 'name', 'kind'],
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
name: 'propose_update_element',
|
|
112
|
+
description: 'Stage a change to an existing element for the engineer to approve. Does not modify the model. Only include fields you want to change.',
|
|
113
|
+
inputSchema: {
|
|
114
|
+
type: 'object',
|
|
115
|
+
properties: {
|
|
116
|
+
id: { type: 'string', description: 'The id of the element to change.' },
|
|
117
|
+
name: { type: 'string' },
|
|
118
|
+
attributes: { type: 'object', description: 'Attributes to set or overwrite.', additionalProperties: { type: 'string' } },
|
|
119
|
+
doc: { type: 'string' },
|
|
120
|
+
rationale: { type: 'string', description: 'One sentence on why this change is needed.' },
|
|
121
|
+
},
|
|
122
|
+
required: ['id'],
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
name: 'propose_create_relationship',
|
|
127
|
+
description: 'Stage a new relationship between two existing elements for the engineer to approve. Does not modify the model.',
|
|
128
|
+
inputSchema: {
|
|
129
|
+
type: 'object',
|
|
130
|
+
properties: {
|
|
131
|
+
type: { type: 'string', description: `Relationship type.${relHint}` },
|
|
132
|
+
sourceId: { type: 'string', description: 'Source element id.' },
|
|
133
|
+
targetId: { type: 'string', description: 'Target element id.' },
|
|
134
|
+
rationale: { type: 'string', description: 'One sentence on why this relationship is needed.' },
|
|
135
|
+
},
|
|
136
|
+
required: ['type', 'sourceId', 'targetId'],
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
name: 'propose_delete_relationship',
|
|
141
|
+
description: 'Stage the removal of an existing relationship for the engineer to approve. Does not modify the model.',
|
|
142
|
+
inputSchema: {
|
|
143
|
+
type: 'object',
|
|
144
|
+
properties: {
|
|
145
|
+
id: { type: 'string', description: 'The relationship id, as returned by get_element.' },
|
|
146
|
+
rationale: { type: 'string', description: 'One sentence on why this relationship should go.' },
|
|
147
|
+
},
|
|
148
|
+
required: ['id'],
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
];
|
|
152
|
+
}
|
|
153
|
+
function ok(value) {
|
|
154
|
+
return { content: typeof value === 'string' ? value : JSON.stringify(value, null, 2) };
|
|
155
|
+
}
|
|
156
|
+
function fail(message) {
|
|
157
|
+
return { content: message, isError: true };
|
|
158
|
+
}
|
|
159
|
+
function describeElement(ctx, id) {
|
|
160
|
+
const el = ctx.element(id);
|
|
161
|
+
if (!el)
|
|
162
|
+
return undefined;
|
|
163
|
+
return {
|
|
164
|
+
id: el.id,
|
|
165
|
+
shortId: el.shortId,
|
|
166
|
+
name: el.name,
|
|
167
|
+
kind: el.kind,
|
|
168
|
+
layer: el.layer,
|
|
169
|
+
construct: el.construct,
|
|
170
|
+
file: el.file,
|
|
171
|
+
attributes: el.attributes,
|
|
172
|
+
doc: el.doc,
|
|
173
|
+
outgoing: ctx.outgoing(id).map(r => ({
|
|
174
|
+
relationshipId: r.id, type: r.type, target: r.targetId, targetName: ctx.elementName(r.targetId),
|
|
175
|
+
})),
|
|
176
|
+
incoming: ctx.incoming(id).map(r => ({
|
|
177
|
+
relationshipId: r.id, type: r.type, source: r.sourceId, sourceName: ctx.elementName(r.sourceId),
|
|
178
|
+
})),
|
|
179
|
+
violations: ctx.violationsFor(id).map(v => ({ severity: v.severity, rule: v.ruleId, description: v.description })),
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
function executeReadTool(name, input, ctx) {
|
|
183
|
+
switch (name) {
|
|
184
|
+
case 'search_elements': {
|
|
185
|
+
const limit = typeof input.limit === 'number' ? input.limit : 50;
|
|
186
|
+
const query = typeof input.query === 'string' ? input.query.toLowerCase() : undefined;
|
|
187
|
+
let elements = input.kind ? ctx.elementsByKind(input.kind) : ctx.allElements();
|
|
188
|
+
if (input.layer)
|
|
189
|
+
elements = elements.filter(e => e.layer === input.layer);
|
|
190
|
+
if (query) {
|
|
191
|
+
elements = elements.filter(e => e.id.toLowerCase().includes(query) || e.name.toLowerCase().includes(query));
|
|
192
|
+
}
|
|
193
|
+
const total = elements.length;
|
|
194
|
+
const results = elements.slice(0, limit).map(e => ({
|
|
195
|
+
id: e.id, name: e.name, kind: e.kind, layer: e.layer,
|
|
196
|
+
}));
|
|
197
|
+
return ok({ total, returned: results.length, results });
|
|
198
|
+
}
|
|
199
|
+
case 'get_element': {
|
|
200
|
+
const detail = describeElement(ctx, String(input.id));
|
|
201
|
+
return detail ? ok(detail) : fail(`No element with id "${input.id}". Use search_elements to find the right id.`);
|
|
202
|
+
}
|
|
203
|
+
case 'trace': {
|
|
204
|
+
const id = String(input.id);
|
|
205
|
+
if (!ctx.element(id))
|
|
206
|
+
return fail(`No element with id "${id}".`);
|
|
207
|
+
const depth = typeof input.maxDepth === 'number' ? input.maxDepth : 3;
|
|
208
|
+
const chain = ctx.traceChain(id, depth).map(step => ({
|
|
209
|
+
depth: step.depth,
|
|
210
|
+
via: step.relationship.type,
|
|
211
|
+
to: step.element.id,
|
|
212
|
+
name: step.element.name,
|
|
213
|
+
kind: step.element.kind,
|
|
214
|
+
}));
|
|
215
|
+
return ok({ from: id, steps: chain.length, chain });
|
|
216
|
+
}
|
|
217
|
+
case 'list_gaps': {
|
|
218
|
+
const limit = typeof input.limit === 'number' ? input.limit : 50;
|
|
219
|
+
const severities = input.severity
|
|
220
|
+
? [input.severity]
|
|
221
|
+
: ['error', 'warning'];
|
|
222
|
+
const violations = severities.flatMap(s => ctx.violationsBySeverity(s));
|
|
223
|
+
return ok({
|
|
224
|
+
total: violations.length,
|
|
225
|
+
returned: Math.min(violations.length, limit),
|
|
226
|
+
violations: violations.slice(0, limit).map(v => ({
|
|
227
|
+
severity: v.severity,
|
|
228
|
+
rule: v.ruleId,
|
|
229
|
+
description: v.description,
|
|
230
|
+
element: v.elementId,
|
|
231
|
+
elementKind: v.elementKind,
|
|
232
|
+
})),
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
case 'layer_summary':
|
|
236
|
+
return ok(ctx.layerSummary().map(l => ({
|
|
237
|
+
id: l.id, label: l.label, elements: l.count, completeness: l.completeness,
|
|
238
|
+
})));
|
|
239
|
+
default:
|
|
240
|
+
return undefined;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
/** Staged proposals double as lookup state — later calls may reference earlier ones. */
|
|
244
|
+
function pendingElementIds(changes) {
|
|
245
|
+
const ids = new Set();
|
|
246
|
+
for (const c of changes) {
|
|
247
|
+
if (c.kind === 'create-element')
|
|
248
|
+
ids.add(c.elementId);
|
|
249
|
+
}
|
|
250
|
+
return ids;
|
|
251
|
+
}
|
|
252
|
+
function executeWriteTool(name, input, ctx, config, staged, nextId) {
|
|
253
|
+
const knownKinds = config?.kinds ? new Set(Object.keys(config.kinds)) : undefined;
|
|
254
|
+
const knownRels = config?.relationshipTypes ? new Set(config.relationshipTypes.map(r => r.name)) : undefined;
|
|
255
|
+
switch (name) {
|
|
256
|
+
case 'propose_create_element': {
|
|
257
|
+
const id = String(input.id ?? '').trim();
|
|
258
|
+
const elementKind = String(input.kind ?? '').trim();
|
|
259
|
+
if (!id)
|
|
260
|
+
return fail('An element id is required.');
|
|
261
|
+
if (ctx.element(id))
|
|
262
|
+
return fail(`Element "${id}" already exists. Use propose_update_element to change it.`);
|
|
263
|
+
if (pendingElementIds(staged).has(id))
|
|
264
|
+
return fail(`Element "${id}" is already staged in this turn.`);
|
|
265
|
+
if (knownKinds && !knownKinds.has(elementKind)) {
|
|
266
|
+
return fail(`"${elementKind}" is not a kind in this ontology. Valid kinds: ${[...knownKinds].join(', ')}`);
|
|
267
|
+
}
|
|
268
|
+
const layer = typeof input.layer === 'string' && input.layer
|
|
269
|
+
? input.layer
|
|
270
|
+
: config?.kinds?.[elementKind]?.layer;
|
|
271
|
+
const change = {
|
|
272
|
+
kind: 'create-element',
|
|
273
|
+
id: nextId(),
|
|
274
|
+
elementId: id,
|
|
275
|
+
name: String(input.name ?? id),
|
|
276
|
+
elementKind,
|
|
277
|
+
layer,
|
|
278
|
+
attributes: input.attributes && typeof input.attributes === 'object' ? input.attributes : undefined,
|
|
279
|
+
doc: typeof input.doc === 'string' ? input.doc : undefined,
|
|
280
|
+
summary: typeof input.rationale === 'string' && input.rationale
|
|
281
|
+
? input.rationale
|
|
282
|
+
: `Create ${elementKind} ${id}`,
|
|
283
|
+
};
|
|
284
|
+
staged.push(change);
|
|
285
|
+
return ok(`Staged for approval: create ${elementKind} "${id}". Not yet applied to the model.`);
|
|
286
|
+
}
|
|
287
|
+
case 'propose_update_element': {
|
|
288
|
+
const id = String(input.id ?? '').trim();
|
|
289
|
+
const el = ctx.element(id);
|
|
290
|
+
if (!el)
|
|
291
|
+
return fail(`No element with id "${id}". Use search_elements to find the right id.`);
|
|
292
|
+
const changes = {};
|
|
293
|
+
if (typeof input.name === 'string')
|
|
294
|
+
changes.name = input.name;
|
|
295
|
+
if (input.attributes && typeof input.attributes === 'object')
|
|
296
|
+
changes.attributes = input.attributes;
|
|
297
|
+
if (typeof input.doc === 'string')
|
|
298
|
+
changes.doc = input.doc;
|
|
299
|
+
if (Object.keys(changes).length === 0) {
|
|
300
|
+
return fail('No changes given. Provide at least one of name, attributes, or doc.');
|
|
301
|
+
}
|
|
302
|
+
const before = {};
|
|
303
|
+
if (changes.name !== undefined)
|
|
304
|
+
before.name = el.name;
|
|
305
|
+
if (changes.doc !== undefined)
|
|
306
|
+
before.doc = el.doc;
|
|
307
|
+
if (changes.attributes) {
|
|
308
|
+
before.attributes = Object.fromEntries(Object.keys(changes.attributes).map(k => [k, el.attributes[k] ?? '']));
|
|
309
|
+
}
|
|
310
|
+
staged.push({
|
|
311
|
+
kind: 'update-element',
|
|
312
|
+
id: nextId(),
|
|
313
|
+
elementId: id,
|
|
314
|
+
changes,
|
|
315
|
+
before,
|
|
316
|
+
summary: typeof input.rationale === 'string' && input.rationale
|
|
317
|
+
? input.rationale
|
|
318
|
+
: `Update ${el.kind} ${id}`,
|
|
319
|
+
});
|
|
320
|
+
return ok(`Staged for approval: update "${id}". Not yet applied to the model.`);
|
|
321
|
+
}
|
|
322
|
+
case 'propose_create_relationship': {
|
|
323
|
+
const type = String(input.type ?? '').trim();
|
|
324
|
+
const sourceId = String(input.sourceId ?? '').trim();
|
|
325
|
+
const targetId = String(input.targetId ?? '').trim();
|
|
326
|
+
if (knownRels && !knownRels.has(type)) {
|
|
327
|
+
return fail(`"${type}" is not a relationship type in this ontology. Valid types: ${[...knownRels].join(', ')}`);
|
|
328
|
+
}
|
|
329
|
+
// An element staged earlier in the same turn is a legal endpoint —
|
|
330
|
+
// it will exist by the time the batch is applied.
|
|
331
|
+
const pending = pendingElementIds(staged);
|
|
332
|
+
for (const [label, endpoint] of [['source', sourceId], ['target', targetId]]) {
|
|
333
|
+
if (!ctx.element(endpoint) && !pending.has(endpoint)) {
|
|
334
|
+
return fail(`No element with id "${endpoint}" for the ${label}. Use search_elements to find the right id.`);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
staged.push({
|
|
338
|
+
kind: 'create-relationship',
|
|
339
|
+
id: nextId(),
|
|
340
|
+
relationshipType: type,
|
|
341
|
+
sourceId,
|
|
342
|
+
targetId,
|
|
343
|
+
summary: typeof input.rationale === 'string' && input.rationale
|
|
344
|
+
? input.rationale
|
|
345
|
+
: `Relate ${sourceId} —${type}→ ${targetId}`,
|
|
346
|
+
});
|
|
347
|
+
return ok(`Staged for approval: ${sourceId} —${type}→ ${targetId}. Not yet applied to the model.`);
|
|
348
|
+
}
|
|
349
|
+
case 'propose_delete_relationship': {
|
|
350
|
+
const relId = String(input.id ?? '').trim();
|
|
351
|
+
const rel = ctx.allRelationships().find(r => r.id === relId);
|
|
352
|
+
if (!rel)
|
|
353
|
+
return fail(`No relationship with id "${relId}". Use get_element to list an element's relationship ids.`);
|
|
354
|
+
staged.push({
|
|
355
|
+
kind: 'delete-relationship',
|
|
356
|
+
id: nextId(),
|
|
357
|
+
relationshipId: relId,
|
|
358
|
+
sourceId: rel.sourceId,
|
|
359
|
+
targetId: rel.targetId,
|
|
360
|
+
relationshipType: rel.type,
|
|
361
|
+
summary: typeof input.rationale === 'string' && input.rationale
|
|
362
|
+
? input.rationale
|
|
363
|
+
: `Remove ${rel.sourceId} —${rel.type}→ ${rel.targetId}`,
|
|
364
|
+
});
|
|
365
|
+
return ok(`Staged for approval: remove relationship "${relId}". Not yet applied to the model.`);
|
|
366
|
+
}
|
|
367
|
+
default:
|
|
368
|
+
return undefined;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
// ─── The turn loop ───────────────────────────────────────────────────────────
|
|
372
|
+
/**
|
|
373
|
+
* Run one conversational turn, looping until the model stops calling tools.
|
|
374
|
+
*
|
|
375
|
+
* The returned `messages` include every tool call and result, so passing them
|
|
376
|
+
* straight back as `history` on the next turn keeps the model coherent.
|
|
377
|
+
*/
|
|
378
|
+
export async function runChatTurn(options) {
|
|
379
|
+
const { question, history = [], ctx, provider, config, allowEdits = false, contextOptions, maxIterations = DEFAULT_MAX_ITERATIONS, } = options;
|
|
380
|
+
const tools = allowEdits ? [...READ_TOOLS, ...writeTools(config)] : READ_TOOLS;
|
|
381
|
+
// The model summary is only re-sent when the conversation is new; on later
|
|
382
|
+
// turns it is already in the history and repeating it wastes the window.
|
|
383
|
+
const conversation = history.length > 0
|
|
384
|
+
? [...history, { role: 'user', content: question }]
|
|
385
|
+
: [
|
|
386
|
+
{ role: 'user', content: `Here is the current model state:\n\n${serializeModelContext(ctx, contextOptions)}\n\n---\n\nQuestion: ${question}` },
|
|
387
|
+
];
|
|
388
|
+
const proposedChanges = [];
|
|
389
|
+
let changeCounter = 0;
|
|
390
|
+
const nextId = () => `chg-${Date.now().toString(36)}-${changeCounter++}`;
|
|
391
|
+
const totals = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };
|
|
392
|
+
let answer = '';
|
|
393
|
+
let truncated = false;
|
|
394
|
+
for (let iteration = 0; iteration < maxIterations; iteration++) {
|
|
395
|
+
const result = await provider.complete({
|
|
396
|
+
messages: [{ role: 'system', content: SYSTEM_PROMPT }, ...conversation],
|
|
397
|
+
temperature: 0.2,
|
|
398
|
+
maxTokens: 4096,
|
|
399
|
+
tools,
|
|
400
|
+
});
|
|
401
|
+
if (result.usage) {
|
|
402
|
+
totals.promptTokens += result.usage.promptTokens;
|
|
403
|
+
totals.completionTokens += result.usage.completionTokens;
|
|
404
|
+
totals.totalTokens += result.usage.totalTokens;
|
|
405
|
+
}
|
|
406
|
+
if (result.content)
|
|
407
|
+
answer = result.content;
|
|
408
|
+
const calls = result.toolCalls ?? [];
|
|
409
|
+
if (calls.length === 0) {
|
|
410
|
+
return {
|
|
411
|
+
answer,
|
|
412
|
+
proposedChanges,
|
|
413
|
+
messages: [...conversation, { role: 'assistant', content: answer }],
|
|
414
|
+
usage: totals.totalTokens ? totals : undefined,
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
conversation.push({ role: 'assistant', content: result.content, toolCalls: calls });
|
|
418
|
+
// Every call must get a result, in the same batch — dropping one leaves
|
|
419
|
+
// the conversation malformed for both providers.
|
|
420
|
+
for (const call of calls) {
|
|
421
|
+
const outcome = runTool(call, ctx, config, allowEdits, proposedChanges, nextId);
|
|
422
|
+
conversation.push({
|
|
423
|
+
role: 'tool',
|
|
424
|
+
toolCallId: call.id,
|
|
425
|
+
content: outcome.content,
|
|
426
|
+
isError: outcome.isError,
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
if (iteration === maxIterations - 1)
|
|
430
|
+
truncated = true;
|
|
431
|
+
}
|
|
432
|
+
return {
|
|
433
|
+
answer: answer || 'I stopped after reaching the tool-call limit for this turn. Ask again to continue.',
|
|
434
|
+
proposedChanges,
|
|
435
|
+
messages: conversation,
|
|
436
|
+
usage: totals.totalTokens ? totals : undefined,
|
|
437
|
+
truncated,
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
function runTool(call, ctx, config, allowEdits, staged, nextId) {
|
|
441
|
+
try {
|
|
442
|
+
const input = (call.input ?? {});
|
|
443
|
+
const read = executeReadTool(call.name, input, ctx);
|
|
444
|
+
if (read)
|
|
445
|
+
return read;
|
|
446
|
+
if (call.name.startsWith('propose_') && !allowEdits) {
|
|
447
|
+
return fail('Editing is disabled for this conversation. Answer using the read-only tools instead.');
|
|
448
|
+
}
|
|
449
|
+
const write = executeWriteTool(call.name, input, ctx, config, staged, nextId);
|
|
450
|
+
if (write)
|
|
451
|
+
return write;
|
|
452
|
+
return fail(`Unknown tool "${call.name}".`);
|
|
453
|
+
}
|
|
454
|
+
catch (e) {
|
|
455
|
+
return fail(`Tool "${call.name}" failed: ${e?.message ?? String(e)}`);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
/** The tool names this engine exposes — used by tests and the MCP server. */
|
|
459
|
+
export function chatToolNames(allowEdits = true) {
|
|
460
|
+
return (allowEdits ? [...READ_TOOLS, ...writeTools()] : READ_TOOLS).map(t => t.name);
|
|
461
|
+
}
|
|
462
|
+
export { READ_TOOLS, writeTools };
|
|
463
|
+
//# sourceMappingURL=chat-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-engine.js","sourceRoot":"","sources":["../../src/llm/chat-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
export * from './llm-settings.js';
|
|
1
2
|
export * from './llm-provider.js';
|
|
2
3
|
export * from './model-context.js';
|
|
3
4
|
export * from './ask-engine.js';
|
|
5
|
+
export * from './chat-engine.js';
|
|
4
6
|
export * from './generate-engine.js';
|
|
5
7
|
export * from './draft-engine.js';
|
|
6
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAMA,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAMA,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC"}
|
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
// Phase 15: LLM Integration — provider abstraction, model Q&A, SysML
|
|
4
4
|
// generation from natural language, and DHF draft assistant.
|
|
5
5
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
6
|
+
export * from './llm-settings.js';
|
|
6
7
|
export * from './llm-provider.js';
|
|
7
8
|
export * from './model-context.js';
|
|
8
9
|
export * from './ask-engine.js';
|
|
10
|
+
export * from './chat-engine.js';
|
|
9
11
|
export * from './generate-engine.js';
|
|
10
12
|
export * from './draft-engine.js';
|
|
11
13
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,EAAE;AACF,qEAAqE;AACrE,6DAA6D;AAC7D,gFAAgF;AAEhF,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,EAAE;AACF,qEAAqE;AACrE,6DAA6D;AAC7D,gFAAgF;AAEhF,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC"}
|
|
@@ -1,17 +1,44 @@
|
|
|
1
|
+
import { DEFAULT_MODELS, type LLMProviderName } from './llm-settings.js';
|
|
2
|
+
/** A tool call the model asked for, in provider-neutral form. */
|
|
3
|
+
export interface ToolCall {
|
|
4
|
+
/** Provider-assigned id — must be echoed back on the matching result. */
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
input: Record<string, unknown>;
|
|
8
|
+
}
|
|
1
9
|
/** A single message in a chat conversation */
|
|
2
10
|
export interface ChatMessage {
|
|
3
|
-
role: 'system' | 'user' | 'assistant';
|
|
11
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
4
12
|
content: string;
|
|
13
|
+
/** Set on assistant messages that requested tools. */
|
|
14
|
+
toolCalls?: ToolCall[];
|
|
15
|
+
/** Set on `tool` messages — the id of the call being answered. */
|
|
16
|
+
toolCallId?: string;
|
|
17
|
+
/** Set on `tool` messages when the tool failed, so the model can recover. */
|
|
18
|
+
isError?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/** A tool the model may call. `inputSchema` is JSON Schema. */
|
|
21
|
+
export interface ToolDefinition {
|
|
22
|
+
name: string;
|
|
23
|
+
description: string;
|
|
24
|
+
inputSchema: Record<string, unknown>;
|
|
5
25
|
}
|
|
26
|
+
/** Why the model stopped generating. */
|
|
27
|
+
export type StopReason = 'end_turn' | 'tool_use' | 'max_tokens' | 'refusal' | 'other';
|
|
6
28
|
/** Options for an LLM completion request */
|
|
7
29
|
export interface CompletionOptions {
|
|
8
30
|
messages: ChatMessage[];
|
|
9
31
|
temperature?: number;
|
|
10
32
|
maxTokens?: number;
|
|
33
|
+
/** Tools the model may call this turn. */
|
|
34
|
+
tools?: ToolDefinition[];
|
|
11
35
|
}
|
|
12
36
|
/** Result of an LLM completion */
|
|
13
37
|
export interface CompletionResult {
|
|
14
38
|
content: string;
|
|
39
|
+
/** Tool calls requested by the model, if any. */
|
|
40
|
+
toolCalls?: ToolCall[];
|
|
41
|
+
stopReason?: StopReason;
|
|
15
42
|
usage?: {
|
|
16
43
|
promptTokens: number;
|
|
17
44
|
completionTokens: number;
|
|
@@ -25,16 +52,25 @@ export interface LLMProvider {
|
|
|
25
52
|
}
|
|
26
53
|
/** Provider configuration resolved from environment */
|
|
27
54
|
export interface LLMConfig {
|
|
28
|
-
provider:
|
|
55
|
+
provider: LLMProviderName;
|
|
29
56
|
apiKey: string;
|
|
30
57
|
model: string;
|
|
31
58
|
baseUrl?: string;
|
|
32
59
|
}
|
|
33
|
-
/**
|
|
34
|
-
|
|
60
|
+
/**
|
|
61
|
+
* Resolve LLM config from the environment, a project `.env`, project settings,
|
|
62
|
+
* and stored user credentials — see `llm-settings.ts` for the precedence order.
|
|
63
|
+
*
|
|
64
|
+
* `projectRoot` is optional so existing callers that only ever used real
|
|
65
|
+
* environment variables keep working unchanged.
|
|
66
|
+
*/
|
|
67
|
+
export declare function resolveLLMConfig(projectRoot?: string): LLMConfig | undefined;
|
|
35
68
|
/**
|
|
36
69
|
* Create an LLM provider from config.
|
|
37
70
|
* Uses native fetch — no SDK dependencies required.
|
|
38
71
|
*/
|
|
39
72
|
export declare function createProvider(config: LLMConfig): LLMProvider;
|
|
73
|
+
export declare function acceptsSamplingParams(model: string): boolean;
|
|
74
|
+
export { DEFAULT_MODELS };
|
|
75
|
+
export type { LLMProviderName };
|
|
40
76
|
//# sourceMappingURL=llm-provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm-provider.d.ts","sourceRoot":"","sources":["../../src/llm/llm-provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"llm-provider.d.ts","sourceRoot":"","sources":["../../src/llm/llm-provider.ts"],"names":[],"mappings":"AAWA,OAAO,EAAsB,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAE7F,iEAAiE;AACjE,MAAM,WAAW,QAAQ;IACrB,yEAAyE;IACzE,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,8CAA8C;AAC9C,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,+DAA+D;AAC/D,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AAED,wCAAwC;AACxC,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC;AAEtF,4CAA4C;AAC5C,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,kCAAkC;AAClC,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE;QACJ,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;KACvB,CAAC;CACL;AAED,6BAA6B;AAC7B,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACnE;AAED,uDAAuD;AACvD,MAAM,WAAW,SAAS;IACtB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAS5E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,WAAW,CAK7D;AAuHD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE5D;AA6HD,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,YAAY,EAAE,eAAe,EAAE,CAAC"}
|