refactor(ts): complete legacy host removal — drop fastify/commander/zod, delete MCP SDK server, remove ManagedRuntime facades

Finishes the remaining EFFECT_NATIVE_REWRITE_PLAN stages in one verified slice:
- fastify, @fastify/websocket, commander, zod removed from all package manifests
- legacy @modelcontextprotocol/sdk stdio server deleted; effect/unstable/ai McpServer is canonical
- no ManagedRuntime or Effect.runPromise program facades remain in production source
- gateway server/rpc-contract and client rpc/socket moved onto Effect v4 native http/rpc/socket layers

Gates (force-run, no cache): check:tsgo, build, test (96 tests / 11 tasks) all green.
Native-class inventory: zero blocking production classes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
elpresidank 2026-06-11 06:29:29 -05:00
parent a26463afc1
commit cf12defcd8
30 changed files with 1506 additions and 456 deletions

View file

@ -10,21 +10,11 @@
"qa:browser": "playwright test"
},
"dependencies": {
"@effect/ai-anthropic": "4.0.0-beta.78",
"@effect/ai-openai": "4.0.0-beta.78",
"@effect/ai-openrouter": "4.0.0-beta.78",
"@effect/atom-react": "4.0.0-beta.78",
"@effect/openapi-generator": "4.0.0-beta.78",
"@effect/opentelemetry": "4.0.0-beta.78",
"@effect/platform-browser": "4.0.0-beta.78",
"@effect/platform-bun": "4.0.0-beta.78",
"@effect/platform-node": "4.0.0-beta.78",
"@effect/platform-node-shared": "4.0.0-beta.78",
"@effect/tsgo": "0.14.0",
"@effect/vitest": "4.0.0-beta.78",
"@tanstack/react-query": "^5.75.0",
"@trustgraph/client": "workspace:*",
"clsx": "^2.1.0",
"effect": "4.0.0-beta.78",
"lucide-react": "^0.513.0",
"react": "^19.1.0",
"react-dom": "^19.1.0",
@ -32,8 +22,7 @@
"react-force-graph-2d": "^1.29.1",
"react-markdown": "^10.1.0",
"react-router": "^7.6.0",
"tailwind-merge": "^3.3.0",
"zustand": "^5.0.0"
"tailwind-merge": "^3.3.0"
},
"devDependencies": {
"@effect/vitest": "4.0.0-beta.78",

File diff suppressed because it is too large Load diff

View file

@ -20,12 +20,12 @@ export function NotificationToasts() {
if (notifications.length === 0) return null;
return (
<div className="fixed bottom-4 right-4 z-50 flex flex-col gap-2" aria-live="polite">
<div className="pointer-events-none fixed bottom-4 right-4 z-50 flex flex-col gap-2" aria-live="polite">
{notifications.map((n) => (
<div
key={n.id}
className={cn(
"flex items-start gap-2 rounded-lg border px-4 py-3 text-sm shadow-lg",
"pointer-events-none flex items-start gap-2 rounded-lg border px-4 py-3 text-sm shadow-lg",
typeStyles[n.type],
)}
>
@ -37,7 +37,7 @@ export function NotificationToasts() {
</div>
<button
onClick={() => removeNotification(n.id)}
className="shrink-0 opacity-60 hover:opacity-100"
className="pointer-events-auto shrink-0 opacity-60 hover:opacity-100"
aria-label="Dismiss notification"
>
<X className="h-3.5 w-3.5" />

View file

@ -266,8 +266,10 @@ export default function SettingsPage() {
</button>
<button
onClick={() => {
if (collectionForm.id.trim().length === 0) return;
const collectionId = collectionForm.id.trim();
if (collectionId.length === 0) return;
createCollection(collectionForm);
setField({ key: "collection", value: collectionId });
setCollectionForm({ id: "", name: "", description: "", tags: "", submitting: false });
setCreateOpen(false);
}}

View file

@ -8,6 +8,7 @@ import {
type Settings,
type WorkbenchApiFactory,
} from "@/atoms/workbench";
import type { BaseApi } from "@trustgraph/client";
import { makeMockBaseApi, qaSettingsFromFixture, type MockWorkbenchFixture } from "@/qa/mock-api";
export interface WorkbenchQaWindowConfig {
@ -19,6 +20,7 @@ export interface WorkbenchQaWindowConfig {
declare global {
interface Window {
__TRUSTGRAPH_WORKBENCH_QA__?: WorkbenchQaWindowConfig;
__TRUSTGRAPH_WORKBENCH_QA_API__?: BaseApi;
}
}
@ -43,6 +45,7 @@ export function getWorkbenchQaInitialValues(): Iterable<readonly [Atom.Atom<unkn
const apiFactory: WorkbenchApiFactory = {
create: () => api,
};
window.__TRUSTGRAPH_WORKBENCH_QA_API__ = api;
return [
[apiFactoryAtom as Atom.Atom<unknown>, apiFactory],
[settingsAtom as Atom.Atom<unknown>, qaSettings(fixture)],

View file

@ -25,19 +25,21 @@ export default defineConfig({
"@": path.resolve(__dirname, "./src"),
},
},
server: {
proxy: {
"/api/v1/rpc": {
target: "ws://localhost:8088/",
ws: true,
server: isWorkbenchQa
? {}
: {
proxy: {
"/api/v1/rpc": {
target: "ws://localhost:8088/",
ws: true,
},
"/api/v1": {
target: "http://localhost:8088/",
},
"/otel": {
target: "http://localhost:4328/",
rewrite: (p) => p.replace(/^\/otel/, ""),
},
},
},
"/api/v1": {
target: "http://localhost:8088/",
},
"/otel": {
target: "http://localhost:4328/",
rewrite: (p) => p.replace(/^\/otel/, ""),
},
},
},
});