@j0hanz/cortex-mcp 1.1.0 → 1.1.2
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 +39 -44
- package/dist/engine/config.d.ts +18 -2
- package/dist/engine/config.d.ts.map +1 -1
- package/dist/engine/config.js.map +1 -1
- package/dist/engine/reasoner.d.ts +1 -0
- package/dist/engine/reasoner.d.ts.map +1 -1
- package/dist/engine/reasoner.js +26 -124
- package/dist/engine/reasoner.js.map +1 -1
- package/dist/engine/session-store.d.ts +9 -4
- package/dist/engine/session-store.d.ts.map +1 -1
- package/dist/engine/session-store.js +72 -30
- package/dist/engine/session-store.js.map +1 -1
- package/dist/instructions.md +33 -13
- package/dist/lib/types.d.ts +13 -12
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +32 -9
- package/dist/prompts/index.js.map +1 -1
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +65 -25
- package/dist/resources/index.js.map +1 -1
- package/dist/schemas/inputs.d.ts +7 -1
- package/dist/schemas/inputs.d.ts.map +1 -1
- package/dist/schemas/inputs.js +41 -0
- package/dist/schemas/inputs.js.map +1 -1
- package/dist/tools/reasoning-think.d.ts.map +1 -1
- package/dist/tools/reasoning-think.js +188 -36
- package/dist/tools/reasoning-think.js.map +1 -1
- package/package.json +1 -1
package/dist/resources/index.js
CHANGED
|
@@ -30,7 +30,10 @@ function buildSessionSummary(sessionId) {
|
|
|
30
30
|
id: session.id,
|
|
31
31
|
level: session.level,
|
|
32
32
|
status: session.status,
|
|
33
|
-
|
|
33
|
+
generatedThoughts: session.thoughts.length,
|
|
34
|
+
remainingThoughts: Math.max(0, session.totalThoughts - session.thoughts.length),
|
|
35
|
+
plannedThoughts: session.totalThoughts,
|
|
36
|
+
totalThoughts: session.totalThoughts,
|
|
34
37
|
tokenBudget: session.tokenBudget,
|
|
35
38
|
tokensUsed: session.tokensUsed,
|
|
36
39
|
createdAt: session.createdAt,
|
|
@@ -59,6 +62,7 @@ function serializeJson(data) {
|
|
|
59
62
|
}
|
|
60
63
|
const COMPLETION_CACHE_TTL_MS = 1000;
|
|
61
64
|
const COMPLETION_CACHE_MAX_ENTRIES = 512;
|
|
65
|
+
const MAX_COMPLETION_RESULTS = 20;
|
|
62
66
|
const completionCache = new Map();
|
|
63
67
|
function pruneCompletionCache(now) {
|
|
64
68
|
for (const [cacheKey, entry] of completionCache.entries()) {
|
|
@@ -74,6 +78,51 @@ function pruneCompletionCache(now) {
|
|
|
74
78
|
completionCache.delete(oldestKey);
|
|
75
79
|
}
|
|
76
80
|
}
|
|
81
|
+
function completeSessionIds(value) {
|
|
82
|
+
const now = Date.now();
|
|
83
|
+
pruneCompletionCache(now);
|
|
84
|
+
const cacheKey = `sessionId:${value}`;
|
|
85
|
+
const cached = completionCache.get(cacheKey);
|
|
86
|
+
if (cached && now - cached.timestamp < COMPLETION_CACHE_TTL_MS) {
|
|
87
|
+
return cached.results;
|
|
88
|
+
}
|
|
89
|
+
const results = [];
|
|
90
|
+
for (const session of sessionStore.list()) {
|
|
91
|
+
if (!session.id.startsWith(value)) {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
results.push(session.id);
|
|
95
|
+
if (results.length >= MAX_COMPLETION_RESULTS) {
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
completionCache.set(cacheKey, { results, timestamp: now });
|
|
100
|
+
pruneCompletionCache(now);
|
|
101
|
+
return results;
|
|
102
|
+
}
|
|
103
|
+
function completeThoughtNames(value, sessionId) {
|
|
104
|
+
const session = sessionStore.get(sessionId);
|
|
105
|
+
if (!session) {
|
|
106
|
+
return [];
|
|
107
|
+
}
|
|
108
|
+
const results = [];
|
|
109
|
+
for (const thought of session.thoughts) {
|
|
110
|
+
const base = `Thought-${String(thought.index + 1)}`;
|
|
111
|
+
if (base.startsWith(value)) {
|
|
112
|
+
results.push(base);
|
|
113
|
+
}
|
|
114
|
+
if (thought.revision > 0) {
|
|
115
|
+
const revised = `${base}-Revised`;
|
|
116
|
+
if (revised.startsWith(value)) {
|
|
117
|
+
results.push(revised);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (results.length >= MAX_COMPLETION_RESULTS) {
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return results;
|
|
125
|
+
}
|
|
77
126
|
export function registerAllResources(server, iconMeta) {
|
|
78
127
|
const instructions = loadInstructions();
|
|
79
128
|
server.registerResource('server-instructions', 'internal://instructions', {
|
|
@@ -136,6 +185,9 @@ export function registerAllResources(server, iconMeta) {
|
|
|
136
185
|
// Template for full trace
|
|
137
186
|
server.registerResource('reasoning.trace', new ResourceTemplate('file:///cortex/sessions/{sessionId}/trace.md', {
|
|
138
187
|
list: undefined,
|
|
188
|
+
complete: {
|
|
189
|
+
sessionId: completeSessionIds,
|
|
190
|
+
},
|
|
139
191
|
}), {
|
|
140
192
|
title: 'Reasoning Trace',
|
|
141
193
|
description: 'Markdown trace of a reasoning session (full content).',
|
|
@@ -161,6 +213,16 @@ export function registerAllResources(server, iconMeta) {
|
|
|
161
213
|
// Template for individual thoughts
|
|
162
214
|
server.registerResource('reasoning.thought', new ResourceTemplate('file:///cortex/sessions/{sessionId}/{thoughtName}.md', {
|
|
163
215
|
list: undefined,
|
|
216
|
+
complete: {
|
|
217
|
+
sessionId: completeSessionIds,
|
|
218
|
+
thoughtName: (value, context) => {
|
|
219
|
+
const sessionId = context?.arguments?.sessionId;
|
|
220
|
+
if (typeof sessionId !== 'string' || sessionId.length === 0) {
|
|
221
|
+
return [];
|
|
222
|
+
}
|
|
223
|
+
return completeThoughtNames(value, sessionId);
|
|
224
|
+
},
|
|
225
|
+
},
|
|
164
226
|
}), {
|
|
165
227
|
title: 'Reasoning Thought',
|
|
166
228
|
description: 'Markdown content of a single thought (e.g. Thought-1.md).',
|
|
@@ -198,7 +260,7 @@ export function registerAllResources(server, iconMeta) {
|
|
|
198
260
|
uri: `reasoning://sessions/${session.id}`,
|
|
199
261
|
name: `session-${session.id.slice(0, 8)}`,
|
|
200
262
|
title: `Reasoning Session ${session.id.slice(0, 8)}`,
|
|
201
|
-
description: `${session.level} session with ${String(session.thoughts.length)} thought(s).`,
|
|
263
|
+
description: `${session.level} session with ${String(session.thoughts.length)}/${String(session.totalThoughts)} thought(s).`,
|
|
202
264
|
mimeType: 'application/json',
|
|
203
265
|
annotations: {
|
|
204
266
|
audience: ['assistant', 'user'],
|
|
@@ -208,29 +270,7 @@ export function registerAllResources(server, iconMeta) {
|
|
|
208
270
|
})),
|
|
209
271
|
}),
|
|
210
272
|
complete: {
|
|
211
|
-
sessionId:
|
|
212
|
-
const now = Date.now();
|
|
213
|
-
pruneCompletionCache(now);
|
|
214
|
-
const cacheKey = `sessionId:${value}`;
|
|
215
|
-
const cached = completionCache.get(cacheKey);
|
|
216
|
-
// Cache for 1 second to reduce repeated completion scans.
|
|
217
|
-
if (cached && now - cached.timestamp < COMPLETION_CACHE_TTL_MS) {
|
|
218
|
-
return cached.results;
|
|
219
|
-
}
|
|
220
|
-
const results = [];
|
|
221
|
-
for (const session of sessionStore.list()) {
|
|
222
|
-
if (!session.id.startsWith(value)) {
|
|
223
|
-
continue;
|
|
224
|
-
}
|
|
225
|
-
results.push(session.id);
|
|
226
|
-
if (results.length >= 20) {
|
|
227
|
-
break;
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
completionCache.set(cacheKey, { results, timestamp: now });
|
|
231
|
-
pruneCompletionCache(now);
|
|
232
|
-
return results;
|
|
233
|
-
},
|
|
273
|
+
sessionId: completeSessionIds,
|
|
234
274
|
},
|
|
235
275
|
});
|
|
236
276
|
server.registerResource('reasoning.session', sessionTemplate, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAG3E,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAE9D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D,kBAAkB;AAElB,SAAS,qBAAqB,CAC5B,SAAoB,EACpB,IAAY,EACZ,GAAQ;IAER,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAChD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,QAAQ,CAAC,CAAC,KAAK,EAAE,WAAW,IAAI,YAAY,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB,EAAE,GAAQ;IACjD,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,QAAQ,CAAC,CAAC,KAAK,EAAE,uBAAuB,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,mBAAmB,CAAC,SAAiB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"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"}
|
package/dist/schemas/inputs.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
export declare const ReasoningThinkInputSchema: z.ZodObject<{
|
|
3
|
-
query: z.ZodString
|
|
3
|
+
query: z.ZodOptional<z.ZodString>;
|
|
4
4
|
level: z.ZodEnum<{
|
|
5
5
|
basic: "basic";
|
|
6
6
|
normal: "normal";
|
|
@@ -8,6 +8,12 @@ export declare const ReasoningThinkInputSchema: z.ZodObject<{
|
|
|
8
8
|
}>;
|
|
9
9
|
targetThoughts: z.ZodOptional<z.ZodNumber>;
|
|
10
10
|
sessionId: z.ZodOptional<z.ZodString>;
|
|
11
|
+
runMode: z.ZodOptional<z.ZodEnum<{
|
|
12
|
+
step: "step";
|
|
13
|
+
run_to_completion: "run_to_completion";
|
|
14
|
+
}>>;
|
|
15
|
+
thought: z.ZodString;
|
|
16
|
+
thoughts: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
11
17
|
}, z.core.$strict>;
|
|
12
18
|
export type ReasoningThinkInput = z.infer<typeof ReasoningThinkInputSchema>;
|
|
13
19
|
//# sourceMappingURL=inputs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inputs.d.ts","sourceRoot":"","sources":["../../src/schemas/inputs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,yBAAyB
|
|
1
|
+
{"version":3,"file":"inputs.d.ts","sourceRoot":"","sources":["../../src/schemas/inputs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;kBA4FlC,CAAC;AAEL,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC"}
|
package/dist/schemas/inputs.js
CHANGED
|
@@ -6,6 +6,7 @@ export const ReasoningThinkInputSchema = z
|
|
|
6
6
|
.string()
|
|
7
7
|
.min(1)
|
|
8
8
|
.max(10000)
|
|
9
|
+
.optional()
|
|
9
10
|
.describe('The question or problem to reason about'),
|
|
10
11
|
level: z
|
|
11
12
|
.enum(['basic', 'normal', 'high'])
|
|
@@ -22,8 +23,48 @@ export const ReasoningThinkInputSchema = z
|
|
|
22
23
|
.max(128)
|
|
23
24
|
.optional()
|
|
24
25
|
.describe('Optional session ID to continue a previous reasoning session'),
|
|
26
|
+
runMode: z
|
|
27
|
+
.enum(['step', 'run_to_completion'])
|
|
28
|
+
.optional()
|
|
29
|
+
.describe('Execution mode. "step" appends a single thought. "run_to_completion" consumes all supplied thought inputs in one request.'),
|
|
30
|
+
thought: z
|
|
31
|
+
.string()
|
|
32
|
+
.min(1)
|
|
33
|
+
.max(100000)
|
|
34
|
+
.describe('Your full reasoning content for this step. ' +
|
|
35
|
+
'The server stores this text verbatim as the thought in the session trace. ' +
|
|
36
|
+
'Write your complete analysis, observations, and conclusions here — this is what appears in trace.md.'),
|
|
37
|
+
thoughts: z
|
|
38
|
+
.array(z.string().min(1).max(100000))
|
|
39
|
+
.max(25)
|
|
40
|
+
.optional()
|
|
41
|
+
.describe('Optional additional thought inputs consumed in order when runMode is "run_to_completion".'),
|
|
25
42
|
})
|
|
26
43
|
.superRefine((data, ctx) => {
|
|
44
|
+
const runMode = data.runMode ?? 'step';
|
|
45
|
+
if (data.sessionId === undefined && data.query === undefined) {
|
|
46
|
+
ctx.addIssue({
|
|
47
|
+
code: 'custom',
|
|
48
|
+
message: 'query is required when sessionId is not provided',
|
|
49
|
+
path: ['query'],
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
if (runMode === 'run_to_completion' &&
|
|
53
|
+
data.sessionId === undefined &&
|
|
54
|
+
data.targetThoughts === undefined) {
|
|
55
|
+
ctx.addIssue({
|
|
56
|
+
code: 'custom',
|
|
57
|
+
message: 'targetThoughts is required for run_to_completion when sessionId is not provided',
|
|
58
|
+
path: ['targetThoughts'],
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
if (runMode === 'step' && data.thoughts !== undefined) {
|
|
62
|
+
ctx.addIssue({
|
|
63
|
+
code: 'custom',
|
|
64
|
+
message: 'thoughts is only allowed when runMode is "run_to_completion"',
|
|
65
|
+
path: ['thoughts'],
|
|
66
|
+
});
|
|
67
|
+
}
|
|
27
68
|
if (data.targetThoughts === undefined) {
|
|
28
69
|
return;
|
|
29
70
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inputs.js","sourceRoot":"","sources":["../../src/schemas/inputs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC;KACvC,YAAY,CAAC;IACZ,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,KAAK,CAAC;SACV,QAAQ,CAAC,yCAAyC,CAAC;IACtD,KAAK,EAAE,CAAC;SACL,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;SACjC,QAAQ,CAAC,uBAAuB,CAAC;IACpC,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CACP,qEAAqE,CACtE;IACH,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,8DAA8D,CAAC;
|
|
1
|
+
{"version":3,"file":"inputs.js","sourceRoot":"","sources":["../../src/schemas/inputs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reasoning-think.d.ts","sourceRoot":"","sources":["../../src/tools/reasoning-think.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmBzE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"reasoning-think.d.ts","sourceRoot":"","sources":["../../src/tools/reasoning-think.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmBzE,OAAO,KAAK,EACV,QAAQ,EAIT,MAAM,iBAAiB,CAAC;AA6rBzB,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,SAAS,EACjB,QAAQ,CAAC,EAAE,QAAQ,GAClB,IAAI,CAwFN"}
|
|
@@ -4,6 +4,36 @@ import { ReasoningThinkToolOutputSchema } from '../schemas/outputs.js';
|
|
|
4
4
|
import { createErrorResponse, getErrorMessage } from '../lib/errors.js';
|
|
5
5
|
import { formatThoughtsToMarkdown } from '../lib/formatting.js';
|
|
6
6
|
import { createToolResponse } from '../lib/tool-response.js';
|
|
7
|
+
const DEFAULT_MAX_ACTIVE_REASONING_TASKS = 32;
|
|
8
|
+
const TASK_OVERLOAD_MESSAGE = 'Server busy: too many active reasoning tasks';
|
|
9
|
+
function parsePositiveInt(rawValue, fallbackValue) {
|
|
10
|
+
if (rawValue === undefined) {
|
|
11
|
+
return fallbackValue;
|
|
12
|
+
}
|
|
13
|
+
const parsed = Number.parseInt(rawValue, 10);
|
|
14
|
+
if (!Number.isInteger(parsed) || parsed < 1) {
|
|
15
|
+
return fallbackValue;
|
|
16
|
+
}
|
|
17
|
+
return parsed;
|
|
18
|
+
}
|
|
19
|
+
function createTaskLimiter(maxActiveTasks) {
|
|
20
|
+
let activeTasks = 0;
|
|
21
|
+
return {
|
|
22
|
+
tryAcquire() {
|
|
23
|
+
if (activeTasks >= maxActiveTasks) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
activeTasks += 1;
|
|
27
|
+
return true;
|
|
28
|
+
},
|
|
29
|
+
release() {
|
|
30
|
+
if (activeTasks > 0) {
|
|
31
|
+
activeTasks -= 1;
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
const reasoningTaskLimiter = createTaskLimiter(parsePositiveInt(process.env.CORTEX_MAX_ACTIVE_REASONING_TASKS, DEFAULT_MAX_ACTIVE_REASONING_TASKS));
|
|
7
37
|
function isObjectRecord(value) {
|
|
8
38
|
return typeof value === 'object' && value !== null;
|
|
9
39
|
}
|
|
@@ -63,8 +93,32 @@ function parseReasoningTaskExtra(rawExtra) {
|
|
|
63
93
|
}
|
|
64
94
|
return rawExtra;
|
|
65
95
|
}
|
|
66
|
-
function
|
|
96
|
+
function isContentBlockLike(value) {
|
|
97
|
+
if (!isObjectRecord(value) || typeof value.type !== 'string') {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
if (value.type === 'text') {
|
|
101
|
+
return typeof value.text === 'string';
|
|
102
|
+
}
|
|
103
|
+
if (value.type === 'resource') {
|
|
104
|
+
return isObjectRecord(value.resource);
|
|
105
|
+
}
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
function isCallToolResult(value) {
|
|
67
109
|
if (!isObjectRecord(value) || !Array.isArray(value.content)) {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
if (!value.content.every((entry) => isContentBlockLike(entry))) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
if (value.isError !== undefined && typeof value.isError !== 'boolean') {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
function assertCallToolResult(value) {
|
|
121
|
+
if (!isCallToolResult(value)) {
|
|
68
122
|
throw new Error('Stored task result is not a valid CallToolResult.');
|
|
69
123
|
}
|
|
70
124
|
}
|
|
@@ -82,6 +136,15 @@ function mapReasoningErrorCode(message) {
|
|
|
82
136
|
if (message.startsWith('Session level mismatch:')) {
|
|
83
137
|
return 'E_SESSION_LEVEL_MISMATCH';
|
|
84
138
|
}
|
|
139
|
+
if (message.startsWith('run_to_completion requires at least')) {
|
|
140
|
+
return 'E_INSUFFICIENT_THOUGHTS';
|
|
141
|
+
}
|
|
142
|
+
if (message.startsWith('targetThoughts is required for run_to_completion when sessionId is not provided')) {
|
|
143
|
+
return 'E_INVALID_RUN_MODE_ARGS';
|
|
144
|
+
}
|
|
145
|
+
if (message === TASK_OVERLOAD_MESSAGE) {
|
|
146
|
+
return 'E_SERVER_BUSY';
|
|
147
|
+
}
|
|
85
148
|
return 'E_REASONING';
|
|
86
149
|
}
|
|
87
150
|
function shouldEmitProgress(progress, total, level) {
|
|
@@ -90,6 +153,52 @@ function shouldEmitProgress(progress, total, level) {
|
|
|
90
153
|
}
|
|
91
154
|
return progress % 2 === 0;
|
|
92
155
|
}
|
|
156
|
+
function resolveRunMode(params) {
|
|
157
|
+
return params.runMode ?? 'step';
|
|
158
|
+
}
|
|
159
|
+
function buildThoughtInputs(params) {
|
|
160
|
+
return [params.thought, ...(params.thoughts ?? [])];
|
|
161
|
+
}
|
|
162
|
+
function getStartingThoughtCount(sessionId) {
|
|
163
|
+
if (sessionId === undefined) {
|
|
164
|
+
return 0;
|
|
165
|
+
}
|
|
166
|
+
return sessionStore.get(sessionId)?.thoughts.length ?? 0;
|
|
167
|
+
}
|
|
168
|
+
function shouldStopReasoningLoop(session, runMode) {
|
|
169
|
+
return (runMode === 'step' ||
|
|
170
|
+
session.status !== 'active' ||
|
|
171
|
+
session.thoughts.length >= session.totalThoughts ||
|
|
172
|
+
session.tokensUsed >= session.tokenBudget);
|
|
173
|
+
}
|
|
174
|
+
async function executeReasoningSteps(args) {
|
|
175
|
+
const { taskStore, taskId, controller, queryText, level, sessionId, targetThoughts, runMode, thoughtInputs, onProgress, } = args;
|
|
176
|
+
let activeSessionId = sessionId;
|
|
177
|
+
let session;
|
|
178
|
+
const maxSteps = runMode === 'step' ? 1 : thoughtInputs.length;
|
|
179
|
+
for (let index = 0; index < maxSteps; index++) {
|
|
180
|
+
await ensureTaskIsActive(taskStore, taskId, controller);
|
|
181
|
+
const inputThought = thoughtInputs[index];
|
|
182
|
+
if (inputThought === undefined) {
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
session = await reason(queryText, level, {
|
|
186
|
+
...(activeSessionId !== undefined ? { sessionId: activeSessionId } : {}),
|
|
187
|
+
...(targetThoughts !== undefined ? { targetThoughts } : {}),
|
|
188
|
+
thought: inputThought,
|
|
189
|
+
abortSignal: controller.signal,
|
|
190
|
+
onProgress,
|
|
191
|
+
});
|
|
192
|
+
activeSessionId = session.id;
|
|
193
|
+
if (shouldStopReasoningLoop(session, runMode)) {
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (!session) {
|
|
198
|
+
throw new Error('No reasoning step was executed.');
|
|
199
|
+
}
|
|
200
|
+
return session;
|
|
201
|
+
}
|
|
93
202
|
function buildStructuredResult(session, generatedThoughts, targetThoughts) {
|
|
94
203
|
const ttlMs = sessionStore.getTtlMs();
|
|
95
204
|
const expiresAt = sessionStore.getExpiresAt(session.id) ?? session.updatedAt + ttlMs;
|
|
@@ -100,11 +209,7 @@ function buildStructuredResult(session, generatedThoughts, targetThoughts) {
|
|
|
100
209
|
sessionId: session.id,
|
|
101
210
|
level: session.level,
|
|
102
211
|
status: session.status,
|
|
103
|
-
thoughts: session.thoughts
|
|
104
|
-
index: thought.index,
|
|
105
|
-
content: thought.content,
|
|
106
|
-
revision: thought.revision,
|
|
107
|
-
})),
|
|
212
|
+
thoughts: session.thoughts,
|
|
108
213
|
generatedThoughts,
|
|
109
214
|
requestedThoughts,
|
|
110
215
|
totalThoughts: session.totalThoughts,
|
|
@@ -183,6 +288,31 @@ async function storeTaskFailure(taskStore, taskId, response) {
|
|
|
183
288
|
// No-op if the task has already reached a terminal state.
|
|
184
289
|
}
|
|
185
290
|
}
|
|
291
|
+
async function setTaskFailureStatusMessage(taskStore, taskId, statusMessage) {
|
|
292
|
+
try {
|
|
293
|
+
await taskStore.updateTaskStatus(taskId, 'working', statusMessage);
|
|
294
|
+
}
|
|
295
|
+
catch {
|
|
296
|
+
// No-op if task is already terminal.
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
function assertRunToCompletionInputCount(params, thoughtInputs) {
|
|
300
|
+
const { sessionId, targetThoughts } = params;
|
|
301
|
+
if (sessionId === undefined && targetThoughts === undefined) {
|
|
302
|
+
throw new Error('targetThoughts is required for run_to_completion when sessionId is not provided');
|
|
303
|
+
}
|
|
304
|
+
let requiredInputs = targetThoughts ?? 0;
|
|
305
|
+
if (sessionId !== undefined) {
|
|
306
|
+
const existing = sessionStore.get(sessionId);
|
|
307
|
+
if (!existing) {
|
|
308
|
+
throw new Error(`Session not found: ${sessionId}`);
|
|
309
|
+
}
|
|
310
|
+
requiredInputs = Math.max(0, existing.totalThoughts - existing.thoughts.length);
|
|
311
|
+
}
|
|
312
|
+
if (thoughtInputs.length < requiredInputs) {
|
|
313
|
+
throw new Error(`run_to_completion requires at least ${String(requiredInputs)} thought inputs; received ${String(thoughtInputs.length)}`);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
186
316
|
async function handleTaskFailure(args) {
|
|
187
317
|
const { server, taskStore, taskId, sessionId, error } = args;
|
|
188
318
|
const message = getErrorMessage(error);
|
|
@@ -191,18 +321,13 @@ async function handleTaskFailure(args) {
|
|
|
191
321
|
await emitLog(server, 'notice', { event: 'task_cancelled', taskId, reason: message }, sessionId);
|
|
192
322
|
return;
|
|
193
323
|
}
|
|
324
|
+
await setTaskFailureStatusMessage(taskStore, taskId, message);
|
|
194
325
|
if (errorCode === 'E_ABORTED') {
|
|
195
326
|
if (sessionId) {
|
|
196
327
|
sessionStore.markCancelled(sessionId);
|
|
197
328
|
}
|
|
198
329
|
await storeTaskFailure(taskStore, taskId, createErrorResponse(errorCode, message));
|
|
199
|
-
|
|
200
|
-
await taskStore.updateTaskStatus(taskId, 'cancelled', 'Task cancelled by request.');
|
|
201
|
-
}
|
|
202
|
-
catch {
|
|
203
|
-
// No-op if already terminal.
|
|
204
|
-
}
|
|
205
|
-
await emitLog(server, 'notice', { event: 'task_cancelled', taskId, reason: message }, sessionId);
|
|
330
|
+
await emitLog(server, 'notice', { event: 'task_aborted', taskId, reason: message }, sessionId);
|
|
206
331
|
return;
|
|
207
332
|
}
|
|
208
333
|
await storeTaskFailure(taskStore, taskId, createErrorResponse(errorCode, message));
|
|
@@ -211,17 +336,23 @@ async function handleTaskFailure(args) {
|
|
|
211
336
|
async function runReasoningTask(args) {
|
|
212
337
|
const { server, taskStore, taskId, params, progressToken, controller, sessionId, } = args;
|
|
213
338
|
const { query, level, targetThoughts } = params;
|
|
339
|
+
const runMode = resolveRunMode(params);
|
|
340
|
+
const thoughtInputs = buildThoughtInputs(params);
|
|
341
|
+
const queryText = query ?? '';
|
|
214
342
|
await emitLog(server, 'info', {
|
|
215
343
|
event: 'task_started',
|
|
216
344
|
taskId,
|
|
217
345
|
level,
|
|
346
|
+
runMode,
|
|
218
347
|
hasSessionId: params.sessionId !== undefined,
|
|
219
348
|
targetThoughts: targetThoughts ?? null,
|
|
349
|
+
thoughtInputs: thoughtInputs.length,
|
|
220
350
|
}, sessionId);
|
|
221
351
|
try {
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
352
|
+
if (runMode === 'run_to_completion') {
|
|
353
|
+
assertRunToCompletionInputCount(params, thoughtInputs);
|
|
354
|
+
}
|
|
355
|
+
const startingCount = getStartingThoughtCount(params.sessionId);
|
|
225
356
|
const progressArgs = {
|
|
226
357
|
server,
|
|
227
358
|
taskStore,
|
|
@@ -230,11 +361,20 @@ async function runReasoningTask(args) {
|
|
|
230
361
|
controller,
|
|
231
362
|
...(progressToken !== undefined ? { progressToken } : {}),
|
|
232
363
|
};
|
|
233
|
-
const
|
|
234
|
-
|
|
364
|
+
const onProgress = createProgressHandler(progressArgs);
|
|
365
|
+
const session = await executeReasoningSteps({
|
|
366
|
+
taskStore,
|
|
367
|
+
taskId,
|
|
368
|
+
controller,
|
|
369
|
+
queryText,
|
|
370
|
+
level,
|
|
371
|
+
...(params.sessionId !== undefined
|
|
372
|
+
? { sessionId: params.sessionId }
|
|
373
|
+
: {}),
|
|
235
374
|
...(targetThoughts !== undefined ? { targetThoughts } : {}),
|
|
236
|
-
|
|
237
|
-
|
|
375
|
+
runMode,
|
|
376
|
+
thoughtInputs,
|
|
377
|
+
onProgress,
|
|
238
378
|
});
|
|
239
379
|
if (await isTaskCancelled(taskStore, taskId)) {
|
|
240
380
|
await emitLog(server, 'notice', { event: 'task_cancelled_before_result', taskId }, sessionId);
|
|
@@ -278,11 +418,12 @@ const TOOL_NAME = 'reasoning.think';
|
|
|
278
418
|
export function registerReasoningThinkTool(server, iconMeta) {
|
|
279
419
|
server.experimental.tasks.registerToolTask(TOOL_NAME, {
|
|
280
420
|
title: 'Reasoning Think',
|
|
281
|
-
description: 'Perform multi-level reasoning on a query.
|
|
421
|
+
description: 'Perform multi-level reasoning on a query. Provide your full reasoning content in the `thought` parameter — it is stored verbatim in the session trace. ' +
|
|
282
422
|
'Supports three depth levels: basic (3–5 thoughts, 2K token budget), normal (6–10 thoughts, 8K budget), and high (15–25 thoughts, 32K budget). ' +
|
|
283
|
-
'
|
|
423
|
+
'Default `runMode="step"` appends one thought to the session per call. `runMode="run_to_completion"` consumes `thought` + `thoughts[]` in one request. ' +
|
|
424
|
+
'When continuing an existing session, `query` is optional. Repeat calls with the same sessionId and your next thought until totalThoughts is reached. ' +
|
|
284
425
|
'Returns a session with accumulated thoughts, token usage, and TTL metadata. ' +
|
|
285
|
-
'
|
|
426
|
+
'Supports task-augmented execution for multi-step high-level reasoning.',
|
|
286
427
|
inputSchema: ReasoningThinkInputSchema,
|
|
287
428
|
outputSchema: ReasoningThinkToolOutputSchema,
|
|
288
429
|
annotations: {
|
|
@@ -313,19 +454,30 @@ export function registerReasoningThinkTool(server, iconMeta) {
|
|
|
313
454
|
ttl: extra.taskRequestedTtl ?? null,
|
|
314
455
|
pollInterval: 500,
|
|
315
456
|
});
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
457
|
+
if (!reasoningTaskLimiter.tryAcquire()) {
|
|
458
|
+
throw new Error(TASK_OVERLOAD_MESSAGE);
|
|
459
|
+
}
|
|
460
|
+
try {
|
|
461
|
+
const controller = createCancellationController(extra.signal);
|
|
462
|
+
const taskArgs = {
|
|
463
|
+
server,
|
|
464
|
+
taskStore: extra.taskStore,
|
|
465
|
+
taskId: task.taskId,
|
|
466
|
+
params,
|
|
467
|
+
controller,
|
|
468
|
+
...(progressToken !== undefined ? { progressToken } : {}),
|
|
469
|
+
...(extra.sessionId !== undefined
|
|
470
|
+
? { sessionId: extra.sessionId }
|
|
471
|
+
: {}),
|
|
472
|
+
};
|
|
473
|
+
void runReasoningTask(taskArgs).finally(() => {
|
|
474
|
+
reasoningTaskLimiter.release();
|
|
475
|
+
});
|
|
476
|
+
}
|
|
477
|
+
catch (error) {
|
|
478
|
+
reasoningTaskLimiter.release();
|
|
479
|
+
throw error;
|
|
480
|
+
}
|
|
329
481
|
return { task };
|
|
330
482
|
},
|
|
331
483
|
getTask(_params, rawExtra) {
|