feat(agent): unify MCP tools and adopt Responses delivery

Move project and host queries into native MCP with host-owned OAuth/context,
while retaining memory, skills, actions and publication plugins. Add nearby-model
queries and explicit chat/task/learning model defaults.

Adopt Responses HTTP/SSE and native steer/queue inbox delivery, preserving scoped
session ownership, pending input edits and investigation communication.

Disable local-provider discovery: Server /health allowed native vLLM to probe
/v1/models on port 8000. A native before/after regression prevents recurrence.

Validation: 170 focused Bun tests; service/plugin typechecks; native discovery,
provider-discovery and input-inbox smoke checks; no paid model inference.
This commit is contained in:
2026-10-19 18:46:58 +08:00
parent f5c3cde2c2
commit 6a49d2209e
164 changed files with 12286 additions and 2368 deletions
+20 -5
View File
@@ -1,4 +1,4 @@
import { Router } from "express";
import { Router, type NextFunction, type Request, type Response } from "express";
import { agentModelOptions, resolveDefaultModel } from "../chat/models.js";
import { type ChatSessionBridge } from "../chat/sessionBridge.js";
@@ -7,9 +7,9 @@ import { type FrontendActionCoordinator } from "../frontendAction/coordinator.js
import { frontendActionRegistryResponse } from "../frontendAction/registry.js";
import { type LearningOrchestrator } from "../learning/orchestrator.js";
import { type MemoryStore } from "../memory/store.js";
import { type ResultReferenceResolver } from "../results/resolver.js";
import { type OpencodeRuntimeAdapter } from "../runtime/opencode.js";
import { type SessionMetadataStore } from "../sessions/metadataStore.js";
import { SessionContextMismatchError } from "../sessions/metadataStore.js";
import { type SessionTranscriptStore } from "../sessions/transcriptStore.js";
import { type SessionUiStateStore } from "../sessions/uiStateStore.js";
import { uiRegistryResponse } from "../uiEnvelope/registry.js";
@@ -23,13 +23,17 @@ import { registerChatInteractionRoutes } from "./chatInteractionRoutes.js";
import { createChatRunState } from "./chatRunState.js";
import { registerChatSessionRoutes } from "./chatSessionRoutes.js";
import { registerChatStreamRoute } from "./chatStreamRoute.js";
import { registerResponseInputRoutes } from "./response-input-routes.js";
import { registerMcpStatusRoutes } from "./mcpRoutes.js";
import { registerChatSuggestionRoutes } from "./chatSuggestionRoutes.js";
import { registerAgentMessageRoutes } from "./agent-message-routes.js";
import type { AgentMessageCoordinator } from "../chat/agent-message-coordinator.js";
export type BuildChatRouterOptions = {
agentMessages?: AgentMessageCoordinator;
frontendActionCoordinator: FrontendActionCoordinator;
learningOrchestrator: LearningOrchestrator;
memoryStore: MemoryStore;
resultReferenceResolver: ResultReferenceResolver;
runtime: OpencodeRuntimeAdapter;
sessionBridge: ChatSessionBridge;
sessionMetadataStore: SessionMetadataStore;
@@ -44,12 +48,12 @@ export const buildChatRouter = (options: BuildChatRouterOptions) => {
frontendActionCoordinator,
learningOrchestrator,
memoryStore,
resultReferenceResolver,
runtime,
sessionBridge,
sessionMetadataStore,
sessionTranscriptStore,
sessionUiStateStore,
agentMessages,
} = options;
const chatRouter = Router();
const { activeRuns, lastRunStatuses } = runState;
@@ -125,6 +129,7 @@ export const buildChatRouter = (options: BuildChatRouterOptions) => {
});
registerChatSessionRoutes(chatRouter, {
learningOrchestrator,
frontendActionCoordinator,
runState,
runtime,
@@ -134,11 +139,12 @@ export const buildChatRouter = (options: BuildChatRouterOptions) => {
sessionUiStateStore,
});
registerMcpStatusRoutes(chatRouter, { sessionMetadataStore, runtime });
registerChatSuggestionRoutes(chatRouter, runtime);
if (agentMessages) registerAgentMessageRoutes(chatRouter, { sessions: sessionMetadataStore, messages: agentMessages });
registerChatAuxiliaryRoutes(chatRouter, {
activeRuns,
lastRunStatuses,
resultReferenceResolver,
sessionBridge,
sessionMetadataStore,
sessionUiStateStore,
@@ -152,7 +158,9 @@ export const buildChatRouter = (options: BuildChatRouterOptions) => {
sessionUiStateStore,
});
registerResponseInputRoutes(chatRouter, { runtime, sessionMetadataStore, runState });
registerChatStreamRoute(chatRouter, {
agentMessages,
frontendActionCoordinator,
learningOrchestrator,
memoryStore,
@@ -164,5 +172,12 @@ export const buildChatRouter = (options: BuildChatRouterOptions) => {
sessionUiStateStore,
});
chatRouter.use((error: unknown, _req: Request, res: Response, next: NextFunction) => {
if (error instanceof SessionContextMismatchError && !res.headersSent) {
res.status(404).json({ message: "session not found" });
return;
}
next(error);
});
return chatRouter;
};