@shipfox/api-agent 5.0.0 → 7.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +43 -0
- package/dist/core/custom-model-provider-config-service.d.ts +4 -0
- package/dist/core/custom-model-provider-config-service.d.ts.map +1 -1
- package/dist/core/custom-model-provider-config-service.js +36 -17
- package/dist/core/custom-model-provider-config-service.js.map +1 -1
- package/dist/core/model-provider-config-service.d.ts +4 -0
- package/dist/core/model-provider-config-service.d.ts.map +1 -1
- package/dist/core/model-provider-config-service.js +27 -9
- package/dist/core/model-provider-config-service.js.map +1 -1
- package/dist/core/resolve-runtime-credentials.d.ts +6 -2
- package/dist/core/resolve-runtime-credentials.d.ts.map +1 -1
- package/dist/core/resolve-runtime-credentials.js +10 -5
- package/dist/core/resolve-runtime-credentials.js.map +1 -1
- package/dist/core/secrets-client.d.ts +4 -0
- package/dist/core/secrets-client.d.ts.map +1 -0
- package/dist/core/secrets-client.js +6 -0
- package/dist/core/secrets-client.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -13
- package/dist/index.js.map +1 -1
- package/dist/presentation/e2eRoutes/create-model-provider.d.ts +2 -1
- package/dist/presentation/e2eRoutes/create-model-provider.d.ts.map +1 -1
- package/dist/presentation/e2eRoutes/create-model-provider.js +46 -45
- package/dist/presentation/e2eRoutes/create-model-provider.js.map +1 -1
- package/dist/presentation/e2eRoutes/index.d.ts +2 -0
- package/dist/presentation/e2eRoutes/index.d.ts.map +1 -1
- package/dist/presentation/e2eRoutes/index.js +9 -6
- package/dist/presentation/e2eRoutes/index.js.map +1 -1
- package/dist/presentation/index.d.ts +1 -1
- package/dist/presentation/index.d.ts.map +1 -1
- package/dist/presentation/index.js +1 -1
- package/dist/presentation/index.js.map +1 -1
- package/dist/presentation/inter-module.d.ts +7 -0
- package/dist/presentation/inter-module.d.ts.map +1 -0
- package/dist/presentation/inter-module.js +45 -0
- package/dist/presentation/inter-module.js.map +1 -0
- package/dist/presentation/routes/create-custom-model-provider.d.ts +2 -1
- package/dist/presentation/routes/create-custom-model-provider.d.ts.map +1 -1
- package/dist/presentation/routes/create-custom-model-provider.js +39 -35
- package/dist/presentation/routes/create-custom-model-provider.js.map +1 -1
- package/dist/presentation/routes/delete-model-provider-config.d.ts +2 -1
- package/dist/presentation/routes/delete-model-provider-config.d.ts.map +1 -1
- package/dist/presentation/routes/delete-model-provider-config.js +33 -29
- package/dist/presentation/routes/delete-model-provider-config.js.map +1 -1
- package/dist/presentation/routes/discover-custom-model-provider-models-by-slug.d.ts +2 -1
- package/dist/presentation/routes/discover-custom-model-provider-models-by-slug.d.ts.map +1 -1
- package/dist/presentation/routes/discover-custom-model-provider-models-by-slug.js +32 -28
- package/dist/presentation/routes/discover-custom-model-provider-models-by-slug.js.map +1 -1
- package/dist/presentation/routes/errors.d.ts.map +1 -1
- package/dist/presentation/routes/errors.js +13 -12
- package/dist/presentation/routes/errors.js.map +1 -1
- package/dist/presentation/routes/index.d.ts +2 -0
- package/dist/presentation/routes/index.d.ts.map +1 -1
- package/dist/presentation/routes/index.js +32 -29
- package/dist/presentation/routes/index.js.map +1 -1
- package/dist/presentation/routes/update-custom-model-provider.d.ts +2 -1
- package/dist/presentation/routes/update-custom-model-provider.d.ts.map +1 -1
- package/dist/presentation/routes/update-custom-model-provider.js +41 -37
- package/dist/presentation/routes/update-custom-model-provider.js.map +1 -1
- package/dist/presentation/routes/upsert-model-provider-config.d.ts +2 -1
- package/dist/presentation/routes/upsert-model-provider-config.d.ts.map +1 -1
- package/dist/presentation/routes/upsert-model-provider-config.js +46 -42
- package/dist/presentation/routes/upsert-model-provider-config.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +12 -18
- package/src/core/custom-model-provider-config-service.ts +63 -35
- package/src/core/model-provider-config-service.test.ts +1 -3
- package/src/core/model-provider-config-service.ts +31 -16
- package/src/core/resolve-runtime-credentials.test.ts +3 -3
- package/src/core/resolve-runtime-credentials.ts +22 -8
- package/src/core/secrets-client.ts +13 -0
- package/src/index.ts +13 -8
- package/src/presentation/e2eRoutes/create-model-provider.ts +41 -39
- package/src/presentation/e2eRoutes/index.ts +6 -4
- package/src/presentation/index.ts +1 -1
- package/src/presentation/inter-module.ts +78 -0
- package/src/presentation/routes/create-custom-model-provider.ts +36 -30
- package/src/presentation/routes/delete-model-provider-config.ts +25 -22
- package/src/presentation/routes/discover-custom-model-provider-models-by-slug.ts +31 -25
- package/src/presentation/routes/errors.ts +11 -11
- package/src/presentation/routes/index.ts +32 -27
- package/src/presentation/routes/model-provider-config.test.ts +1 -1
- package/src/presentation/routes/update-custom-model-provider.ts +40 -34
- package/src/presentation/routes/upsert-model-provider-config.ts +43 -37
- package/test/fixtures/secrets-client.ts +80 -0
- package/test/globalSetup.ts +0 -9
- package/test/setup.ts +8 -0
- package/tsconfig.build.tsbuildinfo +1 -1
|
@@ -1,23 +1,28 @@
|
|
|
1
1
|
import { getModelProviderEntry, modelProviderCredentialKeysMatch } from '@shipfox/api-agent-dto';
|
|
2
|
-
import {
|
|
2
|
+
import { secretsInterModuleContract } from '@shipfox/api-secrets-dto/inter-module';
|
|
3
|
+
import { isInterModuleKnownError } from '@shipfox/inter-module';
|
|
3
4
|
import { config } from '#config.js';
|
|
4
5
|
import { getModelProviderConfig } from '#db/index.js';
|
|
5
6
|
import { agentRuntimeConfigResolvedCount } from '#metrics/index.js';
|
|
6
7
|
import { agentSystemNamespace, storeValuesToCustomRuntimeCredentials, storeValuesToRuntimeCredentials } from './credential-fingerprints.js';
|
|
7
8
|
import { ModelProviderConfigNotFoundError } from './errors.js';
|
|
9
|
+
import { requireAgentSecretsClient } from './secrets-client.js';
|
|
8
10
|
export async function resolveRuntimeCredentials(params, options) {
|
|
9
11
|
const runtimeConfig = options?.runtimeConfig ?? config;
|
|
10
|
-
const
|
|
12
|
+
const secrets = options?.secrets;
|
|
11
13
|
const providerConfig = await getModelProviderConfig({
|
|
12
14
|
workspaceId: params.workspaceId,
|
|
13
15
|
providerId: params.provider
|
|
14
16
|
});
|
|
15
17
|
if (providerConfig) {
|
|
16
18
|
try {
|
|
17
|
-
const values = await getCredentialBag({
|
|
19
|
+
const values = options?.getCredentialBag ? await options.getCredentialBag({
|
|
18
20
|
workspaceId: params.workspaceId,
|
|
19
21
|
namespace: agentSystemNamespace(params.provider)
|
|
20
|
-
})
|
|
22
|
+
}) : (await requireAgentSecretsClient(secrets).getSecretsByNamespace({
|
|
23
|
+
workspaceId: params.workspaceId,
|
|
24
|
+
namespace: agentSystemNamespace(params.provider)
|
|
25
|
+
})).values;
|
|
21
26
|
if (providerConfig.kind === 'custom') {
|
|
22
27
|
const credentials = storeValuesToCustomRuntimeCredentials(values);
|
|
23
28
|
agentRuntimeConfigResolvedCount.add(1, {
|
|
@@ -37,7 +42,7 @@ export async function resolveRuntimeCredentials(params, options) {
|
|
|
37
42
|
});
|
|
38
43
|
return toResponse(params, credentials, providerConfig);
|
|
39
44
|
} catch (error) {
|
|
40
|
-
if (error
|
|
45
|
+
if (isInterModuleKnownError(secretsInterModuleContract.methods.getSecretsByNamespace, error)) {
|
|
41
46
|
agentRuntimeConfigResolvedCount.add(1, {
|
|
42
47
|
source: 'workspace',
|
|
43
48
|
outcome: 'decryption_failed'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/resolve-runtime-credentials.ts"],"sourcesContent":["import {\n type AgentRuntimeCredentialsResponseDto,\n type AgentThinking,\n getModelProviderEntry,\n type Harness,\n type ModelProviderRef,\n modelProviderCredentialKeysMatch,\n type SupportedModelProviderId,\n} from '@shipfox/api-agent-dto';\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/core/resolve-runtime-credentials.ts"],"sourcesContent":["import {\n type AgentRuntimeCredentialsResponseDto,\n type AgentThinking,\n getModelProviderEntry,\n type Harness,\n type ModelProviderRef,\n modelProviderCredentialKeysMatch,\n type 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 {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":["getModelProviderEntry","modelProviderCredentialKeysMatch","secretsInterModuleContract","isInterModuleKnownError","config","getModelProviderConfig","agentRuntimeConfigResolvedCount","agentSystemNamespace","storeValuesToCustomRuntimeCredentials","storeValuesToRuntimeCredentials","ModelProviderConfigNotFoundError","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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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { SecretsInterModuleClient } from '@shipfox/api-secrets-dto/inter-module';
|
|
2
|
+
export type AgentSecretsClient = Pick<SecretsInterModuleClient, 'deleteSecrets' | 'getSecretsByNamespace' | 'setSecrets'>;
|
|
3
|
+
export declare function requireAgentSecretsClient(secrets: AgentSecretsClient | undefined): AgentSecretsClient;
|
|
4
|
+
//# sourceMappingURL=secrets-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets-client.d.ts","sourceRoot":"","sources":["../../src/core/secrets-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AAEpF,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,wBAAwB,EACxB,eAAe,GAAG,uBAAuB,GAAG,YAAY,CACzD,CAAC;AAEF,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,kBAAkB,GAAG,SAAS,GACtC,kBAAkB,CAGpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/secrets-client.ts"],"sourcesContent":["import type {SecretsInterModuleClient} from '@shipfox/api-secrets-dto/inter-module';\n\nexport type AgentSecretsClient = Pick<\n SecretsInterModuleClient,\n 'deleteSecrets' | 'getSecretsByNamespace' | 'setSecrets'\n>;\n\nexport function requireAgentSecretsClient(\n secrets: AgentSecretsClient | undefined,\n): AgentSecretsClient {\n if (secrets) return secrets;\n throw new Error('Agent Secrets client is not configured.');\n}\n"],"names":["requireAgentSecretsClient","secrets","Error"],"mappings":"AAOA,OAAO,SAASA,0BACdC,OAAuC;IAEvC,IAAIA,SAAS,OAAOA;IACpB,MAAM,IAAIC,MAAM;AAClB"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import type { ShipfoxModule } from '@shipfox/node-module';
|
|
2
|
+
import type { AgentSecretsClient } from '#core/secrets-client.js';
|
|
2
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
4
|
export { getAgentWorkspaceSettings, getModelProviderConfig, listModelProviderConfigs, setDefaultModelProvider, upsertModelProviderConfig, } from '#db/index.js';
|
|
4
|
-
export declare
|
|
5
|
+
export declare function createAgentModule(params: {
|
|
6
|
+
secrets: AgentSecretsClient;
|
|
7
|
+
}): ShipfoxModule;
|
|
5
8
|
//# sourceMappingURL=index.d.ts.map
|
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;
|
|
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"}
|
package/dist/index.js
CHANGED
|
@@ -1,18 +1,24 @@
|
|
|
1
1
|
import { db, migrationsPath } from '#db/index.js';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { createAgentE2eRoutes } from '#presentation/e2eRoutes/index.js';
|
|
3
|
+
import { createAgentInterModulePresentation } from '#presentation/inter-module.js';
|
|
4
|
+
import { createAgentRoutes } from '#presentation/routes/index.js';
|
|
4
5
|
export { buildModelProviderCatalog, catalogDefaultAgentResolver, createCustomModelProviderConfig, createWorkspaceAgentDefaultsResolver, deleteModelProviderConfig, InvalidAgentModelError, InvalidCredentialFieldsError, ModelProviderConfigNotFoundError, ModelProviderValidationError, ModelProviderValidationUnavailableError, resolveAgentConfig, resolveRuntimeCredentials, testAndSaveModelProviderConfig, UnsupportedModelProviderError, updateCustomModelProviderConfig } from '#core/index.js';
|
|
5
6
|
export { getAgentWorkspaceSettings, getModelProviderConfig, listModelProviderConfigs, setDefaultModelProvider, upsertModelProviderConfig } from '#db/index.js';
|
|
6
|
-
export
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
7
|
+
export function createAgentModule(params) {
|
|
8
|
+
return {
|
|
9
|
+
name: 'agent',
|
|
10
|
+
database: {
|
|
11
|
+
db,
|
|
12
|
+
migrationsPath
|
|
13
|
+
},
|
|
14
|
+
routes: createAgentRoutes(params.secrets),
|
|
15
|
+
e2eRoutes: [
|
|
16
|
+
createAgentE2eRoutes(params.secrets)
|
|
17
|
+
],
|
|
18
|
+
interModulePresentations: [
|
|
19
|
+
createAgentInterModulePresentation(params)
|
|
20
|
+
]
|
|
21
|
+
};
|
|
22
|
+
}
|
|
17
23
|
|
|
18
24
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type {ShipfoxModule} from '@shipfox/node-module';\nimport {db, migrationsPath} from '#db/index.js';\nimport {
|
|
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,EAE5BC,gCAAgC,EAChCC,4BAA4B,EAC5BC,uCAAuC,EAGvCC,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;YAAC5B;YAAIC;QAAc;QAC7B4B,QAAQzB,kBAAkBsB,OAAOI,OAAO;QACxCC,WAAW;YAAC7B,qBAAqBwB,OAAOI,OAAO;SAAE;QACjDE,0BAA0B;YAAC7B,mCAAmCuB;SAAQ;IACxE;AACF"}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
|
|
1
|
+
import type { AgentSecretsClient } from '#core/secrets-client.js';
|
|
2
|
+
export declare function createE2eModelProviderRoute(secrets: AgentSecretsClient): import("@shipfox/node-fastify").RouteDefinition;
|
|
2
3
|
//# sourceMappingURL=create-model-provider.d.ts.map
|
|
@@ -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":"AAKA,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,yBAAyB,CAAC;AAehE,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,kBAAkB,mDA0CtE"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { DEFAULT_AGENT_THINKING, getModelProviderEntry } from '@shipfox/api-agent-dto';
|
|
2
|
-
import { setSecrets } from '@shipfox/api-secrets';
|
|
3
2
|
import { ClientError, defineRoute } from '@shipfox/node-fastify';
|
|
4
3
|
import { z } from 'zod';
|
|
5
4
|
import { agentSystemNamespace } from '#core/credential-fingerprints.js';
|
|
@@ -15,52 +14,54 @@ const createE2eModelProviderBodySchema = z.object({
|
|
|
15
14
|
const createE2eModelProviderResponseSchema = z.object({
|
|
16
15
|
provider_id: z.literal('anthropic')
|
|
17
16
|
});
|
|
18
|
-
export
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
17
|
+
export function createE2eModelProviderRoute(secrets) {
|
|
18
|
+
return defineRoute({
|
|
19
|
+
method: 'POST',
|
|
20
|
+
path: '/model-provider',
|
|
21
|
+
description: 'Create an Anthropic model provider config for E2E tests.',
|
|
22
|
+
schema: {
|
|
23
|
+
body: createE2eModelProviderBodySchema,
|
|
24
|
+
response: {
|
|
25
|
+
201: createE2eModelProviderResponseSchema
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
handler: async (request, reply)=>{
|
|
29
|
+
const entry = getModelProviderEntry(request.body.provider_id);
|
|
30
|
+
if (entry === undefined || entry.default_model === null) {
|
|
31
|
+
throw new ClientError('Unsupported E2E model provider', 'unsupported-model-provider', {
|
|
32
|
+
status: 400
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const defaultModel = request.body.default_model ?? entry.default_model;
|
|
36
|
+
const supportedModels = listHarnessProviderModels('claude', request.body.provider_id);
|
|
37
|
+
if (!supportedModels.some((model)=>model.id === defaultModel)) {
|
|
38
|
+
throw new ClientError('Unsupported Anthropic default model', 'unsupported-model', {
|
|
39
|
+
status: 400,
|
|
40
|
+
details: {
|
|
41
|
+
default_model: defaultModel
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
await secrets.setSecrets({
|
|
46
|
+
workspaceId: request.body.workspace_id,
|
|
47
|
+
namespace: agentSystemNamespace(request.body.provider_id),
|
|
48
|
+
values: {
|
|
49
|
+
API_KEY: request.body.api_key
|
|
42
50
|
}
|
|
43
51
|
});
|
|
52
|
+
await upsertModelProviderConfig({
|
|
53
|
+
workspaceId: request.body.workspace_id,
|
|
54
|
+
providerId: request.body.provider_id,
|
|
55
|
+
defaultModel,
|
|
56
|
+
defaultThinking: DEFAULT_AGENT_THINKING,
|
|
57
|
+
setAsDefault: request.body.set_as_default
|
|
58
|
+
});
|
|
59
|
+
reply.code(201);
|
|
60
|
+
return {
|
|
61
|
+
provider_id: request.body.provider_id
|
|
62
|
+
};
|
|
44
63
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
namespace: agentSystemNamespace(request.body.provider_id),
|
|
48
|
-
values: {
|
|
49
|
-
API_KEY: request.body.api_key
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
await upsertModelProviderConfig({
|
|
53
|
-
workspaceId: request.body.workspace_id,
|
|
54
|
-
providerId: request.body.provider_id,
|
|
55
|
-
defaultModel,
|
|
56
|
-
defaultThinking: DEFAULT_AGENT_THINKING,
|
|
57
|
-
setAsDefault: request.body.set_as_default
|
|
58
|
-
});
|
|
59
|
-
reply.code(201);
|
|
60
|
-
return {
|
|
61
|
-
provider_id: request.body.provider_id
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
});
|
|
64
|
+
});
|
|
65
|
+
}
|
|
65
66
|
|
|
66
67
|
//# sourceMappingURL=create-model-provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/presentation/e2eRoutes/create-model-provider.ts"],"sourcesContent":["import {DEFAULT_AGENT_THINKING, getModelProviderEntry} from '@shipfox/api-agent-dto';\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/e2eRoutes/create-model-provider.ts"],"sourcesContent":["import {DEFAULT_AGENT_THINKING, getModelProviderEntry} 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 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","getModelProviderEntry","ClientError","defineRoute","z","agentSystemNamespace","listHarnessProviderModels","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,EAAEC,qBAAqB,QAAO,yBAAyB;AACrF,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,CAAC,QAAO,MAAM;AACtB,SAAQC,oBAAoB,QAAO,mCAAmC;AACtE,SAAQC,yBAAyB,QAAO,4BAA4B;AAEpE,SAAQC,yBAAyB,QAAO,eAAe;AAEvD,MAAMC,mCAAmCJ,EAAEK,MAAM,CAAC;IAChDC,cAAcN,EAAEO,MAAM,GAAGC,IAAI;IAC7BC,aAAaT,EAAEU,OAAO,CAAC;IACvBC,SAASX,EAAEO,MAAM,GAAGK,GAAG,CAAC;IACxBC,eAAeb,EAAEO,MAAM,GAAGK,GAAG,CAAC,GAAGE,QAAQ;IACzCC,gBAAgBf,EAAEgB,OAAO,GAAGF,QAAQ;AACtC;AAEA,MAAMG,uCAAuCjB,EAAEK,MAAM,CAAC;IACpDI,aAAaT,EAAEU,OAAO,CAAC;AACzB;AAEA,OAAO,SAASQ,4BAA4BC,OAA2B;IACrE,OAAOpB,YAAY;QACjBqB,QAAQ;QACRC,MAAM;QACNC,aAAa;QACbC,QAAQ;YACNC,MAAMpB;YACNqB,UAAU;gBAAC,KAAKR;YAAoC;QACtD;QACAS,SAAS,OAAOC,SAASC;YACvB,MAAMC,QAAQhC,sBAAsB8B,QAAQH,IAAI,CAACf,WAAW;YAC5D,IAAIoB,UAAUC,aAAaD,MAAMhB,aAAa,KAAK,MAAM;gBACvD,MAAM,IAAIf,YAAY,kCAAkC,8BAA8B;oBACpFiC,QAAQ;gBACV;YACF;YACA,MAAMC,eAAeL,QAAQH,IAAI,CAACX,aAAa,IAAIgB,MAAMhB,aAAa;YACtE,MAAMoB,kBAAkB/B,0BAA0B,UAAUyB,QAAQH,IAAI,CAACf,WAAW;YACpF,IAAI,CAACwB,gBAAgBC,IAAI,CAAC,CAACC,QAAUA,MAAMC,EAAE,KAAKJ,eAAe;gBAC/D,MAAM,IAAIlC,YAAY,uCAAuC,qBAAqB;oBAChFiC,QAAQ;oBACRM,SAAS;wBAACxB,eAAemB;oBAAY;gBACvC;YACF;YAEA,MAAMb,QAAQmB,UAAU,CAAC;gBACvBC,aAAaZ,QAAQH,IAAI,CAAClB,YAAY;gBACtCkC,WAAWvC,qBAAqB0B,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,3 +1,5 @@
|
|
|
1
1
|
import type { RouteGroup } from '@shipfox/node-fastify';
|
|
2
|
+
import type { AgentSecretsClient } from '#core/secrets-client.js';
|
|
3
|
+
export declare function createAgentE2eRoutes(secrets: AgentSecretsClient): RouteGroup;
|
|
2
4
|
export declare const agentE2eRoutes: RouteGroup;
|
|
3
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/presentation/e2eRoutes/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/presentation/e2eRoutes/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,yBAAyB,CAAC;AAGhE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,kBAAkB,GAAG,UAAU,CAE5E;AAED,eAAO,MAAM,cAAc,YAAmE,CAAC"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { createE2eModelProviderRoute } from './create-model-provider.js';
|
|
2
|
-
export
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
export function createAgentE2eRoutes(secrets) {
|
|
3
|
+
return {
|
|
4
|
+
prefix: '/agent',
|
|
5
|
+
routes: [
|
|
6
|
+
createE2eModelProviderRoute(secrets)
|
|
7
|
+
]
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export const agentE2eRoutes = createAgentE2eRoutes(undefined);
|
|
8
11
|
|
|
9
12
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/presentation/e2eRoutes/index.ts"],"sourcesContent":["import type {RouteGroup} from '@shipfox/node-fastify';\nimport {createE2eModelProviderRoute} from './create-model-provider.js';\n\nexport
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/e2eRoutes/index.ts"],"sourcesContent":["import type {RouteGroup} from '@shipfox/node-fastify';\nimport type {AgentSecretsClient} from '#core/secrets-client.js';\nimport {createE2eModelProviderRoute} from './create-model-provider.js';\n\nexport function createAgentE2eRoutes(secrets: AgentSecretsClient): RouteGroup {\n return {prefix: '/agent', routes: [createE2eModelProviderRoute(secrets)]};\n}\n\nexport const agentE2eRoutes = createAgentE2eRoutes(undefined as unknown as AgentSecretsClient);\n"],"names":["createE2eModelProviderRoute","createAgentE2eRoutes","secrets","prefix","routes","agentE2eRoutes","undefined"],"mappings":"AAEA,SAAQA,2BAA2B,QAAO,6BAA6B;AAEvE,OAAO,SAASC,qBAAqBC,OAA2B;IAC9D,OAAO;QAACC,QAAQ;QAAUC,QAAQ;YAACJ,4BAA4BE;SAAS;IAAA;AAC1E;AAEA,OAAO,MAAMG,iBAAiBJ,qBAAqBK,WAA4C"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { agentRoutes as routes } from './routes/index.js';
|
|
1
|
+
export { agentRoutes as routes, createAgentRoutes } from './routes/index.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/presentation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,IAAI,MAAM,EAAC,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/presentation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,IAAI,MAAM,EAAE,iBAAiB,EAAC,MAAM,mBAAmB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/presentation/index.ts"],"sourcesContent":["export {agentRoutes as routes} from './routes/index.js';\n"],"names":["agentRoutes","routes"],"mappings":"AAAA,SAAQA,eAAeC,MAAM,QAAO,oBAAoB"}
|
|
1
|
+
{"version":3,"sources":["../../src/presentation/index.ts"],"sourcesContent":["export {agentRoutes as routes, createAgentRoutes} from './routes/index.js';\n"],"names":["agentRoutes","routes","createAgentRoutes"],"mappings":"AAAA,SAAQA,eAAeC,MAAM,EAAEC,iBAAiB,QAAO,oBAAoB"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { agentInterModuleContract } from '@shipfox/api-agent-dto/inter-module';
|
|
2
|
+
import { type InterModulePresentation } from '@shipfox/inter-module';
|
|
3
|
+
import type { AgentSecretsClient } from '#core/secrets-client.js';
|
|
4
|
+
export declare function createAgentInterModulePresentation(params: {
|
|
5
|
+
secrets: AgentSecretsClient;
|
|
6
|
+
}): InterModulePresentation<typeof agentInterModuleContract>;
|
|
7
|
+
//# sourceMappingURL=inter-module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inter-module.d.ts","sourceRoot":"","sources":["../../src/presentation/inter-module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,wBAAwB,EAAC,MAAM,qCAAqC,CAAC;AAE7E,OAAO,EAGL,KAAK,uBAAuB,EAE7B,MAAM,uBAAuB,CAAC;AAU/B,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,yBAAyB,CAAC;AAGhE,wBAAgB,kCAAkC,CAAC,MAAM,EAAE;IACzD,OAAO,EAAE,kBAAkB,CAAC;CAC7B,GAAG,uBAAuB,CAAC,OAAO,wBAAwB,CAAC,CAqB3D"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { agentInterModuleContract } from '@shipfox/api-agent-dto/inter-module';
|
|
2
|
+
import { secretsInterModuleContract } from '@shipfox/api-secrets-dto/inter-module';
|
|
3
|
+
import { createInterModuleKnownError, defineInterModulePresentation, isInterModuleKnownError } from '@shipfox/inter-module';
|
|
4
|
+
import { InvalidAgentModelError, ModelProviderConfigNotFoundError, UnsupportedHarnessProviderError, UnsupportedHarnessThinkingError, UnsupportedModelProviderError } from '#core/errors.js';
|
|
5
|
+
import { resolveAgentConfig } from '#core/resolve-agent-config.js';
|
|
6
|
+
import { resolveRuntimeCredentials } from '#core/resolve-runtime-credentials.js';
|
|
7
|
+
import { createWorkspaceAgentDefaultsResolver } from '#core/workspace-agent-defaults-resolver.js';
|
|
8
|
+
export function createAgentInterModulePresentation(params) {
|
|
9
|
+
return defineInterModulePresentation(agentInterModuleContract, {
|
|
10
|
+
resolveAgentConfig: async ({ workspaceId, config })=>{
|
|
11
|
+
try {
|
|
12
|
+
const resolve = workspaceId === null ? resolveAgentConfig : await createWorkspaceAgentDefaultsResolver(workspaceId);
|
|
13
|
+
return await resolve(config);
|
|
14
|
+
} catch (error) {
|
|
15
|
+
throw toResolveAgentConfigKnownError(error);
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
resolveRuntimeCredentials: async (input)=>{
|
|
19
|
+
try {
|
|
20
|
+
return await resolveRuntimeCredentials(input, {
|
|
21
|
+
secrets: params.secrets
|
|
22
|
+
});
|
|
23
|
+
} catch (error) {
|
|
24
|
+
throw toResolveRuntimeCredentialsKnownError(error);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function toResolveAgentConfigKnownError(error) {
|
|
30
|
+
if (error instanceof InvalidAgentModelError || error instanceof UnsupportedHarnessProviderError || error instanceof UnsupportedHarnessThinkingError || error instanceof UnsupportedModelProviderError) {
|
|
31
|
+
return createInterModuleKnownError(agentInterModuleContract.methods.resolveAgentConfig, 'agent-config-invalid', {});
|
|
32
|
+
}
|
|
33
|
+
return error;
|
|
34
|
+
}
|
|
35
|
+
function toResolveRuntimeCredentialsKnownError(error) {
|
|
36
|
+
if (error instanceof ModelProviderConfigNotFoundError) {
|
|
37
|
+
return createInterModuleKnownError(agentInterModuleContract.methods.resolveRuntimeCredentials, 'model-provider-not-configured', {});
|
|
38
|
+
}
|
|
39
|
+
if (isInterModuleKnownError(secretsInterModuleContract.methods.getSecretsByNamespace, error)) {
|
|
40
|
+
return createInterModuleKnownError(agentInterModuleContract.methods.resolveRuntimeCredentials, 'model-provider-credentials-invalid', {});
|
|
41
|
+
}
|
|
42
|
+
return error;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=inter-module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/presentation/inter-module.ts"],"sourcesContent":["import {agentInterModuleContract} from '@shipfox/api-agent-dto/inter-module';\nimport {secretsInterModuleContract} from '@shipfox/api-secrets-dto/inter-module';\nimport {\n createInterModuleKnownError,\n defineInterModulePresentation,\n type InterModulePresentation,\n isInterModuleKnownError,\n} from '@shipfox/inter-module';\nimport {\n InvalidAgentModelError,\n ModelProviderConfigNotFoundError,\n UnsupportedHarnessProviderError,\n UnsupportedHarnessThinkingError,\n UnsupportedModelProviderError,\n} from '#core/errors.js';\nimport {resolveAgentConfig} from '#core/resolve-agent-config.js';\nimport {resolveRuntimeCredentials} from '#core/resolve-runtime-credentials.js';\nimport type {AgentSecretsClient} from '#core/secrets-client.js';\nimport {createWorkspaceAgentDefaultsResolver} from '#core/workspace-agent-defaults-resolver.js';\n\nexport function createAgentInterModulePresentation(params: {\n secrets: AgentSecretsClient;\n}): InterModulePresentation<typeof agentInterModuleContract> {\n return defineInterModulePresentation(agentInterModuleContract, {\n resolveAgentConfig: async ({workspaceId, config}) => {\n try {\n const resolve =\n workspaceId === null\n ? resolveAgentConfig\n : await createWorkspaceAgentDefaultsResolver(workspaceId);\n return await resolve(config);\n } catch (error) {\n throw toResolveAgentConfigKnownError(error);\n }\n },\n resolveRuntimeCredentials: async (input) => {\n try {\n return await resolveRuntimeCredentials(input, {secrets: params.secrets});\n } catch (error) {\n throw toResolveRuntimeCredentialsKnownError(error);\n }\n },\n });\n}\n\nfunction toResolveAgentConfigKnownError(error: unknown): unknown {\n if (\n error instanceof InvalidAgentModelError ||\n error instanceof UnsupportedHarnessProviderError ||\n error instanceof UnsupportedHarnessThinkingError ||\n error instanceof UnsupportedModelProviderError\n ) {\n return createInterModuleKnownError(\n agentInterModuleContract.methods.resolveAgentConfig,\n 'agent-config-invalid',\n {},\n );\n }\n return error;\n}\n\nfunction toResolveRuntimeCredentialsKnownError(error: unknown): unknown {\n if (error instanceof ModelProviderConfigNotFoundError) {\n return createInterModuleKnownError(\n agentInterModuleContract.methods.resolveRuntimeCredentials,\n 'model-provider-not-configured',\n {},\n );\n }\n if (isInterModuleKnownError(secretsInterModuleContract.methods.getSecretsByNamespace, error)) {\n return createInterModuleKnownError(\n agentInterModuleContract.methods.resolveRuntimeCredentials,\n 'model-provider-credentials-invalid',\n {},\n );\n }\n return error;\n}\n"],"names":["agentInterModuleContract","secretsInterModuleContract","createInterModuleKnownError","defineInterModulePresentation","isInterModuleKnownError","InvalidAgentModelError","ModelProviderConfigNotFoundError","UnsupportedHarnessProviderError","UnsupportedHarnessThinkingError","UnsupportedModelProviderError","resolveAgentConfig","resolveRuntimeCredentials","createWorkspaceAgentDefaultsResolver","createAgentInterModulePresentation","params","workspaceId","config","resolve","error","toResolveAgentConfigKnownError","input","secrets","toResolveRuntimeCredentialsKnownError","methods","getSecretsByNamespace"],"mappings":"AAAA,SAAQA,wBAAwB,QAAO,sCAAsC;AAC7E,SAAQC,0BAA0B,QAAO,wCAAwC;AACjF,SACEC,2BAA2B,EAC3BC,6BAA6B,EAE7BC,uBAAuB,QAClB,wBAAwB;AAC/B,SACEC,sBAAsB,EACtBC,gCAAgC,EAChCC,+BAA+B,EAC/BC,+BAA+B,EAC/BC,6BAA6B,QACxB,kBAAkB;AACzB,SAAQC,kBAAkB,QAAO,gCAAgC;AACjE,SAAQC,yBAAyB,QAAO,uCAAuC;AAE/E,SAAQC,oCAAoC,QAAO,6CAA6C;AAEhG,OAAO,SAASC,mCAAmCC,MAElD;IACC,OAAOX,8BAA8BH,0BAA0B;QAC7DU,oBAAoB,OAAO,EAACK,WAAW,EAAEC,MAAM,EAAC;YAC9C,IAAI;gBACF,MAAMC,UACJF,gBAAgB,OACZL,qBACA,MAAME,qCAAqCG;gBACjD,OAAO,MAAME,QAAQD;YACvB,EAAE,OAAOE,OAAO;gBACd,MAAMC,+BAA+BD;YACvC;QACF;QACAP,2BAA2B,OAAOS;YAChC,IAAI;gBACF,OAAO,MAAMT,0BAA0BS,OAAO;oBAACC,SAASP,OAAOO,OAAO;gBAAA;YACxE,EAAE,OAAOH,OAAO;gBACd,MAAMI,sCAAsCJ;YAC9C;QACF;IACF;AACF;AAEA,SAASC,+BAA+BD,KAAc;IACpD,IACEA,iBAAiBb,0BACjBa,iBAAiBX,mCACjBW,iBAAiBV,mCACjBU,iBAAiBT,+BACjB;QACA,OAAOP,4BACLF,yBAAyBuB,OAAO,CAACb,kBAAkB,EACnD,wBACA,CAAC;IAEL;IACA,OAAOQ;AACT;AAEA,SAASI,sCAAsCJ,KAAc;IAC3D,IAAIA,iBAAiBZ,kCAAkC;QACrD,OAAOJ,4BACLF,yBAAyBuB,OAAO,CAACZ,yBAAyB,EAC1D,iCACA,CAAC;IAEL;IACA,IAAIP,wBAAwBH,2BAA2BsB,OAAO,CAACC,qBAAqB,EAAEN,QAAQ;QAC5F,OAAOhB,4BACLF,yBAAyBuB,OAAO,CAACZ,yBAAyB,EAC1D,sCACA,CAAC;IAEL;IACA,OAAOO;AACT"}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
|
|
1
|
+
import type { AgentSecretsClient } from '#core/secrets-client.js';
|
|
2
|
+
export declare function createCustomModelProviderRoute(secrets: AgentSecretsClient): import("@shipfox/node-fastify").RouteDefinition;
|
|
2
3
|
//# sourceMappingURL=create-custom-model-provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-custom-model-provider.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/create-custom-model-provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-custom-model-provider.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/create-custom-model-provider.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,yBAAyB,CAAC;AAIhE,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,kBAAkB,mDAsCzE"}
|
|
@@ -5,41 +5,45 @@ import { z } from 'zod';
|
|
|
5
5
|
import { createCustomModelProviderConfig } from '#core/index.js';
|
|
6
6
|
import { toCustomModelProviderConfigDto } from '#presentation/dto/index.js';
|
|
7
7
|
import { translateModelProviderRouteError } from './errors.js';
|
|
8
|
-
export
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
8
|
+
export function createCustomModelProviderRoute(secrets) {
|
|
9
|
+
return defineRoute({
|
|
10
|
+
method: 'POST',
|
|
11
|
+
path: '/custom-model-providers',
|
|
12
|
+
description: 'Create a custom model provider configuration for a workspace',
|
|
13
|
+
schema: {
|
|
14
|
+
params: z.object({
|
|
15
|
+
workspaceId: z.string().uuid()
|
|
16
|
+
}),
|
|
17
|
+
body: createCustomModelProviderBodySchema,
|
|
18
|
+
response: {
|
|
19
|
+
200: customModelProviderConfigDtoSchema
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
errorHandler: translateModelProviderRouteError,
|
|
23
|
+
handler: async (request, reply)=>{
|
|
24
|
+
const { workspaceId } = request.params;
|
|
25
|
+
const abortController = new AbortController();
|
|
26
|
+
let responseFinished = false;
|
|
27
|
+
reply.raw.on('finish', ()=>{
|
|
28
|
+
responseFinished = true;
|
|
29
|
+
});
|
|
30
|
+
reply.raw.on('close', ()=>{
|
|
31
|
+
if (!responseFinished) abortController.abort();
|
|
32
|
+
});
|
|
33
|
+
requireWorkspaceAccess({
|
|
34
|
+
request,
|
|
35
|
+
workspaceId
|
|
36
|
+
});
|
|
37
|
+
const config = await createCustomModelProviderConfig({
|
|
38
|
+
workspaceId,
|
|
39
|
+
body: request.body,
|
|
40
|
+
signal: abortController.signal
|
|
41
|
+
}, {
|
|
42
|
+
secrets
|
|
43
|
+
});
|
|
44
|
+
return toCustomModelProviderConfigDto(config);
|
|
19
45
|
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
handler: async (request, reply)=>{
|
|
23
|
-
const { workspaceId } = request.params;
|
|
24
|
-
const abortController = new AbortController();
|
|
25
|
-
let responseFinished = false;
|
|
26
|
-
reply.raw.on('finish', ()=>{
|
|
27
|
-
responseFinished = true;
|
|
28
|
-
});
|
|
29
|
-
reply.raw.on('close', ()=>{
|
|
30
|
-
if (!responseFinished) abortController.abort();
|
|
31
|
-
});
|
|
32
|
-
requireWorkspaceAccess({
|
|
33
|
-
request,
|
|
34
|
-
workspaceId
|
|
35
|
-
});
|
|
36
|
-
const config = await createCustomModelProviderConfig({
|
|
37
|
-
workspaceId,
|
|
38
|
-
body: request.body,
|
|
39
|
-
signal: abortController.signal
|
|
40
|
-
});
|
|
41
|
-
return toCustomModelProviderConfigDto(config);
|
|
42
|
-
}
|
|
43
|
-
});
|
|
46
|
+
});
|
|
47
|
+
}
|
|
44
48
|
|
|
45
49
|
//# sourceMappingURL=create-custom-model-provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/presentation/routes/create-custom-model-provider.ts"],"sourcesContent":["import {\n createCustomModelProviderBodySchema,\n customModelProviderConfigDtoSchema,\n} from '@shipfox/api-agent-dto';\nimport {requireWorkspaceAccess} from '@shipfox/api-auth-context';\nimport {defineRoute} from '@shipfox/node-fastify';\nimport {z} from 'zod';\nimport {createCustomModelProviderConfig} from '#core/index.js';\nimport {toCustomModelProviderConfigDto} from '#presentation/dto/index.js';\nimport {translateModelProviderRouteError} from './errors.js';\n\nexport
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/routes/create-custom-model-provider.ts"],"sourcesContent":["import {\n createCustomModelProviderBodySchema,\n customModelProviderConfigDtoSchema,\n} from '@shipfox/api-agent-dto';\nimport {requireWorkspaceAccess} from '@shipfox/api-auth-context';\nimport {defineRoute} from '@shipfox/node-fastify';\nimport {z} from 'zod';\nimport {createCustomModelProviderConfig} from '#core/index.js';\nimport type {AgentSecretsClient} from '#core/secrets-client.js';\nimport {toCustomModelProviderConfigDto} from '#presentation/dto/index.js';\nimport {translateModelProviderRouteError} from './errors.js';\n\nexport function createCustomModelProviderRoute(secrets: AgentSecretsClient) {\n return defineRoute({\n method: 'POST',\n path: '/custom-model-providers',\n description: 'Create a custom model provider configuration for a workspace',\n schema: {\n params: z.object({workspaceId: z.string().uuid()}),\n body: createCustomModelProviderBodySchema,\n response: {\n 200: customModelProviderConfigDtoSchema,\n },\n },\n errorHandler: translateModelProviderRouteError,\n handler: async (request, reply) => {\n const {workspaceId} = request.params;\n const abortController = new AbortController();\n let responseFinished = false;\n reply.raw.on('finish', () => {\n responseFinished = true;\n });\n reply.raw.on('close', () => {\n if (!responseFinished) abortController.abort();\n });\n\n requireWorkspaceAccess({request, workspaceId});\n\n const config = await createCustomModelProviderConfig(\n {\n workspaceId,\n body: request.body,\n signal: abortController.signal,\n },\n {secrets},\n );\n\n return toCustomModelProviderConfigDto(config);\n },\n });\n}\n"],"names":["createCustomModelProviderBodySchema","customModelProviderConfigDtoSchema","requireWorkspaceAccess","defineRoute","z","createCustomModelProviderConfig","toCustomModelProviderConfigDto","translateModelProviderRouteError","createCustomModelProviderRoute","secrets","method","path","description","schema","params","object","workspaceId","string","uuid","body","response","errorHandler","handler","request","reply","abortController","AbortController","responseFinished","raw","on","abort","config","signal"],"mappings":"AAAA,SACEA,mCAAmC,EACnCC,kCAAkC,QAC7B,yBAAyB;AAChC,SAAQC,sBAAsB,QAAO,4BAA4B;AACjE,SAAQC,WAAW,QAAO,wBAAwB;AAClD,SAAQC,CAAC,QAAO,MAAM;AACtB,SAAQC,+BAA+B,QAAO,iBAAiB;AAE/D,SAAQC,8BAA8B,QAAO,6BAA6B;AAC1E,SAAQC,gCAAgC,QAAO,cAAc;AAE7D,OAAO,SAASC,+BAA+BC,OAA2B;IACxE,OAAON,YAAY;QACjBO,QAAQ;QACRC,MAAM;QACNC,aAAa;QACbC,QAAQ;YACNC,QAAQV,EAAEW,MAAM,CAAC;gBAACC,aAAaZ,EAAEa,MAAM,GAAGC,IAAI;YAAE;YAChDC,MAAMnB;YACNoB,UAAU;gBACR,KAAKnB;YACP;QACF;QACAoB,cAAcd;QACde,SAAS,OAAOC,SAASC;YACvB,MAAM,EAACR,WAAW,EAAC,GAAGO,QAAQT,MAAM;YACpC,MAAMW,kBAAkB,IAAIC;YAC5B,IAAIC,mBAAmB;YACvBH,MAAMI,GAAG,CAACC,EAAE,CAAC,UAAU;gBACrBF,mBAAmB;YACrB;YACAH,MAAMI,GAAG,CAACC,EAAE,CAAC,SAAS;gBACpB,IAAI,CAACF,kBAAkBF,gBAAgBK,KAAK;YAC9C;YAEA5B,uBAAuB;gBAACqB;gBAASP;YAAW;YAE5C,MAAMe,SAAS,MAAM1B,gCACnB;gBACEW;gBACAG,MAAMI,QAAQJ,IAAI;gBAClBa,QAAQP,gBAAgBO,MAAM;YAChC,GACA;gBAACvB;YAAO;YAGV,OAAOH,+BAA+ByB;QACxC;IACF;AACF"}
|