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.
@@ -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-sonnet-4.6
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.
@@ -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
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.
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chapterhouse",
3
- "version": "0.11.4",
3
+ "version": "0.12.0",
4
4
  "description": "Chapterhouse — a team-level AI assistant for engineering teams, built on the GitHub Copilot SDK. Web UI only.",
5
5
  "bin": {
6
6
  "chapterhouse": "dist/cli.js"