@aaronsb/kg-cli 0.9.5 → 0.11.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/dist/api/client.d.ts +45 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +16 -0
- package/dist/api/client.js.map +1 -1
- package/dist/cli/admin/index.d.ts.map +1 -1
- package/dist/cli/admin/index.js +5 -2
- package/dist/cli/admin/index.js.map +1 -1
- package/dist/cli/admin/workers.d.ts +7 -0
- package/dist/cli/admin/workers.d.ts.map +1 -0
- package/dist/cli/admin/workers.js +132 -0
- package/dist/cli/admin/workers.js.map +1 -0
- package/dist/cli/login.d.ts.map +1 -1
- package/dist/cli/login.js +29 -11
- package/dist/cli/login.js.map +1 -1
- package/dist/cli/oauth.d.ts.map +1 -1
- package/dist/cli/oauth.js +10 -34
- package/dist/cli/oauth.js.map +1 -1
- package/dist/lib/config.d.ts +18 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +24 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/table.d.ts.map +1 -1
- package/dist/lib/table.js +1 -0
- package/dist/lib/table.js.map +1 -1
- package/dist/mcp/formatters/index.d.ts +2 -1
- package/dist/mcp/formatters/index.d.ts.map +1 -1
- package/dist/mcp/formatters/index.js +6 -1
- package/dist/mcp/formatters/index.js.map +1 -1
- package/dist/mcp/formatters/job.js +5 -5
- package/dist/mcp/formatters/job.js.map +1 -1
- package/dist/mcp/formatters/session.d.ts +19 -0
- package/dist/mcp/formatters/session.d.ts.map +1 -0
- package/dist/mcp/formatters/session.js +39 -0
- package/dist/mcp/formatters/session.js.map +1 -0
- package/dist/mcp/formatters/system.d.ts +1 -0
- package/dist/mcp/formatters/system.d.ts.map +1 -1
- package/dist/mcp/formatters/system.js +37 -0
- package/dist/mcp/formatters/system.js.map +1 -1
- package/dist/mcp-server.js +168 -0
- package/dist/mcp-server.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/version.d.ts +3 -3
- package/dist/version.js +3 -3
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Session context and ingest formatters
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.formatSessionContext = formatSessionContext;
|
|
7
|
+
exports.formatSessionIngest = formatSessionIngest;
|
|
8
|
+
/**
|
|
9
|
+
* Format session context results as markdown
|
|
10
|
+
*/
|
|
11
|
+
function formatSessionContext(concepts, summary) {
|
|
12
|
+
if (concepts.length === 0) {
|
|
13
|
+
return summary + '\n';
|
|
14
|
+
}
|
|
15
|
+
let output = `# Session Context\n\n`;
|
|
16
|
+
output += `${summary}\n\n`;
|
|
17
|
+
// Group by epoch for readability
|
|
18
|
+
let currentEpoch = null;
|
|
19
|
+
for (const c of concepts) {
|
|
20
|
+
if (c.created_at_epoch !== currentEpoch) {
|
|
21
|
+
currentEpoch = c.created_at_epoch;
|
|
22
|
+
output += `\n**Epoch ${currentEpoch}**\n`;
|
|
23
|
+
}
|
|
24
|
+
const ont = c.ontology ? ` [${c.ontology}]` : '';
|
|
25
|
+
output += `- ${c.label} (${c.concept_id})${ont}\n`;
|
|
26
|
+
}
|
|
27
|
+
return output;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Format session ingest result as markdown.
|
|
31
|
+
* Deliberately minimal — the agent should fire and forget.
|
|
32
|
+
*/
|
|
33
|
+
function formatSessionIngest(result) {
|
|
34
|
+
if (result.job_id) {
|
|
35
|
+
return 'Session summary saved to knowledge graph.';
|
|
36
|
+
}
|
|
37
|
+
return `Session ingest failed: ${result.detail || result.message || 'unknown error'}`;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/mcp/formatters/session.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAYH,oDAoBC;AAMD,kDAKC;AAlCD;;GAEG;AACH,SAAgB,oBAAoB,CAAC,QAA0B,EAAE,OAAe;IAC9E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,OAAO,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,IAAI,MAAM,GAAG,uBAAuB,CAAC;IACrC,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC;IAE3B,iCAAiC;IACjC,IAAI,YAAY,GAAkB,IAAI,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,gBAAgB,KAAK,YAAY,EAAE,CAAC;YACxC,YAAY,GAAG,CAAC,CAAC,gBAAgB,CAAC;YAClC,MAAM,IAAI,aAAa,YAAY,MAAM,CAAC;QAC5C,CAAC;QACD,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,UAAU,IAAI,GAAG,IAAI,CAAC;IACrD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,MAAW;IAC7C,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,2CAA2C,CAAC;IACrD,CAAC;IACD,OAAO,0BAA0B,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,IAAI,eAAe,EAAE,CAAC;AACxF,CAAC"}
|
|
@@ -6,5 +6,6 @@ export declare function formatDatabaseInfo(result: any): string;
|
|
|
6
6
|
export declare function formatDatabaseHealth(result: any): string;
|
|
7
7
|
export declare function formatSystemStatus(result: any): string;
|
|
8
8
|
export declare function formatApiHealth(result: any): string;
|
|
9
|
+
export declare function formatWorkerStatus(status: any, lanes: any): string;
|
|
9
10
|
export declare function formatMcpAllowedPaths(result: any): string;
|
|
10
11
|
//# sourceMappingURL=system.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../../src/mcp/formatters/system.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAwBvD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAiBtD;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAmBxD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CA6BtD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAkBnD;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAkDzD"}
|
|
1
|
+
{"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../../src/mcp/formatters/system.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAwBvD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAiBtD;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAmBxD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CA6BtD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAkBnD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,MAAM,CAwClE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAkDzD"}
|
|
@@ -8,6 +8,7 @@ exports.formatDatabaseInfo = formatDatabaseInfo;
|
|
|
8
8
|
exports.formatDatabaseHealth = formatDatabaseHealth;
|
|
9
9
|
exports.formatSystemStatus = formatSystemStatus;
|
|
10
10
|
exports.formatApiHealth = formatApiHealth;
|
|
11
|
+
exports.formatWorkerStatus = formatWorkerStatus;
|
|
11
12
|
exports.formatMcpAllowedPaths = formatMcpAllowedPaths;
|
|
12
13
|
function formatDatabaseStats(result) {
|
|
13
14
|
let output = `# Database Statistics\n\n`;
|
|
@@ -105,6 +106,42 @@ function formatApiHealth(result) {
|
|
|
105
106
|
}
|
|
106
107
|
return output;
|
|
107
108
|
}
|
|
109
|
+
function formatWorkerStatus(status, lanes) {
|
|
110
|
+
let output = `# Worker Status (ADR-100)\n\n`;
|
|
111
|
+
output += `## Slot Utilization\n\n`;
|
|
112
|
+
output += `Slots In Use: ${status.slots_in_use}/${status.total_slots}\n`;
|
|
113
|
+
output += `Running Jobs: ${status.running_count}\n`;
|
|
114
|
+
output += `Queued Jobs: ${status.total_queued}\n\n`;
|
|
115
|
+
if (lanes?.lanes && lanes.lanes.length > 0) {
|
|
116
|
+
output += `## Lane Configuration\n\n`;
|
|
117
|
+
for (const lane of lanes.lanes) {
|
|
118
|
+
output += `### ${lane.name} (${lane.enabled ? 'enabled' : 'disabled'})\n`;
|
|
119
|
+
output += `Job Types: ${lane.job_types.join(', ')}\n`;
|
|
120
|
+
output += `Slots: ${lane.running_jobs}/${lane.max_slots} (${lane.slots_available} available, ${lane.queued_jobs} queued)\n`;
|
|
121
|
+
output += `Poll Interval: ${(lane.poll_interval_ms / 1000).toFixed(1)}s\n`;
|
|
122
|
+
output += `Stale Timeout: ${lane.stale_timeout_minutes}m\n\n`;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (status.running_jobs && status.running_jobs.length > 0) {
|
|
126
|
+
output += `## Active Jobs\n\n`;
|
|
127
|
+
for (const job of status.running_jobs) {
|
|
128
|
+
const startedAt = job.started_at ? new Date(job.started_at.endsWith('Z') ? job.started_at : job.started_at + 'Z') : null;
|
|
129
|
+
const seconds = startedAt ? Math.floor((Date.now() - startedAt.getTime()) / 1000) : null;
|
|
130
|
+
const duration = seconds !== null
|
|
131
|
+
? seconds < 60 ? `${seconds}s` : seconds < 3600 ? `${Math.floor(seconds / 60)}m` : `${Math.floor(seconds / 3600)}h`
|
|
132
|
+
: 'unknown';
|
|
133
|
+
output += `- ${job.job_id.substring(0, 8)}... ${job.job_type} (${duration})\n`;
|
|
134
|
+
}
|
|
135
|
+
output += `\n`;
|
|
136
|
+
}
|
|
137
|
+
if (status.queued_by_type && status.queued_by_type.length > 0) {
|
|
138
|
+
output += `## Queue Depth by Type\n\n`;
|
|
139
|
+
for (const q of status.queued_by_type) {
|
|
140
|
+
output += `${q.job_type}: ${q.count}\n`;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return output;
|
|
144
|
+
}
|
|
108
145
|
function formatMcpAllowedPaths(result) {
|
|
109
146
|
if (!result.configured) {
|
|
110
147
|
let output = `# MCP File Access Allowlist\n\n`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system.js","sourceRoot":"","sources":["../../../src/mcp/formatters/system.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAEH,kDAwBC;AAED,gDAiBC;AAED,oDAmBC;AAED,gDA6BC;AAED,0CAkBC;AAED,sDAkDC;
|
|
1
|
+
{"version":3,"file":"system.js","sourceRoot":"","sources":["../../../src/mcp/formatters/system.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-server.js
CHANGED
|
@@ -47,6 +47,7 @@ const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
|
|
|
47
47
|
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
48
48
|
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
49
49
|
const client_js_1 = require("./api/client.js");
|
|
50
|
+
const config_js_1 = require("./lib/config.js");
|
|
50
51
|
const auth_client_js_1 = require("./lib/auth/auth-client.js");
|
|
51
52
|
const mcp_allowlist_js_1 = require("./lib/mcp-allowlist.js");
|
|
52
53
|
const index_js_2 = require("./mcp/formatters/index.js");
|
|
@@ -220,6 +221,62 @@ function createAuthenticatedClient() {
|
|
|
220
221
|
}
|
|
221
222
|
// Client instance - will be initialized in main() before server starts
|
|
222
223
|
let client;
|
|
224
|
+
/**
|
|
225
|
+
* Fetch recent concepts from the graph for session context.
|
|
226
|
+
* Returns a compact summary and structured data. Fails gracefully if API is unreachable.
|
|
227
|
+
*/
|
|
228
|
+
async function fetchRecentConcepts(limit, ontology) {
|
|
229
|
+
try {
|
|
230
|
+
let query = 'MATCH (c:Concept) WHERE c.created_at_epoch IS NOT NULL';
|
|
231
|
+
if (ontology) {
|
|
232
|
+
// Whitelist validation — ontology names are slugified strings
|
|
233
|
+
if (!/^[a-zA-Z0-9_\-. ()]+$/.test(ontology)) {
|
|
234
|
+
return { summary: `Invalid ontology name: ${ontology}`, concepts: [] };
|
|
235
|
+
}
|
|
236
|
+
query += ` AND c.ontology = '${ontology}'`;
|
|
237
|
+
}
|
|
238
|
+
query += ' RETURN c ORDER BY c.created_at_epoch DESC';
|
|
239
|
+
const result = await client.executeProgram({
|
|
240
|
+
program: {
|
|
241
|
+
version: 1,
|
|
242
|
+
statements: [{
|
|
243
|
+
op: '+',
|
|
244
|
+
operation: { type: 'cypher', query, limit },
|
|
245
|
+
label: 'recent_concepts',
|
|
246
|
+
}],
|
|
247
|
+
},
|
|
248
|
+
});
|
|
249
|
+
const nodes = result.result.nodes || [];
|
|
250
|
+
const concepts = nodes.map((n) => ({
|
|
251
|
+
label: n.label,
|
|
252
|
+
concept_id: n.concept_id,
|
|
253
|
+
ontology: n.ontology ?? null,
|
|
254
|
+
created_at_epoch: n.properties?.created_at_epoch ?? 0,
|
|
255
|
+
}));
|
|
256
|
+
if (concepts.length === 0) {
|
|
257
|
+
return { summary: 'No concepts in the knowledge graph yet.', concepts: [] };
|
|
258
|
+
}
|
|
259
|
+
const labels = concepts.map((c) => c.label).join(' | ');
|
|
260
|
+
return { summary: `Recent concepts (${concepts.length}): ${labels}`, concepts };
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
return { summary: 'Knowledge graph unavailable — API server may not be running.', concepts: [] };
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Resolve the ontology name for session ingest.
|
|
268
|
+
* Priority: config oauth_client_name > env KG_OAUTH_CLIENT_ID > 'sessions'
|
|
269
|
+
*/
|
|
270
|
+
function getSessionOntology() {
|
|
271
|
+
const config = (0, config_js_1.getConfig)();
|
|
272
|
+
const clientName = config.get('auth.oauth_client_name');
|
|
273
|
+
if (clientName)
|
|
274
|
+
return clientName;
|
|
275
|
+
const envClientId = process.env.KG_OAUTH_CLIENT_ID;
|
|
276
|
+
if (envClientId)
|
|
277
|
+
return envClientId;
|
|
278
|
+
return 'sessions';
|
|
279
|
+
}
|
|
223
280
|
/**
|
|
224
281
|
* Tool Definitions
|
|
225
282
|
*
|
|
@@ -227,6 +284,28 @@ let client;
|
|
|
227
284
|
*/
|
|
228
285
|
// List available tools
|
|
229
286
|
server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
|
|
287
|
+
// Build dynamic session context
|
|
288
|
+
const config = (0, config_js_1.getConfig)();
|
|
289
|
+
let sessionContextDescription;
|
|
290
|
+
if (config.getSessionContextEnabled()) {
|
|
291
|
+
const { summary } = await fetchRecentConcepts(config.getSessionContextLimit(), config.getSessionContextOntology());
|
|
292
|
+
sessionContextDescription = `Recent knowledge graph activity. This tool provides active, unsolicited state information about the knowledge graph — what concepts were most recently created or encountered.
|
|
293
|
+
|
|
294
|
+
${summary}
|
|
295
|
+
|
|
296
|
+
Call this tool to refresh context, adjust the limit, or filter by ontology. Results include concept labels, IDs, ontology, and creation epoch.`;
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
sessionContextDescription = 'Read recent knowledge graph activity. Session context is currently disabled in config (~/.config/kg/config.json session.context_enabled).';
|
|
300
|
+
}
|
|
301
|
+
const sessionOntology = getSessionOntology();
|
|
302
|
+
const sessionIngestDescription = `Save a session summary to the knowledge graph for cross-session memory.
|
|
303
|
+
|
|
304
|
+
**IMPORTANT: Before your session ends or context compacts, call this tool with a summary of key topics, decisions, and insights from this session.**
|
|
305
|
+
|
|
306
|
+
Text is ingested into the "${sessionOntology}" ontology, creating concepts that will appear in session_context on your next connection. The ingest job is auto-approved.
|
|
307
|
+
|
|
308
|
+
Input: text (required) — your session summary. Optional: filename for source tracking.`;
|
|
230
309
|
return {
|
|
231
310
|
tools: [
|
|
232
311
|
{
|
|
@@ -1159,6 +1238,43 @@ Read the program/syntax resource for the complete language reference with more e
|
|
|
1159
1238
|
required: ['action'],
|
|
1160
1239
|
},
|
|
1161
1240
|
},
|
|
1241
|
+
{
|
|
1242
|
+
name: 'session_context',
|
|
1243
|
+
description: sessionContextDescription,
|
|
1244
|
+
inputSchema: {
|
|
1245
|
+
type: 'object',
|
|
1246
|
+
properties: {
|
|
1247
|
+
limit: {
|
|
1248
|
+
type: 'number',
|
|
1249
|
+
description: 'Maximum concepts to return (default: 10, max: 50)',
|
|
1250
|
+
default: 10,
|
|
1251
|
+
},
|
|
1252
|
+
ontology: {
|
|
1253
|
+
type: 'string',
|
|
1254
|
+
description: 'Filter by ontology name (default: all ontologies)',
|
|
1255
|
+
},
|
|
1256
|
+
},
|
|
1257
|
+
required: [],
|
|
1258
|
+
},
|
|
1259
|
+
},
|
|
1260
|
+
{
|
|
1261
|
+
name: 'session_ingest',
|
|
1262
|
+
description: sessionIngestDescription,
|
|
1263
|
+
inputSchema: {
|
|
1264
|
+
type: 'object',
|
|
1265
|
+
properties: {
|
|
1266
|
+
text: {
|
|
1267
|
+
type: 'string',
|
|
1268
|
+
description: 'Session summary text to ingest into the knowledge graph',
|
|
1269
|
+
},
|
|
1270
|
+
filename: {
|
|
1271
|
+
type: 'string',
|
|
1272
|
+
description: 'Optional filename for source tracking (e.g., "session-2025-01-15.md")',
|
|
1273
|
+
},
|
|
1274
|
+
},
|
|
1275
|
+
required: ['text'],
|
|
1276
|
+
},
|
|
1277
|
+
},
|
|
1162
1278
|
],
|
|
1163
1279
|
};
|
|
1164
1280
|
});
|
|
@@ -1190,6 +1306,12 @@ server.setRequestHandler(types_js_1.ListResourcesRequestSchema, async () => {
|
|
|
1190
1306
|
description: 'Job scheduler status, resource usage',
|
|
1191
1307
|
mimeType: 'application/json'
|
|
1192
1308
|
},
|
|
1309
|
+
{
|
|
1310
|
+
uri: 'workers/status',
|
|
1311
|
+
name: 'Worker Status',
|
|
1312
|
+
description: 'Lane slot utilization, active jobs, queue depth (ADR-100)',
|
|
1313
|
+
mimeType: 'application/json'
|
|
1314
|
+
},
|
|
1193
1315
|
{
|
|
1194
1316
|
uri: 'api/health',
|
|
1195
1317
|
name: 'API Health',
|
|
@@ -1256,6 +1378,19 @@ server.setRequestHandler(types_js_1.ReadResourceRequestSchema, async (request) =
|
|
|
1256
1378
|
}]
|
|
1257
1379
|
};
|
|
1258
1380
|
}
|
|
1381
|
+
case 'workers/status': {
|
|
1382
|
+
const [workerStatusResult, workerLanesResult] = await Promise.all([
|
|
1383
|
+
client.getWorkerStatus(),
|
|
1384
|
+
client.getWorkerLanes(),
|
|
1385
|
+
]);
|
|
1386
|
+
return {
|
|
1387
|
+
contents: [{
|
|
1388
|
+
uri,
|
|
1389
|
+
mimeType: 'text/plain',
|
|
1390
|
+
text: (0, index_js_2.formatWorkerStatus)(workerStatusResult, workerLanesResult)
|
|
1391
|
+
}]
|
|
1392
|
+
};
|
|
1393
|
+
}
|
|
1259
1394
|
case 'api/health': {
|
|
1260
1395
|
const result = await client.health();
|
|
1261
1396
|
return {
|
|
@@ -2671,6 +2806,39 @@ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
|
2671
2806
|
throw new Error(`Unknown program action: ${action}. Use: validate, create, get, list, execute, or chain`);
|
|
2672
2807
|
}
|
|
2673
2808
|
}
|
|
2809
|
+
case 'session_context': {
|
|
2810
|
+
const limit = Math.min(toolArgs.limit || 10, 50);
|
|
2811
|
+
const ontology = toolArgs.ontology || null;
|
|
2812
|
+
const { summary, concepts } = await fetchRecentConcepts(limit, ontology);
|
|
2813
|
+
return {
|
|
2814
|
+
content: [{
|
|
2815
|
+
type: 'text',
|
|
2816
|
+
text: (0, index_js_2.formatSessionContext)(concepts, summary),
|
|
2817
|
+
}],
|
|
2818
|
+
};
|
|
2819
|
+
}
|
|
2820
|
+
case 'session_ingest': {
|
|
2821
|
+
const text = toolArgs.text;
|
|
2822
|
+
if (!text) {
|
|
2823
|
+
throw new Error('text is required');
|
|
2824
|
+
}
|
|
2825
|
+
const ontology = getSessionOntology();
|
|
2826
|
+
const result = await client.ingestText(text, {
|
|
2827
|
+
ontology,
|
|
2828
|
+
filename: toolArgs.filename || undefined,
|
|
2829
|
+
auto_approve: true,
|
|
2830
|
+
force: false,
|
|
2831
|
+
processing_mode: 'serial',
|
|
2832
|
+
options: {
|
|
2833
|
+
target_words: 1000,
|
|
2834
|
+
overlap_words: 200,
|
|
2835
|
+
},
|
|
2836
|
+
source_type: 'mcp',
|
|
2837
|
+
});
|
|
2838
|
+
return {
|
|
2839
|
+
content: [{ type: 'text', text: (0, index_js_2.formatSessionIngest)(result) }],
|
|
2840
|
+
};
|
|
2841
|
+
}
|
|
2674
2842
|
default:
|
|
2675
2843
|
throw new Error(`Unknown tool: ${name}`);
|
|
2676
2844
|
}
|