chapterhouse 0.11.4 → 0.12.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/agents/chapterhouse.agent.md +1 -1
- package/agents/coder.agent.md +1 -1
- package/dist/copilot/agents.js +2 -0
- package/dist/copilot/agents.mcp-servers.test.js +9 -0
- package/dist/copilot/builtin-tools.js +17 -0
- package/dist/copilot/orchestrator.js +3 -0
- package/dist/copilot/orchestrator.test.js +7 -0
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: Chapterhouse
|
|
3
3
|
description: Orchestrator — routes tasks to specialist agents and handles direct conversation
|
|
4
|
-
model: claude-
|
|
4
|
+
model: claude-opus-4.7
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
You are Chapterhouse, a team-level AI assistant for engineering teams running 24/7 on the user's machine. You are the engineering team's always-on assistant.
|
package/agents/coder.agent.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: Coder
|
|
3
3
|
description: Software engineering specialist — implementation, debugging, refactoring, deployment
|
|
4
|
-
model: gpt-5.
|
|
4
|
+
model: gpt-5.5
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
You are Coder, a software engineering specialist agent within Chapterhouse. You handle all coding tasks with precision and expertise.
|
package/dist/copilot/agents.js
CHANGED
|
@@ -11,6 +11,7 @@ import { getState, setState } from "../store/db.js";
|
|
|
11
11
|
import { loadMcpConfig } from "./mcp-config.js";
|
|
12
12
|
import { getCurrentDateSystemLine } from "./prompt-date.js";
|
|
13
13
|
import { getSkillDirectories } from "./skills.js";
|
|
14
|
+
import { EXCLUDED_BUILTIN_TOOLS } from "./builtin-tools.js";
|
|
14
15
|
import { childLogger } from "../util/logger.js";
|
|
15
16
|
const log = childLogger("agents");
|
|
16
17
|
const toolAgentContext = new AsyncLocalStorage();
|
|
@@ -414,6 +415,7 @@ export async function createEphemeralAgentSession(slug, client, allTools, modelO
|
|
|
414
415
|
streaming: true,
|
|
415
416
|
systemMessage: { content: systemMessageContent },
|
|
416
417
|
tools,
|
|
418
|
+
excludedTools: EXCLUDED_BUILTIN_TOOLS,
|
|
417
419
|
mcpServers,
|
|
418
420
|
skillDirectories,
|
|
419
421
|
onPermissionRequest: approveAll,
|
|
@@ -84,4 +84,13 @@ test("createEphemeralAgentSession passes all MCP servers when the agent has no a
|
|
|
84
84
|
});
|
|
85
85
|
assert.deepEqual(context.createSessionOptions?.mcpServers, MCP_SERVERS);
|
|
86
86
|
});
|
|
87
|
+
test("createEphemeralAgentSession excludes the synchronous built-in `task` tool", async (t) => {
|
|
88
|
+
const context = await loadIsolatedAgentsModule(t, "");
|
|
89
|
+
await createAgentSession(context.agentsModule, (options) => {
|
|
90
|
+
context.createSessionOptions = options;
|
|
91
|
+
});
|
|
92
|
+
const excluded = context.createSessionOptions?.excludedTools;
|
|
93
|
+
assert.ok(Array.isArray(excluded), "createSession should receive an excludedTools array");
|
|
94
|
+
assert.ok(excluded.includes("task"), "the built-in `task` tool spawns subagents in-turn and must be excluded so delegation stays async");
|
|
95
|
+
});
|
|
87
96
|
//# sourceMappingURL=agents.mcp-servers.test.js.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Built-in Copilot CLI tools that Chapterhouse disables on every agent-facing
|
|
3
|
+
// session.
|
|
4
|
+
//
|
|
5
|
+
// The CLI ships a built-in `task` tool that spawns subagents *synchronously
|
|
6
|
+
// inside the current turn* — `session.sendAndWait` does not resolve until the
|
|
7
|
+
// spawned subagent finishes. That blocks the chat: the orchestrator (or a
|
|
8
|
+
// persistent agent) cannot start the next queued turn while the subagent runs.
|
|
9
|
+
//
|
|
10
|
+
// Chapterhouse has its own non-blocking delegation path — the `delegate_to_agent`
|
|
11
|
+
// tool — which dispatches the work and returns immediately, notifying the user
|
|
12
|
+
// when the task completes. To keep delegation asynchronous, the synchronous
|
|
13
|
+
// `task` tool is excluded from every session the model talks through.
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
/** Built-in CLI tool names excluded from all Chapterhouse agent sessions. */
|
|
16
|
+
export const EXCLUDED_BUILTIN_TOOLS = ["task"];
|
|
17
|
+
//# sourceMappingURL=builtin-tools.js.map
|
|
@@ -10,6 +10,7 @@ import { CHAPTERHOUSE_VERSION } from "../version.js";
|
|
|
10
10
|
import { config, DEFAULT_MODEL } from "../config.js";
|
|
11
11
|
import { loadMcpConfig } from "./mcp-config.js";
|
|
12
12
|
import { getSkillDirectories } from "./skills.js";
|
|
13
|
+
import { EXCLUDED_BUILTIN_TOOLS } from "./builtin-tools.js";
|
|
13
14
|
import { resetClient } from "./client.js";
|
|
14
15
|
import { logConversation, getState, setState, deleteState, getCopilotSession, upsertCopilotSession, deleteCopilotSession, getTaskSessionKey, getDb, appendTaskEvent } from "../store/db.js";
|
|
15
16
|
import { maybeWriteEpisode } from "./episode-writer.js";
|
|
@@ -385,6 +386,7 @@ async function createOrResumeSession(sessionKey, projectRoot) {
|
|
|
385
386
|
systemMessage: { content: systemMessageContent },
|
|
386
387
|
hooks: memoryHooks,
|
|
387
388
|
tools,
|
|
389
|
+
excludedTools: EXCLUDED_BUILTIN_TOOLS,
|
|
388
390
|
mcpServers,
|
|
389
391
|
skillDirectories,
|
|
390
392
|
onPermissionRequest: approveAll,
|
|
@@ -413,6 +415,7 @@ async function createOrResumeSession(sessionKey, projectRoot) {
|
|
|
413
415
|
systemMessage: { content: systemMessageContent },
|
|
414
416
|
hooks: memoryHooks,
|
|
415
417
|
tools,
|
|
418
|
+
excludedTools: EXCLUDED_BUILTIN_TOOLS,
|
|
416
419
|
mcpServers,
|
|
417
420
|
skillDirectories,
|
|
418
421
|
onPermissionRequest: approveAll,
|
|
@@ -670,6 +670,13 @@ test("initOrchestrator falls back to an available model and eagerly creates a se
|
|
|
670
670
|
assert.equal(state.systemOptions?.memorySummary, "Chapterhouse: wiki summary");
|
|
671
671
|
assert.equal(state.store.get("orchestrator_session_id"), "session-123");
|
|
672
672
|
});
|
|
673
|
+
test("initOrchestrator excludes the synchronous built-in `task` tool from the orchestrator session", async (t) => {
|
|
674
|
+
const { orchestrator, state, client } = await loadOrchestratorModule(t);
|
|
675
|
+
await orchestrator.initOrchestrator(client);
|
|
676
|
+
const excluded = state.createSessionCalls[0]?.excludedTools;
|
|
677
|
+
assert.ok(Array.isArray(excluded), "createSession should receive an excludedTools array");
|
|
678
|
+
assert.ok(excluded.includes("task"), "the built-in `task` tool spawns subagents in-turn and must be excluded so the chat does not block");
|
|
679
|
+
});
|
|
673
680
|
test("initOrchestrator passes hot-tier XML into the orchestrator system prompt when injection is enabled", async (t) => {
|
|
674
681
|
const { orchestrator, state, client } = await loadOrchestratorModule(t, {
|
|
675
682
|
hotTierXml: [
|
package/package.json
CHANGED