@hmbown/kytchen-reasoning 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/autocode.d.ts +89 -0
- package/dist/autocode.d.ts.map +1 -0
- package/dist/autocode.js +282 -0
- package/dist/autocode.js.map +1 -0
- package/dist/autocode.test.d.ts +2 -0
- package/dist/autocode.test.d.ts.map +1 -0
- package/dist/autocode.test.js +149 -0
- package/dist/autocode.test.js.map +1 -0
- package/dist/coherence.d.ts +123 -0
- package/dist/coherence.d.ts.map +1 -0
- package/dist/coherence.js +289 -0
- package/dist/coherence.js.map +1 -0
- package/dist/coherence.test.d.ts +2 -0
- package/dist/coherence.test.d.ts.map +1 -0
- package/dist/coherence.test.js +14 -0
- package/dist/coherence.test.js.map +1 -0
- package/dist/dialectic.d.ts +126 -0
- package/dist/dialectic.d.ts.map +1 -0
- package/dist/dialectic.js +317 -0
- package/dist/dialectic.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/recursive.d.ts +214 -0
- package/dist/recursive.d.ts.map +1 -0
- package/dist/recursive.js +570 -0
- package/dist/recursive.js.map +1 -0
- package/dist/recursive.test.d.ts +2 -0
- package/dist/recursive.test.d.ts.map +1 -0
- package/dist/recursive.test.js +94 -0
- package/dist/recursive.test.js.map +1 -0
- package/dist/router.d.ts +28 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.golden.test.d.ts +2 -0
- package/dist/router.golden.test.d.ts.map +1 -0
- package/dist/router.golden.test.js +84 -0
- package/dist/router.golden.test.js.map +1 -0
- package/dist/router.js +272 -0
- package/dist/router.js.map +1 -0
- package/dist/router.test.d.ts +2 -0
- package/dist/router.test.d.ts.map +1 -0
- package/dist/router.test.js +86 -0
- package/dist/router.test.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
import { RecursiveOrchestrator, _resetIdCounter, } from "./recursive.js";
|
|
4
|
+
test("recursive orchestrator emits deterministic task ids and lifecycle events", async () => {
|
|
5
|
+
_resetIdCounter();
|
|
6
|
+
const lifecycle = [];
|
|
7
|
+
const orchestrator = new RecursiveOrchestrator({
|
|
8
|
+
maxDepth: 3,
|
|
9
|
+
maxIterations: 8,
|
|
10
|
+
maxBreadth: 2,
|
|
11
|
+
});
|
|
12
|
+
const trace = await orchestrator.run("root", async (task) => {
|
|
13
|
+
if (task.depth === 0) {
|
|
14
|
+
return {
|
|
15
|
+
summary: "root summary",
|
|
16
|
+
evidence: [],
|
|
17
|
+
subQueries: ["child A", "child B"],
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
summary: `leaf ${task.prompt}`,
|
|
22
|
+
evidence: [],
|
|
23
|
+
};
|
|
24
|
+
}, {
|
|
25
|
+
onLifecycleEvent: (event) => {
|
|
26
|
+
lifecycle.push(event);
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
const taskIds = [...trace.taskMap.keys()];
|
|
30
|
+
assert.deepEqual(taskIds, ["rq-0001", "rq-0002", "rq-0003"]);
|
|
31
|
+
assert.equal(trace.rootOutcome.childOutcomes.length, 2);
|
|
32
|
+
assert.equal(lifecycle.some((event) => event.type === "task.spawned"), true);
|
|
33
|
+
assert.equal(lifecycle.some((event) => event.type === "task.merged"), true);
|
|
34
|
+
});
|
|
35
|
+
test("recursive orchestrator enforces wall-clock budget across children", async () => {
|
|
36
|
+
_resetIdCounter();
|
|
37
|
+
let nowMs = 0;
|
|
38
|
+
const orchestrator = new RecursiveOrchestrator({
|
|
39
|
+
maxDepth: 3,
|
|
40
|
+
maxIterations: 8,
|
|
41
|
+
maxBreadth: 3,
|
|
42
|
+
});
|
|
43
|
+
const trace = await orchestrator.run("root", async (task) => {
|
|
44
|
+
if (task.depth === 0) {
|
|
45
|
+
nowMs += 250;
|
|
46
|
+
return {
|
|
47
|
+
summary: "root summary",
|
|
48
|
+
evidence: [],
|
|
49
|
+
subQueries: ["child"],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
summary: "child summary",
|
|
54
|
+
evidence: [],
|
|
55
|
+
};
|
|
56
|
+
}, {
|
|
57
|
+
maxWallTimeMs: 100,
|
|
58
|
+
now: () => nowMs,
|
|
59
|
+
});
|
|
60
|
+
assert.equal(trace.rootOutcome.finalized, false);
|
|
61
|
+
assert.equal(trace.rootOutcome.finalizationStatus, "time_budget_exceeded");
|
|
62
|
+
});
|
|
63
|
+
test("recursive orchestrator surfaces interruption as explicit finalization state", async () => {
|
|
64
|
+
_resetIdCounter();
|
|
65
|
+
const controller = new AbortController();
|
|
66
|
+
const lifecycle = [];
|
|
67
|
+
const orchestrator = new RecursiveOrchestrator({
|
|
68
|
+
maxDepth: 3,
|
|
69
|
+
maxIterations: 8,
|
|
70
|
+
maxBreadth: 3,
|
|
71
|
+
});
|
|
72
|
+
const trace = await orchestrator.run("root", async (task) => {
|
|
73
|
+
if (task.depth === 0) {
|
|
74
|
+
controller.abort();
|
|
75
|
+
return {
|
|
76
|
+
summary: "root summary",
|
|
77
|
+
evidence: [],
|
|
78
|
+
subQueries: ["child"],
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
summary: "child summary",
|
|
83
|
+
evidence: [],
|
|
84
|
+
};
|
|
85
|
+
}, {
|
|
86
|
+
signal: controller.signal,
|
|
87
|
+
onLifecycleEvent: (event) => {
|
|
88
|
+
lifecycle.push(event);
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
assert.equal(trace.rootOutcome.finalizationStatus, "interrupted");
|
|
92
|
+
assert.equal(lifecycle.some((event) => event.type === "task.interrupted"), true);
|
|
93
|
+
});
|
|
94
|
+
//# sourceMappingURL=recursive.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recursive.test.js","sourceRoot":"","sources":["../src/recursive.test.ts"],"names":[],"mappings":"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"}
|
package/dist/router.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { RoutingDecision, RoutingSignalKind } from "@hmbown/kytchen-protocol";
|
|
2
|
+
export interface RouteInput {
|
|
3
|
+
prompt: string;
|
|
4
|
+
context?: string;
|
|
5
|
+
allowAutocode?: boolean;
|
|
6
|
+
allowRecursive?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface RouterConfig {
|
|
9
|
+
signalWeights?: Partial<Record<RoutingSignalKind, number>>;
|
|
10
|
+
confidenceThreshold?: number;
|
|
11
|
+
enableAutocode?: boolean;
|
|
12
|
+
enableRecursive?: boolean;
|
|
13
|
+
/** Back-compat alias for `enableAutocode`. */
|
|
14
|
+
allowAutocodeByDefault?: boolean;
|
|
15
|
+
/** Back-compat alias for `enableRecursive`. */
|
|
16
|
+
allowRecursiveByDefault?: boolean;
|
|
17
|
+
/** Back-compat alias for `confidenceThreshold`. */
|
|
18
|
+
composeThreshold?: number;
|
|
19
|
+
}
|
|
20
|
+
export declare class ReasoningRouter {
|
|
21
|
+
private readonly enableAutocode;
|
|
22
|
+
private readonly enableRecursive;
|
|
23
|
+
private readonly confidenceThreshold;
|
|
24
|
+
private readonly signalWeights;
|
|
25
|
+
constructor(config?: RouterConfig);
|
|
26
|
+
route(input: RouteInput): RoutingDecision;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,eAAe,EAEf,iBAAiB,EAElB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,8CAA8C;IAC9C,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,+CAA+C;IAC/C,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,mDAAmD;IACnD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAkPD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAC1C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoC;gBAEtD,MAAM,GAAE,YAAiB;IAmBrC,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,eAAe;CAoE1C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.golden.test.d.ts","sourceRoot":"","sources":["../src/router.golden.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { access, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import test from "node:test";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { ReasoningRouter } from "./router.js";
|
|
6
|
+
const UPDATE_ENV_VAR = "UPDATE_ROUTER_GOLDEN";
|
|
7
|
+
const UPDATE_REQUESTED = process.env[UPDATE_ENV_VAR] === "1";
|
|
8
|
+
const FIXTURE_CANDIDATES = [
|
|
9
|
+
new URL("./router.golden.fixtures.json", import.meta.url),
|
|
10
|
+
new URL("../src/router.golden.fixtures.json", import.meta.url),
|
|
11
|
+
];
|
|
12
|
+
async function resolveFixturePath() {
|
|
13
|
+
for (const candidate of FIXTURE_CANDIDATES) {
|
|
14
|
+
const candidatePath = fileURLToPath(candidate);
|
|
15
|
+
try {
|
|
16
|
+
await access(candidatePath);
|
|
17
|
+
return candidatePath;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// Continue searching.
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
throw new Error(`Unable to find router golden fixtures. Checked: ${FIXTURE_CANDIDATES.map((candidate) => fileURLToPath(candidate)).join(", ")}`);
|
|
24
|
+
}
|
|
25
|
+
async function loadFixtures() {
|
|
26
|
+
const path = await resolveFixturePath();
|
|
27
|
+
const raw = await readFile(path, "utf8");
|
|
28
|
+
return {
|
|
29
|
+
path,
|
|
30
|
+
fixtures: JSON.parse(raw),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function normalizeDecision(decision) {
|
|
34
|
+
return {
|
|
35
|
+
selectedMode: decision.selectedMode,
|
|
36
|
+
pipeline: [...decision.pipeline],
|
|
37
|
+
confidence: decision.confidence,
|
|
38
|
+
scores: { ...decision.scores },
|
|
39
|
+
signals: decision.signals.map((signal) => ({
|
|
40
|
+
name: signal.name,
|
|
41
|
+
kind: signal.kind,
|
|
42
|
+
matched: signal.matched,
|
|
43
|
+
...(signal.detail ? { detail: signal.detail } : {}),
|
|
44
|
+
score: signal.score,
|
|
45
|
+
weight: signal.weight,
|
|
46
|
+
weightedScore: signal.weightedScore,
|
|
47
|
+
evidence: [...signal.evidence],
|
|
48
|
+
})),
|
|
49
|
+
rationale: decision.rationale,
|
|
50
|
+
escalationAllowed: decision.escalationAllowed,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
test("router acceptance matrix routes prompts to expected mode and pipeline", async () => {
|
|
54
|
+
const { fixtures } = await loadFixtures();
|
|
55
|
+
const router = new ReasoningRouter();
|
|
56
|
+
for (const fixture of fixtures.cases) {
|
|
57
|
+
const decision = router.route(fixture.input);
|
|
58
|
+
assert.equal(decision.selectedMode, fixture.acceptance.selectedMode, `Case "${fixture.id}" selectedMode mismatch`);
|
|
59
|
+
assert.deepEqual(decision.pipeline, fixture.acceptance.pipeline, `Case "${fixture.id}" pipeline mismatch`);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
test("router golden fixtures remain deterministic", async () => {
|
|
63
|
+
const { path, fixtures } = await loadFixtures();
|
|
64
|
+
const router = new ReasoningRouter();
|
|
65
|
+
const refreshedCases = fixtures.cases.map((fixture) => ({
|
|
66
|
+
...fixture,
|
|
67
|
+
golden: normalizeDecision(router.route(fixture.input)),
|
|
68
|
+
}));
|
|
69
|
+
if (UPDATE_REQUESTED) {
|
|
70
|
+
const updated = {
|
|
71
|
+
...fixtures,
|
|
72
|
+
cases: refreshedCases,
|
|
73
|
+
};
|
|
74
|
+
await writeFile(path, `${JSON.stringify(updated, null, 2)}\n`, "utf8");
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const missingGolden = fixtures.cases.filter((fixture) => fixture.golden == null);
|
|
78
|
+
assert.equal(missingGolden.length, 0, `Missing golden snapshots for: ${missingGolden.map((fixture) => fixture.id).join(", ")}. Run ${fixtures.updateWorkflow.command}`);
|
|
79
|
+
for (const fixture of fixtures.cases) {
|
|
80
|
+
const actual = normalizeDecision(router.route(fixture.input));
|
|
81
|
+
assert.deepEqual(actual, fixture.golden, `Golden mismatch for "${fixture.id}". Refresh with ${fixtures.updateWorkflow.command}`);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=router.golden.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.golden.test.js","sourceRoot":"","sources":["../src/router.golden.test.ts"],"names":[],"mappings":"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"}
|
package/dist/router.js
ADDED
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
const DEFAULT_SIGNAL_WEIGHTS = {
|
|
2
|
+
code_presence: 1.4,
|
|
3
|
+
tradeoff_language: 1.1,
|
|
4
|
+
decomposition_signal: 1.3,
|
|
5
|
+
implementation_intent: 1.5,
|
|
6
|
+
debugging_intent: 1.4,
|
|
7
|
+
refactor_intent: 1.2,
|
|
8
|
+
testing_intent: 1.1,
|
|
9
|
+
planning_intent: 1.0,
|
|
10
|
+
scope_breadth: 1.2,
|
|
11
|
+
uncertainty: 0.8,
|
|
12
|
+
};
|
|
13
|
+
const SIGNAL_TO_STAGE_MATRIX = {
|
|
14
|
+
code_presence: { default: 0.15, dialectical: 0.05, recursive: 0.35, autocode: 1.0 },
|
|
15
|
+
tradeoff_language: { default: 0.2, dialectical: 1.0, recursive: 0.35, autocode: 0.15 },
|
|
16
|
+
decomposition_signal: { default: 0.2, dialectical: 0.4, recursive: 1.0, autocode: 0.55 },
|
|
17
|
+
implementation_intent: { default: 0.35, dialectical: 0.15, recursive: 0.45, autocode: 1.0 },
|
|
18
|
+
debugging_intent: { default: 0.2, dialectical: 0.2, recursive: 0.6, autocode: 1.0 },
|
|
19
|
+
refactor_intent: { default: 0.3, dialectical: 0.3, recursive: 0.55, autocode: 0.85 },
|
|
20
|
+
testing_intent: { default: 0.35, dialectical: 0.25, recursive: 0.5, autocode: 0.85 },
|
|
21
|
+
planning_intent: { default: 0.45, dialectical: 0.8, recursive: 0.65, autocode: 0.3 },
|
|
22
|
+
scope_breadth: { default: 0.2, dialectical: 0.35, recursive: 1.0, autocode: 0.45 },
|
|
23
|
+
uncertainty: { default: 0.1, dialectical: 0.9, recursive: 0.3, autocode: 0.05 },
|
|
24
|
+
};
|
|
25
|
+
const BASE_STAGE_SCORES = {
|
|
26
|
+
default: 0.35,
|
|
27
|
+
dialectical: 0.2,
|
|
28
|
+
recursive: 0.2,
|
|
29
|
+
autocode: 0.2,
|
|
30
|
+
};
|
|
31
|
+
const PATTERNS = {
|
|
32
|
+
code_presence: [
|
|
33
|
+
/```[\s\S]*?```/gi,
|
|
34
|
+
/\b(?:function|class|interface|type|const|let|var|import|export)\b/gi,
|
|
35
|
+
/\b(?:def|return|await|async|public|private|=>)\b/gi,
|
|
36
|
+
],
|
|
37
|
+
tradeoff_language: [
|
|
38
|
+
/\b(?:trade[ -]?off|pros?\b|cons?\b|advantage|disadvantage|versus|vs\.?|compare|alternative|constraint|risk)\b/gi,
|
|
39
|
+
],
|
|
40
|
+
decomposition_signal: [
|
|
41
|
+
/\b(?:step[- ]by[- ]step|break down|decompose|phases?|sub-?tasks?|milestones?|roadmap|sequence)\b/gi,
|
|
42
|
+
],
|
|
43
|
+
implementation_intent: [
|
|
44
|
+
/\b(?:implement|build|write|create|generate|ship|deliver|code|patch)\b/gi,
|
|
45
|
+
],
|
|
46
|
+
debugging_intent: [
|
|
47
|
+
/\b(?:debug|bug|fix|failing|failure|broken|stack trace|exception|error|regression)\b/gi,
|
|
48
|
+
],
|
|
49
|
+
refactor_intent: [
|
|
50
|
+
/\b(?:refactor|cleanup|simplify|restructure|rename|tech debt|maintainability)\b/gi,
|
|
51
|
+
],
|
|
52
|
+
testing_intent: [
|
|
53
|
+
/\b(?:test|unit test|integration test|e2e|assert|verify|validation|coverage)\b/gi,
|
|
54
|
+
],
|
|
55
|
+
planning_intent: [
|
|
56
|
+
/\b(?:plan|strategy|approach|design|architecture|decide|prioritize|sequence)\b/gi,
|
|
57
|
+
],
|
|
58
|
+
uncertainty: [
|
|
59
|
+
/\b(?:not sure|unsure|uncertain|maybe|possibly|might|could be)\b/gi,
|
|
60
|
+
/\?/g,
|
|
61
|
+
],
|
|
62
|
+
};
|
|
63
|
+
function now() {
|
|
64
|
+
return new Date().toISOString();
|
|
65
|
+
}
|
|
66
|
+
function clamp(value, min, max) {
|
|
67
|
+
return Math.min(max, Math.max(min, value));
|
|
68
|
+
}
|
|
69
|
+
function round4(value) {
|
|
70
|
+
return Number(value.toFixed(4));
|
|
71
|
+
}
|
|
72
|
+
function normalize(input) {
|
|
73
|
+
return input.toLowerCase().replace(/\s+/g, " ").trim();
|
|
74
|
+
}
|
|
75
|
+
function collectEvidence(text, patterns, limit = 3) {
|
|
76
|
+
const snippets = new Set();
|
|
77
|
+
for (const pattern of patterns) {
|
|
78
|
+
pattern.lastIndex = 0;
|
|
79
|
+
let match = pattern.exec(text);
|
|
80
|
+
while (match && snippets.size < limit) {
|
|
81
|
+
const raw = (match[0] ?? "").trim().replace(/\s+/g, " ");
|
|
82
|
+
if (raw.length > 0) {
|
|
83
|
+
snippets.add(raw.slice(0, 80));
|
|
84
|
+
}
|
|
85
|
+
if (!pattern.global)
|
|
86
|
+
break;
|
|
87
|
+
match = pattern.exec(text);
|
|
88
|
+
}
|
|
89
|
+
if (snippets.size >= limit)
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
return [...snippets];
|
|
93
|
+
}
|
|
94
|
+
function computeScopeBreadthScore(normalized) {
|
|
95
|
+
const sentenceCount = normalized.split(/[.;\n]/g).filter((chunk) => chunk.trim().length > 0).length;
|
|
96
|
+
const conjunctionCount = (normalized.match(/\b(?:and|then|also|plus|after)\b/g) ?? []).length;
|
|
97
|
+
const listCount = (normalized.match(/\b\d+[).]\s*/g) ?? []).length;
|
|
98
|
+
const score = clamp((sentenceCount - 1) * 0.15 + conjunctionCount * 0.08 + listCount * 0.2, 0, 1);
|
|
99
|
+
const evidence = [];
|
|
100
|
+
if (sentenceCount >= 3)
|
|
101
|
+
evidence.push(`${sentenceCount} segmented clauses`);
|
|
102
|
+
if (conjunctionCount > 0)
|
|
103
|
+
evidence.push(`${conjunctionCount} sequencing conjunctions`);
|
|
104
|
+
if (listCount > 0)
|
|
105
|
+
evidence.push(`${listCount} ordered-list marker(s)`);
|
|
106
|
+
return { score: round4(score), evidence };
|
|
107
|
+
}
|
|
108
|
+
function buildSignal(kind, score, evidence, signalWeights) {
|
|
109
|
+
const weight = signalWeights[kind];
|
|
110
|
+
const normalizedScore = round4(clamp(score, 0, 1));
|
|
111
|
+
return {
|
|
112
|
+
name: kind,
|
|
113
|
+
kind,
|
|
114
|
+
matched: normalizedScore > 0,
|
|
115
|
+
detail: evidence[0],
|
|
116
|
+
score: normalizedScore,
|
|
117
|
+
weight,
|
|
118
|
+
weightedScore: round4(normalizedScore * weight),
|
|
119
|
+
evidence,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function stageSort(scores, allowAutocode, allowRecursive) {
|
|
123
|
+
const stagePriority = {
|
|
124
|
+
default: 0,
|
|
125
|
+
dialectical: 1,
|
|
126
|
+
recursive: 2,
|
|
127
|
+
autocode: 3,
|
|
128
|
+
};
|
|
129
|
+
const candidates = [
|
|
130
|
+
{ stage: "default", score: scores.default },
|
|
131
|
+
{ stage: "dialectical", score: scores.dialectical },
|
|
132
|
+
{ stage: "recursive", score: allowRecursive ? scores.recursive : -1 },
|
|
133
|
+
{ stage: "autocode", score: allowAutocode ? scores.autocode : -1 },
|
|
134
|
+
];
|
|
135
|
+
return candidates.sort((a, b) => {
|
|
136
|
+
if (b.score !== a.score)
|
|
137
|
+
return b.score - a.score;
|
|
138
|
+
return stagePriority[a.stage] - stagePriority[b.stage];
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
function buildPipeline(scores, allowAutocode, allowRecursive, confidenceThreshold) {
|
|
142
|
+
const sorted = stageSort(scores, allowAutocode, allowRecursive);
|
|
143
|
+
const top = sorted[0];
|
|
144
|
+
const second = sorted[1];
|
|
145
|
+
const composeThreshold = clamp(Math.max(confidenceThreshold, 0.45), 0.45, 0.98);
|
|
146
|
+
let primary = top.stage;
|
|
147
|
+
if (top.stage === "default" &&
|
|
148
|
+
second.stage !== "default" &&
|
|
149
|
+
second.score >= top.score * 0.9 &&
|
|
150
|
+
second.score >= composeThreshold * 0.7) {
|
|
151
|
+
primary = second.stage;
|
|
152
|
+
}
|
|
153
|
+
const pipeline = [primary];
|
|
154
|
+
const dialectical = scores.dialectical;
|
|
155
|
+
const recursive = allowRecursive ? scores.recursive : 0;
|
|
156
|
+
const autocode = allowAutocode ? scores.autocode : 0;
|
|
157
|
+
if (allowRecursive &&
|
|
158
|
+
dialectical >= composeThreshold &&
|
|
159
|
+
recursive >= composeThreshold &&
|
|
160
|
+
Math.abs(dialectical - recursive) <= composeThreshold * 0.2) {
|
|
161
|
+
pipeline.length = 0;
|
|
162
|
+
if (dialectical >= recursive) {
|
|
163
|
+
pipeline.push("dialectical", "recursive");
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
pipeline.push("recursive", "dialectical");
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
else if (allowRecursive &&
|
|
170
|
+
primary === "recursive" &&
|
|
171
|
+
dialectical >= composeThreshold &&
|
|
172
|
+
dialectical >= recursive * 0.8) {
|
|
173
|
+
pipeline.unshift("dialectical");
|
|
174
|
+
}
|
|
175
|
+
else if (allowRecursive &&
|
|
176
|
+
primary === "dialectical" &&
|
|
177
|
+
recursive >= composeThreshold &&
|
|
178
|
+
recursive >= dialectical * 0.8) {
|
|
179
|
+
pipeline.push("recursive");
|
|
180
|
+
}
|
|
181
|
+
const primaryScore = scores[pipeline[0] ?? "default"];
|
|
182
|
+
if (allowAutocode &&
|
|
183
|
+
autocode >= composeThreshold + 0.2 &&
|
|
184
|
+
autocode >= primaryScore * 1.02 &&
|
|
185
|
+
!pipeline.includes("autocode")) {
|
|
186
|
+
pipeline.push("autocode");
|
|
187
|
+
}
|
|
188
|
+
if (pipeline.length === 0) {
|
|
189
|
+
pipeline.push("default");
|
|
190
|
+
}
|
|
191
|
+
return pipeline;
|
|
192
|
+
}
|
|
193
|
+
function buildConfidence(sortedScores) {
|
|
194
|
+
const top = sortedScores[0]?.score ?? 0;
|
|
195
|
+
const second = sortedScores[1]?.score ?? 0;
|
|
196
|
+
const separation = top > 0 ? (top - second) / top : 0;
|
|
197
|
+
const intensity = top / (top + 1);
|
|
198
|
+
return round4(clamp(0.35 + intensity * 0.35 + separation * 0.3, 0, 1));
|
|
199
|
+
}
|
|
200
|
+
export class ReasoningRouter {
|
|
201
|
+
enableAutocode;
|
|
202
|
+
enableRecursive;
|
|
203
|
+
confidenceThreshold;
|
|
204
|
+
signalWeights;
|
|
205
|
+
constructor(config = {}) {
|
|
206
|
+
this.enableAutocode = config.enableAutocode ?? config.allowAutocodeByDefault ?? true;
|
|
207
|
+
this.enableRecursive = config.enableRecursive ?? config.allowRecursiveByDefault ?? true;
|
|
208
|
+
this.confidenceThreshold = clamp(config.confidenceThreshold ?? config.composeThreshold ?? 0.5, 0, 1);
|
|
209
|
+
this.signalWeights = { ...DEFAULT_SIGNAL_WEIGHTS };
|
|
210
|
+
const customWeights = config.signalWeights ?? {};
|
|
211
|
+
for (const kind of Object.keys(DEFAULT_SIGNAL_WEIGHTS)) {
|
|
212
|
+
const value = customWeights[kind];
|
|
213
|
+
if (typeof value === "number" && Number.isFinite(value) && value >= 0) {
|
|
214
|
+
this.signalWeights[kind] = value;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
route(input) {
|
|
219
|
+
const allowAutocode = input.allowAutocode ?? this.enableAutocode;
|
|
220
|
+
const allowRecursive = input.allowRecursive ?? this.enableRecursive;
|
|
221
|
+
const merged = `${input.prompt}\n${input.context ?? ""}`;
|
|
222
|
+
const normalized = normalize(merged);
|
|
223
|
+
const signals = [];
|
|
224
|
+
for (const kind of Object.keys(PATTERNS)) {
|
|
225
|
+
const evidence = collectEvidence(normalized, PATTERNS[kind], 3);
|
|
226
|
+
const score = clamp(evidence.length / 3, 0, 1);
|
|
227
|
+
signals.push(buildSignal(kind, score, evidence, this.signalWeights));
|
|
228
|
+
}
|
|
229
|
+
const scope = computeScopeBreadthScore(normalized);
|
|
230
|
+
signals.push(buildSignal("scope_breadth", scope.score, scope.evidence, this.signalWeights));
|
|
231
|
+
const scores = { ...BASE_STAGE_SCORES };
|
|
232
|
+
for (const signal of signals) {
|
|
233
|
+
const matrix = SIGNAL_TO_STAGE_MATRIX[signal.kind];
|
|
234
|
+
scores.default = round4(scores.default + signal.weightedScore * matrix.default);
|
|
235
|
+
scores.dialectical = round4(scores.dialectical + signal.weightedScore * matrix.dialectical);
|
|
236
|
+
scores.recursive = round4(scores.recursive + signal.weightedScore * matrix.recursive);
|
|
237
|
+
scores.autocode = round4(scores.autocode + signal.weightedScore * matrix.autocode);
|
|
238
|
+
}
|
|
239
|
+
if (!allowAutocode) {
|
|
240
|
+
scores.autocode = 0;
|
|
241
|
+
}
|
|
242
|
+
if (!allowRecursive) {
|
|
243
|
+
scores.recursive = 0;
|
|
244
|
+
}
|
|
245
|
+
const candidatePipeline = buildPipeline(scores, allowAutocode, allowRecursive, this.confidenceThreshold);
|
|
246
|
+
const sortedScores = stageSort(scores, allowAutocode, allowRecursive);
|
|
247
|
+
const confidence = buildConfidence(sortedScores);
|
|
248
|
+
const selectedCandidate = candidatePipeline[0] ?? "default";
|
|
249
|
+
const belowThreshold = selectedCandidate !== "default" && confidence < this.confidenceThreshold;
|
|
250
|
+
const pipeline = belowThreshold ? ["default"] : candidatePipeline;
|
|
251
|
+
const selectedMode = (pipeline[0] ?? "default");
|
|
252
|
+
const strongest = signals
|
|
253
|
+
.filter((signal) => signal.weightedScore > 0)
|
|
254
|
+
.sort((a, b) => b.weightedScore - a.weightedScore)
|
|
255
|
+
.slice(0, 4)
|
|
256
|
+
.map((signal) => `${signal.name}=${signal.weightedScore.toFixed(2)}`);
|
|
257
|
+
const rationale = strongest.length > 0
|
|
258
|
+
? `Top signals: ${strongest.join(", ")}${belowThreshold ? `; confidence ${confidence.toFixed(2)} below threshold ${this.confidenceThreshold.toFixed(2)}, default fallback applied.` : ""}`
|
|
259
|
+
: "No strong routing signals detected; defaulting to baseline mode.";
|
|
260
|
+
return {
|
|
261
|
+
selectedMode,
|
|
262
|
+
pipeline,
|
|
263
|
+
confidence,
|
|
264
|
+
scores,
|
|
265
|
+
signals,
|
|
266
|
+
rationale,
|
|
267
|
+
timestamp: now(),
|
|
268
|
+
escalationAllowed: true,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AA+BA,MAAM,sBAAsB,GAAsC;IAChE,aAAa,EAAE,GAAG;IAClB,iBAAiB,EAAE,GAAG;IACtB,oBAAoB,EAAE,GAAG;IACzB,qBAAqB,EAAE,GAAG;IAC1B,gBAAgB,EAAE,GAAG;IACrB,eAAe,EAAE,GAAG;IACpB,cAAc,EAAE,GAAG;IACnB,eAAe,EAAE,GAAG;IACpB,aAAa,EAAE,GAAG;IAClB,WAAW,EAAE,GAAG;CACjB,CAAC;AAEF,MAAM,sBAAsB,GAA2C;IACrE,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE;IACnF,iBAAiB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;IACtF,oBAAoB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE;IACxF,qBAAqB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE;IAC3F,gBAAgB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE;IACnF,eAAe,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;IACpF,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE;IACpF,eAAe,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE;IACpF,aAAa,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClF,WAAW,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE;CAChF,CAAC;AAEF,MAAM,iBAAiB,GAAgB;IACrC,OAAO,EAAE,IAAI;IACb,WAAW,EAAE,GAAG;IAChB,SAAS,EAAE,GAAG;IACd,QAAQ,EAAE,GAAG;CACd,CAAC;AAEF,MAAM,QAAQ,GAAwC;IACpD,aAAa,EAAE;QACb,kBAAkB;QAClB,qEAAqE;QACrE,oDAAoD;KACrD;IACD,iBAAiB,EAAE;QACjB,iHAAiH;KAClH;IACD,oBAAoB,EAAE;QACpB,oGAAoG;KACrG;IACD,qBAAqB,EAAE;QACrB,yEAAyE;KAC1E;IACD,gBAAgB,EAAE;QAChB,uFAAuF;KACxF;IACD,eAAe,EAAE;QACf,kFAAkF;KACnF;IACD,cAAc,EAAE;QACd,iFAAiF;KAClF;IACD,eAAe,EAAE;QACf,iFAAiF;KAClF;IACD,WAAW,EAAE;QACX,mEAAmE;QACnE,KAAK;KACN;CACF,CAAC;AAEF,SAAS,GAAG;IACV,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IACpD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACzD,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,QAA2B,EAAE,KAAK,GAAG,CAAC;IAC3E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;QACtB,IAAI,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,KAAK,IAAI,QAAQ,CAAC,IAAI,GAAG,KAAK,EAAE,CAAC;YACtC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACzD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnB,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACjC,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,MAAM;YAC3B,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,IAAI,KAAK;YAAE,MAAM;IACpC,CAAC;IACD,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,wBAAwB,CAAC,UAAkB;IAClD,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IACpG,MAAM,gBAAgB,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,mCAAmC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAC9F,MAAM,SAAS,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IACnE,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,gBAAgB,GAAG,IAAI,GAAG,SAAS,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAElG,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,aAAa,IAAI,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,aAAa,oBAAoB,CAAC,CAAC;IAC5E,IAAI,gBAAgB,GAAG,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,gBAAgB,0BAA0B,CAAC,CAAC;IACvF,IAAI,SAAS,GAAG,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,yBAAyB,CAAC,CAAC;IACxE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;AAC5C,CAAC;AAED,SAAS,WAAW,CAClB,IAAuB,EACvB,KAAa,EACb,QAAkB,EAClB,aAA0D;IAE1D,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnD,OAAO;QACL,IAAI,EAAE,IAAI;QACV,IAAI;QACJ,OAAO,EAAE,eAAe,GAAG,CAAC;QAC5B,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;QACnB,KAAK,EAAE,eAAe;QACtB,MAAM;QACN,aAAa,EAAE,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC;QAC/C,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAChB,MAAmB,EACnB,aAAsB,EACtB,cAAuB;IAEvB,MAAM,aAAa,GAAmC;QACpD,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,CAAC;QACZ,QAAQ,EAAE,CAAC;KACZ,CAAC;IAEF,MAAM,UAAU,GAAoD;QAClE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE;QAC3C,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE;QACnD,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;QACrE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;KACnE,CAAC;IAEF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC9B,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK;YAAE,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;QAClD,OAAO,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CACpB,MAAmB,EACnB,aAAsB,EACtB,cAAuB,EACvB,mBAA2B;IAE3B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;IACvB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;IAC1B,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAEhF,IAAI,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC;IACxB,IACE,GAAG,CAAC,KAAK,KAAK,SAAS;QACvB,MAAM,CAAC,KAAK,KAAK,SAAS;QAC1B,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,GAAG,GAAG;QAC/B,MAAM,CAAC,KAAK,IAAI,gBAAgB,GAAG,GAAG,EACtC,CAAC;QACD,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;IACzB,CAAC;IAED,MAAM,QAAQ,GAAqB,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IACvC,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAErD,IACE,cAAc;QACd,WAAW,IAAI,gBAAgB;QAC/B,SAAS,IAAI,gBAAgB;QAC7B,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC,IAAI,gBAAgB,GAAG,GAAG,EAC3D,CAAC;QACD,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACpB,IAAI,WAAW,IAAI,SAAS,EAAE,CAAC;YAC7B,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;SAAM,IACL,cAAc;QACd,OAAO,KAAK,WAAW;QACvB,WAAW,IAAI,gBAAgB;QAC/B,WAAW,IAAI,SAAS,GAAG,GAAG,EAC9B,CAAC;QACD,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAClC,CAAC;SAAM,IACL,cAAc;QACd,OAAO,KAAK,aAAa;QACzB,SAAS,IAAI,gBAAgB;QAC7B,SAAS,IAAI,WAAW,GAAG,GAAG,EAC9B,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC;IACtD,IACE,aAAa;QACb,QAAQ,IAAI,gBAAgB,GAAG,GAAG;QAClC,QAAQ,IAAI,YAAY,GAAG,IAAI;QAC/B,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAC9B,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,eAAe,CAAC,YAA6D;IACpF,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,SAAS,GAAG,IAAI,GAAG,UAAU,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,OAAO,eAAe;IACT,cAAc,CAAU;IACxB,eAAe,CAAU;IACzB,mBAAmB,CAAS;IAC5B,aAAa,CAAoC;IAElE,YAAY,SAAuB,EAAE;QACnC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,sBAAsB,IAAI,IAAI,CAAC;QACrF,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,uBAAuB,IAAI,IAAI,CAAC;QACxF,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAC9B,MAAM,CAAC,mBAAmB,IAAI,MAAM,CAAC,gBAAgB,IAAI,GAAG,EAC5D,CAAC,EACD,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,sBAAsB,EAAE,CAAC;QACnD,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC;QACjD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAwB,EAAE,CAAC;YAC9E,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBACtE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAiB;QACrB,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,cAAc,CAAC;QACjE,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,IAAI,IAAI,CAAC,eAAe,CAAC;QACpE,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QACzD,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAErC,MAAM,OAAO,GAAoB,EAAE,CAAC;QACpC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAwB,EAAE,CAAC;YAChE,MAAM,QAAQ,GAAG,eAAe,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAChE,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,KAAK,GAAG,wBAAwB,CAAC,UAAU,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QAE5F,MAAM,MAAM,GAAgB,EAAE,GAAG,iBAAiB,EAAE,CAAC;QACrD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACnD,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;YAChF,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;YAC5F,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;YACtF,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrF,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;QACvB,CAAC;QAED,MAAM,iBAAiB,GAAG,aAAa,CACrC,MAAM,EACN,aAAa,EACb,cAAc,EACd,IAAI,CAAC,mBAAmB,CACzB,CAAC;QACF,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;QACtE,MAAM,UAAU,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;QAEjD,MAAM,iBAAiB,GAAmB,iBAAiB,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;QAC5E,MAAM,cAAc,GAAG,iBAAiB,KAAK,SAAS,IAAI,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC;QAChG,MAAM,QAAQ,GAAqB,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC;QACpF,MAAM,YAAY,GAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,SAAS,CAAY,CAAC;QAEpE,MAAM,SAAS,GAAG,OAAO;aACtB,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC;aAC5C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC;aACjD,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;aACX,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAExE,MAAM,SAAS,GACb,SAAS,CAAC,MAAM,GAAG,CAAC;YAClB,CAAC,CAAC,gBAAgB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,gBAAgB,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,EAAE;YAC1L,CAAC,CAAC,kEAAkE,CAAC;QAEzE,OAAO;YACL,YAAY;YACZ,QAAQ;YACR,UAAU;YACV,MAAM;YACN,OAAO;YACP,SAAS;YACT,SAAS,EAAE,GAAG,EAAE;YAChB,iBAAiB,EAAE,IAAI;SACxB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.test.d.ts","sourceRoot":"","sources":["../src/router.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { ReasoningRouter } from "./router.js";
|
|
4
|
+
test("router scoring is deterministic for identical input (excluding timestamp)", () => {
|
|
5
|
+
const router = new ReasoningRouter();
|
|
6
|
+
const input = {
|
|
7
|
+
prompt: "Implement a TypeScript function for request signing, include tests, and fix failing auth regression.",
|
|
8
|
+
context: "Current build is red and stack trace points to auth middleware.",
|
|
9
|
+
allowAutocode: true,
|
|
10
|
+
};
|
|
11
|
+
const first = router.route(input);
|
|
12
|
+
const second = router.route(input);
|
|
13
|
+
assert.equal(typeof first.timestamp, "string");
|
|
14
|
+
assert.equal(typeof second.timestamp, "string");
|
|
15
|
+
assert.equal(first.selectedMode, second.selectedMode);
|
|
16
|
+
assert.deepStrictEqual(first.pipeline, second.pipeline);
|
|
17
|
+
assert.equal(first.confidence, second.confidence);
|
|
18
|
+
assert.deepStrictEqual(first.scores, second.scores);
|
|
19
|
+
assert.deepStrictEqual(first.signals, second.signals);
|
|
20
|
+
assert.equal(first.rationale, second.rationale);
|
|
21
|
+
});
|
|
22
|
+
test("router maps acceptance prompts to expected selected mode", () => {
|
|
23
|
+
const router = new ReasoningRouter();
|
|
24
|
+
const defaultDecision = router.route({
|
|
25
|
+
prompt: "explain what a closure is",
|
|
26
|
+
});
|
|
27
|
+
const autocodeDecision = router.route({
|
|
28
|
+
prompt: "implement a Redis cache layer with TTL support and write tests",
|
|
29
|
+
});
|
|
30
|
+
const dialecticalDecision = router.route({
|
|
31
|
+
prompt: "should we use PostgreSQL or MongoDB? Consider consistency and scalability",
|
|
32
|
+
});
|
|
33
|
+
const recursiveDecision = router.route({
|
|
34
|
+
prompt: "Build a complete auth system: 1) OAuth 2) Session mgmt 3) RBAC 4) Audit logging",
|
|
35
|
+
});
|
|
36
|
+
assert.equal(defaultDecision.selectedMode, "default");
|
|
37
|
+
assert.equal(autocodeDecision.selectedMode, "autocode");
|
|
38
|
+
assert.equal(dialecticalDecision.selectedMode, "dialectical");
|
|
39
|
+
assert.equal(recursiveDecision.selectedMode, "recursive");
|
|
40
|
+
});
|
|
41
|
+
test("router can compose dialectical+recursive pipeline for mixed prompts", () => {
|
|
42
|
+
const router = new ReasoningRouter();
|
|
43
|
+
const decision = router.route({
|
|
44
|
+
prompt: "Compare migration tradeoffs, then break rollout into phased subtasks with sequencing and risks.",
|
|
45
|
+
allowAutocode: false,
|
|
46
|
+
});
|
|
47
|
+
assert.equal(decision.pipeline.includes("dialectical"), true);
|
|
48
|
+
assert.equal(decision.pipeline.includes("recursive"), true);
|
|
49
|
+
});
|
|
50
|
+
test("router config supports SHA-1764 names and legacy aliases", () => {
|
|
51
|
+
const modernConfigRouter = new ReasoningRouter({
|
|
52
|
+
enableAutocode: false,
|
|
53
|
+
confidenceThreshold: 0.2,
|
|
54
|
+
signalWeights: { implementation_intent: 3.0 },
|
|
55
|
+
});
|
|
56
|
+
const legacyConfigRouter = new ReasoningRouter({
|
|
57
|
+
allowAutocodeByDefault: false,
|
|
58
|
+
composeThreshold: 0.2,
|
|
59
|
+
});
|
|
60
|
+
const modernDecision = modernConfigRouter.route({
|
|
61
|
+
prompt: "Implement and patch this bug with tests.",
|
|
62
|
+
});
|
|
63
|
+
const legacyDecision = legacyConfigRouter.route({
|
|
64
|
+
prompt: "Implement and patch this bug with tests.",
|
|
65
|
+
});
|
|
66
|
+
assert.equal(modernDecision.selectedMode === "autocode", false);
|
|
67
|
+
assert.equal(legacyDecision.selectedMode === "autocode", false);
|
|
68
|
+
});
|
|
69
|
+
test("router falls back to default when confidence is below threshold", () => {
|
|
70
|
+
const router = new ReasoningRouter({ confidenceThreshold: 0.99 });
|
|
71
|
+
const decision = router.route({
|
|
72
|
+
prompt: "Compare pros and cons of two deployment options.",
|
|
73
|
+
});
|
|
74
|
+
assert.equal(decision.selectedMode, "default");
|
|
75
|
+
assert.deepStrictEqual(decision.pipeline, ["default"]);
|
|
76
|
+
});
|
|
77
|
+
test("router can explicitly disable recursive stage eligibility", () => {
|
|
78
|
+
const router = new ReasoningRouter();
|
|
79
|
+
const decision = router.route({
|
|
80
|
+
prompt: "Break this system into milestones and phased subtasks with rollout sequence.",
|
|
81
|
+
allowRecursive: false,
|
|
82
|
+
});
|
|
83
|
+
assert.equal(decision.pipeline.includes("recursive"), false);
|
|
84
|
+
assert.equal(decision.selectedMode === "recursive", false);
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=router.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.test.js","sourceRoot":"","sources":["../src/router.test.ts"],"names":[],"mappings":"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"}
|