@vertesia/common 1.5.0-dev.20260725.083715Z → 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 +107 -1151
- 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 -115
- 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 +88 -778
- package/lib/interaction.d.ts.map +1 -1
- package/lib/interaction.js +8 -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 +57 -358
- 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 +61 -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 -700
- package/lib/store/store.d.ts.map +1 -1
- package/lib/store/store.js +4 -456
- 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 +54 -518
- package/lib/store/workflow.d.ts.map +1 -1
- package/lib/store/workflow.js +23 -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 +13 -4
- package/src/access-control-values.ts +113 -0
- package/src/access-control.ts +33 -138
- package/src/account-values.ts +95 -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 +234 -1213
- 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 -126
- 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 +162 -902
- 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 +93 -450
- package/src/store/collections.ts +21 -63
- package/src/store/content-type-editing.test.ts +1 -1
- package/src/store/conversation-state.ts +75 -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 -1204
- package/src/store/task.ts +25 -59
- package/src/store/workflow.ts +97 -557
- 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,268 @@
|
|
|
1
|
+
import { Ajv2020 } from 'ajv/dist/2020.js';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import { type ProjectRef, SystemRoles } from '../project.js';
|
|
4
|
+
import { TransientTokenType, type UserInviteToken, type UserInviteTokenData } from '../transient-tokens.js';
|
|
5
|
+
import type {
|
|
6
|
+
AccountProjectsResponse,
|
|
7
|
+
AccountRef,
|
|
8
|
+
InviteAcceptanceResponse,
|
|
9
|
+
InviteDeclineResponse,
|
|
10
|
+
InviteUserRequestPayload,
|
|
11
|
+
InviteUserResponsePayload,
|
|
12
|
+
OnboardingProgress,
|
|
13
|
+
} from '../user.js';
|
|
14
|
+
import type { JsonObject } from './adapter.js';
|
|
15
|
+
import type { UserInviteTokenArrayFromSchema, UserInviteTokenFromSchema } from './invites.js';
|
|
16
|
+
import { ApiSchemaComponents, apiComponentRef, validateApiRequest, validateApiResponse } from './registry.js';
|
|
17
|
+
|
|
18
|
+
/** Exact type identity — `extends` in both directions is too weak (any/unknown slip through). */
|
|
19
|
+
type Equals<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2 ? true : false;
|
|
20
|
+
function assertType<T extends true>(_ok: T): void {}
|
|
21
|
+
|
|
22
|
+
function compile(name: string) {
|
|
23
|
+
const ajv = new Ajv2020({ strictSchema: false, allErrors: true });
|
|
24
|
+
ajv.addSchema({ $id: 'vertesia://openapi', components: { schemas: ApiSchemaComponents } });
|
|
25
|
+
return ajv.compile({ $ref: `vertesia://openapi${apiComponentRef(name as never)}` });
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const VALID_INVITE = {
|
|
29
|
+
id: '68b1779130afe5403a1589bc',
|
|
30
|
+
type: TransientTokenType.userInvite,
|
|
31
|
+
data: {
|
|
32
|
+
email: 'grace@acme.test',
|
|
33
|
+
role: SystemRoles.developer,
|
|
34
|
+
account: { id: '68b1779130afe5403a1589ba', name: 'Acme' },
|
|
35
|
+
invited_by: { id: '68b1779130afe5403a1589bd', name: 'Ada Lovelace', email: 'ada@acme.test' },
|
|
36
|
+
},
|
|
37
|
+
expires: '2030-01-01T00:00:00.000Z',
|
|
38
|
+
created_at: '2026-01-01T00:00:00.000Z',
|
|
39
|
+
updated_at: '2026-01-02T00:00:00.000Z',
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* The component `TransientToken_UserInviteTokenData_Array` published before this batch, copied from
|
|
44
|
+
* the generated document verbatim.
|
|
45
|
+
*
|
|
46
|
+
* This is the migration's first outright WRONG component rather than a merely incomplete one, and
|
|
47
|
+
* the only way to keep checking a claim about a schema that no longer exists is to keep a copy of
|
|
48
|
+
* it. The scanner met `TransientToken<UserInviteTokenData>[]` and dropped BOTH the generic argument
|
|
49
|
+
* and the array: what it published describes a single object with none of the invite's content.
|
|
50
|
+
*/
|
|
51
|
+
const PREVIOUSLY_PUBLISHED_COMPONENT = {
|
|
52
|
+
type: 'object',
|
|
53
|
+
properties: {
|
|
54
|
+
id: { type: 'string' },
|
|
55
|
+
expires: { type: 'string', format: 'date-time' },
|
|
56
|
+
account: { type: 'string' },
|
|
57
|
+
created_at: { type: 'string', format: 'date-time' },
|
|
58
|
+
updated_at: { type: 'string', format: 'date-time' },
|
|
59
|
+
},
|
|
60
|
+
required: ['id', 'expires', 'created_at', 'updated_at'],
|
|
61
|
+
additionalProperties: false,
|
|
62
|
+
} as const;
|
|
63
|
+
|
|
64
|
+
describe('gate 1 — the schema is the single source of truth for the public invite types', () => {
|
|
65
|
+
it('publishes the exact schema-derived type, not a hand-written twin', () => {
|
|
66
|
+
assertType<Equals<UserInviteToken, UserInviteTokenFromSchema>>(true);
|
|
67
|
+
assertType<Equals<UserInviteTokenArrayFromSchema, UserInviteToken[]>>(true);
|
|
68
|
+
expect(true).toBe(true);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('projects the account rather than restating it', () => {
|
|
72
|
+
// `AccountRef` was the last hand-written twin in this closure, kept that way because
|
|
73
|
+
// `ExecutionRun` and `UserInviteTokenData` reach it through types the scanner derives and
|
|
74
|
+
// the scanner used to resolve a `z.infer<>` to nothing. It short-circuits such an alias to
|
|
75
|
+
// the published component now, so the type is inferred and there is nothing to hold to the
|
|
76
|
+
// schema — only the emission is still worth pinning.
|
|
77
|
+
expect(ApiSchemaComponents.AccountRef).toEqual({
|
|
78
|
+
type: 'object',
|
|
79
|
+
properties: {
|
|
80
|
+
id: (ApiSchemaComponents.Account.properties as Record<string, JsonObject>).id,
|
|
81
|
+
name: (ApiSchemaComponents.Account.properties as Record<string, JsonObject>).name,
|
|
82
|
+
},
|
|
83
|
+
required: ['id', 'name'],
|
|
84
|
+
additionalProperties: false,
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('picks the invite request from the payload it writes', () => {
|
|
89
|
+
const data = ApiSchemaComponents.UserInviteTokenData.properties as Record<string, JsonObject>;
|
|
90
|
+
const request = ApiSchemaComponents.InviteUserRequestPayload.properties as Record<string, JsonObject>;
|
|
91
|
+
expect(request).toEqual({ email: data.email, role: data.role });
|
|
92
|
+
// The three the server owns are what the pick leaves out, and naming them here is what makes
|
|
93
|
+
// adding a fourth writable field a decision rather than an accident.
|
|
94
|
+
expect(Object.keys(request)).not.toContain('account');
|
|
95
|
+
expect(Object.keys(request)).not.toContain('project');
|
|
96
|
+
expect(Object.keys(request)).not.toContain('invited_by');
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('types the invite timestamps as strings, and expires as required', () => {
|
|
100
|
+
// The generic `TransientToken<T>` still says `Date` — it describes the stored document, and
|
|
101
|
+
// `ITransientToken` in studio-server extends it. `UserInviteToken` is the wire shape, where
|
|
102
|
+
// the three are ISO strings; `toUserInviteTokenResponse` is what converts between them.
|
|
103
|
+
assertType<Equals<UserInviteToken['expires'], string>>(true);
|
|
104
|
+
assertType<Equals<UserInviteToken['created_at'], string>>(true);
|
|
105
|
+
assertType<Equals<UserInviteToken['account'], string | undefined>>(true);
|
|
106
|
+
expect(true).toBe(true);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it('types every reference as the populated object it is', () => {
|
|
110
|
+
// All three listings `.populate()` these before responding. Nothing in the old type said so
|
|
111
|
+
// — `TransientToken<UserInviteTokenData>` was reached through a cast — so an unpopulated
|
|
112
|
+
// query would have shipped bare ObjectIds under a component promising objects.
|
|
113
|
+
assertType<Equals<UserInviteTokenData['account'], AccountRef>>(true);
|
|
114
|
+
assertType<Equals<UserInviteTokenData['invited_by']['email'], string>>(true);
|
|
115
|
+
// `project` is the one optional reference: an account-wide invite has none.
|
|
116
|
+
assertType<Equals<UserInviteTokenData['project'], ProjectRef | undefined>>(true);
|
|
117
|
+
expect(true).toBe(true);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
describe('gate 2 — the published components match the closure the types come from', () => {
|
|
122
|
+
it('finally declares the invite payload the endpoints have always sent', () => {
|
|
123
|
+
const props = ApiSchemaComponents.TransientToken_UserInviteTokenData_.properties as Record<string, JsonObject>;
|
|
124
|
+
expect(props.type).toEqual({ $ref: '#/components/schemas/TransientTokenType' });
|
|
125
|
+
expect(props.data).toEqual({ $ref: '#/components/schemas/UserInviteTokenData' });
|
|
126
|
+
expect(Object.keys(props)).not.toContain('uid');
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it('publishes the listing as an array, which the endpoints have always returned', () => {
|
|
130
|
+
expect(ApiSchemaComponents.TransientToken_UserInviteTokenData_Array).toEqual({
|
|
131
|
+
type: 'array',
|
|
132
|
+
items: { $ref: '#/components/schemas/TransientToken_UserInviteTokenData_' },
|
|
133
|
+
});
|
|
134
|
+
// What it replaced.
|
|
135
|
+
expect(PREVIOUSLY_PUBLISHED_COMPONENT.type).toBe('object');
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
it('keeps AccountRef, ProjectRef and UserRef as the shared components they already were', () => {
|
|
139
|
+
const props = ApiSchemaComponents.UserInviteTokenData.properties as Record<string, JsonObject>;
|
|
140
|
+
expect(props.account).toEqual({ $ref: '#/components/schemas/AccountRef' });
|
|
141
|
+
expect(props.project).toEqual({ $ref: '#/components/schemas/ProjectRef' });
|
|
142
|
+
expect(props.invited_by).toEqual({ $ref: '#/components/schemas/UserRef' });
|
|
143
|
+
expect(props.role).toEqual({ $ref: '#/components/schemas/SystemRoles' });
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it('closes both invite components', () => {
|
|
147
|
+
expect(ApiSchemaComponents.TransientToken_UserInviteTokenData_.additionalProperties).toBe(false);
|
|
148
|
+
expect(ApiSchemaComponents.UserInviteTokenData.additionalProperties).toBe(false);
|
|
149
|
+
expect(ApiSchemaComponents.UserInviteTokenData.required).toEqual(['email', 'role', 'account', 'invited_by']);
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
describe('gate 3 — AJV validates the same canonical objects that are published', () => {
|
|
154
|
+
it('accepts a minimal invite and rejects a missing required field', () => {
|
|
155
|
+
const validate = compile('TransientToken_UserInviteTokenData_');
|
|
156
|
+
expect(validate(VALID_INVITE)).toBe(true);
|
|
157
|
+
const { data: _dropped, ...incomplete } = VALID_INVITE;
|
|
158
|
+
expect(validate(incomplete)).toBe(false);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it('requires expires, which the Mongoose schema leaves optional', () => {
|
|
162
|
+
const { expires: _dropped, ...withoutExpiry } = VALID_INVITE;
|
|
163
|
+
expect(compile('TransientToken_UserInviteTokenData_')(withoutExpiry)).toBe(false);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it('rejects an ObjectId string where a populated reference is declared', () => {
|
|
167
|
+
// The exact failure the mapper exists to prevent: a listing added without `.populate()`.
|
|
168
|
+
const validate = compile('TransientToken_UserInviteTokenData_');
|
|
169
|
+
const unpopulated = { ...VALID_INVITE, data: { ...VALID_INVITE.data, account: '68b1779130afe5403a1589ba' } };
|
|
170
|
+
expect(validate(unpopulated)).toBe(false);
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
it('rejects uid, the external-identity match key that is not part of the payload', () => {
|
|
174
|
+
const validate = compile('TransientToken_UserInviteTokenData_');
|
|
175
|
+
expect(validate({ ...VALID_INVITE, data: { ...VALID_INVITE.data, uid: 'firebase-uid' } })).toBe(false);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
it('rejects the internal fields a serialized document would have leaked', () => {
|
|
179
|
+
const validate = compile('TransientToken_UserInviteTokenData_');
|
|
180
|
+
expect(validate({ ...VALID_INVITE, _id: 'deadbeef' })).toBe(false);
|
|
181
|
+
expect(validate({ ...VALID_INVITE, __v: 0 })).toBe(false);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it('constrains the token type and the invited role to their catalogs', () => {
|
|
185
|
+
const validate = compile('TransientToken_UserInviteTokenData_');
|
|
186
|
+
expect(validate({ ...VALID_INVITE, type: 'password-reset' })).toBe(false);
|
|
187
|
+
expect(validate({ ...VALID_INVITE, type: TransientTokenType.migration })).toBe(true);
|
|
188
|
+
expect(validate({ ...VALID_INVITE, data: { ...VALID_INVITE.data, role: 'superuser' } })).toBe(false);
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
it('validates the invite request and the three fixed-shape responses', () => {
|
|
192
|
+
expect(compile('InviteUserRequestPayload')({ email: 'g@acme.test', role: SystemRoles.reader })).toBe(true);
|
|
193
|
+
expect(compile('InviteUserRequestPayload')({ email: 'g@acme.test' })).toBe(false);
|
|
194
|
+
expect(compile('InviteUserResponsePayload')({ action: 'invited' })).toBe(true);
|
|
195
|
+
expect(compile('InviteUserResponsePayload')({ action: 'ignored' })).toBe(false);
|
|
196
|
+
expect(compile('InviteAcceptanceResponse')({ status: 'added' })).toBe(true);
|
|
197
|
+
expect(compile('InviteDeclineResponse')({ status: 'deleted' })).toBe(true);
|
|
198
|
+
expect(compile('InviteDeclineResponse')({ status: 'added' })).toBe(false);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it('requires all four onboarding flags rather than treating absence as false', () => {
|
|
202
|
+
const validate = compile('OnboardingProgress');
|
|
203
|
+
const progress = {
|
|
204
|
+
interactions: true,
|
|
205
|
+
prompts: false,
|
|
206
|
+
environments: true,
|
|
207
|
+
default_environment_defined: false,
|
|
208
|
+
};
|
|
209
|
+
expect(validate(progress)).toBe(true);
|
|
210
|
+
const { prompts: _dropped, ...partial } = progress;
|
|
211
|
+
expect(validate(partial)).toBe(false);
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
describe('gate 4 — runtime enforcement uses the published components', () => {
|
|
216
|
+
it('checks every member of a listing against the same invite component', () => {
|
|
217
|
+
expect(validateApiResponse('TransientToken_UserInviteTokenData_Array', [VALID_INVITE]).valid).toBe(true);
|
|
218
|
+
expect(validateApiResponse('TransientToken_UserInviteTokenData_Array', []).valid).toBe(true);
|
|
219
|
+
const unpopulated = { ...VALID_INVITE, data: { ...VALID_INVITE.data, invited_by: 'ada' } };
|
|
220
|
+
expect(validateApiResponse('TransientToken_UserInviteTokenData_Array', [VALID_INVITE, unpopulated]).valid).toBe(
|
|
221
|
+
false,
|
|
222
|
+
);
|
|
223
|
+
// A bare object rather than an array — what the old component described and no endpoint sent.
|
|
224
|
+
expect(validateApiResponse('TransientToken_UserInviteTokenData_Array', VALID_INVITE).valid).toBe(false);
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
it('rejects an undeclared invite request field without removing it', () => {
|
|
228
|
+
const payload: Record<string, unknown> = { email: 'g@acme.test', role: SystemRoles.reader, rogue_field: 42 };
|
|
229
|
+
const result = validateApiRequest('InviteUserRequestPayload', payload);
|
|
230
|
+
expect(result.valid).toBe(false);
|
|
231
|
+
expect(payload.rogue_field).toBe(42);
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
it('hands back the component type on the valid branch', () => {
|
|
235
|
+
const result = validateApiResponse('TransientToken_UserInviteTokenData_Array', [VALID_INVITE]);
|
|
236
|
+
expect(result.valid).toBe(true);
|
|
237
|
+
if (result.valid) {
|
|
238
|
+
assertType<Equals<typeof result.data, UserInviteToken[]>>(true);
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
it('checks the account project listing envelope', () => {
|
|
243
|
+
const ref = { id: '69d4762f24d3048c99149d0b', name: 'Research', account: '68b1779130afe5403a1589ba' };
|
|
244
|
+
expect(validateApiResponse('AccountProjectsResponse', { data: [ref] }).valid).toBe(true);
|
|
245
|
+
expect(validateApiResponse('AccountProjectsResponse', { data: [] }).valid).toBe(true);
|
|
246
|
+
// An envelope, not a bare array — which is what the document already published.
|
|
247
|
+
expect(validateApiResponse('AccountProjectsResponse', [ref]).valid).toBe(false);
|
|
248
|
+
assertType<Equals<AccountProjectsResponse['data'], ProjectRef[]>>(true);
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
it('enforces the date-time format through the registry validator', () => {
|
|
252
|
+
// The local `compile()` deliberately omits ajv-formats, so a malformed timestamp has to be
|
|
253
|
+
// checked here or the assertion passes vacuously.
|
|
254
|
+
expect(
|
|
255
|
+
validateApiResponse('TransientToken_UserInviteTokenData_Array', [{ ...VALID_INVITE, expires: 'next year' }])
|
|
256
|
+
.valid,
|
|
257
|
+
).toBe(false);
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
it('keeps the fixed-shape responses typed as their literals', () => {
|
|
261
|
+
assertType<Equals<InviteAcceptanceResponse['status'], 'added'>>(true);
|
|
262
|
+
assertType<Equals<InviteDeclineResponse['status'], 'deleted'>>(true);
|
|
263
|
+
assertType<Equals<InviteUserResponsePayload['action'], 'invited' | 'added'>>(true);
|
|
264
|
+
assertType<Equals<InviteUserRequestPayload['email'], string>>(true);
|
|
265
|
+
assertType<Equals<OnboardingProgress['prompts'], boolean>>(true);
|
|
266
|
+
expect(true).toBe(true);
|
|
267
|
+
});
|
|
268
|
+
});
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
// From the values module, for the reason `./apikey.js` gives.
|
|
3
|
+
import { TransientTokenType } from '../transient-tokens-values.js';
|
|
4
|
+
import { AccountSchema } from './account.js';
|
|
5
|
+
import { ProjectRefSchema, SystemRolesSchema } from './apikey.js';
|
|
6
|
+
import { UserRefSchema } from './user.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Runtime API schemas for account invites, onboarding, and project listings.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export const TransientTokenTypeSchema = z.enum(TransientTokenType).meta({ id: 'TransientTokenType' });
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The compact account shape embedded in other resources' responses.
|
|
16
|
+
*
|
|
17
|
+
* Picked from {@link AccountSchema} rather than restated, for the reason `UserRef` is picked from
|
|
18
|
+
* `User`: two declarations of one projection can only drift. `.pick()` keeps the parent's property
|
|
19
|
+
* order and drops its `meta.id`, so this still publishes as its own component rather than a `$ref`,
|
|
20
|
+
* and the emitted JSON stays stable.
|
|
21
|
+
*
|
|
22
|
+
* `AccountRefPopulate` is the Mongoose projection that produces it; the two are meant to stay in
|
|
23
|
+
* step.
|
|
24
|
+
*/
|
|
25
|
+
export const AccountRefSchema = AccountSchema.pick({
|
|
26
|
+
id: true,
|
|
27
|
+
name: true,
|
|
28
|
+
}).meta({ id: 'AccountRef' });
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The invite payload. Every reference is populated by the handlers before the response is built —
|
|
32
|
+
* `data.account`, `data.project` and `data.invited_by` all go through `.populate()` — which is why
|
|
33
|
+
* they are object refs here and ObjectIds in Mongo.
|
|
34
|
+
*/
|
|
35
|
+
export const UserInviteTokenDataSchema = z
|
|
36
|
+
.object({
|
|
37
|
+
email: z.string(),
|
|
38
|
+
role: SystemRolesSchema,
|
|
39
|
+
account: AccountRefSchema,
|
|
40
|
+
project: ProjectRefSchema.optional(),
|
|
41
|
+
invited_by: UserRefSchema,
|
|
42
|
+
})
|
|
43
|
+
.meta({ id: 'UserInviteTokenData' });
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* The invite token as it crosses the wire.
|
|
47
|
+
*
|
|
48
|
+
* Named for the generic instantiation the document already publishes, so the component name does not
|
|
49
|
+
* change under consumers even though its content finally becomes correct. `expires` is required here
|
|
50
|
+
* because every invite is created with a 30-day expiry; the model leaves it optional, and the mapper
|
|
51
|
+
* is what reconciles the two.
|
|
52
|
+
*/
|
|
53
|
+
export const UserInviteTokenSchema = z
|
|
54
|
+
.object({
|
|
55
|
+
id: z.string(),
|
|
56
|
+
type: TransientTokenTypeSchema,
|
|
57
|
+
data: UserInviteTokenDataSchema,
|
|
58
|
+
expires: z.string().meta({ format: 'date-time' }),
|
|
59
|
+
account: z.string().optional(),
|
|
60
|
+
created_at: z.string().meta({ format: 'date-time' }),
|
|
61
|
+
updated_at: z.string().meta({ format: 'date-time' }),
|
|
62
|
+
})
|
|
63
|
+
.meta({ id: 'TransientToken_UserInviteTokenData_' });
|
|
64
|
+
|
|
65
|
+
export const UserInviteTokenArraySchema = z
|
|
66
|
+
.array(UserInviteTokenSchema)
|
|
67
|
+
.meta({ id: 'TransientToken_UserInviteTokenData_Array' });
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* What `POST /account/invites` accepts: the two fields of the invite payload the caller supplies.
|
|
71
|
+
*
|
|
72
|
+
* Picked from {@link UserInviteTokenDataSchema}, which is the resource this request writes — the
|
|
73
|
+
* remaining three (`account`, `project`, `invited_by`) are server-owned, and leaving them out of the
|
|
74
|
+
* pick is what makes that an explicit list rather than an emergent property of two files agreeing.
|
|
75
|
+
*/
|
|
76
|
+
export const InviteUserRequestPayloadSchema = UserInviteTokenDataSchema.pick({
|
|
77
|
+
email: true,
|
|
78
|
+
role: true,
|
|
79
|
+
}).meta({ id: 'InviteUserRequestPayload' });
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* `invited` and `added` are both reachable, though only `invited` is returned today: the handler
|
|
83
|
+
* always creates a token. The literal set is what the published component declares and is kept.
|
|
84
|
+
*/
|
|
85
|
+
export const InviteUserResponsePayloadSchema = z
|
|
86
|
+
.object({
|
|
87
|
+
action: z.enum(['invited', 'added']),
|
|
88
|
+
})
|
|
89
|
+
.meta({ id: 'InviteUserResponsePayload' });
|
|
90
|
+
|
|
91
|
+
export const InviteAcceptanceResponseSchema = z
|
|
92
|
+
.object({
|
|
93
|
+
status: z.literal('added'),
|
|
94
|
+
})
|
|
95
|
+
.meta({ id: 'InviteAcceptanceResponse' });
|
|
96
|
+
|
|
97
|
+
export const InviteDeclineResponseSchema = z
|
|
98
|
+
.object({
|
|
99
|
+
status: z.literal('deleted'),
|
|
100
|
+
})
|
|
101
|
+
.meta({ id: 'InviteDeclineResponse' });
|
|
102
|
+
|
|
103
|
+
export const OnboardingProgressSchema = z
|
|
104
|
+
.object({
|
|
105
|
+
interactions: z.boolean(),
|
|
106
|
+
prompts: z.boolean(),
|
|
107
|
+
environments: z.boolean(),
|
|
108
|
+
default_environment_defined: z.boolean(),
|
|
109
|
+
})
|
|
110
|
+
.meta({ id: 'OnboardingProgress' });
|
|
111
|
+
|
|
112
|
+
/** An envelope rather than a bare array, which is what the document already publishes. */
|
|
113
|
+
export const AccountProjectsResponseSchema = z
|
|
114
|
+
.object({
|
|
115
|
+
data: z.array(ProjectRefSchema),
|
|
116
|
+
})
|
|
117
|
+
.meta({ id: 'AccountProjectsResponse' });
|
|
118
|
+
|
|
119
|
+
export type UserInviteTokenDataFromSchema = z.infer<typeof UserInviteTokenDataSchema>;
|
|
120
|
+
export type UserInviteTokenFromSchema = z.infer<typeof UserInviteTokenSchema>;
|
|
121
|
+
export type UserInviteTokenArrayFromSchema = z.infer<typeof UserInviteTokenArraySchema>;
|
|
122
|
+
export type InviteUserRequestPayloadFromSchema = z.infer<typeof InviteUserRequestPayloadSchema>;
|
|
123
|
+
export type InviteUserResponsePayloadFromSchema = z.infer<typeof InviteUserResponsePayloadSchema>;
|
|
124
|
+
export type InviteAcceptanceResponseFromSchema = z.infer<typeof InviteAcceptanceResponseSchema>;
|
|
125
|
+
export type InviteDeclineResponseFromSchema = z.infer<typeof InviteDeclineResponseSchema>;
|
|
126
|
+
export type OnboardingProgressFromSchema = z.infer<typeof OnboardingProgressSchema>;
|
|
127
|
+
export type AccountProjectsResponseFromSchema = z.infer<typeof AccountProjectsResponseSchema>;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import type { JSONSchema, ModelOptions } from '@llumiverse/common';
|
|
2
|
+
import { Ajv2020 } from 'ajv/dist/2020.js';
|
|
3
|
+
import { describe, expect, it } from 'vitest';
|
|
4
|
+
import type { JsonObject } from './adapter.js';
|
|
5
|
+
import { ApiSchemaComponents, apiComponentRef, validateApiRequest } from './registry.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The two llumiverse closures the registry publishes: `ModelOptions` with its twenty-three driver
|
|
9
|
+
* option sets and four enums, and `JSONSchema` with its property map.
|
|
10
|
+
*
|
|
11
|
+
* Their schemas live in `@llumiverse/common/schemas` — they describe llumiverse's types, and a copy
|
|
12
|
+
* here would be exactly the drift this migration removes. What is checked HERE is the half that
|
|
13
|
+
* llumiverse cannot see: that the registry publishes them, that the published bytes are what AJV
|
|
14
|
+
* enforces, and that the two closures are open or closed in the direction their contract requires.
|
|
15
|
+
*/
|
|
16
|
+
function compile(name: string) {
|
|
17
|
+
const ajv = new Ajv2020({ strictSchema: false, allErrors: true });
|
|
18
|
+
ajv.addSchema({ $id: 'vertesia://openapi', components: { schemas: ApiSchemaComponents } });
|
|
19
|
+
return ajv.compile({ $ref: `vertesia://openapi${apiComponentRef(name as never)}` });
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const UNION_MEMBERS = [
|
|
23
|
+
'TextFallbackOptions',
|
|
24
|
+
'ImagenOptions',
|
|
25
|
+
'VertexAIClaudeOptions',
|
|
26
|
+
'VertexAIGeminiOptions',
|
|
27
|
+
'VertexAIGrokOptions',
|
|
28
|
+
'NovaCanvasOptions',
|
|
29
|
+
'BedrockConverseOptions',
|
|
30
|
+
'BedrockNovaOptions',
|
|
31
|
+
'BedrockMistralOptions',
|
|
32
|
+
'BedrockAI21Options',
|
|
33
|
+
'BedrockCohereCommandOptions',
|
|
34
|
+
'BedrockClaudeOptions',
|
|
35
|
+
'BedrockPalmyraOptions',
|
|
36
|
+
'BedrockGptOssOptions',
|
|
37
|
+
'TwelvelabsPegasusOptions',
|
|
38
|
+
'BedrockMantleResponsesOptions',
|
|
39
|
+
'BedrockMantleChatCompletionsOptions',
|
|
40
|
+
'BedrockMantleClaudeOptions',
|
|
41
|
+
'OpenAiThinkingOptions',
|
|
42
|
+
'OpenAiTextOptions',
|
|
43
|
+
'OpenAiDalleOptions',
|
|
44
|
+
'OpenAiGptImageOptions',
|
|
45
|
+
'GroqOptions',
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
describe('the ModelOptions closure is published whole and enforced closed', () => {
|
|
49
|
+
it('hoists every union member and enum into its own component', () => {
|
|
50
|
+
// The adapter hoists on `.meta({id})`, so a member that lost its id would be inlined into the
|
|
51
|
+
// union instead — the document would still be valid and generated clients would lose the
|
|
52
|
+
// named subtype. Nothing else notices.
|
|
53
|
+
for (const name of [...UNION_MEMBERS, 'ImagenMaskMode', 'ImagenTaskType', 'ThinkingLevel', 'ReasoningEffort']) {
|
|
54
|
+
expect(ApiSchemaComponents[name], name).toBeDefined();
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('publishes a discriminator whose mapping covers every member', () => {
|
|
59
|
+
const union = ApiSchemaComponents.ModelOptions as JsonObject & {
|
|
60
|
+
oneOf: { $ref: string }[];
|
|
61
|
+
discriminator: { propertyName: string; mapping: Record<string, string> };
|
|
62
|
+
};
|
|
63
|
+
expect(union.discriminator.propertyName).toBe('_option_id');
|
|
64
|
+
expect(union.oneOf.map((member) => member.$ref)).toEqual(
|
|
65
|
+
UNION_MEMBERS.map((name) => `#/components/schemas/${name}`),
|
|
66
|
+
);
|
|
67
|
+
// A mapping short of the `oneOf` is the failure that matters: a generated Java or Go client
|
|
68
|
+
// reads the mapping to pick the concrete subtype and falls back to a loose map without it.
|
|
69
|
+
expect(new Set(Object.values(union.discriminator.mapping))).toEqual(new Set(union.oneOf.map((m) => m.$ref)));
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('enforces the closure it documents — an undeclared option is rejected, not ignored', () => {
|
|
73
|
+
const validate = compile('ModelOptions');
|
|
74
|
+
const options: ModelOptions = { _option_id: 'text-fallback', max_tokens: 100, temperature: 0.7 };
|
|
75
|
+
expect(validate(options), JSON.stringify(validate.errors)).toBe(true);
|
|
76
|
+
// Both halves matter. `additionalProperties: false` in the document with an AJV that accepts
|
|
77
|
+
// the extra is the spec/enforcement gap this design exists to close; the assertion on the
|
|
78
|
+
// published byte alone would not catch it.
|
|
79
|
+
expect((ApiSchemaComponents.TextFallbackOptions as JsonObject).additionalProperties).toBe(false);
|
|
80
|
+
expect(validate({ _option_id: 'text-fallback', top_p: 0.9, unknown_option: 1 })).toBe(false);
|
|
81
|
+
expect(validate({ _option_id: 'not-a-driver' })).toBe(false);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
describe('the JSONSchema closure is published open, because a JSON Schema is open', () => {
|
|
86
|
+
it('accepts keywords the type never enumerated', () => {
|
|
87
|
+
// The opposite decision from ModelOptions, for the opposite reason. `JSONSchema` names nine
|
|
88
|
+
// fields and real schemas carry `enum`, `oneOf`, `minimum`, `$ref` and the rest. Closing it
|
|
89
|
+
// would 400 nearly every schema a caller sends, so it must publish no `additionalProperties`
|
|
90
|
+
// and AJV must let those keywords through.
|
|
91
|
+
expect((ApiSchemaComponents.JSONSchema as JsonObject).additionalProperties).toBeUndefined();
|
|
92
|
+
const schema: JSONSchema = {
|
|
93
|
+
type: 'object',
|
|
94
|
+
properties: { status: { type: 'string', enum: ['draft', 'live'] } },
|
|
95
|
+
required: ['status'],
|
|
96
|
+
$comment: 'not a declared field',
|
|
97
|
+
};
|
|
98
|
+
const result = validateApiRequest('JSONSchema', schema);
|
|
99
|
+
expect(result.valid ? [] : result.errors).toEqual([]);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it('still checks the fields it does declare', () => {
|
|
103
|
+
// Open is not unchecked: a declared field with the wrong type is a real contract violation
|
|
104
|
+
// and has to fail, or the component would be documentation rather than a schema.
|
|
105
|
+
expect(validateApiRequest('JSONSchema', { description: 42 }).valid).toBe(false);
|
|
106
|
+
expect(validateApiRequest('JSONSchema', { required: 'status' }).valid).toBe(false);
|
|
107
|
+
});
|
|
108
|
+
});
|