From 74955d604198d856a28e6bc50345eb3a052239d5 Mon Sep 17 00:00:00 2001 From: elpresidank Date: Tue, 2 Jun 2026 02:34:03 -0500 Subject: [PATCH] Use native runtimes for flow entrypoints --- ts/EFFECT_NATIVE_REWRITE_AUDIT.md | 37 +++++++++++++++++-- ts/packages/flow/src/agent/mcp-tool/index.ts | 2 +- .../flow/src/agent/mcp-tool/service.ts | 11 +++++- ts/packages/flow/src/chunking/service.ts | 11 +++++- ts/packages/flow/src/decoding/pdf-decoder.ts | 11 +++++- ts/packages/flow/src/embeddings/ollama.ts | 11 +++++- .../flow/src/extract/knowledge-extract.ts | 11 +++++- ts/packages/flow/src/gateway/server.ts | 11 +++++- .../src/model/text-completion/azure-openai.ts | 11 +++++- .../flow/src/model/text-completion/claude.ts | 11 +++++- .../flow/src/model/text-completion/mistral.ts | 11 +++++- .../flow/src/model/text-completion/ollama.ts | 11 +++++- .../text-completion/openai-compatible.ts | 11 +++++- .../flow/src/model/text-completion/openai.ts | 11 +++++- ts/packages/flow/src/prompt/template.ts | 11 +++++- .../query/embeddings/qdrant-doc-service.ts | 11 +++++- .../query/embeddings/qdrant-graph-service.ts | 11 +++++- .../src/query/triples/falkordb-service.ts | 11 +++++- .../embeddings/graph-embeddings-service.ts | 11 +++++- .../src/storage/triples/falkordb-service.ts | 11 +++++- ts/scripts/run-chunker.ts | 7 +--- ts/scripts/run-doc-embeddings-query.ts | 7 +--- ts/scripts/run-embeddings.ts | 7 +--- ts/scripts/run-extractor.ts | 7 +--- ts/scripts/run-gateway.ts | 7 +--- ts/scripts/run-graph-embeddings-query.ts | 7 +--- ts/scripts/run-graph-embeddings-store.ts | 7 +--- ts/scripts/run-llm-azure-openai.ts | 7 +--- ts/scripts/run-llm-claude.ts | 7 +--- ts/scripts/run-llm-mistral.ts | 7 +--- ts/scripts/run-llm-openai-compatible.ts | 7 +--- ts/scripts/run-llm-openai.ts | 7 +--- ts/scripts/run-mcp-tool.ts | 11 +----- ts/scripts/run-ollama.ts | 7 +--- ts/scripts/run-pdf-decoder.ts | 7 +--- ts/scripts/run-prompt.ts | 7 +--- ts/scripts/run-triples-query.ts | 7 +--- ts/scripts/run-triples-store.ts | 7 +--- 38 files changed, 233 insertions(+), 134 deletions(-) diff --git a/ts/EFFECT_NATIVE_REWRITE_AUDIT.md b/ts/EFFECT_NATIVE_REWRITE_AUDIT.md index e61312b8..b4a4140a 100644 --- a/ts/EFFECT_NATIVE_REWRITE_AUDIT.md +++ b/ts/EFFECT_NATIVE_REWRITE_AUDIT.md @@ -12,12 +12,12 @@ Verified source roots: - Effect v4 subtree: `/home/elpresidank/YeeBois/projects/beep-effect2/.repos/effect-v4` - Installed Effect beta used by this workspace: `ts/node_modules/effect` -Current signal counts from `ts/packages` after the 2026-06-02 Client socket -tagged error slice: +Current signal counts from `ts/packages` after the 2026-06-02 Service +entrypoint runtime slice: | Signal | Count | | --- | ---: | -| `Effect.runPromise` | 203 | +| `Effect.runPromise` | 185 | | `Map<` | 88 | | `WebSocket` | 72 | | `new Map` | 62 | @@ -58,6 +58,10 @@ Notes: `trustgraph-socket.ts` normal `Error`, raw `JSON.parse`, and listener `try`/`catch` matches. The remaining client socket modernization signal is the shared `newableFactory` constructor assertion pattern. +- The service entrypoint runtime slice dropped the `Effect.runPromise` count by + replacing remaining flow service `run()` program facades with + `ManagedRuntime` and routing local `ts/scripts/run-*` launchers through + `runMain()`/`NodeRuntime.runMain`. - `Record` and `throwLibrarianServiceError` are now clean in `ts/packages`. @@ -457,6 +461,30 @@ Notes: - Current client/root verification from the tagged error slice covers this no-op decision. +### 2026-06-02: Service Entrypoint Runtime Slice + +- Status: migrated and root-verified. +- Completed: + - Remaining flow service `run(): Promise` program facades now use + `ManagedRuntime.make(Layer.empty)` instead of direct + `Effect.runPromise(program)`. + - Remaining flow service modules now expose `runMain()` through + `NodeRuntime.runMain(program)`. + - Local `ts/scripts/run-*` launchers for gateway, prompt, chunker, + extractor, PDF decoder, embeddings, triples, graph/document embeddings, + text-completion providers, and MCP tool service now delegate directly to + `runMain()`. + - Direct `Effect.runPromise(program)` matches in `ts/packages/flow/src` are + clean. Remaining `Effect.runPromise` matches are callback/Promise + compatibility boundaries for later slices. +- Verification: + - `bun run --cwd ts/packages/flow build` + - `git diff --check` + - `cd ts && bun run check` + - `bun run --cwd ts/packages/flow test` + - `cd ts && bun run build` + - `cd ts && bun run test` + ## Subagent Findings To Preserve - MCP/workbench: @@ -470,6 +498,9 @@ Notes: ref-backed state slices are complete. Follow-up service work should focus on scoped layers, schedules where polling semantics allow, and managed persistence providers rather than direct mutable service fields. + - Flow service startup facades now consistently use `ManagedRuntime`, and + local scripts should delegate to `runMain()` instead of adding local + `.catch(console.error/process.exit)` wrappers. - Persistence IO should move toward `FileSystem` or `KeyValueStore` where the installed beta has the needed provider surface. - Base messaging/processors: diff --git a/ts/packages/flow/src/agent/mcp-tool/index.ts b/ts/packages/flow/src/agent/mcp-tool/index.ts index 1b57848d..312f1ef1 100644 --- a/ts/packages/flow/src/agent/mcp-tool/index.ts +++ b/ts/packages/flow/src/agent/mcp-tool/index.ts @@ -1 +1 @@ -export { McpToolService, run } from "./service.js"; +export { McpToolService, run, runMain } from "./service.js"; diff --git a/ts/packages/flow/src/agent/mcp-tool/service.ts b/ts/packages/flow/src/agent/mcp-tool/service.ts index 32ffeb82..836788ee 100644 --- a/ts/packages/flow/src/agent/mcp-tool/service.ts +++ b/ts/packages/flow/src/agent/mcp-tool/service.ts @@ -12,6 +12,7 @@ import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"; +import { NodeRuntime } from "@effect/platform-node"; import { makeFlowProcessor, @@ -29,7 +30,7 @@ import { type MessagingDeliveryError, type Spec, } from "@trustgraph/base"; -import { Context, Effect, Layer, Ref } from "effect"; +import { Context, Effect, Layer, ManagedRuntime, Ref } from "effect"; import * as O from "effect/Option"; import * as S from "effect/Schema"; @@ -315,6 +316,12 @@ export const program = makeFlowProcessorProgram McpToolRuntimeLive, }); +const mcpToolRuntime = ManagedRuntime.make(Layer.empty); + export function run(): Promise { - return Effect.runPromise(program); + return mcpToolRuntime.runPromise(program); +} + +export function runMain(): void { + NodeRuntime.runMain(program); } diff --git a/ts/packages/flow/src/chunking/service.ts b/ts/packages/flow/src/chunking/service.ts index a50c750b..d00b8407 100644 --- a/ts/packages/flow/src/chunking/service.ts +++ b/ts/packages/flow/src/chunking/service.ts @@ -24,8 +24,9 @@ import { type Triples, type Spec, } from "@trustgraph/base"; +import { NodeRuntime } from "@effect/platform-node"; import { makeFlowProcessorProgram } from "@trustgraph/base"; -import { Effect } from "effect"; +import { Effect, Layer, ManagedRuntime } from "effect"; import { recursiveSplit } from "./recursive-splitter.js"; const DEFAULT_CHUNK_SIZE = 2000; @@ -102,6 +103,12 @@ export const program = makeFlowProcessorProgram({ specs: () => makeChunkingSpecs(), }); +const chunkingRuntime = ManagedRuntime.make(Layer.empty); + export function run(): Promise { - return Effect.runPromise(program); + return chunkingRuntime.runPromise(program); +} + +export function runMain(): void { + NodeRuntime.runMain(program); } diff --git a/ts/packages/flow/src/decoding/pdf-decoder.ts b/ts/packages/flow/src/decoding/pdf-decoder.ts index 6055be37..e588549b 100644 --- a/ts/packages/flow/src/decoding/pdf-decoder.ts +++ b/ts/packages/flow/src/decoding/pdf-decoder.ts @@ -36,8 +36,9 @@ import { type Spec, errorMessage, } from "@trustgraph/base"; +import { NodeRuntime } from "@effect/platform-node"; import { makeFlowProcessorProgram } from "@trustgraph/base"; -import { Clock, Effect } from "effect"; +import { Clock, Effect, Layer, ManagedRuntime } from "effect"; import * as S from "effect/Schema"; export class PdfDecoderError extends S.TaggedErrorClass()( @@ -252,6 +253,12 @@ export const program = makeFlowProcessorProgram({ specs: () => makePdfDecoderSpecs(), }); +const pdfDecoderRuntime = ManagedRuntime.make(Layer.empty); + export function run(): Promise { - return Effect.runPromise(program); + return pdfDecoderRuntime.runPromise(program); +} + +export function runMain(): void { + NodeRuntime.runMain(program); } diff --git a/ts/packages/flow/src/embeddings/ollama.ts b/ts/packages/flow/src/embeddings/ollama.ts index 3413cdca..598903a6 100644 --- a/ts/packages/flow/src/embeddings/ollama.ts +++ b/ts/packages/flow/src/embeddings/ollama.ts @@ -4,7 +4,8 @@ * Python reference: trustgraph-flow/trustgraph/embeddings/ollama/processor.py */ -import { Config, Effect, Layer } from "effect"; +import { NodeRuntime } from "@effect/platform-node"; +import { Config, Effect, Layer, ManagedRuntime } from "effect"; import * as O from "effect/Option"; import * as S from "effect/Schema"; import { @@ -154,6 +155,12 @@ export const program = makeFlowProcessorProgram OllamaEmbeddingsLive(config), }); +const ollamaEmbeddingsRuntime = ManagedRuntime.make(Layer.empty); + export function run(): Promise { - return Effect.runPromise(program); + return ollamaEmbeddingsRuntime.runPromise(program); +} + +export function runMain(): void { + NodeRuntime.runMain(program); } diff --git a/ts/packages/flow/src/extract/knowledge-extract.ts b/ts/packages/flow/src/extract/knowledge-extract.ts index 43808a5b..e3f403bd 100644 --- a/ts/packages/flow/src/extract/knowledge-extract.ts +++ b/ts/packages/flow/src/extract/knowledge-extract.ts @@ -34,7 +34,8 @@ import { type EffectRequestResponse, type Spec, } from "@trustgraph/base"; -import { Effect } from "effect"; +import { NodeRuntime } from "@effect/platform-node"; +import { Effect, Layer, ManagedRuntime } from "effect"; import * as O from "effect/Option"; import * as S from "effect/Schema"; @@ -386,6 +387,12 @@ export const program = makeFlowProcessorProgram({ specs: () => makeKnowledgeExtractSpecs(), }); +const knowledgeExtractRuntime = ManagedRuntime.make(Layer.empty); + export function run(): Promise { - return Effect.runPromise(program); + return knowledgeExtractRuntime.runPromise(program); +} + +export function runMain(): void { + NodeRuntime.runMain(program); } diff --git a/ts/packages/flow/src/gateway/server.ts b/ts/packages/flow/src/gateway/server.ts index f2943fe5..7c17a89a 100644 --- a/ts/packages/flow/src/gateway/server.ts +++ b/ts/packages/flow/src/gateway/server.ts @@ -9,7 +9,8 @@ import Fastify, { type FastifyReply } from "fastify"; import websocketPlugin from "@fastify/websocket"; -import { Clock, Config, Effect, Exit, Random, Scope } from "effect"; +import { NodeRuntime } from "@effect/platform-node"; +import { Clock, Config, Effect, Exit, Layer, ManagedRuntime, Random, Scope } from "effect"; import * as O from "effect/Option"; import * as RpcSerialization from "effect/unstable/rpc/RpcSerialization"; import * as EffectSocket from "effect/unstable/socket/Socket"; @@ -258,7 +259,11 @@ function headersFrom(headers: Record { - return Effect.runPromise(program); + return gatewayRuntime.runPromise(program); +} + +export function runMain(): void { + NodeRuntime.runMain(program); } export const loadGatewayConfig = Effect.fn("loadGatewayConfig")(function* () { @@ -291,3 +296,5 @@ export const program = Effect.scoped( return yield* Effect.never; }), ); + +const gatewayRuntime = ManagedRuntime.make(Layer.empty); diff --git a/ts/packages/flow/src/model/text-completion/azure-openai.ts b/ts/packages/flow/src/model/text-completion/azure-openai.ts index b6112e23..6e02c045 100644 --- a/ts/packages/flow/src/model/text-completion/azure-openai.ts +++ b/ts/packages/flow/src/model/text-completion/azure-openai.ts @@ -9,6 +9,7 @@ */ import { AzureOpenAI } from "openai"; +import { NodeRuntime } from "@effect/platform-node"; import { Llm, makeLlmService, @@ -20,7 +21,7 @@ import { type LlmResult, type LlmChunk, } from "@trustgraph/base"; -import { Effect, Layer, Stream } from "effect"; +import { Effect, Layer, ManagedRuntime, Stream } from "effect"; import { optionalStringConfig, providerStatusError, @@ -229,6 +230,12 @@ export const program = makeFlowProcessorProgram({ ), }); +const azureOpenAITextCompletionRuntime = ManagedRuntime.make(Layer.empty); + export function run(): Promise { - return Effect.runPromise(program); + return azureOpenAITextCompletionRuntime.runPromise(program); +} + +export function runMain(): void { + NodeRuntime.runMain(program); } diff --git a/ts/packages/flow/src/model/text-completion/claude.ts b/ts/packages/flow/src/model/text-completion/claude.ts index 786ebcfe..8d00486e 100644 --- a/ts/packages/flow/src/model/text-completion/claude.ts +++ b/ts/packages/flow/src/model/text-completion/claude.ts @@ -5,6 +5,7 @@ */ import Anthropic from "@anthropic-ai/sdk"; +import { NodeRuntime } from "@effect/platform-node"; import { Llm, makeLlmService, @@ -16,7 +17,7 @@ import { type LlmResult, type LlmChunk, } from "@trustgraph/base"; -import { Effect, Layer, Stream } from "effect"; +import { Effect, Layer, ManagedRuntime, Stream } from "effect"; import { optionalStringConfig, providerStatusError, @@ -209,6 +210,12 @@ export const program = makeFlowProcessorProgram({ ), }); +const claudeTextCompletionRuntime = ManagedRuntime.make(Layer.empty); + export function run(): Promise { - return Effect.runPromise(program); + return claudeTextCompletionRuntime.runPromise(program); +} + +export function runMain(): void { + NodeRuntime.runMain(program); } diff --git a/ts/packages/flow/src/model/text-completion/mistral.ts b/ts/packages/flow/src/model/text-completion/mistral.ts index 90d33c0b..e9633467 100644 --- a/ts/packages/flow/src/model/text-completion/mistral.ts +++ b/ts/packages/flow/src/model/text-completion/mistral.ts @@ -7,6 +7,7 @@ */ import { Mistral } from "@mistralai/mistralai"; +import { NodeRuntime } from "@effect/platform-node"; import { Llm, makeLlmService, @@ -18,7 +19,7 @@ import { type LlmResult, type LlmChunk, } from "@trustgraph/base"; -import { Effect, Layer, Stream } from "effect"; +import { Effect, Layer, ManagedRuntime, Stream } from "effect"; import { optionalStringConfig, providerStatusError, @@ -208,6 +209,12 @@ export const program = makeFlowProcessorProgram({ ), }); +const mistralTextCompletionRuntime = ManagedRuntime.make(Layer.empty); + export function run(): Promise { - return Effect.runPromise(program); + return mistralTextCompletionRuntime.runPromise(program); +} + +export function runMain(): void { + NodeRuntime.runMain(program); } diff --git a/ts/packages/flow/src/model/text-completion/ollama.ts b/ts/packages/flow/src/model/text-completion/ollama.ts index 7358f3af..d27abaeb 100644 --- a/ts/packages/flow/src/model/text-completion/ollama.ts +++ b/ts/packages/flow/src/model/text-completion/ollama.ts @@ -7,6 +7,7 @@ */ import { Ollama } from "ollama"; +import { NodeRuntime } from "@effect/platform-node"; import { Llm, makeLlmService, @@ -18,7 +19,7 @@ import { type LlmResult, type LlmChunk, } from "@trustgraph/base"; -import { Effect, Layer, Stream } from "effect"; +import { Effect, Layer, ManagedRuntime, Stream } from "effect"; import { optionalStringConfig, providerRuntimeError, @@ -187,6 +188,12 @@ export const program = makeFlowProcessorProgram({ ), }); +const ollamaTextCompletionRuntime = ManagedRuntime.make(Layer.empty); + export function run(): Promise { - return Effect.runPromise(program); + return ollamaTextCompletionRuntime.runPromise(program); +} + +export function runMain(): void { + NodeRuntime.runMain(program); } diff --git a/ts/packages/flow/src/model/text-completion/openai-compatible.ts b/ts/packages/flow/src/model/text-completion/openai-compatible.ts index 2a36377c..d5762dea 100644 --- a/ts/packages/flow/src/model/text-completion/openai-compatible.ts +++ b/ts/packages/flow/src/model/text-completion/openai-compatible.ts @@ -10,6 +10,7 @@ */ import OpenAI from "openai"; +import { NodeRuntime } from "@effect/platform-node"; import { Llm, makeLlmService, @@ -21,7 +22,7 @@ import { type LlmResult, type LlmChunk, } from "@trustgraph/base"; -import { Effect, Layer, Stream } from "effect"; +import { Effect, Layer, ManagedRuntime, Stream } from "effect"; import { optionalStringConfig, providerStatusError, @@ -220,6 +221,12 @@ export const program = makeFlowProcessorProgram({ ), }); +const openAICompatibleTextCompletionRuntime = ManagedRuntime.make(Layer.empty); + export function run(): Promise { - return Effect.runPromise(program); + return openAICompatibleTextCompletionRuntime.runPromise(program); +} + +export function runMain(): void { + NodeRuntime.runMain(program); } diff --git a/ts/packages/flow/src/model/text-completion/openai.ts b/ts/packages/flow/src/model/text-completion/openai.ts index b4885448..a6530b39 100644 --- a/ts/packages/flow/src/model/text-completion/openai.ts +++ b/ts/packages/flow/src/model/text-completion/openai.ts @@ -5,6 +5,7 @@ */ import OpenAI from "openai"; +import { NodeRuntime } from "@effect/platform-node"; import { Llm, makeLlmService, @@ -16,7 +17,7 @@ import { type LlmResult, type LlmChunk, } from "@trustgraph/base"; -import { Effect, Layer, Stream } from "effect"; +import { Effect, Layer, ManagedRuntime, Stream } from "effect"; import { optionalStringConfig, providerStatusError, @@ -211,6 +212,12 @@ export const program = makeFlowProcessorProgram({ ), }); +const openAITextCompletionRuntime = ManagedRuntime.make(Layer.empty); + export function run(): Promise { - return Effect.runPromise(program); + return openAITextCompletionRuntime.runPromise(program); +} + +export function runMain(): void { + NodeRuntime.runMain(program); } diff --git a/ts/packages/flow/src/prompt/template.ts b/ts/packages/flow/src/prompt/template.ts index 7111878e..94f2e9e1 100644 --- a/ts/packages/flow/src/prompt/template.ts +++ b/ts/packages/flow/src/prompt/template.ts @@ -38,8 +38,9 @@ import { type PromptResponse, type Spec, } from "@trustgraph/base"; +import { NodeRuntime } from "@effect/platform-node"; import { makeFlowProcessorProgram } from "@trustgraph/base"; -import { Effect } from "effect"; +import { Effect, Layer, ManagedRuntime } from "effect"; import * as S from "effect/Schema"; export interface PromptTemplate { @@ -195,6 +196,12 @@ export const program = makeFlowProcessorProgram({ configHandlers: (config: PromptTemplateConfig) => promptTemplateRuntime(config).configHandlers, }); +const promptRuntime = ManagedRuntime.make(Layer.empty); + export function run(): Promise { - return Effect.runPromise(program); + return promptRuntime.runPromise(program); +} + +export function runMain(): void { + NodeRuntime.runMain(program); } diff --git a/ts/packages/flow/src/query/embeddings/qdrant-doc-service.ts b/ts/packages/flow/src/query/embeddings/qdrant-doc-service.ts index ee1713db..b67bbcd7 100644 --- a/ts/packages/flow/src/query/embeddings/qdrant-doc-service.ts +++ b/ts/packages/flow/src/query/embeddings/qdrant-doc-service.ts @@ -20,8 +20,9 @@ import { type DocumentEmbeddingsResponse, type Spec, } from "@trustgraph/base"; +import { NodeRuntime } from "@effect/platform-node"; import { makeFlowProcessorProgram } from "@trustgraph/base"; -import { Effect } from "effect"; +import { Effect, Layer, ManagedRuntime } from "effect"; import { QdrantDocEmbeddingsQueryLive, QdrantDocEmbeddingsQueryService, @@ -113,6 +114,12 @@ export const program = makeFlowProcessorProgram QdrantDocEmbeddingsQueryLive(config), }); +const docEmbeddingsQueryRuntime = ManagedRuntime.make(Layer.empty); + export function run(): Promise { - return Effect.runPromise(program); + return docEmbeddingsQueryRuntime.runPromise(program); +} + +export function runMain(): void { + NodeRuntime.runMain(program); } diff --git a/ts/packages/flow/src/query/embeddings/qdrant-graph-service.ts b/ts/packages/flow/src/query/embeddings/qdrant-graph-service.ts index 0a74e041..7f7354b0 100644 --- a/ts/packages/flow/src/query/embeddings/qdrant-graph-service.ts +++ b/ts/packages/flow/src/query/embeddings/qdrant-graph-service.ts @@ -20,8 +20,9 @@ import { type GraphEmbeddingsResponse, type Spec, } from "@trustgraph/base"; +import { NodeRuntime } from "@effect/platform-node"; import { makeFlowProcessorProgram } from "@trustgraph/base"; -import { Effect } from "effect"; +import { Effect, Layer, ManagedRuntime } from "effect"; import { QdrantGraphEmbeddingsQueryLive, QdrantGraphEmbeddingsQueryService, @@ -114,6 +115,12 @@ export const program = makeFlowProcessorProgram QdrantGraphEmbeddingsQueryLive(config), }); +const graphEmbeddingsQueryRuntime = ManagedRuntime.make(Layer.empty); + export function run(): Promise { - return Effect.runPromise(program); + return graphEmbeddingsQueryRuntime.runPromise(program); +} + +export function runMain(): void { + NodeRuntime.runMain(program); } diff --git a/ts/packages/flow/src/query/triples/falkordb-service.ts b/ts/packages/flow/src/query/triples/falkordb-service.ts index 5c612474..1efbecfc 100644 --- a/ts/packages/flow/src/query/triples/falkordb-service.ts +++ b/ts/packages/flow/src/query/triples/falkordb-service.ts @@ -20,8 +20,9 @@ import { type TriplesQueryResponse, type Spec, } from "@trustgraph/base"; +import { NodeRuntime } from "@effect/platform-node"; import { makeFlowProcessorProgram } from "@trustgraph/base"; -import { Effect } from "effect"; +import { Effect, Layer, ManagedRuntime } from "effect"; import { FalkorDBTriplesQueryLive, FalkorDBTriplesQueryService, @@ -100,6 +101,12 @@ export const program = makeFlowProcessorProgram FalkorDBTriplesQueryLive(config), }); +const triplesQueryRuntime = ManagedRuntime.make(Layer.empty); + export function run(): Promise { - return Effect.runPromise(program); + return triplesQueryRuntime.runPromise(program); +} + +export function runMain(): void { + NodeRuntime.runMain(program); } diff --git a/ts/packages/flow/src/storage/embeddings/graph-embeddings-service.ts b/ts/packages/flow/src/storage/embeddings/graph-embeddings-service.ts index 06c5e370..ae5a24f1 100644 --- a/ts/packages/flow/src/storage/embeddings/graph-embeddings-service.ts +++ b/ts/packages/flow/src/storage/embeddings/graph-embeddings-service.ts @@ -24,8 +24,9 @@ import { type EmbeddingsResponse, type Spec, } from "@trustgraph/base"; +import { NodeRuntime } from "@effect/platform-node"; import { makeFlowProcessorProgram } from "@trustgraph/base"; -import { Effect } from "effect"; +import { Effect, Layer, ManagedRuntime } from "effect"; import { QdrantGraphEmbeddingsStoreLive, QdrantGraphEmbeddingsStoreService, @@ -119,6 +120,12 @@ export const program = makeFlowProcessorProgram< layer: (config) => QdrantGraphEmbeddingsStoreLive(config), }); +const graphEmbeddingsStoreRuntime = ManagedRuntime.make(Layer.empty); + export function run(): Promise { - return Effect.runPromise(program); + return graphEmbeddingsStoreRuntime.runPromise(program); +} + +export function runMain(): void { + NodeRuntime.runMain(program); } diff --git a/ts/packages/flow/src/storage/triples/falkordb-service.ts b/ts/packages/flow/src/storage/triples/falkordb-service.ts index 11a5b4df..0810a4d4 100644 --- a/ts/packages/flow/src/storage/triples/falkordb-service.ts +++ b/ts/packages/flow/src/storage/triples/falkordb-service.ts @@ -17,8 +17,9 @@ import { type Triples, type Spec, } from "@trustgraph/base"; +import { NodeRuntime } from "@effect/platform-node"; import { makeFlowProcessorProgram } from "@trustgraph/base"; -import { Effect } from "effect"; +import { Effect, Layer, ManagedRuntime } from "effect"; import { FalkorDBTriplesStoreLive, FalkorDBTriplesStoreService, @@ -78,6 +79,12 @@ export const program = makeFlowProcessorProgram FalkorDBTriplesStoreLive(config), }); +const triplesStoreRuntime = ManagedRuntime.make(Layer.empty); + export function run(): Promise { - return Effect.runPromise(program); + return triplesStoreRuntime.runPromise(program); +} + +export function runMain(): void { + NodeRuntime.runMain(program); } diff --git a/ts/scripts/run-chunker.ts b/ts/scripts/run-chunker.ts index 12c2be0c..23ced4f3 100644 --- a/ts/scripts/run-chunker.ts +++ b/ts/scripts/run-chunker.ts @@ -1,6 +1,3 @@ -import { run } from "../packages/flow/src/chunking/service.js"; +import { runMain } from "../packages/flow/src/chunking/service.js"; -run().catch((err) => { - console.error("Chunking service failed:", err); - process.exit(1); -}); +runMain(); diff --git a/ts/scripts/run-doc-embeddings-query.ts b/ts/scripts/run-doc-embeddings-query.ts index 85b4ab0f..cbcf303e 100644 --- a/ts/scripts/run-doc-embeddings-query.ts +++ b/ts/scripts/run-doc-embeddings-query.ts @@ -1,6 +1,3 @@ -import { run } from "../packages/flow/src/query/embeddings/qdrant-doc-service.js"; +import { runMain } from "../packages/flow/src/query/embeddings/qdrant-doc-service.js"; -run().catch((err) => { - console.error("Document embeddings query service failed:", err); - process.exit(1); -}); +runMain(); diff --git a/ts/scripts/run-embeddings.ts b/ts/scripts/run-embeddings.ts index 174aa77f..11bfb816 100644 --- a/ts/scripts/run-embeddings.ts +++ b/ts/scripts/run-embeddings.ts @@ -1,6 +1,3 @@ -import { run } from "../packages/flow/src/embeddings/ollama.js"; +import { runMain } from "../packages/flow/src/embeddings/ollama.js"; -run().catch((err) => { - console.error("Embeddings service failed:", err); - process.exit(1); -}); +runMain(); diff --git a/ts/scripts/run-extractor.ts b/ts/scripts/run-extractor.ts index a549ed71..e5f6f14a 100644 --- a/ts/scripts/run-extractor.ts +++ b/ts/scripts/run-extractor.ts @@ -1,6 +1,3 @@ -import { run } from "../packages/flow/src/extract/knowledge-extract.js"; +import { runMain } from "../packages/flow/src/extract/knowledge-extract.js"; -run().catch((err) => { - console.error("Knowledge extract service failed:", err); - process.exit(1); -}); +runMain(); diff --git a/ts/scripts/run-gateway.ts b/ts/scripts/run-gateway.ts index 2bdf31e9..2bade1e1 100644 --- a/ts/scripts/run-gateway.ts +++ b/ts/scripts/run-gateway.ts @@ -8,9 +8,6 @@ * GATEWAY_PORT (default: 8088) * GATEWAY_SECRET (optional) */ -import { run } from "../packages/flow/src/gateway/server.js"; +import { runMain } from "../packages/flow/src/gateway/server.js"; -run().catch((err) => { - console.error("Gateway failed to start:", err); - process.exit(1); -}); +runMain(); diff --git a/ts/scripts/run-graph-embeddings-query.ts b/ts/scripts/run-graph-embeddings-query.ts index 06bc8a03..85e4db00 100644 --- a/ts/scripts/run-graph-embeddings-query.ts +++ b/ts/scripts/run-graph-embeddings-query.ts @@ -1,6 +1,3 @@ -import { run } from "../packages/flow/src/query/embeddings/qdrant-graph-service.js"; +import { runMain } from "../packages/flow/src/query/embeddings/qdrant-graph-service.js"; -run().catch((err) => { - console.error("Graph embeddings query service failed:", err); - process.exit(1); -}); +runMain(); diff --git a/ts/scripts/run-graph-embeddings-store.ts b/ts/scripts/run-graph-embeddings-store.ts index 0f7d66ec..6a6b45b5 100644 --- a/ts/scripts/run-graph-embeddings-store.ts +++ b/ts/scripts/run-graph-embeddings-store.ts @@ -1,6 +1,3 @@ -import { run } from "../packages/flow/src/storage/embeddings/graph-embeddings-service.js"; +import { runMain } from "../packages/flow/src/storage/embeddings/graph-embeddings-service.js"; -run().catch((err) => { - console.error("Graph embeddings store service failed:", err); - process.exit(1); -}); +runMain(); diff --git a/ts/scripts/run-llm-azure-openai.ts b/ts/scripts/run-llm-azure-openai.ts index 2ba96ad3..44297bb3 100644 --- a/ts/scripts/run-llm-azure-openai.ts +++ b/ts/scripts/run-llm-azure-openai.ts @@ -10,9 +10,6 @@ * AZURE_MODEL (default: gpt-4o) * AZURE_API_VERSION (default: 2024-12-01-preview) */ -import { run } from "../packages/flow/src/model/text-completion/azure-openai.js"; +import { runMain } from "../packages/flow/src/model/text-completion/azure-openai.js"; -run().catch((err) => { - console.error("Azure OpenAI LLM service failed:", err); - process.exit(1); -}); +runMain(); diff --git a/ts/scripts/run-llm-claude.ts b/ts/scripts/run-llm-claude.ts index 66498928..4a8902a2 100644 --- a/ts/scripts/run-llm-claude.ts +++ b/ts/scripts/run-llm-claude.ts @@ -7,9 +7,6 @@ * NATS_URL (default: nats://localhost:4222) * CLAUDE_KEY (required) */ -import { run } from "../packages/flow/src/model/text-completion/claude.js"; +import { runMain } from "../packages/flow/src/model/text-completion/claude.js"; -run().catch((err) => { - console.error("Claude LLM service failed:", err); - process.exit(1); -}); +runMain(); diff --git a/ts/scripts/run-llm-mistral.ts b/ts/scripts/run-llm-mistral.ts index 88b5d077..736ab104 100644 --- a/ts/scripts/run-llm-mistral.ts +++ b/ts/scripts/run-llm-mistral.ts @@ -8,9 +8,6 @@ * MISTRAL_TOKEN (required) * MISTRAL_MODEL (default: ministral-8b-latest) */ -import { run } from "../packages/flow/src/model/text-completion/mistral.js"; +import { runMain } from "../packages/flow/src/model/text-completion/mistral.js"; -run().catch((err) => { - console.error("Mistral LLM service failed:", err); - process.exit(1); -}); +runMain(); diff --git a/ts/scripts/run-llm-openai-compatible.ts b/ts/scripts/run-llm-openai-compatible.ts index 866aaafd..5656c11e 100644 --- a/ts/scripts/run-llm-openai-compatible.ts +++ b/ts/scripts/run-llm-openai-compatible.ts @@ -9,9 +9,6 @@ * OPENAI_COMPAT_KEY (default: sk-no-key-required) * OPENAI_COMPAT_MODEL (default: default) */ -import { run } from "../packages/flow/src/model/text-completion/openai-compatible.js"; +import { runMain } from "../packages/flow/src/model/text-completion/openai-compatible.js"; -run().catch((err) => { - console.error("OpenAI-compatible LLM service failed:", err); - process.exit(1); -}); +runMain(); diff --git a/ts/scripts/run-llm-openai.ts b/ts/scripts/run-llm-openai.ts index ba11a163..17c99e87 100644 --- a/ts/scripts/run-llm-openai.ts +++ b/ts/scripts/run-llm-openai.ts @@ -8,9 +8,6 @@ * OPENAI_TOKEN (required) * OPENAI_BASE_URL (optional) */ -import { run } from "../packages/flow/src/model/text-completion/openai.js"; +import { runMain } from "../packages/flow/src/model/text-completion/openai.js"; -run().catch((err) => { - console.error("OpenAI LLM service failed:", err); - process.exit(1); -}); +runMain(); diff --git a/ts/scripts/run-mcp-tool.ts b/ts/scripts/run-mcp-tool.ts index 07e37440..cddf63ed 100644 --- a/ts/scripts/run-mcp-tool.ts +++ b/ts/scripts/run-mcp-tool.ts @@ -6,13 +6,6 @@ * Env: * NATS_URL (default: nats://localhost:4222) */ -import { run as runMcpToolService } from "../packages/flow/src/agent/mcp-tool/index.js"; +import { runMain } from "../packages/flow/src/agent/mcp-tool/index.js"; -async function run(): Promise { - await runMcpToolService(); -} - -run().catch((err) => { - console.error("MCP tool service failed:", err); - process.exit(1); -}); +runMain(); diff --git a/ts/scripts/run-ollama.ts b/ts/scripts/run-ollama.ts index c8ee0b95..029aac23 100644 --- a/ts/scripts/run-ollama.ts +++ b/ts/scripts/run-ollama.ts @@ -8,9 +8,6 @@ * OLLAMA_URL (default: http://localhost:11434) * OLLAMA_MODEL (default: qwen2.5:0.5b) */ -import { run } from "../packages/flow/src/model/text-completion/ollama.js"; +import { runMain } from "../packages/flow/src/model/text-completion/ollama.js"; -run().catch((err) => { - console.error("Ollama LLM service failed:", err); - process.exit(1); -}); +runMain(); diff --git a/ts/scripts/run-pdf-decoder.ts b/ts/scripts/run-pdf-decoder.ts index 11a7d6e5..a51c8f85 100644 --- a/ts/scripts/run-pdf-decoder.ts +++ b/ts/scripts/run-pdf-decoder.ts @@ -6,9 +6,6 @@ * Env: * NATS_URL (default: nats://localhost:4222) */ -import { run } from "../packages/flow/src/decoding/pdf-decoder.js"; +import { runMain } from "../packages/flow/src/decoding/pdf-decoder.js"; -run().catch((err) => { - console.error("PDF decoder service failed:", err); - process.exit(1); -}); +runMain(); diff --git a/ts/scripts/run-prompt.ts b/ts/scripts/run-prompt.ts index 5ffb8320..7a93912d 100644 --- a/ts/scripts/run-prompt.ts +++ b/ts/scripts/run-prompt.ts @@ -6,9 +6,6 @@ * Env: * NATS_URL (default: nats://localhost:4222) */ -import { run } from "../packages/flow/src/prompt/template.js"; +import { runMain } from "../packages/flow/src/prompt/template.js"; -run().catch((err) => { - console.error("Prompt service failed:", err); - process.exit(1); -}); +runMain(); diff --git a/ts/scripts/run-triples-query.ts b/ts/scripts/run-triples-query.ts index 76d9f4ec..85821968 100644 --- a/ts/scripts/run-triples-query.ts +++ b/ts/scripts/run-triples-query.ts @@ -1,6 +1,3 @@ -import { run } from "../packages/flow/src/query/triples/falkordb-service.js"; +import { runMain } from "../packages/flow/src/query/triples/falkordb-service.js"; -run().catch((err) => { - console.error("Triples query service failed:", err); - process.exit(1); -}); +runMain(); diff --git a/ts/scripts/run-triples-store.ts b/ts/scripts/run-triples-store.ts index 5c685514..56f3638a 100644 --- a/ts/scripts/run-triples-store.ts +++ b/ts/scripts/run-triples-store.ts @@ -1,6 +1,3 @@ -import { run } from "../packages/flow/src/storage/triples/falkordb-service.js"; +import { runMain } from "../packages/flow/src/storage/triples/falkordb-service.js"; -run().catch((err) => { - console.error("Triples store service failed:", err); - process.exit(1); -}); +runMain();