@opengeni/config 4.2.1-canary.39593846423001 → 4.3.1

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.
@@ -0,0 +1,32 @@
1
+ // src/defaults.ts
2
+ var DEFAULT_OPENROUTER_MODEL_ID = "openrouter/nvidia/nemotron-3-super-120b-a12b:free";
3
+ var DEFAULT_MODEL_COST_POLICY_JSON = JSON.stringify({
4
+ [DEFAULT_OPENROUTER_MODEL_ID]: "free"
5
+ });
6
+ var DEFAULT_GOAL_IDLE_BACKOFF_MS = [3e3, 3e4, 12e4, 3e5];
7
+ var DEFAULT_GOAL_IDLE_BACKOFF_MAX_MS = 6e5;
8
+ var AGENT_INSTRUCTIONS_CORE_PLACEHOLDER = "{{core}}";
9
+ var DEFAULT_AGENT_INSTRUCTIONS = [
10
+ "You are an Opengeni workspace agent: a general assistant for questions, writing, research, analysis, and technical work.",
11
+ "Follow the user's task and the applicable Skill instructions for the current role.",
12
+ "When a task needs files or commands, work inside the sandbox workspace with the filesystem and shell tools.",
13
+ "Repository resources are mounted under repos/<host>/<owner>/<repo> unless the session specifies another collision-free mount path.",
14
+ "File resources are mounted under .opengeni/files/<file-id>/ unless the session specifies another mount path.",
15
+ "Attached files are mounted read-only; copy them before modifying.",
16
+ "Installed and selected Skills appear in the session Skill index; follow its reading instructions and any role-specific guidance.",
17
+ "Provider CLIs such as gh, glab, and az may be pre-authenticated by the host through brokered git credentials or a sandbox preparation profile; try them before asking for credentials.",
18
+ "When the Git repository you change has a remote and git provider credentials are available, work on a focused branch and open a pull request.",
19
+ "Otherwise leave changes in the working tree and do not create or mention branches, commits, or pull requests unless the user asks; if the repository has a remote, say the changes are not pushed, and if the user asks for something you cannot make, say what blocks it.",
20
+ "Answer questions directly and briefly; after making changes, say what changed, how you checked it, and anything still blocked.",
21
+ AGENT_INSTRUCTIONS_CORE_PLACEHOLDER
22
+ ].join(" ");
23
+
24
+ export {
25
+ DEFAULT_OPENROUTER_MODEL_ID,
26
+ DEFAULT_MODEL_COST_POLICY_JSON,
27
+ DEFAULT_GOAL_IDLE_BACKOFF_MS,
28
+ DEFAULT_GOAL_IDLE_BACKOFF_MAX_MS,
29
+ AGENT_INSTRUCTIONS_CORE_PLACEHOLDER,
30
+ DEFAULT_AGENT_INSTRUCTIONS
31
+ };
32
+ //# sourceMappingURL=chunk-KW4MS4FH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/defaults.ts"],"sourcesContent":["// Immutable configuration defaults, independent of settings validation and provider adapters.\nexport const DEFAULT_OPENROUTER_MODEL_ID =\n \"openrouter/nvidia/nemotron-3-super-120b-a12b:free\" as const;\n\nexport const DEFAULT_MODEL_COST_POLICY_JSON = JSON.stringify({\n [DEFAULT_OPENROUTER_MODEL_ID]: \"free\",\n});\n\n/** Default pacing between consecutive no-input goal continuations. */\nexport const DEFAULT_GOAL_IDLE_BACKOFF_MS: readonly number[] = [3_000, 30_000, 120_000, 300_000];\n\nexport const DEFAULT_GOAL_IDLE_BACKOFF_MAX_MS = 600_000;\n\n/**\n * Placeholder token inside an agent-instructions persona template. The runtime\n * substitutes the non-bypassable CORE (goal-loop ownership + the dynamic\n * workspace-environment block) at this marker. A template that omits the\n * marker still gets the CORE appended after it (a non-bypassable fail-safe),\n * so a white-labelled persona can never drop the goal-loop contract or the\n * environment metadata the agent depends on.\n */\nexport const AGENT_INSTRUCTIONS_CORE_PLACEHOLDER = \"{{core}}\";\n\n/**\n * Default per-workspace agent persona template. This is the BRAND + tool-usage\n * opinion (the white-labellable surface): the general-assistant identity line,\n * the framing/opinion lines, and the mount-path facts. Domain-specific tooling\n * guidance (for example Terraform or Checkov) belongs in opt-in Skills.\n *\n * The CORE that MUST survive any override — the goal-loop ownership line (which\n * names the opengeni__goal_* tools) and the dynamic workspace-environment block\n * — is injected at AGENT_INSTRUCTIONS_CORE_PLACEHOLDER by the runtime, never\n * baked into this overridable string.\n *\n * INVARIANT: with no per-workspace override and an empty environment, the\n * runtime's composed instructions are byte-for-byte pinned by a runtime test.\n * The template below is joined by \" \", followed by \" \" + the placeholder.\n * Changing a single character here changes that default; update the pin\n * intentionally.\n */\nexport const DEFAULT_AGENT_INSTRUCTIONS = [\n \"You are an Opengeni workspace agent: a general assistant for questions, writing, research, analysis, and technical work.\",\n \"Follow the user's task and the applicable Skill instructions for the current role.\",\n \"When a task needs files or commands, work inside the sandbox workspace with the filesystem and shell tools.\",\n \"Repository resources are mounted under repos/<host>/<owner>/<repo> unless the session specifies another collision-free mount path.\",\n \"File resources are mounted under .opengeni/files/<file-id>/ unless the session specifies another mount path.\",\n \"Attached files are mounted read-only; copy them before modifying.\",\n \"Installed and selected Skills appear in the session Skill index; follow its reading instructions and any role-specific guidance.\",\n \"Provider CLIs such as gh, glab, and az may be pre-authenticated by the host through brokered git credentials or a sandbox preparation profile; try them before asking for credentials.\",\n \"When the Git repository you change has a remote and git provider credentials are available, work on a focused branch and open a pull request.\",\n \"Otherwise leave changes in the working tree and do not create or mention branches, commits, or pull requests unless the user asks; if the repository has a remote, say the changes are not pushed, and if the user asks for something you cannot make, say what blocks it.\",\n \"Answer questions directly and briefly; after making changes, say what changed, how you checked it, and anything still blocked.\",\n AGENT_INSTRUCTIONS_CORE_PLACEHOLDER,\n].join(\" \");\n"],"mappings":";AACO,IAAM,8BACX;AAEK,IAAM,iCAAiC,KAAK,UAAU;AAAA,EAC3D,CAAC,2BAA2B,GAAG;AACjC,CAAC;AAGM,IAAM,+BAAkD,CAAC,KAAO,KAAQ,MAAS,GAAO;AAExF,IAAM,mCAAmC;AAUzC,IAAM,sCAAsC;AAmB5C,IAAM,6BAA6B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG;","names":[]}
@@ -0,0 +1,32 @@
1
+ export declare const DEFAULT_OPENROUTER_MODEL_ID: "openrouter/nvidia/nemotron-3-super-120b-a12b:free";
2
+ export declare const DEFAULT_MODEL_COST_POLICY_JSON: string;
3
+ /** Default pacing between consecutive no-input goal continuations. */
4
+ export declare const DEFAULT_GOAL_IDLE_BACKOFF_MS: readonly number[];
5
+ export declare const DEFAULT_GOAL_IDLE_BACKOFF_MAX_MS = 600000;
6
+ /**
7
+ * Placeholder token inside an agent-instructions persona template. The runtime
8
+ * substitutes the non-bypassable CORE (goal-loop ownership + the dynamic
9
+ * workspace-environment block) at this marker. A template that omits the
10
+ * marker still gets the CORE appended after it (a non-bypassable fail-safe),
11
+ * so a white-labelled persona can never drop the goal-loop contract or the
12
+ * environment metadata the agent depends on.
13
+ */
14
+ export declare const AGENT_INSTRUCTIONS_CORE_PLACEHOLDER = "{{core}}";
15
+ /**
16
+ * Default per-workspace agent persona template. This is the BRAND + tool-usage
17
+ * opinion (the white-labellable surface): the general-assistant identity line,
18
+ * the framing/opinion lines, and the mount-path facts. Domain-specific tooling
19
+ * guidance (for example Terraform or Checkov) belongs in opt-in Skills.
20
+ *
21
+ * The CORE that MUST survive any override — the goal-loop ownership line (which
22
+ * names the opengeni__goal_* tools) and the dynamic workspace-environment block
23
+ * — is injected at AGENT_INSTRUCTIONS_CORE_PLACEHOLDER by the runtime, never
24
+ * baked into this overridable string.
25
+ *
26
+ * INVARIANT: with no per-workspace override and an empty environment, the
27
+ * runtime's composed instructions are byte-for-byte pinned by a runtime test.
28
+ * The template below is joined by " ", followed by " " + the placeholder.
29
+ * Changing a single character here changes that default; update the pin
30
+ * intentionally.
31
+ */
32
+ export declare const DEFAULT_AGENT_INSTRUCTIONS: string;
@@ -0,0 +1,17 @@
1
+ import {
2
+ AGENT_INSTRUCTIONS_CORE_PLACEHOLDER,
3
+ DEFAULT_AGENT_INSTRUCTIONS,
4
+ DEFAULT_GOAL_IDLE_BACKOFF_MAX_MS,
5
+ DEFAULT_GOAL_IDLE_BACKOFF_MS,
6
+ DEFAULT_MODEL_COST_POLICY_JSON,
7
+ DEFAULT_OPENROUTER_MODEL_ID
8
+ } from "./chunk-KW4MS4FH.js";
9
+ export {
10
+ AGENT_INSTRUCTIONS_CORE_PLACEHOLDER,
11
+ DEFAULT_AGENT_INSTRUCTIONS,
12
+ DEFAULT_GOAL_IDLE_BACKOFF_MAX_MS,
13
+ DEFAULT_GOAL_IDLE_BACKOFF_MS,
14
+ DEFAULT_MODEL_COST_POLICY_JSON,
15
+ DEFAULT_OPENROUTER_MODEL_ID
16
+ };
17
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export { DEFAULT_OPENROUTER_MODEL_ID, DEFAULT_MODEL_COST_POLICY_JSON, DEFAULT_GOAL_IDLE_BACKOFF_MS, DEFAULT_GOAL_IDLE_BACKOFF_MAX_MS, AGENT_INSTRUCTIONS_CORE_PLACEHOLDER, DEFAULT_AGENT_INSTRUCTIONS, } from "./defaults.js";
1
2
  export { managedUserEmailAllowed } from "./managed-user-admission.js";
2
3
  export * from "./realtime-voice-pricing.js";
3
4
  export * from "./web-search.js";
@@ -23,8 +24,6 @@ export declare const DEFAULT_MODEL_STREAM_IDLE_TIMEOUT_MS = 300000;
23
24
  * window (reasoning summaries stream as progress).
24
25
  */
25
26
  export declare const DEFAULT_MODEL_STREAM_PROGRESS_TIMEOUT_MS = 600000;
26
- export declare const DEFAULT_OPENROUTER_MODEL_ID: "openrouter/nvidia/nemotron-3-super-120b-a12b:free";
27
- export declare const DEFAULT_MODEL_COST_POLICY_JSON: string;
28
27
  export declare const SANDBOX_ARCHIVE_CAPTURE_MAX_TIMEOUT_MS: number;
29
28
  export declare const SANDBOX_ARCHIVE_CAPTURE_SETTLEMENT_GRACE_MS = 10000;
30
29
  export declare const SANDBOX_DEADLINE_COMMAND_STOP_GRACE_MS = 120000;
@@ -33,42 +32,12 @@ export declare const GOOGLE_DRIVE_PROVIDER_REQUEST_TIMEOUT_MAX_MS = 60000;
33
32
  export declare const GOOGLE_DRIVE_PROVIDER_RETRY_DELAY_MAX_MS = 60000;
34
33
  export declare const SANDBOX_LIFECYCLE_TRANSITION_MAX_WAIT_MS: number;
35
34
  export declare const SANDBOX_LIFECYCLE_RETRY_HANDOFF_GRACE_MS = 10000;
36
- /** Default pacing between consecutive no-input goal continuations. */
37
- export declare const DEFAULT_GOAL_IDLE_BACKOFF_MS: readonly number[];
38
- export declare const DEFAULT_GOAL_IDLE_BACKOFF_MAX_MS = 600000;
39
35
  /** The retained-image byte limit for one workspace: its override, else the deployment default. */
40
36
  export declare function retainedImageWorkspaceQuotaBytes(settings: Pick<Settings, "retainedImageWorkspaceQuotaBytes" | "retainedImageWorkspaceQuotaOverrides">, workspaceId: string): number;
41
37
  export declare const sandboxPreparationProfiles: Record<string, {
42
38
  env: string[];
43
39
  hooks: string[];
44
40
  }>;
45
- /**
46
- * Placeholder token inside an agent-instructions persona template. The runtime
47
- * substitutes the non-bypassable CORE (goal-loop ownership + the dynamic
48
- * workspace-environment block) at this marker. A template that omits the
49
- * marker still gets the CORE appended after it (a non-bypassable fail-safe),
50
- * so a white-labelled persona can never drop the goal-loop contract or the
51
- * environment metadata the agent depends on.
52
- */
53
- export declare const AGENT_INSTRUCTIONS_CORE_PLACEHOLDER = "{{core}}";
54
- /**
55
- * Default per-workspace agent persona template. This is the BRAND + tool-usage
56
- * opinion (the white-labellable surface): the general-assistant identity line,
57
- * the framing/opinion lines, and the mount-path facts. Domain-specific tooling
58
- * guidance (for example Terraform or Checkov) belongs in opt-in Skills.
59
- *
60
- * The CORE that MUST survive any override — the goal-loop ownership line (which
61
- * names the opengeni__goal_* tools) and the dynamic workspace-environment block
62
- * — is injected at AGENT_INSTRUCTIONS_CORE_PLACEHOLDER by the runtime, never
63
- * baked into this overridable string.
64
- *
65
- * INVARIANT: with no per-workspace override and an empty environment, the
66
- * runtime's composed instructions are byte-for-byte pinned by a runtime test.
67
- * The template below is joined by " ", followed by " " + the placeholder.
68
- * Changing a single character here changes that default; update the pin
69
- * intentionally.
70
- */
71
- export declare const DEFAULT_AGENT_INSTRUCTIONS: string;
72
41
  export declare const McpServerConnectionRefSchema: z.ZodObject<{
73
42
  connectionId: z.ZodOptional<z.ZodString>;
74
43
  accountSelection: z.ZodOptional<z.ZodLiteral<"all_eligible">>;
@@ -111,6 +80,7 @@ declare const SettingsSchema: z.ZodObject<{
111
80
  deploymentRevision: z.ZodDefault<z.ZodString>;
112
81
  serverVersion: z.ZodOptional<z.ZodString>;
113
82
  databaseUrl: z.ZodDefault<z.ZodString>;
83
+ databaseNotificationUrl: z.ZodOptional<z.ZodString>;
114
84
  apiDatabasePoolMax: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
115
85
  databasePreparedStatements: z.ZodOptional<z.ZodPreprocess<z.ZodBoolean>>;
116
86
  dbSchema: z.ZodDefault<z.ZodString>;
@@ -806,6 +776,14 @@ declare const SettingsSchema: z.ZodObject<{
806
776
  codexResponsesWebSocketEnabled: z.ZodDefault<z.ZodPreprocess<z.ZodBoolean>>;
807
777
  openaiResponsesWebSocketEnabled: z.ZodDefault<z.ZodPreprocess<z.ZodBoolean>>;
808
778
  lazyToolSearchEnabled: z.ZodDefault<z.ZodPreprocess<z.ZodBoolean>>;
779
+ decisionModelProvider: z.ZodOptional<z.ZodEnum<{
780
+ jev: "jev";
781
+ openai: "openai";
782
+ openrouter: "openrouter";
783
+ }>>;
784
+ decisionModelId: z.ZodOptional<z.ZodString>;
785
+ decisionModelApiKey: z.ZodOptional<z.ZodString>;
786
+ decisionModelBaseUrl: z.ZodOptional<z.ZodString>;
809
787
  codexFleetPolicyShadowEnabled: z.ZodDefault<z.ZodPreprocess<z.ZodBoolean>>;
810
788
  subscriptionCoreShadowEnabled: z.ZodDefault<z.ZodPreprocess<z.ZodBoolean>>;
811
789
  subscriptionCrossProviderFailoverEnabled: z.ZodDefault<z.ZodPreprocess<z.ZodBoolean>>;
@@ -1424,15 +1402,23 @@ export type VoiceInputProviderConfig = {
1424
1402
  };
1425
1403
  /** The deployment's Jev key, or undefined when it is missing or a placeholder. */
1426
1404
  export declare function usableJevApiKey(settings: Pick<Settings, "jevApiKey">): string | undefined;
1405
+ export type DecisionModelSettings = Pick<Settings, "decisionModelProvider" | "decisionModelId" | "decisionModelApiKey" | "decisionModelBaseUrl">;
1406
+ /** Explicit deployment credentials only. Compatibility is code-search-only. */
1407
+ export declare function decisionModelConfiguration(settings: DecisionModelSettings & Partial<Pick<Settings, "jevApiKey" | "jevModel" | "jevBaseUrl">>, allowLegacyCodeSearch?: boolean): {
1408
+ provider: "jev" | "openai" | "openrouter";
1409
+ model: string;
1410
+ apiKey: string;
1411
+ baseUrl?: string;
1412
+ } | undefined;
1427
1413
  /** Deployment half of agent configuration: hard capability limits. */
1428
1414
  export declare function agentConfigDeploymentPolicy(settings: FirstPartyMcpToolPolicySettings & Pick<Settings, "webSearchEnabled">): AgentConfigDeploymentLimits;
1429
1415
  /**
1430
1416
  * Deployment half of the `code_search` decision. `available` is false when
1431
- * the mode is off or no usable Jev key is configured; workspaces then cannot
1417
+ * the mode is off or no usable decision model is configured; workspaces then cannot
1432
1418
  * turn it on. `workspaceDefault` applies to workspaces without their own
1433
1419
  * setting.
1434
1420
  */
1435
- export declare function codeSearchDeploymentPolicy(settings: Pick<Settings, "codeSearchMode" | "jevApiKey">): CodeSearchDeploymentPolicy;
1421
+ export declare function codeSearchDeploymentPolicy(settings: Pick<Settings, "codeSearchMode" | "jevApiKey"> & DecisionModelSettings): CodeSearchDeploymentPolicy;
1436
1422
  /**
1437
1423
  * Reject empty / template secrets so `.env.example` placeholders like
1438
1424
  * `your-key` cannot advertise voice input as available and then 401 upstream.
@@ -1817,7 +1803,9 @@ export declare const RegistryProviderKind: z.ZodEnum<{
1817
1803
  "claude-subscription-organization": "claude-subscription-organization";
1818
1804
  "claude-subscription-workspace": "claude-subscription-workspace";
1819
1805
  "codex-subscription": "codex-subscription";
1806
+ "direct-azure-organization": "direct-azure-organization";
1820
1807
  "direct-azure-workspace": "direct-azure-workspace";
1808
+ "direct-openai-organization": "direct-openai-organization";
1821
1809
  "direct-openai-workspace": "direct-openai-workspace";
1822
1810
  "openrouter-organization": "openrouter-organization";
1823
1811
  "openrouter-workspace": "openrouter-workspace";
@@ -1878,7 +1866,9 @@ declare const RegistryProviderSchema: z.ZodObject<{
1878
1866
  "claude-subscription-organization": "claude-subscription-organization";
1879
1867
  "claude-subscription-workspace": "claude-subscription-workspace";
1880
1868
  "codex-subscription": "codex-subscription";
1869
+ "direct-azure-organization": "direct-azure-organization";
1881
1870
  "direct-azure-workspace": "direct-azure-workspace";
1871
+ "direct-openai-organization": "direct-openai-organization";
1882
1872
  "direct-openai-workspace": "direct-openai-workspace";
1883
1873
  "openrouter-organization": "openrouter-organization";
1884
1874
  "openrouter-workspace": "openrouter-workspace";
@@ -2137,6 +2127,15 @@ export declare const WORKSPACE_OPPER_PROVIDER_ID: "workspace-opper";
2137
2127
  export declare const WORKSPACE_OPPER_MODEL_ID_PREFIX: "workspace-opper/";
2138
2128
  export declare const ORGANIZATION_OPPER_PROVIDER_ID: "organization-opper";
2139
2129
  export declare const ORGANIZATION_OPPER_MODEL_ID_PREFIX: "organization-opper/";
2130
+ /**
2131
+ * Organization-owned OpenAI and Azure OpenAI: one connection each (an API key,
2132
+ * plus a resource endpoint for Azure) whose curated models (Azure deployments)
2133
+ * inherit into shared workspaces.
2134
+ */
2135
+ export declare const ORGANIZATION_OPENAI_PROVIDER_ID: "organization-openai";
2136
+ export declare const ORGANIZATION_OPENAI_MODEL_ID_PREFIX: "organization-openai/";
2137
+ export declare const ORGANIZATION_AZURE_OPENAI_PROVIDER_ID: "organization-azure-openai";
2138
+ export declare const ORGANIZATION_AZURE_OPENAI_MODEL_ID_PREFIX: "organization-azure-openai/";
2140
2139
  /** Opper's OpenAI-compatible Chat Completions surface (Bearer key). */
2141
2140
  export declare const OPPER_BASE_URL: "https://api.opper.ai/v3/compat";
2142
2141
  export declare const ModelCostClass: z.ZodEnum<{
@@ -4176,6 +4175,43 @@ export declare function withOrganizationOpperCredential(settings: Settings, apiK
4176
4175
  upstreamModelId: string;
4177
4176
  label?: string | null;
4178
4177
  }[]): Settings;
4178
+ /** The organization's own OpenAI or Azure OpenAI key (a direct, non-gateway route). */
4179
+ export type OrganizationDirectModelProvider = "openai" | "azure_openai";
4180
+ /** The organization direct route a product model id belongs to, if any. */
4181
+ export declare function organizationDirectModelProviderOf(modelId: string | null | undefined): OrganizationDirectModelProvider | null;
4182
+ export declare function organizationDirectModelIdPrefix(provider: OrganizationDirectModelProvider): string;
4183
+ /** Secret-free organization OpenAI or Azure OpenAI catalog overlay (models, and Azure's endpoint). */
4184
+ export declare function withOrganizationDirectCatalogProvider(settings: Settings, provider: OrganizationDirectModelProvider, input: {
4185
+ endpoint?: string | null | undefined;
4186
+ models: readonly {
4187
+ upstreamModelId: string;
4188
+ label?: string | null;
4189
+ }[];
4190
+ }): Settings;
4191
+ /** Runtime overlay after the worker resolves the organization's encrypted key. */
4192
+ export declare function withOrganizationDirectCredential(settings: Settings, provider: OrganizationDirectModelProvider, apiKey: string, input: {
4193
+ endpoint?: string | null | undefined;
4194
+ models: readonly {
4195
+ upstreamModelId: string;
4196
+ label?: string | null;
4197
+ }[];
4198
+ }): Settings;
4199
+ /** Secret-free organization Azure OpenAI catalog overlay (endpoint + deployments). */
4200
+ export declare function withOrganizationAzureOpenAICatalogProvider(settings: Settings, input: {
4201
+ endpoint: string | null | undefined;
4202
+ models: readonly {
4203
+ upstreamModelId: string;
4204
+ label?: string | null;
4205
+ }[];
4206
+ }): Settings;
4207
+ /** Runtime overlay after the worker resolves the organization's encrypted Azure key. */
4208
+ export declare function withOrganizationAzureOpenAICredential(settings: Settings, apiKey: string, input: {
4209
+ endpoint: string | null | undefined;
4210
+ models: readonly {
4211
+ upstreamModelId: string;
4212
+ label?: string | null;
4213
+ }[];
4214
+ }): Settings;
4179
4215
  /** Secret-free organization Vercel AI Gateway catalog overlay. */
4180
4216
  export declare function withOrganizationGatewayCatalogProvider(settings: Settings, customModels?: readonly {
4181
4217
  upstreamModelId: string;
package/dist/index.js CHANGED
@@ -1,3 +1,12 @@
1
+ import {
2
+ AGENT_INSTRUCTIONS_CORE_PLACEHOLDER,
3
+ DEFAULT_AGENT_INSTRUCTIONS,
4
+ DEFAULT_GOAL_IDLE_BACKOFF_MAX_MS,
5
+ DEFAULT_GOAL_IDLE_BACKOFF_MS,
6
+ DEFAULT_MODEL_COST_POLICY_JSON,
7
+ DEFAULT_OPENROUTER_MODEL_ID
8
+ } from "./chunk-KW4MS4FH.js";
9
+
1
10
  // src/managed-user-admission.ts
2
11
  function managedUserEmailAllowed(allowedUserEmails, email) {
3
12
  return allowedUserEmails === void 0 || typeof email === "string" && allowedUserEmails.some((allowed2) => allowed2.toLowerCase() === email.trim().toLowerCase());
@@ -885,10 +894,6 @@ var DEFAULT_MODEL_STREAM_IDLE_TIMEOUT_MS = 3e5;
885
894
  var DEFAULT_MODEL_STREAM_PROGRESS_TIMEOUT_MS = 6e5;
886
895
  var envName = /^[A-Za-z_][A-Za-z0-9_]*$/;
887
896
  var registryId = /^[A-Za-z0-9_-]+$/;
888
- var DEFAULT_OPENROUTER_MODEL_ID = "openrouter/nvidia/nemotron-3-super-120b-a12b:free";
889
- var DEFAULT_MODEL_COST_POLICY_JSON = JSON.stringify({
890
- [DEFAULT_OPENROUTER_MODEL_ID]: "free"
891
- });
892
897
  var SANDBOX_ARCHIVE_CAPTURE_MAX_TIMEOUT_MS = 60 * 6e4;
893
898
  var SANDBOX_ARCHIVE_CAPTURE_SETTLEMENT_GRACE_MS = 1e4;
894
899
  var SANDBOX_DEADLINE_COMMAND_STOP_GRACE_MS = 12e4;
@@ -911,8 +916,6 @@ var EnvBoolean = z5.preprocess((value) => {
911
916
  return value;
912
917
  }, z5.boolean());
913
918
  var PublicHttpUrl = z5.string().url().max(2048).refine((value) => /^https?:\/\//iu.test(value), "must be an http(s) URL");
914
- var DEFAULT_GOAL_IDLE_BACKOFF_MS = [3e3, 3e4, 12e4, 3e5];
915
- var DEFAULT_GOAL_IDLE_BACKOFF_MAX_MS = 6e5;
916
919
  var EnvGoalIdleBackoffMs = z5.preprocess((value) => {
917
920
  if (typeof value !== "string") return value;
918
921
  const source = value.trim();
@@ -1018,21 +1021,6 @@ var sandboxPreparationProfiles = {
1018
1021
  hooks: []
1019
1022
  }
1020
1023
  };
1021
- var AGENT_INSTRUCTIONS_CORE_PLACEHOLDER = "{{core}}";
1022
- var DEFAULT_AGENT_INSTRUCTIONS = [
1023
- "You are an Opengeni workspace agent: a general assistant for questions, writing, research, analysis, and technical work.",
1024
- "Follow the user's task and the applicable Skill instructions for the current role.",
1025
- "When a task needs files or commands, work inside the sandbox workspace with the filesystem and shell tools.",
1026
- "Repository resources are mounted under repos/<host>/<owner>/<repo> unless the session specifies another collision-free mount path.",
1027
- "File resources are mounted under .opengeni/files/<file-id>/ unless the session specifies another mount path.",
1028
- "Attached files are mounted read-only; copy them before modifying.",
1029
- "Installed and selected Skills appear in the session Skill index; follow its reading instructions and any role-specific guidance.",
1030
- "Provider CLIs such as gh, glab, and az may be pre-authenticated by the host through brokered git credentials or a sandbox preparation profile; try them before asking for credentials.",
1031
- "When the Git repository you change has a remote and git provider credentials are available, work on a focused branch and open a pull request.",
1032
- "Otherwise leave changes in the working tree and do not create or mention branches, commits, or pull requests unless the user asks; if the repository has a remote, say the changes are not pushed, and if the user asks for something you cannot make, say what blocks it.",
1033
- "Answer questions directly and briefly; after making changes, say what changed, how you checked it, and anything still blocked.",
1034
- AGENT_INSTRUCTIONS_CORE_PLACEHOLDER
1035
- ].join(" ");
1036
1024
  var McpServerConnectionRefSchema = PublicMcpServerConnectionRef;
1037
1025
  var McpOperationRecoverySchema = z5.record(
1038
1026
  z5.string().min(1).max(512).regex(/^\S+$/u),
@@ -1057,6 +1045,9 @@ var SettingsSchema = z5.object({
1057
1045
  // Absent on dev/source builds — consumers must treat it as optional.
1058
1046
  serverVersion: z5.string().optional(),
1059
1047
  databaseUrl: z5.string().default("postgres://opengeni:opengeni@127.0.0.1:5432/opengeni"),
1048
+ // LISTEN needs a session-pinned connection. Direct deployments reuse the
1049
+ // ordinary URL; transaction poolers supply this separate direct endpoint.
1050
+ databaseNotificationUrl: z5.string().optional(),
1060
1051
  // API application pool only. Managed auth owns its separate pool; readiness
1061
1052
  // reuses the application handle. Keep the historical default for existing
1062
1053
  // deployments and let operators budget this per process with replica counts.
@@ -1601,6 +1592,12 @@ var SettingsSchema = z5.object({
1601
1592
  // the Codex rollout so an emergency Codex opt-out cannot disable every model.
1602
1593
  // OPENGENI_LAZY_TOOL_SEARCH_ENABLED
1603
1594
  lazyToolSearchEnabled: EnvBoolean.default(true),
1595
+ // Typed decision-model category, separate from conversational models. Explicit
1596
+ // configuration is shared by tool discovery and code search; no account fallback.
1597
+ decisionModelProvider: z5.enum(["jev", "openai", "openrouter"]).optional(),
1598
+ decisionModelId: z5.string().trim().min(1).optional(),
1599
+ decisionModelApiKey: z5.string().optional(),
1600
+ decisionModelBaseUrl: z5.string().url().optional(),
1604
1601
  // Decision-observability fence. When enabled, the worker emits one
1605
1602
  // bounded, metadata-only adaptive-policy replay record alongside the unchanged
1606
1603
  // sticky-sharded decision. It never changes placement/admission/failover.
@@ -2595,6 +2592,26 @@ function usableDeploymentSecret(value) {
2595
2592
  function usableJevApiKey(settings) {
2596
2593
  return usableDeploymentSecret(settings.jevApiKey);
2597
2594
  }
2595
+ function decisionModelConfiguration(settings, allowLegacyCodeSearch = false) {
2596
+ const explicit = settings.decisionModelProvider !== void 0 || settings.decisionModelId !== void 0 || settings.decisionModelApiKey !== void 0 || settings.decisionModelBaseUrl !== void 0;
2597
+ if (explicit) {
2598
+ const apiKey2 = usableDeploymentSecret(settings.decisionModelApiKey);
2599
+ if (!settings.decisionModelProvider || !settings.decisionModelId || !apiKey2) return void 0;
2600
+ return {
2601
+ provider: settings.decisionModelProvider,
2602
+ model: settings.decisionModelId,
2603
+ apiKey: apiKey2,
2604
+ ...settings.decisionModelBaseUrl ? { baseUrl: settings.decisionModelBaseUrl } : {}
2605
+ };
2606
+ }
2607
+ const apiKey = allowLegacyCodeSearch ? usableJevApiKey(settings) : void 0;
2608
+ return apiKey ? {
2609
+ provider: "jev",
2610
+ model: settings.jevModel ?? "jev-latest",
2611
+ apiKey,
2612
+ ...settings.jevBaseUrl ? { baseUrl: settings.jevBaseUrl } : {}
2613
+ } : void 0;
2614
+ }
2598
2615
  function agentConfigDeploymentPolicy(settings) {
2599
2616
  return agentConfigDeploymentLimitsFromAllowlist(
2600
2617
  resolveFirstPartyMcpToolPolicy(settings).allowed,
@@ -2602,7 +2619,7 @@ function agentConfigDeploymentPolicy(settings) {
2602
2619
  );
2603
2620
  }
2604
2621
  function codeSearchDeploymentPolicy(settings) {
2605
- const available = settings.codeSearchMode !== "off" && usableJevApiKey(settings) !== void 0;
2622
+ const available = settings.codeSearchMode !== "off" && decisionModelConfiguration(settings, true) !== void 0;
2606
2623
  if (!available) return { available: false, workspaceDefault: "off" };
2607
2624
  const workspaceDefault = settings.codeSearchMode === "default_on" ? "on" : settings.codeSearchMode === "experiment" ? "split" : "off";
2608
2625
  return { available, workspaceDefault };
@@ -3045,6 +3062,8 @@ var RegistryProviderKind = z5.enum([
3045
3062
  "vercel-gateway-organization",
3046
3063
  "direct-openai-workspace",
3047
3064
  "direct-azure-workspace",
3065
+ "direct-openai-organization",
3066
+ "direct-azure-organization",
3048
3067
  "openrouter-workspace",
3049
3068
  "openrouter-organization",
3050
3069
  "opper-workspace",
@@ -3219,6 +3238,10 @@ var WORKSPACE_OPPER_PROVIDER_ID = "workspace-opper";
3219
3238
  var WORKSPACE_OPPER_MODEL_ID_PREFIX = "workspace-opper/";
3220
3239
  var ORGANIZATION_OPPER_PROVIDER_ID = "organization-opper";
3221
3240
  var ORGANIZATION_OPPER_MODEL_ID_PREFIX = "organization-opper/";
3241
+ var ORGANIZATION_OPENAI_PROVIDER_ID = "organization-openai";
3242
+ var ORGANIZATION_OPENAI_MODEL_ID_PREFIX = "organization-openai/";
3243
+ var ORGANIZATION_AZURE_OPENAI_PROVIDER_ID = "organization-azure-openai";
3244
+ var ORGANIZATION_AZURE_OPENAI_MODEL_ID_PREFIX = "organization-azure-openai/";
3222
3245
  var OPPER_BASE_URL = "https://api.opper.ai/v3/compat";
3223
3246
  var RESERVED_MODEL_PROVIDER_IDS = /* @__PURE__ */ new Set([
3224
3247
  "openai",
@@ -3234,6 +3257,8 @@ var RESERVED_MODEL_PROVIDER_IDS = /* @__PURE__ */ new Set([
3234
3257
  OPPER_PROVIDER_ID,
3235
3258
  WORKSPACE_OPPER_PROVIDER_ID,
3236
3259
  ORGANIZATION_OPPER_PROVIDER_ID,
3260
+ ORGANIZATION_OPENAI_PROVIDER_ID,
3261
+ ORGANIZATION_AZURE_OPENAI_PROVIDER_ID,
3237
3262
  "organization-anthropic",
3238
3263
  "organization-claude-subscription",
3239
3264
  "workspace-anthropic",
@@ -4457,6 +4482,7 @@ function getSettings(source = process.env) {
4457
4482
  deploymentRevision: optional("OPENGENI_DEPLOYMENT_REVISION") ?? optional("SOURCE_VERSION") ?? optional("GITHUB_SHA"),
4458
4483
  serverVersion: optional("OPENGENI_SERVER_VERSION"),
4459
4484
  databaseUrl: optional("OPENGENI_DATABASE_URL"),
4485
+ databaseNotificationUrl: optional("OPENGENI_DATABASE_NOTIFICATION_URL"),
4460
4486
  apiDatabasePoolMax: optional("OPENGENI_API_DATABASE_POOL_MAX"),
4461
4487
  databasePreparedStatements: optional("OPENGENI_DATABASE_PREPARED_STATEMENTS"),
4462
4488
  dbSchema: optional("OPENGENI_DB_SCHEMA"),
@@ -4705,6 +4731,10 @@ function getSettings(source = process.env) {
4705
4731
  codexResponsesWebSocketEnabled: optional("OPENGENI_CODEX_RESPONSES_WEBSOCKET_ENABLED"),
4706
4732
  openaiResponsesWebSocketEnabled: optional("OPENGENI_OPENAI_RESPONSES_WEBSOCKET_ENABLED"),
4707
4733
  lazyToolSearchEnabled: optional("OPENGENI_LAZY_TOOL_SEARCH_ENABLED"),
4734
+ decisionModelProvider: optional("OPENGENI_DECISION_MODEL_PROVIDER"),
4735
+ decisionModelId: optional("OPENGENI_DECISION_MODEL_ID"),
4736
+ decisionModelApiKey: optional("OPENGENI_DECISION_MODEL_API_KEY"),
4737
+ decisionModelBaseUrl: optional("OPENGENI_DECISION_MODEL_BASE_URL"),
4708
4738
  codexFleetPolicyShadowEnabled: optional("OPENGENI_CODEX_FLEET_POLICY_SHADOW_ENABLED"),
4709
4739
  subscriptionCoreShadowEnabled: optional("OPENGENI_SUBSCRIPTION_CORE_SHADOW_ENABLED"),
4710
4740
  subscriptionCrossProviderFailoverEnabled: optional(
@@ -5930,6 +5960,102 @@ function withOrganizationOpperCredential(settings, apiKey, customModels = []) {
5930
5960
  );
5931
5961
  return { ...catalog, modelProvidersJson: JSON.stringify(providers) };
5932
5962
  }
5963
+ var ORGANIZATION_DIRECT_ROUTES = {
5964
+ openai: {
5965
+ kind: "direct-openai-organization",
5966
+ id: ORGANIZATION_OPENAI_PROVIDER_ID,
5967
+ prefix: ORGANIZATION_OPENAI_MODEL_ID_PREFIX,
5968
+ label: "Organization OpenAI",
5969
+ wireProfile: "openai"
5970
+ },
5971
+ azure_openai: {
5972
+ kind: "direct-azure-organization",
5973
+ id: ORGANIZATION_AZURE_OPENAI_PROVIDER_ID,
5974
+ prefix: ORGANIZATION_AZURE_OPENAI_MODEL_ID_PREFIX,
5975
+ label: "Organization Azure OpenAI",
5976
+ wireProfile: "azure-openai"
5977
+ }
5978
+ };
5979
+ function organizationDirectModelProviderOf(modelId) {
5980
+ if (modelId?.startsWith(ORGANIZATION_OPENAI_MODEL_ID_PREFIX)) return "openai";
5981
+ if (modelId?.startsWith(ORGANIZATION_AZURE_OPENAI_MODEL_ID_PREFIX)) return "azure_openai";
5982
+ return null;
5983
+ }
5984
+ function organizationDirectModelIdPrefix(provider) {
5985
+ return ORGANIZATION_DIRECT_ROUTES[provider].prefix;
5986
+ }
5987
+ function organizationDirectRegistryProvider(settings, provider, input) {
5988
+ const route = ORGANIZATION_DIRECT_ROUTES[provider];
5989
+ const baseUrl = provider === "openai" ? "https://api.openai.com/v1" : input.endpoint ? organizationAzureOpenAIBaseUrl(input.endpoint) : null;
5990
+ if (!baseUrl) return null;
5991
+ const seen = /* @__PURE__ */ new Set();
5992
+ const models = [];
5993
+ for (const model of input.models) {
5994
+ if (seen.has(model.upstreamModelId)) continue;
5995
+ seen.add(model.upstreamModelId);
5996
+ models.push({
5997
+ id: `${route.prefix}${model.upstreamModelId}`,
5998
+ upstreamModelId: model.upstreamModelId,
5999
+ aliases: [],
6000
+ label: model.label?.trim() || model.upstreamModelId,
6001
+ capabilities: legacyModelCapabilities(settings, {
6002
+ reasoningEffort: false,
6003
+ hostedWebSearch: false
6004
+ }),
6005
+ toolOutputTruncationTokens: settings.modelToolOutputTruncationTokens
6006
+ });
6007
+ }
6008
+ if (models.length === 0) return null;
6009
+ return {
6010
+ kind: route.kind,
6011
+ id: route.id,
6012
+ label: route.label,
6013
+ api: "responses",
6014
+ wireProfile: route.wireProfile,
6015
+ baseUrl,
6016
+ ...input.apiKey ? { apiKey: input.apiKey } : {},
6017
+ models
6018
+ };
6019
+ }
6020
+ function organizationAzureOpenAIBaseUrl(endpoint) {
6021
+ let url;
6022
+ try {
6023
+ url = new URL(endpoint);
6024
+ } catch {
6025
+ return null;
6026
+ }
6027
+ if (url.protocol !== "https:" || url.username || url.password || url.port || url.search || url.hash || !/^[a-z0-9-]+\.openai\.azure\.com$/i.test(url.hostname) || !["", "/", "/openai/v1", "/openai/v1/"].includes(url.pathname))
6028
+ return null;
6029
+ return `${url.origin}/openai/v1`;
6030
+ }
6031
+ function withOrganizationDirectProvider(settings, provider, overlay) {
6032
+ if (!overlay) return settings;
6033
+ const providers = parseModelProvidersJson(settings.modelProvidersJson).filter(
6034
+ (candidate) => candidate.id !== ORGANIZATION_DIRECT_ROUTES[provider].id
6035
+ );
6036
+ return { ...settings, modelProvidersJson: JSON.stringify([...providers, overlay]) };
6037
+ }
6038
+ function withOrganizationDirectCatalogProvider(settings, provider, input) {
6039
+ return withOrganizationDirectProvider(
6040
+ settings,
6041
+ provider,
6042
+ organizationDirectRegistryProvider(settings, provider, input)
6043
+ );
6044
+ }
6045
+ function withOrganizationDirectCredential(settings, provider, apiKey, input) {
6046
+ if (!apiKey.trim()) throw new Error(`organization ${provider} credential is empty`);
6047
+ return withOrganizationDirectProvider(
6048
+ settings,
6049
+ provider,
6050
+ organizationDirectRegistryProvider(settings, provider, { ...input, apiKey })
6051
+ );
6052
+ }
6053
+ function withOrganizationAzureOpenAICatalogProvider(settings, input) {
6054
+ return withOrganizationDirectCatalogProvider(settings, "azure_openai", input);
6055
+ }
6056
+ function withOrganizationAzureOpenAICredential(settings, apiKey, input) {
6057
+ return withOrganizationDirectCredential(settings, "azure_openai", apiKey, input);
6058
+ }
5933
6059
  function withOrganizationGatewayCatalogProvider(settings, customModels = []) {
5934
6060
  if (customModels.length === 0) return settings;
5935
6061
  const providers = parseModelProvidersJson(settings.modelProvidersJson).filter(
@@ -6151,6 +6277,8 @@ function registryCredentialSource(provider) {
6151
6277
  case "anthropic-organization":
6152
6278
  case "openrouter-organization":
6153
6279
  case "opper-organization":
6280
+ case "direct-openai-organization":
6281
+ case "direct-azure-organization":
6154
6282
  return { kind: "organization_connection", mechanism: "api_key" };
6155
6283
  case "api-key":
6156
6284
  case "vercel-gateway-managed":
@@ -6184,6 +6312,8 @@ function registryBilling(provider) {
6184
6312
  case "anthropic-organization":
6185
6313
  case "openrouter-organization":
6186
6314
  case "opper-organization":
6315
+ case "direct-openai-organization":
6316
+ case "direct-azure-organization":
6187
6317
  return { upstreamPayer: "organization", metering: "external" };
6188
6318
  case "api-key":
6189
6319
  case "vercel-gateway-managed":
@@ -6576,6 +6706,8 @@ var NON_CREDIT_POLICY_PROVIDER_IDS = /* @__PURE__ */ new Set([
6576
6706
  ORGANIZATION_OPENROUTER_PROVIDER_ID,
6577
6707
  WORKSPACE_OPPER_PROVIDER_ID,
6578
6708
  ORGANIZATION_OPPER_PROVIDER_ID,
6709
+ ORGANIZATION_OPENAI_PROVIDER_ID,
6710
+ ORGANIZATION_AZURE_OPENAI_PROVIDER_ID,
6579
6711
  "workspace-anthropic",
6580
6712
  "organization-anthropic",
6581
6713
  "workspace-claude-subscription",
@@ -7057,6 +7189,7 @@ function reviewedProviderModelPricing(settings, provider, model, configured) {
7057
7189
  }
7058
7190
  break;
7059
7191
  case "direct-openai-workspace":
7192
+ case "direct-openai-organization":
7060
7193
  if (isDirectOpenAiApiBaseUrl(provider.baseUrl) && upstream.startsWith("gpt-")) {
7061
7194
  priceId = upstream;
7062
7195
  }
@@ -8729,7 +8862,7 @@ function validateModelCatalogSettings(settings, source = process.env) {
8729
8862
  }
8730
8863
  const providerIds = /* @__PURE__ */ new Set();
8731
8864
  for (const provider of registryProviders) {
8732
- if (provider.kind === "vercel-gateway-managed" || provider.kind === "vercel-gateway-workspace" || provider.kind === "vercel-gateway-organization" || provider.kind === "direct-openai-workspace" || provider.kind === "direct-azure-workspace" || provider.kind === "openrouter-workspace" || provider.kind === "openrouter-organization" || provider.kind === "opper-workspace" || provider.kind === "opper-organization" || provider.kind === "anthropic-organization" || provider.kind === "anthropic-workspace" || provider.kind === "claude-subscription-workspace" || provider.kind === "claude-subscription-organization" || provider.kind === "xai-subscription") {
8865
+ if (provider.kind === "vercel-gateway-managed" || provider.kind === "vercel-gateway-workspace" || provider.kind === "vercel-gateway-organization" || provider.kind === "direct-openai-workspace" || provider.kind === "direct-azure-workspace" || provider.kind === "direct-openai-organization" || provider.kind === "direct-azure-organization" || provider.kind === "openrouter-workspace" || provider.kind === "openrouter-organization" || provider.kind === "opper-workspace" || provider.kind === "opper-organization" || provider.kind === "anthropic-organization" || provider.kind === "anthropic-workspace" || provider.kind === "claude-subscription-workspace" || provider.kind === "claude-subscription-organization" || provider.kind === "xai-subscription") {
8733
8866
  throw new Error(
8734
8867
  `OPENGENI_MODEL_PROVIDERS_JSON provider kind ${provider.kind} is reserved for a reviewed Opengeni credential broker`
8735
8868
  );
@@ -9220,8 +9353,12 @@ export {
9220
9353
  OPPER_PROVIDER_ID,
9221
9354
  OPPER_STREAM_PROGRESS_TIMEOUT_MS,
9222
9355
  OPUS_5_5_AUTO_COMPACT_TOKEN_LIMIT,
9356
+ ORGANIZATION_AZURE_OPENAI_MODEL_ID_PREFIX,
9357
+ ORGANIZATION_AZURE_OPENAI_PROVIDER_ID,
9223
9358
  ORGANIZATION_GATEWAY_MODEL_ID_PREFIX,
9224
9359
  ORGANIZATION_GATEWAY_PROVIDER_ID,
9360
+ ORGANIZATION_OPENAI_MODEL_ID_PREFIX,
9361
+ ORGANIZATION_OPENAI_PROVIDER_ID,
9225
9362
  ORGANIZATION_OPENROUTER_MODEL_ID_PREFIX,
9226
9363
  ORGANIZATION_OPENROUTER_PROVIDER_ID,
9227
9364
  ORGANIZATION_OPPER_MODEL_ID_PREFIX,
@@ -9321,6 +9458,7 @@ export {
9321
9458
  configuredStaticUsageLimits,
9322
9459
  contextInputBudgetTokens,
9323
9460
  dbSearchPath,
9461
+ decisionModelConfiguration,
9324
9462
  defaultModelPricing,
9325
9463
  defaultVoiceInputPricing,
9326
9464
  deploymentUnavailableFirstPartyMcpTools,
@@ -9353,6 +9491,8 @@ export {
9353
9491
  modelCostClassForConfiguredModel,
9354
9492
  opperCredentialProblem,
9355
9493
  opperMaxOutputTokens,
9494
+ organizationDirectModelIdPrefix,
9495
+ organizationDirectModelProviderOf,
9356
9496
  parseClaudeUsageHeaders,
9357
9497
  parseClaudeUsageResponse,
9358
9498
  parseExposedPorts,
@@ -9448,6 +9588,10 @@ export {
9448
9588
  withClaudeConnectionCredential,
9449
9589
  withCodexCatalogProvider,
9450
9590
  withDirectModelProviders,
9591
+ withOrganizationAzureOpenAICatalogProvider,
9592
+ withOrganizationAzureOpenAICredential,
9593
+ withOrganizationDirectCatalogProvider,
9594
+ withOrganizationDirectCredential,
9451
9595
  withOrganizationGatewayCatalogProvider,
9452
9596
  withOrganizationGatewayCredential,
9453
9597
  withOrganizationOpenRouterCatalogProvider,