Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions apps/server/src/mcp/McpHttpServer.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import * as RequestLog from "../persistence/McpRequestLog.ts";
import * as McpClientThreads from "../persistence/McpClientThreads.ts";
import * as ThreadLaunchMcp from "./ThreadLaunchMcpService.ts";
import * as ThreadRoles from "../persistence/ThreadRoles.ts";
import * as LaunchPresets from "../persistence/LaunchPresets.ts";
import * as Orchestrator from "../orchestration-v2/Orchestrator.ts";
import * as ProjectionStore from "../orchestration-v2/ProjectionStore.ts";
import * as ThreadManagementService from "../orchestration-v2/ThreadManagementService.ts";
Expand Down Expand Up @@ -310,6 +312,8 @@ const layerRecordingTools = (calls: Array<unknown>) => {
Layer.mock(OrchestratorMcpService.OrchestratorMcpService)({}),
Layer.mock(McpClientThreads.McpClientThreads)({}),
Layer.mock(ThreadLaunchMcp.ThreadLaunchMcpService)({}),
Layer.mock(ThreadRoles.ThreadRoles)({}),
Layer.mock(LaunchPresets.LaunchPresets)({}),
Layer.mock(ProjectService.ProjectService)({}),
Layer.mock(ThreadLaunchService.ThreadLaunchService)({}),
Layer.mock(ManagedProjectFolders.ManagedProjectFolders)({
Expand Down
17 changes: 16 additions & 1 deletion apps/server/src/mcp/McpHttpServer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ import * as ThreadLaunchMcp from "./ThreadLaunchMcpService.ts";
import * as AgentRegistry from "../persistence/AgentRegistry.ts";
import * as McpClientThreads from "../persistence/McpClientThreads.ts";
import * as WorkLedger from "../persistence/WorkLedger.ts";
import * as ThreadRoles from "../persistence/ThreadRoles.ts";
import * as LaunchPresets from "../persistence/LaunchPresets.ts";
import { PresetToolkit } from "./toolkits/preset/tools.ts";
import * as PresetHandlers from "./toolkits/preset/handlers.ts";
import { LedgerToolkit } from "./toolkits/ledger/tools.ts";
import * as LedgerHandlers from "./toolkits/ledger/handlers.ts";
import * as Cause from "effect/Cause";
Expand Down Expand Up @@ -1391,8 +1395,13 @@ export const layerOrchestratorToolkit = toolkitRegistration(

export const layerLedgerToolkit = toolkitRegistration(LedgerToolkit, LedgerHandlers.layer);

export const layerPresetToolkit = toolkitRegistration(PresetToolkit, PresetHandlers.layer).pipe(
Layer.provide(LaunchPresets.layer),
);

export const layerThreadToolkit = toolkitRegistration(ThreadToolkit, ThreadHandlers.layer).pipe(
Layer.provide(PendingApproval.layer),
Layer.provide(ThreadRoles.layer),
);

const layerWorktreeToolkitRegistration = toolkitRegistration(
Expand All @@ -1413,7 +1422,10 @@ const layerEnvironmentToolkit = toolkitRegistration(
export const layerProjectRegistration = toolkitRegistration(
ProjectToolkit,
ProjectHandlers.layer,
).pipe(Layer.provide(ThreadLaunchMcp.layer));
).pipe(
Layer.provide(ThreadLaunchMcp.layer),
Layer.provide(Layer.mergeAll(ThreadRoles.layer, LaunchPresets.layer)),
);

export const layerAttachmentToolkit = toolkitRegistration(
AttachmentToolkit,
Expand Down Expand Up @@ -1488,6 +1500,7 @@ export const layerTools = Layer.mergeAll(
Layer.provide(BridgeStatusService.layer),
),
layerLedgerToolkit,
layerPresetToolkit,
layerPreviewToolkit,
layerOrchestratorToolkit,
layerThreadToolkit,
Expand Down Expand Up @@ -1565,6 +1578,8 @@ export const layer = Layer.merge(
).pipe(
Layer.provide(layerEvents),
Layer.provide(WorkLedger.layer),
Layer.provide(ThreadRoles.layer),
Layer.provide(LaunchPresets.layer),
Layer.provide(McpClientThreads.layer),
Layer.provide(McpBridgeMetrics.layer),
Layer.provide(McpRequestLog.layer),
Expand Down
8 changes: 8 additions & 0 deletions apps/server/src/mcp/McpInvocationContext.ts
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,14 @@ export const messageSenderFor = (scope: McpInvocationScope) => {
};
};

/** Who changed something, as ADR 0013 names a sender: a thread, or the first 8 characters of a session and its label. */
export const actorLabel = (scope: McpInvocationScope) =>
scope.thread !== undefined
? `thread ${scope.thread.threadId}`
: scope.client === undefined
? "mcp"
: `${scope.client.sessionId.slice(0, 8)} (${scope.client.label})`;

/** The command actor for an MCP call: an agent in a thread, or an outside sign-in. */
export const mcpCommandActor = (scope: McpInvocationScope): CommandActor["Service"] => ({
kind: scope.thread === undefined ? "mcp_client" : "agent",
Expand Down
Loading
Loading