@velum-labs/routekit-daemon 1.3.2 → 1.5.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.
Files changed (172) hide show
  1. package/dist/account-enroll-service.d.ts +1 -3
  2. package/dist/account-enroll-service.js +262 -262
  3. package/dist/account-mutation-service.d.ts +1 -3
  4. package/dist/account-mutation-service.js +302 -283
  5. package/dist/account-query-service.d.ts +1 -3
  6. package/dist/account-query-service.js +88 -86
  7. package/dist/call-attribution-store.js +544 -1
  8. package/dist/control-dispatch.js +9 -15
  9. package/dist/daemon-bootstrap-preflight.js +1 -1
  10. package/dist/daemon-control-handlers.d.ts +1 -1
  11. package/dist/daemon-control-handlers.js +24 -27
  12. package/dist/daemon-generations.d.ts +14 -28
  13. package/dist/daemon-generations.js +114 -53
  14. package/dist/daemon-lifecycle-service.d.ts +1 -3
  15. package/dist/daemon-lifecycle-service.js +88 -94
  16. package/dist/daemon-maintenance.d.ts +27 -49
  17. package/dist/daemon-maintenance.js +5 -1
  18. package/dist/daemon-options.d.ts +3 -2
  19. package/dist/daemon-policy-context.d.ts +1 -0
  20. package/dist/daemon-policy-context.js +1 -0
  21. package/dist/daemon-runtime-state.d.ts +1 -1
  22. package/dist/daemon-runtime-state.js +2 -3
  23. package/dist/daemon-state-context.d.ts +1 -1
  24. package/dist/daemon-state-context.js +1 -38
  25. package/dist/doctor-service.d.ts +1 -3
  26. package/dist/doctor-service.js +87 -91
  27. package/dist/effect/daemon-live.d.ts +7 -6
  28. package/dist/effect/daemon-live.js +57 -135
  29. package/dist/eval-routing-service.d.ts +1 -3
  30. package/dist/eval-routing-service.js +45 -69
  31. package/dist/eval-session-execution-store.d.ts +24 -0
  32. package/dist/eval-session-execution-store.js +253 -0
  33. package/dist/host-protocol.d.ts +1 -0
  34. package/dist/host.js +3 -0
  35. package/dist/internal-providers/provider-anthropic/index.d.ts +23 -0
  36. package/dist/internal-providers/provider-anthropic/index.js +42 -0
  37. package/dist/internal-providers/provider-anthropic/test/provider.test.js +33 -0
  38. package/dist/internal-providers/provider-azure/index.d.ts +25 -0
  39. package/dist/internal-providers/provider-azure/index.js +101 -0
  40. package/dist/internal-providers/provider-azure/test/provider.test.js +83 -0
  41. package/dist/internal-providers/provider-bedrock/codec.d.ts +11 -0
  42. package/dist/internal-providers/provider-bedrock/codec.js +484 -0
  43. package/dist/internal-providers/provider-bedrock/connection-settings.d.ts +6 -0
  44. package/dist/internal-providers/provider-bedrock/connection-settings.js +41 -0
  45. package/dist/internal-providers/provider-bedrock/connection.d.ts +17 -0
  46. package/dist/internal-providers/provider-bedrock/connection.js +143 -0
  47. package/dist/internal-providers/provider-bedrock/index.d.ts +27 -0
  48. package/dist/internal-providers/provider-bedrock/index.js +47 -0
  49. package/dist/internal-providers/provider-bedrock/source.d.ts +39 -0
  50. package/dist/internal-providers/provider-bedrock/source.js +454 -0
  51. package/dist/internal-providers/provider-bedrock/test/bedrock-source.test.d.ts +1 -0
  52. package/dist/internal-providers/provider-bedrock/test/bedrock-source.test.js +786 -0
  53. package/dist/internal-providers/provider-bedrock/test/connection.test.d.ts +1 -0
  54. package/dist/internal-providers/provider-bedrock/test/connection.test.js +249 -0
  55. package/dist/internal-providers/provider-bedrock/test/workload-credentials.test.d.ts +1 -0
  56. package/dist/internal-providers/provider-bedrock/test/workload-credentials.test.js +29 -0
  57. package/dist/internal-providers/provider-bedrock/workload-credentials.d.ts +5 -0
  58. package/dist/internal-providers/provider-bedrock/workload-credentials.js +14 -0
  59. package/dist/internal-providers/provider-claude-code/index.d.ts +6 -0
  60. package/dist/internal-providers/provider-claude-code/index.js +4 -0
  61. package/dist/internal-providers/provider-claude-code/module-api.d.ts +25 -0
  62. package/dist/internal-providers/provider-claude-code/module-api.js +31 -0
  63. package/dist/internal-providers/provider-claude-code/relay.d.ts +20 -0
  64. package/dist/internal-providers/provider-claude-code/relay.js +115 -0
  65. package/dist/internal-providers/provider-claude-code/subscription.d.ts +2 -0
  66. package/dist/internal-providers/provider-claude-code/subscription.js +194 -0
  67. package/dist/internal-providers/provider-claude-code/test/http-submission.test.d.ts +1 -0
  68. package/dist/internal-providers/provider-claude-code/test/http-submission.test.js +140 -0
  69. package/dist/internal-providers/provider-claude-code/test/relay.test.d.ts +1 -0
  70. package/dist/internal-providers/provider-claude-code/test/relay.test.js +379 -0
  71. package/dist/internal-providers/provider-claude-code/test/subscription.test.d.ts +1 -0
  72. package/dist/internal-providers/provider-claude-code/test/subscription.test.js +256 -0
  73. package/dist/internal-providers/provider-cliproxy/index.d.ts +9 -0
  74. package/dist/internal-providers/provider-cliproxy/index.js +15 -0
  75. package/dist/internal-providers/provider-codex/index.d.ts +6 -0
  76. package/dist/internal-providers/provider-codex/index.js +7 -0
  77. package/dist/internal-providers/provider-codex/module-api.d.ts +25 -0
  78. package/dist/internal-providers/provider-codex/module-api.js +31 -0
  79. package/dist/internal-providers/provider-codex/relay.d.ts +123 -0
  80. package/dist/internal-providers/provider-codex/relay.js +261 -0
  81. package/dist/internal-providers/provider-codex/subscription.d.ts +2 -0
  82. package/dist/internal-providers/provider-codex/subscription.js +555 -0
  83. package/dist/internal-providers/provider-codex/test/http-submission.test.d.ts +1 -0
  84. package/dist/internal-providers/provider-codex/test/http-submission.test.js +142 -0
  85. package/dist/internal-providers/provider-codex/test/relay.test.d.ts +1 -0
  86. package/dist/internal-providers/provider-codex/test/relay.test.js +600 -0
  87. package/dist/internal-providers/provider-codex/test/subscription.test.d.ts +1 -0
  88. package/dist/internal-providers/provider-codex/test/subscription.test.js +70 -0
  89. package/dist/internal-providers/provider-codex/test/translated-content.test.d.ts +1 -0
  90. package/dist/internal-providers/provider-codex/test/translated-content.test.js +91 -0
  91. package/dist/internal-providers/provider-custom/index.d.ts +9 -0
  92. package/dist/internal-providers/provider-custom/index.js +15 -0
  93. package/dist/internal-providers/provider-google/index.d.ts +23 -0
  94. package/dist/internal-providers/provider-google/index.js +43 -0
  95. package/dist/internal-providers/provider-google/test/provider.test.d.ts +1 -0
  96. package/dist/internal-providers/provider-google/test/provider.test.js +34 -0
  97. package/dist/internal-providers/provider-google-vertex/index.d.ts +28 -0
  98. package/dist/internal-providers/provider-google-vertex/index.js +137 -0
  99. package/dist/internal-providers/provider-google-vertex/test/provider.test.d.ts +1 -0
  100. package/dist/internal-providers/provider-google-vertex/test/provider.test.js +85 -0
  101. package/dist/internal-providers/provider-openai/documented-reasoning.d.ts +9 -0
  102. package/dist/internal-providers/provider-openai/documented-reasoning.js +26 -0
  103. package/dist/internal-providers/provider-openai/index.d.ts +23 -0
  104. package/dist/internal-providers/provider-openai/index.js +74 -0
  105. package/dist/internal-providers/provider-openai/test/provider.test.d.ts +1 -0
  106. package/dist/internal-providers/provider-openai/test/provider.test.js +268 -0
  107. package/dist/internal-providers/provider-openai-compatible/index.d.ts +9 -0
  108. package/dist/internal-providers/provider-openai-compatible/index.js +15 -0
  109. package/dist/internal-providers/provider-openai-compatible/test/provider.test.d.ts +1 -0
  110. package/dist/internal-providers/provider-openai-compatible/test/provider.test.js +40 -0
  111. package/dist/internal-providers/provider-openrouter/connection.d.ts +5 -0
  112. package/dist/internal-providers/provider-openrouter/connection.js +143 -0
  113. package/dist/internal-providers/provider-openrouter/index.d.ts +28 -0
  114. package/dist/internal-providers/provider-openrouter/index.js +42 -0
  115. package/dist/internal-providers/provider-openrouter/pricing.d.ts +4 -0
  116. package/dist/internal-providers/provider-openrouter/pricing.js +108 -0
  117. package/dist/internal-providers/provider-openrouter/test/connection.test.d.ts +1 -0
  118. package/dist/internal-providers/provider-openrouter/test/connection.test.js +71 -0
  119. package/dist/internal-providers/provider-openrouter/test/pricing.test.d.ts +1 -0
  120. package/dist/internal-providers/provider-openrouter/test/pricing.test.js +45 -0
  121. package/dist/internal-providers/provider-openrouter/test/provider.test.d.ts +1 -0
  122. package/dist/internal-providers/provider-openrouter/test/provider.test.js +141 -0
  123. package/dist/internal-providers/provider-openrouter/test/validation.test.d.ts +1 -0
  124. package/dist/internal-providers/provider-openrouter/test/validation.test.js +225 -0
  125. package/dist/launcher-service.d.ts +3 -7
  126. package/dist/launcher-service.js +144 -133
  127. package/dist/provider-modules.d.ts +6 -0
  128. package/dist/provider-modules.js +55 -0
  129. package/dist/provider-query-service.d.ts +1 -3
  130. package/dist/provider-query-service.js +140 -143
  131. package/dist/router-generation-service.d.ts +1 -3
  132. package/dist/router-generation-service.js +83 -78
  133. package/dist/services/eval-session/service.d.ts +20 -8
  134. package/dist/services/eval-session/service.js +410 -40
  135. package/dist/services/gateway-generation/service.d.ts +7 -3
  136. package/dist/services/gateway-generation/service.js +126 -63
  137. package/dist/services/generations/service.d.ts +3 -3
  138. package/dist/services/generations/service.js +5 -1
  139. package/dist/telemetry-application-service.d.ts +1 -3
  140. package/dist/telemetry-application-service.js +41 -45
  141. package/dist/test/call-attribution-store.test.js +186 -0
  142. package/dist/test/daemon-accounts.test.js +2 -2
  143. package/dist/test/daemon-data-plane.test.js +24 -45
  144. package/dist/test/daemon-fixtures.js +1 -1
  145. package/dist/test/daemon-generation-transaction.test.js +66 -2
  146. package/dist/test/daemon-runtime-state.test.js +28 -1
  147. package/dist/test/effect-daemon.test.js +38 -0
  148. package/dist/test/eval-routing-application-service.test.js +6 -6
  149. package/dist/test/eval-session-execution.test.d.ts +1 -0
  150. package/dist/test/eval-session-execution.test.js +356 -0
  151. package/dist/test/eval-session-service.test.js +70 -1
  152. package/dist/test/host-worker-session.test.js +1 -0
  153. package/dist/test/launcher-session.test.d.ts +1 -0
  154. package/dist/test/launcher-session.test.js +87 -0
  155. package/dist/test/leaderboard.test.js +25 -1
  156. package/dist/test/provider-modules.test.d.ts +1 -0
  157. package/dist/test/provider-modules.test.js +65 -0
  158. package/dist/test/routekit-upstream-sources.test.d.ts +1 -0
  159. package/dist/test/routekit-upstream-sources.test.js +40 -0
  160. package/dist/test/runtime-composition-types.test.js +11 -0
  161. package/dist/token-application-service.d.ts +1 -3
  162. package/dist/token-application-service.js +38 -44
  163. package/dist/worker.js +5 -3
  164. package/package.json +35 -11
  165. package/dist/application-services.d.ts +0 -10
  166. package/dist/application-services.js +0 -22
  167. package/dist/daemon-lifecycle.d.ts +0 -54
  168. package/dist/daemon-lifecycle.js +0 -177
  169. package/dist/test/application-services.test.js +0 -135
  170. package/dist/test/daemon-lifecycle.test.js +0 -182
  171. /package/dist/{test/application-services.test.d.ts → internal-providers/provider-anthropic/test/provider.test.d.ts} +0 -0
  172. /package/dist/{test/daemon-lifecycle.test.d.ts → internal-providers/provider-azure/test/provider.test.d.ts} +0 -0
@@ -0,0 +1,143 @@
1
+ import { fromNodeProviderChain, fromTemporaryCredentials } from "@aws-sdk/credential-providers";
2
+ import { createHash } from "node:crypto";
3
+ import { Effect } from "effect";
4
+ import { z } from "zod";
5
+ import { ProviderEnrollmentError, connectionString, preparedProviderConnection } from "@velum-labs/routekit-provider-core";
6
+ import { isBedrockRoleTemplateUrl } from "./connection-settings.js";
7
+ import { bedrockMasterCredentialsFromResources } from "./workload-credentials.js";
8
+ const regionSchema = z.string().max(64).regex(/^[a-z]{2}(?:-[a-z]+)+-\d$/);
9
+ const roleSchema = z
10
+ .string()
11
+ .max(2048)
12
+ .regex(/^arn:aws:iam::\d{12}:role\/[A-Za-z0-9+=,.@_-](?:[A-Za-z0-9+=,.@_/-]*[A-Za-z0-9+=,.@_-])?$/);
13
+ const customerRoleSchema = z
14
+ .string()
15
+ .max(2048)
16
+ .regex(/^arn:aws:iam::\d{12}:role\/routekit-cloud\/[A-Za-z0-9+=,.@_-](?:[A-Za-z0-9+=,.@_/-]*[A-Za-z0-9+=,.@_-])?$/);
17
+ const enrollmentExternalIdSchema = z.string().regex(/^[A-Za-z0-9_-]{43}$/);
18
+ const roleBindingSchema = z.object({
19
+ roleArn: roleSchema, externalId: z.string().min(32).max(1224), region: regionSchema
20
+ }).strict();
21
+ const setupStateSchema = z.object({
22
+ region: regionSchema,
23
+ externalId: enrollmentExternalIdSchema
24
+ }).strict();
25
+ function enrollmentStackName(enrollmentId) {
26
+ const readable = enrollmentId
27
+ .replaceAll(/[^A-Za-z0-9-]/gu, "-")
28
+ .replaceAll(/-+/gu, "-")
29
+ .replaceAll(/^-|-$/gu, "")
30
+ .slice(0, 80) || "connection";
31
+ const digest = createHash("sha256").update(enrollmentId).digest("hex").slice(0, 24);
32
+ return `RouteKit-${readable}-${digest}`;
33
+ }
34
+ function setupSettings(settings) {
35
+ const principal = roleSchema.parse(settings.rolePrincipalArn);
36
+ const templateUrl = z.string().max(2048).url().parse(settings.roleTemplateUrl);
37
+ if (!isBedrockRoleTemplateUrl(templateUrl)) {
38
+ throw new Error("The role template must be hosted in Amazon S3.");
39
+ }
40
+ const template = new URL(templateUrl);
41
+ return { principal, template };
42
+ }
43
+ export const bedrockRoleEnrollment = {
44
+ available: (settings) => {
45
+ try {
46
+ setupSettings(settings);
47
+ return true;
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ },
53
+ start: (context, values) => Effect.try({
54
+ try: () => {
55
+ const region = regionSchema.parse(connectionString(values, "region"));
56
+ const externalId = enrollmentExternalIdSchema.parse(context.nonce);
57
+ const { principal, template } = setupSettings(context.settings);
58
+ const url = new URL(`https://${region}.console.aws.amazon.com/cloudformation/home`);
59
+ url.searchParams.set("region", region);
60
+ const parameters = new URLSearchParams({
61
+ templateURL: template.href,
62
+ stackName: enrollmentStackName(context.enrollmentId),
63
+ param_RouteKitPrincipalArn: principal,
64
+ param_ExternalId: externalId
65
+ });
66
+ url.hash = "/stacks/create/review?" + parameters.toString();
67
+ return {
68
+ kind: "action",
69
+ action: {
70
+ kind: "external", stepId: "setup", title: "Create the AWS connection role",
71
+ url: url.href, completion: "continue",
72
+ instructions: "Create the stack in your AWS account. Then copy RoleArn from the stack Outputs and continue."
73
+ },
74
+ state: { version: 1, data: { region, externalId } }
75
+ };
76
+ },
77
+ catch: () => new ProviderEnrollmentError("setup_incomplete", "Choose a valid AWS region. The Cloud administrator must configure AWS role onboarding.")
78
+ }),
79
+ resume: (_context, state, event) => Effect.try({
80
+ try: () => {
81
+ if (state.version !== 1 || event.kind !== "submit")
82
+ throw new Error("Invalid enrollment event.");
83
+ const setup = setupStateSchema.parse(state.data);
84
+ if (event.stepId === "setup")
85
+ return {
86
+ kind: "action",
87
+ action: { kind: "form", stepId: "role", title: "Connect the created AWS role", fields: [
88
+ { id: "role-arn", label: "Role ARN", control: "text", required: true, placeholder: "arn:aws:iam::123456789012:role/routekit-cloud/…" }
89
+ ] },
90
+ state
91
+ };
92
+ if (event.stepId !== "role")
93
+ throw new Error("Invalid enrollment step.");
94
+ const roleArn = customerRoleSchema.parse(connectionString(event.values, "role-arn"));
95
+ return {
96
+ kind: "complete",
97
+ connection: preparedProviderConnection({
98
+ config: { use: "bedrock", auth: { kind: "aws-sdk" } }, environment: {},
99
+ credential: { version: 1, kind: "assume-role", payload: { ...setup, roleArn } }
100
+ })
101
+ };
102
+ },
103
+ catch: () => new ProviderEnrollmentError("setup_incomplete", "Enter the RoleArn from the completed CloudFormation stack.")
104
+ })
105
+ };
106
+ const defaultCredentialDependencies = {
107
+ nodeProviderChain: fromNodeProviderChain,
108
+ temporaryCredentials: fromTemporaryCredentials
109
+ };
110
+ export function makeBedrockRoleCredentials(dependencies = defaultCredentialDependencies) {
111
+ return {
112
+ resolve: (binding, context) => Effect.try({
113
+ try: () => {
114
+ if (binding.version !== 1 || binding.kind !== "assume-role") {
115
+ throw new Error("Unsupported AWS credential.");
116
+ }
117
+ const role = roleBindingSchema.parse(binding.payload);
118
+ const injected = bedrockMasterCredentialsFromResources(context.resources, context.sourceId);
119
+ // The host workload identity is ONLY the STS caller. Every customer
120
+ // client receives its explicitly selected assumed role, never the
121
+ // platform or Node default chain directly.
122
+ const credentials = dependencies.temporaryCredentials({
123
+ masterCredentials: injected ?? dependencies.nodeProviderChain(),
124
+ clientConfig: { region: role.region, maxAttempts: 2 },
125
+ params: {
126
+ RoleArn: role.roleArn,
127
+ ExternalId: role.externalId,
128
+ RoleSessionName: "routekit-cloud"
129
+ }
130
+ });
131
+ return {
132
+ environment: {
133
+ AWS_REGION: role.region,
134
+ AWS_DEFAULT_REGION: role.region
135
+ },
136
+ resources: { bedrockCredentials: credentials }
137
+ };
138
+ },
139
+ catch: () => new ProviderEnrollmentError("invalid_state", "The stored AWS role connection is invalid.")
140
+ })
141
+ };
142
+ }
143
+ export const bedrockRoleCredentials = makeBedrockRoleCredentials();
@@ -0,0 +1,27 @@
1
+ import { BedrockProviderSource } from "./source.js";
2
+ import { Effect } from "effect";
3
+ export declare const bedrock: {
4
+ readonly id: "bedrock";
5
+ readonly protocol: "bedrock";
6
+ readonly accountClass: "api-key";
7
+ readonly billingMode: "metered-api";
8
+ readonly connection: Readonly<{
9
+ validate?: (context: Readonly<{
10
+ sourceId: string;
11
+ config: import("@velum-labs/routekit-config-core").SourceConfig;
12
+ env: Readonly<Record<string, string | undefined>>;
13
+ resources?: Readonly<Record<string, unknown>>;
14
+ }>) => Effect.Effect<void, Error, import("@velum-labs/routekit-runtime/effect").RouteKitPlatform>;
15
+ credentialValidation?: "registry-key-probe" | "registry-key-probe-if-configured-models";
16
+ manifest: import("@velum-labs/routekit-provider-core").ProviderConnectionManifest;
17
+ prepare?: (input: import("@velum-labs/routekit-provider-core").PrepareProviderConnectionInput) => import("@velum-labs/routekit-provider-core").PreparedProviderConnection;
18
+ enrollment?: Readonly<Record<string, import("@velum-labs/routekit-provider-core").ProviderEnrollmentAdapter>>;
19
+ credentials?: import("@velum-labs/routekit-provider-core").ProviderCredentialAdapter;
20
+ subscriptionMode?: import("@velum-labs/routekit-registry").SubscriptionMode;
21
+ }>;
22
+ readonly createSource: (context: import("@velum-labs/routekit-provider-core").ProviderModuleContext) => Effect.Effect<BedrockProviderSource, never, never>;
23
+ };
24
+ export type { BedrockControlClient, BedrockMantleBackend, BedrockProviderSourceOptions, BedrockRuntime } from "./source.js";
25
+ export { BEDROCK_OPENAI_ALLOWLIST, BedrockProviderSource, fromBedrockConverseOutput, isBedrockOpenAiModel, sanitizeBedrockMantleRequestBody, toBedrockConverseInput } from "./source.js";
26
+ export { BEDROCK_MASTER_CREDENTIALS_DISABLED, BEDROCK_MASTER_CREDENTIALS_RESOURCE, bedrockMasterCredentialsFromResources, type BedrockMasterCredentialsProvider } from "./workload-credentials.js";
27
+ export { isBedrockRoleTemplateUrl } from "./connection-settings.js";
@@ -0,0 +1,47 @@
1
+ import { BedrockProviderSource } from "./source.js";
2
+ import { connectionString, defineProviderConnection, defineProvider, optionalConnectionString, optionalProviderModuleResource, preparedProviderConnection } from "@velum-labs/routekit-provider-core";
3
+ import { Effect } from "effect";
4
+ import { bedrockRoleCredentials, bedrockRoleEnrollment } from "./connection.js";
5
+ export const bedrock = defineProvider({
6
+ id: "bedrock",
7
+ protocol: "bedrock",
8
+ accountClass: "api-key",
9
+ billingMode: "metered-api",
10
+ connection: defineProviderConnection({
11
+ enrollment: { "assume-role": bedrockRoleEnrollment },
12
+ credentials: bedrockRoleCredentials,
13
+ manifest: {
14
+ version: 1, id: "bedrock", displayName: "Amazon Bedrock", category: "cloud",
15
+ description: "Connect an AWS role or access keys for Bedrock.",
16
+ methods: [{ id: "access-key", kind: "form", label: "AWS access keys", schemaRevision: 1, fields: [
17
+ { id: "access-key-id", label: "Access key ID", control: "secret", required: true },
18
+ { id: "secret-access-key", label: "Secret access key", control: "secret", required: true },
19
+ { id: "session-token", label: "Session token", control: "secret", required: false, advanced: true },
20
+ { id: "region", label: "AWS region", control: "text", required: true, placeholder: "us-east-1" }
21
+ ] }, { id: "assume-role", kind: "flow", label: "Connect AWS account", schemaRevision: 1, fields: [
22
+ { id: "region", label: "AWS region", control: "text", required: true, defaultValue: "us-east-1" }
23
+ ] }]
24
+ },
25
+ prepare: ({ values }) => {
26
+ const region = connectionString(values, "region");
27
+ const sessionToken = optionalConnectionString(values, "session-token");
28
+ return preparedProviderConnection({
29
+ config: { use: "bedrock", auth: { kind: "aws-sdk" } },
30
+ environment: {
31
+ AWS_ACCESS_KEY_ID: connectionString(values, "access-key-id"),
32
+ AWS_SECRET_ACCESS_KEY: connectionString(values, "secret-access-key"),
33
+ ...(sessionToken === undefined ? {} : { AWS_SESSION_TOKEN: sessionToken }),
34
+ AWS_REGION: region,
35
+ AWS_DEFAULT_REGION: region
36
+ }
37
+ });
38
+ }
39
+ }),
40
+ createSource: (context) => Effect.sync(() => new BedrockProviderSource({
41
+ sourceId: context.sourceId, env: context.env,
42
+ credentials: optionalProviderModuleResource(context, "bedrockCredentials", (value) => typeof value === "function")
43
+ }))
44
+ });
45
+ export { BEDROCK_OPENAI_ALLOWLIST, BedrockProviderSource, fromBedrockConverseOutput, isBedrockOpenAiModel, sanitizeBedrockMantleRequestBody, toBedrockConverseInput } from "./source.js";
46
+ export { BEDROCK_MASTER_CREDENTIALS_DISABLED, BEDROCK_MASTER_CREDENTIALS_RESOURCE, bedrockMasterCredentialsFromResources } from "./workload-credentials.js";
47
+ export { isBedrockRoleTemplateUrl } from "./connection-settings.js";
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Amazon Bedrock provider source. Anthropic models use Bedrock Converse;
3
+ * allowlisted OpenAI frontier models use the regional bedrock-mantle
4
+ * OpenAI-compatible API.
5
+ */
6
+ import { BedrockClient, type BedrockClientConfig } from "@aws-sdk/client-bedrock";
7
+ import { BedrockRuntimeClient } from "@aws-sdk/client-bedrock-runtime";
8
+ import { fromBedrockConverseOutput, toBedrockConverseInput } from "./codec.js";
9
+ import { OpenAiBackend } from "@velum-labs/routekit-provider-core";
10
+ import type { ProviderSource } from "@velum-labs/routekit-provider-core";
11
+ export type BedrockControlClient = Pick<BedrockClient, "send">;
12
+ export type BedrockRuntime = Pick<BedrockRuntimeClient, "send">;
13
+ export type BedrockMantleBackend = Pick<OpenAiBackend, "chat" | "responses">;
14
+ export type BedrockProviderSourceOptions = {
15
+ sourceId?: string;
16
+ controlClient?: BedrockControlClient;
17
+ runtimeClient?: BedrockRuntime;
18
+ env?: Readonly<Record<string, string | undefined>>;
19
+ mantleBackend?: BedrockMantleBackend;
20
+ credentials?: BedrockClientConfig["credentials"];
21
+ };
22
+ export { fromBedrockConverseOutput, toBedrockConverseInput };
23
+ export declare const BEDROCK_OPENAI_ALLOWLIST: readonly ["openai.gpt-5.6-sol", "openai.gpt-5.6-terra", "openai.gpt-5.6-luna"];
24
+ export declare function isBedrockOpenAiModel(modelId: string): boolean;
25
+ /**
26
+ * Remove OpenAI/Codex protocol fields that bedrock-mantle rejects while
27
+ * leaving native OpenAI egress unchanged.
28
+ */
29
+ export declare function sanitizeBedrockMantleRequestBody(body: unknown): unknown;
30
+ export declare class BedrockProviderSource implements ProviderSource {
31
+ #private;
32
+ readonly sourceId: string;
33
+ readonly discovery: ProviderSource["discovery"];
34
+ readonly requests: ProviderSource["requests"];
35
+ readonly responses: ProviderSource["responses"];
36
+ readonly capabilities: ProviderSource["capabilities"];
37
+ readonly resource: ProviderSource["resource"];
38
+ constructor(options?: BedrockProviderSourceOptions);
39
+ }