@yuaone/core 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/LICENSE +663 -0
- package/README.md +15 -0
- package/dist/__tests__/context-manager.test.d.ts +6 -0
- package/dist/__tests__/context-manager.test.d.ts.map +1 -0
- package/dist/__tests__/context-manager.test.js +220 -0
- package/dist/__tests__/context-manager.test.js.map +1 -0
- package/dist/__tests__/governor.test.d.ts +6 -0
- package/dist/__tests__/governor.test.d.ts.map +1 -0
- package/dist/__tests__/governor.test.js +210 -0
- package/dist/__tests__/governor.test.js.map +1 -0
- package/dist/__tests__/model-router.test.d.ts +6 -0
- package/dist/__tests__/model-router.test.d.ts.map +1 -0
- package/dist/__tests__/model-router.test.js +329 -0
- package/dist/__tests__/model-router.test.js.map +1 -0
- package/dist/agent-logger.d.ts +384 -0
- package/dist/agent-logger.d.ts.map +1 -0
- package/dist/agent-logger.js +820 -0
- package/dist/agent-logger.js.map +1 -0
- package/dist/agent-loop.d.ts +163 -0
- package/dist/agent-loop.d.ts.map +1 -0
- package/dist/agent-loop.js +609 -0
- package/dist/agent-loop.js.map +1 -0
- package/dist/agent-modes.d.ts +85 -0
- package/dist/agent-modes.d.ts.map +1 -0
- package/dist/agent-modes.js +418 -0
- package/dist/agent-modes.js.map +1 -0
- package/dist/approval.d.ts +137 -0
- package/dist/approval.d.ts.map +1 -0
- package/dist/approval.js +299 -0
- package/dist/approval.js.map +1 -0
- package/dist/async-completion-queue.d.ts +56 -0
- package/dist/async-completion-queue.d.ts.map +1 -0
- package/dist/async-completion-queue.js +77 -0
- package/dist/async-completion-queue.js.map +1 -0
- package/dist/auto-fix.d.ts +174 -0
- package/dist/auto-fix.d.ts.map +1 -0
- package/dist/auto-fix.js +319 -0
- package/dist/auto-fix.js.map +1 -0
- package/dist/codebase-context.d.ts +396 -0
- package/dist/codebase-context.d.ts.map +1 -0
- package/dist/codebase-context.js +1260 -0
- package/dist/codebase-context.js.map +1 -0
- package/dist/conflict-resolver.d.ts +191 -0
- package/dist/conflict-resolver.d.ts.map +1 -0
- package/dist/conflict-resolver.js +524 -0
- package/dist/conflict-resolver.js.map +1 -0
- package/dist/constants.d.ts +52 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +141 -0
- package/dist/constants.js.map +1 -0
- package/dist/context-budget.d.ts +435 -0
- package/dist/context-budget.d.ts.map +1 -0
- package/dist/context-budget.js +903 -0
- package/dist/context-budget.js.map +1 -0
- package/dist/context-compressor.d.ts +143 -0
- package/dist/context-compressor.d.ts.map +1 -0
- package/dist/context-compressor.js +511 -0
- package/dist/context-compressor.js.map +1 -0
- package/dist/context-manager.d.ts +112 -0
- package/dist/context-manager.d.ts.map +1 -0
- package/dist/context-manager.js +247 -0
- package/dist/context-manager.js.map +1 -0
- package/dist/continuous-reflection.d.ts +267 -0
- package/dist/continuous-reflection.d.ts.map +1 -0
- package/dist/continuous-reflection.js +338 -0
- package/dist/continuous-reflection.js.map +1 -0
- package/dist/cross-file-refactor.d.ts +352 -0
- package/dist/cross-file-refactor.d.ts.map +1 -0
- package/dist/cross-file-refactor.js +1544 -0
- package/dist/cross-file-refactor.js.map +1 -0
- package/dist/dag-orchestrator.d.ts +138 -0
- package/dist/dag-orchestrator.d.ts.map +1 -0
- package/dist/dag-orchestrator.js +379 -0
- package/dist/dag-orchestrator.js.map +1 -0
- package/dist/debate-orchestrator.d.ts +301 -0
- package/dist/debate-orchestrator.d.ts.map +1 -0
- package/dist/debate-orchestrator.js +719 -0
- package/dist/debate-orchestrator.js.map +1 -0
- package/dist/dependency-analyzer.d.ts +113 -0
- package/dist/dependency-analyzer.d.ts.map +1 -0
- package/dist/dependency-analyzer.js +444 -0
- package/dist/dependency-analyzer.js.map +1 -0
- package/dist/design-loop.d.ts +59 -0
- package/dist/design-loop.d.ts.map +1 -0
- package/dist/design-loop.js +344 -0
- package/dist/design-loop.js.map +1 -0
- package/dist/doc-intelligence.d.ts +383 -0
- package/dist/doc-intelligence.d.ts.map +1 -0
- package/dist/doc-intelligence.js +1307 -0
- package/dist/doc-intelligence.js.map +1 -0
- package/dist/dynamic-role-generator.d.ts +76 -0
- package/dist/dynamic-role-generator.d.ts.map +1 -0
- package/dist/dynamic-role-generator.js +194 -0
- package/dist/dynamic-role-generator.js.map +1 -0
- package/dist/errors.d.ts +69 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +102 -0
- package/dist/errors.js.map +1 -0
- package/dist/event-bus.d.ts +159 -0
- package/dist/event-bus.d.ts.map +1 -0
- package/dist/event-bus.js +305 -0
- package/dist/event-bus.js.map +1 -0
- package/dist/execution-engine.d.ts +425 -0
- package/dist/execution-engine.d.ts.map +1 -0
- package/dist/execution-engine.js +1555 -0
- package/dist/execution-engine.js.map +1 -0
- package/dist/git-intelligence.d.ts +306 -0
- package/dist/git-intelligence.d.ts.map +1 -0
- package/dist/git-intelligence.js +1099 -0
- package/dist/git-intelligence.js.map +1 -0
- package/dist/governor.d.ts +77 -0
- package/dist/governor.d.ts.map +1 -0
- package/dist/governor.js +161 -0
- package/dist/governor.js.map +1 -0
- package/dist/hierarchical-planner.d.ts +313 -0
- package/dist/hierarchical-planner.d.ts.map +1 -0
- package/dist/hierarchical-planner.js +981 -0
- package/dist/hierarchical-planner.js.map +1 -0
- package/dist/index.d.ts +121 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +123 -0
- package/dist/index.js.map +1 -0
- package/dist/intent-inference.d.ts +103 -0
- package/dist/intent-inference.d.ts.map +1 -0
- package/dist/intent-inference.js +605 -0
- package/dist/intent-inference.js.map +1 -0
- package/dist/interrupt-manager.d.ts +143 -0
- package/dist/interrupt-manager.d.ts.map +1 -0
- package/dist/interrupt-manager.js +196 -0
- package/dist/interrupt-manager.js.map +1 -0
- package/dist/kernel.d.ts +564 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +1419 -0
- package/dist/kernel.js.map +1 -0
- package/dist/language-support.d.ts +232 -0
- package/dist/language-support.d.ts.map +1 -0
- package/dist/language-support.js +1134 -0
- package/dist/language-support.js.map +1 -0
- package/dist/llm-client.d.ts +82 -0
- package/dist/llm-client.d.ts.map +1 -0
- package/dist/llm-client.js +475 -0
- package/dist/llm-client.js.map +1 -0
- package/dist/mcp-client.d.ts +232 -0
- package/dist/mcp-client.d.ts.map +1 -0
- package/dist/mcp-client.js +718 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/memory-manager.d.ts +200 -0
- package/dist/memory-manager.d.ts.map +1 -0
- package/dist/memory-manager.js +568 -0
- package/dist/memory-manager.js.map +1 -0
- package/dist/memory.d.ts +87 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +341 -0
- package/dist/memory.js.map +1 -0
- package/dist/model-router.d.ts +245 -0
- package/dist/model-router.d.ts.map +1 -0
- package/dist/model-router.js +632 -0
- package/dist/model-router.js.map +1 -0
- package/dist/parallel-executor.d.ts +125 -0
- package/dist/parallel-executor.d.ts.map +1 -0
- package/dist/parallel-executor.js +201 -0
- package/dist/parallel-executor.js.map +1 -0
- package/dist/perf-optimizer.d.ts +212 -0
- package/dist/perf-optimizer.d.ts.map +1 -0
- package/dist/perf-optimizer.js +721 -0
- package/dist/perf-optimizer.js.map +1 -0
- package/dist/persona.d.ts +305 -0
- package/dist/persona.d.ts.map +1 -0
- package/dist/persona.js +887 -0
- package/dist/persona.js.map +1 -0
- package/dist/planner.d.ts +70 -0
- package/dist/planner.d.ts.map +1 -0
- package/dist/planner.js +264 -0
- package/dist/planner.js.map +1 -0
- package/dist/qa-pipeline.d.ts +365 -0
- package/dist/qa-pipeline.d.ts.map +1 -0
- package/dist/qa-pipeline.js +1352 -0
- package/dist/qa-pipeline.js.map +1 -0
- package/dist/reasoning-adapter.d.ts +116 -0
- package/dist/reasoning-adapter.d.ts.map +1 -0
- package/dist/reasoning-adapter.js +187 -0
- package/dist/reasoning-adapter.js.map +1 -0
- package/dist/role-registry.d.ts +55 -0
- package/dist/role-registry.d.ts.map +1 -0
- package/dist/role-registry.js +192 -0
- package/dist/role-registry.js.map +1 -0
- package/dist/sandbox-tiers.d.ts +327 -0
- package/dist/sandbox-tiers.d.ts.map +1 -0
- package/dist/sandbox-tiers.js +928 -0
- package/dist/sandbox-tiers.js.map +1 -0
- package/dist/security-scanner.d.ts +222 -0
- package/dist/security-scanner.d.ts.map +1 -0
- package/dist/security-scanner.js +1129 -0
- package/dist/security-scanner.js.map +1 -0
- package/dist/security.d.ts +93 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +393 -0
- package/dist/security.js.map +1 -0
- package/dist/self-reflection.d.ts +397 -0
- package/dist/self-reflection.d.ts.map +1 -0
- package/dist/self-reflection.js +908 -0
- package/dist/self-reflection.js.map +1 -0
- package/dist/session-persistence.d.ts +191 -0
- package/dist/session-persistence.d.ts.map +1 -0
- package/dist/session-persistence.js +395 -0
- package/dist/session-persistence.js.map +1 -0
- package/dist/speculative-executor.d.ts +210 -0
- package/dist/speculative-executor.d.ts.map +1 -0
- package/dist/speculative-executor.js +618 -0
- package/dist/speculative-executor.js.map +1 -0
- package/dist/state-machine.d.ts +289 -0
- package/dist/state-machine.d.ts.map +1 -0
- package/dist/state-machine.js +695 -0
- package/dist/state-machine.js.map +1 -0
- package/dist/sub-agent.d.ts +177 -0
- package/dist/sub-agent.d.ts.map +1 -0
- package/dist/sub-agent.js +303 -0
- package/dist/sub-agent.js.map +1 -0
- package/dist/system-prompt.d.ts +26 -0
- package/dist/system-prompt.d.ts.map +1 -0
- package/dist/system-prompt.js +84 -0
- package/dist/system-prompt.js.map +1 -0
- package/dist/test-intelligence.d.ts +439 -0
- package/dist/test-intelligence.d.ts.map +1 -0
- package/dist/test-intelligence.js +1165 -0
- package/dist/test-intelligence.js.map +1 -0
- package/dist/types.d.ts +632 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/vector-index.d.ts +314 -0
- package/dist/vector-index.d.ts.map +1 -0
- package/dist/vector-index.js +618 -0
- package/dist/vector-index.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-manager.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/context-manager.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module context-manager.test
|
|
3
|
+
* @description ContextManager unit tests (~10+ cases).
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it } from "node:test";
|
|
6
|
+
import assert from "node:assert/strict";
|
|
7
|
+
import { ContextManager } from "../context-manager.js";
|
|
8
|
+
import { ContextOverflowError } from "../errors.js";
|
|
9
|
+
// ─── Helpers ───
|
|
10
|
+
function makeManager(overrides = {}) {
|
|
11
|
+
return new ContextManager({
|
|
12
|
+
maxContextTokens: 100_000,
|
|
13
|
+
outputReserveTokens: 4096,
|
|
14
|
+
...overrides,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
function makeMessage(role, content, tool_calls) {
|
|
18
|
+
return { role, content, tool_calls };
|
|
19
|
+
}
|
|
20
|
+
function makeSystemMessage(content) {
|
|
21
|
+
return makeMessage("system", content);
|
|
22
|
+
}
|
|
23
|
+
function makeUserMessage(content) {
|
|
24
|
+
return makeMessage("user", content);
|
|
25
|
+
}
|
|
26
|
+
function makeAssistantMessage(content) {
|
|
27
|
+
return makeMessage("assistant", content);
|
|
28
|
+
}
|
|
29
|
+
function makeToolMessage(content, toolCallId = "tc_1") {
|
|
30
|
+
return { role: "tool", content, tool_call_id: toolCallId };
|
|
31
|
+
}
|
|
32
|
+
// ─── Tests ───
|
|
33
|
+
describe("ContextManager", () => {
|
|
34
|
+
// === 1. Empty context ===
|
|
35
|
+
it("returns empty array when no messages added", () => {
|
|
36
|
+
const cm = makeManager();
|
|
37
|
+
assert.equal(cm.getMessages().length, 0);
|
|
38
|
+
assert.equal(cm.messageCount, 0);
|
|
39
|
+
});
|
|
40
|
+
// === 2. Under limit — all messages kept ===
|
|
41
|
+
it("keeps all messages when under token limit", () => {
|
|
42
|
+
const cm = makeManager();
|
|
43
|
+
cm.addMessage(makeSystemMessage("You are a helpful assistant."));
|
|
44
|
+
cm.addMessage(makeUserMessage("Hello"));
|
|
45
|
+
cm.addMessage(makeAssistantMessage("Hi there!"));
|
|
46
|
+
const prepared = cm.prepareForLLM();
|
|
47
|
+
assert.equal(prepared.length, 3);
|
|
48
|
+
assert.equal(prepared[0].role, "system");
|
|
49
|
+
assert.equal(prepared[1].role, "user");
|
|
50
|
+
assert.equal(prepared[2].role, "assistant");
|
|
51
|
+
});
|
|
52
|
+
// === 3. Over limit — old messages evicted ===
|
|
53
|
+
it("compacts history when over token limit", () => {
|
|
54
|
+
// Limit large enough for compacted output but smaller than full history
|
|
55
|
+
const cm = makeManager({
|
|
56
|
+
maxContextTokens: 500,
|
|
57
|
+
outputReserveTokens: 50,
|
|
58
|
+
compaction: { recentWindow: 2, summaryWindow: 2 },
|
|
59
|
+
});
|
|
60
|
+
cm.addMessage(makeSystemMessage("System prompt."));
|
|
61
|
+
// Add many messages to exceed budget
|
|
62
|
+
for (let i = 0; i < 20; i++) {
|
|
63
|
+
cm.addMessage(makeUserMessage(`User message ${i}: ${"x".repeat(20)}`));
|
|
64
|
+
cm.addMessage(makeAssistantMessage(`Response ${i}: ${"y".repeat(20)}`));
|
|
65
|
+
}
|
|
66
|
+
const prepared = cm.prepareForLLM();
|
|
67
|
+
// After compaction, should have fewer messages
|
|
68
|
+
assert.ok(prepared.length < 41, `Expected compacted messages (${prepared.length}) < original (41)`);
|
|
69
|
+
// System prompt should always be preserved
|
|
70
|
+
assert.ok(prepared.some((m) => m.role === "system"), "System message should be preserved");
|
|
71
|
+
});
|
|
72
|
+
// === 4. Tool result compression ===
|
|
73
|
+
it("compresses tool results that exceed size limit", () => {
|
|
74
|
+
const cm = makeManager();
|
|
75
|
+
const longResult = "x".repeat(200_000);
|
|
76
|
+
const compressed = cm.compressToolResult("file_read", longResult);
|
|
77
|
+
// file_read limit is 50_000 (from constants)
|
|
78
|
+
assert.ok(compressed.length < longResult.length, "Compressed result should be shorter");
|
|
79
|
+
assert.ok(compressed.includes("truncated"), "Should contain truncation marker");
|
|
80
|
+
});
|
|
81
|
+
it("does not compress tool results within limit", () => {
|
|
82
|
+
const cm = makeManager();
|
|
83
|
+
const shortResult = "Hello, world!";
|
|
84
|
+
const compressed = cm.compressToolResult("file_read", shortResult);
|
|
85
|
+
assert.equal(compressed, shortResult);
|
|
86
|
+
});
|
|
87
|
+
// === 5. System prompt always kept ===
|
|
88
|
+
it("preserves system messages during compaction", () => {
|
|
89
|
+
const cm = makeManager({
|
|
90
|
+
maxContextTokens: 300,
|
|
91
|
+
outputReserveTokens: 50,
|
|
92
|
+
compaction: { recentWindow: 2, summaryWindow: 2 },
|
|
93
|
+
});
|
|
94
|
+
cm.addMessage(makeSystemMessage("Important system instructions."));
|
|
95
|
+
for (let i = 0; i < 30; i++) {
|
|
96
|
+
cm.addMessage(makeUserMessage(`msg ${i} ${"a".repeat(30)}`));
|
|
97
|
+
cm.addMessage(makeAssistantMessage(`reply ${i} ${"b".repeat(30)}`));
|
|
98
|
+
}
|
|
99
|
+
const prepared = cm.prepareForLLM();
|
|
100
|
+
const systemMsgs = prepared.filter((m) => m.role === "system");
|
|
101
|
+
assert.ok(systemMsgs.length >= 1, "At least one system message should be preserved");
|
|
102
|
+
});
|
|
103
|
+
// === 6. Token estimation ===
|
|
104
|
+
it("estimates token count for messages", () => {
|
|
105
|
+
const cm = makeManager();
|
|
106
|
+
const messages = [
|
|
107
|
+
makeSystemMessage("You are a helpful assistant."),
|
|
108
|
+
makeUserMessage("Hello, how are you?"),
|
|
109
|
+
];
|
|
110
|
+
const tokens = cm.estimateTokens(messages);
|
|
111
|
+
assert.ok(tokens > 0, "Token count should be positive");
|
|
112
|
+
// Rough check: ~30 chars of English / 4 + overhead
|
|
113
|
+
assert.ok(tokens > 10, "Should estimate at least 10 tokens");
|
|
114
|
+
assert.ok(tokens < 200, "Should not overestimate wildly");
|
|
115
|
+
});
|
|
116
|
+
it("estimates higher token count for CJK text", () => {
|
|
117
|
+
const cm = makeManager();
|
|
118
|
+
const engMessages = [makeUserMessage("a".repeat(100))];
|
|
119
|
+
const cjkMessages = [makeUserMessage("가".repeat(100))];
|
|
120
|
+
const engTokens = cm.estimateTokens(engMessages);
|
|
121
|
+
const cjkTokens = cm.estimateTokens(cjkMessages);
|
|
122
|
+
// CJK should produce more tokens per character (2 chars/token vs 4)
|
|
123
|
+
assert.ok(cjkTokens > engTokens, `CJK tokens (${cjkTokens}) should be > English tokens (${engTokens})`);
|
|
124
|
+
});
|
|
125
|
+
// === 7. prepareForLLM returns valid Message[] ===
|
|
126
|
+
it("prepareForLLM returns array of Messages with correct roles", () => {
|
|
127
|
+
const cm = makeManager();
|
|
128
|
+
cm.addMessage(makeSystemMessage("System"));
|
|
129
|
+
cm.addMessage(makeUserMessage("User"));
|
|
130
|
+
cm.addMessage(makeAssistantMessage("Assistant"));
|
|
131
|
+
const result = cm.prepareForLLM();
|
|
132
|
+
assert.ok(Array.isArray(result));
|
|
133
|
+
for (const msg of result) {
|
|
134
|
+
assert.ok(["system", "user", "assistant", "tool"].includes(msg.role), `Invalid role: ${msg.role}`);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
// === 8. Clear resets history ===
|
|
138
|
+
it("clear removes all messages", () => {
|
|
139
|
+
const cm = makeManager();
|
|
140
|
+
cm.addMessage(makeUserMessage("test"));
|
|
141
|
+
assert.equal(cm.messageCount, 1);
|
|
142
|
+
cm.clear();
|
|
143
|
+
assert.equal(cm.messageCount, 0);
|
|
144
|
+
assert.equal(cm.getMessages().length, 0);
|
|
145
|
+
});
|
|
146
|
+
// === 9. addMessages batch ===
|
|
147
|
+
it("addMessages adds multiple messages at once", () => {
|
|
148
|
+
const cm = makeManager();
|
|
149
|
+
cm.addMessages([
|
|
150
|
+
makeUserMessage("one"),
|
|
151
|
+
makeAssistantMessage("two"),
|
|
152
|
+
makeUserMessage("three"),
|
|
153
|
+
]);
|
|
154
|
+
assert.equal(cm.messageCount, 3);
|
|
155
|
+
});
|
|
156
|
+
// === 10. getCurrentTokenCount tracks total ===
|
|
157
|
+
it("getCurrentTokenCount updates as messages are added", () => {
|
|
158
|
+
const cm = makeManager();
|
|
159
|
+
const initial = cm.getCurrentTokenCount();
|
|
160
|
+
assert.equal(initial, 0);
|
|
161
|
+
cm.addMessage(makeUserMessage("Hello world this is a test message"));
|
|
162
|
+
const afterOne = cm.getCurrentTokenCount();
|
|
163
|
+
assert.ok(afterOne > 0);
|
|
164
|
+
cm.addMessage(makeAssistantMessage("This is a response with some content"));
|
|
165
|
+
const afterTwo = cm.getCurrentTokenCount();
|
|
166
|
+
assert.ok(afterTwo > afterOne);
|
|
167
|
+
});
|
|
168
|
+
// === 11. getMessages returns a copy ===
|
|
169
|
+
it("getMessages returns a copy, not the internal array", () => {
|
|
170
|
+
const cm = makeManager();
|
|
171
|
+
cm.addMessage(makeUserMessage("test"));
|
|
172
|
+
const msgs = cm.getMessages();
|
|
173
|
+
msgs.push(makeUserMessage("injected"));
|
|
174
|
+
assert.equal(cm.messageCount, 1, "Internal array should not be modified");
|
|
175
|
+
});
|
|
176
|
+
// === 12. Tool calls in token estimation ===
|
|
177
|
+
it("includes tool_calls in token estimation", () => {
|
|
178
|
+
const cm = makeManager();
|
|
179
|
+
const withoutTools = [makeAssistantMessage("reply")];
|
|
180
|
+
const withTools = [
|
|
181
|
+
makeMessage("assistant", "reply", [
|
|
182
|
+
{
|
|
183
|
+
id: "tc_1",
|
|
184
|
+
name: "file_read",
|
|
185
|
+
arguments: JSON.stringify({ path: "src/app.ts" }),
|
|
186
|
+
},
|
|
187
|
+
]),
|
|
188
|
+
];
|
|
189
|
+
const tokensWithout = cm.estimateTokens(withoutTools);
|
|
190
|
+
const tokensWith = cm.estimateTokens(withTools);
|
|
191
|
+
assert.ok(tokensWith > tokensWithout, "Messages with tool calls should have higher token count");
|
|
192
|
+
});
|
|
193
|
+
// === 13. ContextOverflowError when compaction is insufficient ===
|
|
194
|
+
it("throws ContextOverflowError when even compaction cannot fit", () => {
|
|
195
|
+
// Extremely small limit
|
|
196
|
+
const cm = makeManager({
|
|
197
|
+
maxContextTokens: 20,
|
|
198
|
+
outputReserveTokens: 10,
|
|
199
|
+
compaction: { recentWindow: 1, summaryWindow: 0 },
|
|
200
|
+
});
|
|
201
|
+
// Add a system message and a very long user message
|
|
202
|
+
cm.addMessage(makeSystemMessage("System prompt that is fairly long to exceed the tiny limit we set."));
|
|
203
|
+
cm.addMessage(makeUserMessage("x".repeat(500)));
|
|
204
|
+
assert.throws(() => cm.prepareForLLM(), (err) => {
|
|
205
|
+
assert.ok(err instanceof ContextOverflowError);
|
|
206
|
+
assert.ok(err.currentTokens > 0);
|
|
207
|
+
assert.ok(err.maxTokens > 0);
|
|
208
|
+
return true;
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
// === 14. Compression preserves head and tail ===
|
|
212
|
+
it("compression keeps head and tail of long tool results", () => {
|
|
213
|
+
const cm = makeManager();
|
|
214
|
+
const longResult = "HEAD" + "x".repeat(200_000) + "TAIL";
|
|
215
|
+
const compressed = cm.compressToolResult("file_read", longResult);
|
|
216
|
+
assert.ok(compressed.startsWith("HEAD"), "Should preserve head");
|
|
217
|
+
assert.ok(compressed.endsWith("TAIL"), "Should preserve tail");
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
//# sourceMappingURL=context-manager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-manager.test.js","sourceRoot":"","sources":["../../src/__tests__/context-manager.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"governor.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/governor.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module governor.test
|
|
3
|
+
* @description Governor unit tests (~15 cases).
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it } from "node:test";
|
|
6
|
+
import assert from "node:assert/strict";
|
|
7
|
+
import { Governor } from "../governor.js";
|
|
8
|
+
import { PlanLimitError, ApprovalRequiredError } from "../errors.js";
|
|
9
|
+
// ─── Helpers ───
|
|
10
|
+
function makeGovernor(overrides = {}) {
|
|
11
|
+
return new Governor({
|
|
12
|
+
planTier: "PRO",
|
|
13
|
+
...overrides,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
function makeToolCall(name, args) {
|
|
17
|
+
return {
|
|
18
|
+
id: `tc_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`,
|
|
19
|
+
name,
|
|
20
|
+
arguments: args,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
// ─── Tests ───
|
|
24
|
+
describe("Governor", () => {
|
|
25
|
+
// === 1. Iteration limit ===
|
|
26
|
+
it("blocks when iteration limit is exceeded", () => {
|
|
27
|
+
const gov = makeGovernor({
|
|
28
|
+
customLimits: { maxIterations: 3 },
|
|
29
|
+
});
|
|
30
|
+
// Use up all iterations
|
|
31
|
+
for (let i = 0; i < 3; i++) {
|
|
32
|
+
gov.checkIteration();
|
|
33
|
+
gov.recordIteration(100, 50);
|
|
34
|
+
}
|
|
35
|
+
// 4th iteration should throw
|
|
36
|
+
assert.throws(() => gov.checkIteration(), (err) => {
|
|
37
|
+
assert.ok(err instanceof PlanLimitError);
|
|
38
|
+
assert.equal(err.limitName, "maxIterations");
|
|
39
|
+
return true;
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
// === 2. Token budget ===
|
|
43
|
+
it("blocks when token budget is exceeded", () => {
|
|
44
|
+
const gov = makeGovernor({
|
|
45
|
+
customLimits: { tokensPerRequest: 1000 },
|
|
46
|
+
});
|
|
47
|
+
gov.recordIteration(600, 500); // total = 1100 > 1000
|
|
48
|
+
assert.throws(() => gov.checkIteration(), (err) => {
|
|
49
|
+
assert.ok(err instanceof PlanLimitError);
|
|
50
|
+
assert.equal(err.limitName, "tokensPerRequest");
|
|
51
|
+
return true;
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
// === 3. Dangerous command: rm -rf ===
|
|
55
|
+
it("blocks 'rm -rf /' as a dangerous command", () => {
|
|
56
|
+
const gov = makeGovernor();
|
|
57
|
+
const tc = makeToolCall("shell_exec", { command: "rm -rf /" });
|
|
58
|
+
assert.throws(() => gov.validateToolCall(tc), (err) => {
|
|
59
|
+
assert.ok(err instanceof ApprovalRequiredError);
|
|
60
|
+
assert.equal(err.actionType, "RUN_DANGEROUS_CMD");
|
|
61
|
+
return true;
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
// === 4. Safe commands: ls, cat ===
|
|
65
|
+
it("allows safe commands like ls and cat", () => {
|
|
66
|
+
const gov = makeGovernor();
|
|
67
|
+
assert.doesNotThrow(() => {
|
|
68
|
+
gov.validateToolCall(makeToolCall("shell_exec", { command: "ls -la" }));
|
|
69
|
+
});
|
|
70
|
+
assert.doesNotThrow(() => {
|
|
71
|
+
gov.validateToolCall(makeToolCall("shell_exec", { command: "cat README.md" }));
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
// === 5. Sensitive file write: .env ===
|
|
75
|
+
it("blocks writing to sensitive files like .env", () => {
|
|
76
|
+
const gov = makeGovernor();
|
|
77
|
+
const tc = makeToolCall("file_write", { path: ".env" });
|
|
78
|
+
assert.throws(() => gov.validateToolCall(tc), (err) => {
|
|
79
|
+
assert.ok(err instanceof ApprovalRequiredError);
|
|
80
|
+
assert.equal(err.actionType, "MODIFY_CONFIG");
|
|
81
|
+
return true;
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
// === 6. Normal file write: src/app.ts ===
|
|
85
|
+
it("allows writing to normal source files", () => {
|
|
86
|
+
const gov = makeGovernor();
|
|
87
|
+
assert.doesNotThrow(() => {
|
|
88
|
+
gov.validateToolCall(makeToolCall("file_write", { path: "src/app.ts" }));
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
// === 7. Plan tier limits: FREE vs ENTERPRISE ===
|
|
92
|
+
it("FREE plan has much lower limits than ENTERPRISE", () => {
|
|
93
|
+
const free = makeGovernor({ planTier: "FREE" });
|
|
94
|
+
const ent = makeGovernor({ planTier: "ENTERPRISE" });
|
|
95
|
+
const freeLimits = free.getLimits();
|
|
96
|
+
const entLimits = ent.getLimits();
|
|
97
|
+
assert.ok(freeLimits.maxIterations < entLimits.maxIterations, `FREE maxIterations (${freeLimits.maxIterations}) should be less than ENTERPRISE (${entLimits.maxIterations})`);
|
|
98
|
+
assert.ok(freeLimits.tokensPerRequest < entLimits.tokensPerRequest, `FREE tokens (${freeLimits.tokensPerRequest}) should be less than ENTERPRISE (${entLimits.tokensPerRequest})`);
|
|
99
|
+
assert.ok(freeLimits.sessionTtlMs < entLimits.sessionTtlMs);
|
|
100
|
+
});
|
|
101
|
+
// === 8. Interactive command: vim ===
|
|
102
|
+
it("blocks dangerous interactive-style commands via sudo pattern", () => {
|
|
103
|
+
const gov = makeGovernor();
|
|
104
|
+
// "sudo" is in DANGEROUS_PATTERNS
|
|
105
|
+
const tc = makeToolCall("shell_exec", { command: "sudo vim /etc/hosts" });
|
|
106
|
+
assert.throws(() => gov.validateToolCall(tc), (err) => {
|
|
107
|
+
assert.ok(err instanceof ApprovalRequiredError);
|
|
108
|
+
return true;
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
// === 9. Path-related sensitive file: credentials.json ===
|
|
112
|
+
it("blocks writing to credentials.json", () => {
|
|
113
|
+
const gov = makeGovernor();
|
|
114
|
+
const tc = makeToolCall("file_write", { path: "config/credentials.json" });
|
|
115
|
+
assert.throws(() => gov.validateToolCall(tc), (err) => {
|
|
116
|
+
assert.ok(err instanceof ApprovalRequiredError);
|
|
117
|
+
assert.equal(err.actionType, "MODIFY_CONFIG");
|
|
118
|
+
return true;
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
// === 10. Shell meta characters ===
|
|
122
|
+
it("blocks commands with shell metacharacters like ;, &&, ||, |", () => {
|
|
123
|
+
const gov = makeGovernor();
|
|
124
|
+
// $( is dangerous — command substitution
|
|
125
|
+
const tc = makeToolCall("shell_exec", {
|
|
126
|
+
command: "echo $(whoami)",
|
|
127
|
+
});
|
|
128
|
+
assert.throws(() => gov.validateToolCall(tc), (err) => {
|
|
129
|
+
assert.ok(err instanceof ApprovalRequiredError);
|
|
130
|
+
return true;
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
// === 11. Auto-approve dangerous command ===
|
|
134
|
+
it("allows dangerous commands when auto-approved", () => {
|
|
135
|
+
const gov = makeGovernor({
|
|
136
|
+
autoApproveActions: ["RUN_DANGEROUS_CMD"],
|
|
137
|
+
});
|
|
138
|
+
// Should emit warning but not throw
|
|
139
|
+
let warned = false;
|
|
140
|
+
gov.on("warning", () => { warned = true; });
|
|
141
|
+
assert.doesNotThrow(() => {
|
|
142
|
+
gov.validateToolCall(makeToolCall("shell_exec", { command: "rm -rf ./build" }));
|
|
143
|
+
});
|
|
144
|
+
assert.ok(warned, "Should have emitted a warning");
|
|
145
|
+
});
|
|
146
|
+
// === 12. State tracking ===
|
|
147
|
+
it("tracks iteration count and token usage correctly", () => {
|
|
148
|
+
const gov = makeGovernor();
|
|
149
|
+
gov.recordIteration(500, 200);
|
|
150
|
+
gov.recordIteration(300, 150);
|
|
151
|
+
const state = gov.getState();
|
|
152
|
+
assert.equal(state.iterationCount, 2);
|
|
153
|
+
assert.equal(state.totalInputTokens, 800);
|
|
154
|
+
assert.equal(state.totalOutputTokens, 350);
|
|
155
|
+
});
|
|
156
|
+
// === 13. Remaining iterations ===
|
|
157
|
+
it("getRemainingIterations decreases correctly", () => {
|
|
158
|
+
const gov = makeGovernor({ customLimits: { maxIterations: 10 } });
|
|
159
|
+
assert.equal(gov.getRemainingIterations(), 10);
|
|
160
|
+
gov.recordIteration(100, 50);
|
|
161
|
+
assert.equal(gov.getRemainingIterations(), 9);
|
|
162
|
+
});
|
|
163
|
+
// === 14. Remaining tokens ===
|
|
164
|
+
it("getRemainingTokens decreases correctly", () => {
|
|
165
|
+
const gov = makeGovernor({ customLimits: { tokensPerRequest: 5000 } });
|
|
166
|
+
assert.equal(gov.getRemainingTokens(), 5000);
|
|
167
|
+
gov.recordIteration(1000, 500);
|
|
168
|
+
assert.equal(gov.getRemainingTokens(), 3500);
|
|
169
|
+
});
|
|
170
|
+
// === 15. Sensitive file read emits warning but does not throw ===
|
|
171
|
+
it("allows reading .env but emits a warning", () => {
|
|
172
|
+
const gov = makeGovernor();
|
|
173
|
+
let warned = false;
|
|
174
|
+
gov.on("warning", (evt) => {
|
|
175
|
+
if (evt.type === "sensitive_file_read")
|
|
176
|
+
warned = true;
|
|
177
|
+
});
|
|
178
|
+
assert.doesNotThrow(() => {
|
|
179
|
+
gov.validateToolCall(makeToolCall("file_read", { path: ".env.local" }));
|
|
180
|
+
});
|
|
181
|
+
assert.ok(warned, "Should have emitted a sensitive_file_read warning");
|
|
182
|
+
});
|
|
183
|
+
// === 16. Tool call count tracked ===
|
|
184
|
+
it("tracks tool call count", () => {
|
|
185
|
+
const gov = makeGovernor();
|
|
186
|
+
gov.validateToolCall(makeToolCall("file_read", { path: "src/app.ts" }));
|
|
187
|
+
gov.validateToolCall(makeToolCall("file_read", { path: "src/index.ts" }));
|
|
188
|
+
assert.equal(gov.getState().toolCallCount, 2);
|
|
189
|
+
});
|
|
190
|
+
// === 17. String arguments parsing ===
|
|
191
|
+
it("handles string-encoded arguments in tool calls", () => {
|
|
192
|
+
const gov = makeGovernor();
|
|
193
|
+
const tc = {
|
|
194
|
+
id: "tc_str",
|
|
195
|
+
name: "shell_exec",
|
|
196
|
+
arguments: JSON.stringify({ command: "ls -la" }),
|
|
197
|
+
};
|
|
198
|
+
assert.doesNotThrow(() => gov.validateToolCall(tc));
|
|
199
|
+
});
|
|
200
|
+
// === 18. git push blocked ===
|
|
201
|
+
it("blocks git push command", () => {
|
|
202
|
+
const gov = makeGovernor();
|
|
203
|
+
const tc = makeToolCall("shell_exec", { command: "git push origin main" });
|
|
204
|
+
assert.throws(() => gov.validateToolCall(tc), (err) => {
|
|
205
|
+
assert.ok(err instanceof ApprovalRequiredError);
|
|
206
|
+
return true;
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
//# sourceMappingURL=governor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"governor.test.js","sourceRoot":"","sources":["../../src/__tests__/governor.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-router.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/model-router.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|