@shipfox/api-agent 8.0.0 → 9.0.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.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +47 -0
- package/dist/config.js +2 -1
- package/dist/config.js.map +1 -1
- package/dist/core/credential-fingerprints.js +1 -1
- package/dist/core/credential-fingerprints.js.map +1 -1
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/model-provider-config-service.d.ts.map +1 -1
- package/dist/core/model-provider-config-service.js +2 -1
- package/dist/core/model-provider-config-service.js.map +1 -1
- package/dist/core/model-provider-policy.d.ts +7 -0
- package/dist/core/model-provider-policy.d.ts.map +1 -0
- package/dist/core/model-provider-policy.js +23 -0
- package/dist/core/model-provider-policy.js.map +1 -0
- package/dist/core/model-provider-validation.d.ts +1 -1
- package/dist/core/model-provider-validation.d.ts.map +1 -1
- package/dist/core/model-provider-validation.js +1 -1
- package/dist/core/model-provider-validation.js.map +1 -1
- package/dist/core/resolve-agent-config.d.ts.map +1 -1
- package/dist/core/resolve-agent-config.js +2 -1
- package/dist/core/resolve-agent-config.js.map +1 -1
- package/dist/core/resolve-runtime-credentials.d.ts +1 -1
- package/dist/core/resolve-runtime-credentials.d.ts.map +1 -1
- package/dist/core/resolve-runtime-credentials.js +1 -1
- package/dist/core/resolve-runtime-credentials.js.map +1 -1
- package/dist/core/validation-catalog.d.ts.map +1 -1
- package/dist/core/validation-catalog.js +2 -1
- package/dist/core/validation-catalog.js.map +1 -1
- package/dist/db/schema/model-provider-configs.d.ts.map +1 -1
- package/dist/db/schema/model-provider-configs.js +5 -4
- package/dist/db/schema/model-provider-configs.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/presentation/e2eRoutes/create-model-provider.d.ts.map +1 -1
- package/dist/presentation/e2eRoutes/create-model-provider.js +2 -1
- package/dist/presentation/e2eRoutes/create-model-provider.js.map +1 -1
- package/dist/presentation/routes/errors.js +1 -1
- package/dist/presentation/routes/errors.js.map +1 -1
- package/dist/presentation/routes/set-default-model-provider.js +2 -1
- package/dist/presentation/routes/set-default-model-provider.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/drizzle/0000_daffy_leopardon.sql +5 -5
- package/drizzle/meta/0000_snapshot.json +10 -10
- package/drizzle/meta/0001_snapshot.json +10 -10
- package/package.json +17 -18
- package/src/config.ts +1 -1
- package/src/core/catalog-registry.test.ts +8 -1
- package/src/core/credential-fingerprints.ts +1 -1
- package/src/core/index.ts +7 -0
- package/src/core/model-provider-config-service.ts +1 -2
- package/src/core/model-provider-policy.ts +35 -0
- package/src/core/model-provider-validation.ts +6 -6
- package/src/core/resolve-agent-config.ts +1 -1
- package/src/core/resolve-runtime-credentials.ts +7 -8
- package/src/core/validation-catalog.ts +1 -1
- package/src/db/schema/model-provider-configs.ts +4 -4
- package/src/index.ts +6 -1
- package/src/presentation/e2eRoutes/create-model-provider.ts +2 -1
- package/src/presentation/routes/errors.ts +1 -1
- package/src/presentation/routes/set-default-model-provider.ts +1 -1
- package/test/globalSetup.ts +1 -1
- package/tsconfig.build.tsbuildinfo +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/resolve-runtime-credentials.ts"],"sourcesContent":["import {\n
|
|
1
|
+
{"version":3,"sources":["../../src/core/resolve-runtime-credentials.ts"],"sourcesContent":["import type {\n AgentRuntimeCredentialsResponseDto,\n AgentThinking,\n Harness,\n ModelProviderRef,\n SupportedModelProviderId,\n} from '@shipfox/api-agent-dto';\nimport {secretsInterModuleContract} from '@shipfox/api-secrets-dto/inter-module';\nimport {isInterModuleKnownError} from '@shipfox/inter-module';\nimport {config} from '#config.js';\nimport {getModelProviderConfig} from '#db/index.js';\nimport {agentRuntimeConfigResolvedCount} from '#metrics/index.js';\nimport {\n agentSystemNamespace,\n storeValuesToCustomRuntimeCredentials,\n storeValuesToRuntimeCredentials,\n} from './credential-fingerprints.js';\nimport type {ModelProviderConfig} from './entities/model-provider-config.js';\nimport {ModelProviderConfigNotFoundError} from './errors.js';\nimport {getModelProviderEntry, modelProviderCredentialKeysMatch} from './model-provider-policy.js';\nimport {type AgentSecretsClient, requireAgentSecretsClient} from './secrets-client.js';\n\nexport interface ResolveRuntimeCredentialsParams {\n workspaceId: string;\n harness: Harness;\n provider: ModelProviderRef;\n model: string;\n thinking: AgentThinking;\n}\n\ninterface RuntimeCredentialsConfig {\n AGENT_DEFAULT_PROVIDER?: SupportedModelProviderId | undefined;\n AGENT_DEFAULT_PROVIDER_API_KEY?: string | undefined;\n}\n\ninterface ResolveRuntimeCredentialsOptions {\n runtimeConfig?: RuntimeCredentialsConfig | undefined;\n secrets?: AgentSecretsClient | undefined;\n getCredentialBag?:\n | ((params: {workspaceId: string; namespace: string}) => Promise<Record<string, string>>)\n | undefined;\n}\n\nexport async function resolveRuntimeCredentials(\n params: ResolveRuntimeCredentialsParams,\n options?: ResolveRuntimeCredentialsOptions,\n): Promise<AgentRuntimeCredentialsResponseDto> {\n const runtimeConfig = options?.runtimeConfig ?? config;\n const secrets = options?.secrets;\n const providerConfig = await getModelProviderConfig({\n workspaceId: params.workspaceId,\n providerId: params.provider,\n });\n\n if (providerConfig) {\n try {\n const values = options?.getCredentialBag\n ? await options.getCredentialBag({\n workspaceId: params.workspaceId,\n namespace: agentSystemNamespace(params.provider),\n })\n : (\n await requireAgentSecretsClient(secrets).getSecretsByNamespace({\n workspaceId: params.workspaceId,\n namespace: agentSystemNamespace(params.provider),\n })\n ).values;\n if (providerConfig.kind === 'custom') {\n const credentials = storeValuesToCustomRuntimeCredentials(values);\n agentRuntimeConfigResolvedCount.add(1, {source: 'workspace', outcome: 'resolved'});\n return toResponse(params, credentials, providerConfig);\n }\n\n const providerId = params.provider as SupportedModelProviderId;\n const credentials = storeValuesToRuntimeCredentials(providerId, values);\n if (!modelProviderCredentialKeysMatch(providerId, credentials)) {\n throw new ModelProviderConfigNotFoundError(params.workspaceId, params.provider);\n }\n agentRuntimeConfigResolvedCount.add(1, {source: 'workspace', outcome: 'resolved'});\n return toResponse(params, credentials, providerConfig);\n } catch (error) {\n if (\n isInterModuleKnownError(secretsInterModuleContract.methods.getSecretsByNamespace, error)\n ) {\n agentRuntimeConfigResolvedCount.add(1, {\n source: 'workspace',\n outcome: 'decryption_failed',\n });\n }\n throw error;\n }\n }\n\n const instanceCredentials = instanceFallbackCredentials(params.provider, runtimeConfig);\n if (instanceCredentials) {\n agentRuntimeConfigResolvedCount.add(1, {source: 'instance', outcome: 'resolved'});\n return toResponse(params, instanceCredentials);\n }\n\n agentRuntimeConfigResolvedCount.add(1, {\n source: params.provider === runtimeConfig.AGENT_DEFAULT_PROVIDER ? 'instance' : 'workspace',\n outcome: 'unavailable',\n });\n throw new ModelProviderConfigNotFoundError(params.workspaceId, params.provider);\n}\n\nexport function getInstanceDefaultModelProviderApiKeyField(\n providerId: ModelProviderRef,\n): 'api_key' | undefined {\n const credentialFields =\n getModelProviderEntry(providerId as SupportedModelProviderId)?.credential_fields ?? [];\n const field = credentialFields[0];\n if (credentialFields.length !== 1 || field?.key !== 'api_key' || !field.secret) {\n return undefined;\n }\n return 'api_key';\n}\n\nfunction instanceFallbackCredentials(\n providerId: ModelProviderRef,\n runtimeConfig: RuntimeCredentialsConfig,\n): Record<string, string> | undefined {\n const instanceApiKey = runtimeConfig.AGENT_DEFAULT_PROVIDER_API_KEY;\n if (providerId !== runtimeConfig.AGENT_DEFAULT_PROVIDER || !instanceApiKey) return undefined;\n\n const fieldKey = getInstanceDefaultModelProviderApiKeyField(providerId);\n if (!fieldKey) return undefined;\n\n return {[fieldKey]: instanceApiKey};\n}\n\nfunction toResponse(\n params: ResolveRuntimeCredentialsParams,\n credentials: Record<string, string>,\n providerConfig?: ModelProviderConfig | undefined,\n): AgentRuntimeCredentialsResponseDto {\n const response: AgentRuntimeCredentialsResponseDto = {\n harness: params.harness,\n provider_id: params.provider,\n model: params.model,\n thinking: params.thinking,\n credentials,\n };\n\n if (providerConfig?.kind === 'custom') {\n response.custom_provider = {\n api: providerConfig.api ?? 'openai-responses',\n base_url: providerConfig.baseUrl ?? '',\n headers: providerConfig.headers ?? [],\n secret_header_names: Object.keys(credentials)\n .filter((key) => key.startsWith('header:'))\n .map((key) => key.slice('header:'.length))\n .sort(),\n models: providerConfig.models ?? [],\n requires_api_key: providerConfig.requiresApiKey,\n };\n }\n\n return response;\n}\n"],"names":["secretsInterModuleContract","isInterModuleKnownError","config","getModelProviderConfig","agentRuntimeConfigResolvedCount","agentSystemNamespace","storeValuesToCustomRuntimeCredentials","storeValuesToRuntimeCredentials","ModelProviderConfigNotFoundError","getModelProviderEntry","modelProviderCredentialKeysMatch","requireAgentSecretsClient","resolveRuntimeCredentials","params","options","runtimeConfig","secrets","providerConfig","workspaceId","providerId","provider","values","getCredentialBag","namespace","getSecretsByNamespace","kind","credentials","add","source","outcome","toResponse","error","methods","instanceCredentials","instanceFallbackCredentials","AGENT_DEFAULT_PROVIDER","getInstanceDefaultModelProviderApiKeyField","credentialFields","credential_fields","field","length","key","secret","undefined","instanceApiKey","AGENT_DEFAULT_PROVIDER_API_KEY","fieldKey","response","harness","provider_id","model","thinking","custom_provider","api","base_url","baseUrl","headers","secret_header_names","Object","keys","filter","startsWith","map","slice","sort","models","requires_api_key","requiresApiKey"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-catalog.d.ts","sourceRoot":"","sources":["../../src/core/validation-catalog.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validation-catalog.d.ts","sourceRoot":"","sources":["../../src/core/validation-catalog.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,qCAAqC,CAAC;AAIhF,iFAAiF;AACjF,wBAAgB,yBAAyB,IAAI,sBAAsB,CAgBlE"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { listEnabledHarnessTools, listHarnessDescriptors, MODEL_PROVIDER_IDS } from '@shipfox/api-agent-dto';
|
|
2
2
|
import { harnessToolDeploymentConfig } from '#config.js';
|
|
3
|
+
import { getModelProviderEntry } from './model-provider-policy.js';
|
|
3
4
|
/** Produces the versioned, JSON-safe policy snapshot consumed by Definitions. */ export function getAgentValidationCatalog() {
|
|
4
5
|
return {
|
|
5
6
|
version: 1,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/validation-catalog.ts"],"sourcesContent":["import {\n
|
|
1
|
+
{"version":3,"sources":["../../src/core/validation-catalog.ts"],"sourcesContent":["import {\n listEnabledHarnessTools,\n listHarnessDescriptors,\n MODEL_PROVIDER_IDS,\n} from '@shipfox/api-agent-dto';\nimport type {AgentValidationCatalog} from '@shipfox/api-agent-dto/inter-module';\nimport {harnessToolDeploymentConfig} from '#config.js';\nimport {getModelProviderEntry} from './model-provider-policy.js';\n\n/** Produces the versioned, JSON-safe policy snapshot consumed by Definitions. */\nexport function getAgentValidationCatalog(): AgentValidationCatalog {\n return {\n version: 1,\n providers: MODEL_PROVIDER_IDS.map((id) => ({\n id,\n support_status: getModelProviderEntry(id)?.support_status ?? 'unsupported',\n })),\n harnesses: listHarnessDescriptors().map((harness) => ({\n id: harness.id,\n supported_provider_ids: [...harness.supportedProviderIds],\n thinking_levels: [...harness.thinkingLevels],\n effective_tools: listEnabledHarnessTools(harness.id, harnessToolDeploymentConfig).map(\n (tool) => tool.name,\n ),\n })),\n };\n}\n"],"names":["listEnabledHarnessTools","listHarnessDescriptors","MODEL_PROVIDER_IDS","harnessToolDeploymentConfig","getModelProviderEntry","getAgentValidationCatalog","version","providers","map","id","support_status","harnesses","harness","supported_provider_ids","supportedProviderIds","thinking_levels","thinkingLevels","effective_tools","tool","name"],"mappings":"AAAA,SACEA,uBAAuB,EACvBC,sBAAsB,EACtBC,kBAAkB,QACb,yBAAyB;AAEhC,SAAQC,2BAA2B,QAAO,aAAa;AACvD,SAAQC,qBAAqB,QAAO,6BAA6B;AAEjE,+EAA+E,GAC/E,OAAO,SAASC;IACd,OAAO;QACLC,SAAS;QACTC,WAAWL,mBAAmBM,GAAG,CAAC,CAACC,KAAQ,CAAA;gBACzCA;gBACAC,gBAAgBN,sBAAsBK,KAAKC,kBAAkB;YAC/D,CAAA;QACAC,WAAWV,yBAAyBO,GAAG,CAAC,CAACI,UAAa,CAAA;gBACpDH,IAAIG,QAAQH,EAAE;gBACdI,wBAAwB;uBAAID,QAAQE,oBAAoB;iBAAC;gBACzDC,iBAAiB;uBAAIH,QAAQI,cAAc;iBAAC;gBAC5CC,iBAAiBjB,wBAAwBY,QAAQH,EAAE,EAAEN,6BAA6BK,GAAG,CACnF,CAACU,OAASA,KAAKC,IAAI;YAEvB,CAAA;IACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-provider-configs.d.ts","sourceRoot":"","sources":["../../../src/db/schema/model-provider-configs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"model-provider-configs.d.ts","sourceRoot":"","sources":["../../../src/db/schema/model-provider-configs.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,yCAAyC,CAAC;AAGjF,eAAO,MAAM,2BAA2B,6DAGtC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BhC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,OAAO,oBAAoB,CAAC,YAAY,CAAC;AAC7E,MAAM,MAAM,2BAA2B,GAAG,OAAO,oBAAoB,CAAC,YAAY,CAAC;AAEnF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,qBAAqB,GAAG,mBAAmB,CAkBrF"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { uuidv7PrimaryKey } from '@shipfox/node-drizzle';
|
|
2
2
|
import { sql } from 'drizzle-orm';
|
|
3
|
-
import { boolean, check, jsonb, pgEnum,
|
|
4
|
-
|
|
3
|
+
import { boolean, check, jsonb, pgEnum, text, timestamp, uniqueIndex, uuid } from 'drizzle-orm/pg-core';
|
|
4
|
+
import { pgTable } from './common.js';
|
|
5
|
+
export const modelProviderConfigKindEnum = pgEnum('agent_model_provider_config_kind', [
|
|
5
6
|
'builtin',
|
|
6
7
|
'custom'
|
|
7
8
|
]);
|
|
@@ -26,8 +27,8 @@ export const modelProviderConfigs = pgTable('model_provider_configs', {
|
|
|
26
27
|
withTimezone: true
|
|
27
28
|
}).notNull().defaultNow()
|
|
28
29
|
}, (table)=>[
|
|
29
|
-
uniqueIndex('
|
|
30
|
-
check('
|
|
30
|
+
uniqueIndex('agent_model_provider_configs_workspace_provider_unique').on(table.workspaceId, table.providerId),
|
|
31
|
+
check('agent_model_provider_configs_custom_required_fields', sql`${table.kind} <> 'custom' OR (${table.api} IS NOT NULL AND ${table.baseUrl} IS NOT NULL AND ${table.models} IS NOT NULL AND ${table.displayName} IS NOT NULL)`)
|
|
31
32
|
]);
|
|
32
33
|
export function toModelProviderConfig(row) {
|
|
33
34
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/db/schema/model-provider-configs.ts"],"sourcesContent":["import type {\n AgentThinking,\n CustomAgentModelDto,\n CustomModelProviderHeaderDto,\n ModelProviderApi,\n ModelProviderRef,\n} from '@shipfox/api-agent-dto';\nimport {uuidv7PrimaryKey} from '@shipfox/node-drizzle';\nimport {sql} from 'drizzle-orm';\nimport {\n boolean,\n check,\n jsonb,\n pgEnum,\n
|
|
1
|
+
{"version":3,"sources":["../../../src/db/schema/model-provider-configs.ts"],"sourcesContent":["import type {\n AgentThinking,\n CustomAgentModelDto,\n CustomModelProviderHeaderDto,\n ModelProviderApi,\n ModelProviderRef,\n} from '@shipfox/api-agent-dto';\nimport {uuidv7PrimaryKey} from '@shipfox/node-drizzle';\nimport {sql} from 'drizzle-orm';\nimport {\n boolean,\n check,\n jsonb,\n pgEnum,\n text,\n timestamp,\n uniqueIndex,\n uuid,\n} from 'drizzle-orm/pg-core';\nimport type {ModelProviderConfig} from '#core/entities/model-provider-config.js';\nimport {pgTable} from './common.js';\n\nexport const modelProviderConfigKindEnum = pgEnum('agent_model_provider_config_kind', [\n 'builtin',\n 'custom',\n]);\n\nexport const modelProviderConfigs = pgTable(\n 'model_provider_configs',\n {\n id: uuidv7PrimaryKey(),\n workspaceId: uuid('workspace_id').notNull(),\n providerId: text('provider_id').notNull(),\n kind: modelProviderConfigKindEnum('kind').notNull().default('builtin'),\n displayName: text('display_name'),\n api: text('api').$type<ModelProviderApi>(),\n baseUrl: text('base_url'),\n headers: jsonb('headers').$type<CustomModelProviderHeaderDto[]>(),\n secretHeaderNames: jsonb('secret_header_names').$type<string[]>(),\n models: jsonb('models').$type<CustomAgentModelDto[]>(),\n requiresApiKey: boolean('requires_api_key').notNull().default(false),\n defaultModel: text('default_model'),\n defaultThinking: text('default_thinking').notNull(),\n createdAt: timestamp('created_at', {withTimezone: true}).notNull().defaultNow(),\n updatedAt: timestamp('updated_at', {withTimezone: true}).notNull().defaultNow(),\n },\n (table) => [\n uniqueIndex('agent_model_provider_configs_workspace_provider_unique').on(\n table.workspaceId,\n table.providerId,\n ),\n check(\n 'agent_model_provider_configs_custom_required_fields',\n sql`${table.kind} <> 'custom' OR (${table.api} IS NOT NULL AND ${table.baseUrl} IS NOT NULL AND ${table.models} IS NOT NULL AND ${table.displayName} IS NOT NULL)`,\n ),\n ],\n);\n\nexport type ModelProviderConfigDb = typeof modelProviderConfigs.$inferSelect;\nexport type ModelProviderConfigCreateDb = typeof modelProviderConfigs.$inferInsert;\n\nexport function toModelProviderConfig(row: ModelProviderConfigDb): ModelProviderConfig {\n return {\n id: row.id,\n workspaceId: row.workspaceId,\n providerId: row.providerId as ModelProviderRef,\n kind: row.kind,\n displayName: row.displayName,\n api: row.api,\n baseUrl: row.baseUrl,\n headers: row.headers,\n secretHeaderNames: row.secretHeaderNames,\n models: row.models,\n requiresApiKey: row.requiresApiKey,\n defaultModel: row.defaultModel,\n defaultThinking: row.defaultThinking as AgentThinking,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n}\n"],"names":["uuidv7PrimaryKey","sql","boolean","check","jsonb","pgEnum","text","timestamp","uniqueIndex","uuid","pgTable","modelProviderConfigKindEnum","modelProviderConfigs","id","workspaceId","notNull","providerId","kind","default","displayName","api","$type","baseUrl","headers","secretHeaderNames","models","requiresApiKey","defaultModel","defaultThinking","createdAt","withTimezone","defaultNow","updatedAt","table","on","toModelProviderConfig","row"],"mappings":"AAOA,SAAQA,gBAAgB,QAAO,wBAAwB;AACvD,SAAQC,GAAG,QAAO,cAAc;AAChC,SACEC,OAAO,EACPC,KAAK,EACLC,KAAK,EACLC,MAAM,EACNC,IAAI,EACJC,SAAS,EACTC,WAAW,EACXC,IAAI,QACC,sBAAsB;AAE7B,SAAQC,OAAO,QAAO,cAAc;AAEpC,OAAO,MAAMC,8BAA8BN,OAAO,oCAAoC;IACpF;IACA;CACD,EAAE;AAEH,OAAO,MAAMO,uBAAuBF,QAClC,0BACA;IACEG,IAAIb;IACJc,aAAaL,KAAK,gBAAgBM,OAAO;IACzCC,YAAYV,KAAK,eAAeS,OAAO;IACvCE,MAAMN,4BAA4B,QAAQI,OAAO,GAAGG,OAAO,CAAC;IAC5DC,aAAab,KAAK;IAClBc,KAAKd,KAAK,OAAOe,KAAK;IACtBC,SAAShB,KAAK;IACdiB,SAASnB,MAAM,WAAWiB,KAAK;IAC/BG,mBAAmBpB,MAAM,uBAAuBiB,KAAK;IACrDI,QAAQrB,MAAM,UAAUiB,KAAK;IAC7BK,gBAAgBxB,QAAQ,oBAAoBa,OAAO,GAAGG,OAAO,CAAC;IAC9DS,cAAcrB,KAAK;IACnBsB,iBAAiBtB,KAAK,oBAAoBS,OAAO;IACjDc,WAAWtB,UAAU,cAAc;QAACuB,cAAc;IAAI,GAAGf,OAAO,GAAGgB,UAAU;IAC7EC,WAAWzB,UAAU,cAAc;QAACuB,cAAc;IAAI,GAAGf,OAAO,GAAGgB,UAAU;AAC/E,GACA,CAACE,QAAU;QACTzB,YAAY,0DAA0D0B,EAAE,CACtED,MAAMnB,WAAW,EACjBmB,MAAMjB,UAAU;QAElBb,MACE,uDACAF,GAAG,CAAC,EAAEgC,MAAMhB,IAAI,CAAC,iBAAiB,EAAEgB,MAAMb,GAAG,CAAC,iBAAiB,EAAEa,MAAMX,OAAO,CAAC,iBAAiB,EAAEW,MAAMR,MAAM,CAAC,iBAAiB,EAAEQ,MAAMd,WAAW,CAAC,aAAa,CAAC;KAErK,EACD;AAKF,OAAO,SAASgB,sBAAsBC,GAA0B;IAC9D,OAAO;QACLvB,IAAIuB,IAAIvB,EAAE;QACVC,aAAasB,IAAItB,WAAW;QAC5BE,YAAYoB,IAAIpB,UAAU;QAC1BC,MAAMmB,IAAInB,IAAI;QACdE,aAAaiB,IAAIjB,WAAW;QAC5BC,KAAKgB,IAAIhB,GAAG;QACZE,SAASc,IAAId,OAAO;QACpBC,SAASa,IAAIb,OAAO;QACpBC,mBAAmBY,IAAIZ,iBAAiB;QACxCC,QAAQW,IAAIX,MAAM;QAClBC,gBAAgBU,IAAIV,cAAc;QAClCC,cAAcS,IAAIT,YAAY;QAC9BC,iBAAiBQ,IAAIR,eAAe;QACpCC,WAAWO,IAAIP,SAAS;QACxBG,WAAWI,IAAIJ,SAAS;IAC1B;AACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ShipfoxModule } from '@shipfox/node-module';
|
|
2
2
|
import type { AgentSecretsClient } from '#core/secrets-client.js';
|
|
3
|
-
export { type AgentConfigResolutionContext, type AgentDefaultsResolver, type AgentWorkspaceSettings, buildModelProviderCatalog, type ContextualAgentConfig, catalogDefaultAgentResolver, createCustomModelProviderConfig, createWorkspaceAgentDefaultsResolver, deleteModelProviderConfig, InvalidAgentModelError, InvalidCredentialFieldsError, type ModelProviderConfig, ModelProviderConfigNotFoundError, ModelProviderValidationError, ModelProviderValidationUnavailableError, type ResolvedAgentConfig, type ResolveRuntimeCredentialsParams, resolveAgentConfig, resolveRuntimeCredentials, testAndSaveModelProviderConfig, UnsupportedModelProviderError, updateCustomModelProviderConfig, } from '#core/index.js';
|
|
3
|
+
export { type AgentConfigResolutionContext, type AgentDefaultsResolver, type AgentWorkspaceSettings, buildModelProviderCatalog, type ContextualAgentConfig, catalogDefaultAgentResolver, createCustomModelProviderConfig, createWorkspaceAgentDefaultsResolver, deleteModelProviderConfig, getModelProviderCredentialKeys, getModelProviderEntry, InvalidAgentModelError, InvalidCredentialFieldsError, isReservedModelProviderId, listSupportedModelProviders, type ModelProviderConfig, ModelProviderConfigNotFoundError, ModelProviderValidationError, ModelProviderValidationUnavailableError, modelProviderCredentialKeysMatch, type ResolvedAgentConfig, type ResolveRuntimeCredentialsParams, resolveAgentConfig, resolveRuntimeCredentials, testAndSaveModelProviderConfig, UnsupportedModelProviderError, updateCustomModelProviderConfig, } from '#core/index.js';
|
|
4
4
|
export { getAgentWorkspaceSettings, getModelProviderConfig, listModelProviderConfigs, setDefaultModelProvider, upsertModelProviderConfig, } from '#db/index.js';
|
|
5
5
|
export declare function createAgentModule(params: {
|
|
6
6
|
secrets: AgentSecretsClient;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,yBAAyB,CAAC;AAMhE,OAAO,EACL,KAAK,4BAA4B,EACjC,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,yBAAyB,EACzB,KAAK,qBAAqB,EAC1B,2BAA2B,EAC3B,+BAA+B,EAC/B,oCAAoC,EACpC,yBAAyB,EACzB,sBAAsB,EACtB,4BAA4B,EAC5B,KAAK,mBAAmB,EACxB,gCAAgC,EAChC,4BAA4B,EAC5B,uCAAuC,EACvC,KAAK,mBAAmB,EACxB,KAAK,+BAA+B,EACpC,kBAAkB,EAClB,yBAAyB,EACzB,8BAA8B,EAC9B,6BAA6B,EAC7B,+BAA+B,GAChC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,EACxB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AAEtB,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IAAC,OAAO,EAAE,kBAAkB,CAAA;CAAC,GAAG,aAAa,CAQtF"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,yBAAyB,CAAC;AAMhE,OAAO,EACL,KAAK,4BAA4B,EACjC,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,yBAAyB,EACzB,KAAK,qBAAqB,EAC1B,2BAA2B,EAC3B,+BAA+B,EAC/B,oCAAoC,EACpC,yBAAyB,EACzB,8BAA8B,EAC9B,qBAAqB,EACrB,sBAAsB,EACtB,4BAA4B,EAC5B,yBAAyB,EACzB,2BAA2B,EAC3B,KAAK,mBAAmB,EACxB,gCAAgC,EAChC,4BAA4B,EAC5B,uCAAuC,EACvC,gCAAgC,EAChC,KAAK,mBAAmB,EACxB,KAAK,+BAA+B,EACpC,kBAAkB,EAClB,yBAAyB,EACzB,8BAA8B,EAC9B,6BAA6B,EAC7B,+BAA+B,GAChC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,EACxB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AAEtB,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IAAC,OAAO,EAAE,kBAAkB,CAAA;CAAC,GAAG,aAAa,CAQtF"}
|
package/dist/index.js
CHANGED
|
@@ -2,14 +2,15 @@ import { db, migrationsPath } from '#db/index.js';
|
|
|
2
2
|
import { createAgentE2eRoutes } from '#presentation/e2eRoutes/index.js';
|
|
3
3
|
import { createAgentInterModulePresentation } from '#presentation/inter-module.js';
|
|
4
4
|
import { createAgentRoutes } from '#presentation/routes/index.js';
|
|
5
|
-
export { buildModelProviderCatalog, catalogDefaultAgentResolver, createCustomModelProviderConfig, createWorkspaceAgentDefaultsResolver, deleteModelProviderConfig, InvalidAgentModelError, InvalidCredentialFieldsError, ModelProviderConfigNotFoundError, ModelProviderValidationError, ModelProviderValidationUnavailableError, resolveAgentConfig, resolveRuntimeCredentials, testAndSaveModelProviderConfig, UnsupportedModelProviderError, updateCustomModelProviderConfig } from '#core/index.js';
|
|
5
|
+
export { buildModelProviderCatalog, catalogDefaultAgentResolver, createCustomModelProviderConfig, createWorkspaceAgentDefaultsResolver, deleteModelProviderConfig, getModelProviderCredentialKeys, getModelProviderEntry, InvalidAgentModelError, InvalidCredentialFieldsError, isReservedModelProviderId, listSupportedModelProviders, ModelProviderConfigNotFoundError, ModelProviderValidationError, ModelProviderValidationUnavailableError, modelProviderCredentialKeysMatch, resolveAgentConfig, resolveRuntimeCredentials, testAndSaveModelProviderConfig, UnsupportedModelProviderError, updateCustomModelProviderConfig } from '#core/index.js';
|
|
6
6
|
export { getAgentWorkspaceSettings, getModelProviderConfig, listModelProviderConfigs, setDefaultModelProvider, upsertModelProviderConfig } from '#db/index.js';
|
|
7
7
|
export function createAgentModule(params) {
|
|
8
8
|
return {
|
|
9
9
|
name: 'agent',
|
|
10
10
|
database: {
|
|
11
11
|
db,
|
|
12
|
-
migrationsPath
|
|
12
|
+
migrationsPath,
|
|
13
|
+
databaseNamespace: 'agent'
|
|
13
14
|
},
|
|
14
15
|
routes: createAgentRoutes(params.secrets),
|
|
15
16
|
e2eRoutes: [
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type {ShipfoxModule} from '@shipfox/node-module';\nimport type {AgentSecretsClient} from '#core/secrets-client.js';\nimport {db, migrationsPath} from '#db/index.js';\nimport {createAgentE2eRoutes} from '#presentation/e2eRoutes/index.js';\nimport {createAgentInterModulePresentation} from '#presentation/inter-module.js';\nimport {createAgentRoutes} from '#presentation/routes/index.js';\n\nexport {\n type AgentConfigResolutionContext,\n type AgentDefaultsResolver,\n type AgentWorkspaceSettings,\n buildModelProviderCatalog,\n type ContextualAgentConfig,\n catalogDefaultAgentResolver,\n createCustomModelProviderConfig,\n createWorkspaceAgentDefaultsResolver,\n deleteModelProviderConfig,\n InvalidAgentModelError,\n InvalidCredentialFieldsError,\n type ModelProviderConfig,\n ModelProviderConfigNotFoundError,\n ModelProviderValidationError,\n ModelProviderValidationUnavailableError,\n type ResolvedAgentConfig,\n type ResolveRuntimeCredentialsParams,\n resolveAgentConfig,\n resolveRuntimeCredentials,\n testAndSaveModelProviderConfig,\n UnsupportedModelProviderError,\n updateCustomModelProviderConfig,\n} from '#core/index.js';\nexport {\n getAgentWorkspaceSettings,\n getModelProviderConfig,\n listModelProviderConfigs,\n setDefaultModelProvider,\n upsertModelProviderConfig,\n} from '#db/index.js';\n\nexport function createAgentModule(params: {secrets: AgentSecretsClient}): ShipfoxModule {\n return {\n name: 'agent',\n database: {db, migrationsPath},\n routes: createAgentRoutes(params.secrets),\n e2eRoutes: [createAgentE2eRoutes(params.secrets)],\n interModulePresentations: [createAgentInterModulePresentation(params)],\n };\n}\n"],"names":["db","migrationsPath","createAgentE2eRoutes","createAgentInterModulePresentation","createAgentRoutes","buildModelProviderCatalog","catalogDefaultAgentResolver","createCustomModelProviderConfig","createWorkspaceAgentDefaultsResolver","deleteModelProviderConfig","InvalidAgentModelError","InvalidCredentialFieldsError","ModelProviderConfigNotFoundError","ModelProviderValidationError","ModelProviderValidationUnavailableError","resolveAgentConfig","resolveRuntimeCredentials","testAndSaveModelProviderConfig","UnsupportedModelProviderError","updateCustomModelProviderConfig","getAgentWorkspaceSettings","getModelProviderConfig","listModelProviderConfigs","setDefaultModelProvider","upsertModelProviderConfig","createAgentModule","params","name","database","routes","secrets","e2eRoutes","interModulePresentations"],"mappings":"AAEA,SAAQA,EAAE,EAAEC,cAAc,QAAO,eAAe;AAChD,SAAQC,oBAAoB,QAAO,mCAAmC;AACtE,SAAQC,kCAAkC,QAAO,gCAAgC;AACjF,SAAQC,iBAAiB,QAAO,gCAAgC;AAEhE,SAIEC,yBAAyB,EAEzBC,2BAA2B,EAC3BC,+BAA+B,EAC/BC,oCAAoC,EACpCC,yBAAyB,EACzBC,sBAAsB,EACtBC,4BAA4B,
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type {ShipfoxModule} from '@shipfox/node-module';\nimport type {AgentSecretsClient} from '#core/secrets-client.js';\nimport {db, migrationsPath} from '#db/index.js';\nimport {createAgentE2eRoutes} from '#presentation/e2eRoutes/index.js';\nimport {createAgentInterModulePresentation} from '#presentation/inter-module.js';\nimport {createAgentRoutes} from '#presentation/routes/index.js';\n\nexport {\n type AgentConfigResolutionContext,\n type AgentDefaultsResolver,\n type AgentWorkspaceSettings,\n buildModelProviderCatalog,\n type ContextualAgentConfig,\n catalogDefaultAgentResolver,\n createCustomModelProviderConfig,\n createWorkspaceAgentDefaultsResolver,\n deleteModelProviderConfig,\n getModelProviderCredentialKeys,\n getModelProviderEntry,\n InvalidAgentModelError,\n InvalidCredentialFieldsError,\n isReservedModelProviderId,\n listSupportedModelProviders,\n type ModelProviderConfig,\n ModelProviderConfigNotFoundError,\n ModelProviderValidationError,\n ModelProviderValidationUnavailableError,\n modelProviderCredentialKeysMatch,\n type ResolvedAgentConfig,\n type ResolveRuntimeCredentialsParams,\n resolveAgentConfig,\n resolveRuntimeCredentials,\n testAndSaveModelProviderConfig,\n UnsupportedModelProviderError,\n updateCustomModelProviderConfig,\n} from '#core/index.js';\nexport {\n getAgentWorkspaceSettings,\n getModelProviderConfig,\n listModelProviderConfigs,\n setDefaultModelProvider,\n upsertModelProviderConfig,\n} from '#db/index.js';\n\nexport function createAgentModule(params: {secrets: AgentSecretsClient}): ShipfoxModule {\n return {\n name: 'agent',\n database: {db, migrationsPath, databaseNamespace: 'agent'},\n routes: createAgentRoutes(params.secrets),\n e2eRoutes: [createAgentE2eRoutes(params.secrets)],\n interModulePresentations: [createAgentInterModulePresentation(params)],\n };\n}\n"],"names":["db","migrationsPath","createAgentE2eRoutes","createAgentInterModulePresentation","createAgentRoutes","buildModelProviderCatalog","catalogDefaultAgentResolver","createCustomModelProviderConfig","createWorkspaceAgentDefaultsResolver","deleteModelProviderConfig","getModelProviderCredentialKeys","getModelProviderEntry","InvalidAgentModelError","InvalidCredentialFieldsError","isReservedModelProviderId","listSupportedModelProviders","ModelProviderConfigNotFoundError","ModelProviderValidationError","ModelProviderValidationUnavailableError","modelProviderCredentialKeysMatch","resolveAgentConfig","resolveRuntimeCredentials","testAndSaveModelProviderConfig","UnsupportedModelProviderError","updateCustomModelProviderConfig","getAgentWorkspaceSettings","getModelProviderConfig","listModelProviderConfigs","setDefaultModelProvider","upsertModelProviderConfig","createAgentModule","params","name","database","databaseNamespace","routes","secrets","e2eRoutes","interModulePresentations"],"mappings":"AAEA,SAAQA,EAAE,EAAEC,cAAc,QAAO,eAAe;AAChD,SAAQC,oBAAoB,QAAO,mCAAmC;AACtE,SAAQC,kCAAkC,QAAO,gCAAgC;AACjF,SAAQC,iBAAiB,QAAO,gCAAgC;AAEhE,SAIEC,yBAAyB,EAEzBC,2BAA2B,EAC3BC,+BAA+B,EAC/BC,oCAAoC,EACpCC,yBAAyB,EACzBC,8BAA8B,EAC9BC,qBAAqB,EACrBC,sBAAsB,EACtBC,4BAA4B,EAC5BC,yBAAyB,EACzBC,2BAA2B,EAE3BC,gCAAgC,EAChCC,4BAA4B,EAC5BC,uCAAuC,EACvCC,gCAAgC,EAGhCC,kBAAkB,EAClBC,yBAAyB,EACzBC,8BAA8B,EAC9BC,6BAA6B,EAC7BC,+BAA+B,QAC1B,iBAAiB;AACxB,SACEC,yBAAyB,EACzBC,sBAAsB,EACtBC,wBAAwB,EACxBC,uBAAuB,EACvBC,yBAAyB,QACpB,eAAe;AAEtB,OAAO,SAASC,kBAAkBC,MAAqC;IACrE,OAAO;QACLC,MAAM;QACNC,UAAU;YAACjC;YAAIC;YAAgBiC,mBAAmB;QAAO;QACzDC,QAAQ/B,kBAAkB2B,OAAOK,OAAO;QACxCC,WAAW;YAACnC,qBAAqB6B,OAAOK,OAAO;SAAE;QACjDE,0BAA0B;YAACnC,mCAAmC4B;SAAQ;IACxE;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-model-provider.d.ts","sourceRoot":"","sources":["../../../src/presentation/e2eRoutes/create-model-provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-model-provider.d.ts","sourceRoot":"","sources":["../../../src/presentation/e2eRoutes/create-model-provider.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,yBAAyB,CAAC;AAehE,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,kBAAkB,mDA0CtE"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { DEFAULT_AGENT_THINKING
|
|
1
|
+
import { DEFAULT_AGENT_THINKING } from '@shipfox/api-agent-dto';
|
|
2
2
|
import { ClientError, defineRoute } from '@shipfox/node-fastify';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
import { agentSystemNamespace } from '#core/credential-fingerprints.js';
|
|
5
5
|
import { listHarnessProviderModels } from '#core/harness/registry.js';
|
|
6
|
+
import { getModelProviderEntry } from '#core/model-provider-policy.js';
|
|
6
7
|
import { upsertModelProviderConfig } from '#db/index.js';
|
|
7
8
|
const createE2eModelProviderBodySchema = z.object({
|
|
8
9
|
workspace_id: z.string().uuid(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/presentation/e2eRoutes/create-model-provider.ts"],"sourcesContent":["import {DEFAULT_AGENT_THINKING
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/e2eRoutes/create-model-provider.ts"],"sourcesContent":["import {DEFAULT_AGENT_THINKING} from '@shipfox/api-agent-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {z} from 'zod';\nimport {agentSystemNamespace} from '#core/credential-fingerprints.js';\nimport {listHarnessProviderModels} from '#core/harness/registry.js';\nimport {getModelProviderEntry} from '#core/model-provider-policy.js';\nimport type {AgentSecretsClient} from '#core/secrets-client.js';\nimport {upsertModelProviderConfig} from '#db/index.js';\n\nconst createE2eModelProviderBodySchema = z.object({\n workspace_id: z.string().uuid(),\n provider_id: z.literal('anthropic'),\n api_key: z.string().min(1),\n default_model: z.string().min(1).optional(),\n set_as_default: z.boolean().optional(),\n});\n\nconst createE2eModelProviderResponseSchema = z.object({\n provider_id: z.literal('anthropic'),\n});\n\nexport function createE2eModelProviderRoute(secrets: AgentSecretsClient) {\n return defineRoute({\n method: 'POST',\n path: '/model-provider',\n description: 'Create an Anthropic model provider config for E2E tests.',\n schema: {\n body: createE2eModelProviderBodySchema,\n response: {201: createE2eModelProviderResponseSchema},\n },\n handler: async (request, reply) => {\n const entry = getModelProviderEntry(request.body.provider_id);\n if (entry === undefined || entry.default_model === null) {\n throw new ClientError('Unsupported E2E model provider', 'unsupported-model-provider', {\n status: 400,\n });\n }\n const defaultModel = request.body.default_model ?? entry.default_model;\n const supportedModels = listHarnessProviderModels('claude', request.body.provider_id);\n if (!supportedModels.some((model) => model.id === defaultModel)) {\n throw new ClientError('Unsupported Anthropic default model', 'unsupported-model', {\n status: 400,\n details: {default_model: defaultModel},\n });\n }\n\n await secrets.setSecrets({\n workspaceId: request.body.workspace_id,\n namespace: agentSystemNamespace(request.body.provider_id),\n values: {API_KEY: request.body.api_key},\n });\n await upsertModelProviderConfig({\n workspaceId: request.body.workspace_id,\n providerId: request.body.provider_id,\n defaultModel,\n defaultThinking: DEFAULT_AGENT_THINKING,\n setAsDefault: request.body.set_as_default,\n });\n\n reply.code(201);\n return {provider_id: request.body.provider_id};\n },\n });\n}\n"],"names":["DEFAULT_AGENT_THINKING","ClientError","defineRoute","z","agentSystemNamespace","listHarnessProviderModels","getModelProviderEntry","upsertModelProviderConfig","createE2eModelProviderBodySchema","object","workspace_id","string","uuid","provider_id","literal","api_key","min","default_model","optional","set_as_default","boolean","createE2eModelProviderResponseSchema","createE2eModelProviderRoute","secrets","method","path","description","schema","body","response","handler","request","reply","entry","undefined","status","defaultModel","supportedModels","some","model","id","details","setSecrets","workspaceId","namespace","values","API_KEY","providerId","defaultThinking","setAsDefault","code"],"mappings":"AAAA,SAAQA,sBAAsB,QAAO,yBAAyB;AAC9D,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,CAAC,QAAO,MAAM;AACtB,SAAQC,oBAAoB,QAAO,mCAAmC;AACtE,SAAQC,yBAAyB,QAAO,4BAA4B;AACpE,SAAQC,qBAAqB,QAAO,iCAAiC;AAErE,SAAQC,yBAAyB,QAAO,eAAe;AAEvD,MAAMC,mCAAmCL,EAAEM,MAAM,CAAC;IAChDC,cAAcP,EAAEQ,MAAM,GAAGC,IAAI;IAC7BC,aAAaV,EAAEW,OAAO,CAAC;IACvBC,SAASZ,EAAEQ,MAAM,GAAGK,GAAG,CAAC;IACxBC,eAAed,EAAEQ,MAAM,GAAGK,GAAG,CAAC,GAAGE,QAAQ;IACzCC,gBAAgBhB,EAAEiB,OAAO,GAAGF,QAAQ;AACtC;AAEA,MAAMG,uCAAuClB,EAAEM,MAAM,CAAC;IACpDI,aAAaV,EAAEW,OAAO,CAAC;AACzB;AAEA,OAAO,SAASQ,4BAA4BC,OAA2B;IACrE,OAAOrB,YAAY;QACjBsB,QAAQ;QACRC,MAAM;QACNC,aAAa;QACbC,QAAQ;YACNC,MAAMpB;YACNqB,UAAU;gBAAC,KAAKR;YAAoC;QACtD;QACAS,SAAS,OAAOC,SAASC;YACvB,MAAMC,QAAQ3B,sBAAsByB,QAAQH,IAAI,CAACf,WAAW;YAC5D,IAAIoB,UAAUC,aAAaD,MAAMhB,aAAa,KAAK,MAAM;gBACvD,MAAM,IAAIhB,YAAY,kCAAkC,8BAA8B;oBACpFkC,QAAQ;gBACV;YACF;YACA,MAAMC,eAAeL,QAAQH,IAAI,CAACX,aAAa,IAAIgB,MAAMhB,aAAa;YACtE,MAAMoB,kBAAkBhC,0BAA0B,UAAU0B,QAAQH,IAAI,CAACf,WAAW;YACpF,IAAI,CAACwB,gBAAgBC,IAAI,CAAC,CAACC,QAAUA,MAAMC,EAAE,KAAKJ,eAAe;gBAC/D,MAAM,IAAInC,YAAY,uCAAuC,qBAAqB;oBAChFkC,QAAQ;oBACRM,SAAS;wBAACxB,eAAemB;oBAAY;gBACvC;YACF;YAEA,MAAMb,QAAQmB,UAAU,CAAC;gBACvBC,aAAaZ,QAAQH,IAAI,CAAClB,YAAY;gBACtCkC,WAAWxC,qBAAqB2B,QAAQH,IAAI,CAACf,WAAW;gBACxDgC,QAAQ;oBAACC,SAASf,QAAQH,IAAI,CAACb,OAAO;gBAAA;YACxC;YACA,MAAMR,0BAA0B;gBAC9BoC,aAAaZ,QAAQH,IAAI,CAAClB,YAAY;gBACtCqC,YAAYhB,QAAQH,IAAI,CAACf,WAAW;gBACpCuB;gBACAY,iBAAiBhD;gBACjBiD,cAAclB,QAAQH,IAAI,CAACT,cAAc;YAC3C;YAEAa,MAAMkB,IAAI,CAAC;YACX,OAAO;gBAACrC,aAAakB,QAAQH,IAAI,CAACf,WAAW;YAAA;QAC/C;IACF;AACF"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { getModelProviderCredentialKeys } from '@shipfox/api-agent-dto';
|
|
2
1
|
import { secretsInterModuleContract } from '@shipfox/api-secrets-dto/inter-module';
|
|
3
2
|
import { isInterModuleKnownError } from '@shipfox/inter-module';
|
|
4
3
|
import { EgressDeniedError } from '@shipfox/node-egress-guard';
|
|
5
4
|
import { ClientError } from '@shipfox/node-fastify';
|
|
6
5
|
import { CustomModelProviderConfigNotFoundError, CustomModelProviderSlugCollisionError, CustomModelProviderStoredSecretBaseUrlChangeError, InvalidAgentModelError, InvalidCredentialFieldsError, InvalidCustomModelProviderHeaderKeepError, ModelProviderConfigNotFoundError, ModelProviderValidationError, UnsupportedModelProviderError } from '#core/index.js';
|
|
6
|
+
import { getModelProviderCredentialKeys } from '#core/model-provider-policy.js';
|
|
7
7
|
export function translateModelProviderRouteError(error) {
|
|
8
8
|
if (error instanceof ModelProviderValidationError) {
|
|
9
9
|
throw new ClientError(error.sanitizedMessage, 'provider-validation-failed', {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/presentation/routes/errors.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/routes/errors.ts"],"sourcesContent":["import {secretsInterModuleContract} from '@shipfox/api-secrets-dto/inter-module';\nimport {isInterModuleKnownError} from '@shipfox/inter-module';\nimport {EgressDeniedError} from '@shipfox/node-egress-guard';\nimport {ClientError} from '@shipfox/node-fastify';\nimport {\n CustomModelProviderConfigNotFoundError,\n CustomModelProviderSlugCollisionError,\n CustomModelProviderStoredSecretBaseUrlChangeError,\n InvalidAgentModelError,\n InvalidCredentialFieldsError,\n InvalidCustomModelProviderHeaderKeepError,\n ModelProviderConfigNotFoundError,\n ModelProviderValidationError,\n UnsupportedModelProviderError,\n} from '#core/index.js';\nimport {getModelProviderCredentialKeys} from '#core/model-provider-policy.js';\n\nexport function translateModelProviderRouteError(error: unknown): never {\n if (error instanceof ModelProviderValidationError) {\n throw new ClientError(error.sanitizedMessage, 'provider-validation-failed', {\n status: 422,\n details: {\n provider_id: error.providerId,\n message: error.sanitizedMessage,\n },\n });\n }\n\n if (error instanceof EgressDeniedError) {\n throw new ClientError('Egress denied', 'egress-denied', {\n status: 400,\n details: {\n reason: error.reason,\n target: error.target,\n },\n });\n }\n\n if (error instanceof CustomModelProviderSlugCollisionError) {\n throw new ClientError('Custom model provider slug already exists', 'slug-collision', {\n status: 409,\n details: {provider_id: error.providerId},\n });\n }\n\n if (error instanceof CustomModelProviderConfigNotFoundError) {\n throw new ClientError('Custom model provider configuration not found', 'not-found', {\n status: 404,\n details: {provider_id: error.providerId},\n });\n }\n\n if (error instanceof InvalidCustomModelProviderHeaderKeepError) {\n throw new ClientError('Invalid kept secret header', 'invalid-header-keep', {\n status: 422,\n details: {provider_id: error.providerId, name: error.headerName},\n });\n }\n\n if (error instanceof CustomModelProviderStoredSecretBaseUrlChangeError) {\n throw new ClientError(\n 'Stored custom model provider secrets cannot be reused with a changed base URL',\n 'stored-secret-base-url-changed',\n {\n status: 422,\n details: {provider_id: error.providerId},\n },\n );\n }\n\n if (error instanceof InvalidCredentialFieldsError) {\n throw new ClientError('Invalid credential fields', 'invalid-credential-fields', {\n status: 422,\n details: {\n provider_id: error.providerId,\n expected_keys: getModelProviderCredentialKeys(error.providerId) ?? [],\n },\n });\n }\n\n if (error instanceof InvalidAgentModelError) {\n throw new ClientError('Invalid agent model', 'invalid-agent-model', {\n status: 422,\n details: {\n harness: error.harness,\n provider_id: error.providerId,\n model: error.model,\n },\n });\n }\n\n if (error instanceof UnsupportedModelProviderError) {\n throw new ClientError('Provider is not supported', 'provider-unsupported', {\n status: 422,\n details: {provider_id: error.providerId},\n });\n }\n\n if (error instanceof ModelProviderConfigNotFoundError) {\n throw new ClientError('Provider is not configured', 'provider-not-configured', {\n status: 422,\n details: {\n provider_id: error.providerId,\n },\n });\n }\n\n if (isInterModuleKnownError(secretsInterModuleContract.methods.setSecrets, error)) {\n if (error.code === 'workspace-secret-cap-exceeded') {\n throw new ClientError('Workspace secret cap exceeded', 'workspace-secret-cap-exceeded', {\n status: 409,\n details: {cap: error.details.cap},\n });\n }\n throw new ClientError('Secret value is too large', 'value-too-large', {\n status: 400,\n details: {max_bytes: error.details.maxBytes},\n });\n }\n\n throw error;\n}\n"],"names":["secretsInterModuleContract","isInterModuleKnownError","EgressDeniedError","ClientError","CustomModelProviderConfigNotFoundError","CustomModelProviderSlugCollisionError","CustomModelProviderStoredSecretBaseUrlChangeError","InvalidAgentModelError","InvalidCredentialFieldsError","InvalidCustomModelProviderHeaderKeepError","ModelProviderConfigNotFoundError","ModelProviderValidationError","UnsupportedModelProviderError","getModelProviderCredentialKeys","translateModelProviderRouteError","error","sanitizedMessage","status","details","provider_id","providerId","message","reason","target","name","headerName","expected_keys","harness","model","methods","setSecrets","code","cap","max_bytes","maxBytes"],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { setDefaultModelProviderBodySchema, setDefaultModelProviderResponseSchema } from '@shipfox/api-agent-dto';
|
|
2
2
|
import { requireWorkspaceAccess } from '@shipfox/api-auth-context';
|
|
3
3
|
import { defineRoute } from '@shipfox/node-fastify';
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import { UnsupportedModelProviderError } from '#core/index.js';
|
|
6
|
+
import { getModelProviderEntry } from '#core/model-provider-policy.js';
|
|
6
7
|
import { getModelProviderConfig, setDefaultModelProvider } from '#db/index.js';
|
|
7
8
|
import { translateModelProviderRouteError } from './errors.js';
|
|
8
9
|
export const setDefaultModelProviderRoute = defineRoute({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/presentation/routes/set-default-model-provider.ts"],"sourcesContent":["import {\n
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/routes/set-default-model-provider.ts"],"sourcesContent":["import {\n setDefaultModelProviderBodySchema,\n setDefaultModelProviderResponseSchema,\n} from '@shipfox/api-agent-dto';\nimport {requireWorkspaceAccess} from '@shipfox/api-auth-context';\nimport {defineRoute} from '@shipfox/node-fastify';\nimport {z} from 'zod';\nimport {UnsupportedModelProviderError} from '#core/index.js';\nimport {getModelProviderEntry} from '#core/model-provider-policy.js';\nimport {getModelProviderConfig, setDefaultModelProvider} from '#db/index.js';\nimport {translateModelProviderRouteError} from './errors.js';\n\nexport const setDefaultModelProviderRoute = defineRoute({\n method: 'PUT',\n path: '/default-model-provider',\n description: 'Set the default model provider for a workspace',\n schema: {\n params: z.object({workspaceId: z.string().uuid()}),\n body: setDefaultModelProviderBodySchema,\n response: {\n 200: setDefaultModelProviderResponseSchema,\n },\n },\n errorHandler: translateModelProviderRouteError,\n handler: async (request) => {\n const {workspaceId} = request.params;\n requireWorkspaceAccess({request, workspaceId});\n\n const existingConfig = await getModelProviderConfig({\n workspaceId,\n providerId: request.body.provider_id,\n });\n if (existingConfig?.kind !== 'custom') {\n const entry = getModelProviderEntry(request.body.provider_id);\n if (entry === undefined || entry.support_status !== 'supported') {\n throw new UnsupportedModelProviderError(request.body.provider_id);\n }\n }\n\n const settings = await setDefaultModelProvider({\n workspaceId,\n providerId: request.body.provider_id,\n });\n\n return {default_provider_id: settings.defaultProviderId};\n },\n});\n"],"names":["setDefaultModelProviderBodySchema","setDefaultModelProviderResponseSchema","requireWorkspaceAccess","defineRoute","z","UnsupportedModelProviderError","getModelProviderEntry","getModelProviderConfig","setDefaultModelProvider","translateModelProviderRouteError","setDefaultModelProviderRoute","method","path","description","schema","params","object","workspaceId","string","uuid","body","response","errorHandler","handler","request","existingConfig","providerId","provider_id","kind","entry","undefined","support_status","settings","default_provider_id","defaultProviderId"],"mappings":"AAAA,SACEA,iCAAiC,EACjCC,qCAAqC,QAChC,yBAAyB;AAChC,SAAQC,sBAAsB,QAAO,4BAA4B;AACjE,SAAQC,WAAW,QAAO,wBAAwB;AAClD,SAAQC,CAAC,QAAO,MAAM;AACtB,SAAQC,6BAA6B,QAAO,iBAAiB;AAC7D,SAAQC,qBAAqB,QAAO,iCAAiC;AACrE,SAAQC,sBAAsB,EAAEC,uBAAuB,QAAO,eAAe;AAC7E,SAAQC,gCAAgC,QAAO,cAAc;AAE7D,OAAO,MAAMC,+BAA+BP,YAAY;IACtDQ,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,QAAQX,EAAEY,MAAM,CAAC;YAACC,aAAab,EAAEc,MAAM,GAAGC,IAAI;QAAE;QAChDC,MAAMpB;QACNqB,UAAU;YACR,KAAKpB;QACP;IACF;IACAqB,cAAcb;IACdc,SAAS,OAAOC;QACd,MAAM,EAACP,WAAW,EAAC,GAAGO,QAAQT,MAAM;QACpCb,uBAAuB;YAACsB;YAASP;QAAW;QAE5C,MAAMQ,iBAAiB,MAAMlB,uBAAuB;YAClDU;YACAS,YAAYF,QAAQJ,IAAI,CAACO,WAAW;QACtC;QACA,IAAIF,gBAAgBG,SAAS,UAAU;YACrC,MAAMC,QAAQvB,sBAAsBkB,QAAQJ,IAAI,CAACO,WAAW;YAC5D,IAAIE,UAAUC,aAAaD,MAAME,cAAc,KAAK,aAAa;gBAC/D,MAAM,IAAI1B,8BAA8BmB,QAAQJ,IAAI,CAACO,WAAW;YAClE;QACF;QAEA,MAAMK,WAAW,MAAMxB,wBAAwB;YAC7CS;YACAS,YAAYF,QAAQJ,IAAI,CAACO,WAAW;QACtC;QAEA,OAAO;YAACM,qBAAqBD,SAASE,iBAAiB;QAAA;IACzD;AACF,GAAG"}
|