@vertesia/common 1.6.0-dev.20260923.085325Z → 1.6.0-dev.20261008.064737Z
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 +2553 -1046
- package/lib/api-contract/engine.d.ts +65 -0
- package/lib/api-contract/engine.d.ts.map +1 -0
- package/lib/api-contract/engine.js +569 -0
- package/lib/api-contract/engine.js.map +1 -0
- package/lib/api-contract/index.d.ts +21 -182
- package/lib/api-contract/index.d.ts.map +1 -1
- package/lib/api-contract/index.js +13 -551
- package/lib/api-contract/index.js.map +1 -1
- 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 -9
- package/lib/api-schemas/account.d.ts.map +1 -1
- package/lib/api-schemas/account.js +0 -7
- 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 +275 -0
- package/lib/api-schemas/audit-trail.d.ts.map +1 -1
- package/lib/api-schemas/audit-trail.js +156 -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 +19 -0
- package/lib/api-schemas/cost-analytics.d.ts.map +1 -1
- package/lib/api-schemas/cost-analytics.js +38 -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 +2 -0
- package/lib/api-schemas/index.d.ts.map +1 -1
- package/lib/api-schemas/index.js +2 -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 +28171 -36096
- package/lib/api-schemas/registry.d.ts.map +1 -1
- package/lib/api-schemas/registry.js +77 -30
- package/lib/api-schemas/registry.js.map +1 -1
- package/lib/api-schemas/run-budget.d.ts +16 -0
- package/lib/api-schemas/run-budget.d.ts.map +1 -0
- package/lib/api-schemas/run-budget.js +22 -0
- package/lib/api-schemas/run-budget.js.map +1 -0
- package/lib/api-schemas/secrets.d.ts +0 -71
- package/lib/api-schemas/secrets.d.ts.map +1 -1
- package/lib/api-schemas/secrets.js +0 -73
- package/lib/api-schemas/secrets.js.map +1 -1
- 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 +30 -19
- package/lib/audit-trail.d.ts.map +1 -1
- package/lib/audit-trail.js +6 -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 -71
- 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 +4 -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 +10 -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 +16 -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 +11227 -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 +16 -11
- 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 +2553 -1046
- package/src/api-contract/engine.ts +641 -0
- package/src/api-contract/index.ts +30 -661
- package/src/api-schemas/access-control.ts +18 -16
- package/src/api-schemas/account.ts +5 -12
- 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 +175 -1
- package/src/api-schemas/content.ts +55 -0
- package/src/api-schemas/cost-analytics.ts +42 -2
- package/src/api-schemas/environment.ts +0 -1
- package/src/api-schemas/group.ts +2 -1
- package/src/api-schemas/index.ts +2 -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 +164 -62
- package/src/api-schemas/run-budget.ts +23 -0
- package/src/api-schemas/secrets.ts +0 -84
- 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 +37 -35
- 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 +23 -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 -122
- 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 +4 -0
- package/src/runs.ts +9 -19
- package/src/secrets.ts +10 -42
- 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 +16 -40
- package/src/views.ts +61 -125
- package/src/wire-types.generated.ts +11888 -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,112 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import type { z } from 'zod';
|
|
3
|
-
import type {
|
|
4
|
-
AgentTokenRequest,
|
|
5
|
-
ApiKeyTokenRequest,
|
|
6
|
-
EnvironmentTokenRequest,
|
|
7
|
-
IssueTokenForbiddenResponse,
|
|
8
|
-
IssueTokenRequest,
|
|
9
|
-
IssueTokenResponse,
|
|
10
|
-
ProjectTokenRequest,
|
|
11
|
-
ServiceAccountTokenRequest,
|
|
12
|
-
SigningAlgorithm,
|
|
13
|
-
UserTokenRequest,
|
|
14
|
-
} from '../sts-token-types.js';
|
|
15
|
-
import { validateApiRequest, validateApiResponse } from './registry.js';
|
|
16
|
-
import type {
|
|
17
|
-
AgentTokenRequestSchema,
|
|
18
|
-
ApiKeyTokenRequestSchema,
|
|
19
|
-
EnvironmentTokenRequestSchema,
|
|
20
|
-
IssueTokenForbiddenResponseSchema,
|
|
21
|
-
IssueTokenRequestSchema,
|
|
22
|
-
IssueTokenResponseSchema,
|
|
23
|
-
ProjectTokenRequestSchema,
|
|
24
|
-
ServiceAccountTokenRequestSchema,
|
|
25
|
-
SigningAlgorithmSchema,
|
|
26
|
-
UserTokenRequestSchema,
|
|
27
|
-
} from './sts.js';
|
|
28
|
-
|
|
29
|
-
type Equals<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2 ? true : false;
|
|
30
|
-
function assertType<T extends true>(_value: T): void {}
|
|
31
|
-
|
|
32
|
-
describe('STS canonical contracts', () => {
|
|
33
|
-
it('derives every public component type from its schema', () => {
|
|
34
|
-
assertType<Equals<SigningAlgorithm, z.infer<typeof SigningAlgorithmSchema>>>(true);
|
|
35
|
-
assertType<Equals<ApiKeyTokenRequest, z.infer<typeof ApiKeyTokenRequestSchema>>>(true);
|
|
36
|
-
assertType<Equals<UserTokenRequest, z.infer<typeof UserTokenRequestSchema>>>(true);
|
|
37
|
-
assertType<Equals<ProjectTokenRequest, z.infer<typeof ProjectTokenRequestSchema>>>(true);
|
|
38
|
-
assertType<Equals<EnvironmentTokenRequest, z.infer<typeof EnvironmentTokenRequestSchema>>>(true);
|
|
39
|
-
assertType<Equals<AgentTokenRequest, z.infer<typeof AgentTokenRequestSchema>>>(true);
|
|
40
|
-
assertType<Equals<ServiceAccountTokenRequest, z.infer<typeof ServiceAccountTokenRequestSchema>>>(true);
|
|
41
|
-
assertType<Equals<IssueTokenRequest, z.infer<typeof IssueTokenRequestSchema>>>(true);
|
|
42
|
-
assertType<Equals<IssueTokenResponse, z.infer<typeof IssueTokenResponseSchema>>>(true);
|
|
43
|
-
assertType<Equals<IssueTokenForbiddenResponse, z.infer<typeof IssueTokenForbiddenResponseSchema>>>(true);
|
|
44
|
-
expect(true).toBe(true);
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
it('enforces the discriminated request branch and closed object policy', () => {
|
|
48
|
-
expect(
|
|
49
|
-
validateApiRequest('IssueTokenRequest', {
|
|
50
|
-
type: 'project',
|
|
51
|
-
account_id: 'acc_1',
|
|
52
|
-
project_id: 'proj_1',
|
|
53
|
-
}).valid,
|
|
54
|
-
).toBe(true);
|
|
55
|
-
expect(
|
|
56
|
-
validateApiRequest('IssueTokenRequest', {
|
|
57
|
-
type: 'project',
|
|
58
|
-
account_id: 'acc_1',
|
|
59
|
-
project_id: 'proj_1',
|
|
60
|
-
key: 'not-valid-on-this-branch',
|
|
61
|
-
}).valid,
|
|
62
|
-
).toBe(false);
|
|
63
|
-
expect(validateApiRequest('IssueTokenRequest', { type: 'project', account_id: 'acc_1' }).valid).toBe(false);
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it('checks every documented response shape and forbidden error-code literal', () => {
|
|
67
|
-
expect(validateApiResponse('IssueTokenResponse', { token: 'signed', token_type: 'Bearer' }).valid).toBe(true);
|
|
68
|
-
expect(validateApiResponse('IssueTokenResponse', { token: 'signed', token_type: 'bearer' }).valid).toBe(false);
|
|
69
|
-
for (const errorCode of [
|
|
70
|
-
'requested_scope_unavailable',
|
|
71
|
-
'no_accessible_account',
|
|
72
|
-
'restricted_environment',
|
|
73
|
-
'token_issuance_forbidden',
|
|
74
|
-
]) {
|
|
75
|
-
expect(
|
|
76
|
-
validateApiResponse('IssueTokenForbiddenResponse', {
|
|
77
|
-
error: 'Forbidden',
|
|
78
|
-
message: 'The requested scope is unavailable',
|
|
79
|
-
errorCode,
|
|
80
|
-
}).valid,
|
|
81
|
-
).toBe(true);
|
|
82
|
-
}
|
|
83
|
-
expect(
|
|
84
|
-
validateApiResponse('IssueTokenForbiddenResponse', {
|
|
85
|
-
error: 'Forbidden',
|
|
86
|
-
message: 'No',
|
|
87
|
-
errorCode: 'resource_not_found',
|
|
88
|
-
}).valid,
|
|
89
|
-
).toBe(false);
|
|
90
|
-
expect(
|
|
91
|
-
validateApiResponse('IssueTokenForbiddenResponse', {
|
|
92
|
-
error: 'Forbidden',
|
|
93
|
-
message: 'No',
|
|
94
|
-
errorCode: 'requested_scope_unavailable',
|
|
95
|
-
project_id: 'secret',
|
|
96
|
-
}).valid,
|
|
97
|
-
).toBe(false);
|
|
98
|
-
expect(
|
|
99
|
-
validateApiResponse('IssueTokenUnavailableResponse', {
|
|
100
|
-
error: 'Service Unavailable',
|
|
101
|
-
message: 'Token signing temporarily unavailable',
|
|
102
|
-
}).valid,
|
|
103
|
-
).toBe(true);
|
|
104
|
-
expect(
|
|
105
|
-
validateApiResponse('IssueTokenUnavailableResponse', {
|
|
106
|
-
error: 'Service Unavailable',
|
|
107
|
-
message: 'Token signing temporarily unavailable',
|
|
108
|
-
retry_after: 5,
|
|
109
|
-
}).valid,
|
|
110
|
-
).toBe(false);
|
|
111
|
-
});
|
|
112
|
-
});
|
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
import { Ajv2020 } from 'ajv/dist/2020.js';
|
|
2
|
-
import { describe, expect, it } from 'vitest';
|
|
3
|
-
import type { AbacPrincipalContext, PrincipalIdentity } from '../principal-context.js';
|
|
4
|
-
import type { UpdateUserPayload, User } from '../user.js';
|
|
5
|
-
import type { JsonObject } from './adapter.js';
|
|
6
|
-
import { ApiSchemaComponents, apiComponentRef, validateApiRequest, validateApiResponse } from './registry.js';
|
|
7
|
-
import type { AbacPrincipalContextFromSchema, UserArrayFromSchema } from './user.js';
|
|
8
|
-
|
|
9
|
-
/** Exact type identity — `extends` in both directions is too weak (any/unknown slip through). */
|
|
10
|
-
type Equals<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2 ? true : false;
|
|
11
|
-
function assertType<T extends true>(_ok: T): void {}
|
|
12
|
-
|
|
13
|
-
function compile(name: string, components: Readonly<Record<string, JsonObject>> = ApiSchemaComponents) {
|
|
14
|
-
const ajv = new Ajv2020({ strictSchema: false, allErrors: true });
|
|
15
|
-
ajv.addSchema({ $id: 'vertesia://openapi', components: { schemas: components } });
|
|
16
|
-
return ajv.compile({ $ref: `vertesia://openapi${apiComponentRef(name as never)}` });
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const VALID_USER = {
|
|
20
|
-
id: 'u1',
|
|
21
|
-
email: 'someone@acme.com',
|
|
22
|
-
name: 'Someone',
|
|
23
|
-
created_at: '2026-07-30T10:00:00.000Z',
|
|
24
|
-
updated_at: '2026-07-30T10:00:00.000Z',
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
describe('gate 1 — the schema is the single source of truth for the public IAM types', () => {
|
|
28
|
-
it('publishes the exact schema-derived type, not a hand-written twin', () => {
|
|
29
|
-
assertType<Equals<UserArrayFromSchema, User[]>>(true);
|
|
30
|
-
assertType<Equals<AbacPrincipalContext, AbacPrincipalContextFromSchema>>(true);
|
|
31
|
-
expect(true).toBe(true);
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it('derives the identity fields from the ABAC context rather than restating them', () => {
|
|
35
|
-
// PrincipalIdentity `extends AbacPrincipalContext`, so composing the schemas is what keeps
|
|
36
|
-
// the inherited fields from becoming a twin one level down — the failure mode this batch was
|
|
37
|
-
// scoped to avoid. `kind` and `id` are part of the ABAC context itself (resolvable as
|
|
38
|
-
// `$principal.*`), not identity-only metadata.
|
|
39
|
-
assertType<Equals<PrincipalIdentity['kind'], AbacPrincipalContext['kind']>>(true);
|
|
40
|
-
assertType<Equals<PrincipalIdentity['id'], AbacPrincipalContext['id']>>(true);
|
|
41
|
-
assertType<Equals<PrincipalIdentity['clearance'], AbacPrincipalContext['clearance']>>(true);
|
|
42
|
-
assertType<Equals<PrincipalIdentity['compartments'], AbacPrincipalContext['compartments']>>(true);
|
|
43
|
-
assertType<Equals<PrincipalIdentity['email'], AbacPrincipalContext['email']>>(true);
|
|
44
|
-
assertType<Equals<PrincipalIdentity['tags'], AbacPrincipalContext['tags']>>(true);
|
|
45
|
-
assertType<Equals<PrincipalIdentity['properties'], AbacPrincipalContext['properties']>>(true);
|
|
46
|
-
assertType<Equals<PrincipalIdentity['kind'], 'user' | 'apikey'>>(true);
|
|
47
|
-
assertType<Equals<PrincipalIdentity['id'], string>>(true);
|
|
48
|
-
expect(true).toBe(true);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it('derives the update payload from the user rather than restating nine fields', () => {
|
|
52
|
-
// A `.pick()` of UserSchema plus `.partial()`: the field types and constraints come from the
|
|
53
|
-
// response declaration, and the ONLY thing the payload changes about them is requiredness.
|
|
54
|
-
assertType<Equals<UpdateUserPayload['name'], string | undefined>>(true);
|
|
55
|
-
assertType<Equals<UpdateUserPayload['clearance'], User['clearance']>>(true);
|
|
56
|
-
assertType<Equals<UpdateUserPayload['compartments'], User['compartments']>>(true);
|
|
57
|
-
assertType<Equals<UpdateUserPayload['properties'], User['properties']>>(true);
|
|
58
|
-
// What is NOT picked is the whitelist. `email`, `source`, `annotations` and the timestamps
|
|
59
|
-
// are server- or IdP-owned, and adding one now means naming it in the pick.
|
|
60
|
-
assertType<
|
|
61
|
-
Equals<
|
|
62
|
-
keyof UpdateUserPayload,
|
|
63
|
-
| 'name'
|
|
64
|
-
| 'username'
|
|
65
|
-
| 'picture'
|
|
66
|
-
| 'language'
|
|
67
|
-
| 'phone'
|
|
68
|
-
| 'last_selected_account'
|
|
69
|
-
| 'properties'
|
|
70
|
-
| 'clearance'
|
|
71
|
-
| 'compartments'
|
|
72
|
-
>
|
|
73
|
-
>(true);
|
|
74
|
-
expect(true).toBe(true);
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
it('keeps the wire type optionality the document declares', () => {
|
|
78
|
-
assertType<Equals<User['email'], string>>(true);
|
|
79
|
-
assertType<Equals<User['created_at'], string>>(true);
|
|
80
|
-
assertType<Equals<User['source'], 'firebase' | 'scim' | undefined>>(true);
|
|
81
|
-
assertType<Equals<User['clearance'], number | undefined>>(true);
|
|
82
|
-
expect(true).toBe(true);
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
describe('gate 2 — the published components match the closure the types come from', () => {
|
|
87
|
-
it('does not hoist AbacPrincipalContext into a component of its own', () => {
|
|
88
|
-
// It is a public TYPE but has never been a published component. Hoisting it would add a
|
|
89
|
-
// $ref to PrincipalIdentity that every generated client would have to follow.
|
|
90
|
-
expect(Object.keys(ApiSchemaComponents)).not.toContain('AbacPrincipalContext');
|
|
91
|
-
const props = ApiSchemaComponents.PrincipalIdentity.properties as Record<string, JsonObject>;
|
|
92
|
-
expect(props.kind).toEqual({ type: 'string', enum: ['user', 'apikey'] });
|
|
93
|
-
expect(props.clearance).toEqual({ type: 'number' });
|
|
94
|
-
expect(props.id).toEqual({ type: 'string' });
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
it('publishes the composed property order — kind and id first', () => {
|
|
98
|
-
// `AbacPrincipalContext` lists its discriminators (kind, id) ahead of the merged BLP
|
|
99
|
-
// attributes; PrincipalIdentity `.extend({})`s it, adding nothing, so the order is the
|
|
100
|
-
// context's own.
|
|
101
|
-
const props = ApiSchemaComponents.PrincipalIdentity.properties as JsonObject;
|
|
102
|
-
expect(Object.keys(props)).toEqual(['kind', 'id', 'clearance', 'compartments', 'email', 'tags', 'properties']);
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
it('declares the timestamps the endpoint has always shipped', () => {
|
|
106
|
-
// The published component was closed and did not declare these, while the handler
|
|
107
|
-
// serialized the whole Mongo document — so every response violated its own schema.
|
|
108
|
-
const props = ApiSchemaComponents.User.properties as Record<string, JsonObject>;
|
|
109
|
-
expect(props.created_at.type).toBe('string');
|
|
110
|
-
expect(props.updated_at.type).toBe('string');
|
|
111
|
-
expect(ApiSchemaComponents.User.required).toContain('created_at');
|
|
112
|
-
expect(ApiSchemaComponents.User.additionalProperties).toBe(false);
|
|
113
|
-
});
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
describe('gate 3 — AJV validates the same canonical objects that are published', () => {
|
|
117
|
-
it('accepts a minimal user and rejects a missing required field', () => {
|
|
118
|
-
const validate = compile('User');
|
|
119
|
-
expect(validate(VALID_USER)).toBe(true);
|
|
120
|
-
const { created_at: _dropped, ...incomplete } = VALID_USER;
|
|
121
|
-
expect(validate(incomplete)).toBe(false);
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
it('rejects a source outside the published enum', () => {
|
|
125
|
-
expect(compile('User')({ ...VALID_USER, source: 'ldap' })).toBe(false);
|
|
126
|
-
expect(compile('User')({ ...VALID_USER, source: 'scim' })).toBe(true);
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
it('rejects an undeclared property on the closed user component', () => {
|
|
130
|
-
// Specifically the internal fields a spread of the Mongo document would have leaked.
|
|
131
|
-
expect(compile('User')({ ...VALID_USER, _id: 'deadbeef' })).toBe(false);
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
it('accepts an empty update payload but rejects an undeclared field', () => {
|
|
135
|
-
const validate = compile('UpdateUserPayload');
|
|
136
|
-
expect(validate({})).toBe(true);
|
|
137
|
-
expect(validate({ name: 'New name' })).toBe(true);
|
|
138
|
-
// `email` is deliberately not updatable through this endpoint and never has been.
|
|
139
|
-
expect(validate({ email: 'new@acme.com' })).toBe(false);
|
|
140
|
-
});
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
describe('gate 4 — runtime enforcement uses the published components', () => {
|
|
144
|
-
it('rejects an undeclared update field without removing it', () => {
|
|
145
|
-
// The handler used to whitelist fields and silently ignore the rest; the published schema
|
|
146
|
-
// has always said additionalProperties: false. Enforcement makes the two agree.
|
|
147
|
-
const payload: Record<string, unknown> = { name: 'Acme', rogue_field: 42 };
|
|
148
|
-
const result = validateApiRequest('UpdateUserPayload', payload);
|
|
149
|
-
expect(result.valid).toBe(false);
|
|
150
|
-
expect(payload.rogue_field).toBe(42);
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
it('accepts a conforming update payload and hands back the component type', () => {
|
|
154
|
-
const result = validateApiRequest('UpdateUserPayload', { name: 'Acme', clearance: 3 });
|
|
155
|
-
expect(result.valid).toBe(true);
|
|
156
|
-
if (result.valid) {
|
|
157
|
-
assertType<Equals<typeof result.data, UpdateUserPayload>>(true);
|
|
158
|
-
expect(result.data.clearance).toBe(3);
|
|
159
|
-
}
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
it('checks the user response against the same component the SDK type comes from', () => {
|
|
163
|
-
const result = validateApiResponse('User', VALID_USER);
|
|
164
|
-
expect(result.valid).toBe(true);
|
|
165
|
-
if (result.valid) {
|
|
166
|
-
assertType<Equals<typeof result.data, User>>(true);
|
|
167
|
-
}
|
|
168
|
-
// A document spread straight onto the wire is what this catches.
|
|
169
|
-
expect(validateApiResponse('User', { ...VALID_USER, _id: 'x' }).valid).toBe(false);
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
it('enforces the date-time format the timestamps claim', () => {
|
|
173
|
-
// Through the registry rather than the local `compile` helper: the production validator
|
|
174
|
-
// registers ajv-formats, and a bare Ajv2020 ignores `format` entirely — which is precisely
|
|
175
|
-
// why the description alone was not enough. A plain string schema accepts 'yesterday'.
|
|
176
|
-
expect(validateApiResponse('User', { ...VALID_USER, created_at: 'yesterday' }).valid).toBe(false);
|
|
177
|
-
expect(validateApiResponse('User', { ...VALID_USER, created_at: '2026-07-30' }).valid).toBe(false);
|
|
178
|
-
expect(validateApiResponse('User', VALID_USER).valid).toBe(true);
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
it('checks every member of the account listing against the same User component', () => {
|
|
182
|
-
// The gap this closes: `UserArray` items $ref `User`, so publishing the array without
|
|
183
|
-
// enforcing it would document the contract for each member while checking none of them.
|
|
184
|
-
expect(validateApiResponse('UserArray', [VALID_USER, VALID_USER]).valid).toBe(true);
|
|
185
|
-
expect(validateApiResponse('UserArray', []).valid).toBe(true);
|
|
186
|
-
// A legacy member with no timestamps, which is exactly what the old jsonDocs() could emit.
|
|
187
|
-
const { created_at: _dropped, ...legacyMember } = VALID_USER;
|
|
188
|
-
expect(validateApiResponse('UserArray', [VALID_USER, legacyMember]).valid).toBe(false);
|
|
189
|
-
// And one carrying a null the component cannot publish.
|
|
190
|
-
expect(validateApiResponse('UserArray', [{ ...VALID_USER, phone: null }]).valid).toBe(false);
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
it('validates the shared DeleteByIdResult that seven other endpoints also publish', () => {
|
|
194
|
-
expect(validateApiResponse('DeleteByIdResult', { id: 'abc' }).valid).toBe(true);
|
|
195
|
-
expect(validateApiResponse('DeleteByIdResult', {}).valid).toBe(false);
|
|
196
|
-
});
|
|
197
|
-
});
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import { assertType, describe, expect, it } from 'vitest';
|
|
2
|
-
import type { z } from 'zod';
|
|
3
|
-
import { type ViewExperienceConfiguration, viewExperienceRoute } from '../views.js';
|
|
4
|
-
import { ApiSchemaComponents, validateApiRequest, validateApiResponse } from './registry.js';
|
|
5
|
-
import type { ViewExperienceConfigurationSchema } from './view-execution.js';
|
|
6
|
-
|
|
7
|
-
type Equals<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2 ? true : false;
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Lives here rather than next to the JSON Schema artifact that consumes it. Both subjects are
|
|
11
|
-
* declarations of THIS package — the public TypeScript type and the Zod schema it must mirror — and
|
|
12
|
-
* asserting it from the consuming package would have made that package depend on Zod, which it must
|
|
13
|
-
* not: it is loaded in the browser.
|
|
14
|
-
*/
|
|
15
|
-
describe('ViewExperienceConfiguration', () => {
|
|
16
|
-
it('keeps the temporary named TypeScript bridge identical to the runtime schema', () => {
|
|
17
|
-
assertType<Equals<ViewExperienceConfiguration, z.infer<typeof ViewExperienceConfigurationSchema>>>(true);
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
it('publishes selection, app actions, upload drops, generated presentation mode, and reranking', () => {
|
|
21
|
-
expect(Object.keys(ApiSchemaComponents)).toEqual(
|
|
22
|
-
expect.arrayContaining([
|
|
23
|
-
'AgenticViewRerankConfiguration',
|
|
24
|
-
'ViewActionConfiguration',
|
|
25
|
-
'ViewActionsConfiguration',
|
|
26
|
-
'ViewDropConfiguration',
|
|
27
|
-
'ViewExecutionRerankResult',
|
|
28
|
-
'ViewSelectionConfiguration',
|
|
29
|
-
]),
|
|
30
|
-
);
|
|
31
|
-
|
|
32
|
-
expect(
|
|
33
|
-
validateApiRequest('PreviewViewExperienceRequest', {
|
|
34
|
-
configuration: {
|
|
35
|
-
name: 'Orders',
|
|
36
|
-
search: {
|
|
37
|
-
mode: 'agentic',
|
|
38
|
-
agentic: {
|
|
39
|
-
mode: 'query_and_view',
|
|
40
|
-
rerank: { max_candidates: 24, include_why_match: true, timeout_ms: 30_000 },
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
results: {
|
|
44
|
-
default_display: 'table',
|
|
45
|
-
displays: [{ id: 'table', label: 'Orders', type: 'table', columns: [] }],
|
|
46
|
-
selection: { mode: 'multiple', select_all: 'page' },
|
|
47
|
-
actions: {
|
|
48
|
-
include_defaults: true,
|
|
49
|
-
items: [{ id: 'approve', label: 'Approve', handler: 'approve-orders' }],
|
|
50
|
-
},
|
|
51
|
-
drop: { handler: 'upload', accept: ['files'], params: { type_id: 'sales-order' } },
|
|
52
|
-
},
|
|
53
|
-
},
|
|
54
|
-
}).valid,
|
|
55
|
-
).toBe(true);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it('keeps executable custom drop handlers out of the persisted wire contract', () => {
|
|
59
|
-
expect(
|
|
60
|
-
validateApiRequest('PreviewViewExperienceRequest', {
|
|
61
|
-
configuration: {
|
|
62
|
-
name: 'Orders',
|
|
63
|
-
results: {
|
|
64
|
-
default_display: 'table',
|
|
65
|
-
displays: [{ id: 'table', label: 'Orders', type: 'table', columns: [] }],
|
|
66
|
-
drop: { handler: 'custom-drop' },
|
|
67
|
-
},
|
|
68
|
-
},
|
|
69
|
-
}).valid,
|
|
70
|
-
).toBe(false);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it('accepts untagged View options and preserves the shared options schema reference', () => {
|
|
74
|
-
// View options and shared model options both permit an omitted family ID.
|
|
75
|
-
const authored = { model_options: { temperature: 0.2, max_tokens: 1024 } };
|
|
76
|
-
expect(validateApiResponse('ViewAgenticExecutionConfiguration', authored).valid).toBe(true);
|
|
77
|
-
|
|
78
|
-
// Keep the shared component wired to the canonical options contract.
|
|
79
|
-
const modelOptions = (name: string) =>
|
|
80
|
-
(ApiSchemaComponents[name] as { properties: Record<string, unknown> }).properties.model_options;
|
|
81
|
-
expect(modelOptions('InteractionExecutionConfiguration')).toEqual({
|
|
82
|
-
$ref: '#/components/schemas/ModelOptions',
|
|
83
|
-
});
|
|
84
|
-
expect(modelOptions('ViewAgenticExecutionConfiguration')).toMatchObject({
|
|
85
|
-
type: 'object',
|
|
86
|
-
additionalProperties: true,
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
it('keeps the View config otherwise identical to the shared execution configuration', () => {
|
|
91
|
-
// Only `model_options` may differ. Anything else diverging means the two drifted apart
|
|
92
|
-
// rather than the union being deliberately relaxed for authored options.
|
|
93
|
-
const properties = (name: string) =>
|
|
94
|
-
(ApiSchemaComponents[name] as { properties: Record<string, unknown> }).properties;
|
|
95
|
-
const view = properties('ViewAgenticExecutionConfiguration');
|
|
96
|
-
const shared = properties('InteractionExecutionConfiguration');
|
|
97
|
-
|
|
98
|
-
expect(Object.keys(view)).toEqual(Object.keys(shared));
|
|
99
|
-
for (const key of Object.keys(shared)) {
|
|
100
|
-
if (key === 'model_options') continue;
|
|
101
|
-
expect(JSON.stringify(view[key]), `${key} drifted from the shared configuration`).toBe(
|
|
102
|
-
JSON.stringify(shared[key]),
|
|
103
|
-
);
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
it('builds generic routes for system and app-contributed Views without exposing path material', () => {
|
|
108
|
-
expect(viewExperienceRoute('app:content:document-library')).toBe('/view/app%3Acontent%3Adocument-library');
|
|
109
|
-
expect(viewExperienceRoute('sys:AgenticDocumentExplorer')).toBe('/view/sys%3AAgenticDocumentExplorer');
|
|
110
|
-
expect(viewExperienceRoute('unsafe/id')).toBe('/view/unsafe%2Fid');
|
|
111
|
-
});
|
|
112
|
-
});
|