Skip to content

Commit 744228c

Browse files
authored
Merge pull request #119 from phantom5099/refactor-arch
调整配置开关值,修改并发工具执行队列
2 parents 431fd31 + 7c3b7d9 commit 744228c

45 files changed

Lines changed: 510 additions & 789 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: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,10 @@ export const AgentLayer = Layer.effect(AgentService, Effect.gen(function* () {
324324
})
325325
: [];
326326

327-
const allResults = [...approvedResults, ...deniedResults];
327+
const resultsById = new Map<string, any>();
328+
for (const r of approvedResults) resultsById.set(r.id, r);
329+
for (const r of deniedResults) resultsById.set(r.id, r);
330+
const allResults = toolCalls.map((tc) => resultsById.get(tc.id));
328331

329332
let todoPrinted = false;
330333
for (const r of allResults) {

‎packages/codingcode/src/client/contracts.ts‎

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,7 @@ export interface SettingsClient {
133133
getAgentConfig(): Promise<{ maxSteps: number; maxStopContinuations: number }>;
134134
setCompactionModel(compactionModel: string): Promise<{ compactionModel: string }>;
135135
getMcpStatus(input: { cwd: string }): Promise<McpStatus[]>;
136-
setMcpDisabled(body: { name: string; disabled: boolean; cwd: string }): Promise<void>;
137-
resetMcpDisabled(body: { name: string; cwd: string }): Promise<void>;
136+
setMcpEnabled(body: { name: string; enabled: boolean; cwd: string }): Promise<void>;
138137
createMcpServer(input: { cwd: string; server: McpServerConfig }): Promise<void>;
139138
updateMcpServer(input: { cwd: string; name: string; server: McpServerConfig }): Promise<void>;
140139
deleteMcpServer(input: { cwd: string; name: string }): Promise<void>;
@@ -143,8 +142,7 @@ export interface SettingsClient {
143142
createHook(input: { cwd: string; hook: UserHookConfig }): Promise<void>;
144143
updateHook(input: { cwd: string; name: string; hook: UserHookConfig }): Promise<void>;
145144
deleteHook(input: { cwd: string; name: string }): Promise<void>;
146-
setHookDisabled(input: { cwd: string; name: string; disabled: boolean }): Promise<void>;
147-
resetHookDisabled(body: { name: string; cwd: string }): Promise<void>;
145+
setHookEnabled(input: { cwd: string; name: string; enabled: boolean }): Promise<void>;
148146
getGlobalPermissionMode(input: { sessionId: string; cwd: string }): Promise<PermissionMode>;
149147
setGlobalPermissionMode(input: {
150148
sessionId: string;

‎packages/codingcode/src/client/http/settings.ts‎

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -42,19 +42,12 @@ export function createHttpSettingsClient(
4242
return apiGet<McpStatus[]>(`/api/settings/mcp${qsCwd(cwd)}`);
4343
},
4444

45-
async setMcpDisabled({ name, disabled, cwd }) {
46-
await apiPost(`/api/settings/mcp/${encodeURIComponent(name)}/disabled${qsCwd(cwd)}`, {
47-
disabled,
45+
async setMcpEnabled({ name, enabled, cwd }) {
46+
await apiPost(`/api/settings/mcp/${encodeURIComponent(name)}/enabled${qsCwd(cwd)}`, {
47+
enabled,
4848
});
4949
},
5050

51-
async resetMcpDisabled({ name, cwd }) {
52-
await apiPost(
53-
`/api/settings/mcp/${encodeURIComponent(name)}/disabled/reset${qsCwd(cwd)}`,
54-
{}
55-
);
56-
},
57-
5851
async createMcpServer({ cwd, server }) {
5952
await apiPost(`/api/settings/mcp${qsCwd(cwd)}`, server);
6053
},
@@ -87,19 +80,12 @@ export function createHttpSettingsClient(
8780
await apiDelete(`/api/settings/hooks/${encodeURIComponent(name)}${qsCwd(cwd)}`);
8881
},
8982

90-
async setHookDisabled({ cwd, name, disabled }) {
91-
await apiPost(`/api/settings/hooks/${encodeURIComponent(name)}/disabled${qsCwd(cwd)}`, {
92-
disabled,
83+
async setHookEnabled({ cwd, name, enabled }) {
84+
await apiPost(`/api/settings/hooks/${encodeURIComponent(name)}/enabled${qsCwd(cwd)}`, {
85+
enabled,
9386
});
9487
},
9588

96-
async resetHookDisabled({ name, cwd }) {
97-
await apiPost(
98-
`/api/settings/hooks/${encodeURIComponent(name)}/disabled/reset${qsCwd(cwd)}`,
99-
{}
100-
);
101-
},
102-
10389
async getGlobalPermissionMode(input: {
10490
sessionId: string;
10591
cwd: string;

‎packages/codingcode/src/contracts/hooks.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,6 @@ export interface UserHookConfig {
3535
args?: string[];
3636
env?: Record<string, string>;
3737
priority?: number;
38-
enabled: boolean;
38+
/** 开关:false 表示禁用。缺省(undefined)等同启用 */
39+
enabled?: boolean;
3940
}

‎packages/codingcode/src/contracts/mcp.ts‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import type { AgentError } from '../core/error.js';
33

44
export interface McpServerConfig {
55
name: string;
6+
/** 开关:false 表示禁用。缺省(undefined)等同启用 */
7+
enabled?: boolean;
68
/** stdio: executable command */
79
command?: string;
810
/** stdio: command arguments */
@@ -22,7 +24,6 @@ export interface McpServerConfig {
2224
export interface McpStatus {
2325
name: string;
2426
connected: boolean;
25-
disabled: boolean;
2627
toolCount: number;
2728
transport: 'stdio' | 'http';
2829
reconnectAttempts: number;
@@ -35,5 +36,7 @@ export interface McpToolSpec {
3536
name: string;
3637
description: string;
3738
inputSchema: Record<string, unknown>;
39+
/** MCP 注解 readOnlyHint;缺省 false(fail-closed) */
40+
readOnlyHint: boolean;
3841
execute(args: Record<string, unknown>): Effect.Effect<string, AgentError>;
3942
}

‎packages/codingcode/src/contracts/tool.ts‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ export type ToolResult = { readonly id: string; readonly name: string } & ToolOu
1313

1414
export interface ToolRunner {
1515
readonly name: string;
16+
/** 是否可与同批其它工具并发执行;「未声明」已由装配处收敛,故此处必填 */
17+
readonly concurrencySafe: boolean;
1618
parse(args: unknown): unknown;
1719
execute(args: unknown, ctx?: ToolExecCtx): Effect.Effect<string, AgentError>;
1820
}

‎packages/codingcode/src/direct/settings.ts‎

Lines changed: 28 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,18 @@ import {
1010
writeMcpConfig,
1111
loadGlobalMcpConfig,
1212
writeGlobalMcpConfig,
13-
getGlobalMcpDisabledState,
14-
setGlobalMcpDisabledState,
15-
setProjectMcpDisabledState,
16-
resetProjectMcpDisabledState,
13+
setGlobalMcpServerEnabled,
14+
setProjectMcpServerEnabled,
1715
} from '../mcp/config.js';
1816
import {
1917
loadHookConfigs,
2018
writeHookConfigs,
2119
loadGlobalHookConfigs,
2220
writeGlobalHookConfigs,
2321
resolveHookConfigs,
24-
setGlobalHookDisabledState,
25-
setProjectHookDisabledState,
26-
resetProjectHookDisabledState,
22+
setGlobalHookEnabled,
23+
setProjectHookEnabled,
2724
} from '../hooks/config.js';
28-
import { setHookRuntimeEnabled } from '../hooks/executor.js';
2925
import { getMemoryConfig } from '../memory/config.js';
3026
import { MemoryService } from '../memory/port.js';
3127
import { AlreadyExistsError, NotFoundError } from '../contracts/error.js';
@@ -99,7 +95,11 @@ function hooksList(
9995
cwd: string
10096
): Array<UserHookConfig & { source: 'global' | 'project'; hasProjectOverride?: boolean }> {
10197
if (isGlobalCwd(cwd)) {
102-
return loadGlobalHookConfigs().map((h) => ({ ...h, source: 'global' as const }));
98+
return loadGlobalHookConfigs().map((h) => ({
99+
...h,
100+
enabled: h.enabled !== false,
101+
source: 'global' as const,
102+
}));
103103
}
104104
const globalHooks = loadGlobalHookConfigs();
105105
const projectHooks = loadHookConfigs(cwd);
@@ -112,6 +112,7 @@ function hooksList(
112112
const hasProjectOverride = isFromProject && isFromGlobal;
113113
return {
114114
...h,
115+
enabled: h.enabled !== false,
115116
source: (isFromProject ? 'project' : 'global') as 'global' | 'project',
116117
hasProjectOverride,
117118
};
@@ -173,14 +174,12 @@ function hooksDelete(cwd: string, name: string): void {
173174
);
174175
}
175176

176-
function hooksSetDisabled(cwd: string, name: string, disabled: boolean): void {
177-
setHookRuntimeEnabled(name, !disabled);
178-
const hooks = loadHookConfigs(cwd);
179-
const hook = hooks.find((h) => h.name === name);
180-
if (hook) {
181-
hook.enabled = !disabled;
182-
writeHookConfigs(cwd, hooks);
177+
function hooksSetEnabled(cwd: string, name: string, enabled: boolean): void {
178+
if (isGlobalCwd(cwd)) {
179+
setGlobalHookEnabled(name, enabled);
180+
return;
183181
}
182+
setProjectHookEnabled(resolveCwd(cwd), name, enabled);
184183
}
185184

186185
export function createDirectSettingsClient(rt: AppRuntime): SettingsClient {
@@ -236,7 +235,7 @@ export function createDirectSettingsClient(rt: AppRuntime): SettingsClient {
236235
return loadGlobalMcpConfig().map((s) => ({
237236
...runtimeByName.get(s.name),
238237
name: s.name,
239-
disabled: getGlobalMcpDisabledState(s.name),
238+
enabled: s.enabled !== false,
240239
source: 'global' as const,
241240
})) as McpStatus[];
242241
}
@@ -245,7 +244,11 @@ export function createDirectSettingsClient(rt: AppRuntime): SettingsClient {
245244
const globalNames = new Set(globalServers.map((s) => s.name));
246245
const seen = new Set<string>();
247246
const result: Array<
248-
McpStatus & { source: 'global' | 'project'; hasProjectOverride?: boolean }
247+
McpStatus & {
248+
enabled: boolean;
249+
source: 'global' | 'project';
250+
hasProjectOverride?: boolean;
251+
}
249252
> = [];
250253
for (const s of projectServers) {
251254
seen.add(s.name);
@@ -261,7 +264,7 @@ export function createDirectSettingsClient(rt: AppRuntime): SettingsClient {
261264
toolCount: 0,
262265
}),
263266
name: s.name,
264-
disabled: r?.disabled ?? false,
267+
enabled: s.enabled !== false,
265268
source: 'project',
266269
hasProjectOverride: isFromGlobal,
267270
});
@@ -279,32 +282,19 @@ export function createDirectSettingsClient(rt: AppRuntime): SettingsClient {
279282
toolCount: 0,
280283
}),
281284
name: s.name,
282-
disabled: r?.disabled ?? false,
285+
enabled: s.enabled !== false,
283286
source: 'global',
284287
});
285288
}
286289
return result as McpStatus[];
287290
},
288291

289-
async setMcpDisabled({ name, disabled, cwd }) {
290-
const projectCwd = resolveCwd(cwd);
292+
async setMcpEnabled({ name, enabled, cwd }) {
291293
if (isGlobalCwd(cwd)) {
292-
setGlobalMcpDisabledState(name, disabled);
294+
setGlobalMcpServerEnabled(name, enabled);
293295
} else {
294-
setProjectMcpDisabledState(projectCwd, name, disabled);
296+
setProjectMcpServerEnabled(resolveCwd(cwd), name, enabled);
295297
}
296-
await rt.runPromise(
297-
Effect.gen(function* () {
298-
const mcp = yield* McpService;
299-
return yield* disabled
300-
? mcp.disable(projectCwd, name)
301-
: mcp.enable(projectCwd, name);
302-
})
303-
);
304-
},
305-
306-
async resetMcpDisabled({ name, cwd }) {
307-
resetProjectMcpDisabledState(cwd, name);
308298
},
309299

310300
async createMcpServer({ cwd, server }) {
@@ -344,17 +334,8 @@ export function createDirectSettingsClient(rt: AppRuntime): SettingsClient {
344334
hooksDelete(cwd, name);
345335
},
346336

347-
async setHookDisabled({ cwd, name, disabled }) {
348-
if (isGlobalCwd(cwd)) {
349-
setGlobalHookDisabledState(name, disabled);
350-
} else {
351-
setProjectHookDisabledState(cwd, name, disabled);
352-
}
353-
hooksSetDisabled(cwd, name, disabled);
354-
},
355-
356-
async resetHookDisabled({ name, cwd }) {
357-
resetProjectHookDisabledState(cwd, name);
337+
async setHookEnabled({ cwd, name, enabled }) {
338+
hooksSetEnabled(cwd, name, enabled);
358339
},
359340

360341
async getGlobalPermissionMode(input: {

0 commit comments

Comments
 (0)