@vertesia/common 1.6.0-dev.20260923.085325Z → 1.6.0-dev.20261004.085740Z
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/lib/access-control-values.d.ts +2 -2
- package/lib/access-control-values.d.ts.map +1 -1
- package/lib/access-control-values.js +2 -2
- package/lib/access-control-values.js.map +1 -1
- package/lib/access-control.d.ts +7 -8
- package/lib/access-control.d.ts.map +1 -1
- package/lib/access-control.js +5 -0
- package/lib/access-control.js.map +1 -1
- package/lib/analytics.d.ts +6 -7
- package/lib/analytics.d.ts.map +1 -1
- package/lib/api-contract/components.generated.json +1389 -45
- package/lib/api-schemas/access-control.d.ts +33 -10
- package/lib/api-schemas/access-control.d.ts.map +1 -1
- package/lib/api-schemas/access-control.js +7 -6
- package/lib/api-schemas/access-control.js.map +1 -1
- package/lib/api-schemas/account.d.ts +5 -4
- package/lib/api-schemas/account.d.ts.map +1 -1
- package/lib/api-schemas/account.js.map +1 -1
- package/lib/api-schemas/agent-budget.d.ts +15 -0
- package/lib/api-schemas/agent-budget.d.ts.map +1 -0
- package/lib/api-schemas/agent-budget.js +55 -0
- package/lib/api-schemas/agent-budget.js.map +1 -0
- package/lib/api-schemas/agent-runs.d.ts +1525 -100
- package/lib/api-schemas/agent-runs.d.ts.map +1 -1
- package/lib/api-schemas/agent-runs.js +60 -28
- package/lib/api-schemas/agent-runs.js.map +1 -1
- package/lib/api-schemas/apikey.d.ts +11 -10
- package/lib/api-schemas/apikey.d.ts.map +1 -1
- package/lib/api-schemas/apikey.js.map +1 -1
- package/lib/api-schemas/app-lifecycle.d.ts +13 -0
- package/lib/api-schemas/app-lifecycle.d.ts.map +1 -1
- package/lib/api-schemas/app-lifecycle.js +4 -0
- package/lib/api-schemas/app-lifecycle.js.map +1 -1
- package/lib/api-schemas/app-runtime.d.ts +1821 -108
- package/lib/api-schemas/app-runtime.d.ts.map +1 -1
- package/lib/api-schemas/audit-trail.d.ts +20 -0
- package/lib/api-schemas/audit-trail.d.ts.map +1 -1
- package/lib/api-schemas/audit-trail.js +7 -1
- package/lib/api-schemas/audit-trail.js.map +1 -1
- package/lib/api-schemas/content.d.ts +665 -30
- package/lib/api-schemas/content.d.ts.map +1 -1
- package/lib/api-schemas/content.js +47 -0
- package/lib/api-schemas/content.js.map +1 -1
- package/lib/api-schemas/cost-analytics.d.ts +18 -0
- package/lib/api-schemas/cost-analytics.d.ts.map +1 -1
- package/lib/api-schemas/cost-analytics.js +31 -2
- package/lib/api-schemas/cost-analytics.js.map +1 -1
- package/lib/api-schemas/document-processing.d.ts +381 -18
- package/lib/api-schemas/document-processing.d.ts.map +1 -1
- package/lib/api-schemas/environment.d.ts +0 -5
- package/lib/api-schemas/environment.d.ts.map +1 -1
- package/lib/api-schemas/environment.js +0 -1
- package/lib/api-schemas/environment.js.map +1 -1
- package/lib/api-schemas/events.d.ts +1143 -54
- package/lib/api-schemas/events.d.ts.map +1 -1
- package/lib/api-schemas/group.d.ts +2 -1
- package/lib/api-schemas/group.d.ts.map +1 -1
- package/lib/api-schemas/group.js.map +1 -1
- package/lib/api-schemas/index.d.ts +1 -0
- package/lib/api-schemas/index.d.ts.map +1 -1
- package/lib/api-schemas/index.js +1 -0
- package/lib/api-schemas/index.js.map +1 -1
- package/lib/api-schemas/inference-profile.d.ts +5017 -0
- package/lib/api-schemas/inference-profile.d.ts.map +1 -0
- package/lib/api-schemas/inference-profile.js +135 -0
- package/lib/api-schemas/inference-profile.js.map +1 -0
- package/lib/api-schemas/integrations.d.ts +6 -6
- package/lib/api-schemas/interaction.d.ts +34391 -703
- package/lib/api-schemas/interaction.d.ts.map +1 -1
- package/lib/api-schemas/interaction.js +34 -1
- package/lib/api-schemas/interaction.js.map +1 -1
- package/lib/api-schemas/invites.d.ts +10 -9
- package/lib/api-schemas/invites.d.ts.map +1 -1
- package/lib/api-schemas/invites.js.map +1 -1
- package/lib/api-schemas/process.d.ts +653 -34
- package/lib/api-schemas/process.d.ts.map +1 -1
- package/lib/api-schemas/process.js +66 -0
- package/lib/api-schemas/process.js.map +1 -1
- package/lib/api-schemas/project-configuration.d.ts +1323 -62
- package/lib/api-schemas/project-configuration.d.ts.map +1 -1
- package/lib/api-schemas/project-configuration.js +15 -1
- package/lib/api-schemas/project-configuration.js.map +1 -1
- package/lib/api-schemas/project.d.ts +2031 -116
- package/lib/api-schemas/project.d.ts.map +1 -1
- package/lib/api-schemas/project.js +9 -1
- package/lib/api-schemas/project.js.map +1 -1
- package/lib/api-schemas/quota.d.ts +7 -6
- package/lib/api-schemas/quota.d.ts.map +1 -1
- package/lib/api-schemas/quota.js.map +1 -1
- package/lib/api-schemas/registry.d.ts +27820 -35892
- package/lib/api-schemas/registry.d.ts.map +1 -1
- package/lib/api-schemas/registry.js +55 -5
- package/lib/api-schemas/registry.js.map +1 -1
- package/lib/api-schemas/run-budget.d.ts +52 -0
- package/lib/api-schemas/run-budget.d.ts.map +1 -0
- package/lib/api-schemas/run-budget.js +55 -0
- package/lib/api-schemas/run-budget.js.map +1 -0
- package/lib/api-schemas/store.d.ts +6388 -338
- package/lib/api-schemas/store.d.ts.map +1 -1
- package/lib/api-schemas/store.js +11 -0
- package/lib/api-schemas/store.js.map +1 -1
- package/lib/api-schemas/user.d.ts +9 -8
- package/lib/api-schemas/user.d.ts.map +1 -1
- package/lib/api-schemas/user.js.map +1 -1
- package/lib/api-schemas/view-execution.d.ts +8 -0
- package/lib/api-schemas/view-execution.d.ts.map +1 -1
- package/lib/api-schemas/views.d.ts +14 -0
- package/lib/api-schemas/views.d.ts.map +1 -1
- package/lib/api-schemas/workflow-runs.d.ts +335 -12
- package/lib/api-schemas/workflow-runs.d.ts.map +1 -1
- package/lib/api-schemas/workflow-runs.js +2 -0
- package/lib/api-schemas/workflow-runs.js.map +1 -1
- package/lib/apikey.d.ts +30 -25
- package/lib/apikey.d.ts.map +1 -1
- package/lib/apikey.js.map +1 -1
- package/lib/apps.d.ts +116 -121
- package/lib/apps.d.ts.map +1 -1
- package/lib/apps.js.map +1 -1
- package/lib/audit-trail.d.ts +17 -18
- package/lib/audit-trail.d.ts.map +1 -1
- package/lib/audit-trail.js +2 -0
- package/lib/audit-trail.js.map +1 -1
- package/lib/browser-credentials.d.ts +11 -12
- package/lib/browser-credentials.d.ts.map +1 -1
- package/lib/common.d.ts +17 -24
- package/lib/common.d.ts.map +1 -1
- package/lib/content-query.d.ts +3 -4
- package/lib/content-query.d.ts.map +1 -1
- package/lib/cost-analytics.d.ts +13 -21
- package/lib/cost-analytics.d.ts.map +1 -1
- package/lib/cost-analytics.js +0 -7
- package/lib/cost-analytics.js.map +1 -1
- package/lib/data-platform.d.ts +79 -88
- package/lib/data-platform.d.ts.map +1 -1
- package/lib/data-platform.js.map +1 -1
- package/lib/delegation.d.ts +4 -5
- package/lib/delegation.d.ts.map +1 -1
- package/lib/email.d.ts +15 -17
- package/lib/email.d.ts.map +1 -1
- package/lib/email.js.map +1 -1
- package/lib/embeddings.d.ts +25 -26
- package/lib/embeddings.d.ts.map +1 -1
- package/lib/environment.d.ts +16 -17
- package/lib/environment.d.ts.map +1 -1
- package/lib/environment.js.map +1 -1
- package/lib/facets.d.ts +3 -4
- package/lib/facets.d.ts.map +1 -1
- package/lib/group.d.ts +6 -7
- package/lib/group.d.ts.map +1 -1
- package/lib/group.js.map +1 -1
- package/lib/index.d.ts +3 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/inference-profile.d.ts +17 -0
- package/lib/inference-profile.d.ts.map +1 -0
- package/lib/inference-profile.js +2 -0
- package/lib/inference-profile.js.map +1 -0
- package/lib/integrations.d.ts +19 -20
- package/lib/integrations.d.ts.map +1 -1
- package/lib/integrations.js.map +1 -1
- package/lib/interaction.d.ts +68 -73
- package/lib/interaction.d.ts.map +1 -1
- package/lib/interaction.js.map +1 -1
- package/lib/meters.d.ts +4 -5
- package/lib/meters.d.ts.map +1 -1
- package/lib/oauth-server.d.ts +40 -41
- package/lib/oauth-server.d.ts.map +1 -1
- package/lib/oauth.d.ts +9 -10
- package/lib/oauth.d.ts.map +1 -1
- package/lib/payload.d.ts +11 -14
- package/lib/payload.d.ts.map +1 -1
- package/lib/pending-asks.d.ts +8 -13
- package/lib/pending-asks.d.ts.map +1 -1
- package/lib/pending-asks.js +0 -4
- package/lib/pending-asks.js.map +1 -1
- package/lib/platform-event.d.ts +48 -51
- package/lib/platform-event.d.ts.map +1 -1
- package/lib/platform-event.js.map +1 -1
- package/lib/principal-context.d.ts +3 -3
- package/lib/principal-context.d.ts.map +1 -1
- package/lib/project.d.ts +42 -43
- package/lib/project.d.ts.map +1 -1
- package/lib/project.js.map +1 -1
- package/lib/prompt.d.ts +14 -16
- package/lib/prompt.d.ts.map +1 -1
- package/lib/prompt.js.map +1 -1
- package/lib/query.d.ts +10 -13
- package/lib/query.d.ts.map +1 -1
- package/lib/rate-limiter.d.ts +7 -11
- package/lib/rate-limiter.d.ts.map +1 -1
- package/lib/refs.d.ts +2 -3
- package/lib/refs.d.ts.map +1 -1
- package/lib/refs.js.map +1 -1
- package/lib/roles/types.d.ts +5 -6
- package/lib/roles/types.d.ts.map +1 -1
- package/lib/roles/types.js.map +1 -1
- package/lib/run-budget.d.ts +8 -0
- package/lib/run-budget.d.ts.map +1 -0
- package/lib/run-budget.js +2 -0
- package/lib/run-budget.js.map +1 -0
- package/lib/runs.d.ts +9 -10
- package/lib/runs.d.ts.map +1 -1
- package/lib/secrets.d.ts +20 -21
- package/lib/secrets.d.ts.map +1 -1
- package/lib/store/agent-approval.d.ts +4 -5
- package/lib/store/agent-approval.d.ts.map +1 -1
- package/lib/store/agent-approval.js.map +1 -1
- package/lib/store/agent-run.d.ts +50 -52
- package/lib/store/agent-run.d.ts.map +1 -1
- package/lib/store/agent-run.js.map +1 -1
- package/lib/store/collections.d.ts +11 -12
- package/lib/store/collections.d.ts.map +1 -1
- package/lib/store/collections.js.map +1 -1
- package/lib/store/conversation-state.d.ts +14 -8
- package/lib/store/conversation-state.d.ts.map +1 -1
- package/lib/store/doc-analyzer.d.ts +7 -8
- package/lib/store/doc-analyzer.d.ts.map +1 -1
- package/lib/store/dsl-workflow.d.ts +10 -12
- package/lib/store/dsl-workflow.d.ts.map +1 -1
- package/lib/store/dsl-workflow.js.map +1 -1
- package/lib/store/duration.d.ts +12 -0
- package/lib/store/duration.d.ts.map +1 -0
- package/lib/store/duration.js +2 -0
- package/lib/store/duration.js.map +1 -0
- package/lib/store/grounded-extraction.d.ts +6 -7
- package/lib/store/grounded-extraction.d.ts.map +1 -1
- package/lib/store/intake-policy-schema.generated.d.ts.map +1 -1
- package/lib/store/intake-policy-schema.generated.js +143 -2
- package/lib/store/intake-policy-schema.generated.js.map +1 -1
- package/lib/store/process.d.ts +70 -69
- package/lib/store/process.d.ts.map +1 -1
- package/lib/store/process.js.map +1 -1
- package/lib/store/rendering.d.ts +6 -12
- package/lib/store/rendering.d.ts.map +1 -1
- package/lib/store/rendering.js +0 -5
- package/lib/store/rendering.js.map +1 -1
- package/lib/store/signals.d.ts +43 -0
- package/lib/store/signals.d.ts.map +1 -1
- package/lib/store/signals.js +6 -1
- package/lib/store/signals.js.map +1 -1
- package/lib/store/store.d.ts +92 -91
- package/lib/store/store.d.ts.map +1 -1
- package/lib/store/store.js.map +1 -1
- package/lib/store/task.d.ts +10 -14
- package/lib/store/task.d.ts.map +1 -1
- package/lib/store/workflow.d.ts +35 -41
- package/lib/store/workflow.d.ts.map +1 -1
- package/lib/store/workflow.js.map +1 -1
- package/lib/sts-token-types.d.ts +14 -19
- package/lib/sts-token-types.d.ts.map +1 -1
- package/lib/tools.d.ts +12 -13
- package/lib/tools.d.ts.map +1 -1
- package/lib/transient-tokens.d.ts +3 -3
- package/lib/transient-tokens.d.ts.map +1 -1
- package/lib/user.d.ts +17 -20
- package/lib/user.d.ts.map +1 -1
- package/lib/user.js.map +1 -1
- package/lib/vertesia-common.js +2 -2
- package/lib/vertesia-common.js.map +1 -1
- package/lib/views.d.ts +61 -64
- package/lib/views.d.ts.map +1 -1
- package/lib/views.js.map +1 -1
- package/lib/wire-types.generated.d.ts +11231 -0
- package/lib/wire-types.generated.d.ts.map +1 -0
- package/lib/wire-types.generated.js +4 -0
- package/lib/wire-types.generated.js.map +1 -0
- package/lib/workflow-analytics.d.ts +21 -19
- package/lib/workflow-analytics.d.ts.map +1 -1
- package/lib/workflow-analytics.js +2 -2
- package/lib/workflow-analytics.js.map +1 -1
- package/package.json +15 -10
- package/src/access-control-values.ts +2 -2
- package/src/access-control.ts +7 -15
- package/src/analytics.ts +6 -13
- package/src/api-contract/components.generated.json +1389 -45
- package/src/api-schemas/access-control.ts +18 -16
- package/src/api-schemas/account.ts +5 -4
- package/src/api-schemas/agent-budget.ts +60 -0
- package/src/api-schemas/agent-runs.ts +63 -27
- package/src/api-schemas/apikey.ts +11 -10
- package/src/api-schemas/app-lifecycle.ts +5 -0
- package/src/api-schemas/audit-trail.ts +7 -1
- package/src/api-schemas/content.ts +55 -0
- package/src/api-schemas/cost-analytics.ts +34 -2
- package/src/api-schemas/environment.ts +0 -1
- package/src/api-schemas/group.ts +2 -1
- package/src/api-schemas/index.ts +1 -0
- package/src/api-schemas/inference-profile.ts +151 -0
- package/src/api-schemas/interaction.ts +40 -1
- package/src/api-schemas/invites.ts +10 -9
- package/src/api-schemas/process.ts +78 -2
- package/src/api-schemas/project-configuration.ts +19 -1
- package/src/api-schemas/project.ts +19 -10
- package/src/api-schemas/quota.ts +7 -6
- package/src/api-schemas/registry.ts +131 -33
- package/src/api-schemas/run-budget.ts +60 -0
- package/src/api-schemas/store.ts +12 -0
- package/src/api-schemas/user.ts +9 -8
- package/src/api-schemas/workflow-runs.ts +2 -0
- package/src/apikey.ts +30 -39
- package/src/apps.ts +116 -239
- package/src/audit-trail.ts +18 -33
- package/src/browser-credentials.ts +11 -23
- package/src/common.ts +17 -37
- package/src/content-query.ts +3 -4
- package/src/cost-analytics.ts +13 -35
- package/src/data-platform.ts +79 -168
- package/src/delegation.ts +4 -9
- package/src/email.ts +15 -29
- package/src/embeddings.ts +25 -51
- package/src/environment.ts +16 -33
- package/src/facets.ts +3 -4
- package/src/group.ts +6 -13
- package/src/index.ts +27 -0
- package/src/inference-profile.ts +20 -0
- package/src/integrations.ts +21 -41
- package/src/interaction.ts +68 -137
- package/src/meters.ts +4 -9
- package/src/oauth-server.ts +40 -81
- package/src/oauth.ts +9 -19
- package/src/payload.ts +11 -25
- package/src/pending-asks.ts +8 -22
- package/src/platform-event.ts +48 -97
- package/src/principal-context.ts +3 -3
- package/src/project.ts +43 -86
- package/src/prompt.ts +14 -31
- package/src/query.ts +10 -20
- package/src/rate-limiter.ts +7 -19
- package/src/refs.ts +2 -3
- package/src/roles/types.ts +5 -11
- package/src/run-budget.ts +8 -0
- package/src/runs.ts +9 -19
- package/src/secrets.ts +20 -41
- package/src/store/agent-approval.ts +4 -9
- package/src/store/agent-run.ts +53 -99
- package/src/store/collections.ts +11 -23
- package/src/store/conversation-state.ts +15 -15
- package/src/store/doc-analyzer.ts +7 -15
- package/src/store/dsl-workflow.ts +10 -23
- package/src/store/duration.ts +45 -0
- package/src/store/grounded-extraction.ts +6 -13
- package/src/store/intake-policy-schema.generated.ts +148 -2
- package/src/store/process.ts +70 -140
- package/src/store/rendering.ts +6 -19
- package/src/store/signals.ts +48 -0
- package/src/store/store.ts +92 -181
- package/src/store/task.ts +10 -24
- package/src/store/workflow.ts +35 -71
- package/src/sts-token-types.ts +14 -33
- package/src/tools.ts +12 -25
- package/src/transient-tokens.ts +3 -3
- package/src/user.ts +17 -39
- package/src/views.ts +61 -125
- package/src/wire-types.generated.ts +11889 -0
- package/src/workflow-analytics.ts +21 -19
- package/src/agent-resources.test.ts +0 -89
- package/src/api-contract/components.contract.test.ts +0 -99
- package/src/api-schemas/access-control.contract.test.ts +0 -209
- package/src/api-schemas/account-apikey.test.ts +0 -60
- package/src/api-schemas/account.contract.test.ts +0 -319
- package/src/api-schemas/adapter-edge-cases.test.ts +0 -499
- package/src/api-schemas/agent-communication.contract.test.ts +0 -90
- package/src/api-schemas/agent-history.contract.test.ts +0 -42
- package/src/api-schemas/agent-runs.contract.test.ts +0 -240
- package/src/api-schemas/api-discriminators.test.ts +0 -185
- package/src/api-schemas/apikey.contract.test.ts +0 -270
- package/src/api-schemas/app-delete-summary.contract.test.ts +0 -67
- package/src/api-schemas/bulk-operation.contract.test.ts +0 -39
- package/src/api-schemas/bundle-isolation.test.ts +0 -44
- package/src/api-schemas/commands.contract.test.ts +0 -51
- package/src/api-schemas/cost-analytics.contract.test.ts +0 -64
- package/src/api-schemas/dashboard.contract.test.ts +0 -138
- package/src/api-schemas/data-store.contract.test.ts +0 -97
- package/src/api-schemas/document-processing.contract.test.ts +0 -76
- package/src/api-schemas/emit-json-schema.test.ts +0 -36
- package/src/api-schemas/environment.contract.test.ts +0 -202
- package/src/api-schemas/group.contract.test.ts +0 -205
- package/src/api-schemas/indexing.contract.test.ts +0 -122
- package/src/api-schemas/interaction.contract.test.ts +0 -307
- package/src/api-schemas/invites.contract.test.ts +0 -268
- package/src/api-schemas/llumiverse.contract.test.ts +0 -179
- package/src/api-schemas/mcp-api-key.contract.test.ts +0 -125
- package/src/api-schemas/oauth.contract.test.ts +0 -181
- package/src/api-schemas/parameters.test.ts +0 -402
- package/src/api-schemas/process.contract.test.ts +0 -115
- package/src/api-schemas/project.contract.test.ts +0 -472
- package/src/api-schemas/pruning-limits.test.ts +0 -189
- package/src/api-schemas/quota.contract.test.ts +0 -147
- package/src/api-schemas/registry-groups.test.ts +0 -99
- package/src/api-schemas/response-pruning.test.ts +0 -260
- package/src/api-schemas/store.contract.test.ts +0 -378
- package/src/api-schemas/sts.contract.test.ts +0 -112
- package/src/api-schemas/user.contract.test.ts +0 -197
- package/src/api-schemas/views.contract.test.ts +0 -112
- package/src/api-schemas/zeno-response-contracts.test.ts +0 -380
- package/src/apps.test.ts +0 -89
- package/src/oauth-scopes.test.ts +0 -15
- package/src/roles.test.ts +0 -33
- package/src/schema-for-extraction.test.ts +0 -191
- package/src/store/agent-approval.test.ts +0 -18
- package/src/store/content-type-editing.test.ts +0 -17
- package/src/store/ms.d.ts +0 -42
- package/src/store/schedule.test.ts +0 -59
- package/src/store/workflow.test.ts +0 -640
- package/src/versions.test.ts +0 -13
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { findUnprunablePaths, pruneToSchema, toOpenApiComponents } from './adapter.js';
|
|
3
|
-
import { findUnprunableApiPaths } from './registry.js';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Pins the shapes where pruning declines to narrow.
|
|
7
|
-
*
|
|
8
|
-
* These are limitations, not bugs: guessing which branch of an ambiguous schema applies risks
|
|
9
|
-
* deleting legitimate data. They are pinned here so the boundary is explicit and cannot be
|
|
10
|
-
* mistaken for a secret-removal guarantee — anything sensitive needs an explicit response mapper
|
|
11
|
-
* or a request/response type split.
|
|
12
|
-
*/
|
|
13
|
-
describe('shapes where pruning passes values through untouched', () => {
|
|
14
|
-
const SENSITIVE = { a: 'x', stripe_secret: 'sk_live_leak' };
|
|
15
|
-
|
|
16
|
-
it('an allOf intersection is not pruned', () => {
|
|
17
|
-
const components = toOpenApiComponents({
|
|
18
|
-
Merged: { allOf: [{ type: 'object', properties: { a: { type: 'string' } } }] },
|
|
19
|
-
});
|
|
20
|
-
expect(pruneToSchema(SENSITIVE, { $ref: '#/components/schemas/Merged' }, components)).toEqual(SENSITIVE);
|
|
21
|
-
expect(findUnprunablePaths({ $ref: '#/components/schemas/Merged' }, components)).toEqual([' (allOf)']);
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
it('a union without a discriminator is not pruned', () => {
|
|
25
|
-
const components = toOpenApiComponents({
|
|
26
|
-
Loose: {
|
|
27
|
-
anyOf: [
|
|
28
|
-
{ type: 'object', properties: { a: { type: 'string' } } },
|
|
29
|
-
{ type: 'object', properties: { b: { type: 'string' } } },
|
|
30
|
-
],
|
|
31
|
-
},
|
|
32
|
-
});
|
|
33
|
-
expect(pruneToSchema(SENSITIVE, { $ref: '#/components/schemas/Loose' }, components)).toEqual(SENSITIVE);
|
|
34
|
-
expect(findUnprunablePaths({ $ref: '#/components/schemas/Loose' }, components)).toEqual([
|
|
35
|
-
' (union without discriminator)',
|
|
36
|
-
]);
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it('a discriminator value with no mapping entry is not pruned', () => {
|
|
40
|
-
const components = toOpenApiComponents({
|
|
41
|
-
Union: {
|
|
42
|
-
anyOf: [{ $ref: '#/$defs/A' }, { $ref: '#/$defs/B' }],
|
|
43
|
-
$defs: {
|
|
44
|
-
A: { type: 'object', properties: { kind: { const: 'a' } }, required: ['kind'] },
|
|
45
|
-
B: { type: 'object', properties: { kind: { const: 'b' } }, required: ['kind'] },
|
|
46
|
-
},
|
|
47
|
-
},
|
|
48
|
-
});
|
|
49
|
-
const unknownBranch = { kind: 'c', stripe_secret: 'sk_live_leak' };
|
|
50
|
-
expect(pruneToSchema(unknownBranch, { $ref: '#/components/schemas/Union' }, components)).toEqual(unknownBranch);
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it('an unresolvable reference is not pruned', () => {
|
|
54
|
-
expect(pruneToSchema(SENSITIVE, { $ref: '#/components/schemas/Absent' }, {})).toEqual(SENSITIVE);
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it('patternProperties is not pruned — its keys are declared but absent from `properties`', () => {
|
|
58
|
-
const components = toOpenApiComponents({
|
|
59
|
-
Headers: {
|
|
60
|
-
type: 'object',
|
|
61
|
-
properties: { a: { type: 'string' } },
|
|
62
|
-
patternProperties: { '^x-': { type: 'string' } },
|
|
63
|
-
},
|
|
64
|
-
});
|
|
65
|
-
const payload = { a: 'x', 'x-trace': 'declared-by-pattern', stripe_secret: 'sk_live_leak' };
|
|
66
|
-
expect(pruneToSchema(payload, { $ref: '#/components/schemas/Headers' }, components)).toEqual(payload);
|
|
67
|
-
expect(findUnprunablePaths({ $ref: '#/components/schemas/Headers' }, components)).toEqual([
|
|
68
|
-
' (patternProperties)',
|
|
69
|
-
]);
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
it('prefixItems is not pruned — tuple positions have their own schemas', () => {
|
|
73
|
-
const components = toOpenApiComponents({
|
|
74
|
-
Pair: { type: 'array', prefixItems: [{ type: 'string' }, { type: 'object' }] },
|
|
75
|
-
});
|
|
76
|
-
expect(findUnprunablePaths({ $ref: '#/components/schemas/Pair' }, components)).toEqual([' (prefixItems)']);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
it('a non-composable sibling further down a reference chain is not pruned', () => {
|
|
80
|
-
// The sibling sits on the alias, not on the node being pruned, so it is only visible once
|
|
81
|
-
// the chain is followed. Reporting it as an unresolved reference would send someone
|
|
82
|
-
// looking for a missing component that exists.
|
|
83
|
-
const components = toOpenApiComponents({
|
|
84
|
-
Alias: { $ref: '#/components/schemas/Closed', additionalProperties: true },
|
|
85
|
-
Closed: { type: 'object', properties: { a: { type: 'string' } }, additionalProperties: false },
|
|
86
|
-
});
|
|
87
|
-
const ref = { $ref: '#/components/schemas/Alias' };
|
|
88
|
-
expect(pruneToSchema(SENSITIVE, ref, components)).toEqual(SENSITIVE);
|
|
89
|
-
expect(findUnprunablePaths(ref, components)).toEqual([
|
|
90
|
-
' ($ref with unsupported sibling: additionalProperties)',
|
|
91
|
-
]);
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
it('a reference chain that cycles is not pruned', () => {
|
|
95
|
-
// Mutual aliases never reach a schema describing an object, so there is nothing to narrow
|
|
96
|
-
// against. Following them would loop forever.
|
|
97
|
-
const components = toOpenApiComponents({
|
|
98
|
-
Ping: { $ref: '#/components/schemas/Pong' },
|
|
99
|
-
Pong: { $ref: '#/components/schemas/Ping' },
|
|
100
|
-
});
|
|
101
|
-
const ref = { $ref: '#/components/schemas/Ping' };
|
|
102
|
-
expect(pruneToSchema(SENSITIVE, ref, components)).toEqual(SENSITIVE);
|
|
103
|
-
expect(findUnprunablePaths(ref, components)).toEqual([' (circular $ref)']);
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
it('a $ref with a non-composable sibling is not pruned', () => {
|
|
107
|
-
// Siblings apply conjunctively, so a sibling `additionalProperties: true` does NOT reopen
|
|
108
|
-
// a closed target. Composing that correctly is not something to guess at.
|
|
109
|
-
const components = toOpenApiComponents({
|
|
110
|
-
Wrapper: {
|
|
111
|
-
type: 'object',
|
|
112
|
-
properties: { inner: { $ref: '#/$defs/Closed', additionalProperties: true } },
|
|
113
|
-
$defs: {
|
|
114
|
-
Closed: {
|
|
115
|
-
type: 'object',
|
|
116
|
-
properties: { a: { type: 'string' } },
|
|
117
|
-
additionalProperties: false,
|
|
118
|
-
},
|
|
119
|
-
},
|
|
120
|
-
},
|
|
121
|
-
});
|
|
122
|
-
const payload = { inner: { a: 'x', stripe_secret: 'sk_live_leak' } };
|
|
123
|
-
expect(pruneToSchema(payload, { $ref: '#/components/schemas/Wrapper' }, components)).toEqual(payload);
|
|
124
|
-
expect(findUnprunablePaths({ $ref: '#/components/schemas/Wrapper' }, components)).toEqual([
|
|
125
|
-
'/inner ($ref with unsupported sibling: additionalProperties)',
|
|
126
|
-
]);
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
describe('findUnprunablePaths reports where a component is not closed', () => {
|
|
131
|
-
it('returns nothing for the fully prunable Account component', () => {
|
|
132
|
-
expect(findUnprunableApiPaths('Account')).toEqual([]);
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
it('returns nothing for the discriminated Stripe union', () => {
|
|
136
|
-
// A discriminated union IS prunable — the discriminator selects the branch.
|
|
137
|
-
expect(findUnprunableApiPaths('StripeBillingStatusResponse')).toEqual([]);
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
it('reports the path of a nested ambiguous schema', () => {
|
|
141
|
-
const components = toOpenApiComponents({
|
|
142
|
-
Outer: {
|
|
143
|
-
type: 'object',
|
|
144
|
-
properties: {
|
|
145
|
-
payload: { allOf: [{ type: 'object', properties: { a: { type: 'string' } } }] },
|
|
146
|
-
rows: {
|
|
147
|
-
type: 'array',
|
|
148
|
-
items: { anyOf: [{ type: 'object' }, { type: 'object', properties: {} }] },
|
|
149
|
-
},
|
|
150
|
-
},
|
|
151
|
-
},
|
|
152
|
-
});
|
|
153
|
-
expect(findUnprunablePaths({ $ref: '#/components/schemas/Outer' }, components).sort()).toEqual([
|
|
154
|
-
'/payload (allOf)',
|
|
155
|
-
'/rows[] (union without discriminator)',
|
|
156
|
-
]);
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
it('reports an ambiguous schema reached through a map value', () => {
|
|
160
|
-
// additionalProperties is the path every value in a Record<string, T> takes, so its
|
|
161
|
-
// limitations are the map's limitations.
|
|
162
|
-
const components = toOpenApiComponents({
|
|
163
|
-
Registry: {
|
|
164
|
-
type: 'object',
|
|
165
|
-
additionalProperties: { allOf: [{ type: 'object', properties: { a: { type: 'string' } } }] },
|
|
166
|
-
},
|
|
167
|
-
});
|
|
168
|
-
expect(findUnprunablePaths({ $ref: '#/components/schemas/Registry' }, components)).toEqual(['{} (allOf)']);
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
it('does not flag a scalar union expressed through references', () => {
|
|
172
|
-
// Every branch resolves to an enum, so there are no properties to narrow and the missing
|
|
173
|
-
// discriminator is irrelevant.
|
|
174
|
-
const components = toOpenApiComponents({
|
|
175
|
-
Choice: {
|
|
176
|
-
anyOf: [{ $ref: '#/$defs/Colour' }, { type: 'null' }],
|
|
177
|
-
$defs: { Colour: { type: 'string', enum: ['red', 'green'] } },
|
|
178
|
-
},
|
|
179
|
-
});
|
|
180
|
-
expect(findUnprunablePaths({ $ref: '#/components/schemas/Choice' }, components)).toEqual([]);
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
it('terminates on a recursive component', () => {
|
|
184
|
-
const components = toOpenApiComponents({
|
|
185
|
-
Node: { type: 'object', properties: { children: { type: 'array', items: { $ref: '#' } } } },
|
|
186
|
-
});
|
|
187
|
-
expect(findUnprunablePaths({ $ref: '#/components/schemas/Node' }, components)).toEqual([]);
|
|
188
|
-
});
|
|
189
|
-
});
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
import { Ajv2020 } from 'ajv/dist/2020.js';
|
|
2
|
-
import { describe, expect, it } from 'vitest';
|
|
3
|
-
import type {
|
|
4
|
-
QuotaEffectiveTier,
|
|
5
|
-
QuotaStandingAdmissionClass,
|
|
6
|
-
QuotaStandingResource,
|
|
7
|
-
QuotaStandingResponse,
|
|
8
|
-
QuotaStandingWindow,
|
|
9
|
-
QuotaTierResponse,
|
|
10
|
-
} from '../rate-limiter.js';
|
|
11
|
-
import type { JsonObject } from './adapter.js';
|
|
12
|
-
import { ApiSchemaComponents, apiComponentRef, validateApiResponse } from './registry.js';
|
|
13
|
-
|
|
14
|
-
/** Exact type identity — `extends` in both directions is too weak (any/unknown slip through). */
|
|
15
|
-
type Equals<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2 ? true : false;
|
|
16
|
-
function assertType<T extends true>(_ok: T): void {}
|
|
17
|
-
|
|
18
|
-
function compile(name: string, components: Readonly<Record<string, JsonObject>> = ApiSchemaComponents) {
|
|
19
|
-
const ajv = new Ajv2020({ strictSchema: false, allErrors: true });
|
|
20
|
-
ajv.addSchema({ $id: 'vertesia://openapi', components: { schemas: components } });
|
|
21
|
-
return ajv.compile({ $ref: `vertesia://openapi${apiComponentRef(name as never)}` });
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const VALID_WINDOW = { limit: 600, used: 12, remaining: 588, window_ms: 60_000 };
|
|
25
|
-
|
|
26
|
-
const VALID_STANDING = {
|
|
27
|
-
tenant_id: '1589ba_149d0b',
|
|
28
|
-
available: true,
|
|
29
|
-
base_tier: 'default',
|
|
30
|
-
effective_tier: 'enterprise',
|
|
31
|
-
api: [{ resource: 'objects', name: 'Content objects', burst: VALID_WINDOW, quota: VALID_WINDOW }],
|
|
32
|
-
admission: {
|
|
33
|
-
classes: [{ class: 'ExecuteConversationWorkflow', tenant_active: 3 }],
|
|
34
|
-
note: 'Budget is global and discovered.',
|
|
35
|
-
},
|
|
36
|
-
llm: { note: 'Shared per environment/model.' },
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
describe('gate 1 — the schema is the single source of truth for the public quota types', () => {
|
|
40
|
-
it('publishes the exact schema-derived type, not a hand-written twin', () => {
|
|
41
|
-
// The whole closure, not only the two types the endpoints return. A hand-written
|
|
42
|
-
// QuotaStandingWindow beside an inferred QuotaStandingResponse would leave the drift path
|
|
43
|
-
// open one level down, where it is harder to see.
|
|
44
|
-
expect(true).toBe(true);
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
it('resolves nested component references to concrete property types', () => {
|
|
48
|
-
// Schema-first only pays off if a $ref survives inference as the referenced type rather
|
|
49
|
-
// than degrading to `unknown` — that is what makes the SDK usable.
|
|
50
|
-
assertType<Equals<QuotaStandingResponse['api'], QuotaStandingResource[]>>(true);
|
|
51
|
-
assertType<Equals<QuotaStandingResource['burst'], QuotaStandingWindow>>(true);
|
|
52
|
-
assertType<Equals<QuotaStandingResponse['admission']['classes'], QuotaStandingAdmissionClass[]>>(true);
|
|
53
|
-
assertType<Equals<QuotaStandingResponse['effective_tier'], QuotaEffectiveTier>>(true);
|
|
54
|
-
assertType<Equals<QuotaTierResponse['tier'], QuotaEffectiveTier>>(true);
|
|
55
|
-
expect(true).toBe(true);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it('keeps every quota field required, as the published document declares', () => {
|
|
59
|
-
// `?:` on an inferred field is invisible at the call site until a consumer hits undefined.
|
|
60
|
-
// Identity above would catch a change here, but only by failing somewhere less obvious.
|
|
61
|
-
assertType<Equals<QuotaStandingResponse['available'], boolean>>(true);
|
|
62
|
-
assertType<Equals<QuotaStandingWindow['remaining'], number>>(true);
|
|
63
|
-
assertType<Equals<QuotaStandingResponse['llm'], { note: string }>>(true);
|
|
64
|
-
expect(true).toBe(true);
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
describe('gate 2 — the published components match the closure the types come from', () => {
|
|
69
|
-
it('hoists every id-bearing quota schema into its own component', () => {
|
|
70
|
-
// Six components for two endpoints: the registry must be self-contained, so a canonical
|
|
71
|
-
// component may not reference a TypeScript-derived one.
|
|
72
|
-
const quota = Object.keys(ApiSchemaComponents)
|
|
73
|
-
.filter((name) => name.startsWith('Quota'))
|
|
74
|
-
.sort();
|
|
75
|
-
expect(quota).toEqual([
|
|
76
|
-
'QuotaEffectiveTier',
|
|
77
|
-
'QuotaStandingAdmissionClass',
|
|
78
|
-
'QuotaStandingResource',
|
|
79
|
-
'QuotaStandingResponse',
|
|
80
|
-
'QuotaStandingWindow',
|
|
81
|
-
// QuotaTier is the account tier enum, converted with the account slice.
|
|
82
|
-
'QuotaTier',
|
|
83
|
-
'QuotaTierResponse',
|
|
84
|
-
]);
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
it('shares one QuotaStandingWindow component across both referencing properties', () => {
|
|
88
|
-
// The literal pointer, not apiComponentRef: that helper only accepts registry entry names,
|
|
89
|
-
// and QuotaStandingWindow is a hoisted sub-component rather than a slot's contract.
|
|
90
|
-
const props = ApiSchemaComponents.QuotaStandingResource.properties as Record<string, JsonObject>;
|
|
91
|
-
expect(props.burst).toEqual({ $ref: '#/components/schemas/QuotaStandingWindow' });
|
|
92
|
-
expect(props.quota).toEqual({ $ref: '#/components/schemas/QuotaStandingWindow' });
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
it('keeps admission and llm anonymous, as the document publishes them', () => {
|
|
96
|
-
// Naming them would add a $ref the spec does not carry, changing the generated clients.
|
|
97
|
-
const props = ApiSchemaComponents.QuotaStandingResponse.properties as Record<string, JsonObject>;
|
|
98
|
-
expect(props.admission.$ref).toBeUndefined();
|
|
99
|
-
expect(props.admission.type).toBe('object');
|
|
100
|
-
expect(props.llm.$ref).toBeUndefined();
|
|
101
|
-
expect(Object.keys(ApiSchemaComponents)).not.toContain('QuotaStandingAdmission');
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
describe('gate 3 — AJV validates the same canonical objects that are published', () => {
|
|
106
|
-
it('accepts a full standing payload', () => {
|
|
107
|
-
expect(compile('QuotaStandingResponse')(VALID_STANDING)).toBe(true);
|
|
108
|
-
expect(compile('QuotaTierResponse')({ tier: 'enterprise' })).toBe(true);
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
it('rejects a missing required field', () => {
|
|
112
|
-
const { available: _dropped, ...incomplete } = VALID_STANDING;
|
|
113
|
-
expect(compile('QuotaStandingResponse')(incomplete)).toBe(false);
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
it('rejects a numeric window value sent as a string', () => {
|
|
117
|
-
// No coerceTypes: one AJV configuration serves bodies and responses, so a JSON number that
|
|
118
|
-
// arrives as text is a contract violation rather than something quietly repaired.
|
|
119
|
-
const bad = { ...VALID_WINDOW, used: '12' };
|
|
120
|
-
expect(compile('QuotaStandingWindow')(bad)).toBe(false);
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
it('closes the anonymous nested objects the strict policy reaches', () => {
|
|
124
|
-
const withExtra = { ...VALID_STANDING, llm: { note: 'x', rogue: 1 } };
|
|
125
|
-
expect(compile('QuotaStandingResponse')(withExtra)).toBe(false);
|
|
126
|
-
});
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
describe('gate 4 — the response path checks the same component the SDK types come from', () => {
|
|
130
|
-
it('accepts a conforming response and hands back the component type', () => {
|
|
131
|
-
const result = validateApiResponse('QuotaTierResponse', { tier: 'standard' });
|
|
132
|
-
expect(result.valid).toBe(true);
|
|
133
|
-
if (result.valid) {
|
|
134
|
-
assertType<Equals<typeof result.data, QuotaTierResponse>>(true);
|
|
135
|
-
expect(result.data.tier).toBe('standard');
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
it('reports a violation without mutating the payload', () => {
|
|
140
|
-
// Detection, not repair. Outside local development a response mismatch is logged drift, so
|
|
141
|
-
// this must never silently edit what a caller receives.
|
|
142
|
-
const response: Record<string, unknown> = { tier: 42, legacy_extra: 'still here' };
|
|
143
|
-
const pristine = structuredClone(response);
|
|
144
|
-
expect(validateApiResponse('QuotaTierResponse', response).valid).toBe(false);
|
|
145
|
-
expect(response).toEqual(pristine);
|
|
146
|
-
});
|
|
147
|
-
});
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { describe, expect, expectTypeOf, it } from 'vitest';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import type { NamedInteractionExecutionPayloadSchema } from './interaction.js';
|
|
4
|
-
import { type ApiComponentName, type ApiComponentType, ApiSchemaComponents, mergeComponentGroups } from './registry.js';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* `N` when `ApiComponentType` resolves it, and `never` when it does not.
|
|
8
|
-
*
|
|
9
|
-
* The conditional that maps a name to its inferred type tests the groups one by one and ends in
|
|
10
|
-
* `never`, so a group missing from that chain — the third place a new group has to be listed, after
|
|
11
|
-
* the merge array and the `ApiComponentName` union — makes every name in it resolve to `never`
|
|
12
|
-
* rather than fail. Distributing this over the whole union turns that into an assignment error on
|
|
13
|
-
* the list below, which `typecheck:test` reports.
|
|
14
|
-
*/
|
|
15
|
-
type ResolvedName<N extends ApiComponentName> = [ApiComponentType<N>] extends [never] ? never : N;
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Covers the one way the group split can corrupt the registry.
|
|
19
|
-
*
|
|
20
|
-
* The registry is declared in several objects because the compiler cannot serialize it as one, and
|
|
21
|
-
* the two public types are assembled from those objects: `ApiComponentName` is a union of `keyof`,
|
|
22
|
-
* `ApiComponentType` a conditional testing the groups IN ORDER. A plain spread merge would accept a
|
|
23
|
-
* name listed twice and keep the LAST group's schema, while `ApiComponentType` would resolve to the
|
|
24
|
-
* FIRST group's — validation enforcing one shape while every handler is typed against another, with
|
|
25
|
-
* nothing downstream to report it. The grouping is a compiler accommodation, so this failure mode is
|
|
26
|
-
* pure accident: a component moved between groups and left behind, or added to whichever group the
|
|
27
|
-
* author had open.
|
|
28
|
-
*
|
|
29
|
-
* The real groups are covered by the call itself, which runs at module load — a duplicate there
|
|
30
|
-
* throws on import and takes every test in the package with it. What is tested here is that the
|
|
31
|
-
* merge actually refuses, which no import of a correct registry can show.
|
|
32
|
-
*/
|
|
33
|
-
describe('mergeComponentGroups', () => {
|
|
34
|
-
it('preserves execution payload types and rejects unregistered component names', () => {
|
|
35
|
-
expectTypeOf<ApiComponentType<'NamedInteractionExecutionPayload'>>().toEqualTypeOf<
|
|
36
|
-
z.infer<typeof NamedInteractionExecutionPayloadSchema>
|
|
37
|
-
>();
|
|
38
|
-
expectTypeOf<'UnregisteredExecutionComponent'>().not.toMatchTypeOf<ApiComponentName>();
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
const A = z.strictObject({ a: z.string() });
|
|
42
|
-
const B = z.strictObject({ b: z.number() });
|
|
43
|
-
|
|
44
|
-
it('merges disjoint groups into one object', () => {
|
|
45
|
-
const merged = mergeComponentGroups([{ Alpha: A }, { Beta: B }]);
|
|
46
|
-
|
|
47
|
-
expect(Object.keys(merged).sort()).toEqual(['Alpha', 'Beta']);
|
|
48
|
-
expect(merged.Alpha).toBe(A);
|
|
49
|
-
expect(merged.Beta).toBe(B);
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it('refuses a name registered in two groups', () => {
|
|
53
|
-
expect(() => mergeComponentGroups([{ Alpha: A }, { Alpha: B }])).toThrow(
|
|
54
|
-
/registered in more than one group: Alpha/,
|
|
55
|
-
);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it('names every colliding component, not just the first', () => {
|
|
59
|
-
expect(() => mergeComponentGroups([{ Beta: B, Alpha: A }, { Alpha: B }, { Beta: A }])).toThrow(
|
|
60
|
-
/components registered in more than one group: Alpha, Beta/,
|
|
61
|
-
);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
it('reports a collision across non-adjacent groups', () => {
|
|
65
|
-
// The failure is a name in ANY two groups, not only in two that happen to be listed together.
|
|
66
|
-
expect(() => mergeComponentGroups([{ Alpha: A }, { Beta: B }, { Alpha: B }])).toThrow(
|
|
67
|
-
/registered in more than one group: Alpha/,
|
|
68
|
-
);
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
it('emits a component from every group, and resolves its type', () => {
|
|
72
|
-
// The merge takes a list, so a group can be dropped from it as easily as duplicated in it —
|
|
73
|
-
// and dropping one is silent in a different way: `ApiComponentName` still names those
|
|
74
|
-
// components, so the code compiles and only the emitted document loses them. One known name
|
|
75
|
-
// per group is what notices — the `satisfies` for the type conditional, the loop for the
|
|
76
|
-
// merge.
|
|
77
|
-
const perGroup = [
|
|
78
|
-
'Account',
|
|
79
|
-
'ProjectModelDefaults',
|
|
80
|
-
'OAuthProvider',
|
|
81
|
-
'ExecutionEnvironment',
|
|
82
|
-
'JSONValue',
|
|
83
|
-
'Interaction',
|
|
84
|
-
'ImprovePromptPayload',
|
|
85
|
-
'AgentRunnerOptions',
|
|
86
|
-
'ExecutionRunStatus',
|
|
87
|
-
'RenderPromptResponse',
|
|
88
|
-
'AggregatedTool',
|
|
89
|
-
'OAuthAuthStatus',
|
|
90
|
-
'AuditTrailResponse',
|
|
91
|
-
'ViewExperience',
|
|
92
|
-
'CopyFilePayload',
|
|
93
|
-
] as const satisfies readonly ResolvedName<ApiComponentName>[];
|
|
94
|
-
|
|
95
|
-
for (const name of perGroup) {
|
|
96
|
-
expect(ApiSchemaComponents).toHaveProperty(name);
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
});
|