@shipfox/api-agent 5.0.0 → 6.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.
Files changed (90) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +30 -0
  3. package/dist/core/custom-model-provider-config-service.d.ts +4 -0
  4. package/dist/core/custom-model-provider-config-service.d.ts.map +1 -1
  5. package/dist/core/custom-model-provider-config-service.js +19 -16
  6. package/dist/core/custom-model-provider-config-service.js.map +1 -1
  7. package/dist/core/model-provider-config-service.d.ts +4 -0
  8. package/dist/core/model-provider-config-service.d.ts.map +1 -1
  9. package/dist/core/model-provider-config-service.js +10 -8
  10. package/dist/core/model-provider-config-service.js.map +1 -1
  11. package/dist/core/resolve-runtime-credentials.d.ts +6 -2
  12. package/dist/core/resolve-runtime-credentials.d.ts.map +1 -1
  13. package/dist/core/resolve-runtime-credentials.js +10 -5
  14. package/dist/core/resolve-runtime-credentials.js.map +1 -1
  15. package/dist/core/secrets-client.d.ts +4 -0
  16. package/dist/core/secrets-client.d.ts.map +1 -0
  17. package/dist/core/secrets-client.js +6 -0
  18. package/dist/core/secrets-client.js.map +1 -0
  19. package/dist/index.d.ts +4 -1
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +19 -13
  22. package/dist/index.js.map +1 -1
  23. package/dist/presentation/e2eRoutes/create-model-provider.d.ts +2 -1
  24. package/dist/presentation/e2eRoutes/create-model-provider.d.ts.map +1 -1
  25. package/dist/presentation/e2eRoutes/create-model-provider.js +46 -45
  26. package/dist/presentation/e2eRoutes/create-model-provider.js.map +1 -1
  27. package/dist/presentation/e2eRoutes/index.d.ts +2 -0
  28. package/dist/presentation/e2eRoutes/index.d.ts.map +1 -1
  29. package/dist/presentation/e2eRoutes/index.js +9 -6
  30. package/dist/presentation/e2eRoutes/index.js.map +1 -1
  31. package/dist/presentation/index.d.ts +1 -1
  32. package/dist/presentation/index.d.ts.map +1 -1
  33. package/dist/presentation/index.js +1 -1
  34. package/dist/presentation/index.js.map +1 -1
  35. package/dist/presentation/inter-module.d.ts +7 -0
  36. package/dist/presentation/inter-module.d.ts.map +1 -0
  37. package/dist/presentation/inter-module.js +45 -0
  38. package/dist/presentation/inter-module.js.map +1 -0
  39. package/dist/presentation/routes/create-custom-model-provider.d.ts +2 -1
  40. package/dist/presentation/routes/create-custom-model-provider.d.ts.map +1 -1
  41. package/dist/presentation/routes/create-custom-model-provider.js +39 -35
  42. package/dist/presentation/routes/create-custom-model-provider.js.map +1 -1
  43. package/dist/presentation/routes/delete-model-provider-config.d.ts +2 -1
  44. package/dist/presentation/routes/delete-model-provider-config.d.ts.map +1 -1
  45. package/dist/presentation/routes/delete-model-provider-config.js +33 -29
  46. package/dist/presentation/routes/delete-model-provider-config.js.map +1 -1
  47. package/dist/presentation/routes/discover-custom-model-provider-models-by-slug.d.ts +2 -1
  48. package/dist/presentation/routes/discover-custom-model-provider-models-by-slug.d.ts.map +1 -1
  49. package/dist/presentation/routes/discover-custom-model-provider-models-by-slug.js +32 -28
  50. package/dist/presentation/routes/discover-custom-model-provider-models-by-slug.js.map +1 -1
  51. package/dist/presentation/routes/errors.d.ts.map +1 -1
  52. package/dist/presentation/routes/errors.js +13 -12
  53. package/dist/presentation/routes/errors.js.map +1 -1
  54. package/dist/presentation/routes/index.d.ts +2 -0
  55. package/dist/presentation/routes/index.d.ts.map +1 -1
  56. package/dist/presentation/routes/index.js +32 -29
  57. package/dist/presentation/routes/index.js.map +1 -1
  58. package/dist/presentation/routes/update-custom-model-provider.d.ts +2 -1
  59. package/dist/presentation/routes/update-custom-model-provider.d.ts.map +1 -1
  60. package/dist/presentation/routes/update-custom-model-provider.js +41 -37
  61. package/dist/presentation/routes/update-custom-model-provider.js.map +1 -1
  62. package/dist/presentation/routes/upsert-model-provider-config.d.ts +2 -1
  63. package/dist/presentation/routes/upsert-model-provider-config.d.ts.map +1 -1
  64. package/dist/presentation/routes/upsert-model-provider-config.js +46 -42
  65. package/dist/presentation/routes/upsert-model-provider-config.js.map +1 -1
  66. package/dist/tsconfig.test.tsbuildinfo +1 -1
  67. package/package.json +11 -8
  68. package/src/core/custom-model-provider-config-service.ts +50 -34
  69. package/src/core/model-provider-config-service.test.ts +1 -3
  70. package/src/core/model-provider-config-service.ts +18 -15
  71. package/src/core/resolve-runtime-credentials.test.ts +3 -3
  72. package/src/core/resolve-runtime-credentials.ts +22 -8
  73. package/src/core/secrets-client.ts +13 -0
  74. package/src/index.ts +13 -8
  75. package/src/presentation/e2eRoutes/create-model-provider.ts +41 -39
  76. package/src/presentation/e2eRoutes/index.ts +6 -4
  77. package/src/presentation/index.ts +1 -1
  78. package/src/presentation/inter-module.ts +78 -0
  79. package/src/presentation/routes/create-custom-model-provider.ts +36 -30
  80. package/src/presentation/routes/delete-model-provider-config.ts +25 -22
  81. package/src/presentation/routes/discover-custom-model-provider-models-by-slug.ts +31 -25
  82. package/src/presentation/routes/errors.ts +11 -11
  83. package/src/presentation/routes/index.ts +32 -27
  84. package/src/presentation/routes/model-provider-config.test.ts +1 -1
  85. package/src/presentation/routes/update-custom-model-provider.ts +40 -34
  86. package/src/presentation/routes/upsert-model-provider-config.ts +43 -37
  87. package/test/fixtures/secrets-client.ts +80 -0
  88. package/test/globalSetup.ts +0 -9
  89. package/test/setup.ts +8 -0
  90. package/tsconfig.build.tsbuildinfo +1 -1
@@ -0,0 +1,80 @@
1
+ import {secretsInterModuleContract} from '@shipfox/api-secrets-dto/inter-module';
2
+ import {createInterModuleKnownError} from '@shipfox/inter-module';
3
+ import type {AgentSecretsClient} from '#core/secrets-client.js';
4
+
5
+ const values = new Map<string, string>();
6
+
7
+ function scopeId(params: {
8
+ workspaceId: string;
9
+ projectId?: string | null | undefined;
10
+ namespace?: string | undefined;
11
+ }) {
12
+ return `${params.workspaceId}\0${params.projectId ?? ''}\0${params.namespace ?? ''}`;
13
+ }
14
+
15
+ function keyId(
16
+ params: {
17
+ workspaceId: string;
18
+ projectId?: string | null | undefined;
19
+ namespace?: string | undefined;
20
+ },
21
+ key: string,
22
+ ) {
23
+ return `${scopeId(params)}\0${key}`;
24
+ }
25
+
26
+ export const agentTestSecretsClient: AgentSecretsClient = {
27
+ deleteSecrets: async (params) => {
28
+ const keys = params.keys ?? (await getSecretsByNamespace(params));
29
+ let deleted = 0;
30
+ for (const key of Array.isArray(keys) ? keys : Object.keys(keys)) {
31
+ if (values.delete(keyId(params, key))) deleted += 1;
32
+ }
33
+ return {deleted};
34
+ },
35
+ getSecretsByNamespace: async (params) => ({values: await getSecretsByNamespace(params)}),
36
+ setSecrets: async (params) => {
37
+ await Promise.resolve();
38
+ for (const value of Object.values(params.values)) {
39
+ if (Buffer.byteLength(value, 'utf8') > 64 * 1024) {
40
+ throw createInterModuleKnownError(
41
+ secretsInterModuleContract.methods.setSecrets,
42
+ 'value-too-large',
43
+ {maxBytes: 64 * 1024},
44
+ );
45
+ }
46
+ }
47
+ for (const [key, value] of Object.entries(params.values)) values.set(keyId(params, key), value);
48
+ return {};
49
+ },
50
+ };
51
+
52
+ export async function getSecretsByNamespace(params: {
53
+ workspaceId: string;
54
+ projectId?: string | null | undefined;
55
+ namespace?: string | undefined;
56
+ }): Promise<Record<string, string>> {
57
+ await Promise.resolve();
58
+ const selected = new Map<string, string>();
59
+ const workspaceScope = `${scopeId({...params, projectId: null})}\0`;
60
+ const projectScope = `${scopeId(params)}\0`;
61
+ for (const [id, value] of values) {
62
+ if (id.startsWith(workspaceScope)) selected.set(id.slice(workspaceScope.length), value);
63
+ if (params.projectId && id.startsWith(projectScope))
64
+ selected.set(id.slice(projectScope.length), value);
65
+ }
66
+ return Object.fromEntries(selected);
67
+ }
68
+
69
+ export async function setSecrets(params: {
70
+ workspaceId: string;
71
+ projectId?: string | null | undefined;
72
+ namespace?: string | undefined;
73
+ values: Record<string, string>;
74
+ }): Promise<void> {
75
+ await agentTestSecretsClient.setSecrets(params);
76
+ }
77
+
78
+ export function resetAgentTestSecrets(): void {
79
+ values.clear();
80
+ }
@@ -1,5 +1,4 @@
1
1
  import './env.js';
2
- import {secretsModule} from '@shipfox/api-secrets';
3
2
  import {runMigrations} from '@shipfox/node-drizzle';
4
3
  import {closePostgresClient, createPostgresClient} from '@shipfox/node-postgres';
5
4
  import {sql} from 'drizzle-orm';
@@ -9,14 +8,6 @@ export async function setup() {
9
8
  createPostgresClient();
10
9
 
11
10
  await runMigrations(db(), migrationsPath, '__drizzle_migrations_agent');
12
- if (!secretsModule.database || Array.isArray(secretsModule.database)) {
13
- throw new Error('Secrets module database is not configured');
14
- }
15
- await runMigrations(
16
- secretsModule.database.db(),
17
- secretsModule.database.migrationsPath,
18
- '__drizzle_migrations_secrets',
19
- );
20
11
  await db().execute(sql`TRUNCATE model_provider_configs CASCADE`);
21
12
  await db().execute(sql`TRUNCATE agent_workspace_settings CASCADE`);
22
13
 
package/test/setup.ts CHANGED
@@ -2,6 +2,13 @@ import './env.js';
2
2
  import {closePostgresClient, createPostgresClient} from '@shipfox/node-postgres';
3
3
  import {afterAll, afterEach, beforeAll, vi} from '@shipfox/vitest/vi';
4
4
  import {closeDb} from '#db/index.js';
5
+ import {agentTestSecretsClient, resetAgentTestSecrets} from '#test/fixtures/secrets-client.js';
6
+
7
+ vi.doMock('#core/secrets-client.js', () => {
8
+ return {
9
+ requireAgentSecretsClient: (client: unknown) => client ?? agentTestSecretsClient,
10
+ };
11
+ });
5
12
 
6
13
  beforeAll(() => {
7
14
  createPostgresClient();
@@ -9,6 +16,7 @@ beforeAll(() => {
9
16
 
10
17
  afterEach(() => {
11
18
  vi.restoreAllMocks();
19
+ resetAgentTestSecrets();
12
20
  });
13
21
 
14
22
  afterAll(async () => {