@shipfox/api-agent 2.0.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 +2 -0
- package/.turbo/turbo-type$colon$emit.log +1 -0
- package/.turbo/turbo-type.log +1 -0
- package/CHANGELOG.md +105 -0
- package/LICENSE +21 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +60 -0
- package/dist/config.js.map +1 -0
- package/dist/core/credential-fingerprints.d.ts +10 -0
- package/dist/core/credential-fingerprints.d.ts.map +1 -0
- package/dist/core/credential-fingerprints.js +65 -0
- package/dist/core/credential-fingerprints.js.map +1 -0
- package/dist/core/custom-model-provider-config-service.d.ts +26 -0
- package/dist/core/custom-model-provider-config-service.d.ts.map +1 -0
- package/dist/core/custom-model-provider-config-service.js +390 -0
- package/dist/core/custom-model-provider-config-service.js.map +1 -0
- package/dist/core/custom-provider-url.d.ts +4 -0
- package/dist/core/custom-provider-url.d.ts.map +1 -0
- package/dist/core/custom-provider-url.js +23 -0
- package/dist/core/custom-provider-url.js.map +1 -0
- package/dist/core/discover-custom-model-provider-models.d.ts +3 -0
- package/dist/core/discover-custom-model-provider-models.d.ts.map +1 -0
- package/dist/core/discover-custom-model-provider-models.js +122 -0
- package/dist/core/discover-custom-model-provider-models.js.map +1 -0
- package/dist/core/entities/agent-workspace-settings.d.ts +9 -0
- package/dist/core/entities/agent-workspace-settings.d.ts.map +1 -0
- package/dist/core/entities/agent-workspace-settings.js +3 -0
- package/dist/core/entities/agent-workspace-settings.js.map +1 -0
- package/dist/core/entities/model-provider-config.d.ts +19 -0
- package/dist/core/entities/model-provider-config.d.ts.map +1 -0
- package/dist/core/entities/model-provider-config.js +3 -0
- package/dist/core/entities/model-provider-config.js.map +1 -0
- package/dist/core/errors.d.ts +62 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +80 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/harness/claude.d.ts +6 -0
- package/dist/core/harness/claude.d.ts.map +1 -0
- package/dist/core/harness/claude.js +104 -0
- package/dist/core/harness/claude.js.map +1 -0
- package/dist/core/harness/index.d.ts +4 -0
- package/dist/core/harness/index.d.ts.map +1 -0
- package/dist/core/harness/index.js +5 -0
- package/dist/core/harness/index.js.map +1 -0
- package/dist/core/harness/pi.d.ts +6 -0
- package/dist/core/harness/pi.d.ts.map +1 -0
- package/dist/core/harness/pi.js +16 -0
- package/dist/core/harness/pi.js.map +1 -0
- package/dist/core/harness/registry.d.ts +22 -0
- package/dist/core/harness/registry.d.ts.map +1 -0
- package/dist/core/harness/registry.js +46 -0
- package/dist/core/harness/registry.js.map +1 -0
- package/dist/core/index.d.ts +12 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +11 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/model-provider-catalog.d.ts +3 -0
- package/dist/core/model-provider-catalog.d.ts.map +1 -0
- package/dist/core/model-provider-catalog.js +25 -0
- package/dist/core/model-provider-catalog.js.map +1 -0
- package/dist/core/model-provider-config-service.d.ts +32 -0
- package/dist/core/model-provider-config-service.d.ts.map +1 -0
- package/dist/core/model-provider-config-service.js +133 -0
- package/dist/core/model-provider-config-service.js.map +1 -0
- package/dist/core/model-provider-validation.d.ts +31 -0
- package/dist/core/model-provider-validation.d.ts.map +1 -0
- package/dist/core/model-provider-validation.js +220 -0
- package/dist/core/model-provider-validation.js.map +1 -0
- package/dist/core/resolve-agent-config.d.ts +32 -0
- package/dist/core/resolve-agent-config.d.ts.map +1 -0
- package/dist/core/resolve-agent-config.js +143 -0
- package/dist/core/resolve-agent-config.js.map +1 -0
- package/dist/core/resolve-runtime-credentials.d.ts +21 -0
- package/dist/core/resolve-runtime-credentials.d.ts.map +1 -0
- package/dist/core/resolve-runtime-credentials.js +101 -0
- package/dist/core/resolve-runtime-credentials.js.map +1 -0
- package/dist/core/workspace-agent-defaults-resolver.d.ts +3 -0
- package/dist/core/workspace-agent-defaults-resolver.d.ts.map +1 -0
- package/dist/core/workspace-agent-defaults-resolver.js +26 -0
- package/dist/core/workspace-agent-defaults-resolver.js.map +1 -0
- package/dist/db/agent-defaults-snapshot.d.ts +9 -0
- package/dist/db/agent-defaults-snapshot.d.ts.map +1 -0
- package/dist/db/agent-defaults-snapshot.js +24 -0
- package/dist/db/agent-defaults-snapshot.js.map +1 -0
- package/dist/db/agent-workspace-settings.d.ts +12 -0
- package/dist/db/agent-workspace-settings.d.ts.map +1 -0
- package/dist/db/agent-workspace-settings.js +53 -0
- package/dist/db/agent-workspace-settings.js.map +1 -0
- package/dist/db/db.d.ts +771 -0
- package/dist/db/db.d.ts.map +1 -0
- package/dist/db/db.js +20 -0
- package/dist/db/db.js.map +1 -0
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +11 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/model-provider-configs.d.ts +38 -0
- package/dist/db/model-provider-configs.d.ts.map +1 -0
- package/dist/db/model-provider-configs.js +159 -0
- package/dist/db/model-provider-configs.js.map +1 -0
- package/dist/db/schema/agent-workspace-settings.d.ts +97 -0
- package/dist/db/schema/agent-workspace-settings.d.ts.map +1 -0
- package/dist/db/schema/agent-workspace-settings.js +26 -0
- package/dist/db/schema/agent-workspace-settings.js.map +1 -0
- package/dist/db/schema/common.d.ts +2 -0
- package/dist/db/schema/common.d.ts.map +1 -0
- package/dist/db/schema/common.js +4 -0
- package/dist/db/schema/common.js.map +1 -0
- package/dist/db/schema/model-provider-configs.d.ts +296 -0
- package/dist/db/schema/model-provider-configs.d.ts.map +1 -0
- package/dist/db/schema/model-provider-configs.js +52 -0
- package/dist/db/schema/model-provider-configs.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics/index.d.ts +2 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +3 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/instance.d.ts +10 -0
- package/dist/metrics/instance.d.ts.map +1 -0
- package/dist/metrics/instance.js +10 -0
- package/dist/metrics/instance.js.map +1 -0
- package/dist/presentation/dto/index.d.ts +2 -0
- package/dist/presentation/dto/index.d.ts.map +1 -0
- package/dist/presentation/dto/index.js +3 -0
- package/dist/presentation/dto/index.js.map +1 -0
- package/dist/presentation/dto/model-provider-config.d.ts +6 -0
- package/dist/presentation/dto/model-provider-config.d.ts.map +1 -0
- package/dist/presentation/dto/model-provider-config.js +32 -0
- package/dist/presentation/dto/model-provider-config.js.map +1 -0
- package/dist/presentation/e2eRoutes/create-model-provider.d.ts +2 -0
- package/dist/presentation/e2eRoutes/create-model-provider.d.ts.map +1 -0
- package/dist/presentation/e2eRoutes/create-model-provider.js +66 -0
- package/dist/presentation/e2eRoutes/create-model-provider.js.map +1 -0
- package/dist/presentation/e2eRoutes/index.d.ts +3 -0
- package/dist/presentation/e2eRoutes/index.d.ts.map +1 -0
- package/dist/presentation/e2eRoutes/index.js +9 -0
- package/dist/presentation/e2eRoutes/index.js.map +1 -0
- package/dist/presentation/index.d.ts +2 -0
- package/dist/presentation/index.d.ts.map +1 -0
- package/dist/presentation/index.js +3 -0
- package/dist/presentation/index.js.map +1 -0
- package/dist/presentation/routes/create-custom-model-provider.d.ts +2 -0
- package/dist/presentation/routes/create-custom-model-provider.d.ts.map +1 -0
- package/dist/presentation/routes/create-custom-model-provider.js +45 -0
- package/dist/presentation/routes/create-custom-model-provider.js.map +1 -0
- package/dist/presentation/routes/delete-model-provider-config.d.ts +2 -0
- package/dist/presentation/routes/delete-model-provider-config.d.ts.map +1 -0
- package/dist/presentation/routes/delete-model-provider-config.js +38 -0
- package/dist/presentation/routes/delete-model-provider-config.js.map +1 -0
- package/dist/presentation/routes/discover-custom-model-provider-models-by-slug.d.ts +2 -0
- package/dist/presentation/routes/discover-custom-model-provider-models-by-slug.d.ts.map +1 -0
- package/dist/presentation/routes/discover-custom-model-provider-models-by-slug.js +37 -0
- package/dist/presentation/routes/discover-custom-model-provider-models-by-slug.js.map +1 -0
- package/dist/presentation/routes/discover-custom-model-provider-models.d.ts +2 -0
- package/dist/presentation/routes/discover-custom-model-provider-models.d.ts.map +1 -0
- package/dist/presentation/routes/discover-custom-model-provider-models.js +31 -0
- package/dist/presentation/routes/discover-custom-model-provider-models.js.map +1 -0
- package/dist/presentation/routes/errors.d.ts +2 -0
- package/dist/presentation/routes/errors.d.ts.map +1 -0
- package/dist/presentation/routes/errors.js +112 -0
- package/dist/presentation/routes/errors.js.map +1 -0
- package/dist/presentation/routes/index.d.ts +3 -0
- package/dist/presentation/routes/index.d.ts.map +1 -0
- package/dist/presentation/routes/index.js +39 -0
- package/dist/presentation/routes/index.js.map +1 -0
- package/dist/presentation/routes/list-model-provider-catalog.d.ts +2 -0
- package/dist/presentation/routes/list-model-provider-catalog.d.ts.map +1 -0
- package/dist/presentation/routes/list-model-provider-catalog.js +18 -0
- package/dist/presentation/routes/list-model-provider-catalog.js.map +1 -0
- package/dist/presentation/routes/list-model-provider-configs.d.ts +2 -0
- package/dist/presentation/routes/list-model-provider-configs.d.ts.map +1 -0
- package/dist/presentation/routes/list-model-provider-configs.js +37 -0
- package/dist/presentation/routes/list-model-provider-configs.js.map +1 -0
- package/dist/presentation/routes/set-default-harness.d.ts +2 -0
- package/dist/presentation/routes/set-default-harness.d.ts.map +1 -0
- package/dist/presentation/routes/set-default-harness.js +38 -0
- package/dist/presentation/routes/set-default-harness.js.map +1 -0
- package/dist/presentation/routes/set-default-model-provider.d.ts +2 -0
- package/dist/presentation/routes/set-default-model-provider.d.ts.map +1 -0
- package/dist/presentation/routes/set-default-model-provider.js +48 -0
- package/dist/presentation/routes/set-default-model-provider.js.map +1 -0
- package/dist/presentation/routes/update-custom-model-provider.d.ts +2 -0
- package/dist/presentation/routes/update-custom-model-provider.d.ts.map +1 -0
- package/dist/presentation/routes/update-custom-model-provider.js +47 -0
- package/dist/presentation/routes/update-custom-model-provider.js.map +1 -0
- package/dist/presentation/routes/update-model-provider-default-model.d.ts +2 -0
- package/dist/presentation/routes/update-model-provider-default-model.d.ts.map +1 -0
- package/dist/presentation/routes/update-model-provider-default-model.js +38 -0
- package/dist/presentation/routes/update-model-provider-default-model.js.map +1 -0
- package/dist/presentation/routes/upsert-model-provider-config.d.ts +2 -0
- package/dist/presentation/routes/upsert-model-provider-config.d.ts.map +1 -0
- package/dist/presentation/routes/upsert-model-provider-config.js +52 -0
- package/dist/presentation/routes/upsert-model-provider-config.js.map +1 -0
- package/dist/tsconfig.test.tsbuildinfo +1 -0
- package/drizzle/0000_daffy_leopardon.sql +28 -0
- package/drizzle/0001_default_harness.sql +1 -0
- package/drizzle/meta/0000_snapshot.json +199 -0
- package/drizzle/meta/0001_snapshot.json +205 -0
- package/drizzle/meta/_journal.json +20 -0
- package/drizzle.config.ts +7 -0
- package/package.json +109 -0
- package/src/config.test.ts +118 -0
- package/src/config.ts +75 -0
- package/src/core/catalog-registry.test.ts +48 -0
- package/src/core/credential-fingerprints.test.ts +34 -0
- package/src/core/credential-fingerprints.ts +84 -0
- package/src/core/custom-model-provider-config-service.ts +537 -0
- package/src/core/custom-provider-url.ts +24 -0
- package/src/core/discover-custom-model-provider-models.ts +147 -0
- package/src/core/entities/agent-workspace-settings.ts +9 -0
- package/src/core/entities/model-provider-config.ts +25 -0
- package/src/core/errors.ts +139 -0
- package/src/core/harness/claude.ts +75 -0
- package/src/core/harness/index.ts +19 -0
- package/src/core/harness/pi.ts +18 -0
- package/src/core/harness/registry.test.ts +281 -0
- package/src/core/harness/registry.ts +108 -0
- package/src/core/index.ts +56 -0
- package/src/core/model-provider-catalog.ts +33 -0
- package/src/core/model-provider-config-service.test.ts +940 -0
- package/src/core/model-provider-config-service.ts +207 -0
- package/src/core/model-provider-validation.test.ts +354 -0
- package/src/core/model-provider-validation.ts +276 -0
- package/src/core/resolve-agent-config.test.ts +441 -0
- package/src/core/resolve-agent-config.ts +272 -0
- package/src/core/resolve-runtime-credentials.test.ts +316 -0
- package/src/core/resolve-runtime-credentials.ts +147 -0
- package/src/core/workspace-agent-defaults-resolver.ts +42 -0
- package/src/db/agent-defaults-snapshot.ts +49 -0
- package/src/db/agent-workspace-settings.test.ts +111 -0
- package/src/db/agent-workspace-settings.ts +92 -0
- package/src/db/db.ts +20 -0
- package/src/db/index.ts +29 -0
- package/src/db/model-provider-configs.test.ts +281 -0
- package/src/db/model-provider-configs.ts +230 -0
- package/src/db/schema/agent-workspace-settings.ts +27 -0
- package/src/db/schema/common.ts +3 -0
- package/src/db/schema/model-provider-configs.ts +80 -0
- package/src/index.ts +43 -0
- package/src/metrics/index.ts +1 -0
- package/src/metrics/instance.ts +18 -0
- package/src/presentation/dto/index.ts +5 -0
- package/src/presentation/dto/model-provider-config.ts +41 -0
- package/src/presentation/e2eRoutes/create-model-provider.test.ts +47 -0
- package/src/presentation/e2eRoutes/create-model-provider.ts +61 -0
- package/src/presentation/e2eRoutes/index.ts +7 -0
- package/src/presentation/index.ts +1 -0
- package/src/presentation/routes/create-custom-model-provider.ts +45 -0
- package/src/presentation/routes/delete-model-provider-config.ts +31 -0
- package/src/presentation/routes/discover-custom-model-provider-models-by-slug.ts +42 -0
- package/src/presentation/routes/discover-custom-model-provider-models.ts +29 -0
- package/src/presentation/routes/errors.ts +122 -0
- package/src/presentation/routes/index.ts +37 -0
- package/src/presentation/routes/list-model-provider-catalog.ts +15 -0
- package/src/presentation/routes/list-model-provider-configs.ts +33 -0
- package/src/presentation/routes/model-provider-catalog.test.ts +73 -0
- package/src/presentation/routes/model-provider-config.test.ts +807 -0
- package/src/presentation/routes/set-default-harness.ts +33 -0
- package/src/presentation/routes/set-default-model-provider.ts +47 -0
- package/src/presentation/routes/update-custom-model-provider.ts +50 -0
- package/src/presentation/routes/update-model-provider-default-model.ts +40 -0
- package/src/presentation/routes/upsert-model-provider-config.ts +53 -0
- package/test/env.ts +8 -0
- package/test/globalSetup.ts +25 -0
- package/test/setup.ts +17 -0
- package/tsconfig.build.json +9 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.json +3 -0
- package/tsconfig.test.json +8 -0
- package/vitest.config.ts +11 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { agentThinkingByHarness, DEFAULT_HARNESS, getHarnessDescriptor, getModelProviderEntry } from '@shipfox/api-agent-dto';
|
|
2
|
+
import { InvalidAgentModelError, UnsupportedHarnessProviderError, UnsupportedHarnessThinkingError, UnsupportedModelProviderError } from './errors.js';
|
|
3
|
+
import { listHarnessProviderModels } from './harness/index.js';
|
|
4
|
+
export function resolveAgentConfig(step, ctx = {}) {
|
|
5
|
+
const harness = step.harness ?? ctx.workspaceDefaultHarnessId ?? DEFAULT_HARNESS;
|
|
6
|
+
const provider = resolveProvider(step, ctx, harness);
|
|
7
|
+
const workspaceProviderConfig = ctx.workspaceProviderConfigs?.get(provider);
|
|
8
|
+
const model = resolveModel({
|
|
9
|
+
step,
|
|
10
|
+
ctx,
|
|
11
|
+
harness,
|
|
12
|
+
provider,
|
|
13
|
+
workspaceProviderConfig
|
|
14
|
+
});
|
|
15
|
+
const thinking = resolveThinking({
|
|
16
|
+
step,
|
|
17
|
+
ctx,
|
|
18
|
+
harness,
|
|
19
|
+
provider,
|
|
20
|
+
workspaceProviderConfig
|
|
21
|
+
});
|
|
22
|
+
return {
|
|
23
|
+
harness,
|
|
24
|
+
provider,
|
|
25
|
+
model,
|
|
26
|
+
thinking
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export const catalogDefaultAgentResolver = (step)=>resolveAgentConfig(step);
|
|
30
|
+
function resolveProvider(step, ctx, harness) {
|
|
31
|
+
const descriptor = getHarnessDescriptor(harness);
|
|
32
|
+
if (step.provider !== undefined) {
|
|
33
|
+
const provider = resolveSupportedProvider(step.provider, ctx);
|
|
34
|
+
if (!isHarnessCompatible(harness, provider, ctx.workspaceProviderConfigs?.get(provider))) {
|
|
35
|
+
throw new UnsupportedHarnessProviderError(harness, step.provider, descriptor.supportedProviderIds);
|
|
36
|
+
}
|
|
37
|
+
return provider;
|
|
38
|
+
}
|
|
39
|
+
const candidates = [
|
|
40
|
+
ctx.workspaceDefaultProviderId,
|
|
41
|
+
ctx.instanceDefaultProvider,
|
|
42
|
+
descriptor.defaultProviderId
|
|
43
|
+
];
|
|
44
|
+
for (const candidate of candidates){
|
|
45
|
+
if (candidate === undefined || candidate === null) continue;
|
|
46
|
+
const workspaceProviderConfig = ctx.workspaceProviderConfigs?.get(candidate);
|
|
47
|
+
if (!isHarnessCompatible(harness, candidate, workspaceProviderConfig)) continue;
|
|
48
|
+
return resolveSupportedProvider(candidate, ctx);
|
|
49
|
+
}
|
|
50
|
+
return descriptor.defaultProviderId;
|
|
51
|
+
}
|
|
52
|
+
function resolveSupportedProvider(provider, ctx) {
|
|
53
|
+
const workspaceProviderConfig = ctx.workspaceProviderConfigs?.get(provider);
|
|
54
|
+
if (workspaceProviderConfig?.kind === 'custom') return provider;
|
|
55
|
+
const entry = getModelProviderEntry(provider);
|
|
56
|
+
if (entry === undefined || entry.support_status !== 'supported') {
|
|
57
|
+
throw new UnsupportedModelProviderError(provider);
|
|
58
|
+
}
|
|
59
|
+
return provider;
|
|
60
|
+
}
|
|
61
|
+
function resolveModel(params) {
|
|
62
|
+
if (params.step.model !== undefined) {
|
|
63
|
+
validateModel(params.harness, params.provider, params.step.model, params.workspaceProviderConfig);
|
|
64
|
+
return params.step.model;
|
|
65
|
+
}
|
|
66
|
+
const candidates = [
|
|
67
|
+
()=>params.workspaceProviderConfig?.defaultModel
|
|
68
|
+
];
|
|
69
|
+
if (params.workspaceProviderConfig?.kind === 'custom') {
|
|
70
|
+
candidates.push(()=>customDefaultModel(params.workspaceProviderConfig));
|
|
71
|
+
} else {
|
|
72
|
+
candidates.push(()=>instanceDefaultModel(params.provider, params.ctx), ()=>catalogDefaultModel(params.harness, params.provider));
|
|
73
|
+
}
|
|
74
|
+
for (const resolveCandidate of candidates){
|
|
75
|
+
const candidate = resolveCandidate();
|
|
76
|
+
if (candidate === undefined || candidate === null) continue;
|
|
77
|
+
if (modelIsAvailable(params.harness, params.provider, candidate, params.workspaceProviderConfig)) {
|
|
78
|
+
return candidate;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
throw new InvalidAgentModelError(params.harness, params.provider, '');
|
|
82
|
+
}
|
|
83
|
+
function catalogDefaultModel(harness, provider) {
|
|
84
|
+
const catalogModels = listProviderModels(harness, provider);
|
|
85
|
+
const entry = getModelProviderEntry(provider);
|
|
86
|
+
if (entry === undefined || entry.support_status !== 'supported') {
|
|
87
|
+
throw new UnsupportedModelProviderError(provider);
|
|
88
|
+
}
|
|
89
|
+
if (entry.default_model !== null && catalogModels.some((candidate)=>candidate.id === entry.default_model)) {
|
|
90
|
+
return entry.default_model;
|
|
91
|
+
}
|
|
92
|
+
const firstModel = catalogModels[0];
|
|
93
|
+
if (firstModel === undefined) throw new InvalidAgentModelError(harness, provider, '');
|
|
94
|
+
return firstModel.id;
|
|
95
|
+
}
|
|
96
|
+
function instanceDefaultModel(provider, ctx) {
|
|
97
|
+
return provider === ctx.instanceDefaultProvider ? ctx.instanceDefaultModel : undefined;
|
|
98
|
+
}
|
|
99
|
+
function instanceDefaultThinking(provider, ctx) {
|
|
100
|
+
return provider === ctx.instanceDefaultProvider ? ctx.instanceDefaultThinking : undefined;
|
|
101
|
+
}
|
|
102
|
+
function customDefaultModel(workspaceProviderConfig) {
|
|
103
|
+
if (workspaceProviderConfig?.kind !== 'custom') return undefined;
|
|
104
|
+
return workspaceProviderConfig.models?.[0]?.id;
|
|
105
|
+
}
|
|
106
|
+
function validateModel(harness, provider, model, workspaceProviderConfig) {
|
|
107
|
+
if (modelIsAvailable(harness, provider, model, workspaceProviderConfig)) return;
|
|
108
|
+
throw new InvalidAgentModelError(harness, provider, model);
|
|
109
|
+
}
|
|
110
|
+
function modelIsAvailable(harness, provider, model, workspaceProviderConfig) {
|
|
111
|
+
if (workspaceProviderConfig?.kind === 'custom') {
|
|
112
|
+
return workspaceProviderConfig.models?.some((candidate)=>candidate.id === model) ?? false;
|
|
113
|
+
}
|
|
114
|
+
return listProviderModels(harness, provider).some((candidate)=>candidate.id === model);
|
|
115
|
+
}
|
|
116
|
+
function listProviderModels(harness, provider) {
|
|
117
|
+
return listHarnessProviderModels(harness, provider);
|
|
118
|
+
}
|
|
119
|
+
function isHarnessCompatible(harness, provider, workspaceProviderConfig) {
|
|
120
|
+
if (workspaceProviderConfig?.kind === 'custom') return harness === 'pi';
|
|
121
|
+
return getHarnessDescriptor(harness).supportedProviderIds.includes(provider);
|
|
122
|
+
}
|
|
123
|
+
function resolveThinking(params) {
|
|
124
|
+
const thinkingSchema = agentThinkingByHarness[params.harness];
|
|
125
|
+
const descriptor = getHarnessDescriptor(params.harness);
|
|
126
|
+
if (params.step.thinking !== undefined) {
|
|
127
|
+
if (!thinkingSchema.safeParse(params.step.thinking).success) {
|
|
128
|
+
throw new UnsupportedHarnessThinkingError(params.harness, params.step.thinking, descriptor.thinkingLevels);
|
|
129
|
+
}
|
|
130
|
+
return params.step.thinking;
|
|
131
|
+
}
|
|
132
|
+
const candidates = [
|
|
133
|
+
params.workspaceProviderConfig?.defaultThinking,
|
|
134
|
+
instanceDefaultThinking(params.provider, params.ctx),
|
|
135
|
+
descriptor.defaultThinking
|
|
136
|
+
];
|
|
137
|
+
for (const candidate of candidates){
|
|
138
|
+
if (candidate !== undefined && thinkingSchema.safeParse(candidate).success) return candidate;
|
|
139
|
+
}
|
|
140
|
+
return descriptor.defaultThinking;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
//# sourceMappingURL=resolve-agent-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/resolve-agent-config.ts"],"sourcesContent":["import {\n type AgentThinking,\n agentThinkingByHarness,\n type CustomAgentModelDto,\n DEFAULT_HARNESS,\n getHarnessDescriptor,\n getModelProviderEntry,\n type Harness,\n type ModelProviderRef,\n type SupportedModelProviderId,\n} from '@shipfox/api-agent-dto';\nimport {\n InvalidAgentModelError,\n UnsupportedHarnessProviderError,\n UnsupportedHarnessThinkingError,\n UnsupportedModelProviderError,\n} from './errors.js';\nimport {listHarnessProviderModels} from './harness/index.js';\n\nexport interface ContextualAgentConfig {\n readonly harness?: Harness | undefined;\n readonly provider?: string | undefined;\n readonly model?: string | undefined;\n readonly thinking?: AgentThinking | undefined;\n}\n\nexport interface ResolvedAgentConfig {\n readonly harness: Harness;\n readonly provider: ModelProviderRef;\n readonly model: string;\n readonly thinking: AgentThinking;\n}\n\nexport type AgentDefaultsResolver = (step: ContextualAgentConfig) => ResolvedAgentConfig;\n\nexport interface AgentConfigResolutionContext {\n readonly workspaceDefaultHarnessId?: Harness | null | undefined;\n readonly workspaceDefaultProviderId?: ModelProviderRef | null | undefined;\n readonly workspaceProviderConfigs?: ReadonlyMap<ModelProviderRef, WorkspaceProviderDefaults>;\n readonly instanceDefaultProvider?: SupportedModelProviderId | undefined;\n readonly instanceDefaultModel?: string | undefined;\n readonly instanceDefaultThinking?: AgentThinking | undefined;\n}\n\ninterface WorkspaceProviderDefaults {\n readonly kind?: 'builtin' | 'custom' | undefined;\n readonly defaultModel: string | null;\n readonly defaultThinking: AgentThinking;\n readonly models?: readonly CustomAgentModelDto[] | null | undefined;\n}\n\ntype ModelCandidateResolver = () => string | null | undefined;\n\nexport function resolveAgentConfig(\n step: ContextualAgentConfig,\n ctx: AgentConfigResolutionContext = {},\n): ResolvedAgentConfig {\n const harness = step.harness ?? ctx.workspaceDefaultHarnessId ?? DEFAULT_HARNESS;\n const provider = resolveProvider(step, ctx, harness);\n const workspaceProviderConfig = ctx.workspaceProviderConfigs?.get(provider);\n const model = resolveModel({\n step,\n ctx,\n harness,\n provider,\n workspaceProviderConfig,\n });\n const thinking = resolveThinking({step, ctx, harness, provider, workspaceProviderConfig});\n\n return {harness, provider, model, thinking};\n}\n\nexport const catalogDefaultAgentResolver: AgentDefaultsResolver = (step) =>\n resolveAgentConfig(step);\n\nfunction resolveProvider(\n step: ContextualAgentConfig,\n ctx: AgentConfigResolutionContext,\n harness: Harness,\n): ModelProviderRef {\n const descriptor = getHarnessDescriptor(harness);\n if (step.provider !== undefined) {\n const provider = resolveSupportedProvider(step.provider, ctx);\n if (!isHarnessCompatible(harness, provider, ctx.workspaceProviderConfigs?.get(provider))) {\n throw new UnsupportedHarnessProviderError(\n harness,\n step.provider,\n descriptor.supportedProviderIds,\n );\n }\n return provider;\n }\n\n const candidates = [\n ctx.workspaceDefaultProviderId,\n ctx.instanceDefaultProvider,\n descriptor.defaultProviderId,\n ];\n for (const candidate of candidates) {\n if (candidate === undefined || candidate === null) continue;\n\n const workspaceProviderConfig = ctx.workspaceProviderConfigs?.get(candidate);\n if (!isHarnessCompatible(harness, candidate, workspaceProviderConfig)) continue;\n\n return resolveSupportedProvider(candidate, ctx);\n }\n\n return descriptor.defaultProviderId;\n}\n\nfunction resolveSupportedProvider(\n provider: string,\n ctx: AgentConfigResolutionContext,\n): ModelProviderRef {\n const workspaceProviderConfig = ctx.workspaceProviderConfigs?.get(provider);\n if (workspaceProviderConfig?.kind === 'custom') return provider;\n\n const entry = getModelProviderEntry(provider);\n if (entry === undefined || entry.support_status !== 'supported') {\n throw new UnsupportedModelProviderError(provider);\n }\n return provider as SupportedModelProviderId;\n}\n\nfunction resolveModel(params: {\n step: ContextualAgentConfig;\n ctx: AgentConfigResolutionContext;\n harness: Harness;\n provider: ModelProviderRef;\n workspaceProviderConfig: WorkspaceProviderDefaults | undefined;\n}): string {\n if (params.step.model !== undefined) {\n validateModel(\n params.harness,\n params.provider,\n params.step.model,\n params.workspaceProviderConfig,\n );\n return params.step.model;\n }\n\n const candidates: ModelCandidateResolver[] = [() => params.workspaceProviderConfig?.defaultModel];\n if (params.workspaceProviderConfig?.kind === 'custom') {\n candidates.push(() => customDefaultModel(params.workspaceProviderConfig));\n } else {\n candidates.push(\n () => instanceDefaultModel(params.provider, params.ctx),\n () => catalogDefaultModel(params.harness, params.provider),\n );\n }\n\n for (const resolveCandidate of candidates) {\n const candidate = resolveCandidate();\n if (candidate === undefined || candidate === null) continue;\n if (\n modelIsAvailable(params.harness, params.provider, candidate, params.workspaceProviderConfig)\n ) {\n return candidate;\n }\n }\n\n throw new InvalidAgentModelError(params.harness, params.provider, '');\n}\n\nfunction catalogDefaultModel(harness: Harness, provider: ModelProviderRef): string {\n const catalogModels = listProviderModels(harness, provider);\n const entry = getModelProviderEntry(provider);\n if (entry === undefined || entry.support_status !== 'supported') {\n throw new UnsupportedModelProviderError(provider);\n }\n if (\n entry.default_model !== null &&\n catalogModels.some((candidate) => candidate.id === entry.default_model)\n ) {\n return entry.default_model;\n }\n\n const firstModel = catalogModels[0];\n if (firstModel === undefined) throw new InvalidAgentModelError(harness, provider, '');\n return firstModel.id;\n}\n\nfunction instanceDefaultModel(\n provider: ModelProviderRef,\n ctx: AgentConfigResolutionContext,\n): string | undefined {\n return provider === ctx.instanceDefaultProvider ? ctx.instanceDefaultModel : undefined;\n}\n\nfunction instanceDefaultThinking(\n provider: ModelProviderRef,\n ctx: AgentConfigResolutionContext,\n): AgentThinking | undefined {\n return provider === ctx.instanceDefaultProvider ? ctx.instanceDefaultThinking : undefined;\n}\n\nfunction customDefaultModel(\n workspaceProviderConfig: WorkspaceProviderDefaults | undefined,\n): string | undefined {\n if (workspaceProviderConfig?.kind !== 'custom') return undefined;\n return workspaceProviderConfig.models?.[0]?.id;\n}\n\nfunction validateModel(\n harness: Harness,\n provider: ModelProviderRef,\n model: string,\n workspaceProviderConfig: WorkspaceProviderDefaults | undefined,\n): void {\n if (modelIsAvailable(harness, provider, model, workspaceProviderConfig)) return;\n throw new InvalidAgentModelError(harness, provider, model);\n}\n\nfunction modelIsAvailable(\n harness: Harness,\n provider: ModelProviderRef,\n model: string,\n workspaceProviderConfig: WorkspaceProviderDefaults | undefined,\n): boolean {\n if (workspaceProviderConfig?.kind === 'custom') {\n return workspaceProviderConfig.models?.some((candidate) => candidate.id === model) ?? false;\n }\n\n return listProviderModels(harness, provider).some((candidate) => candidate.id === model);\n}\n\nfunction listProviderModels(harness: Harness, provider: ModelProviderRef): readonly {id: string}[] {\n return listHarnessProviderModels(harness, provider);\n}\n\nfunction isHarnessCompatible(\n harness: Harness,\n provider: ModelProviderRef,\n workspaceProviderConfig: WorkspaceProviderDefaults | undefined,\n): boolean {\n if (workspaceProviderConfig?.kind === 'custom') return harness === 'pi';\n\n return getHarnessDescriptor(harness).supportedProviderIds.includes(provider);\n}\n\nfunction resolveThinking(params: {\n step: ContextualAgentConfig;\n ctx: AgentConfigResolutionContext;\n harness: Harness;\n provider: ModelProviderRef;\n workspaceProviderConfig: WorkspaceProviderDefaults | undefined;\n}): AgentThinking {\n const thinkingSchema = agentThinkingByHarness[params.harness];\n const descriptor = getHarnessDescriptor(params.harness);\n\n if (params.step.thinking !== undefined) {\n if (!thinkingSchema.safeParse(params.step.thinking).success) {\n throw new UnsupportedHarnessThinkingError(\n params.harness,\n params.step.thinking,\n descriptor.thinkingLevels,\n );\n }\n return params.step.thinking;\n }\n\n const candidates = [\n params.workspaceProviderConfig?.defaultThinking,\n instanceDefaultThinking(params.provider, params.ctx),\n descriptor.defaultThinking,\n ];\n for (const candidate of candidates) {\n if (candidate !== undefined && thinkingSchema.safeParse(candidate).success) return candidate;\n }\n\n return descriptor.defaultThinking;\n}\n"],"names":["agentThinkingByHarness","DEFAULT_HARNESS","getHarnessDescriptor","getModelProviderEntry","InvalidAgentModelError","UnsupportedHarnessProviderError","UnsupportedHarnessThinkingError","UnsupportedModelProviderError","listHarnessProviderModels","resolveAgentConfig","step","ctx","harness","workspaceDefaultHarnessId","provider","resolveProvider","workspaceProviderConfig","workspaceProviderConfigs","get","model","resolveModel","thinking","resolveThinking","catalogDefaultAgentResolver","descriptor","undefined","resolveSupportedProvider","isHarnessCompatible","supportedProviderIds","candidates","workspaceDefaultProviderId","instanceDefaultProvider","defaultProviderId","candidate","kind","entry","support_status","params","validateModel","defaultModel","push","customDefaultModel","instanceDefaultModel","catalogDefaultModel","resolveCandidate","modelIsAvailable","catalogModels","listProviderModels","default_model","some","id","firstModel","instanceDefaultThinking","models","includes","thinkingSchema","safeParse","success","thinkingLevels","defaultThinking"],"mappings":"AAAA,SAEEA,sBAAsB,EAEtBC,eAAe,EACfC,oBAAoB,EACpBC,qBAAqB,QAIhB,yBAAyB;AAChC,SACEC,sBAAsB,EACtBC,+BAA+B,EAC/BC,+BAA+B,EAC/BC,6BAA6B,QACxB,cAAc;AACrB,SAAQC,yBAAyB,QAAO,qBAAqB;AAoC7D,OAAO,SAASC,mBACdC,IAA2B,EAC3BC,MAAoC,CAAC,CAAC;IAEtC,MAAMC,UAAUF,KAAKE,OAAO,IAAID,IAAIE,yBAAyB,IAAIZ;IACjE,MAAMa,WAAWC,gBAAgBL,MAAMC,KAAKC;IAC5C,MAAMI,0BAA0BL,IAAIM,wBAAwB,EAAEC,IAAIJ;IAClE,MAAMK,QAAQC,aAAa;QACzBV;QACAC;QACAC;QACAE;QACAE;IACF;IACA,MAAMK,WAAWC,gBAAgB;QAACZ;QAAMC;QAAKC;QAASE;QAAUE;IAAuB;IAEvF,OAAO;QAACJ;QAASE;QAAUK;QAAOE;IAAQ;AAC5C;AAEA,OAAO,MAAME,8BAAqD,CAACb,OACjED,mBAAmBC,MAAM;AAE3B,SAASK,gBACPL,IAA2B,EAC3BC,GAAiC,EACjCC,OAAgB;IAEhB,MAAMY,aAAatB,qBAAqBU;IACxC,IAAIF,KAAKI,QAAQ,KAAKW,WAAW;QAC/B,MAAMX,WAAWY,yBAAyBhB,KAAKI,QAAQ,EAAEH;QACzD,IAAI,CAACgB,oBAAoBf,SAASE,UAAUH,IAAIM,wBAAwB,EAAEC,IAAIJ,YAAY;YACxF,MAAM,IAAIT,gCACRO,SACAF,KAAKI,QAAQ,EACbU,WAAWI,oBAAoB;QAEnC;QACA,OAAOd;IACT;IAEA,MAAMe,aAAa;QACjBlB,IAAImB,0BAA0B;QAC9BnB,IAAIoB,uBAAuB;QAC3BP,WAAWQ,iBAAiB;KAC7B;IACD,KAAK,MAAMC,aAAaJ,WAAY;QAClC,IAAII,cAAcR,aAAaQ,cAAc,MAAM;QAEnD,MAAMjB,0BAA0BL,IAAIM,wBAAwB,EAAEC,IAAIe;QAClE,IAAI,CAACN,oBAAoBf,SAASqB,WAAWjB,0BAA0B;QAEvE,OAAOU,yBAAyBO,WAAWtB;IAC7C;IAEA,OAAOa,WAAWQ,iBAAiB;AACrC;AAEA,SAASN,yBACPZ,QAAgB,EAChBH,GAAiC;IAEjC,MAAMK,0BAA0BL,IAAIM,wBAAwB,EAAEC,IAAIJ;IAClE,IAAIE,yBAAyBkB,SAAS,UAAU,OAAOpB;IAEvD,MAAMqB,QAAQhC,sBAAsBW;IACpC,IAAIqB,UAAUV,aAAaU,MAAMC,cAAc,KAAK,aAAa;QAC/D,MAAM,IAAI7B,8BAA8BO;IAC1C;IACA,OAAOA;AACT;AAEA,SAASM,aAAaiB,MAMrB;IACC,IAAIA,OAAO3B,IAAI,CAACS,KAAK,KAAKM,WAAW;QACnCa,cACED,OAAOzB,OAAO,EACdyB,OAAOvB,QAAQ,EACfuB,OAAO3B,IAAI,CAACS,KAAK,EACjBkB,OAAOrB,uBAAuB;QAEhC,OAAOqB,OAAO3B,IAAI,CAACS,KAAK;IAC1B;IAEA,MAAMU,aAAuC;QAAC,IAAMQ,OAAOrB,uBAAuB,EAAEuB;KAAa;IACjG,IAAIF,OAAOrB,uBAAuB,EAAEkB,SAAS,UAAU;QACrDL,WAAWW,IAAI,CAAC,IAAMC,mBAAmBJ,OAAOrB,uBAAuB;IACzE,OAAO;QACLa,WAAWW,IAAI,CACb,IAAME,qBAAqBL,OAAOvB,QAAQ,EAAEuB,OAAO1B,GAAG,GACtD,IAAMgC,oBAAoBN,OAAOzB,OAAO,EAAEyB,OAAOvB,QAAQ;IAE7D;IAEA,KAAK,MAAM8B,oBAAoBf,WAAY;QACzC,MAAMI,YAAYW;QAClB,IAAIX,cAAcR,aAAaQ,cAAc,MAAM;QACnD,IACEY,iBAAiBR,OAAOzB,OAAO,EAAEyB,OAAOvB,QAAQ,EAAEmB,WAAWI,OAAOrB,uBAAuB,GAC3F;YACA,OAAOiB;QACT;IACF;IAEA,MAAM,IAAI7B,uBAAuBiC,OAAOzB,OAAO,EAAEyB,OAAOvB,QAAQ,EAAE;AACpE;AAEA,SAAS6B,oBAAoB/B,OAAgB,EAAEE,QAA0B;IACvE,MAAMgC,gBAAgBC,mBAAmBnC,SAASE;IAClD,MAAMqB,QAAQhC,sBAAsBW;IACpC,IAAIqB,UAAUV,aAAaU,MAAMC,cAAc,KAAK,aAAa;QAC/D,MAAM,IAAI7B,8BAA8BO;IAC1C;IACA,IACEqB,MAAMa,aAAa,KAAK,QACxBF,cAAcG,IAAI,CAAC,CAAChB,YAAcA,UAAUiB,EAAE,KAAKf,MAAMa,aAAa,GACtE;QACA,OAAOb,MAAMa,aAAa;IAC5B;IAEA,MAAMG,aAAaL,aAAa,CAAC,EAAE;IACnC,IAAIK,eAAe1B,WAAW,MAAM,IAAIrB,uBAAuBQ,SAASE,UAAU;IAClF,OAAOqC,WAAWD,EAAE;AACtB;AAEA,SAASR,qBACP5B,QAA0B,EAC1BH,GAAiC;IAEjC,OAAOG,aAAaH,IAAIoB,uBAAuB,GAAGpB,IAAI+B,oBAAoB,GAAGjB;AAC/E;AAEA,SAAS2B,wBACPtC,QAA0B,EAC1BH,GAAiC;IAEjC,OAAOG,aAAaH,IAAIoB,uBAAuB,GAAGpB,IAAIyC,uBAAuB,GAAG3B;AAClF;AAEA,SAASgB,mBACPzB,uBAA8D;IAE9D,IAAIA,yBAAyBkB,SAAS,UAAU,OAAOT;IACvD,OAAOT,wBAAwBqC,MAAM,EAAE,CAAC,EAAE,EAAEH;AAC9C;AAEA,SAASZ,cACP1B,OAAgB,EAChBE,QAA0B,EAC1BK,KAAa,EACbH,uBAA8D;IAE9D,IAAI6B,iBAAiBjC,SAASE,UAAUK,OAAOH,0BAA0B;IACzE,MAAM,IAAIZ,uBAAuBQ,SAASE,UAAUK;AACtD;AAEA,SAAS0B,iBACPjC,OAAgB,EAChBE,QAA0B,EAC1BK,KAAa,EACbH,uBAA8D;IAE9D,IAAIA,yBAAyBkB,SAAS,UAAU;QAC9C,OAAOlB,wBAAwBqC,MAAM,EAAEJ,KAAK,CAAChB,YAAcA,UAAUiB,EAAE,KAAK/B,UAAU;IACxF;IAEA,OAAO4B,mBAAmBnC,SAASE,UAAUmC,IAAI,CAAC,CAAChB,YAAcA,UAAUiB,EAAE,KAAK/B;AACpF;AAEA,SAAS4B,mBAAmBnC,OAAgB,EAAEE,QAA0B;IACtE,OAAON,0BAA0BI,SAASE;AAC5C;AAEA,SAASa,oBACPf,OAAgB,EAChBE,QAA0B,EAC1BE,uBAA8D;IAE9D,IAAIA,yBAAyBkB,SAAS,UAAU,OAAOtB,YAAY;IAEnE,OAAOV,qBAAqBU,SAASgB,oBAAoB,CAAC0B,QAAQ,CAACxC;AACrE;AAEA,SAASQ,gBAAgBe,MAMxB;IACC,MAAMkB,iBAAiBvD,sBAAsB,CAACqC,OAAOzB,OAAO,CAAC;IAC7D,MAAMY,aAAatB,qBAAqBmC,OAAOzB,OAAO;IAEtD,IAAIyB,OAAO3B,IAAI,CAACW,QAAQ,KAAKI,WAAW;QACtC,IAAI,CAAC8B,eAAeC,SAAS,CAACnB,OAAO3B,IAAI,CAACW,QAAQ,EAAEoC,OAAO,EAAE;YAC3D,MAAM,IAAInD,gCACR+B,OAAOzB,OAAO,EACdyB,OAAO3B,IAAI,CAACW,QAAQ,EACpBG,WAAWkC,cAAc;QAE7B;QACA,OAAOrB,OAAO3B,IAAI,CAACW,QAAQ;IAC7B;IAEA,MAAMQ,aAAa;QACjBQ,OAAOrB,uBAAuB,EAAE2C;QAChCP,wBAAwBf,OAAOvB,QAAQ,EAAEuB,OAAO1B,GAAG;QACnDa,WAAWmC,eAAe;KAC3B;IACD,KAAK,MAAM1B,aAAaJ,WAAY;QAClC,IAAII,cAAcR,aAAa8B,eAAeC,SAAS,CAACvB,WAAWwB,OAAO,EAAE,OAAOxB;IACrF;IAEA,OAAOT,WAAWmC,eAAe;AACnC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type AgentRuntimeCredentialsResponseDto, type AgentThinking, type Harness, type ModelProviderRef, type SupportedModelProviderId } from '@shipfox/api-agent-dto';
|
|
2
|
+
import { getSecretsByNamespace } from '@shipfox/api-secrets';
|
|
3
|
+
export interface ResolveRuntimeCredentialsParams {
|
|
4
|
+
workspaceId: string;
|
|
5
|
+
harness: Harness;
|
|
6
|
+
provider: ModelProviderRef;
|
|
7
|
+
model: string;
|
|
8
|
+
thinking: AgentThinking;
|
|
9
|
+
}
|
|
10
|
+
interface RuntimeCredentialsConfig {
|
|
11
|
+
AGENT_DEFAULT_PROVIDER?: SupportedModelProviderId | undefined;
|
|
12
|
+
AGENT_DEFAULT_PROVIDER_API_KEY?: string | undefined;
|
|
13
|
+
}
|
|
14
|
+
interface ResolveRuntimeCredentialsOptions {
|
|
15
|
+
runtimeConfig?: RuntimeCredentialsConfig | undefined;
|
|
16
|
+
getCredentialBag?: typeof getSecretsByNamespace | undefined;
|
|
17
|
+
}
|
|
18
|
+
export declare function resolveRuntimeCredentials(params: ResolveRuntimeCredentialsParams, options?: ResolveRuntimeCredentialsOptions): Promise<AgentRuntimeCredentialsResponseDto>;
|
|
19
|
+
export declare function getInstanceDefaultModelProviderApiKeyField(providerId: ModelProviderRef): 'api_key' | undefined;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=resolve-runtime-credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-runtime-credentials.d.ts","sourceRoot":"","sources":["../../src/core/resolve-runtime-credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kCAAkC,EACvC,KAAK,aAAa,EAElB,KAAK,OAAO,EACZ,KAAK,gBAAgB,EAErB,KAAK,wBAAwB,EAC9B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAC,qBAAqB,EAAwB,MAAM,sBAAsB,CAAC;AAYlF,MAAM,WAAW,+BAA+B;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,UAAU,wBAAwB;IAChC,sBAAsB,CAAC,EAAE,wBAAwB,GAAG,SAAS,CAAC;IAC9D,8BAA8B,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrD;AAED,UAAU,gCAAgC;IACxC,aAAa,CAAC,EAAE,wBAAwB,GAAG,SAAS,CAAC;IACrD,gBAAgB,CAAC,EAAE,OAAO,qBAAqB,GAAG,SAAS,CAAC;CAC7D;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,+BAA+B,EACvC,OAAO,CAAC,EAAE,gCAAgC,GACzC,OAAO,CAAC,kCAAkC,CAAC,CAiD7C;AAED,wBAAgB,0CAA0C,CACxD,UAAU,EAAE,gBAAgB,GAC3B,SAAS,GAAG,SAAS,CAQvB"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { getModelProviderEntry, modelProviderCredentialKeysMatch } from '@shipfox/api-agent-dto';
|
|
2
|
+
import { getSecretsByNamespace, SecretDecryptionError } from '@shipfox/api-secrets';
|
|
3
|
+
import { config } from '#config.js';
|
|
4
|
+
import { getModelProviderConfig } from '#db/index.js';
|
|
5
|
+
import { agentRuntimeConfigResolvedCount } from '#metrics/index.js';
|
|
6
|
+
import { agentSystemNamespace, storeValuesToCustomRuntimeCredentials, storeValuesToRuntimeCredentials } from './credential-fingerprints.js';
|
|
7
|
+
import { ModelProviderConfigNotFoundError } from './errors.js';
|
|
8
|
+
export async function resolveRuntimeCredentials(params, options) {
|
|
9
|
+
const runtimeConfig = options?.runtimeConfig ?? config;
|
|
10
|
+
const getCredentialBag = options?.getCredentialBag ?? getSecretsByNamespace;
|
|
11
|
+
const providerConfig = await getModelProviderConfig({
|
|
12
|
+
workspaceId: params.workspaceId,
|
|
13
|
+
providerId: params.provider
|
|
14
|
+
});
|
|
15
|
+
if (providerConfig) {
|
|
16
|
+
try {
|
|
17
|
+
const values = await getCredentialBag({
|
|
18
|
+
workspaceId: params.workspaceId,
|
|
19
|
+
namespace: agentSystemNamespace(params.provider)
|
|
20
|
+
});
|
|
21
|
+
if (providerConfig.kind === 'custom') {
|
|
22
|
+
const credentials = storeValuesToCustomRuntimeCredentials(values);
|
|
23
|
+
agentRuntimeConfigResolvedCount.add(1, {
|
|
24
|
+
source: 'workspace',
|
|
25
|
+
outcome: 'resolved'
|
|
26
|
+
});
|
|
27
|
+
return toResponse(params, credentials, providerConfig);
|
|
28
|
+
}
|
|
29
|
+
const providerId = params.provider;
|
|
30
|
+
const credentials = storeValuesToRuntimeCredentials(providerId, values);
|
|
31
|
+
if (!modelProviderCredentialKeysMatch(providerId, credentials)) {
|
|
32
|
+
throw new ModelProviderConfigNotFoundError(params.workspaceId, params.provider);
|
|
33
|
+
}
|
|
34
|
+
agentRuntimeConfigResolvedCount.add(1, {
|
|
35
|
+
source: 'workspace',
|
|
36
|
+
outcome: 'resolved'
|
|
37
|
+
});
|
|
38
|
+
return toResponse(params, credentials, providerConfig);
|
|
39
|
+
} catch (error) {
|
|
40
|
+
if (error instanceof SecretDecryptionError) {
|
|
41
|
+
agentRuntimeConfigResolvedCount.add(1, {
|
|
42
|
+
source: 'workspace',
|
|
43
|
+
outcome: 'decryption_failed'
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const instanceCredentials = instanceFallbackCredentials(params.provider, runtimeConfig);
|
|
50
|
+
if (instanceCredentials) {
|
|
51
|
+
agentRuntimeConfigResolvedCount.add(1, {
|
|
52
|
+
source: 'instance',
|
|
53
|
+
outcome: 'resolved'
|
|
54
|
+
});
|
|
55
|
+
return toResponse(params, instanceCredentials);
|
|
56
|
+
}
|
|
57
|
+
agentRuntimeConfigResolvedCount.add(1, {
|
|
58
|
+
source: params.provider === runtimeConfig.AGENT_DEFAULT_PROVIDER ? 'instance' : 'workspace',
|
|
59
|
+
outcome: 'unavailable'
|
|
60
|
+
});
|
|
61
|
+
throw new ModelProviderConfigNotFoundError(params.workspaceId, params.provider);
|
|
62
|
+
}
|
|
63
|
+
export function getInstanceDefaultModelProviderApiKeyField(providerId) {
|
|
64
|
+
const credentialFields = getModelProviderEntry(providerId)?.credential_fields ?? [];
|
|
65
|
+
const field = credentialFields[0];
|
|
66
|
+
if (credentialFields.length !== 1 || field?.key !== 'api_key' || !field.secret) {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
return 'api_key';
|
|
70
|
+
}
|
|
71
|
+
function instanceFallbackCredentials(providerId, runtimeConfig) {
|
|
72
|
+
const instanceApiKey = runtimeConfig.AGENT_DEFAULT_PROVIDER_API_KEY;
|
|
73
|
+
if (providerId !== runtimeConfig.AGENT_DEFAULT_PROVIDER || !instanceApiKey) return undefined;
|
|
74
|
+
const fieldKey = getInstanceDefaultModelProviderApiKeyField(providerId);
|
|
75
|
+
if (!fieldKey) return undefined;
|
|
76
|
+
return {
|
|
77
|
+
[fieldKey]: instanceApiKey
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function toResponse(params, credentials, providerConfig) {
|
|
81
|
+
const response = {
|
|
82
|
+
harness: params.harness,
|
|
83
|
+
provider_id: params.provider,
|
|
84
|
+
model: params.model,
|
|
85
|
+
thinking: params.thinking,
|
|
86
|
+
credentials
|
|
87
|
+
};
|
|
88
|
+
if (providerConfig?.kind === 'custom') {
|
|
89
|
+
response.custom_provider = {
|
|
90
|
+
api: providerConfig.api ?? 'openai-responses',
|
|
91
|
+
base_url: providerConfig.baseUrl ?? '',
|
|
92
|
+
headers: providerConfig.headers ?? [],
|
|
93
|
+
secret_header_names: Object.keys(credentials).filter((key)=>key.startsWith('header:')).map((key)=>key.slice('header:'.length)).sort(),
|
|
94
|
+
models: providerConfig.models ?? [],
|
|
95
|
+
requires_api_key: providerConfig.requiresApiKey
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
return response;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
//# sourceMappingURL=resolve-runtime-credentials.js.map
|
|
@@ -0,0 +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 {getSecretsByNamespace, SecretDecryptionError} from '@shipfox/api-secrets';\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';\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 getCredentialBag?: typeof getSecretsByNamespace | undefined;\n}\n\nexport async function resolveRuntimeCredentials(\n params: ResolveRuntimeCredentialsParams,\n options?: ResolveRuntimeCredentialsOptions,\n): Promise<AgentRuntimeCredentialsResponseDto> {\n const runtimeConfig = options?.runtimeConfig ?? config;\n const getCredentialBag = options?.getCredentialBag ?? getSecretsByNamespace;\n const providerConfig = await getModelProviderConfig({\n workspaceId: params.workspaceId,\n providerId: params.provider,\n });\n\n if (providerConfig) {\n try {\n const values = await getCredentialBag({\n workspaceId: params.workspaceId,\n namespace: agentSystemNamespace(params.provider),\n });\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 (error instanceof SecretDecryptionError) {\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","getSecretsByNamespace","SecretDecryptionError","config","getModelProviderConfig","agentRuntimeConfigResolvedCount","agentSystemNamespace","storeValuesToCustomRuntimeCredentials","storeValuesToRuntimeCredentials","ModelProviderConfigNotFoundError","resolveRuntimeCredentials","params","options","runtimeConfig","getCredentialBag","providerConfig","workspaceId","providerId","provider","values","namespace","kind","credentials","add","source","outcome","toResponse","error","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 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-agent-defaults-resolver.d.ts","sourceRoot":"","sources":["../../src/core/workspace-agent-defaults-resolver.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAA+B,qBAAqB,EAAC,MAAM,2BAA2B,CAAC;AAGnG,wBAAsB,oCAAoC,CACxD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,qBAAqB,CAAC,CA6BhC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { config } from '#config.js';
|
|
2
|
+
import { getAgentWorkspaceDefaultsSnapshot } from '#db/index.js';
|
|
3
|
+
import { resolveAgentConfig } from './resolve-agent-config.js';
|
|
4
|
+
export async function createWorkspaceAgentDefaultsResolver(workspaceId) {
|
|
5
|
+
const snapshot = await getAgentWorkspaceDefaultsSnapshot(workspaceId);
|
|
6
|
+
const workspaceProviderConfigs = new Map();
|
|
7
|
+
for (const providerConfig of snapshot.providerConfigs){
|
|
8
|
+
workspaceProviderConfigs.set(providerConfig.providerId, {
|
|
9
|
+
kind: providerConfig.kind,
|
|
10
|
+
defaultModel: providerConfig.defaultModel,
|
|
11
|
+
defaultThinking: providerConfig.defaultThinking,
|
|
12
|
+
models: providerConfig.models
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
const ctx = {
|
|
16
|
+
workspaceDefaultHarnessId: snapshot.defaultHarnessId ?? null,
|
|
17
|
+
workspaceDefaultProviderId: snapshot.defaultProviderId ?? null,
|
|
18
|
+
workspaceProviderConfigs,
|
|
19
|
+
instanceDefaultProvider: config.AGENT_DEFAULT_PROVIDER,
|
|
20
|
+
instanceDefaultModel: config.AGENT_DEFAULT_PROVIDER_MODEL,
|
|
21
|
+
instanceDefaultThinking: config.AGENT_DEFAULT_PROVIDER_THINKING
|
|
22
|
+
};
|
|
23
|
+
return (step)=>resolveAgentConfig(step, ctx);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=workspace-agent-defaults-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/workspace-agent-defaults-resolver.ts"],"sourcesContent":["import type {\n AgentThinking,\n ModelProviderRef,\n SupportedModelProviderId,\n} from '@shipfox/api-agent-dto';\nimport {config} from '#config.js';\nimport {getAgentWorkspaceDefaultsSnapshot} from '#db/index.js';\nimport type {AgentConfigResolutionContext, AgentDefaultsResolver} from './resolve-agent-config.js';\nimport {resolveAgentConfig} from './resolve-agent-config.js';\n\nexport async function createWorkspaceAgentDefaultsResolver(\n workspaceId: string,\n): Promise<AgentDefaultsResolver> {\n const snapshot = await getAgentWorkspaceDefaultsSnapshot(workspaceId);\n const workspaceProviderConfigs = new Map<\n ModelProviderRef,\n {\n kind: 'builtin' | 'custom';\n defaultModel: string | null;\n defaultThinking: AgentThinking;\n models: (typeof snapshot.providerConfigs)[number]['models'];\n }\n >();\n for (const providerConfig of snapshot.providerConfigs) {\n workspaceProviderConfigs.set(providerConfig.providerId, {\n kind: providerConfig.kind,\n defaultModel: providerConfig.defaultModel,\n defaultThinking: providerConfig.defaultThinking,\n models: providerConfig.models,\n });\n }\n const ctx: AgentConfigResolutionContext = {\n workspaceDefaultHarnessId: snapshot.defaultHarnessId ?? null,\n workspaceDefaultProviderId: snapshot.defaultProviderId ?? null,\n workspaceProviderConfigs,\n instanceDefaultProvider: config.AGENT_DEFAULT_PROVIDER as SupportedModelProviderId | undefined,\n instanceDefaultModel: config.AGENT_DEFAULT_PROVIDER_MODEL,\n instanceDefaultThinking: config.AGENT_DEFAULT_PROVIDER_THINKING as AgentThinking | undefined,\n };\n\n return (step) => resolveAgentConfig(step, ctx);\n}\n"],"names":["config","getAgentWorkspaceDefaultsSnapshot","resolveAgentConfig","createWorkspaceAgentDefaultsResolver","workspaceId","snapshot","workspaceProviderConfigs","Map","providerConfig","providerConfigs","set","providerId","kind","defaultModel","defaultThinking","models","ctx","workspaceDefaultHarnessId","defaultHarnessId","workspaceDefaultProviderId","defaultProviderId","instanceDefaultProvider","AGENT_DEFAULT_PROVIDER","instanceDefaultModel","AGENT_DEFAULT_PROVIDER_MODEL","instanceDefaultThinking","AGENT_DEFAULT_PROVIDER_THINKING","step"],"mappings":"AAKA,SAAQA,MAAM,QAAO,aAAa;AAClC,SAAQC,iCAAiC,QAAO,eAAe;AAE/D,SAAQC,kBAAkB,QAAO,4BAA4B;AAE7D,OAAO,eAAeC,qCACpBC,WAAmB;IAEnB,MAAMC,WAAW,MAAMJ,kCAAkCG;IACzD,MAAME,2BAA2B,IAAIC;IASrC,KAAK,MAAMC,kBAAkBH,SAASI,eAAe,CAAE;QACrDH,yBAAyBI,GAAG,CAACF,eAAeG,UAAU,EAAE;YACtDC,MAAMJ,eAAeI,IAAI;YACzBC,cAAcL,eAAeK,YAAY;YACzCC,iBAAiBN,eAAeM,eAAe;YAC/CC,QAAQP,eAAeO,MAAM;QAC/B;IACF;IACA,MAAMC,MAAoC;QACxCC,2BAA2BZ,SAASa,gBAAgB,IAAI;QACxDC,4BAA4Bd,SAASe,iBAAiB,IAAI;QAC1Dd;QACAe,yBAAyBrB,OAAOsB,sBAAsB;QACtDC,sBAAsBvB,OAAOwB,4BAA4B;QACzDC,yBAAyBzB,OAAO0B,+BAA+B;IACjE;IAEA,OAAO,CAACC,OAASzB,mBAAmByB,MAAMX;AAC5C"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Harness, type ModelProviderRef } from '@shipfox/api-agent-dto';
|
|
2
|
+
import type { ModelProviderConfig } from '#core/entities/model-provider-config.js';
|
|
3
|
+
export interface AgentWorkspaceDefaultsSnapshot {
|
|
4
|
+
readonly defaultHarnessId?: Harness | null | undefined;
|
|
5
|
+
readonly defaultProviderId?: ModelProviderRef | null | undefined;
|
|
6
|
+
readonly providerConfigs: ModelProviderConfig[];
|
|
7
|
+
}
|
|
8
|
+
export declare function getAgentWorkspaceDefaultsSnapshot(workspaceId: string): Promise<AgentWorkspaceDefaultsSnapshot>;
|
|
9
|
+
//# sourceMappingURL=agent-defaults-snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-defaults-snapshot.d.ts","sourceRoot":"","sources":["../../src/db/agent-defaults-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,OAAO,EAAiB,KAAK,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AAE1F,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,yCAAyC,CAAC;AAKjF,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IACvD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC;IACjE,QAAQ,CAAC,eAAe,EAAE,mBAAmB,EAAE,CAAC;CACjD;AAED,wBAAsB,iCAAiC,CACrD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,8BAA8B,CAAC,CAiCzC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { harnessSchema } from '@shipfox/api-agent-dto';
|
|
2
|
+
import { eq, or } from 'drizzle-orm';
|
|
3
|
+
import { db } from './db.js';
|
|
4
|
+
import { agentWorkspaceSettings } from './schema/agent-workspace-settings.js';
|
|
5
|
+
import { modelProviderConfigs, toModelProviderConfig } from './schema/model-provider-configs.js';
|
|
6
|
+
export async function getAgentWorkspaceDefaultsSnapshot(workspaceId) {
|
|
7
|
+
const rows = await db().select({
|
|
8
|
+
settingsWorkspaceId: agentWorkspaceSettings.workspaceId,
|
|
9
|
+
workspaceDefaultHarnessId: agentWorkspaceSettings.defaultHarnessId,
|
|
10
|
+
workspaceDefaultProviderId: agentWorkspaceSettings.defaultProviderId,
|
|
11
|
+
providerConfig: modelProviderConfigs
|
|
12
|
+
}).from(agentWorkspaceSettings).fullJoin(modelProviderConfigs, eq(modelProviderConfigs.workspaceId, agentWorkspaceSettings.workspaceId)).where(or(eq(agentWorkspaceSettings.workspaceId, workspaceId), eq(modelProviderConfigs.workspaceId, workspaceId))).orderBy(modelProviderConfigs.providerId);
|
|
13
|
+
const settingsRow = rows.find((row)=>row.settingsWorkspaceId !== null);
|
|
14
|
+
const parsedHarness = harnessSchema.safeParse(settingsRow?.workspaceDefaultHarnessId);
|
|
15
|
+
return {
|
|
16
|
+
defaultHarnessId: parsedHarness.success ? parsedHarness.data : null,
|
|
17
|
+
defaultProviderId: settingsRow?.workspaceDefaultProviderId,
|
|
18
|
+
providerConfigs: rows.flatMap((row)=>row.providerConfig === null ? [] : [
|
|
19
|
+
toModelProviderConfig(row.providerConfig)
|
|
20
|
+
])
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=agent-defaults-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/db/agent-defaults-snapshot.ts"],"sourcesContent":["import {type Harness, harnessSchema, type ModelProviderRef} from '@shipfox/api-agent-dto';\nimport {eq, or} from 'drizzle-orm';\nimport type {ModelProviderConfig} from '#core/entities/model-provider-config.js';\nimport {db} from './db.js';\nimport {agentWorkspaceSettings} from './schema/agent-workspace-settings.js';\nimport {modelProviderConfigs, toModelProviderConfig} from './schema/model-provider-configs.js';\n\nexport interface AgentWorkspaceDefaultsSnapshot {\n readonly defaultHarnessId?: Harness | null | undefined;\n readonly defaultProviderId?: ModelProviderRef | null | undefined;\n readonly providerConfigs: ModelProviderConfig[];\n}\n\nexport async function getAgentWorkspaceDefaultsSnapshot(\n workspaceId: string,\n): Promise<AgentWorkspaceDefaultsSnapshot> {\n const rows = await db()\n .select({\n settingsWorkspaceId: agentWorkspaceSettings.workspaceId,\n workspaceDefaultHarnessId: agentWorkspaceSettings.defaultHarnessId,\n workspaceDefaultProviderId: agentWorkspaceSettings.defaultProviderId,\n providerConfig: modelProviderConfigs,\n })\n .from(agentWorkspaceSettings)\n .fullJoin(\n modelProviderConfigs,\n eq(modelProviderConfigs.workspaceId, agentWorkspaceSettings.workspaceId),\n )\n .where(\n or(\n eq(agentWorkspaceSettings.workspaceId, workspaceId),\n eq(modelProviderConfigs.workspaceId, workspaceId),\n ),\n )\n .orderBy(modelProviderConfigs.providerId);\n\n const settingsRow = rows.find((row) => row.settingsWorkspaceId !== null);\n const parsedHarness = harnessSchema.safeParse(settingsRow?.workspaceDefaultHarnessId);\n return {\n defaultHarnessId: parsedHarness.success ? parsedHarness.data : null,\n defaultProviderId: settingsRow?.workspaceDefaultProviderId as\n | ModelProviderRef\n | null\n | undefined,\n providerConfigs: rows.flatMap((row) =>\n row.providerConfig === null ? [] : [toModelProviderConfig(row.providerConfig)],\n ),\n };\n}\n"],"names":["harnessSchema","eq","or","db","agentWorkspaceSettings","modelProviderConfigs","toModelProviderConfig","getAgentWorkspaceDefaultsSnapshot","workspaceId","rows","select","settingsWorkspaceId","workspaceDefaultHarnessId","defaultHarnessId","workspaceDefaultProviderId","defaultProviderId","providerConfig","from","fullJoin","where","orderBy","providerId","settingsRow","find","row","parsedHarness","safeParse","success","data","providerConfigs","flatMap"],"mappings":"AAAA,SAAsBA,aAAa,QAA8B,yBAAyB;AAC1F,SAAQC,EAAE,EAAEC,EAAE,QAAO,cAAc;AAEnC,SAAQC,EAAE,QAAO,UAAU;AAC3B,SAAQC,sBAAsB,QAAO,uCAAuC;AAC5E,SAAQC,oBAAoB,EAAEC,qBAAqB,QAAO,qCAAqC;AAQ/F,OAAO,eAAeC,kCACpBC,WAAmB;IAEnB,MAAMC,OAAO,MAAMN,KAChBO,MAAM,CAAC;QACNC,qBAAqBP,uBAAuBI,WAAW;QACvDI,2BAA2BR,uBAAuBS,gBAAgB;QAClEC,4BAA4BV,uBAAuBW,iBAAiB;QACpEC,gBAAgBX;IAClB,GACCY,IAAI,CAACb,wBACLc,QAAQ,CACPb,sBACAJ,GAAGI,qBAAqBG,WAAW,EAAEJ,uBAAuBI,WAAW,GAExEW,KAAK,CACJjB,GACED,GAAGG,uBAAuBI,WAAW,EAAEA,cACvCP,GAAGI,qBAAqBG,WAAW,EAAEA,eAGxCY,OAAO,CAACf,qBAAqBgB,UAAU;IAE1C,MAAMC,cAAcb,KAAKc,IAAI,CAAC,CAACC,MAAQA,IAAIb,mBAAmB,KAAK;IACnE,MAAMc,gBAAgBzB,cAAc0B,SAAS,CAACJ,aAAaV;IAC3D,OAAO;QACLC,kBAAkBY,cAAcE,OAAO,GAAGF,cAAcG,IAAI,GAAG;QAC/Db,mBAAmBO,aAAaR;QAIhCe,iBAAiBpB,KAAKqB,OAAO,CAAC,CAACN,MAC7BA,IAAIR,cAAc,KAAK,OAAO,EAAE,GAAG;gBAACV,sBAAsBkB,IAAIR,cAAc;aAAE;IAElF;AACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Harness, ModelProviderRef } from '@shipfox/api-agent-dto';
|
|
2
|
+
import type { AgentWorkspaceSettings } from '#core/entities/agent-workspace-settings.js';
|
|
3
|
+
export declare function getAgentWorkspaceSettings(workspaceId: string): Promise<AgentWorkspaceSettings | undefined>;
|
|
4
|
+
export declare function setDefaultModelProvider(params: {
|
|
5
|
+
workspaceId: string;
|
|
6
|
+
providerId: ModelProviderRef | null;
|
|
7
|
+
}): Promise<AgentWorkspaceSettings>;
|
|
8
|
+
export declare function setDefaultHarness(params: {
|
|
9
|
+
workspaceId: string;
|
|
10
|
+
harnessId: Harness;
|
|
11
|
+
}): Promise<AgentWorkspaceSettings>;
|
|
12
|
+
//# sourceMappingURL=agent-workspace-settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-workspace-settings.d.ts","sourceRoot":"","sources":["../../src/db/agent-workspace-settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,OAAO,EAAE,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AAEtE,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,4CAA4C,CAAC;AASvF,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAU7C;AAED,wBAAsB,uBAAuB,CAAC,MAAM,EAAE;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACrC,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAuClC;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;CACpB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAmBlC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { and, eq, sql } from 'drizzle-orm';
|
|
2
|
+
import { ModelProviderConfigNotFoundError } from '#core/errors.js';
|
|
3
|
+
import { db } from './db.js';
|
|
4
|
+
import { agentWorkspaceSettings, toAgentWorkspaceSettings } from './schema/agent-workspace-settings.js';
|
|
5
|
+
import { modelProviderConfigs } from './schema/model-provider-configs.js';
|
|
6
|
+
export async function getAgentWorkspaceSettings(workspaceId) {
|
|
7
|
+
const rows = await db().select().from(agentWorkspaceSettings).where(eq(agentWorkspaceSettings.workspaceId, workspaceId)).limit(1);
|
|
8
|
+
const row = rows[0];
|
|
9
|
+
if (!row) return undefined;
|
|
10
|
+
return toAgentWorkspaceSettings(row);
|
|
11
|
+
}
|
|
12
|
+
export async function setDefaultModelProvider(params) {
|
|
13
|
+
return await db().transaction(async (tx)=>{
|
|
14
|
+
if (params.providerId !== null) {
|
|
15
|
+
const existingRows = await tx.select({
|
|
16
|
+
id: modelProviderConfigs.id
|
|
17
|
+
}).from(modelProviderConfigs).where(and(eq(modelProviderConfigs.workspaceId, params.workspaceId), eq(modelProviderConfigs.providerId, params.providerId))).limit(1).for('update');
|
|
18
|
+
if (!existingRows[0]) {
|
|
19
|
+
throw new ModelProviderConfigNotFoundError(params.workspaceId, params.providerId);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const rows = await tx.insert(agentWorkspaceSettings).values({
|
|
23
|
+
workspaceId: params.workspaceId,
|
|
24
|
+
defaultProviderId: params.providerId
|
|
25
|
+
}).onConflictDoUpdate({
|
|
26
|
+
target: agentWorkspaceSettings.workspaceId,
|
|
27
|
+
set: {
|
|
28
|
+
defaultProviderId: params.providerId,
|
|
29
|
+
updatedAt: sql`NOW()`
|
|
30
|
+
}
|
|
31
|
+
}).returning();
|
|
32
|
+
const row = rows[0];
|
|
33
|
+
if (!row) throw new Error('Upsert returned no rows');
|
|
34
|
+
return toAgentWorkspaceSettings(row);
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
export async function setDefaultHarness(params) {
|
|
38
|
+
const rows = await db().insert(agentWorkspaceSettings).values({
|
|
39
|
+
workspaceId: params.workspaceId,
|
|
40
|
+
defaultHarnessId: params.harnessId
|
|
41
|
+
}).onConflictDoUpdate({
|
|
42
|
+
target: agentWorkspaceSettings.workspaceId,
|
|
43
|
+
set: {
|
|
44
|
+
defaultHarnessId: params.harnessId,
|
|
45
|
+
updatedAt: sql`NOW()`
|
|
46
|
+
}
|
|
47
|
+
}).returning();
|
|
48
|
+
const row = rows[0];
|
|
49
|
+
if (!row) throw new Error('Upsert returned no rows');
|
|
50
|
+
return toAgentWorkspaceSettings(row);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=agent-workspace-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/db/agent-workspace-settings.ts"],"sourcesContent":["import type {Harness, ModelProviderRef} from '@shipfox/api-agent-dto';\nimport {and, eq, sql} from 'drizzle-orm';\nimport type {AgentWorkspaceSettings} from '#core/entities/agent-workspace-settings.js';\nimport {ModelProviderConfigNotFoundError} from '#core/errors.js';\nimport {db} from './db.js';\nimport {\n agentWorkspaceSettings,\n toAgentWorkspaceSettings,\n} from './schema/agent-workspace-settings.js';\nimport {modelProviderConfigs} from './schema/model-provider-configs.js';\n\nexport async function getAgentWorkspaceSettings(\n workspaceId: string,\n): Promise<AgentWorkspaceSettings | undefined> {\n const rows = await db()\n .select()\n .from(agentWorkspaceSettings)\n .where(eq(agentWorkspaceSettings.workspaceId, workspaceId))\n .limit(1);\n\n const row = rows[0];\n if (!row) return undefined;\n return toAgentWorkspaceSettings(row);\n}\n\nexport async function setDefaultModelProvider(params: {\n workspaceId: string;\n providerId: ModelProviderRef | null;\n}): Promise<AgentWorkspaceSettings> {\n return await db().transaction(async (tx) => {\n if (params.providerId !== null) {\n const existingRows = await tx\n .select({id: modelProviderConfigs.id})\n .from(modelProviderConfigs)\n .where(\n and(\n eq(modelProviderConfigs.workspaceId, params.workspaceId),\n eq(modelProviderConfigs.providerId, params.providerId),\n ),\n )\n .limit(1)\n .for('update');\n\n if (!existingRows[0]) {\n throw new ModelProviderConfigNotFoundError(params.workspaceId, params.providerId);\n }\n }\n\n const rows = await tx\n .insert(agentWorkspaceSettings)\n .values({\n workspaceId: params.workspaceId,\n defaultProviderId: params.providerId,\n })\n .onConflictDoUpdate({\n target: agentWorkspaceSettings.workspaceId,\n set: {\n defaultProviderId: params.providerId,\n updatedAt: sql`NOW()`,\n },\n })\n .returning();\n\n const row = rows[0];\n if (!row) throw new Error('Upsert returned no rows');\n return toAgentWorkspaceSettings(row);\n });\n}\n\nexport async function setDefaultHarness(params: {\n workspaceId: string;\n harnessId: Harness;\n}): Promise<AgentWorkspaceSettings> {\n const rows = await db()\n .insert(agentWorkspaceSettings)\n .values({\n workspaceId: params.workspaceId,\n defaultHarnessId: params.harnessId,\n })\n .onConflictDoUpdate({\n target: agentWorkspaceSettings.workspaceId,\n set: {\n defaultHarnessId: params.harnessId,\n updatedAt: sql`NOW()`,\n },\n })\n .returning();\n\n const row = rows[0];\n if (!row) throw new Error('Upsert returned no rows');\n return toAgentWorkspaceSettings(row);\n}\n"],"names":["and","eq","sql","ModelProviderConfigNotFoundError","db","agentWorkspaceSettings","toAgentWorkspaceSettings","modelProviderConfigs","getAgentWorkspaceSettings","workspaceId","rows","select","from","where","limit","row","undefined","setDefaultModelProvider","params","transaction","tx","providerId","existingRows","id","for","insert","values","defaultProviderId","onConflictDoUpdate","target","set","updatedAt","returning","Error","setDefaultHarness","defaultHarnessId","harnessId"],"mappings":"AACA,SAAQA,GAAG,EAAEC,EAAE,EAAEC,GAAG,QAAO,cAAc;AAEzC,SAAQC,gCAAgC,QAAO,kBAAkB;AACjE,SAAQC,EAAE,QAAO,UAAU;AAC3B,SACEC,sBAAsB,EACtBC,wBAAwB,QACnB,uCAAuC;AAC9C,SAAQC,oBAAoB,QAAO,qCAAqC;AAExE,OAAO,eAAeC,0BACpBC,WAAmB;IAEnB,MAAMC,OAAO,MAAMN,KAChBO,MAAM,GACNC,IAAI,CAACP,wBACLQ,KAAK,CAACZ,GAAGI,uBAAuBI,WAAW,EAAEA,cAC7CK,KAAK,CAAC;IAET,MAAMC,MAAML,IAAI,CAAC,EAAE;IACnB,IAAI,CAACK,KAAK,OAAOC;IACjB,OAAOV,yBAAyBS;AAClC;AAEA,OAAO,eAAeE,wBAAwBC,MAG7C;IACC,OAAO,MAAMd,KAAKe,WAAW,CAAC,OAAOC;QACnC,IAAIF,OAAOG,UAAU,KAAK,MAAM;YAC9B,MAAMC,eAAe,MAAMF,GACxBT,MAAM,CAAC;gBAACY,IAAIhB,qBAAqBgB,EAAE;YAAA,GACnCX,IAAI,CAACL,sBACLM,KAAK,CACJb,IACEC,GAAGM,qBAAqBE,WAAW,EAAES,OAAOT,WAAW,GACvDR,GAAGM,qBAAqBc,UAAU,EAAEH,OAAOG,UAAU,IAGxDP,KAAK,CAAC,GACNU,GAAG,CAAC;YAEP,IAAI,CAACF,YAAY,CAAC,EAAE,EAAE;gBACpB,MAAM,IAAInB,iCAAiCe,OAAOT,WAAW,EAAES,OAAOG,UAAU;YAClF;QACF;QAEA,MAAMX,OAAO,MAAMU,GAChBK,MAAM,CAACpB,wBACPqB,MAAM,CAAC;YACNjB,aAAaS,OAAOT,WAAW;YAC/BkB,mBAAmBT,OAAOG,UAAU;QACtC,GACCO,kBAAkB,CAAC;YAClBC,QAAQxB,uBAAuBI,WAAW;YAC1CqB,KAAK;gBACHH,mBAAmBT,OAAOG,UAAU;gBACpCU,WAAW7B,GAAG,CAAC,KAAK,CAAC;YACvB;QACF,GACC8B,SAAS;QAEZ,MAAMjB,MAAML,IAAI,CAAC,EAAE;QACnB,IAAI,CAACK,KAAK,MAAM,IAAIkB,MAAM;QAC1B,OAAO3B,yBAAyBS;IAClC;AACF;AAEA,OAAO,eAAemB,kBAAkBhB,MAGvC;IACC,MAAMR,OAAO,MAAMN,KAChBqB,MAAM,CAACpB,wBACPqB,MAAM,CAAC;QACNjB,aAAaS,OAAOT,WAAW;QAC/B0B,kBAAkBjB,OAAOkB,SAAS;IACpC,GACCR,kBAAkB,CAAC;QAClBC,QAAQxB,uBAAuBI,WAAW;QAC1CqB,KAAK;YACHK,kBAAkBjB,OAAOkB,SAAS;YAClCL,WAAW7B,GAAG,CAAC,KAAK,CAAC;QACvB;IACF,GACC8B,SAAS;IAEZ,MAAMjB,MAAML,IAAI,CAAC,EAAE;IACnB,IAAI,CAACK,KAAK,MAAM,IAAIkB,MAAM;IAC1B,OAAO3B,yBAAyBS;AAClC"}
|