11import type { SSEEvent , AgentName } from "@stackforge/shared" ;
22
33import { JOB_STATUS } from "@stackforge/shared" ;
4- import { OpenRouterProvider , AgentCache , runOrchestrator } from "@stackforge/agents" ;
4+ import {
5+ OpenRouterProvider ,
6+ MockProvider ,
7+ AgentCache ,
8+ runOrchestrator ,
9+ type LLMProvider ,
10+ } from "@stackforge/agents" ;
511import {
612 createJob ,
713 getJob ,
@@ -11,6 +17,29 @@ import {
1117} from "../store/job.store.js" ;
1218import { broadcast , closeJobClients } from "./sse.service.js" ;
1319
20+ type ProviderMode = "openrouter" | "mock" ;
21+
22+ export type RuntimeStatus = {
23+ provider : ProviderMode ;
24+ ready : boolean ;
25+ reason ?: string ;
26+ } ;
27+
28+ function resolveProviderMode ( ) : ProviderMode {
29+ const configured = ( process . env [ "STACKFORGE_PROVIDER" ] ?? "auto" ) . trim ( ) . toLowerCase ( ) ;
30+
31+ if ( configured === "openrouter" ) {
32+ return "openrouter" ;
33+ }
34+
35+ if ( configured === "mock" ) {
36+ return "mock" ;
37+ }
38+
39+ const hasOpenRouterKey = ( process . env [ "OPENROUTER_API_KEY" ] ?? "" ) . trim ( ) . length > 0 ;
40+ return hasOpenRouterKey ? "openrouter" : "mock" ;
41+ }
42+
1443function readEnv ( name : string ) : string {
1544 const value = process . env [ name ] ;
1645 if ( value === undefined || value . trim ( ) . length === 0 ) {
@@ -19,7 +48,7 @@ function readEnv(name: string): string {
1948 return value ;
2049}
2150
22- function buildProvider ( ) : OpenRouterProvider {
51+ function buildOpenRouterProvider ( ) : OpenRouterProvider {
2352 const endpoint = process . env [ "OPENROUTER_ENDPOINT" ] ;
2453 const options = {
2554 apiKey : readEnv ( "OPENROUTER_API_KEY" ) ,
@@ -31,16 +60,38 @@ function buildProvider(): OpenRouterProvider {
3160 return new OpenRouterProvider ( options ) ;
3261}
3362
34- let provider : OpenRouterProvider | undefined ;
63+ function buildProvider ( mode : ProviderMode ) : LLMProvider {
64+ if ( mode === "mock" ) {
65+ return new MockProvider ( ) ;
66+ }
67+
68+ return buildOpenRouterProvider ( ) ;
69+ }
3570
36- function getProvider ( ) : OpenRouterProvider {
71+ let provider : LLMProvider | undefined ;
72+ let providerMode : ProviderMode | undefined ;
73+
74+ function getProvider ( ) : LLMProvider {
3775 if ( provider === undefined ) {
38- provider = buildProvider ( ) ;
76+ providerMode = resolveProviderMode ( ) ;
77+ provider = buildProvider ( providerMode ) ;
3978 }
4079
4180 return provider ;
4281}
4382
83+ export function getRuntimeStatus ( ) : RuntimeStatus {
84+ const mode = providerMode ?? resolveProviderMode ( ) ;
85+
86+ try {
87+ void getProvider ( ) ;
88+ return { provider : mode , ready : true } ;
89+ } catch ( error ) {
90+ const reason = error instanceof Error ? error . message : String ( error ) ;
91+ return { provider : mode , ready : false , reason } ;
92+ }
93+ }
94+
4495const cache = new AgentCache ( ) ;
4596
4697function buildEmitter ( jobId : string ) : ( event : SSEEvent ) => void {
0 commit comments