@fabric-harness/sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +73 -0
- package/dist/agent-definition.d.ts +61 -0
- package/dist/agent-definition.d.ts.map +1 -0
- package/dist/agent-definition.js +52 -0
- package/dist/agent-definition.js.map +1 -0
- package/dist/agent.d.ts +13 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +99 -0
- package/dist/agent.js.map +1 -0
- package/dist/context-budget.d.ts +20 -0
- package/dist/context-budget.d.ts.map +1 -0
- package/dist/context-budget.js +27 -0
- package/dist/context-budget.js.map +1 -0
- package/dist/context.d.ts +3 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +8 -0
- package/dist/context.js.map +1 -0
- package/dist/error.d.ts +25 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/error.js +48 -0
- package/dist/error.js.map +1 -0
- package/dist/filesystem-source.d.ts +69 -0
- package/dist/filesystem-source.d.ts.map +1 -0
- package/dist/filesystem-source.js +109 -0
- package/dist/filesystem-source.js.map +1 -0
- package/dist/history.d.ts +16 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +118 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/lite.d.ts +46 -0
- package/dist/lite.d.ts.map +1 -0
- package/dist/lite.js +38 -0
- package/dist/lite.js.map +1 -0
- package/dist/loop.d.ts +41 -0
- package/dist/loop.d.ts.map +1 -0
- package/dist/loop.js +94 -0
- package/dist/loop.js.map +1 -0
- package/dist/mcp-stdio.d.ts +28 -0
- package/dist/mcp-stdio.d.ts.map +1 -0
- package/dist/mcp-stdio.js +102 -0
- package/dist/mcp-stdio.js.map +1 -0
- package/dist/mcp.d.ts +40 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +153 -0
- package/dist/mcp.js.map +1 -0
- package/dist/model.d.ts +204 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +661 -0
- package/dist/model.js.map +1 -0
- package/dist/otel.d.ts +17 -0
- package/dist/otel.d.ts.map +1 -0
- package/dist/otel.js +25 -0
- package/dist/otel.js.map +1 -0
- package/dist/policy.d.ts +54 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +148 -0
- package/dist/policy.js.map +1 -0
- package/dist/providers.d.ts +37 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +265 -0
- package/dist/providers.js.map +1 -0
- package/dist/redaction.d.ts +11 -0
- package/dist/redaction.d.ts.map +1 -0
- package/dist/redaction.js +41 -0
- package/dist/redaction.js.map +1 -0
- package/dist/result.d.ts +7 -0
- package/dist/result.d.ts.map +1 -0
- package/dist/result.js +105 -0
- package/dist/result.js.map +1 -0
- package/dist/runtime-mode.d.ts +30 -0
- package/dist/runtime-mode.d.ts.map +1 -0
- package/dist/runtime-mode.js +42 -0
- package/dist/runtime-mode.js.map +1 -0
- package/dist/sandbox.d.ts +247 -0
- package/dist/sandbox.d.ts.map +1 -0
- package/dist/sandbox.js +922 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/schema.d.ts +37 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +121 -0
- package/dist/schema.js.map +1 -0
- package/dist/session.d.ts +60 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +762 -0
- package/dist/session.js.map +1 -0
- package/dist/store.d.ts +48 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +348 -0
- package/dist/store.js.map +1 -0
- package/dist/telemetry.d.ts +15 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +51 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/tools.d.ts +131 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +235 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +343 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { AnthropicModelProvider, AzureOpenAIModelProvider, BedrockModelProvider, CohereModelProvider, FallbackModelProvider, GeminiModelProvider, MockModelProvider, OpenAICompatibleModelProvider, VertexAIModelProvider } from './model.js';
|
|
2
|
+
export function parseModelRef(model) {
|
|
3
|
+
const trimmed = model.trim();
|
|
4
|
+
const slash = trimmed.indexOf('/');
|
|
5
|
+
if (slash <= 0 || slash === trimmed.length - 1)
|
|
6
|
+
return undefined;
|
|
7
|
+
return { provider: trimmed.slice(0, slash), modelId: trimmed.slice(slash + 1), original: trimmed };
|
|
8
|
+
}
|
|
9
|
+
export function resolveModelProvider(options = {}) {
|
|
10
|
+
const env = options.env ?? process.env;
|
|
11
|
+
const warnings = [];
|
|
12
|
+
const production = options.production ?? (env.FABRIC_ENV === 'production' || env.NODE_ENV === 'production');
|
|
13
|
+
const allowMock = options.allowMock ?? (env.FABRIC_ALLOW_MOCK_MODEL === '1' || env.FABRIC_ALLOW_MOCK_MODEL === 'true');
|
|
14
|
+
const configuredModel = normalizeModel(options.model) ?? normalizeModel(env.FABRIC_MODEL) ?? legacyOpenAIModel(env, warnings);
|
|
15
|
+
if (configuredModel === false)
|
|
16
|
+
return { warnings };
|
|
17
|
+
if (Array.isArray(configuredModel))
|
|
18
|
+
return fallbackProvider(configuredModel, options.providers, env, warnings);
|
|
19
|
+
if (!configuredModel) {
|
|
20
|
+
if (production && !allowMock)
|
|
21
|
+
throw new Error('No real model configured in production. Set FABRIC_MODEL=provider/model-id or pass init({ model }).');
|
|
22
|
+
warnings.push('No model configured; using mock/test-model. Set FABRIC_MODEL=provider/model-id for real model calls.');
|
|
23
|
+
return { model: 'mock/test-model', provider: new MockModelProvider(), providerName: 'mock', modelId: 'test-model', warnings };
|
|
24
|
+
}
|
|
25
|
+
const parsed = parseModelRef(configuredModel);
|
|
26
|
+
if (!parsed) {
|
|
27
|
+
if (env.OPENAI_API_KEY) {
|
|
28
|
+
warnings.push(`Ambiguous model "${configuredModel}"; treating it as openai/${configuredModel}. Prefer FABRIC_MODEL=openai/${configuredModel}.`);
|
|
29
|
+
return openAIProvider({ provider: 'openai', modelId: configuredModel, original: `openai/${configuredModel}` }, options.providers, env, warnings);
|
|
30
|
+
}
|
|
31
|
+
if (production && !allowMock)
|
|
32
|
+
throw new Error(`Invalid model "${configuredModel}". Use provider/model-id format, e.g. openai/gpt-5.5.`);
|
|
33
|
+
warnings.push(`Invalid model "${configuredModel}"; using mock/test-model. Use provider/model-id format for real model calls.`);
|
|
34
|
+
return { model: 'mock/test-model', provider: new MockModelProvider(), providerName: 'mock', modelId: 'test-model', warnings };
|
|
35
|
+
}
|
|
36
|
+
if (parsed.provider === 'mock') {
|
|
37
|
+
if (production && !allowMock)
|
|
38
|
+
throw new Error('Mock model is disabled in production. Set FABRIC_ALLOW_MOCK_MODEL=1 to allow it explicitly.');
|
|
39
|
+
if (production)
|
|
40
|
+
warnings.push('Using mock model in production because FABRIC_ALLOW_MOCK_MODEL is enabled.');
|
|
41
|
+
return { model: parsed.original, provider: new MockModelProvider(), providerName: 'mock', modelId: parsed.modelId, warnings };
|
|
42
|
+
}
|
|
43
|
+
if (parsed.provider === 'openai')
|
|
44
|
+
return openAIProvider(parsed, options.providers, env, warnings);
|
|
45
|
+
if (parsed.provider === 'openai-compatible')
|
|
46
|
+
return openAICompatibleProvider(parsed, options.providers, env, warnings);
|
|
47
|
+
if (parsed.provider === 'openrouter')
|
|
48
|
+
return openRouterProvider(parsed, options.providers, env, warnings);
|
|
49
|
+
if (parsed.provider === 'anthropic')
|
|
50
|
+
return anthropicProvider(parsed, options.providers, env, warnings);
|
|
51
|
+
if (parsed.provider === 'azure-openai')
|
|
52
|
+
return azureOpenAIProvider(parsed, options.providers, env, warnings);
|
|
53
|
+
if (parsed.provider === 'gemini' || parsed.provider === 'google')
|
|
54
|
+
return geminiProvider(parsed, options.providers, env, warnings);
|
|
55
|
+
if (parsed.provider === 'vertex-ai' || parsed.provider === 'vertex')
|
|
56
|
+
return vertexAIProvider(parsed, options.providers, env, warnings);
|
|
57
|
+
if (parsed.provider === 'groq')
|
|
58
|
+
return groqProvider(parsed, options.providers, env, warnings);
|
|
59
|
+
if (parsed.provider === 'mistral')
|
|
60
|
+
return mistralProvider(parsed, options.providers, env, warnings);
|
|
61
|
+
if (parsed.provider === 'cohere')
|
|
62
|
+
return cohereProvider(parsed, options.providers, env, warnings);
|
|
63
|
+
if (parsed.provider === 'bedrock' || parsed.provider === 'aws-bedrock')
|
|
64
|
+
return bedrockProvider(parsed, options.providers, env, warnings);
|
|
65
|
+
throw new Error(`Unknown model provider "${parsed.provider}" in "${parsed.original}". Supported providers: mock, openai, openai-compatible, openrouter, anthropic, azure-openai, gemini, vertex-ai, groq, mistral, cohere, bedrock.`);
|
|
66
|
+
}
|
|
67
|
+
function fallbackProvider(models, providers, env, warnings) {
|
|
68
|
+
if (models.length === 0)
|
|
69
|
+
throw new Error('Model fallback chain must include at least one model.');
|
|
70
|
+
const resolved = models.map((model) => resolveModelProvider({ model, ...(providers ? { providers } : {}), env, allowMock: true }));
|
|
71
|
+
for (const item of resolved)
|
|
72
|
+
warnings.push(...item.warnings);
|
|
73
|
+
const modelProviders = resolved.map((item) => item.provider).filter((provider) => provider !== undefined);
|
|
74
|
+
if (modelProviders.length === 0)
|
|
75
|
+
return { warnings };
|
|
76
|
+
return {
|
|
77
|
+
provider: new FallbackModelProvider({ providers: modelProviders }),
|
|
78
|
+
providerName: 'fallback',
|
|
79
|
+
modelId: models.join(','),
|
|
80
|
+
warnings,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function openAIProvider(parsed, providers, env, warnings) {
|
|
84
|
+
const settings = providers?.openai;
|
|
85
|
+
const apiKey = credential(settings, env, 'OPENAI_API_KEY');
|
|
86
|
+
if (!apiKey)
|
|
87
|
+
throw new Error('Missing OpenAI API key. Set OPENAI_API_KEY or providers.openai.apiKey/apiKeyEnv.');
|
|
88
|
+
return {
|
|
89
|
+
model: parsed.modelId,
|
|
90
|
+
provider: new OpenAICompatibleModelProvider({ name: 'openai', baseUrl: settings?.baseUrl ?? env.OPENAI_BASE_URL ?? 'https://api.openai.com/v1', apiKey, defaultModel: parsed.modelId, ...(settings?.headers ? { headers: settings.headers } : {}) }),
|
|
91
|
+
providerName: 'openai',
|
|
92
|
+
modelId: parsed.modelId,
|
|
93
|
+
warnings,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function openAICompatibleProvider(parsed, providers, env, warnings) {
|
|
97
|
+
const settings = providers?.['openai-compatible'];
|
|
98
|
+
const apiKey = credential(settings, env, 'FABRIC_PROVIDER_API_KEY') ?? env.OPENAI_API_KEY ?? 'dummy';
|
|
99
|
+
const baseUrl = settings?.baseUrl ?? env.FABRIC_PROVIDER_BASE_URL ?? env.OPENAI_BASE_URL;
|
|
100
|
+
if (!baseUrl)
|
|
101
|
+
throw new Error('Missing OpenAI-compatible base URL. Set FABRIC_PROVIDER_BASE_URL or providers.openai-compatible.baseUrl.');
|
|
102
|
+
return {
|
|
103
|
+
model: parsed.modelId,
|
|
104
|
+
provider: new OpenAICompatibleModelProvider({ name: 'openai-compatible', baseUrl, apiKey, defaultModel: parsed.modelId, ...(settings?.headers ? { headers: settings.headers } : {}) }),
|
|
105
|
+
providerName: 'openai-compatible',
|
|
106
|
+
modelId: parsed.modelId,
|
|
107
|
+
warnings,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function openRouterProvider(parsed, providers, env, warnings) {
|
|
111
|
+
const settings = providers?.openrouter;
|
|
112
|
+
const apiKey = credential(settings, env, 'OPENROUTER_API_KEY');
|
|
113
|
+
if (!apiKey)
|
|
114
|
+
throw new Error('Missing OpenRouter API key. Set OPENROUTER_API_KEY or providers.openrouter.apiKey/apiKeyEnv.');
|
|
115
|
+
const headers = { ...(settings?.headers ?? {}) };
|
|
116
|
+
if (env.OPENROUTER_REFERER && headers['HTTP-Referer'] === undefined)
|
|
117
|
+
headers['HTTP-Referer'] = env.OPENROUTER_REFERER;
|
|
118
|
+
if (env.OPENROUTER_TITLE && headers['X-Title'] === undefined)
|
|
119
|
+
headers['X-Title'] = env.OPENROUTER_TITLE;
|
|
120
|
+
return {
|
|
121
|
+
model: parsed.modelId,
|
|
122
|
+
provider: new OpenAICompatibleModelProvider({ name: 'openrouter', baseUrl: settings?.baseUrl ?? env.OPENROUTER_BASE_URL ?? 'https://openrouter.ai/api/v1', apiKey, defaultModel: parsed.modelId, headers }),
|
|
123
|
+
providerName: 'openrouter',
|
|
124
|
+
modelId: parsed.modelId,
|
|
125
|
+
warnings,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
function anthropicProvider(parsed, providers, env, warnings) {
|
|
129
|
+
const settings = providers?.anthropic;
|
|
130
|
+
const apiKey = credential(settings, env, 'ANTHROPIC_API_KEY');
|
|
131
|
+
if (!apiKey)
|
|
132
|
+
throw new Error('Missing Anthropic API key. Set ANTHROPIC_API_KEY or providers.anthropic.apiKey/apiKeyEnv.');
|
|
133
|
+
return {
|
|
134
|
+
model: parsed.modelId,
|
|
135
|
+
provider: new AnthropicModelProvider({ name: 'anthropic', ...(settings?.baseUrl ? { baseUrl: settings.baseUrl } : {}), apiKey, defaultModel: parsed.modelId, ...(settings?.headers ? { headers: settings.headers } : {}) }),
|
|
136
|
+
providerName: 'anthropic',
|
|
137
|
+
modelId: parsed.modelId,
|
|
138
|
+
warnings,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
function groqProvider(parsed, providers, env, warnings) {
|
|
142
|
+
const settings = providers?.groq;
|
|
143
|
+
const apiKey = credential(settings, env, 'GROQ_API_KEY');
|
|
144
|
+
if (!apiKey)
|
|
145
|
+
throw new Error('Missing Groq API key. Set GROQ_API_KEY or providers.groq.apiKey/apiKeyEnv.');
|
|
146
|
+
return {
|
|
147
|
+
model: parsed.modelId,
|
|
148
|
+
provider: new OpenAICompatibleModelProvider({ name: 'groq', baseUrl: settings?.baseUrl ?? env.GROQ_BASE_URL ?? 'https://api.groq.com/openai/v1', apiKey, defaultModel: parsed.modelId, ...(settings?.headers ? { headers: settings.headers } : {}) }),
|
|
149
|
+
providerName: 'groq',
|
|
150
|
+
modelId: parsed.modelId,
|
|
151
|
+
warnings,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
function mistralProvider(parsed, providers, env, warnings) {
|
|
155
|
+
const settings = providers?.mistral;
|
|
156
|
+
const apiKey = credential(settings, env, 'MISTRAL_API_KEY');
|
|
157
|
+
if (!apiKey)
|
|
158
|
+
throw new Error('Missing Mistral API key. Set MISTRAL_API_KEY or providers.mistral.apiKey/apiKeyEnv.');
|
|
159
|
+
return {
|
|
160
|
+
model: parsed.modelId,
|
|
161
|
+
provider: new OpenAICompatibleModelProvider({ name: 'mistral', baseUrl: settings?.baseUrl ?? env.MISTRAL_BASE_URL ?? 'https://api.mistral.ai/v1', apiKey, defaultModel: parsed.modelId, ...(settings?.headers ? { headers: settings.headers } : {}) }),
|
|
162
|
+
providerName: 'mistral',
|
|
163
|
+
modelId: parsed.modelId,
|
|
164
|
+
warnings,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
function geminiProvider(parsed, providers, env, warnings) {
|
|
168
|
+
const settings = providers?.gemini ?? providers?.google;
|
|
169
|
+
const apiKey = credential(settings, env, 'GEMINI_API_KEY') ?? env.GOOGLE_API_KEY?.trim();
|
|
170
|
+
if (!apiKey)
|
|
171
|
+
throw new Error('Missing Gemini API key. Set GEMINI_API_KEY/GOOGLE_API_KEY or providers.gemini.apiKey/apiKeyEnv.');
|
|
172
|
+
return {
|
|
173
|
+
model: parsed.modelId,
|
|
174
|
+
provider: new GeminiModelProvider({ name: 'gemini', ...(settings?.baseUrl ? { baseUrl: settings.baseUrl } : {}), apiKey, defaultModel: parsed.modelId, ...(settings?.headers ? { headers: settings.headers } : {}) }),
|
|
175
|
+
providerName: 'gemini',
|
|
176
|
+
modelId: parsed.modelId,
|
|
177
|
+
warnings,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
function vertexAIProvider(parsed, providers, env, warnings) {
|
|
181
|
+
const settings = providers?.['vertex-ai'] ?? providers?.vertex;
|
|
182
|
+
const accessToken = credential(settings, env, 'GOOGLE_VERTEX_ACCESS_TOKEN') ?? env.GOOGLE_OAUTH_ACCESS_TOKEN?.trim();
|
|
183
|
+
if (!accessToken)
|
|
184
|
+
throw new Error('Missing Vertex AI access token. Set GOOGLE_VERTEX_ACCESS_TOKEN or providers.vertex-ai.apiKey/apiKeyEnv.');
|
|
185
|
+
const project = settings?.project ?? env.GOOGLE_CLOUD_PROJECT ?? env.GCLOUD_PROJECT;
|
|
186
|
+
if (!project)
|
|
187
|
+
throw new Error('Missing Vertex AI project. Set GOOGLE_CLOUD_PROJECT or providers.vertex-ai.project.');
|
|
188
|
+
return {
|
|
189
|
+
model: parsed.modelId,
|
|
190
|
+
provider: new VertexAIModelProvider({ name: 'vertex-ai', project, location: settings?.location ?? env.GOOGLE_CLOUD_LOCATION ?? 'us-central1', accessToken, defaultModel: parsed.modelId, ...(settings?.headers ? { headers: settings.headers } : {}) }),
|
|
191
|
+
providerName: 'vertex-ai',
|
|
192
|
+
modelId: parsed.modelId,
|
|
193
|
+
warnings,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
function cohereProvider(parsed, providers, env, warnings) {
|
|
197
|
+
const settings = providers?.cohere;
|
|
198
|
+
const apiKey = credential(settings, env, 'COHERE_API_KEY');
|
|
199
|
+
if (!apiKey)
|
|
200
|
+
throw new Error('Missing Cohere API key. Set COHERE_API_KEY or providers.cohere.apiKey/apiKeyEnv.');
|
|
201
|
+
return {
|
|
202
|
+
model: parsed.modelId,
|
|
203
|
+
provider: new CohereModelProvider({ name: 'cohere', ...(settings?.baseUrl ? { baseUrl: settings.baseUrl } : {}), apiKey, defaultModel: parsed.modelId, ...(settings?.headers ? { headers: settings.headers } : {}) }),
|
|
204
|
+
providerName: 'cohere',
|
|
205
|
+
modelId: parsed.modelId,
|
|
206
|
+
warnings,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
function bedrockProvider(parsed, providers, env, warnings) {
|
|
210
|
+
const settings = providers?.bedrock ?? providers?.['aws-bedrock'];
|
|
211
|
+
const accessKeyId = credential(settings, env, 'AWS_ACCESS_KEY_ID');
|
|
212
|
+
const secretAccessKey = settings?.apiKey?.trim() || env[settings?.apiKeyEnv ?? 'AWS_SECRET_ACCESS_KEY']?.trim();
|
|
213
|
+
if (!accessKeyId || !secretAccessKey)
|
|
214
|
+
throw new Error('Missing Bedrock credentials. Set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY or providers.bedrock api settings.');
|
|
215
|
+
const region = settings?.region ?? env.AWS_REGION ?? env.AWS_DEFAULT_REGION;
|
|
216
|
+
if (!region)
|
|
217
|
+
throw new Error('Missing Bedrock region. Set AWS_REGION or providers.bedrock.region.');
|
|
218
|
+
return {
|
|
219
|
+
model: parsed.modelId,
|
|
220
|
+
provider: new BedrockModelProvider({ name: 'bedrock', region, accessKeyId, secretAccessKey, ...((settings?.sessionToken ?? env.AWS_SESSION_TOKEN) ? { sessionToken: (settings?.sessionToken ?? env.AWS_SESSION_TOKEN) } : {}), defaultModel: parsed.modelId, ...(settings?.headers ? { headers: settings.headers } : {}) }),
|
|
221
|
+
providerName: 'bedrock',
|
|
222
|
+
modelId: parsed.modelId,
|
|
223
|
+
warnings,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
function azureOpenAIProvider(parsed, providers, env, warnings) {
|
|
227
|
+
const settings = providers?.['azure-openai'];
|
|
228
|
+
const apiKey = credential(settings, env, 'AZURE_OPENAI_API_KEY');
|
|
229
|
+
if (!apiKey)
|
|
230
|
+
throw new Error('Missing Azure OpenAI API key. Set AZURE_OPENAI_API_KEY or providers.azure-openai.apiKey/apiKeyEnv.');
|
|
231
|
+
const baseUrl = settings?.baseUrl ?? env.AZURE_OPENAI_ENDPOINT;
|
|
232
|
+
if (!baseUrl)
|
|
233
|
+
throw new Error('Missing Azure OpenAI endpoint. Set AZURE_OPENAI_ENDPOINT or providers.azure-openai.baseUrl.');
|
|
234
|
+
const apiVersion = env.AZURE_OPENAI_API_VERSION;
|
|
235
|
+
return {
|
|
236
|
+
model: parsed.modelId,
|
|
237
|
+
provider: new AzureOpenAIModelProvider({ name: 'azure-openai', baseUrl, apiKey, deployment: parsed.modelId, ...(apiVersion ? { apiVersion } : {}), ...(settings?.headers ? { headers: settings.headers } : {}) }),
|
|
238
|
+
providerName: 'azure-openai',
|
|
239
|
+
modelId: parsed.modelId,
|
|
240
|
+
warnings,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
function normalizeModel(value) {
|
|
244
|
+
if (value === false)
|
|
245
|
+
return false;
|
|
246
|
+
if (Array.isArray(value)) {
|
|
247
|
+
const chain = value.map((item) => item.trim()).filter(Boolean);
|
|
248
|
+
return chain.length > 0 ? chain : undefined;
|
|
249
|
+
}
|
|
250
|
+
if (typeof value !== 'string')
|
|
251
|
+
return undefined;
|
|
252
|
+
const trimmed = value.trim();
|
|
253
|
+
return trimmed ? trimmed : undefined;
|
|
254
|
+
}
|
|
255
|
+
function legacyOpenAIModel(env, warnings) {
|
|
256
|
+
const model = env.OPENAI_MODEL?.trim();
|
|
257
|
+
if (!model)
|
|
258
|
+
return undefined;
|
|
259
|
+
warnings.push('OPENAI_MODEL is a legacy shorthand. Prefer FABRIC_MODEL=openai/<model>.');
|
|
260
|
+
return model.includes('/') ? model : `openai/${model}`;
|
|
261
|
+
}
|
|
262
|
+
function credential(settings, env, defaultEnv) {
|
|
263
|
+
return settings?.apiKey?.trim() || env[settings?.apiKeyEnv ?? defaultEnv]?.trim();
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { JsonObject } from './types.js';
|
|
2
|
+
export interface RedactionOptions {
|
|
3
|
+
replacement?: string;
|
|
4
|
+
secretKeyPattern?: RegExp;
|
|
5
|
+
secretValuePattern?: RegExp;
|
|
6
|
+
additionalSecrets?: string[];
|
|
7
|
+
}
|
|
8
|
+
export declare function redactText(value: string, options?: RedactionOptions): string;
|
|
9
|
+
export declare function redactJson<T>(value: T, options?: RedactionOptions): T;
|
|
10
|
+
export declare function redactError(error: unknown, options?: RedactionOptions): JsonObject;
|
|
11
|
+
//# sourceMappingURL=redaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redaction.d.ts","sourceRoot":"","sources":["../src/redaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAK7C,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAOhF;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,GAAE,gBAAqB,GAAG,CAAC,CAkBzE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,gBAAqB,GAAG,UAAU,CAKtF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
const DEFAULT_SECRET_KEY_PATTERN = /(?:api[_-]?key|token|secret|password|passwd|credential|authorization|client[_-]?key|private[_-]?key|cert(?:ificate)?)/i;
|
|
2
|
+
const DEFAULT_SECRET_VALUE_PATTERN = /(?:Bearer\s+[A-Za-z0-9._~+/=-]+|sk-[A-Za-z0-9]{16,}|[A-Za-z0-9_\-]{24,}\.[A-Za-z0-9_\-]{12,}\.[A-Za-z0-9_\-]{12,})/g;
|
|
3
|
+
export function redactText(value, options = {}) {
|
|
4
|
+
const replacement = options.replacement ?? '[REDACTED]';
|
|
5
|
+
let redacted = value.replace(options.secretValuePattern ?? DEFAULT_SECRET_VALUE_PATTERN, replacement);
|
|
6
|
+
for (const secret of options.additionalSecrets ?? []) {
|
|
7
|
+
if (secret)
|
|
8
|
+
redacted = redacted.split(secret).join(replacement);
|
|
9
|
+
}
|
|
10
|
+
return redacted;
|
|
11
|
+
}
|
|
12
|
+
export function redactJson(value, options = {}) {
|
|
13
|
+
const replacement = options.replacement ?? '[REDACTED]';
|
|
14
|
+
const keyPattern = options.secretKeyPattern ?? DEFAULT_SECRET_KEY_PATTERN;
|
|
15
|
+
const seen = new WeakSet();
|
|
16
|
+
const visit = (item, key) => {
|
|
17
|
+
if (key && keyPattern.test(key))
|
|
18
|
+
return replacement;
|
|
19
|
+
if (typeof item === 'string')
|
|
20
|
+
return redactText(item, options);
|
|
21
|
+
if (item === null || typeof item !== 'object')
|
|
22
|
+
return item;
|
|
23
|
+
if (seen.has(item))
|
|
24
|
+
return '[Circular]';
|
|
25
|
+
seen.add(item);
|
|
26
|
+
if (Array.isArray(item))
|
|
27
|
+
return item.map((entry) => visit(entry));
|
|
28
|
+
const output = {};
|
|
29
|
+
for (const [entryKey, entryValue] of Object.entries(item))
|
|
30
|
+
output[entryKey] = visit(entryValue, entryKey);
|
|
31
|
+
return output;
|
|
32
|
+
};
|
|
33
|
+
return visit(value);
|
|
34
|
+
}
|
|
35
|
+
export function redactError(error, options = {}) {
|
|
36
|
+
if (error instanceof Error) {
|
|
37
|
+
return redactJson({ name: error.name, message: error.message, stack: error.stack }, options);
|
|
38
|
+
}
|
|
39
|
+
return redactJson({ error: String(error) }, options);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=redaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redaction.js","sourceRoot":"","sources":["../src/redaction.ts"],"names":[],"mappings":"AAEA,MAAM,0BAA0B,GAAG,wHAAwH,CAAC;AAC5J,MAAM,4BAA4B,GAAG,qHAAqH,CAAC;AAS3J,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,UAA4B,EAAE;IACtE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,YAAY,CAAC;IACxD,IAAI,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,IAAI,4BAA4B,EAAE,WAAW,CAAC,CAAC;IACtG,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,iBAAiB,IAAI,EAAE,EAAE,CAAC;QACrD,IAAI,MAAM;YAAE,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,UAAU,CAAI,KAAQ,EAAE,UAA4B,EAAE;IACpE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,YAAY,CAAC;IACxD,MAAM,UAAU,GAAG,OAAO,CAAC,gBAAgB,IAAI,0BAA0B,CAAC;IAC1E,MAAM,IAAI,GAAG,IAAI,OAAO,EAAU,CAAC;IAEnC,MAAM,KAAK,GAAG,CAAC,IAAa,EAAE,GAAY,EAAW,EAAE;QACrD,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,WAAW,CAAC;QACpD,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/D,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3D,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,YAAY,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAClE,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC1G,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,OAAO,KAAK,CAAC,KAAK,CAAM,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc,EAAE,UAA4B,EAAE;IACxE,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,OAAO,CAAe,CAAC;IAC7G,CAAC;IACD,OAAO,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAe,CAAC;AACrE,CAAC"}
|
package/dist/result.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ResultExtractionOptions, ResultValidator } from './types.js';
|
|
2
|
+
export declare const RESULT_START_DELIMITER = "---RESULT_START---";
|
|
3
|
+
export declare const RESULT_END_DELIMITER = "---RESULT_END---";
|
|
4
|
+
export declare function validateResult<TResult>(value: unknown, validator?: ResultValidator<TResult>, extraction?: boolean | ResultExtractionOptions): Promise<TResult>;
|
|
5
|
+
export declare function extractResultValue(value: unknown, extraction?: boolean | ResultExtractionOptions): unknown;
|
|
6
|
+
export declare function buildResultRetryPrompt(error: unknown, extraction?: boolean | ResultExtractionOptions): string;
|
|
7
|
+
//# sourceMappingURL=result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE3E,eAAO,MAAM,sBAAsB,uBAAuB,CAAC;AAC3D,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AAEvD,wBAAsB,cAAc,CAAC,OAAO,EAC1C,KAAK,EAAE,OAAO,EACd,SAAS,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,EACpC,UAAU,CAAC,EAAE,OAAO,GAAG,uBAAuB,GAC7C,OAAO,CAAC,OAAO,CAAC,CA2BlB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,GAAE,OAAO,GAAG,uBAA8B,GAAG,OAAO,CAuBhH;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,GAAE,OAAO,GAAG,uBAA8B,GAAG,MAAM,CAanH"}
|
package/dist/result.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { FabricError } from './error.js';
|
|
2
|
+
export const RESULT_START_DELIMITER = '---RESULT_START---';
|
|
3
|
+
export const RESULT_END_DELIMITER = '---RESULT_END---';
|
|
4
|
+
export async function validateResult(value, validator, extraction) {
|
|
5
|
+
const candidate = extractResultValue(value, extraction ?? Boolean(validator));
|
|
6
|
+
if (!validator) {
|
|
7
|
+
return candidate;
|
|
8
|
+
}
|
|
9
|
+
try {
|
|
10
|
+
if (validator.parse) {
|
|
11
|
+
return validator.parse(candidate);
|
|
12
|
+
}
|
|
13
|
+
if (validator.safeParse) {
|
|
14
|
+
const result = validator.safeParse(candidate);
|
|
15
|
+
if (result.success) {
|
|
16
|
+
return result.data;
|
|
17
|
+
}
|
|
18
|
+
throw result.error;
|
|
19
|
+
}
|
|
20
|
+
if (validator.validate) {
|
|
21
|
+
return validator.validate(candidate);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
throw normalizeValidationError(error);
|
|
26
|
+
}
|
|
27
|
+
return candidate;
|
|
28
|
+
}
|
|
29
|
+
export function extractResultValue(value, extraction = true) {
|
|
30
|
+
if (!extraction || typeof value !== 'string')
|
|
31
|
+
return value;
|
|
32
|
+
const options = typeof extraction === 'object' ? extraction : {};
|
|
33
|
+
const startDelimiter = options.startDelimiter ?? RESULT_START_DELIMITER;
|
|
34
|
+
const endDelimiter = options.endDelimiter ?? RESULT_END_DELIMITER;
|
|
35
|
+
const parseJson = options.parseJson ?? true;
|
|
36
|
+
const required = options.required ?? false;
|
|
37
|
+
const text = value.trim();
|
|
38
|
+
const delimited = extractDelimitedText(text, startDelimiter, endDelimiter);
|
|
39
|
+
if (delimited !== undefined)
|
|
40
|
+
return parseJson ? parseJsonPayload(delimited) : delimited;
|
|
41
|
+
if (required) {
|
|
42
|
+
throw new FabricError({
|
|
43
|
+
code: 'RESULT_VALIDATION_FAILED',
|
|
44
|
+
message: `Missing typed result delimiters: ${startDelimiter} ... ${endDelimiter}`,
|
|
45
|
+
details: { startDelimiter, endDelimiter },
|
|
46
|
+
retryable: true,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
if (parseJson && looksLikeJson(text))
|
|
50
|
+
return parseJsonPayload(text);
|
|
51
|
+
return value;
|
|
52
|
+
}
|
|
53
|
+
export function buildResultRetryPrompt(error, extraction = true) {
|
|
54
|
+
const options = typeof extraction === 'object' ? extraction : {};
|
|
55
|
+
const startDelimiter = options.startDelimiter ?? RESULT_START_DELIMITER;
|
|
56
|
+
const endDelimiter = options.endDelimiter ?? RESULT_END_DELIMITER;
|
|
57
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
58
|
+
return [
|
|
59
|
+
'Your previous response could not be parsed or validated as the required typed result.',
|
|
60
|
+
`Validation error: ${errorMessage}`,
|
|
61
|
+
'Return the corrected result only, with no extra commentary, using this exact format:',
|
|
62
|
+
startDelimiter,
|
|
63
|
+
'{"example":"replace with the valid JSON result"}',
|
|
64
|
+
endDelimiter,
|
|
65
|
+
].join('\n');
|
|
66
|
+
}
|
|
67
|
+
function extractDelimitedText(text, startDelimiter, endDelimiter) {
|
|
68
|
+
const start = text.indexOf(startDelimiter);
|
|
69
|
+
if (start === -1)
|
|
70
|
+
return undefined;
|
|
71
|
+
const payloadStart = start + startDelimiter.length;
|
|
72
|
+
const end = text.indexOf(endDelimiter, payloadStart);
|
|
73
|
+
if (end === -1) {
|
|
74
|
+
throw new FabricError({
|
|
75
|
+
code: 'RESULT_VALIDATION_FAILED',
|
|
76
|
+
message: `Missing typed result end delimiter: ${endDelimiter}`,
|
|
77
|
+
details: { startDelimiter, endDelimiter },
|
|
78
|
+
retryable: true,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return text.slice(payloadStart, end).trim();
|
|
82
|
+
}
|
|
83
|
+
function parseJsonPayload(payload) {
|
|
84
|
+
try {
|
|
85
|
+
return JSON.parse(payload);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
throw new FabricError({
|
|
89
|
+
code: 'RESULT_VALIDATION_FAILED',
|
|
90
|
+
message: `Failed to parse typed result JSON: ${error instanceof Error ? error.message : String(error)}`,
|
|
91
|
+
details: { payload: payload.slice(0, 500) },
|
|
92
|
+
cause: error,
|
|
93
|
+
retryable: true,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function looksLikeJson(text) {
|
|
98
|
+
return (text.startsWith('{') && text.endsWith('}')) || (text.startsWith('[') && text.endsWith(']')) || text === 'null' || /^-?\d+(\.\d+)?$/.test(text) || text === 'true' || text === 'false';
|
|
99
|
+
}
|
|
100
|
+
function normalizeValidationError(error) {
|
|
101
|
+
if (error instanceof Error)
|
|
102
|
+
return error;
|
|
103
|
+
return new FabricError({ code: 'RESULT_VALIDATION_FAILED', message: String(error), details: { error: String(error) }, retryable: true });
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.js","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { AgentInit, FabricRuntime, SessionStore } from './types.js';
|
|
2
|
+
export interface RuntimeModeResolution {
|
|
3
|
+
runtime: FabricRuntime;
|
|
4
|
+
warnings: string[];
|
|
5
|
+
/**
|
|
6
|
+
* True when the agent should not persist any session state, artifacts,
|
|
7
|
+
* approvals, or events to disk / external store.
|
|
8
|
+
*/
|
|
9
|
+
ephemeral: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Resolve the effective runtime mode for an `init()` call, applying
|
|
13
|
+
* production safety rules:
|
|
14
|
+
*
|
|
15
|
+
* - In production (`FABRIC_ENV=production` or `NODE_ENV=production`),
|
|
16
|
+
* choosing `stateless` is allowed but logged as an explicit choice.
|
|
17
|
+
* - `inline` (the default) without an explicit `SessionStore` falls
|
|
18
|
+
* back to in-memory storage. In production this emits a warning unless
|
|
19
|
+
* `FABRIC_ALLOW_EPHEMERAL_STATE=1` is set or runtime is explicitly
|
|
20
|
+
* `'stateless'`.
|
|
21
|
+
* - Unknown runtime values fall through to `'inline'` with a warning.
|
|
22
|
+
*/
|
|
23
|
+
export declare function resolveRuntimeMode(options: Pick<AgentInit, 'runtime' | 'store'>, env?: Record<string, string | undefined>): RuntimeModeResolution;
|
|
24
|
+
export declare function isStatelessRuntime(runtime: FabricRuntime | undefined): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Returns true when `store` is the in-memory default (no `appendEntry`
|
|
27
|
+
* persistence beyond memory). Used by stateless mode to skip writes.
|
|
28
|
+
*/
|
|
29
|
+
export declare function isInMemoryStore(store: SessionStore | undefined): boolean;
|
|
30
|
+
//# sourceMappingURL=runtime-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-mode.d.ts","sourceRoot":"","sources":["../src/runtime-mode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEzE,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;;OAGG;IACH,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,EAC7C,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,qBAAqB,CAsBvB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,GAAG,OAAO,CAE9E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAGxE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve the effective runtime mode for an `init()` call, applying
|
|
3
|
+
* production safety rules:
|
|
4
|
+
*
|
|
5
|
+
* - In production (`FABRIC_ENV=production` or `NODE_ENV=production`),
|
|
6
|
+
* choosing `stateless` is allowed but logged as an explicit choice.
|
|
7
|
+
* - `inline` (the default) without an explicit `SessionStore` falls
|
|
8
|
+
* back to in-memory storage. In production this emits a warning unless
|
|
9
|
+
* `FABRIC_ALLOW_EPHEMERAL_STATE=1` is set or runtime is explicitly
|
|
10
|
+
* `'stateless'`.
|
|
11
|
+
* - Unknown runtime values fall through to `'inline'` with a warning.
|
|
12
|
+
*/
|
|
13
|
+
export function resolveRuntimeMode(options, env = process.env) {
|
|
14
|
+
const warnings = [];
|
|
15
|
+
const requested = options.runtime;
|
|
16
|
+
const production = env.FABRIC_ENV === 'production' || env.NODE_ENV === 'production';
|
|
17
|
+
const allowEphemeral = env.FABRIC_ALLOW_EPHEMERAL_STATE === '1' || env.FABRIC_ALLOW_EPHEMERAL_STATE === 'true';
|
|
18
|
+
let runtime = requested ?? 'inline';
|
|
19
|
+
if (runtime !== 'inline' && runtime !== 'stateless' && runtime !== 'temporal') {
|
|
20
|
+
warnings.push(`Unknown runtime "${String(runtime)}"; defaulting to "inline".`);
|
|
21
|
+
runtime = 'inline';
|
|
22
|
+
}
|
|
23
|
+
const ephemeral = runtime === 'stateless' || (runtime === 'inline' && options.store === undefined);
|
|
24
|
+
if (production && ephemeral && runtime === 'inline' && !allowEphemeral) {
|
|
25
|
+
warnings.push('Inline runtime in production without an explicit SessionStore — session history is in-memory only and will not survive restarts. ' +
|
|
26
|
+
'Configure a SessionStore (SQLite/Postgres/file), set runtime: "stateless" to opt in explicitly, or set FABRIC_ALLOW_EPHEMERAL_STATE=1.');
|
|
27
|
+
}
|
|
28
|
+
return { runtime, warnings, ephemeral };
|
|
29
|
+
}
|
|
30
|
+
export function isStatelessRuntime(runtime) {
|
|
31
|
+
return runtime === 'stateless';
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Returns true when `store` is the in-memory default (no `appendEntry`
|
|
35
|
+
* persistence beyond memory). Used by stateless mode to skip writes.
|
|
36
|
+
*/
|
|
37
|
+
export function isInMemoryStore(store) {
|
|
38
|
+
if (!store)
|
|
39
|
+
return true;
|
|
40
|
+
return store.__inMemory === true;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=runtime-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-mode.js","sourceRoot":"","sources":["../src/runtime-mode.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAA6C,EAC7C,MAA0C,OAAO,CAAC,GAAG;IAErD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAClC,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,KAAK,YAAY,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;IACpF,MAAM,cAAc,GAAG,GAAG,CAAC,4BAA4B,KAAK,GAAG,IAAI,GAAG,CAAC,4BAA4B,KAAK,MAAM,CAAC;IAE/G,IAAI,OAAO,GAAkB,SAAS,IAAI,QAAQ,CAAC;IACnD,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QAC9E,QAAQ,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QAC/E,OAAO,GAAG,QAAQ,CAAC;IACrB,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,KAAK,WAAW,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IAEnG,IAAI,UAAU,IAAI,SAAS,IAAI,OAAO,KAAK,QAAQ,IAAI,CAAC,cAAc,EAAE,CAAC;QACvE,QAAQ,CAAC,IAAI,CACX,mIAAmI;YACjI,wIAAwI,CAC3I,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAkC;IACnE,OAAO,OAAO,KAAK,WAAW,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAA+B;IAC7D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAQ,KAAkC,CAAC,UAAU,KAAK,IAAI,CAAC;AACjE,CAAC"}
|