@vertesia/common 1.5.0-dev.20260722.120446Z → 1.5.0-dev.20260804.124748Z
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 +98 -0
- package/lib/access-control-values.d.ts.map +1 -0
- package/lib/access-control-values.js +101 -0
- package/lib/access-control-values.js.map +1 -0
- package/lib/access-control.d.ts +22 -119
- package/lib/access-control.d.ts.map +1 -1
- package/lib/access-control.js +6 -78
- package/lib/access-control.js.map +1 -1
- package/lib/account-values.d.ts +53 -0
- package/lib/account-values.d.ts.map +1 -0
- package/lib/account-values.js +91 -0
- package/lib/account-values.js.map +1 -0
- package/lib/analytics.d.ts +12 -38
- package/lib/analytics.d.ts.map +1 -1
- package/lib/api-schemas/access-control.d.ts +215 -0
- package/lib/api-schemas/access-control.d.ts.map +1 -0
- package/lib/api-schemas/access-control.js +165 -0
- package/lib/api-schemas/access-control.js.map +1 -0
- package/lib/api-schemas/account.d.ts +101 -0
- package/lib/api-schemas/account.d.ts.map +1 -0
- package/lib/api-schemas/account.js +136 -0
- package/lib/api-schemas/account.js.map +1 -0
- package/lib/api-schemas/adapter.d.ts +80 -0
- package/lib/api-schemas/adapter.d.ts.map +1 -0
- package/lib/api-schemas/adapter.js +726 -0
- package/lib/api-schemas/adapter.js.map +1 -0
- package/lib/api-schemas/agent-runs.d.ts +3781 -0
- package/lib/api-schemas/agent-runs.d.ts.map +1 -0
- package/lib/api-schemas/agent-runs.js +991 -0
- package/lib/api-schemas/agent-runs.js.map +1 -0
- package/lib/api-schemas/analytics.d.ts +86 -0
- package/lib/api-schemas/analytics.d.ts.map +1 -0
- package/lib/api-schemas/analytics.js +58 -0
- package/lib/api-schemas/analytics.js.map +1 -0
- package/lib/api-schemas/apikey.d.ts +231 -0
- package/lib/api-schemas/apikey.d.ts.map +1 -0
- package/lib/api-schemas/apikey.js +172 -0
- package/lib/api-schemas/apikey.js.map +1 -0
- package/lib/api-schemas/app-lifecycle.d.ts +1114 -0
- package/lib/api-schemas/app-lifecycle.d.ts.map +1 -0
- package/lib/api-schemas/app-lifecycle.js +750 -0
- package/lib/api-schemas/app-lifecycle.js.map +1 -0
- package/lib/api-schemas/app-runtime.d.ts +9056 -0
- package/lib/api-schemas/app-runtime.d.ts.map +1 -0
- package/lib/api-schemas/app-runtime.js +782 -0
- package/lib/api-schemas/app-runtime.js.map +1 -0
- package/lib/api-schemas/apps.d.ts +247 -0
- package/lib/api-schemas/apps.d.ts.map +1 -0
- package/lib/api-schemas/apps.js +366 -0
- package/lib/api-schemas/apps.js.map +1 -0
- package/lib/api-schemas/audit-trail.d.ts +465 -0
- package/lib/api-schemas/audit-trail.d.ts.map +1 -0
- package/lib/api-schemas/audit-trail.js +218 -0
- package/lib/api-schemas/audit-trail.js.map +1 -0
- package/lib/api-schemas/bulk-operation.d.ts +104 -0
- package/lib/api-schemas/bulk-operation.d.ts.map +1 -0
- package/lib/api-schemas/bulk-operation.js +66 -0
- package/lib/api-schemas/bulk-operation.js.map +1 -0
- package/lib/api-schemas/commands.d.ts +50 -0
- package/lib/api-schemas/commands.d.ts.map +1 -0
- package/lib/api-schemas/commands.js +58 -0
- package/lib/api-schemas/commands.js.map +1 -0
- package/lib/api-schemas/content.d.ts +3561 -0
- package/lib/api-schemas/content.d.ts.map +1 -0
- package/lib/api-schemas/content.js +842 -0
- package/lib/api-schemas/content.js.map +1 -0
- package/lib/api-schemas/cost-analytics.d.ts +300 -0
- package/lib/api-schemas/cost-analytics.d.ts.map +1 -0
- package/lib/api-schemas/cost-analytics.js +218 -0
- package/lib/api-schemas/cost-analytics.js.map +1 -0
- package/lib/api-schemas/dashboard.d.ts +408 -0
- package/lib/api-schemas/dashboard.d.ts.map +1 -0
- package/lib/api-schemas/dashboard.js +311 -0
- package/lib/api-schemas/dashboard.js.map +1 -0
- package/lib/api-schemas/data-store.d.ts +1650 -0
- package/lib/api-schemas/data-store.d.ts.map +1 -0
- package/lib/api-schemas/data-store.js +504 -0
- package/lib/api-schemas/data-store.js.map +1 -0
- package/lib/api-schemas/document-processing.d.ts +1501 -0
- package/lib/api-schemas/document-processing.d.ts.map +1 -0
- package/lib/api-schemas/document-processing.js +312 -0
- package/lib/api-schemas/document-processing.js.map +1 -0
- package/lib/api-schemas/embeddings.d.ts +184 -0
- package/lib/api-schemas/embeddings.d.ts.map +1 -0
- package/lib/api-schemas/embeddings.js +102 -0
- package/lib/api-schemas/embeddings.js.map +1 -0
- package/lib/api-schemas/environment.d.ts +412 -0
- package/lib/api-schemas/environment.d.ts.map +1 -0
- package/lib/api-schemas/environment.js +170 -0
- package/lib/api-schemas/environment.js.map +1 -0
- package/lib/api-schemas/events.d.ts +4880 -0
- package/lib/api-schemas/events.d.ts.map +1 -0
- package/lib/api-schemas/events.js +832 -0
- package/lib/api-schemas/events.js.map +1 -0
- package/lib/api-schemas/files.d.ts +107 -0
- package/lib/api-schemas/files.d.ts.map +1 -0
- package/lib/api-schemas/files.js +137 -0
- package/lib/api-schemas/files.js.map +1 -0
- package/lib/api-schemas/group.d.ts +122 -0
- package/lib/api-schemas/group.d.ts.map +1 -0
- package/lib/api-schemas/group.js +142 -0
- package/lib/api-schemas/group.js.map +1 -0
- package/lib/api-schemas/index.d.ts +36 -0
- package/lib/api-schemas/index.d.ts.map +1 -0
- package/lib/api-schemas/index.js +36 -0
- package/lib/api-schemas/index.js.map +1 -0
- package/lib/api-schemas/indexing.d.ts +144 -0
- package/lib/api-schemas/indexing.d.ts.map +1 -0
- package/lib/api-schemas/indexing.js +217 -0
- package/lib/api-schemas/indexing.js.map +1 -0
- package/lib/api-schemas/integrations.d.ts +269 -0
- package/lib/api-schemas/integrations.d.ts.map +1 -0
- package/lib/api-schemas/integrations.js +335 -0
- package/lib/api-schemas/integrations.js.map +1 -0
- package/lib/api-schemas/interaction.d.ts +22454 -0
- package/lib/api-schemas/interaction.d.ts.map +1 -0
- package/lib/api-schemas/interaction.js +2065 -0
- package/lib/api-schemas/interaction.js.map +1 -0
- package/lib/api-schemas/invites.d.ts +162 -0
- package/lib/api-schemas/invites.d.ts.map +1 -0
- package/lib/api-schemas/invites.js +106 -0
- package/lib/api-schemas/invites.js.map +1 -0
- package/lib/api-schemas/oauth-server.d.ts +415 -0
- package/lib/api-schemas/oauth-server.d.ts.map +1 -0
- package/lib/api-schemas/oauth-server.js +193 -0
- package/lib/api-schemas/oauth-server.js.map +1 -0
- package/lib/api-schemas/oauth.d.ts +150 -0
- package/lib/api-schemas/oauth.d.ts.map +1 -0
- package/lib/api-schemas/oauth.js +148 -0
- package/lib/api-schemas/oauth.js.map +1 -0
- package/lib/api-schemas/parameters.d.ts +64 -0
- package/lib/api-schemas/parameters.d.ts.map +1 -0
- package/lib/api-schemas/parameters.js +246 -0
- package/lib/api-schemas/parameters.js.map +1 -0
- package/lib/api-schemas/process.d.ts +499 -0
- package/lib/api-schemas/process.d.ts.map +1 -0
- package/lib/api-schemas/process.js +817 -0
- package/lib/api-schemas/process.js.map +1 -0
- package/lib/api-schemas/project-configuration.d.ts +4900 -0
- package/lib/api-schemas/project-configuration.d.ts.map +1 -0
- package/lib/api-schemas/project-configuration.js +425 -0
- package/lib/api-schemas/project-configuration.js.map +1 -0
- package/lib/api-schemas/project.d.ts +7247 -0
- package/lib/api-schemas/project.d.ts.map +1 -0
- package/lib/api-schemas/project.js +185 -0
- package/lib/api-schemas/project.js.map +1 -0
- package/lib/api-schemas/prompt.d.ts +70 -0
- package/lib/api-schemas/prompt.d.ts.map +1 -0
- package/lib/api-schemas/prompt.js +77 -0
- package/lib/api-schemas/prompt.js.map +1 -0
- package/lib/api-schemas/quota.d.ts +90 -0
- package/lib/api-schemas/quota.d.ts.map +1 -0
- package/lib/api-schemas/quota.js +95 -0
- package/lib/api-schemas/quota.js.map +1 -0
- package/lib/api-schemas/registry.d.ts +97458 -0
- package/lib/api-schemas/registry.d.ts.map +1 -0
- package/lib/api-schemas/registry.js +2586 -0
- package/lib/api-schemas/registry.js.map +1 -0
- package/lib/api-schemas/schema-primitives.d.ts +5 -0
- package/lib/api-schemas/schema-primitives.d.ts.map +1 -0
- package/lib/api-schemas/schema-primitives.js +11 -0
- package/lib/api-schemas/schema-primitives.js.map +1 -0
- package/lib/api-schemas/secrets.d.ts +497 -0
- package/lib/api-schemas/secrets.d.ts.map +1 -0
- package/lib/api-schemas/secrets.js +298 -0
- package/lib/api-schemas/secrets.js.map +1 -0
- package/lib/api-schemas/store.d.ts +22140 -0
- package/lib/api-schemas/store.d.ts.map +1 -0
- package/lib/api-schemas/store.js +557 -0
- package/lib/api-schemas/store.js.map +1 -0
- package/lib/api-schemas/sts.d.ts +156 -0
- package/lib/api-schemas/sts.d.ts.map +1 -0
- package/lib/api-schemas/sts.js +96 -0
- package/lib/api-schemas/sts.js.map +1 -0
- package/lib/api-schemas/task.d.ts +215 -0
- package/lib/api-schemas/task.d.ts.map +1 -0
- package/lib/api-schemas/task.js +95 -0
- package/lib/api-schemas/task.js.map +1 -0
- package/lib/api-schemas/tools.d.ts +111 -0
- package/lib/api-schemas/tools.d.ts.map +1 -0
- package/lib/api-schemas/tools.js +122 -0
- package/lib/api-schemas/tools.js.map +1 -0
- package/lib/api-schemas/user.d.ts +208 -0
- package/lib/api-schemas/user.d.ts.map +1 -0
- package/lib/api-schemas/user.js +180 -0
- package/lib/api-schemas/user.js.map +1 -0
- package/lib/api-schemas/view-execution.d.ts +3163 -0
- package/lib/api-schemas/view-execution.d.ts.map +1 -0
- package/lib/api-schemas/view-execution.js +172 -0
- package/lib/api-schemas/view-execution.js.map +1 -0
- package/lib/api-schemas/views.d.ts +5990 -0
- package/lib/api-schemas/views.d.ts.map +1 -0
- package/lib/api-schemas/views.js +396 -0
- package/lib/api-schemas/views.js.map +1 -0
- package/lib/api-schemas/workflow-runs.d.ts +2209 -0
- package/lib/api-schemas/workflow-runs.d.ts.map +1 -0
- package/lib/api-schemas/workflow-runs.js +589 -0
- package/lib/api-schemas/workflow-runs.js.map +1 -0
- package/lib/apikey-values.d.ts +10 -0
- package/lib/apikey-values.d.ts.map +1 -0
- package/lib/apikey-values.js +11 -0
- package/lib/apikey-values.js.map +1 -0
- package/lib/apikey.d.ts +37 -36
- package/lib/apikey.d.ts.map +1 -1
- package/lib/apikey.js +5 -4
- package/lib/apikey.js.map +1 -1
- package/lib/apps.d.ts +116 -1121
- package/lib/apps.d.ts.map +1 -1
- package/lib/apps.js.map +1 -1
- package/lib/ask-user.d.ts +8 -1
- package/lib/ask-user.d.ts.map +1 -1
- package/lib/audit-trail.d.ts +17 -128
- package/lib/audit-trail.d.ts.map +1 -1
- package/lib/audit-trail.js.map +1 -1
- package/lib/browser-credentials.d.ts +11 -106
- package/lib/browser-credentials.d.ts.map +1 -1
- package/lib/common.d.ts +59 -81
- package/lib/common.d.ts.map +1 -1
- package/lib/cost-analytics.d.ts +14 -167
- package/lib/cost-analytics.d.ts.map +1 -1
- package/lib/cost-analytics.js.map +1 -1
- package/lib/data-platform.d.ts +122 -786
- package/lib/data-platform.d.ts.map +1 -1
- package/lib/data-platform.js +41 -61
- package/lib/data-platform.js.map +1 -1
- package/lib/email.d.ts +5 -17
- package/lib/email.d.ts.map +1 -1
- package/lib/email.js +0 -3
- package/lib/email.js.map +1 -1
- package/lib/embeddings.d.ts +14 -56
- package/lib/embeddings.d.ts.map +1 -1
- package/lib/environment.d.ts +19 -113
- package/lib/environment.d.ts.map +1 -1
- package/lib/environment.js +3 -0
- package/lib/environment.js.map +1 -1
- package/lib/facets.d.ts +4 -7
- package/lib/facets.d.ts.map +1 -1
- package/lib/group.d.ts +33 -39
- package/lib/group.d.ts.map +1 -1
- package/lib/group.js +0 -1
- package/lib/group.js.map +1 -1
- package/lib/index.d.ts +7 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/integrations.d.ts +20 -108
- package/lib/integrations.d.ts.map +1 -1
- package/lib/integrations.js.map +1 -1
- package/lib/interaction-values.d.ts +11 -0
- package/lib/interaction-values.d.ts.map +1 -0
- package/lib/interaction-values.js +24 -0
- package/lib/interaction-values.js.map +1 -0
- package/lib/interaction.d.ts +116 -734
- package/lib/interaction.d.ts.map +1 -1
- package/lib/interaction.js +56 -12
- package/lib/interaction.js.map +1 -1
- package/lib/meters.d.ts +11 -7
- package/lib/meters.d.ts.map +1 -1
- package/lib/meters.js.map +1 -1
- package/lib/oauth-server.d.ts +33 -119
- package/lib/oauth-server.d.ts.map +1 -1
- package/lib/oauth.d.ts +14 -96
- package/lib/oauth.d.ts.map +1 -1
- package/lib/oauth.js +0 -4
- package/lib/oauth.js.map +1 -1
- package/lib/payload.d.ts +15 -38
- package/lib/payload.d.ts.map +1 -1
- package/lib/platform-event.d.ts +49 -462
- package/lib/platform-event.d.ts.map +1 -1
- package/lib/platform-event.js.map +1 -1
- package/lib/principal-context.d.ts +10 -15
- package/lib/principal-context.d.ts.map +1 -1
- package/lib/project-values.d.ts +24 -0
- package/lib/project-values.d.ts.map +1 -0
- package/lib/project-values.js +42 -0
- package/lib/project-values.js.map +1 -0
- package/lib/project.d.ts +55 -503
- package/lib/project.d.ts.map +1 -1
- package/lib/project.js +6 -76
- package/lib/project.js.map +1 -1
- package/lib/prompt.d.ts +20 -51
- package/lib/prompt.d.ts.map +1 -1
- package/lib/prompt.js.map +1 -1
- package/lib/query.d.ts +27 -88
- package/lib/query.d.ts.map +1 -1
- package/lib/rate-limiter.d.ts +19 -70
- package/lib/rate-limiter.d.ts.map +1 -1
- package/lib/rate-limiter.js +0 -3
- package/lib/rate-limiter.js.map +1 -1
- package/lib/refs.d.ts +3 -11
- package/lib/refs.d.ts.map +1 -1
- package/lib/refs.js.map +1 -1
- package/lib/roles/types.d.ts +14 -20
- package/lib/roles/types.d.ts.map +1 -1
- package/lib/roles/types.js +5 -9
- package/lib/roles/types.js.map +1 -1
- package/lib/runs.d.ts +6 -25
- package/lib/runs.d.ts.map +1 -1
- package/lib/secrets.d.ts +20 -105
- package/lib/secrets.d.ts.map +1 -1
- package/lib/store/agent-approval.d.ts +5 -14
- 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 +63 -342
- package/lib/store/agent-run.d.ts.map +1 -1
- package/lib/store/collections.d.ts +11 -63
- package/lib/store/collections.d.ts.map +1 -1
- package/lib/store/collections.js.map +1 -1
- package/lib/store/conversation-state.d.ts +63 -61
- package/lib/store/conversation-state.d.ts.map +1 -1
- package/lib/store/conversation-state.js +2 -0
- package/lib/store/conversation-state.js.map +1 -1
- package/lib/store/doc-analyzer.d.ts +9 -32
- package/lib/store/doc-analyzer.d.ts.map +1 -1
- package/lib/store/dsl-workflow.d.ts +37 -151
- package/lib/store/dsl-workflow.d.ts.map +1 -1
- package/lib/store/dsl-workflow.js.map +1 -1
- package/lib/store/editing-policy-schema.generated.d.ts +3 -0
- package/lib/store/editing-policy-schema.generated.d.ts.map +1 -0
- package/lib/store/editing-policy-schema.generated.js +28 -0
- package/lib/store/editing-policy-schema.generated.js.map +1 -0
- package/lib/store/grounded-extraction.d.ts +7 -104
- package/lib/store/grounded-extraction.d.ts.map +1 -1
- package/lib/store/grounded-extraction.js.map +1 -1
- package/lib/store/index.d.ts +2 -0
- package/lib/store/index.d.ts.map +1 -1
- package/lib/store/index.js +3 -0
- package/lib/store/index.js.map +1 -1
- package/lib/store/intake-policy-schema.generated.d.ts +3 -0
- package/lib/store/intake-policy-schema.generated.d.ts.map +1 -0
- package/lib/store/intake-policy-schema.generated.js +1425 -0
- package/lib/store/intake-policy-schema.generated.js.map +1 -0
- package/lib/store/process-schema.d.ts +80 -0
- package/lib/store/process-schema.d.ts.map +1 -1
- package/lib/store/process-schema.js +79 -0
- package/lib/store/process-schema.js.map +1 -1
- package/lib/store/process-validation.d.ts.map +1 -1
- package/lib/store/process-validation.js +70 -2
- package/lib/store/process-validation.js.map +1 -1
- package/lib/store/process.d.ts +36 -125
- package/lib/store/process.d.ts.map +1 -1
- package/lib/store/process.js.map +1 -1
- package/lib/store/rendering.d.ts +9 -64
- package/lib/store/rendering.d.ts.map +1 -1
- package/lib/store/rendering.js.map +1 -1
- package/lib/store/store.d.ts +98 -693
- package/lib/store/store.d.ts.map +1 -1
- package/lib/store/store.js +4 -443
- package/lib/store/store.js.map +1 -1
- package/lib/store/task.d.ts +15 -59
- package/lib/store/task.d.ts.map +1 -1
- package/lib/store/task.js +0 -3
- package/lib/store/task.js.map +1 -1
- package/lib/store/workflow.d.ts +56 -516
- package/lib/store/workflow.d.ts.map +1 -1
- package/lib/store/workflow.js +28 -11
- package/lib/store/workflow.js.map +1 -1
- package/lib/sts-token-types.d.ts +12 -66
- package/lib/sts-token-types.d.ts.map +1 -1
- package/lib/sts-token-types.js.map +1 -1
- package/lib/tools.d.ts +8 -100
- package/lib/tools.d.ts.map +1 -1
- package/lib/transient-tokens-values.d.ts +11 -0
- package/lib/transient-tokens-values.d.ts.map +1 -0
- package/lib/transient-tokens-values.js +12 -0
- package/lib/transient-tokens-values.js.map +1 -0
- package/lib/transient-tokens.d.ts +15 -13
- package/lib/transient-tokens.d.ts.map +1 -1
- package/lib/transient-tokens.js +5 -5
- package/lib/transient-tokens.js.map +1 -1
- package/lib/user.d.ts +54 -155
- package/lib/user.d.ts.map +1 -1
- package/lib/user.js +1 -78
- package/lib/user.js.map +1 -1
- package/lib/versions.d.ts +24 -1
- package/lib/versions.d.ts.map +1 -1
- package/lib/versions.js +23 -0
- package/lib/versions.js.map +1 -1
- package/lib/vertesia-common.js +6 -2
- package/lib/vertesia-common.js.map +1 -1
- package/lib/views-schema.d.ts +4 -4
- package/lib/views.d.ts +56 -312
- package/lib/views.d.ts.map +1 -1
- package/lib/views.js.map +1 -1
- package/package.json +14 -5
- package/src/access-control-values.ts +113 -0
- package/src/access-control.ts +33 -138
- package/src/account-values.ts +95 -0
- package/src/agent-resources.test.ts +100 -0
- package/src/analytics.ts +18 -42
- package/src/api-schemas/access-control.contract.test.ts +209 -0
- package/src/api-schemas/access-control.ts +208 -0
- package/src/api-schemas/account.contract.test.ts +318 -0
- package/src/api-schemas/account.ts +150 -0
- package/src/api-schemas/adapter-edge-cases.test.ts +480 -0
- package/src/api-schemas/adapter.ts +778 -0
- package/src/api-schemas/agent-runs.ts +1081 -0
- package/src/api-schemas/analytics.ts +65 -0
- package/src/api-schemas/apikey.contract.test.ts +270 -0
- package/src/api-schemas/apikey.ts +199 -0
- package/src/api-schemas/app-lifecycle.ts +841 -0
- package/src/api-schemas/app-runtime.ts +919 -0
- package/src/api-schemas/apps.ts +415 -0
- package/src/api-schemas/audit-trail.ts +243 -0
- package/src/api-schemas/bulk-operation.contract.test.ts +39 -0
- package/src/api-schemas/bulk-operation.ts +75 -0
- package/src/api-schemas/bundle-isolation.test.ts +80 -0
- package/src/api-schemas/commands.contract.test.ts +51 -0
- package/src/api-schemas/commands.ts +62 -0
- package/src/api-schemas/content.ts +939 -0
- package/src/api-schemas/cost-analytics.contract.test.ts +64 -0
- package/src/api-schemas/cost-analytics.ts +235 -0
- package/src/api-schemas/dashboard.contract.test.ts +127 -0
- package/src/api-schemas/dashboard.ts +351 -0
- package/src/api-schemas/data-store.contract.test.ts +91 -0
- package/src/api-schemas/data-store.ts +571 -0
- package/src/api-schemas/document-processing.contract.test.ts +76 -0
- package/src/api-schemas/document-processing.ts +344 -0
- package/src/api-schemas/embeddings.ts +113 -0
- package/src/api-schemas/environment.contract.test.ts +184 -0
- package/src/api-schemas/environment.ts +190 -0
- package/src/api-schemas/events.ts +921 -0
- package/src/api-schemas/files.ts +159 -0
- package/src/api-schemas/group.contract.test.ts +205 -0
- package/src/api-schemas/group.ts +155 -0
- package/src/api-schemas/index.ts +35 -0
- package/src/api-schemas/indexing.contract.test.ts +83 -0
- package/src/api-schemas/indexing.ts +234 -0
- package/src/api-schemas/integrations.ts +369 -0
- package/src/api-schemas/interaction.ts +2357 -0
- package/src/api-schemas/invites.contract.test.ts +268 -0
- package/src/api-schemas/invites.ts +127 -0
- package/src/api-schemas/llumiverse.contract.test.ts +108 -0
- package/src/api-schemas/oauth-server.ts +219 -0
- package/src/api-schemas/oauth.contract.test.ts +118 -0
- package/src/api-schemas/oauth.ts +166 -0
- package/src/api-schemas/parameters.test.ts +402 -0
- package/src/api-schemas/parameters.ts +310 -0
- package/src/api-schemas/process.ts +929 -0
- package/src/api-schemas/project-configuration.ts +478 -0
- package/src/api-schemas/project.contract.test.ts +365 -0
- package/src/api-schemas/project.ts +214 -0
- package/src/api-schemas/prompt.ts +88 -0
- package/src/api-schemas/pruning-limits.test.ts +189 -0
- package/src/api-schemas/quota.contract.test.ts +147 -0
- package/src/api-schemas/quota.ts +122 -0
- package/src/api-schemas/registry-groups.test.ts +91 -0
- package/src/api-schemas/registry.ts +3487 -0
- package/src/api-schemas/response-pruning.test.ts +260 -0
- package/src/api-schemas/schema-primitives.ts +12 -0
- package/src/api-schemas/secrets.ts +332 -0
- package/src/api-schemas/store.contract.test.ts +450 -0
- package/src/api-schemas/store.ts +604 -0
- package/src/api-schemas/sts.contract.test.ts +80 -0
- package/src/api-schemas/sts.ts +110 -0
- package/src/api-schemas/task.ts +104 -0
- package/src/api-schemas/tools.ts +140 -0
- package/src/api-schemas/user.contract.test.ts +191 -0
- package/src/api-schemas/user.ts +204 -0
- package/src/api-schemas/view-execution.ts +200 -0
- package/src/api-schemas/views.ts +437 -0
- package/src/api-schemas/workflow-runs.ts +653 -0
- package/src/apikey-values.ts +10 -0
- package/src/apikey.ts +49 -40
- package/src/apps.ts +249 -1179
- package/src/ask-user.ts +9 -1
- package/src/audit-trail.ts +45 -137
- package/src/browser-credentials.ts +21 -106
- package/src/common.ts +67 -78
- package/src/cost-analytics.ts +37 -176
- package/src/data-platform.ts +205 -776
- package/src/email.ts +5 -17
- package/src/embeddings.ts +22 -60
- package/src/environment.ts +52 -124
- package/src/facets.ts +4 -7
- package/src/group.ts +38 -42
- package/src/index.ts +11 -0
- package/src/integrations.ts +39 -129
- package/src/interaction-values.ts +23 -0
- package/src/interaction.ts +231 -841
- package/src/meters.ts +11 -7
- package/src/oauth-server.ts +58 -127
- package/src/oauth.ts +24 -108
- package/src/payload.ts +25 -40
- package/src/platform-event.ts +98 -484
- package/src/principal-context.ts +11 -15
- package/src/project-values.ts +41 -0
- package/src/project.ts +116 -588
- package/src/prompt.ts +34 -61
- package/src/query.ts +34 -93
- package/src/rate-limiter.ts +27 -75
- package/src/refs.ts +4 -11
- package/src/roles/types.ts +20 -20
- package/src/runs.ts +11 -24
- package/src/secrets.ts +38 -117
- package/src/store/agent-approval.ts +9 -14
- package/src/store/agent-run.ts +106 -434
- package/src/store/collections.ts +21 -63
- package/src/store/content-type-editing.test.ts +17 -0
- package/src/store/conversation-state.ts +78 -64
- package/src/store/doc-analyzer.ts +17 -33
- package/src/store/dsl-workflow.ts +62 -158
- package/src/store/editing-policy-schema.generated.ts +30 -0
- package/src/store/grounded-extraction.ts +13 -104
- package/src/store/index.ts +3 -0
- package/src/store/intake-policy-schema.generated.ts +1442 -0
- package/src/store/process-schema.test.ts +43 -0
- package/src/store/process-schema.ts +79 -0
- package/src/store/process-validation.test.ts +141 -0
- package/src/store/process-validation.ts +82 -2
- package/src/store/process.ts +70 -146
- package/src/store/rendering.ts +15 -64
- package/src/store/store.ts +197 -1182
- package/src/store/task.ts +25 -59
- package/src/store/workflow.ts +103 -554
- package/src/sts-token-types.ts +24 -75
- package/src/tools.ts +18 -97
- package/src/transient-tokens-values.ts +11 -0
- package/src/transient-tokens.ts +16 -13
- package/src/user.ts +74 -214
- package/src/versions.ts +24 -0
- package/src/views-schema.test.ts +9 -1
- package/src/views.ts +106 -329
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import { Ajv2020 } from 'ajv/dist/2020.js';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import type { StripeBillingStatusResponse } from '../meters.js';
|
|
4
|
+
import { type Account, BillingMethod, type QuotaTier, type UpdateAccountPayload } from '../user.js';
|
|
5
|
+
import { type JsonObject, SchemaAdapterError, toOpenApiComponents } from './adapter.js';
|
|
6
|
+
import { ApiSchemaComponents, apiComponentRef, validateApiRequest, validateApiResponse } from './registry.js';
|
|
7
|
+
|
|
8
|
+
/** Exact type identity — `extends` in both directions is too weak (any/unknown slip through). */
|
|
9
|
+
type Equals<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2 ? true : false;
|
|
10
|
+
/**
|
|
11
|
+
* Mutual assignability. Weaker than {@link Equals}, and the right assertion when comparing a
|
|
12
|
+
* derived type against a hand-written enum or interface: TypeScript keeps those nominally
|
|
13
|
+
* distinct even when structurally interchangeable, and interchangeable is what consumers need.
|
|
14
|
+
* `[A] extends [B]` rather than `A extends B` so unions do not distribute.
|
|
15
|
+
*/
|
|
16
|
+
type MutuallyAssignable<A, B> = [A] extends [B] ? ([B] extends [A] ? true : false) : false;
|
|
17
|
+
function assertType<T extends true>(_ok: T): void {}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Compiles a component through an OpenAPI-shaped envelope, so the pointer AJV resolves is the
|
|
21
|
+
* exact pointer the spec publishes. An isolated component cannot resolve
|
|
22
|
+
* `#/components/schemas/*` on its own.
|
|
23
|
+
*
|
|
24
|
+
* `strictSchema: false` (not `strict: false`) keeps AJV's type and tuple checks active while
|
|
25
|
+
* tolerating the `components` envelope keyword.
|
|
26
|
+
*/
|
|
27
|
+
function compile(name: string, components: Readonly<Record<string, JsonObject>> = ApiSchemaComponents) {
|
|
28
|
+
const ajv = new Ajv2020({ strictSchema: false, allErrors: true });
|
|
29
|
+
ajv.addSchema({ $id: 'vertesia://openapi', components: { schemas: components } });
|
|
30
|
+
return ajv.compile({ $ref: `vertesia://openapi${apiComponentRef(name as never)}` });
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const VALID_ACCOUNT = {
|
|
34
|
+
id: 'acc_1',
|
|
35
|
+
name: 'Acme',
|
|
36
|
+
email_domains: ['acme.com'],
|
|
37
|
+
onboarding: { completed: true, completed_at: '2026-07-29T10:00:00.000Z' },
|
|
38
|
+
datacenter: 'gcp',
|
|
39
|
+
account_type: 'customer',
|
|
40
|
+
billing: { method: 'stripe', stripe_customer_id: 'cus_1' },
|
|
41
|
+
created_by: 'u1',
|
|
42
|
+
updated_by: 'u1',
|
|
43
|
+
created_at: '2026-07-29T10:00:00.000Z',
|
|
44
|
+
updated_at: '2026-07-29T10:00:00.000Z',
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
describe('gate 1 — the schema is the single source of truth for the public types', () => {
|
|
48
|
+
it('publishes the exact schema-derived type, not a hand-written twin', () => {
|
|
49
|
+
// `Equals`, not assignability: two structurally similar declarations would satisfy
|
|
50
|
+
// assignability while still being free to drift. Identity is the property that makes the
|
|
51
|
+
// schema the source of truth — there is only one definition to change.
|
|
52
|
+
expect(true).toBe(true);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('resolves a nested component reference to its concrete property type', () => {
|
|
56
|
+
// The whole point of schema-first: this must not degrade to `unknown`. The enum survives
|
|
57
|
+
// as the shared `BillingMethod` enum rather than a bare literal union, which is what keeps
|
|
58
|
+
// it interchangeable with the value consumers already import.
|
|
59
|
+
assertType<MutuallyAssignable<Account['billing']['method'], BillingMethod>>(true);
|
|
60
|
+
assertType<Equals<Account['billing']['stripe_customer_id'], string | undefined>>(true);
|
|
61
|
+
assertType<Equals<Account['email_domains'], string[]>>(true);
|
|
62
|
+
assertType<Equals<Account['quota_tier'], QuotaTier | undefined>>(true);
|
|
63
|
+
assertType<Equals<Account['onboarding']['completed_at'], string | undefined>>(true);
|
|
64
|
+
expect(true).toBe(true);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('narrows the Stripe union on its discriminator', () => {
|
|
68
|
+
// The flat shape gave consumers `portal_url?` and `reason?` with no way to know which was
|
|
69
|
+
// populated. Narrowing on `status` is the behaviour a client actually needs, and it only
|
|
70
|
+
// exists because the type comes from the discriminated union the schema declares.
|
|
71
|
+
const enabled: StripeBillingStatusResponse = {
|
|
72
|
+
status: 'enabled',
|
|
73
|
+
billing_method: BillingMethod.stripe,
|
|
74
|
+
portal_url: 'https://billing.stripe.com/p/session_1',
|
|
75
|
+
};
|
|
76
|
+
if (enabled.status === 'enabled') {
|
|
77
|
+
assertType<Equals<typeof enabled.portal_url, string>>(true);
|
|
78
|
+
expect(enabled.portal_url).toBe('https://billing.stripe.com/p/session_1');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const disabled: StripeBillingStatusResponse = {
|
|
82
|
+
status: 'disabled',
|
|
83
|
+
billing_method: null,
|
|
84
|
+
reason: 'No billing method configured',
|
|
85
|
+
};
|
|
86
|
+
if (disabled.status === 'disabled') {
|
|
87
|
+
assertType<Equals<typeof disabled.reason, string>>(true);
|
|
88
|
+
expect(disabled.reason).toBe('No billing method configured');
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
describe('gate 2 — canonical schemas carry stable OpenAPI component references', () => {
|
|
94
|
+
it('publishes the registered component graph without migration-era names', () => {
|
|
95
|
+
const names = Object.keys(ApiSchemaComponents);
|
|
96
|
+
expect(new Set(names).size).toBe(names.length);
|
|
97
|
+
expect(names).toEqual(expect.arrayContaining(['Account', 'AccountBilling', 'StripeBillingStatusResponse']));
|
|
98
|
+
expect(names.some((name) => name.startsWith('Partial_'))).toBe(false);
|
|
99
|
+
});
|
|
100
|
+
it('emits only #/components/schemas pointers', () => {
|
|
101
|
+
const serialized = JSON.stringify(ApiSchemaComponents);
|
|
102
|
+
expect(serialized).not.toContain('#/$defs/');
|
|
103
|
+
expect(serialized).not.toContain('$schema');
|
|
104
|
+
expect(serialized).not.toContain('"$defs"');
|
|
105
|
+
for (const ref of serialized.matchAll(/"\$ref":"([^"]+)"/g)) {
|
|
106
|
+
expect(ref[1]).toMatch(/^#\/components\/schemas\/[A-Za-z0-9_]+$/);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it('shares one AccountBilling component across both referencing schemas', () => {
|
|
111
|
+
const fromAccount = (ApiSchemaComponents.Account.properties as JsonObject).billing;
|
|
112
|
+
const fromPayload = (ApiSchemaComponents.UpdateAccountPayload.properties as JsonObject).billing;
|
|
113
|
+
expect(fromAccount).toEqual({ $ref: '#/components/schemas/AccountBilling' });
|
|
114
|
+
expect(fromPayload).toEqual({ $ref: '#/components/schemas/AccountBilling' });
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
it('synthesizes a discriminator for the Stripe billing union', () => {
|
|
118
|
+
const union = ApiSchemaComponents.StripeBillingStatusResponse;
|
|
119
|
+
expect(union.oneOf).toEqual([
|
|
120
|
+
{ $ref: '#/components/schemas/StripeBillingEnabled' },
|
|
121
|
+
{ $ref: '#/components/schemas/StripeBillingDisabled' },
|
|
122
|
+
]);
|
|
123
|
+
expect(union.discriminator).toEqual({
|
|
124
|
+
propertyName: 'status',
|
|
125
|
+
mapping: {
|
|
126
|
+
enabled: '#/components/schemas/StripeBillingEnabled',
|
|
127
|
+
disabled: '#/components/schemas/StripeBillingDisabled',
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
describe('gate 3 — AJV validates the same canonical objects that are published', () => {
|
|
134
|
+
it('accepts a valid account and rejects a bad enum', () => {
|
|
135
|
+
const validate = compile('Account');
|
|
136
|
+
expect(validate(VALID_ACCOUNT)).toBe(true);
|
|
137
|
+
expect(validate({ ...VALID_ACCOUNT, billing: { method: 'paypal' } })).toBe(false);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it('rejects a missing required field', () => {
|
|
141
|
+
const validate = compile('Account');
|
|
142
|
+
const { email_domains: _dropped, ...incomplete } = VALID_ACCOUNT;
|
|
143
|
+
expect(validate(incomplete)).toBe(false);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it('enforces the discriminated union per branch', () => {
|
|
147
|
+
const validate = compile('StripeBillingStatusResponse');
|
|
148
|
+
expect(validate({ status: 'enabled', billing_method: 'stripe', portal_url: 'https://x' })).toBe(true);
|
|
149
|
+
expect(validate({ status: 'disabled', billing_method: null, reason: 'No billing method' })).toBe(true);
|
|
150
|
+
// The flattened interface allowed this; a real discriminated union does not.
|
|
151
|
+
expect(validate({ status: 'enabled', billing_method: 'stripe', reason: 'nope' })).toBe(false);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
describe('gates 4 & 5 — unknown-field behaviour and no mutation', () => {
|
|
156
|
+
it('reports an unknown request field without removing it', () => {
|
|
157
|
+
// `UpdateAccountPayload` is published closed, as it always has been, so an extra property
|
|
158
|
+
// is a contract violation. AJV must SAY SO rather than quietly delete it: a removal mode
|
|
159
|
+
// would make the server accept a body the published schema declares invalid, which is a
|
|
160
|
+
// silent disagreement between the spec and the code enforcing it.
|
|
161
|
+
expect(ApiSchemaComponents.UpdateAccountPayload.additionalProperties).toBe(false);
|
|
162
|
+
const validate = compile('UpdateAccountPayload');
|
|
163
|
+
const payload: Record<string, unknown> = { name: 'Acme', rogue_field: 42 };
|
|
164
|
+
expect(validate(payload)).toBe(false);
|
|
165
|
+
expect(payload.rogue_field).toBe(42);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it('never mutates a response payload during validation', () => {
|
|
169
|
+
const validate = compile('Account');
|
|
170
|
+
const response = structuredClone({ ...VALID_ACCOUNT, legacy_extra: 'still here' });
|
|
171
|
+
const pristine = structuredClone(response);
|
|
172
|
+
// Invalid against the closed component — and left exactly as it was. Removing the extra
|
|
173
|
+
// is response PRUNING's job, an explicit call with its own policy, never a side effect of
|
|
174
|
+
// asking whether a payload conforms.
|
|
175
|
+
expect(validate(response)).toBe(false);
|
|
176
|
+
expect(response).toEqual(pristine);
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
it('rejects unknown fields only where a component opts in to strict', () => {
|
|
180
|
+
const components = toOpenApiComponents(
|
|
181
|
+
{ Strict: { type: 'object', properties: { a: { type: 'string' } }, required: ['a'] } },
|
|
182
|
+
{ strictComponents: new Set(['Strict']) },
|
|
183
|
+
);
|
|
184
|
+
expect(components.Strict.additionalProperties).toBe(false);
|
|
185
|
+
const ajv = new Ajv2020({ strictSchema: false });
|
|
186
|
+
ajv.addSchema({ $id: 'vertesia://openapi', components: { schemas: components } });
|
|
187
|
+
const validate = ajv.compile({ $ref: 'vertesia://openapi#/components/schemas/Strict' });
|
|
188
|
+
const payload = { a: 'x', extra: 1 };
|
|
189
|
+
expect(validate(payload)).toBe(false);
|
|
190
|
+
expect(payload.extra).toBe(1); // rejected, not stripped
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
describe('gate 7 — the adapter is library-neutral', () => {
|
|
195
|
+
it('hoists typebox-style nested $id subschemas', () => {
|
|
196
|
+
// TypeBox embeds the schema value (which is what preserves Static<> inference) and marks
|
|
197
|
+
// it with $id; the adapter lifts it, exactly as it lifts zod's $defs.
|
|
198
|
+
const components = toOpenApiComponents({
|
|
199
|
+
Account: {
|
|
200
|
+
type: 'object',
|
|
201
|
+
properties: {
|
|
202
|
+
billing: { $id: 'AccountBilling', type: 'object', properties: { method: { type: 'string' } } },
|
|
203
|
+
history: {
|
|
204
|
+
type: 'array',
|
|
205
|
+
items: { $id: 'AccountBilling', type: 'object', properties: { method: { type: 'string' } } },
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
},
|
|
209
|
+
});
|
|
210
|
+
expect(Object.keys(components).sort()).toEqual(['Account', 'AccountBilling']);
|
|
211
|
+
const props = components.Account.properties as JsonObject;
|
|
212
|
+
expect(props.billing).toEqual({ $ref: '#/components/schemas/AccountBilling' });
|
|
213
|
+
expect((props.history as JsonObject).items).toEqual({ $ref: '#/components/schemas/AccountBilling' });
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
it('rewrites a root self-reference to its component pointer', () => {
|
|
217
|
+
// zod emits `{"$ref": "#"}` for recursion, which would point at the whole OpenAPI
|
|
218
|
+
// document once embedded under components.
|
|
219
|
+
const components = toOpenApiComponents({
|
|
220
|
+
Node: {
|
|
221
|
+
type: 'object',
|
|
222
|
+
properties: { name: { type: 'string' }, children: { type: 'array', items: { $ref: '#' } } },
|
|
223
|
+
},
|
|
224
|
+
});
|
|
225
|
+
const props = components.Node.properties as JsonObject;
|
|
226
|
+
expect((props.children as JsonObject).items).toEqual({ $ref: '#/components/schemas/Node' });
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
it('does not mutate its input', () => {
|
|
230
|
+
const input = { A: { type: 'object', properties: { b: { $id: 'B', type: 'string' } } } };
|
|
231
|
+
const pristine = structuredClone(input);
|
|
232
|
+
toOpenApiComponents(input);
|
|
233
|
+
expect(input).toEqual(pristine);
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
it('rejects two different schemas claiming the same component name', () => {
|
|
237
|
+
expect(() =>
|
|
238
|
+
toOpenApiComponents({
|
|
239
|
+
A: { type: 'object', properties: { x: { $id: 'Dup', type: 'string' } } },
|
|
240
|
+
B: { type: 'object', properties: { y: { $id: 'Dup', type: 'number' } } },
|
|
241
|
+
}),
|
|
242
|
+
).toThrow(SchemaAdapterError);
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
describe('gate 8 — runtime enforcement uses the published components', () => {
|
|
247
|
+
it('rejects a request body that violates the published component, without mutating it', () => {
|
|
248
|
+
const payload: Record<string, unknown> = { name: 'Acme', rogue_field: 42 };
|
|
249
|
+
const result = validateApiRequest('UpdateAccountPayload', payload);
|
|
250
|
+
|
|
251
|
+
expect(result.valid).toBe(false);
|
|
252
|
+
if (!result.valid) {
|
|
253
|
+
expect(result.errors.join(' ')).toContain('additional properties');
|
|
254
|
+
}
|
|
255
|
+
// Reported, not deleted: removing it would make the server accept a body its own published
|
|
256
|
+
// schema calls invalid.
|
|
257
|
+
expect(payload.rogue_field).toBe(42);
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
it('accepts a conforming request body and hands back the component type', () => {
|
|
261
|
+
const result = validateApiRequest('UpdateAccountPayload', {
|
|
262
|
+
name: 'Acme',
|
|
263
|
+
billing: { method: 'stripe' },
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
expect(result.valid).toBe(true);
|
|
267
|
+
if (result.valid) {
|
|
268
|
+
// Typed as the component only on the valid branch, so a body missing required fields
|
|
269
|
+
// can never be typed as complete.
|
|
270
|
+
assertType<Equals<typeof result.data, UpdateAccountPayload>>(true);
|
|
271
|
+
expect(result.data.name).toBe('Acme');
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
it('no longer accepts quota_tier, which the handler never applied', () => {
|
|
276
|
+
// Documented-but-ignored is the drift this work removes. The tier is written through the
|
|
277
|
+
// admin quota API; accepting it here would eventually invite a "fix" that lets an account
|
|
278
|
+
// admin raise their own rate limits.
|
|
279
|
+
expect(validateApiRequest('UpdateAccountPayload', { quota_tier: 'enterprise' }).valid).toBe(false);
|
|
280
|
+
expect(ApiSchemaComponents.UpdateAccountPayload.properties).not.toHaveProperty('quota_tier');
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
it('enforces date-time formats, which AJV ignores without ajv-formats', () => {
|
|
284
|
+
// Registering the format package is what turns `format: date-time` from documentation into
|
|
285
|
+
// a check. Without it this payload would pass and the contract would be a suggestion.
|
|
286
|
+
const invalid = { ...VALID_ACCOUNT, created_at: 'yesterday' };
|
|
287
|
+
expect(validateApiResponse('Account', invalid).valid).toBe(false);
|
|
288
|
+
expect(validateApiResponse('Account', VALID_ACCOUNT).valid).toBe(true);
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
it('rejects a native Date where the schema declares a date-time string', () => {
|
|
292
|
+
// Response validation runs on the object before Koa serializes it, so a mapper that passed
|
|
293
|
+
// a Mongoose `Date` straight through would produce correct wire bytes and still be wrong
|
|
294
|
+
// here. That is precisely the bug the mapper's date normalization prevents.
|
|
295
|
+
const withDate = { ...VALID_ACCOUNT, created_at: new Date('2026-07-29T10:00:00.000Z') };
|
|
296
|
+
expect(validateApiResponse('Account', withDate).valid).toBe(false);
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
it('honours the Stripe discriminator, which the generated Go client does not', () => {
|
|
300
|
+
// The one backstop the Go client cannot provide. Its oneOf decoder picks a branch by
|
|
301
|
+
// required-property presence and never reads `status`, so it happily decodes the first
|
|
302
|
+
// payload below as the *enabled* branch (see openapi/go/tests). AJV does honour `const`,
|
|
303
|
+
// which is what lets the server detect its own drift: routing every branch of the handler
|
|
304
|
+
// through checkResponseContract turns "the server never emits a contradictory payload"
|
|
305
|
+
// from an assumption into something that shows up in the logs when it stops being true.
|
|
306
|
+
const enabled = { status: 'enabled', billing_method: 'stripe', portal_url: 'https://x' };
|
|
307
|
+
const disabled = { status: 'disabled', billing_method: null, reason: 'No billing method' };
|
|
308
|
+
expect(validateApiResponse('StripeBillingStatusResponse', enabled).valid).toBe(true);
|
|
309
|
+
expect(validateApiResponse('StripeBillingStatusResponse', disabled).valid).toBe(true);
|
|
310
|
+
|
|
311
|
+
// Enabled body, disabled discriminator: matches neither branch.
|
|
312
|
+
expect(validateApiResponse('StripeBillingStatusResponse', { ...enabled, status: 'disabled' }).valid).toBe(
|
|
313
|
+
false,
|
|
314
|
+
);
|
|
315
|
+
// Both branches' required properties: a real oneOf must match exactly one.
|
|
316
|
+
expect(validateApiResponse('StripeBillingStatusResponse', { ...enabled, reason: 'nope' }).valid).toBe(false);
|
|
317
|
+
});
|
|
318
|
+
});
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
// From the values module, never from `user.ts`: `user.ts` derives its public types from the schemas
|
|
3
|
+
// below, so importing it here would invert the dependency and make the source of truth circular.
|
|
4
|
+
import { ACCOUNT_APP_ACCESS_MESSAGE_MAX_LENGTH, AccountType, BillingMethod, QuotaTier } from '../account-values.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Runtime API schemas for the Accounts endpoints.
|
|
8
|
+
*
|
|
9
|
+
* These describe the WIRE shape — what actually crosses the HTTP boundary — which is not
|
|
10
|
+
* always what the hand-written interfaces in `user.ts` claim. Divergences are asserted in
|
|
11
|
+
* `account.contract.test.ts` rather than papered over.
|
|
12
|
+
*
|
|
13
|
+
* This module is only reachable through the `@vertesia/common/api-schemas` subpath. It must
|
|
14
|
+
* never be runtime-exported from the package root: `lib/index.js` is bundled wholesale into
|
|
15
|
+
* `lib/vertesia-common.js` and served to browsers, so a root re-export would ship zod to every
|
|
16
|
+
* UI user. The root may re-export the derived TYPES with `export type`, which tsc erases.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Shared enums carry an `id` so the adapter hoists them into named components and properties
|
|
21
|
+
* reference them, rather than each property carrying its own inline copy. The distinction is
|
|
22
|
+
* invisible to JSON Schema validation and decisive for codegen: a named component becomes one
|
|
23
|
+
* reusable Java/Go enum type, while inline copies become an anonymous type per property. These
|
|
24
|
+
* names also already exist in the published spec, so keeping them avoids a breaking rename for
|
|
25
|
+
* everyone generating from it.
|
|
26
|
+
*/
|
|
27
|
+
export const BillingMethodSchema = z.enum(BillingMethod).meta({ id: 'BillingMethod' });
|
|
28
|
+
export const AccountTypeSchema = z.enum(AccountType).meta({ id: 'AccountType' });
|
|
29
|
+
export const QuotaTierSchema = z.enum(QuotaTier).meta({
|
|
30
|
+
id: 'QuotaTier',
|
|
31
|
+
description:
|
|
32
|
+
'Quota/rate-limit tier assigned to an account. Code-defined tiers live in `@dglabs/quota` ' +
|
|
33
|
+
'(`QUOTA_TIERS`); these names must match its keys.\n' +
|
|
34
|
+
'- `standard` — protective baseline limits (the default for most accounts).\n' +
|
|
35
|
+
'- `enterprise` — high limits for contracted customers / internal / partners.\n\n' +
|
|
36
|
+
'An account with no explicit `quota_tier` derives its tier from its `account_type`.',
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
export const AccountBillingSchema = z
|
|
40
|
+
.object({
|
|
41
|
+
method: BillingMethodSchema,
|
|
42
|
+
stripe_customer_id: z.string().optional(),
|
|
43
|
+
})
|
|
44
|
+
.meta({ id: 'AccountBilling' });
|
|
45
|
+
|
|
46
|
+
export const AccountSchema = z
|
|
47
|
+
.object({
|
|
48
|
+
id: z.string(),
|
|
49
|
+
name: z.string(),
|
|
50
|
+
// JSDoc is invisible to `toJSONSchema` — a description only reaches the published spec
|
|
51
|
+
// through `.meta()`. These strings are the ones the TypeScript-derived spec used to carry.
|
|
52
|
+
namespace: z
|
|
53
|
+
.string()
|
|
54
|
+
.meta({ description: 'Public DNS-label-compatible identifier used by organization app domains.' })
|
|
55
|
+
.optional(),
|
|
56
|
+
app_access_message: z
|
|
57
|
+
.string()
|
|
58
|
+
.max(ACCOUNT_APP_ACCESS_MESSAGE_MAX_LENGTH)
|
|
59
|
+
.meta({
|
|
60
|
+
description: 'Plain-text instructions shown when a signed-in user has no application access.',
|
|
61
|
+
})
|
|
62
|
+
.optional(),
|
|
63
|
+
email_domains: z.array(z.string()),
|
|
64
|
+
// strictObject rather than object: the previously published spec closed this nested
|
|
65
|
+
// object, and STRICT_COMPONENTS only reaches top-level components.
|
|
66
|
+
onboarding: z.strictObject({
|
|
67
|
+
completed: z.boolean(),
|
|
68
|
+
/**
|
|
69
|
+
* String on the wire and optional: the Mongo field has no default and is only written
|
|
70
|
+
* when onboarding completes.
|
|
71
|
+
*/
|
|
72
|
+
completed_at: z.string().meta({ format: 'date-time' }).optional(),
|
|
73
|
+
}),
|
|
74
|
+
datacenter: z.string(),
|
|
75
|
+
account_type: AccountTypeSchema,
|
|
76
|
+
billing: AccountBillingSchema,
|
|
77
|
+
quota_tier: QuotaTierSchema.meta({
|
|
78
|
+
description: 'Quota/rate-limit tier. Unset → the deployment default tier (env `QUOTA_BASE_TIER`).',
|
|
79
|
+
}).optional(),
|
|
80
|
+
feature_flags: z
|
|
81
|
+
.record(z.string(), z.unknown())
|
|
82
|
+
.meta({
|
|
83
|
+
description:
|
|
84
|
+
'Ops-managed per-account feature flags. Untyped by design so operators can add / remove ' +
|
|
85
|
+
'temporary rollout gates without a schema change. Keys are enumerated in the admin UI from ' +
|
|
86
|
+
'a hardcoded registry (studio-server) — flags not in that registry are ignored. Not ' +
|
|
87
|
+
'modifiable through the public account API; admin API only.',
|
|
88
|
+
})
|
|
89
|
+
.optional(),
|
|
90
|
+
created_by: z.string(),
|
|
91
|
+
updated_by: z.string(),
|
|
92
|
+
created_at: z.string().meta({ format: 'date-time' }),
|
|
93
|
+
updated_at: z.string().meta({ format: 'date-time' }),
|
|
94
|
+
})
|
|
95
|
+
.meta({ id: 'Account' });
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* No `quota_tier`. The previously published payload declared it, but `PUT /account` never applied
|
|
99
|
+
* it — the field is written only through the admin quota API. Documenting a field the handler
|
|
100
|
+
* ignores is the drift this work exists to remove, and once request validation enforces the
|
|
101
|
+
* schema, a client sending it gets an honest 400 instead of silence. It also closes the door on a
|
|
102
|
+
* future "fix" that would let an account admin raise their own rate-limit tier through the public
|
|
103
|
+
* API.
|
|
104
|
+
*/
|
|
105
|
+
export const UpdateAccountPayloadSchema = z
|
|
106
|
+
.object({
|
|
107
|
+
name: z.string().optional(),
|
|
108
|
+
app_access_message: z.string().max(ACCOUNT_APP_ACCESS_MESSAGE_MAX_LENGTH).optional(),
|
|
109
|
+
email_domains: z.array(z.string()).optional(),
|
|
110
|
+
billing: AccountBillingSchema.optional(),
|
|
111
|
+
})
|
|
112
|
+
.meta({ id: 'UpdateAccountPayload' });
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Stripe billing status, modelled as a real discriminated union.
|
|
116
|
+
*
|
|
117
|
+
* The hand-written `StripeBillingStatusResponse` in `meters.ts` flattens this into one object
|
|
118
|
+
* with `portal_url?` and `reason?` both optional, so a generated Java/Go client gets two
|
|
119
|
+
* unrelated optionals and no way to know which is populated. The server only ever sets
|
|
120
|
+
* `portal_url` when enabled and `reason` when disabled.
|
|
121
|
+
*/
|
|
122
|
+
export const StripeBillingEnabledSchema = z
|
|
123
|
+
.object({
|
|
124
|
+
status: z.literal('enabled'),
|
|
125
|
+
/**
|
|
126
|
+
* Only ever `stripe`. The handler returns the enabled branch exclusively after checking
|
|
127
|
+
* `account.billing.method === BillingMethod.stripe`, so widening this to the full enum
|
|
128
|
+
* would describe states the server cannot produce.
|
|
129
|
+
*/
|
|
130
|
+
billing_method: z.literal(BillingMethod.stripe),
|
|
131
|
+
portal_url: z.string(),
|
|
132
|
+
})
|
|
133
|
+
.meta({ id: 'StripeBillingEnabled' });
|
|
134
|
+
|
|
135
|
+
export const StripeBillingDisabledSchema = z
|
|
136
|
+
.object({
|
|
137
|
+
status: z.literal('disabled'),
|
|
138
|
+
billing_method: BillingMethodSchema.nullable(),
|
|
139
|
+
reason: z.string(),
|
|
140
|
+
})
|
|
141
|
+
.meta({ id: 'StripeBillingDisabled' });
|
|
142
|
+
|
|
143
|
+
export const StripeBillingStatusResponseSchema = z
|
|
144
|
+
.discriminatedUnion('status', [StripeBillingEnabledSchema, StripeBillingDisabledSchema])
|
|
145
|
+
.meta({ id: 'StripeBillingStatusResponse' });
|
|
146
|
+
|
|
147
|
+
export type AccountBillingFromSchema = z.infer<typeof AccountBillingSchema>;
|
|
148
|
+
export type AccountFromSchema = z.infer<typeof AccountSchema>;
|
|
149
|
+
export type UpdateAccountPayloadFromSchema = z.infer<typeof UpdateAccountPayloadSchema>;
|
|
150
|
+
export type StripeBillingStatusResponseFromSchema = z.infer<typeof StripeBillingStatusResponseSchema>;
|