@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,110 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { SystemRolesSchema } from './apikey.js';
|
|
3
|
+
|
|
4
|
+
const ALGORITHM_DESCRIPTION = 'Signing algorithm - defaults to ES256. Use RS256 for Azure AD compatibility.';
|
|
5
|
+
|
|
6
|
+
export const TokenTypeSchema = z.enum(['apikey', 'user', 'project', 'environment', 'agent', 'service_account']);
|
|
7
|
+
|
|
8
|
+
export const SigningAlgorithmSchema = z.enum(['ES256', 'RS256']).meta({ id: 'SigningAlgorithm' });
|
|
9
|
+
|
|
10
|
+
const baseTokenRequestShape = {
|
|
11
|
+
audience: z.string().optional(),
|
|
12
|
+
algorithm: SigningAlgorithmSchema.meta({ description: ALGORITHM_DESCRIPTION }).optional(),
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export const ApiKeyTokenRequestSchema = z
|
|
16
|
+
.strictObject({
|
|
17
|
+
type: z.literal('apikey'),
|
|
18
|
+
...baseTokenRequestShape,
|
|
19
|
+
key: z.string(),
|
|
20
|
+
})
|
|
21
|
+
.meta({ id: 'ApiKeyTokenRequest', required: ['key', 'type'] });
|
|
22
|
+
|
|
23
|
+
export const UserTokenRequestSchema = z
|
|
24
|
+
.strictObject({
|
|
25
|
+
type: z.literal('user'),
|
|
26
|
+
...baseTokenRequestShape,
|
|
27
|
+
user_id: z.string().optional(),
|
|
28
|
+
account_id: z.string().optional(),
|
|
29
|
+
project_id: z.string().optional(),
|
|
30
|
+
expires_at: z.number().optional(),
|
|
31
|
+
on_behalf_of: z.string().optional(),
|
|
32
|
+
})
|
|
33
|
+
.meta({ id: 'UserTokenRequest' });
|
|
34
|
+
|
|
35
|
+
export const ProjectTokenRequestSchema = z
|
|
36
|
+
.strictObject({
|
|
37
|
+
type: z.literal('project'),
|
|
38
|
+
...baseTokenRequestShape,
|
|
39
|
+
project_id: z.string(),
|
|
40
|
+
account_id: z.string(),
|
|
41
|
+
})
|
|
42
|
+
.meta({ id: 'ProjectTokenRequest', required: ['account_id', 'project_id', 'type'] });
|
|
43
|
+
|
|
44
|
+
export const EnvironmentTokenRequestSchema = z
|
|
45
|
+
.strictObject({
|
|
46
|
+
type: z.literal('environment'),
|
|
47
|
+
...baseTokenRequestShape,
|
|
48
|
+
environment_id: z.string(),
|
|
49
|
+
environment_name: z.string(),
|
|
50
|
+
project_id: z.string(),
|
|
51
|
+
account_id: z.string(),
|
|
52
|
+
})
|
|
53
|
+
.meta({
|
|
54
|
+
id: 'EnvironmentTokenRequest',
|
|
55
|
+
required: ['account_id', 'environment_id', 'environment_name', 'project_id', 'type'],
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
export const AgentTokenRequestSchema = z
|
|
59
|
+
.strictObject({
|
|
60
|
+
type: z.literal('agent'),
|
|
61
|
+
...baseTokenRequestShape,
|
|
62
|
+
account_id: z.string(),
|
|
63
|
+
project_id: z.string(),
|
|
64
|
+
name: z.string().optional(),
|
|
65
|
+
on_behalf_of: z.string().meta({
|
|
66
|
+
description:
|
|
67
|
+
'User information.\n\nThe value of this field can be either: - a signed Vertesia token used to verify the user context - a user ID prefixed with `user:` to indicate the user on behalf of whom the agent is acting.',
|
|
68
|
+
}),
|
|
69
|
+
})
|
|
70
|
+
.meta({
|
|
71
|
+
id: 'AgentTokenRequest',
|
|
72
|
+
required: ['account_id', 'on_behalf_of', 'project_id', 'type'],
|
|
73
|
+
description:
|
|
74
|
+
'Agent token for a service account to act as agent on behalf of a user.\n\nTwo trust paths are supported:\n\n- `user_access_token`: a live signed Vertesia token. STS verifies the user context from that token.\n- `workload_id_token`: a workload acts on behalf of a user. It implies that a full verification will be performed based on the workload identity.',
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
export const ServiceAccountTokenRequestSchema = z
|
|
78
|
+
.strictObject({
|
|
79
|
+
type: z.literal('service_account'),
|
|
80
|
+
...baseTokenRequestShape,
|
|
81
|
+
account_id: z.string(),
|
|
82
|
+
project_id: z.string(),
|
|
83
|
+
roles: z.array(SystemRolesSchema).optional(),
|
|
84
|
+
name: z.string().optional(),
|
|
85
|
+
email: z.string().optional(),
|
|
86
|
+
})
|
|
87
|
+
.meta({ id: 'ServiceAccountTokenRequest', required: ['account_id', 'project_id', 'type'] });
|
|
88
|
+
|
|
89
|
+
export const IssueTokenRequestSchema = z
|
|
90
|
+
.discriminatedUnion('type', [
|
|
91
|
+
ApiKeyTokenRequestSchema,
|
|
92
|
+
UserTokenRequestSchema,
|
|
93
|
+
ProjectTokenRequestSchema,
|
|
94
|
+
EnvironmentTokenRequestSchema,
|
|
95
|
+
AgentTokenRequestSchema,
|
|
96
|
+
ServiceAccountTokenRequestSchema,
|
|
97
|
+
])
|
|
98
|
+
.meta({ id: 'IssueTokenRequest' });
|
|
99
|
+
|
|
100
|
+
export const IssueTokenResponseSchema = z
|
|
101
|
+
.strictObject({
|
|
102
|
+
token: z.string(),
|
|
103
|
+
token_type: z.literal('Bearer'),
|
|
104
|
+
expires_in: z.number().optional(),
|
|
105
|
+
})
|
|
106
|
+
.meta({ id: 'IssueTokenResponse' });
|
|
107
|
+
|
|
108
|
+
export const IssueTokenUnavailableResponseSchema = z
|
|
109
|
+
.strictObject({ error: z.string(), message: z.string() })
|
|
110
|
+
.meta({ id: 'IssueTokenUnavailableResponse' });
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
export const CompleteTaskPayloadSchema = z
|
|
4
|
+
.strictObject({
|
|
5
|
+
result: z.looseObject({}),
|
|
6
|
+
})
|
|
7
|
+
.meta({ id: 'CompleteTaskPayload' });
|
|
8
|
+
|
|
9
|
+
export const TaskFieldTypeSchema = z
|
|
10
|
+
.enum(['string', 'number', 'boolean', 'select', 'text'])
|
|
11
|
+
.meta({ id: 'TaskFieldType' });
|
|
12
|
+
|
|
13
|
+
export const DurableTaskStatusSchema = z.enum(['pending', 'in_progress', 'completed', 'cancelled']).meta({
|
|
14
|
+
id: 'DurableTaskStatus',
|
|
15
|
+
description: 'Durable human task types used by process human_task nodes and agent asks.',
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
export const TaskSourceSchema = z
|
|
19
|
+
.strictObject({
|
|
20
|
+
type: z.enum(['process', 'agent']),
|
|
21
|
+
run_id: z.string(),
|
|
22
|
+
node: z.string().optional(),
|
|
23
|
+
ask_id: z.string().optional(),
|
|
24
|
+
})
|
|
25
|
+
.meta({ id: 'TaskSource' });
|
|
26
|
+
|
|
27
|
+
export const TaskFieldSchema = z
|
|
28
|
+
.strictObject({
|
|
29
|
+
name: z.string(),
|
|
30
|
+
type: TaskFieldTypeSchema,
|
|
31
|
+
required: z.boolean().optional(),
|
|
32
|
+
label: z.string().optional(),
|
|
33
|
+
options: z.array(z.string()).optional(),
|
|
34
|
+
default: z.unknown().optional(),
|
|
35
|
+
})
|
|
36
|
+
.meta({ id: 'TaskField' });
|
|
37
|
+
|
|
38
|
+
export const CreateTaskPayloadSchema = z
|
|
39
|
+
.strictObject({
|
|
40
|
+
title: z.string(),
|
|
41
|
+
description: z.string().optional(),
|
|
42
|
+
assignee: z.string().optional(),
|
|
43
|
+
fields: z.array(TaskFieldSchema).optional(),
|
|
44
|
+
source: TaskSourceSchema,
|
|
45
|
+
due_at: z.string().meta({ format: 'date-time' }).optional(),
|
|
46
|
+
})
|
|
47
|
+
.meta({ id: 'CreateTaskPayload' });
|
|
48
|
+
|
|
49
|
+
export const TaskSchema = z
|
|
50
|
+
.strictObject({
|
|
51
|
+
id: z.string(),
|
|
52
|
+
account: z.string(),
|
|
53
|
+
project: z.string(),
|
|
54
|
+
title: z.string(),
|
|
55
|
+
description: z.string().optional(),
|
|
56
|
+
status: DurableTaskStatusSchema,
|
|
57
|
+
assignee: z.string().optional(),
|
|
58
|
+
fields: z.array(TaskFieldSchema),
|
|
59
|
+
result: z.looseObject({}).optional(),
|
|
60
|
+
source: TaskSourceSchema,
|
|
61
|
+
due_at: z.string().meta({ format: 'date-time' }).optional(),
|
|
62
|
+
created_at: z.string().meta({ format: 'date-time' }),
|
|
63
|
+
completed_at: z.string().meta({ format: 'date-time' }).optional(),
|
|
64
|
+
updated_at: z.string().meta({ format: 'date-time' }).optional(),
|
|
65
|
+
})
|
|
66
|
+
.meta({ id: 'Task' });
|
|
67
|
+
|
|
68
|
+
export const UpdateTaskPayloadSchema = z
|
|
69
|
+
.strictObject({
|
|
70
|
+
title: z.string().optional(),
|
|
71
|
+
description: z.string().optional(),
|
|
72
|
+
status: DurableTaskStatusSchema.optional(),
|
|
73
|
+
assignee: z.string().nullable().optional(),
|
|
74
|
+
fields: z.array(TaskFieldSchema).optional(),
|
|
75
|
+
due_at: z.union([z.string().meta({ format: 'date-time' }), z.null()]).optional(),
|
|
76
|
+
})
|
|
77
|
+
.meta({ id: 'UpdateTaskPayload' });
|
|
78
|
+
|
|
79
|
+
export const TaskArraySchema = z.array(TaskSchema).meta({ id: 'TaskArray' });
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* The `GET /tasks` query contract.
|
|
83
|
+
*
|
|
84
|
+
* `source_type` reuses `TaskSourceSchema.shape.type` rather than restating `'process' | 'agent'`.
|
|
85
|
+
* The scanner-opacity problem that forced spelling it out in TypeScript was specific to
|
|
86
|
+
* `TaskSource['type']`: an indexed access into a canonical alias reads as nothing to a scanner that
|
|
87
|
+
* works from source text, and the parameter silently vanished from the published operation. Zod is a
|
|
88
|
+
* value, so reaching into its shape is an ordinary property read and the enum arrives intact.
|
|
89
|
+
*
|
|
90
|
+
* `status` is published as a single `type: array` parameter with `explode: true` — the scanner
|
|
91
|
+
* collapses `X | X[]` that way, because repeated keys are the only serialization OpenAPI has for it.
|
|
92
|
+
* The runtime additionally accepts the comma-joined spelling the SDK emits; see `commaSafeEnum` in
|
|
93
|
+
* `./parameters.js` for why that is safe for an enum specifically.
|
|
94
|
+
*/
|
|
95
|
+
export const ListTasksQuerySchema = z
|
|
96
|
+
.strictObject({
|
|
97
|
+
status: z.union([DurableTaskStatusSchema, z.array(DurableTaskStatusSchema)]).optional(),
|
|
98
|
+
assignee: z.string().optional(),
|
|
99
|
+
run_id: z.string().optional(),
|
|
100
|
+
source_type: TaskSourceSchema.shape.type.optional(),
|
|
101
|
+
limit: z.number().optional(),
|
|
102
|
+
offset: z.number().optional(),
|
|
103
|
+
})
|
|
104
|
+
.meta({ id: 'ListTasksQuery' });
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { MCPToolAnnotationsSchema } from './apps.js';
|
|
3
|
+
|
|
4
|
+
// The unified project-scoped tool registry as `GET /tools` and `POST /tools/validate` publish it.
|
|
5
|
+
//
|
|
6
|
+
// `//` rather than `/** */` throughout: a JSDoc block immediately preceding an exported declaration
|
|
7
|
+
// is picked up by the OpenAPI scanner and published as that component's `description`, which would
|
|
8
|
+
// double up with the `description` stated in `.meta()`.
|
|
9
|
+
|
|
10
|
+
export const ToolSourceSchema = z.enum(['builtin', 'app', 'interaction']).meta({
|
|
11
|
+
id: 'ToolSource',
|
|
12
|
+
description:
|
|
13
|
+
'Origin of a tool in the unified project-scoped tool registry.\n\n- `builtin`: anything statically registered on the worker — workflow builtins, studio agent tools, and sys skills\n- `app`: tools contributed by an installed app for the project\n- `interaction`: a project interaction exposed via `tag=tool` / `is_tool=true` / `is_skill=true`\n\nSkill semantics (the tool unlocks others when invoked) are NOT part of the source. They are identified universally by the `learn_` prefix in the tool name. This matches how the runtime registry stores them and avoids splitting one logical origin into two sources.',
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
export const ValidateToolNamesPayloadSchema = z
|
|
17
|
+
.strictObject({
|
|
18
|
+
names: z.array(z.string()).meta({
|
|
19
|
+
description:
|
|
20
|
+
'Bare tool names as they appear in `agent_runner_options.tool_names`. `+`/`-` prefixes are stripped before lookup.',
|
|
21
|
+
}),
|
|
22
|
+
})
|
|
23
|
+
.meta({ id: 'ValidateToolNamesPayload', description: 'Request payload for `POST /tools/validate`.' });
|
|
24
|
+
|
|
25
|
+
export const ToolValidationResultSchema = z
|
|
26
|
+
.strictObject({
|
|
27
|
+
name: z.string().meta({ description: 'The name the caller asked about.' }),
|
|
28
|
+
valid: z
|
|
29
|
+
.boolean()
|
|
30
|
+
.meta({ description: "True if the name resolves to exactly one tool in the project's unified registry." }),
|
|
31
|
+
source: ToolSourceSchema.meta({ description: 'When `valid`: which source the tool came from.' }).optional(),
|
|
32
|
+
app_install_id: z
|
|
33
|
+
.string()
|
|
34
|
+
.meta({ description: "When `valid` and `source === 'app'`: the app installation that provides the tool." })
|
|
35
|
+
.optional(),
|
|
36
|
+
app_name: z
|
|
37
|
+
.string()
|
|
38
|
+
.meta({ description: "When `valid` and `source === 'app'`: the app's manifest name." })
|
|
39
|
+
.optional(),
|
|
40
|
+
suggestion: z
|
|
41
|
+
.string()
|
|
42
|
+
.meta({
|
|
43
|
+
description:
|
|
44
|
+
'When `!valid` and a close match exists: the suggested replacement name (Levenshtein-based).',
|
|
45
|
+
})
|
|
46
|
+
.optional(),
|
|
47
|
+
collisions: z
|
|
48
|
+
.array(
|
|
49
|
+
z.strictObject({
|
|
50
|
+
source: ToolSourceSchema,
|
|
51
|
+
app_install_id: z.string().optional(),
|
|
52
|
+
}),
|
|
53
|
+
)
|
|
54
|
+
.meta({
|
|
55
|
+
description:
|
|
56
|
+
'Populated when a name appears in more than one source. Validation does not fail on this, but exposes the ambiguity so callers can surface a warning (last-write-wins resolution applies).',
|
|
57
|
+
})
|
|
58
|
+
.optional(),
|
|
59
|
+
})
|
|
60
|
+
.meta({ id: 'ToolValidationResult', description: 'Per-name resolution result for `POST /tools/validate`.' });
|
|
61
|
+
|
|
62
|
+
export const AggregatedToolSchema = z
|
|
63
|
+
.strictObject({
|
|
64
|
+
name: z.string().meta({
|
|
65
|
+
description:
|
|
66
|
+
'Name as referenced from `agent_runner_options.tool_names`. For interaction skills this is `learn_<endpoint>`.',
|
|
67
|
+
}),
|
|
68
|
+
source: ToolSourceSchema,
|
|
69
|
+
description: z.string().optional(),
|
|
70
|
+
title: z.string().optional(),
|
|
71
|
+
is_default: z
|
|
72
|
+
.boolean()
|
|
73
|
+
.meta({
|
|
74
|
+
description:
|
|
75
|
+
'Whether the tool is part of the default toolkit when no explicit `tool_names` is provided.',
|
|
76
|
+
})
|
|
77
|
+
.optional(),
|
|
78
|
+
annotations: MCPToolAnnotationsSchema.optional(),
|
|
79
|
+
unlocked_tools: z
|
|
80
|
+
.array(z.string())
|
|
81
|
+
.meta({ description: 'For skills (`learn_*`): tool names this skill unlocks when invoked.' })
|
|
82
|
+
.optional(),
|
|
83
|
+
app_install_id: z
|
|
84
|
+
.string()
|
|
85
|
+
.meta({ description: "Present when `source === 'app'`: the app installation that provides this tool." })
|
|
86
|
+
.optional(),
|
|
87
|
+
app_name: z
|
|
88
|
+
.string()
|
|
89
|
+
.meta({
|
|
90
|
+
description:
|
|
91
|
+
"Present when `source === 'app'`: the app's manifest name (used for `principal.apps` filtering).",
|
|
92
|
+
})
|
|
93
|
+
.optional(),
|
|
94
|
+
interaction_id: z
|
|
95
|
+
.string()
|
|
96
|
+
.meta({ description: "Present when `source === 'interaction'`: the interaction document id." })
|
|
97
|
+
.optional(),
|
|
98
|
+
is_agent: z
|
|
99
|
+
.boolean()
|
|
100
|
+
.meta({
|
|
101
|
+
description:
|
|
102
|
+
"Present when `source === 'interaction'`: true if the interaction has `agent_runner_options.is_agent === true`. Lets UI consumers distinguish sub-agents (autonomous, run-to-completion) from regular interaction tools.",
|
|
103
|
+
})
|
|
104
|
+
.optional(),
|
|
105
|
+
})
|
|
106
|
+
.meta({
|
|
107
|
+
id: 'AggregatedTool',
|
|
108
|
+
description:
|
|
109
|
+
'A single tool entry in the unified registry, regardless of where it came from. Returned by `GET /tools` and the resolution map of `POST /tools/validate`.',
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
export const ValidateToolNamesResponseSchema = z
|
|
113
|
+
.strictObject({
|
|
114
|
+
results: z
|
|
115
|
+
.array(ToolValidationResultSchema)
|
|
116
|
+
.meta({ description: 'One entry per requested name, in the same order.' }),
|
|
117
|
+
invalid_count: z.number().min(0).meta({
|
|
118
|
+
description: 'Convenience count of `results.filter(r => !r.valid).length`.',
|
|
119
|
+
// `type`/`format` in meta rather than `z.int()`: the latter also emits Zod's
|
|
120
|
+
// safe-integer `maximum`, which the published component does not carry.
|
|
121
|
+
type: 'integer',
|
|
122
|
+
format: 'int32',
|
|
123
|
+
}),
|
|
124
|
+
})
|
|
125
|
+
.meta({ id: 'ValidateToolNamesResponse', description: 'Response from `POST /tools/validate`.' });
|
|
126
|
+
|
|
127
|
+
export const AggregatedToolArraySchema = z.array(AggregatedToolSchema).meta({ id: 'AggregatedToolArray' });
|
|
128
|
+
|
|
129
|
+
// Query contracts are registry components even though the scanner expands them into parameters.
|
|
130
|
+
export const ListProjectToolsQuerySchema = z
|
|
131
|
+
.strictObject({
|
|
132
|
+
sources: z.array(ToolSourceSchema).meta({ description: 'Include only these sources.' }).optional(),
|
|
133
|
+
exclude: z
|
|
134
|
+
.array(ToolSourceSchema)
|
|
135
|
+
.meta({
|
|
136
|
+
description: 'Drop these sources from the result (and skip their fetch). Applied after `sources`.',
|
|
137
|
+
})
|
|
138
|
+
.optional(),
|
|
139
|
+
})
|
|
140
|
+
.meta({ id: 'ListProjectToolsQuery' });
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { Ajv2020 } from 'ajv/dist/2020.js';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import type { PrincipalContext, PrincipalIdentity } from '../principal-context.js';
|
|
4
|
+
import type { UpdateUserPayload, User } from '../user.js';
|
|
5
|
+
import type { JsonObject } from './adapter.js';
|
|
6
|
+
import { ApiSchemaComponents, apiComponentRef, validateApiRequest, validateApiResponse } from './registry.js';
|
|
7
|
+
import type { PrincipalContextFromSchema, UserArrayFromSchema } from './user.js';
|
|
8
|
+
|
|
9
|
+
/** Exact type identity — `extends` in both directions is too weak (any/unknown slip through). */
|
|
10
|
+
type Equals<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2 ? true : false;
|
|
11
|
+
function assertType<T extends true>(_ok: T): void {}
|
|
12
|
+
|
|
13
|
+
function compile(name: string, components: Readonly<Record<string, JsonObject>> = ApiSchemaComponents) {
|
|
14
|
+
const ajv = new Ajv2020({ strictSchema: false, allErrors: true });
|
|
15
|
+
ajv.addSchema({ $id: 'vertesia://openapi', components: { schemas: components } });
|
|
16
|
+
return ajv.compile({ $ref: `vertesia://openapi${apiComponentRef(name as never)}` });
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const VALID_USER = {
|
|
20
|
+
id: 'u1',
|
|
21
|
+
email: 'someone@acme.com',
|
|
22
|
+
name: 'Someone',
|
|
23
|
+
created_at: '2026-07-30T10:00:00.000Z',
|
|
24
|
+
updated_at: '2026-07-30T10:00:00.000Z',
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
describe('gate 1 — the schema is the single source of truth for the public IAM types', () => {
|
|
28
|
+
it('publishes the exact schema-derived type, not a hand-written twin', () => {
|
|
29
|
+
assertType<Equals<UserArrayFromSchema, User[]>>(true);
|
|
30
|
+
assertType<Equals<PrincipalContext, PrincipalContextFromSchema>>(true);
|
|
31
|
+
expect(true).toBe(true);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('derives the inherited principal fields rather than restating them', () => {
|
|
35
|
+
// PrincipalIdentity used to `extends PrincipalContext`, so composing the schemas is what
|
|
36
|
+
// keeps the five inherited fields from becoming a twin one level down — the failure mode
|
|
37
|
+
// this batch was scoped to avoid.
|
|
38
|
+
assertType<Equals<PrincipalIdentity['clearance'], PrincipalContext['clearance']>>(true);
|
|
39
|
+
assertType<Equals<PrincipalIdentity['compartments'], PrincipalContext['compartments']>>(true);
|
|
40
|
+
assertType<Equals<PrincipalIdentity['email'], PrincipalContext['email']>>(true);
|
|
41
|
+
assertType<Equals<PrincipalIdentity['tags'], PrincipalContext['tags']>>(true);
|
|
42
|
+
assertType<Equals<PrincipalIdentity['properties'], PrincipalContext['properties']>>(true);
|
|
43
|
+
assertType<Equals<PrincipalIdentity['id'], string>>(true);
|
|
44
|
+
expect(true).toBe(true);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('derives the update payload from the user rather than restating nine fields', () => {
|
|
48
|
+
// A `.pick()` of UserSchema plus `.partial()`: the field types and constraints come from the
|
|
49
|
+
// response declaration, and the ONLY thing the payload changes about them is requiredness.
|
|
50
|
+
assertType<Equals<UpdateUserPayload['name'], string | undefined>>(true);
|
|
51
|
+
assertType<Equals<UpdateUserPayload['clearance'], User['clearance']>>(true);
|
|
52
|
+
assertType<Equals<UpdateUserPayload['compartments'], User['compartments']>>(true);
|
|
53
|
+
assertType<Equals<UpdateUserPayload['properties'], User['properties']>>(true);
|
|
54
|
+
// What is NOT picked is the whitelist. `email`, `source`, `annotations` and the timestamps
|
|
55
|
+
// are server- or IdP-owned, and adding one now means naming it in the pick.
|
|
56
|
+
assertType<
|
|
57
|
+
Equals<
|
|
58
|
+
keyof UpdateUserPayload,
|
|
59
|
+
| 'name'
|
|
60
|
+
| 'username'
|
|
61
|
+
| 'picture'
|
|
62
|
+
| 'language'
|
|
63
|
+
| 'phone'
|
|
64
|
+
| 'last_selected_account'
|
|
65
|
+
| 'properties'
|
|
66
|
+
| 'clearance'
|
|
67
|
+
| 'compartments'
|
|
68
|
+
>
|
|
69
|
+
>(true);
|
|
70
|
+
expect(true).toBe(true);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('keeps the wire type optionality the document declares', () => {
|
|
74
|
+
assertType<Equals<User['email'], string>>(true);
|
|
75
|
+
assertType<Equals<User['created_at'], string>>(true);
|
|
76
|
+
assertType<Equals<User['source'], 'firebase' | 'scim' | undefined>>(true);
|
|
77
|
+
assertType<Equals<User['clearance'], number | undefined>>(true);
|
|
78
|
+
expect(true).toBe(true);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
describe('gate 2 — the published components match the closure the types come from', () => {
|
|
83
|
+
it('does not hoist PrincipalContext into a component of its own', () => {
|
|
84
|
+
// It is a public TYPE but has never been a published component. Hoisting it would add a
|
|
85
|
+
// $ref to PrincipalIdentity that every generated client would have to follow.
|
|
86
|
+
expect(Object.keys(ApiSchemaComponents)).not.toContain('PrincipalContext');
|
|
87
|
+
const props = ApiSchemaComponents.PrincipalIdentity.properties as Record<string, JsonObject>;
|
|
88
|
+
expect(props.clearance).toEqual({ type: 'number' });
|
|
89
|
+
expect(props.id).toEqual({ type: 'string' });
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it('publishes the composed property order, id last', () => {
|
|
93
|
+
// `.extend()` appends, which is what `interface … extends …` produced and what the document
|
|
94
|
+
// already carries.
|
|
95
|
+
const props = ApiSchemaComponents.PrincipalIdentity.properties as JsonObject;
|
|
96
|
+
expect(Object.keys(props)).toEqual(['clearance', 'compartments', 'email', 'tags', 'properties', 'id']);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('declares the timestamps the endpoint has always shipped', () => {
|
|
100
|
+
// The published component was closed and did not declare these, while the handler
|
|
101
|
+
// serialized the whole Mongo document — so every response violated its own schema.
|
|
102
|
+
const props = ApiSchemaComponents.User.properties as Record<string, JsonObject>;
|
|
103
|
+
expect(props.created_at.type).toBe('string');
|
|
104
|
+
expect(props.updated_at.type).toBe('string');
|
|
105
|
+
expect(ApiSchemaComponents.User.required).toContain('created_at');
|
|
106
|
+
expect(ApiSchemaComponents.User.additionalProperties).toBe(false);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
describe('gate 3 — AJV validates the same canonical objects that are published', () => {
|
|
111
|
+
it('accepts a minimal user and rejects a missing required field', () => {
|
|
112
|
+
const validate = compile('User');
|
|
113
|
+
expect(validate(VALID_USER)).toBe(true);
|
|
114
|
+
const { created_at: _dropped, ...incomplete } = VALID_USER;
|
|
115
|
+
expect(validate(incomplete)).toBe(false);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it('rejects a source outside the published enum', () => {
|
|
119
|
+
expect(compile('User')({ ...VALID_USER, source: 'ldap' })).toBe(false);
|
|
120
|
+
expect(compile('User')({ ...VALID_USER, source: 'scim' })).toBe(true);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it('rejects an undeclared property on the closed user component', () => {
|
|
124
|
+
// Specifically the internal fields a spread of the Mongo document would have leaked.
|
|
125
|
+
expect(compile('User')({ ...VALID_USER, _id: 'deadbeef' })).toBe(false);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('accepts an empty update payload but rejects an undeclared field', () => {
|
|
129
|
+
const validate = compile('UpdateUserPayload');
|
|
130
|
+
expect(validate({})).toBe(true);
|
|
131
|
+
expect(validate({ name: 'New name' })).toBe(true);
|
|
132
|
+
// `email` is deliberately not updatable through this endpoint and never has been.
|
|
133
|
+
expect(validate({ email: 'new@acme.com' })).toBe(false);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
describe('gate 4 — runtime enforcement uses the published components', () => {
|
|
138
|
+
it('rejects an undeclared update field without removing it', () => {
|
|
139
|
+
// The handler used to whitelist fields and silently ignore the rest; the published schema
|
|
140
|
+
// has always said additionalProperties: false. Enforcement makes the two agree.
|
|
141
|
+
const payload: Record<string, unknown> = { name: 'Acme', rogue_field: 42 };
|
|
142
|
+
const result = validateApiRequest('UpdateUserPayload', payload);
|
|
143
|
+
expect(result.valid).toBe(false);
|
|
144
|
+
expect(payload.rogue_field).toBe(42);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it('accepts a conforming update payload and hands back the component type', () => {
|
|
148
|
+
const result = validateApiRequest('UpdateUserPayload', { name: 'Acme', clearance: 3 });
|
|
149
|
+
expect(result.valid).toBe(true);
|
|
150
|
+
if (result.valid) {
|
|
151
|
+
assertType<Equals<typeof result.data, UpdateUserPayload>>(true);
|
|
152
|
+
expect(result.data.clearance).toBe(3);
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it('checks the user response against the same component the SDK type comes from', () => {
|
|
157
|
+
const result = validateApiResponse('User', VALID_USER);
|
|
158
|
+
expect(result.valid).toBe(true);
|
|
159
|
+
if (result.valid) {
|
|
160
|
+
assertType<Equals<typeof result.data, User>>(true);
|
|
161
|
+
}
|
|
162
|
+
// A document spread straight onto the wire is what this catches.
|
|
163
|
+
expect(validateApiResponse('User', { ...VALID_USER, _id: 'x' }).valid).toBe(false);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it('enforces the date-time format the timestamps claim', () => {
|
|
167
|
+
// Through the registry rather than the local `compile` helper: the production validator
|
|
168
|
+
// registers ajv-formats, and a bare Ajv2020 ignores `format` entirely — which is precisely
|
|
169
|
+
// why the description alone was not enough. A plain string schema accepts 'yesterday'.
|
|
170
|
+
expect(validateApiResponse('User', { ...VALID_USER, created_at: 'yesterday' }).valid).toBe(false);
|
|
171
|
+
expect(validateApiResponse('User', { ...VALID_USER, created_at: '2026-07-30' }).valid).toBe(false);
|
|
172
|
+
expect(validateApiResponse('User', VALID_USER).valid).toBe(true);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it('checks every member of the account listing against the same User component', () => {
|
|
176
|
+
// The gap this closes: `UserArray` items $ref `User`, so publishing the array without
|
|
177
|
+
// enforcing it would document the contract for each member while checking none of them.
|
|
178
|
+
expect(validateApiResponse('UserArray', [VALID_USER, VALID_USER]).valid).toBe(true);
|
|
179
|
+
expect(validateApiResponse('UserArray', []).valid).toBe(true);
|
|
180
|
+
// A legacy member with no timestamps, which is exactly what the old jsonDocs() could emit.
|
|
181
|
+
const { created_at: _dropped, ...legacyMember } = VALID_USER;
|
|
182
|
+
expect(validateApiResponse('UserArray', [VALID_USER, legacyMember]).valid).toBe(false);
|
|
183
|
+
// And one carrying a null the component cannot publish.
|
|
184
|
+
expect(validateApiResponse('UserArray', [{ ...VALID_USER, phone: null }]).valid).toBe(false);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it('validates the shared DeleteByIdResult that seven other endpoints also publish', () => {
|
|
188
|
+
expect(validateApiResponse('DeleteByIdResult', { id: 'abc' }).valid).toBe(true);
|
|
189
|
+
expect(validateApiResponse('DeleteByIdResult', {}).valid).toBe(false);
|
|
190
|
+
});
|
|
191
|
+
});
|