Skip to content

Commit 8e6fedc

Browse files
committed
add global and project setting
1 parent 1788f7c commit 8e6fedc

46 files changed

Lines changed: 3281 additions & 588 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

packages/codingcode/src/agent/agent.ts

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { McpService } from '../mcp/index.js';
2121
import { loadMemoryForPrompt, flushSessionToMemory } from '../memory/index.js';
2222
import { createLogger } from '@codingcode/infra';
2323
import type { AgentProfile } from '../subagent/registry';
24+
import { resolveSubagentEnabled, resolveAgentDisabled } from '../subagent/registry.js';
2425
import type { ToolVisibilityPolicy } from '../tools/types';
2526
import { ProjectRuntimeService } from '../runtime/project-runtime';
2627
import { createDispatchAgentTool } from '../tools/domains/subagent/dispatch.js';
@@ -71,26 +72,29 @@ export const sendMessage = (
7172

7273
// Apply main agent profile: model override, maxSteps, readonly, hooks, MCP
7374
let activeLlm = llm;
74-
if (profile.model) {
75+
if (profile?.model) {
7576
const entry = findModel(profile.model);
7677
if (entry) {
7778
const clientResult = yield* Effect.promise(() => createClient(entry));
7879
if (clientResult.ok) activeLlm = clientResult.value;
7980
}
8081
}
81-
const effectiveMaxSteps = profile.maxSteps;
82-
const effectiveApproval: any = profile.readonly
82+
const effectiveMaxSteps = profile?.maxSteps;
83+
const effectiveApproval: any = profile?.readonly
8384
? { permissionMode: 'bypass' }
8485
: options?.approvalOverride;
8586

86-
if (profile.hooks?.length) {
87+
if (profile?.hooks?.length) {
8788
yield* hooks.attachSessionHooks(sid, profile.hooks);
8889
}
8990

90-
if (profile.mcpServers?.length) {
91+
if (profile?.mcpServers?.length) {
9192
yield* mcp.connectServers(normalizedCwd, sid, profile.mcpServers);
9293
}
9394

95+
// Get MCP tools for injection into ReAct loop
96+
const mcpTools = mcp.listProjectMcpTools(normalizedCwd);
97+
9498
const turnId = session.incrementTurn(state);
9599
const [matchedSkill, actualInput] = yield* skill.extractSkill(state.cwd, input);
96100

@@ -106,6 +110,7 @@ export const sendMessage = (
106110
maxStepsOverride: effectiveMaxSteps,
107111
approvalOverride: effectiveApproval,
108112
dispatchTool,
113+
mcpTools,
109114
skillInstruction: matchedSkill?.instruction,
110115
abortSignal: options?.signal,
111116
});
@@ -174,6 +179,7 @@ export interface RunStreamOptions {
174179
coreAllowlist?: ReadonlySet<string>;
175180
toolPolicy?: ToolVisibilityPolicy;
176181
dispatchTool?: ToolDefinition;
182+
mcpTools?: ToolDefinition[];
177183
abortSignal?: AbortSignal;
178184
parentSessionId?: string;
179185
agentName?: string;
@@ -239,8 +245,11 @@ export async function* runReActLoop(
239245
const sessionId = state.sessionId;
240246
const projectPath = state.cwd;
241247

242-
// Build system prompt
243-
const agentProfiles = deps.runtime.listAgentProfiles(projectPath);
248+
// Build system prompt — filter agent profiles by global switch and per-agent disabled state
249+
const allAgentProfiles = deps.runtime.listAgentProfiles(projectPath);
250+
const agentProfiles = resolveSubagentEnabled(projectPath)
251+
? allAgentProfiles.filter((p) => !resolveAgentDisabled(projectPath, p.name))
252+
: [];
244253
const basePrompt =
245254
opts.systemOverride ??
246255
buildSystemPrompt({
@@ -308,9 +317,9 @@ export async function* runReActLoop(
308317
return Result.err(new AgentError('AGENT_ABORTED', 'cancelled'));
309318
}
310319

311-
// Build tools from static builtin + dispatch
312-
let allToolDefs: ToolDefinition[] = [...STATIC_BUILTIN_TOOLS];
313-
if (opts.dispatchTool) allToolDefs = [...allToolDefs, opts.dispatchTool];
320+
// Build tools from static builtin + MCP + dispatch
321+
let allToolDefs: ToolDefinition[] = [...STATIC_BUILTIN_TOOLS, ...(opts.mcpTools ?? [])];
322+
if (opts.dispatchTool && resolveSubagentEnabled(projectPath)) allToolDefs = [...allToolDefs, opts.dispatchTool];
314323

315324
// Apply policy filter (derived from AgentProfile.tools via getToolPolicy)
316325
const allowedByPolicy = opts.toolPolicy?.allowedTools;

packages/codingcode/src/agent/prompt.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,15 @@ export function buildSystemPrompt(opts: SystemPromptOptions): string {
5656
}
5757

5858
if (opts.agentProfiles && opts.agentProfiles.length > 0) {
59-
prompt += '\n\n## Available Subagents\n';
60-
prompt += `You can dispatch subagents using the dispatch_agent tool. Available profiles:\n`;
61-
for (const p of opts.agentProfiles) {
62-
prompt += `\n### ${p.name}\n${p.description}`;
63-
if (p.tools && p.tools.length > 0) {
64-
prompt += `\nTools: ${p.tools.join(', ')}`;
59+
const enabledProfiles = opts.agentProfiles.filter((p) => !p.disabled);
60+
if (enabledProfiles.length > 0) {
61+
prompt += '\n\n## Available Subagents\n';
62+
prompt += `You can dispatch subagents using the dispatch_agent tool. Available profiles:\n`;
63+
for (const p of enabledProfiles) {
64+
prompt += `\n### ${p.name}\n${p.description}`;
65+
if (p.tools && p.tools.length > 0) {
66+
prompt += `\nTools: ${p.tools.join(', ')}`;
67+
}
6568
}
6669
}
6770
}

packages/codingcode/src/client/direct.ts

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -396,23 +396,27 @@ export async function createDirectClient(llm: any): Promise<AgentClient> {
396396
},
397397

398398
async getSubagentEnabled() {
399-
return clients.settings.getSubagentEnabled();
399+
return clients.settings.getSubagentEnabled({ cwd: cwd() });
400400
},
401401

402-
async setSubagentEnabled(enabled: boolean) {
403-
await clients.settings.setSubagentEnabled(enabled);
402+
async setSubagentEnabled(body: { enabled: boolean; cwd: string }) {
403+
await clients.settings.setSubagentEnabled(body);
404+
},
405+
406+
async resetSubagentEnabled(body: { cwd: string }) {
407+
await clients.settings.resetSubagentEnabled(body);
404408
},
405409

406410
async getMcpStatus() {
407411
return clients.settings.getMcpStatus();
408412
},
409413

410-
async disableMcp(name: string) {
411-
await clients.settings.setMcpDisabled(name, true);
414+
async setMcpDisabled(body: { name: string; disabled: boolean; cwd: string }) {
415+
await clients.settings.setMcpDisabled(body);
412416
},
413417

414-
async enableMcp(name: string) {
415-
await clients.settings.setMcpDisabled(name, false);
418+
async resetMcpDisabled(body: { name: string; cwd: string }) {
419+
await clients.settings.resetMcpDisabled(body);
416420
},
417421

418422
async createMcpServer(server: any): Promise<void> {
@@ -431,8 +435,8 @@ export async function createDirectClient(llm: any): Promise<AgentClient> {
431435
return clients.settings.listSkills();
432436
},
433437

434-
async toggleSkill(name: string, enabled: boolean) {
435-
await clients.settings.toggleSkill(name, enabled);
438+
async toggleSkill(body: { name: string; enabled: boolean; cwd: string }) {
439+
await clients.settings.toggleSkill(body);
436440
},
437441

438442
async listAgents() {
@@ -451,16 +455,24 @@ export async function createDirectClient(llm: any): Promise<AgentClient> {
451455
await clients.settings.deleteAgent({ cwd: cwd(), name });
452456
},
453457

454-
async setAgentDisabled(name: string, disabled: boolean): Promise<void> {
455-
await clients.settings.setAgentDisabled(name, disabled);
458+
async setAgentDisabled(body: { name: string; disabled: boolean; cwd: string }): Promise<void> {
459+
await clients.settings.setAgentDisabled(body);
460+
},
461+
462+
async resetAgentDisabled(body: { name: string; cwd: string }): Promise<void> {
463+
await clients.settings.resetAgentDisabled(body);
456464
},
457465

458466
async listHooks() {
459467
return clients.settings.listHooks({ cwd: cwd() });
460468
},
461469

462-
async setHookDisabled(name: string, disabled: boolean): Promise<void> {
463-
await clients.settings.setHookDisabled({ cwd: cwd(), name, disabled });
470+
async setHookDisabled(body: { name: string; disabled: boolean; cwd: string }): Promise<void> {
471+
await clients.settings.setHookDisabled({ cwd: cwd(), name: body.name, disabled: body.disabled });
472+
},
473+
474+
async resetHookDisabled(body: { name: string; cwd: string }): Promise<void> {
475+
await clients.settings.resetHookDisabled(body);
464476
},
465477

466478
async createHook(hook: any): Promise<void> {

0 commit comments

Comments
 (0)