@weave-kit/engine 0.4.0 → 0.6.0
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/CHANGELOG.md +61 -0
- package/README.md +6 -6
- package/dist/adapters/auth/index.d.ts +4 -2
- package/dist/adapters/auth/index.d.ts.map +1 -1
- package/dist/adapters/auth/index.js +1 -0
- package/dist/adapters/auth/index.js.map +1 -1
- package/dist/adapters/auth/source.d.ts +4 -4
- package/dist/adapters/auth/source.d.ts.map +1 -1
- package/dist/adapters/auth/subject.d.ts +22 -0
- package/dist/adapters/auth/subject.d.ts.map +1 -0
- package/dist/adapters/auth/subject.js +42 -0
- package/dist/adapters/auth/subject.js.map +1 -0
- package/dist/adapters/auth/verify.d.ts +12 -0
- package/dist/adapters/auth/verify.d.ts.map +1 -0
- package/dist/adapters/auth/verify.js +2 -0
- package/dist/adapters/auth/verify.js.map +1 -0
- package/dist/adapters/events/index.d.ts +2 -1
- package/dist/adapters/events/index.d.ts.map +1 -1
- package/dist/adapters/events/index.js +2 -1
- package/dist/adapters/events/index.js.map +1 -1
- package/dist/adapters/mcp/generate.d.ts +3 -3
- package/dist/adapters/mcp/generate.d.ts.map +1 -1
- package/dist/adapters/mcp/generate.js +34 -11
- package/dist/adapters/mcp/generate.js.map +1 -1
- package/dist/adapters/mcp/guardrails.d.ts +1 -1
- package/dist/adapters/mcp/http.d.ts +3 -1
- package/dist/adapters/mcp/http.d.ts.map +1 -1
- package/dist/adapters/mcp/http.js +2 -2
- package/dist/adapters/mcp/http.js.map +1 -1
- package/dist/adapters/mcp/index.d.ts +13 -4
- package/dist/adapters/mcp/index.d.ts.map +1 -1
- package/dist/adapters/mcp/index.js +12 -8
- package/dist/adapters/mcp/index.js.map +1 -1
- package/dist/adapters/mcp/session.d.ts +5 -5
- package/dist/adapters/mcp/session.d.ts.map +1 -1
- package/dist/adapters/mcp/tools.d.ts +6 -0
- package/dist/adapters/mcp/tools.d.ts.map +1 -1
- package/dist/adapters/mcp/tools.js +38 -14
- package/dist/adapters/mcp/tools.js.map +1 -1
- package/dist/adapters/mcp/types.d.ts +3 -1
- package/dist/adapters/mcp/types.d.ts.map +1 -1
- package/dist/adapters/mcp/types.js +1 -1
- package/dist/adapters/mcp/types.js.map +1 -1
- package/dist/adapters/openapi/document.d.ts.map +1 -1
- package/dist/adapters/openapi/document.js +72 -2
- package/dist/adapters/openapi/document.js.map +1 -1
- package/dist/adapters/openapi/schema.d.ts.map +1 -1
- package/dist/adapters/openapi/schema.js +47 -7
- package/dist/adapters/openapi/schema.js.map +1 -1
- package/dist/adapters/openapi/types.d.ts +1 -0
- package/dist/adapters/openapi/types.d.ts.map +1 -1
- package/dist/adapters/openapi/types.js +2 -0
- package/dist/adapters/openapi/types.js.map +1 -1
- package/dist/adapters/rest/approvals.d.ts +2 -2
- package/dist/adapters/rest/approvals.js +2 -2
- package/dist/adapters/rest/audit.d.ts +2 -2
- package/dist/adapters/rest/audit.js +2 -2
- package/dist/adapters/rest/common.d.ts +3 -3
- package/dist/adapters/rest/common.d.ts.map +1 -1
- package/dist/adapters/rest/common.js +1 -1
- package/dist/adapters/rest/guardrails.d.ts +1 -1
- package/dist/adapters/rest/guardrails.js +1 -1
- package/dist/adapters/rest/identities.d.ts +4 -4
- package/dist/adapters/rest/identities.d.ts.map +1 -1
- package/dist/adapters/rest/identities.js +3 -3
- package/dist/adapters/rest/identities.js.map +1 -1
- package/dist/adapters/rest/identityAdmin.d.ts +18 -0
- package/dist/adapters/rest/identityAdmin.d.ts.map +1 -0
- package/dist/adapters/rest/identityAdmin.js +58 -0
- package/dist/adapters/rest/identityAdmin.js.map +1 -0
- package/dist/adapters/rest/index.d.ts +4 -0
- package/dist/adapters/rest/index.d.ts.map +1 -1
- package/dist/adapters/rest/index.js +3 -0
- package/dist/adapters/rest/index.js.map +1 -1
- package/dist/adapters/rest/metadata.d.ts +1 -1
- package/dist/adapters/rest/metadata.js +1 -1
- package/dist/adapters/rest/pages.d.ts +1 -1
- package/dist/adapters/rest/pages.d.ts.map +1 -1
- package/dist/adapters/rest/permissions.d.ts +1 -1
- package/dist/adapters/rest/permissions.js +1 -1
- package/dist/adapters/rest/plugin.d.ts +2 -2
- package/dist/adapters/rest/plugin.d.ts.map +1 -1
- package/dist/adapters/rest/schemas.d.ts +1 -1
- package/dist/adapters/rest/schemas.d.ts.map +1 -1
- package/dist/adapters/rest/workflow.d.ts +15 -0
- package/dist/adapters/rest/workflow.d.ts.map +1 -0
- package/dist/adapters/rest/workflow.js +89 -0
- package/dist/adapters/rest/workflow.js.map +1 -0
- package/dist/adapters/rest/workflowSource.d.ts +15 -0
- package/dist/adapters/rest/workflowSource.d.ts.map +1 -0
- package/dist/adapters/rest/workflowSource.js +63 -0
- package/dist/adapters/rest/workflowSource.js.map +1 -0
- package/dist/cli/commands/build.js +1 -1
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/connect.d.ts +1 -1
- package/dist/cli/commands/default-view.d.ts +2 -2
- package/dist/cli/commands/default-view.js +2 -2
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +18 -9
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/cli/commands/field-add.d.ts.map +1 -1
- package/dist/cli/commands/field-add.js +12 -6
- package/dist/cli/commands/field-add.js.map +1 -1
- package/dist/cli/commands/field-types.d.ts.map +1 -1
- package/dist/cli/commands/field-types.js +10 -1
- package/dist/cli/commands/field-types.js.map +1 -1
- package/dist/cli/commands/identity.d.ts +15 -0
- package/dist/cli/commands/identity.d.ts.map +1 -0
- package/dist/cli/commands/identity.js +115 -0
- package/dist/cli/commands/identity.js.map +1 -0
- package/dist/cli/commands/introspect.d.ts.map +1 -1
- package/dist/cli/commands/introspect.js +23 -0
- package/dist/cli/commands/introspect.js.map +1 -1
- package/dist/cli/commands/mcp-config.js +1 -1
- package/dist/cli/commands/mcp-config.js.map +1 -1
- package/dist/cli/commands/migrate.js +2 -2
- package/dist/cli/commands/migrate.js.map +1 -1
- package/dist/cli/commands/module.d.ts +2 -2
- package/dist/cli/commands/module.d.ts.map +1 -1
- package/dist/cli/commands/module.js +2 -2
- package/dist/cli/commands/module.js.map +1 -1
- package/dist/cli/commands/object-create.d.ts.map +1 -1
- package/dist/cli/commands/object-create.js +15 -15
- package/dist/cli/commands/object-create.js.map +1 -1
- package/dist/cli/commands/schema-map.d.ts.map +1 -1
- package/dist/cli/commands/schema-map.js +6 -0
- package/dist/cli/commands/schema-map.js.map +1 -1
- package/dist/cli/commands/workflow-close.d.ts +9 -0
- package/dist/cli/commands/workflow-close.d.ts.map +1 -0
- package/dist/cli/commands/workflow-close.js +48 -0
- package/dist/cli/commands/workflow-close.js.map +1 -0
- package/dist/cli/commands/workflow-migrate.d.ts +11 -0
- package/dist/cli/commands/workflow-migrate.d.ts.map +1 -0
- package/dist/cli/commands/workflow-migrate.js +120 -0
- package/dist/cli/commands/workflow-migrate.js.map +1 -0
- package/dist/cli/commands/workflow-open.d.ts +10 -0
- package/dist/cli/commands/workflow-open.d.ts.map +1 -0
- package/dist/cli/commands/workflow-open.js +112 -0
- package/dist/cli/commands/workflow-open.js.map +1 -0
- package/dist/cli/commands/workflow-starter.d.ts +10 -0
- package/dist/cli/commands/workflow-starter.d.ts.map +1 -0
- package/dist/cli/commands/workflow-starter.js +29 -0
- package/dist/cli/commands/workflow-starter.js.map +1 -0
- package/dist/cli/commands/workflow-switch.d.ts +10 -0
- package/dist/cli/commands/workflow-switch.d.ts.map +1 -0
- package/dist/cli/commands/workflow-switch.js +60 -0
- package/dist/cli/commands/workflow-switch.js.map +1 -0
- package/dist/cli/commands/workflow-upgrade.d.ts +12 -0
- package/dist/cli/commands/workflow-upgrade.d.ts.map +1 -0
- package/dist/cli/commands/workflow-upgrade.js +116 -0
- package/dist/cli/commands/workflow-upgrade.js.map +1 -0
- package/dist/cli/index.js +74 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/project-types/manifest.d.ts +25 -0
- package/dist/cli/project-types/manifest.d.ts.map +1 -0
- package/dist/cli/project-types/manifest.js +40 -0
- package/dist/cli/project-types/manifest.js.map +1 -0
- package/dist/cli/ready-screen.js +1 -1
- package/dist/cli/ready-screen.js.map +1 -1
- package/dist/cli/scaffold.d.ts.map +1 -1
- package/dist/cli/scaffold.js +21 -34
- package/dist/cli/scaffold.js.map +1 -1
- package/dist/cli/types/commands.d.ts +48 -0
- package/dist/cli/types/commands.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +1 -1
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/types/values.d.ts +9 -0
- package/dist/cli/types/values.d.ts.map +1 -1
- package/dist/cli/types/values.js +9 -0
- package/dist/cli/types/values.js.map +1 -1
- package/dist/core/api/error.d.ts.map +1 -1
- package/dist/core/api/error.js +7 -4
- package/dist/core/api/error.js.map +1 -1
- package/dist/core/audit/types.d.ts +4 -2
- package/dist/core/audit/types.d.ts.map +1 -1
- package/dist/core/audit/types.js +2 -0
- package/dist/core/audit/types.js.map +1 -1
- package/dist/core/formula/validate.d.ts.map +1 -1
- package/dist/core/formula/validate.js +6 -0
- package/dist/core/formula/validate.js.map +1 -1
- package/dist/core/i18n/ar.d.ts.map +1 -1
- package/dist/core/i18n/ar.js +59 -3
- package/dist/core/i18n/ar.js.map +1 -1
- package/dist/core/i18n/de.d.ts.map +1 -1
- package/dist/core/i18n/de.js +59 -3
- package/dist/core/i18n/de.js.map +1 -1
- package/dist/core/i18n/en.d.ts +60 -4
- package/dist/core/i18n/en.d.ts.map +1 -1
- package/dist/core/i18n/en.js +60 -4
- package/dist/core/i18n/en.js.map +1 -1
- package/dist/core/i18n/es.d.ts.map +1 -1
- package/dist/core/i18n/es.js +59 -3
- package/dist/core/i18n/es.js.map +1 -1
- package/dist/core/i18n/fr.d.ts.map +1 -1
- package/dist/core/i18n/fr.js +59 -3
- package/dist/core/i18n/fr.js.map +1 -1
- package/dist/core/i18n/hi.d.ts.map +1 -1
- package/dist/core/i18n/hi.js +59 -3
- package/dist/core/i18n/hi.js.map +1 -1
- package/dist/core/i18n/id.d.ts.map +1 -1
- package/dist/core/i18n/id.js +59 -3
- package/dist/core/i18n/id.js.map +1 -1
- package/dist/core/i18n/ja.d.ts.map +1 -1
- package/dist/core/i18n/ja.js +59 -3
- package/dist/core/i18n/ja.js.map +1 -1
- package/dist/core/i18n/ko.d.ts.map +1 -1
- package/dist/core/i18n/ko.js +59 -3
- package/dist/core/i18n/ko.js.map +1 -1
- package/dist/core/i18n/pt.d.ts.map +1 -1
- package/dist/core/i18n/pt.js +59 -3
- package/dist/core/i18n/pt.js.map +1 -1
- package/dist/core/i18n/ru.d.ts.map +1 -1
- package/dist/core/i18n/ru.js +59 -3
- package/dist/core/i18n/ru.js.map +1 -1
- package/dist/core/i18n/vi.d.ts.map +1 -1
- package/dist/core/i18n/vi.js +59 -3
- package/dist/core/i18n/vi.js.map +1 -1
- package/dist/core/i18n/zh-hant.d.ts.map +1 -1
- package/dist/core/i18n/zh-hant.js +59 -3
- package/dist/core/i18n/zh-hant.js.map +1 -1
- package/dist/core/i18n/zh.d.ts.map +1 -1
- package/dist/core/i18n/zh.js +60 -4
- package/dist/core/i18n/zh.js.map +1 -1
- package/dist/core/object/describe.d.ts +62 -3
- package/dist/core/object/describe.d.ts.map +1 -1
- package/dist/core/object/describe.js +81 -11
- package/dist/core/object/describe.js.map +1 -1
- package/dist/core/object/gen-types.d.ts.map +1 -1
- package/dist/core/object/gen-types.js +14 -1
- package/dist/core/object/gen-types.js.map +1 -1
- package/dist/core/object/graph.d.ts +3 -0
- package/dist/core/object/graph.d.ts.map +1 -1
- package/dist/core/object/graph.js +90 -14
- package/dist/core/object/graph.js.map +1 -1
- package/dist/core/object/index.d.ts +6 -2
- package/dist/core/object/index.d.ts.map +1 -1
- package/dist/core/object/index.js +5 -1
- package/dist/core/object/index.js.map +1 -1
- package/dist/core/object/migrations.d.ts.map +1 -1
- package/dist/core/object/migrations.js +45 -0
- package/dist/core/object/migrations.js.map +1 -1
- package/dist/core/object/parse.d.ts +7 -0
- package/dist/core/object/parse.d.ts.map +1 -1
- package/dist/core/object/parse.js +32 -1
- package/dist/core/object/parse.js.map +1 -1
- package/dist/core/object/record-key.d.ts +19 -0
- package/dist/core/object/record-key.d.ts.map +1 -0
- package/dist/core/object/record-key.js +100 -0
- package/dist/core/object/record-key.js.map +1 -0
- package/dist/core/object/registry.js +1 -1
- package/dist/core/object/registry.js.map +1 -1
- package/dist/core/object/schema-version.d.ts +1 -1
- package/dist/core/object/schema-version.js +1 -1
- package/dist/core/object/system-objects.d.ts +16 -0
- package/dist/core/object/system-objects.d.ts.map +1 -0
- package/dist/core/object/system-objects.js +72 -0
- package/dist/core/object/system-objects.js.map +1 -0
- package/dist/core/object/validate/constraints.d.ts +9 -0
- package/dist/core/object/validate/constraints.d.ts.map +1 -0
- package/dist/core/object/validate/constraints.js +45 -0
- package/dist/core/object/validate/constraints.js.map +1 -0
- package/dist/core/object/validate/field.d.ts.map +1 -1
- package/dist/core/object/validate/field.js +339 -66
- package/dist/core/object/validate/field.js.map +1 -1
- package/dist/core/object/validate/formulas.d.ts.map +1 -1
- package/dist/core/object/validate/formulas.js +6 -0
- package/dist/core/object/validate/formulas.js.map +1 -1
- package/dist/core/object/validate/object.d.ts +2 -0
- package/dist/core/object/validate/object.d.ts.map +1 -1
- package/dist/core/object/validate/object.js +54 -19
- package/dist/core/object/validate/object.js.map +1 -1
- package/dist/core/object/validate/permissions.d.ts.map +1 -1
- package/dist/core/object/validate/permissions.js +4 -0
- package/dist/core/object/validate/permissions.js.map +1 -1
- package/dist/core/object/validate/primitives.d.ts +0 -1
- package/dist/core/object/validate/primitives.d.ts.map +1 -1
- package/dist/core/object/validate/primitives.js +1 -2
- package/dist/core/object/validate/primitives.js.map +1 -1
- package/dist/core/object/validate/workflow.d.ts +10 -0
- package/dist/core/object/validate/workflow.d.ts.map +1 -0
- package/dist/core/object/validate/workflow.js +143 -0
- package/dist/core/object/validate/workflow.js.map +1 -0
- package/dist/core/object/workflow-hash.d.ts +10 -0
- package/dist/core/object/workflow-hash.d.ts.map +1 -0
- package/dist/core/object/workflow-hash.js +27 -0
- package/dist/core/object/workflow-hash.js.map +1 -0
- package/dist/core/object/workflow-migrations.d.ts +27 -0
- package/dist/core/object/workflow-migrations.d.ts.map +1 -0
- package/dist/core/object/workflow-migrations.js +125 -0
- package/dist/core/object/workflow-migrations.js.map +1 -0
- package/dist/core/provider/event/index.d.ts +1 -1
- package/dist/core/provider/event/index.d.ts.map +1 -1
- package/dist/core/provider/event/index.js.map +1 -1
- package/dist/core/provider/event/types.d.ts +17 -2
- package/dist/core/provider/event/types.d.ts.map +1 -1
- package/dist/core/provider/event/types.js +2 -1
- package/dist/core/provider/event/types.js.map +1 -1
- package/dist/core/provider/identity/directory.d.ts +90 -0
- package/dist/core/provider/identity/directory.d.ts.map +1 -0
- package/dist/core/provider/identity/directory.js +3 -0
- package/dist/core/provider/identity/directory.js.map +1 -0
- package/dist/core/provider/identity/index.d.ts +5 -1
- package/dist/core/provider/identity/index.d.ts.map +1 -1
- package/dist/core/provider/identity/index.js +2 -1
- package/dist/core/provider/identity/index.js.map +1 -1
- package/dist/core/provider/identity/source.d.ts +22 -0
- package/dist/core/provider/identity/source.d.ts.map +1 -0
- package/dist/core/provider/identity/source.js +3 -0
- package/dist/core/provider/identity/source.js.map +1 -0
- package/dist/core/provider/identity/types.d.ts +62 -7
- package/dist/core/provider/identity/types.d.ts.map +1 -1
- package/dist/core/provider/identity/types.js +13 -0
- package/dist/core/provider/identity/types.js.map +1 -1
- package/dist/core/proxy/types.d.ts +4 -4
- package/dist/core/proxy/types.d.ts.map +1 -1
- package/dist/core/rbac/authorize.d.ts +10 -9
- package/dist/core/rbac/authorize.d.ts.map +1 -1
- package/dist/core/rbac/authorize.js +23 -18
- package/dist/core/rbac/authorize.js.map +1 -1
- package/dist/core/rbac/details.d.ts +33 -0
- package/dist/core/rbac/details.d.ts.map +1 -0
- package/dist/core/rbac/details.js +74 -0
- package/dist/core/rbac/details.js.map +1 -0
- package/dist/core/rbac/fields.d.ts +2 -1
- package/dist/core/rbac/fields.d.ts.map +1 -1
- package/dist/core/rbac/fields.js +3 -2
- package/dist/core/rbac/fields.js.map +1 -1
- package/dist/core/rbac/index.d.ts +3 -2
- package/dist/core/rbac/index.d.ts.map +1 -1
- package/dist/core/rbac/index.js +2 -1
- package/dist/core/rbac/index.js.map +1 -1
- package/dist/core/rbac/resolve.d.ts +3 -1
- package/dist/core/rbac/resolve.d.ts.map +1 -1
- package/dist/core/rbac/resolve.js +17 -9
- package/dist/core/rbac/resolve.js.map +1 -1
- package/dist/core/rbac/rls.d.ts +6 -0
- package/dist/core/rbac/rls.d.ts.map +1 -1
- package/dist/core/rbac/rls.js +52 -7
- package/dist/core/rbac/rls.js.map +1 -1
- package/dist/core/rbac/rowScope.d.ts +13 -6
- package/dist/core/rbac/rowScope.d.ts.map +1 -1
- package/dist/core/rbac/rowScope.js +88 -16
- package/dist/core/rbac/rowScope.js.map +1 -1
- package/dist/core/rbac/types.d.ts +6 -7
- package/dist/core/rbac/types.d.ts.map +1 -1
- package/dist/core/script/types.d.ts +1 -1
- package/dist/core/script/types.d.ts.map +1 -1
- package/dist/core/storage/diff.d.ts +10 -2
- package/dist/core/storage/diff.d.ts.map +1 -1
- package/dist/core/storage/diff.js +40 -18
- package/dist/core/storage/diff.js.map +1 -1
- package/dist/core/storage/index.d.ts +7 -1
- package/dist/core/storage/index.d.ts.map +1 -1
- package/dist/core/storage/index.js +6 -1
- package/dist/core/storage/index.js.map +1 -1
- package/dist/core/storage/inspect.d.ts +12 -3
- package/dist/core/storage/inspect.d.ts.map +1 -1
- package/dist/core/storage/inspect.js +39 -22
- package/dist/core/storage/inspect.js.map +1 -1
- package/dist/core/storage/introspect.d.ts +9 -2
- package/dist/core/storage/introspect.d.ts.map +1 -1
- package/dist/core/storage/introspect.js +100 -43
- package/dist/core/storage/introspect.js.map +1 -1
- package/dist/core/storage/link-table.d.ts +47 -0
- package/dist/core/storage/link-table.d.ts.map +1 -0
- package/dist/core/storage/link-table.js +110 -0
- package/dist/core/storage/link-table.js.map +1 -0
- package/dist/core/storage/map.d.ts +14 -5
- package/dist/core/storage/map.d.ts.map +1 -1
- package/dist/core/storage/map.js +207 -39
- package/dist/core/storage/map.js.map +1 -1
- package/dist/core/storage/meta.d.ts +6 -3
- package/dist/core/storage/meta.d.ts.map +1 -1
- package/dist/core/storage/meta.js +9 -5
- package/dist/core/storage/meta.js.map +1 -1
- package/dist/core/storage/migrate.d.ts.map +1 -1
- package/dist/core/storage/migrate.js +144 -11
- package/dist/core/storage/migrate.js.map +1 -1
- package/dist/core/storage/record-key-sql.d.ts +19 -0
- package/dist/core/storage/record-key-sql.d.ts.map +1 -0
- package/dist/core/storage/record-key-sql.js +43 -0
- package/dist/core/storage/record-key-sql.js.map +1 -0
- package/dist/core/storage/record-meta.d.ts +68 -0
- package/dist/core/storage/record-meta.d.ts.map +1 -0
- package/dist/core/storage/record-meta.js +108 -0
- package/dist/core/storage/record-meta.js.map +1 -0
- package/dist/core/storage/report.d.ts +10 -0
- package/dist/core/storage/report.d.ts.map +1 -1
- package/dist/core/storage/report.js +31 -9
- package/dist/core/storage/report.js.map +1 -1
- package/dist/core/storage/sql-literals.d.ts +9 -0
- package/dist/core/storage/sql-literals.d.ts.map +1 -0
- package/dist/core/storage/sql-literals.js +13 -0
- package/dist/core/storage/sql-literals.js.map +1 -0
- package/dist/core/storage/system-tables.d.ts +44 -0
- package/dist/core/storage/system-tables.d.ts.map +1 -0
- package/dist/core/storage/system-tables.js +268 -0
- package/dist/core/storage/system-tables.js.map +1 -0
- package/dist/core/tools/policies.d.ts +2 -2
- package/dist/core/tools/policies.js +2 -2
- package/dist/core/tools/types.d.ts +6 -6
- package/dist/core/tools/types.d.ts.map +1 -1
- package/dist/core/tools/values.d.ts +5 -0
- package/dist/core/tools/values.d.ts.map +1 -1
- package/dist/core/tools/values.js +9 -1
- package/dist/core/tools/values.js.map +1 -1
- package/dist/core/types/currency.d.ts +9 -0
- package/dist/core/types/currency.d.ts.map +1 -0
- package/dist/core/types/currency.js +28 -0
- package/dist/core/types/currency.js.map +1 -0
- package/dist/core/types/field-type.d.ts +60 -6
- package/dist/core/types/field-type.d.ts.map +1 -1
- package/dist/core/types/field-type.js +19 -3
- package/dist/core/types/field-type.js.map +1 -1
- package/dist/core/types/fields.d.ts +118 -20
- package/dist/core/types/fields.d.ts.map +1 -1
- package/dist/core/types/index.d.ts +11 -9
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/core/types/index.js +5 -4
- package/dist/core/types/index.js.map +1 -1
- package/dist/core/types/object.d.ts +27 -2
- package/dist/core/types/object.d.ts.map +1 -1
- package/dist/core/types/permission.d.ts +5 -0
- package/dist/core/types/permission.d.ts.map +1 -1
- package/dist/core/types/primaryField.d.ts +6 -1
- package/dist/core/types/primaryField.d.ts.map +1 -1
- package/dist/core/types/primaryField.js +8 -1
- package/dist/core/types/primaryField.js.map +1 -1
- package/dist/core/types/registry.d.ts +6 -4
- package/dist/core/types/registry.d.ts.map +1 -1
- package/dist/core/types/registry.js +40 -30
- package/dist/core/types/registry.js.map +1 -1
- package/dist/core/types/values.d.ts +102 -27
- package/dist/core/types/values.d.ts.map +1 -1
- package/dist/core/types/values.js +68 -29
- package/dist/core/types/values.js.map +1 -1
- package/dist/core/types/workflow.d.ts +140 -0
- package/dist/core/types/workflow.d.ts.map +1 -0
- package/dist/core/types/workflow.js +49 -0
- package/dist/core/types/workflow.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/event/bus.d.ts.map +1 -1
- package/dist/infrastructure/event/bus.js +14 -0
- package/dist/infrastructure/event/bus.js.map +1 -1
- package/dist/infrastructure/identity.d.ts +2 -2
- package/dist/infrastructure/identity.d.ts.map +1 -1
- package/dist/infrastructure/identity.js.map +1 -1
- package/dist/layout-format.d.ts +6 -6
- package/dist/layout-format.js +4 -4
- package/dist/runtime/data-access/builder.d.ts +15 -5
- package/dist/runtime/data-access/builder.d.ts.map +1 -1
- package/dist/runtime/data-access/builder.js +222 -30
- package/dist/runtime/data-access/builder.js.map +1 -1
- package/dist/runtime/data-access/details.d.ts.map +1 -1
- package/dist/runtime/data-access/details.js +7 -2
- package/dist/runtime/data-access/details.js.map +1 -1
- package/dist/runtime/data-access/formula.d.ts +11 -3
- package/dist/runtime/data-access/formula.d.ts.map +1 -1
- package/dist/runtime/data-access/formula.js +82 -19
- package/dist/runtime/data-access/formula.js.map +1 -1
- package/dist/runtime/data-access/index.d.ts +1 -1
- package/dist/runtime/data-access/index.d.ts.map +1 -1
- package/dist/runtime/data-access/index.js +1 -1
- package/dist/runtime/data-access/index.js.map +1 -1
- package/dist/runtime/data-access/link.d.ts +7 -0
- package/dist/runtime/data-access/link.d.ts.map +1 -0
- package/dist/runtime/data-access/link.js +80 -0
- package/dist/runtime/data-access/link.js.map +1 -0
- package/dist/runtime/data-access/query.d.ts +48 -3
- package/dist/runtime/data-access/query.d.ts.map +1 -1
- package/dist/runtime/data-access/query.js +399 -45
- package/dist/runtime/data-access/query.js.map +1 -1
- package/dist/runtime/data-access/rbac.d.ts.map +1 -1
- package/dist/runtime/data-access/rbac.js +134 -16
- package/dist/runtime/data-access/rbac.js.map +1 -1
- package/dist/runtime/data-access/seqno.d.ts +0 -2
- package/dist/runtime/data-access/seqno.d.ts.map +1 -1
- package/dist/runtime/data-access/seqno.js +0 -9
- package/dist/runtime/data-access/seqno.js.map +1 -1
- package/dist/runtime/data-access/sql-executor.d.ts +13 -3
- package/dist/runtime/data-access/sql-executor.d.ts.map +1 -1
- package/dist/runtime/data-access/sql-executor.js +20 -14
- package/dist/runtime/data-access/sql-executor.js.map +1 -1
- package/dist/runtime/data-access/sql-gate.d.ts +4 -4
- package/dist/runtime/data-access/sql-gate.d.ts.map +1 -1
- package/dist/runtime/data-access/sql-gate.js +5 -5
- package/dist/runtime/data-access/sql-gate.js.map +1 -1
- package/dist/runtime/data-access/tx.d.ts +1 -1
- package/dist/runtime/data-access/tx.js +1 -1
- package/dist/runtime/data-access/types.d.ts +31 -3
- package/dist/runtime/data-access/types.d.ts.map +1 -1
- package/dist/runtime/data-access/validate.d.ts.map +1 -1
- package/dist/runtime/data-access/validate.js +186 -39
- package/dist/runtime/data-access/validate.js.map +1 -1
- package/dist/runtime/data-access/workflow.d.ts +146 -0
- package/dist/runtime/data-access/workflow.d.ts.map +1 -0
- package/dist/runtime/data-access/workflow.js +636 -0
- package/dist/runtime/data-access/workflow.js.map +1 -0
- package/dist/runtime/engine.d.ts +89 -14
- package/dist/runtime/engine.d.ts.map +1 -1
- package/dist/runtime/engine.js +123 -26
- package/dist/runtime/engine.js.map +1 -1
- package/dist/runtime/fieldtypes/loader.d.ts.map +1 -1
- package/dist/runtime/fieldtypes/loader.js +84 -2
- package/dist/runtime/fieldtypes/loader.js.map +1 -1
- package/dist/runtime/git/guardrailSource.d.ts +1 -1
- package/dist/runtime/git/index.d.ts +4 -2
- package/dist/runtime/git/index.d.ts.map +1 -1
- package/dist/runtime/git/index.js +2 -1
- package/dist/runtime/git/index.js.map +1 -1
- package/dist/runtime/git/layoutSource.d.ts +1 -1
- package/dist/runtime/git/loader.d.ts.map +1 -1
- package/dist/runtime/git/loader.js +18 -6
- package/dist/runtime/git/loader.js.map +1 -1
- package/dist/runtime/git/pageCatalog.d.ts +1 -1
- package/dist/runtime/git/schemaChange.d.ts +22 -0
- package/dist/runtime/git/schemaChange.d.ts.map +1 -1
- package/dist/runtime/git/schemaChange.js +28 -2
- package/dist/runtime/git/schemaChange.js.map +1 -1
- package/dist/runtime/git/schemaSource.d.ts +1 -1
- package/dist/runtime/git/sourceFile.d.ts +1 -1
- package/dist/runtime/git/sourceFile.js +1 -1
- package/dist/runtime/git/sourceTransaction.d.ts +1 -1
- package/dist/runtime/git/workflowSource.d.ts +40 -0
- package/dist/runtime/git/workflowSource.d.ts.map +1 -0
- package/dist/runtime/git/workflowSource.js +45 -0
- package/dist/runtime/git/workflowSource.js.map +1 -0
- package/dist/runtime/identity/admin.d.ts +18 -0
- package/dist/runtime/identity/admin.d.ts.map +1 -0
- package/dist/runtime/identity/admin.js +27 -0
- package/dist/runtime/identity/admin.js.map +1 -0
- package/dist/runtime/identity/directory.d.ts +12 -0
- package/dist/runtime/identity/directory.d.ts.map +1 -0
- package/dist/runtime/identity/directory.js +22 -0
- package/dist/runtime/identity/directory.js.map +1 -0
- package/dist/runtime/identity/index.d.ts +11 -0
- package/dist/runtime/identity/index.d.ts.map +1 -0
- package/dist/runtime/identity/index.js +8 -0
- package/dist/runtime/identity/index.js.map +1 -0
- package/dist/runtime/identity/resolve.d.ts +10 -0
- package/dist/runtime/identity/resolve.d.ts.map +1 -0
- package/dist/runtime/identity/resolve.js +16 -0
- package/dist/runtime/identity/resolve.js.map +1 -0
- package/dist/runtime/identity/sources/function.d.ts +10 -0
- package/dist/runtime/identity/sources/function.d.ts.map +1 -0
- package/dist/runtime/identity/sources/function.js +9 -0
- package/dist/runtime/identity/sources/function.js.map +1 -0
- package/dist/runtime/identity/sources/pg.d.ts +42 -0
- package/dist/runtime/identity/sources/pg.d.ts.map +1 -0
- package/dist/runtime/identity/sources/pg.js +121 -0
- package/dist/runtime/identity/sources/pg.js.map +1 -0
- package/dist/runtime/identity/store.d.ts +27 -0
- package/dist/runtime/identity/store.d.ts.map +1 -0
- package/dist/runtime/identity/store.js +139 -0
- package/dist/runtime/identity/store.js.map +1 -0
- package/dist/runtime/identity/sync.d.ts +34 -0
- package/dist/runtime/identity/sync.d.ts.map +1 -0
- package/dist/runtime/identity/sync.js +149 -0
- package/dist/runtime/identity/sync.js.map +1 -0
- package/dist/runtime/metadata/cache.d.ts +0 -2
- package/dist/runtime/metadata/cache.d.ts.map +1 -1
- package/dist/runtime/metadata/cache.js +0 -11
- package/dist/runtime/metadata/cache.js.map +1 -1
- package/dist/runtime/metadata/index.d.ts +1 -1
- package/dist/runtime/metadata/index.d.ts.map +1 -1
- package/dist/runtime/metadata/index.js +1 -1
- package/dist/runtime/metadata/index.js.map +1 -1
- package/dist/runtime/record-meta/index.d.ts +2 -0
- package/dist/runtime/record-meta/index.d.ts.map +1 -0
- package/dist/runtime/record-meta/index.js +2 -0
- package/dist/runtime/record-meta/index.js.map +1 -0
- package/dist/runtime/record-meta/store.d.ts +43 -0
- package/dist/runtime/record-meta/store.d.ts.map +1 -0
- package/dist/runtime/record-meta/store.js +88 -0
- package/dist/runtime/record-meta/store.js.map +1 -0
- package/dist/runtime/sql-analyzer/index.d.ts.map +1 -1
- package/dist/runtime/sql-analyzer/index.js +59 -0
- package/dist/runtime/sql-analyzer/index.js.map +1 -1
- package/dist/runtime/tools/executor.d.ts +11 -11
- package/dist/runtime/tools/executor.d.ts.map +1 -1
- package/dist/runtime/tools/executor.js +6 -6
- package/dist/runtime/tools/executor.js.map +1 -1
- package/dist/runtime/tools/index.d.ts +2 -0
- package/dist/runtime/tools/index.d.ts.map +1 -1
- package/dist/runtime/tools/index.js +1 -0
- package/dist/runtime/tools/index.js.map +1 -1
- package/dist/runtime/tools/policies.d.ts +22 -5
- package/dist/runtime/tools/policies.d.ts.map +1 -1
- package/dist/runtime/tools/policies.js +42 -12
- package/dist/runtime/tools/policies.js.map +1 -1
- package/dist/runtime/tunnel/connector.d.ts +1 -1
- package/dist/runtime/tunnel/forwarder.js +1 -1
- package/dist/runtime/tunnel/framing.d.ts +1 -1
- package/dist/runtime/tunnel/server.d.ts +1 -1
- package/dist/subsystems/approvals/index.d.ts +4 -4
- package/dist/subsystems/approvals/index.d.ts.map +1 -1
- package/dist/subsystems/approvals/index.js +5 -6
- package/dist/subsystems/approvals/index.js.map +1 -1
- package/dist/subsystems/approvals/store.d.ts +1 -3
- package/dist/subsystems/approvals/store.d.ts.map +1 -1
- package/dist/subsystems/approvals/store.js +1 -16
- package/dist/subsystems/approvals/store.js.map +1 -1
- package/dist/subsystems/audit/index.d.ts +1 -1
- package/dist/subsystems/audit/index.d.ts.map +1 -1
- package/dist/subsystems/audit/index.js +2 -3
- package/dist/subsystems/audit/index.js.map +1 -1
- package/dist/subsystems/audit/store.d.ts +0 -2
- package/dist/subsystems/audit/store.d.ts.map +1 -1
- package/dist/subsystems/audit/store.js +0 -21
- package/dist/subsystems/audit/store.js.map +1 -1
- package/dist/subsystems/quota/store.d.ts +9 -0
- package/dist/subsystems/quota/store.d.ts.map +1 -1
- package/dist/subsystems/quota/store.js +0 -8
- package/dist/subsystems/quota/store.js.map +1 -1
- package/dist/subsystems/script/backend/isolated-vm.js +1 -1
- package/dist/subsystems/script/backend/types.d.ts +2 -2
- package/dist/subsystems/script/backend/types.d.ts.map +1 -1
- package/dist/subsystems/script/bridge.d.ts +1 -1
- package/dist/subsystems/script/bridge.d.ts.map +1 -1
- package/dist/subsystems/script/bridge.js +6 -4
- package/dist/subsystems/script/bridge.js.map +1 -1
- package/dist/subsystems/script/dispatcher.d.ts.map +1 -1
- package/dist/subsystems/script/dispatcher.js +3 -1
- package/dist/subsystems/script/dispatcher.js.map +1 -1
- package/dist/subsystems/workflow/index.d.ts +4 -0
- package/dist/subsystems/workflow/index.d.ts.map +1 -0
- package/dist/subsystems/workflow/index.js +3 -0
- package/dist/subsystems/workflow/index.js.map +1 -0
- package/dist/subsystems/workflow/scheduler.d.ts +27 -0
- package/dist/subsystems/workflow/scheduler.d.ts.map +1 -0
- package/dist/subsystems/workflow/scheduler.js +109 -0
- package/dist/subsystems/workflow/scheduler.js.map +1 -0
- package/dist/subsystems/workflow/store.d.ts +10 -0
- package/dist/subsystems/workflow/store.d.ts.map +1 -0
- package/dist/subsystems/workflow/store.js +44 -0
- package/dist/subsystems/workflow/store.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +7 -3
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { IdentitySubject } from '../rbac/types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Single source of truth for the engine generic proxy vocabulary. This module is
|
|
4
4
|
* pure types + static validation (`isAllowedProxyPath`); it carries no network
|
|
@@ -48,7 +48,7 @@ export interface ProxyTarget {
|
|
|
48
48
|
id: string;
|
|
49
49
|
/** customer-engine base URL (used for `direct`; opaque for `tunnel`/`cloud`). */
|
|
50
50
|
url: string;
|
|
51
|
-
/** how the target is reached: `direct` (url) | `tunnel` (HTTP/2 connector) | `cloud` (in-cloud app instance). Forwarder uses `url` today; transport-aware routing is
|
|
51
|
+
/** how the target is reached: `direct` (url) | `tunnel` (HTTP/2 connector) | `cloud` (in-cloud app instance). Forwarder uses `url` today; transport-aware routing is not implemented yet. */
|
|
52
52
|
transport?: string;
|
|
53
53
|
/** read/admin key (the application layer reads it from the connection). */
|
|
54
54
|
apiKey: string;
|
|
@@ -83,9 +83,9 @@ export interface ProxyResponse {
|
|
|
83
83
|
*/
|
|
84
84
|
export interface ProxyTargetResolver {
|
|
85
85
|
/** Resolve a target by instance; `null` when unregistered (→ 404). Whoever can access which connection is the app's call. */
|
|
86
|
-
resolve(instance: string, subject:
|
|
86
|
+
resolve(instance: string, subject: IdentitySubject): Promise<ProxyTarget | null>;
|
|
87
87
|
/** Optional: list targets the subject may reach (for `GET /api/proxy`). */
|
|
88
|
-
list?(subject:
|
|
88
|
+
list?(subject: IdentitySubject): Promise<ProxyTarget[]>;
|
|
89
89
|
}
|
|
90
90
|
/**
|
|
91
91
|
* Pure gate: is `method`+`path` within an `allow` prefix? GET → `read`, every
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/proxy/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/proxy/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD;;;;;;;;;GASG;AAEH,oDAAoD;AACpD,eAAO,MAAM,aAAa;;;;;;CAMhB,CAAC;AACX,MAAM,MAAM,WAAW,GAAG,OAAO,aAAa,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAE3E,yEAAyE;AACzE,eAAO,MAAM,gBAAgB;;;CAGnB,CAAC;AACX,MAAM,MAAM,aAAa,GAAG,OAAO,gBAAgB,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAC;AAEnF;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,kIAAkI;IAClI,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,6HAA6H;IAC7H,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,+GAA+G;AAC/G,eAAO,MAAM,mBAAmB,EAAE,UAGjC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,wEAAwE;IACxE,EAAE,EAAE,MAAM,CAAC;IACX,iFAAiF;IACjF,GAAG,EAAE,MAAM,CAAC;IACZ,6LAA6L;IAC7L,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB;;2EAEuE;IACvE,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,kGAAkG;AAClG,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAC3C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,oHAAoH;IACpH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,6HAA6H;IAC7H,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACjF,2EAA2E;IAC3E,IAAI,CAAC,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;CACzD;AAiBD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAY3F"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import type { ObjectDefinition } from '../types/index.js';
|
|
2
2
|
import type { Locale } from '../i18n/index.js';
|
|
3
|
-
|
|
4
|
-
export declare function
|
|
5
|
-
export declare function
|
|
6
|
-
export declare function
|
|
3
|
+
import { type ObjectLookup } from './details.js';
|
|
4
|
+
export declare function canCreate(def: ObjectDefinition, roles: readonly string[], lookup?: ObjectLookup): boolean;
|
|
5
|
+
export declare function canDelete(def: ObjectDefinition, roles: readonly string[], lookup?: ObjectLookup): boolean;
|
|
6
|
+
export declare function canUpdate(def: ObjectDefinition, roles: readonly string[], lookup?: ObjectLookup): boolean;
|
|
7
|
+
export declare function canUpdateField(def: ObjectDefinition, roles: readonly string[], field: string, lookup?: ObjectLookup): boolean;
|
|
7
8
|
/** allowed update fields; null = all fields, [] = none */
|
|
8
|
-
export declare function allowedUpdateFields(def: ObjectDefinition, roles: readonly string[]): string[] | null;
|
|
9
|
-
export declare function assertCanCreate(def: ObjectDefinition, roles: readonly string[], locale?: Locale): void;
|
|
10
|
-
export declare function assertCanUpdate(def: ObjectDefinition, roles: readonly string[], locale?: Locale): void;
|
|
11
|
-
export declare function assertCanDelete(def: ObjectDefinition, roles: readonly string[], locale?: Locale): void;
|
|
12
|
-
export declare function assertCanUpdateField(def: ObjectDefinition, roles: readonly string[], field: string, locale?: Locale): void;
|
|
9
|
+
export declare function allowedUpdateFields(def: ObjectDefinition, roles: readonly string[], lookup?: ObjectLookup): string[] | null;
|
|
10
|
+
export declare function assertCanCreate(def: ObjectDefinition, roles: readonly string[], locale?: Locale, lookup?: ObjectLookup): void;
|
|
11
|
+
export declare function assertCanUpdate(def: ObjectDefinition, roles: readonly string[], locale?: Locale, lookup?: ObjectLookup): void;
|
|
12
|
+
export declare function assertCanDelete(def: ObjectDefinition, roles: readonly string[], locale?: Locale, lookup?: ObjectLookup): void;
|
|
13
|
+
export declare function assertCanUpdateField(def: ObjectDefinition, roles: readonly string[], field: string, locale?: Locale, lookup?: ObjectLookup): void;
|
|
13
14
|
//# sourceMappingURL=authorize.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authorize.d.ts","sourceRoot":"","sources":["../../../src/core/rbac/authorize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"authorize.d.ts","sourceRoot":"","sources":["../../../src/core/rbac/authorize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,kBAAkB,CAAC;AAG3D,OAAO,EAAwB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAevE,wBAAgB,SAAS,CAAC,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAEzG;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAEzG;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAIzG;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAIT;AAED,0DAA0D;AAC1D,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,MAAM,CAAC,EAAE,YAAY,GACpB,MAAM,EAAE,GAAG,IAAI,CAEjB;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,YAAY,GACpB,IAAI,CAEN;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,YAAY,GACpB,IAAI,CAEN;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,YAAY,GACpB,IAAI,CAEN;AAED,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,YAAY,GACpB,IAAI,CAIN"}
|
|
@@ -1,44 +1,49 @@
|
|
|
1
1
|
import { SchemaError } from '../types/errors.js';
|
|
2
2
|
import { resolvePermission } from './resolve.js';
|
|
3
|
+
import { resolvePermissionFor } from './details.js';
|
|
3
4
|
function deny(locale, code, params) {
|
|
4
5
|
throw new SchemaError(code, params, locale);
|
|
5
6
|
}
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
/** resolve a permission, deriving from a details parent when `lookup` is given */
|
|
8
|
+
function perm(def, roles, lookup) {
|
|
9
|
+
return lookup === undefined ? resolvePermission(def, roles) : resolvePermissionFor(lookup, def, roles);
|
|
8
10
|
}
|
|
9
|
-
export function
|
|
10
|
-
return
|
|
11
|
+
export function canCreate(def, roles, lookup) {
|
|
12
|
+
return perm(def, roles, lookup)?.create === true;
|
|
11
13
|
}
|
|
12
|
-
export function
|
|
13
|
-
|
|
14
|
+
export function canDelete(def, roles, lookup) {
|
|
15
|
+
return perm(def, roles, lookup)?.delete === true;
|
|
16
|
+
}
|
|
17
|
+
export function canUpdate(def, roles, lookup) {
|
|
18
|
+
const p = perm(def, roles, lookup);
|
|
14
19
|
if (p === undefined)
|
|
15
20
|
return false;
|
|
16
21
|
return p.update === null || p.update.length > 0;
|
|
17
22
|
}
|
|
18
|
-
export function canUpdateField(def, roles, field) {
|
|
19
|
-
const p =
|
|
23
|
+
export function canUpdateField(def, roles, field, lookup) {
|
|
24
|
+
const p = perm(def, roles, lookup);
|
|
20
25
|
if (p === undefined)
|
|
21
26
|
return false;
|
|
22
27
|
return p.update === null || p.update.includes(field);
|
|
23
28
|
}
|
|
24
29
|
/** allowed update fields; null = all fields, [] = none */
|
|
25
|
-
export function allowedUpdateFields(def, roles) {
|
|
26
|
-
return
|
|
30
|
+
export function allowedUpdateFields(def, roles, lookup) {
|
|
31
|
+
return perm(def, roles, lookup)?.update ?? null;
|
|
27
32
|
}
|
|
28
|
-
export function assertCanCreate(def, roles, locale) {
|
|
29
|
-
if (!canCreate(def, roles))
|
|
33
|
+
export function assertCanCreate(def, roles, locale, lookup) {
|
|
34
|
+
if (!canCreate(def, roles, lookup))
|
|
30
35
|
deny(locale, 'rbac.denied.create', { object: def.name, role: roles.join(',') });
|
|
31
36
|
}
|
|
32
|
-
export function assertCanUpdate(def, roles, locale) {
|
|
33
|
-
if (!canUpdate(def, roles))
|
|
37
|
+
export function assertCanUpdate(def, roles, locale, lookup) {
|
|
38
|
+
if (!canUpdate(def, roles, lookup))
|
|
34
39
|
deny(locale, 'rbac.denied.update', { object: def.name, role: roles.join(',') });
|
|
35
40
|
}
|
|
36
|
-
export function assertCanDelete(def, roles, locale) {
|
|
37
|
-
if (!canDelete(def, roles))
|
|
41
|
+
export function assertCanDelete(def, roles, locale, lookup) {
|
|
42
|
+
if (!canDelete(def, roles, lookup))
|
|
38
43
|
deny(locale, 'rbac.denied.delete', { object: def.name, role: roles.join(',') });
|
|
39
44
|
}
|
|
40
|
-
export function assertCanUpdateField(def, roles, field, locale) {
|
|
41
|
-
if (!canUpdateField(def, roles, field)) {
|
|
45
|
+
export function assertCanUpdateField(def, roles, field, locale, lookup) {
|
|
46
|
+
if (!canUpdateField(def, roles, field, lookup)) {
|
|
42
47
|
deny(locale, 'rbac.denied.field', { object: def.name, role: roles.join(','), field });
|
|
43
48
|
}
|
|
44
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authorize.js","sourceRoot":"","sources":["../../../src/core/rbac/authorize.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"authorize.js","sourceRoot":"","sources":["../../../src/core/rbac/authorize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ObjectDefinition, ReadScope } from '../types/index.js';
|
|
2
|
+
import type { Locale } from '../i18n/index.js';
|
|
3
|
+
import type { IdentitySubject } from '../provider/identity/types.js';
|
|
4
|
+
import { type ResolvedPermission } from './resolve.js';
|
|
5
|
+
import { type RowScopeFragment } from './rowScope.js';
|
|
6
|
+
/**
|
|
7
|
+
* Details-child permission inheritance.
|
|
8
|
+
*
|
|
9
|
+
* A `details` child is an owned part of its parent record: its effective
|
|
10
|
+
* permission/scope is derived from the parent. A child may **narrow** (declare
|
|
11
|
+
* stricter permissions) but never broaden — the two are intersected. A child
|
|
12
|
+
* with no declared `permissions` is exactly its parent's.
|
|
13
|
+
*/
|
|
14
|
+
/** minimal registry lookup (ObjectRegistry structurally satisfies it) — avoids a core cycle */
|
|
15
|
+
export interface ObjectLookup {
|
|
16
|
+
get(name: string): ObjectDefinition | undefined;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Effective permission for `def`, deriving from its details parent when it is a
|
|
20
|
+
* child (intersection — never broader). Non-child objects resolve as-is.
|
|
21
|
+
*/
|
|
22
|
+
export declare function resolvePermissionFor(lookup: ObjectLookup, def: ObjectDefinition, roles: readonly string[]): ResolvedPermission | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Row-scope fragment for `def`. A details child is scoped by membership in its
|
|
25
|
+
* (scoped) parent set: `EXISTS (SELECT 1 FROM parent p WHERE <parent scope> AND
|
|
26
|
+
* p.<record_key> = child.parent_id)`.
|
|
27
|
+
*
|
|
28
|
+
* `alias` qualifies the child-side column references (the child's `parent_id`),
|
|
29
|
+
* for embedding the predicate in a correlated subquery over an aliased target
|
|
30
|
+
* table (e.g. element-level scoping of a `multiRelation` target).
|
|
31
|
+
*/
|
|
32
|
+
export declare function buildRowScopeFor(lookup: ObjectLookup, def: ObjectDefinition, scope: ReadScope | undefined, subject: IdentitySubject, roles: readonly string[], locale?: Locale, alias?: string): RowScopeFragment | undefined;
|
|
33
|
+
//# sourceMappingURL=details.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"details.d.ts","sourceRoot":"","sources":["../../../src/core/rbac/details.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAErE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAqB,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGrE;;;;;;;GAOG;AAEH,+FAA+F;AAC/F,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAC;CACjD;AAmBD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,kBAAkB,GAAG,SAAS,CAkBhC;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE,SAAS,GAAG,SAAS,EAC5B,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,GACb,gBAAgB,GAAG,SAAS,CAa9B"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { DETAILS_COLUMNS } from '../types/values.js';
|
|
2
|
+
import { resolvePermission } from './resolve.js';
|
|
3
|
+
import { buildRowScope } from './rowScope.js';
|
|
4
|
+
import { recordKeySql } from '../storage/record-key-sql.js';
|
|
5
|
+
const q = (name) => `"${name}"`;
|
|
6
|
+
const SCOPE_RANK = { own: 1, department: 2, all: 3 };
|
|
7
|
+
/** the narrower of two scopes; undefined (denied) on either side wins */
|
|
8
|
+
function narrowerScope(a, b) {
|
|
9
|
+
if (a === undefined || b === undefined)
|
|
10
|
+
return undefined;
|
|
11
|
+
return SCOPE_RANK[a] <= SCOPE_RANK[b] ? a : b;
|
|
12
|
+
}
|
|
13
|
+
/** intersect two allowed-field lists (`null` = all; `[]` = none) */
|
|
14
|
+
function intersectAllowed(a, b) {
|
|
15
|
+
if (a === null)
|
|
16
|
+
return b;
|
|
17
|
+
if (b === null)
|
|
18
|
+
return a;
|
|
19
|
+
const set = new Set(b);
|
|
20
|
+
return a.filter((field) => set.has(field));
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Effective permission for `def`, deriving from its details parent when it is a
|
|
24
|
+
* child (intersection — never broader). Non-child objects resolve as-is.
|
|
25
|
+
*/
|
|
26
|
+
export function resolvePermissionFor(lookup, def, roles) {
|
|
27
|
+
const own = resolvePermission(def, roles);
|
|
28
|
+
const parentName = def.detailsParent;
|
|
29
|
+
if (parentName === undefined)
|
|
30
|
+
return own;
|
|
31
|
+
const parent = lookup.get(parentName);
|
|
32
|
+
if (parent === undefined)
|
|
33
|
+
return own;
|
|
34
|
+
const parentPerm = resolvePermission(parent, roles);
|
|
35
|
+
// fail-closed: a denial on either side denies the child
|
|
36
|
+
if (parentPerm === undefined || own === undefined)
|
|
37
|
+
return undefined;
|
|
38
|
+
return {
|
|
39
|
+
read: narrowerScope(parentPerm.read, own.read),
|
|
40
|
+
manage: narrowerScope(parentPerm.manage, own.manage),
|
|
41
|
+
create: parentPerm.create && own.create,
|
|
42
|
+
update: intersectAllowed(parentPerm.update, own.update),
|
|
43
|
+
delete: parentPerm.delete && own.delete,
|
|
44
|
+
exclude: Array.from(new Set([...parentPerm.exclude, ...own.exclude])),
|
|
45
|
+
createFields: intersectAllowed(parentPerm.createFields, own.createFields),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Row-scope fragment for `def`. A details child is scoped by membership in its
|
|
50
|
+
* (scoped) parent set: `EXISTS (SELECT 1 FROM parent p WHERE <parent scope> AND
|
|
51
|
+
* p.<record_key> = child.parent_id)`.
|
|
52
|
+
*
|
|
53
|
+
* `alias` qualifies the child-side column references (the child's `parent_id`),
|
|
54
|
+
* for embedding the predicate in a correlated subquery over an aliased target
|
|
55
|
+
* table (e.g. element-level scoping of a `multiRelation` target).
|
|
56
|
+
*/
|
|
57
|
+
export function buildRowScopeFor(lookup, def, scope, subject, roles, locale, alias) {
|
|
58
|
+
const parentName = def.detailsParent;
|
|
59
|
+
if (parentName === undefined)
|
|
60
|
+
return buildRowScope(def, scope, subject, roles, locale, alias);
|
|
61
|
+
const parent = lookup.get(parentName);
|
|
62
|
+
if (parent === undefined)
|
|
63
|
+
return buildRowScope(def, scope, subject, roles, locale, alias);
|
|
64
|
+
const parentFragment = buildRowScope(parent, scope, subject, roles, locale, 'p');
|
|
65
|
+
if (parentFragment === undefined)
|
|
66
|
+
return undefined;
|
|
67
|
+
const rk = recordKeySql(parent, (field) => `p.${q(field)}`);
|
|
68
|
+
const childId = alias === undefined ? q(DETAILS_COLUMNS.PARENT_ID) : `${alias}.${q(DETAILS_COLUMNS.PARENT_ID)}`;
|
|
69
|
+
return {
|
|
70
|
+
sql: `EXISTS (SELECT 1 FROM ${q(parent.name)} p WHERE (${parentFragment.sql}) AND ${rk} = ${childId})`,
|
|
71
|
+
params: parentFragment.params,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=details.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"details.js","sourceRoot":"","sources":["../../../src/core/rbac/details.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ObjectDefinition } from '../types/index.js';
|
|
2
|
+
import { type ObjectLookup } from './details.js';
|
|
2
3
|
/** fields hidden from read output for the given roles (empty = nothing hidden) */
|
|
3
|
-
export declare function excludedFields(def: ObjectDefinition, roles: readonly string[]): string[];
|
|
4
|
+
export declare function excludedFields(def: ObjectDefinition, roles: readonly string[], lookup?: ObjectLookup): string[];
|
|
4
5
|
//# sourceMappingURL=fields.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../../src/core/rbac/fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../../src/core/rbac/fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,EAAwB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEvE,kFAAkF;AAClF,wBAAgB,cAAc,CAC5B,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,MAAM,CAAC,EAAE,YAAY,GACpB,MAAM,EAAE,CAEV"}
|
package/dist/core/rbac/fields.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { resolvePermission } from './resolve.js';
|
|
2
|
+
import { resolvePermissionFor } from './details.js';
|
|
2
3
|
/** fields hidden from read output for the given roles (empty = nothing hidden) */
|
|
3
|
-
export function excludedFields(def, roles) {
|
|
4
|
-
return resolvePermission(def, roles)?.exclude ?? [];
|
|
4
|
+
export function excludedFields(def, roles, lookup) {
|
|
5
|
+
return (lookup === undefined ? resolvePermission(def, roles) : resolvePermissionFor(lookup, def, roles))?.exclude ?? [];
|
|
5
6
|
}
|
|
6
7
|
//# sourceMappingURL=fields.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fields.js","sourceRoot":"","sources":["../../../src/core/rbac/fields.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"fields.js","sourceRoot":"","sources":["../../../src/core/rbac/fields.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAqB,MAAM,cAAc,CAAC;AAEvE,kFAAkF;AAClF,MAAM,UAAU,cAAc,CAC5B,GAAqB,EACrB,KAAwB,EACxB,MAAqB;IAErB,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;AAC1H,CAAC"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
export type {
|
|
1
|
+
export type { IdentitySubject } from './types.js';
|
|
2
2
|
export type { ResolvedPermission } from './resolve.js';
|
|
3
3
|
export type { RowScopeFragment } from './rowScope.js';
|
|
4
4
|
export { resolvePermission } from './resolve.js';
|
|
5
5
|
export { canCreate, canDelete, canUpdate, canUpdateField, allowedUpdateFields, assertCanCreate, assertCanUpdate, assertCanDelete, assertCanUpdateField, } from './authorize.js';
|
|
6
6
|
export { buildRowScope } from './rowScope.js';
|
|
7
|
+
export { resolvePermissionFor, buildRowScopeFor, type ObjectLookup } from './details.js';
|
|
7
8
|
export { excludedFields } from './fields.js';
|
|
8
|
-
export { buildRlsPolicy, buildRlsPolicyDdl, buildRlsGrantDdl, policyName } from './rls.js';
|
|
9
|
+
export { buildRlsPolicy, buildRlsPolicyDdl, buildRlsGrantDdl, policyName, isSafeRlsRole } from './rls.js';
|
|
9
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/rbac/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/rbac/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EACL,SAAS,EACT,SAAS,EACT,SAAS,EACT,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,eAAe,EACf,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/core/rbac/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { resolvePermission } from './resolve.js';
|
|
2
2
|
export { canCreate, canDelete, canUpdate, canUpdateField, allowedUpdateFields, assertCanCreate, assertCanUpdate, assertCanDelete, assertCanUpdateField, } from './authorize.js';
|
|
3
3
|
export { buildRowScope } from './rowScope.js';
|
|
4
|
+
export { resolvePermissionFor, buildRowScopeFor } from './details.js';
|
|
4
5
|
export { excludedFields } from './fields.js';
|
|
5
|
-
export { buildRlsPolicy, buildRlsPolicyDdl, buildRlsGrantDdl, policyName } from './rls.js';
|
|
6
|
+
export { buildRlsPolicy, buildRlsPolicyDdl, buildRlsGrantDdl, policyName, isSafeRlsRole } from './rls.js';
|
|
6
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/rbac/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EACL,SAAS,EACT,SAAS,EACT,SAAS,EACT,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,eAAe,EACf,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/rbac/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EACL,SAAS,EACT,SAAS,EACT,SAAS,EACT,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,eAAe,EACf,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAqB,MAAM,cAAc,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -3,6 +3,8 @@ import type { ObjectDefinition, ReadScope } from '../types/index.js';
|
|
|
3
3
|
export interface ResolvedPermission {
|
|
4
4
|
/** read scope; undefined = read denied */
|
|
5
5
|
read?: ReadScope;
|
|
6
|
+
/** write scope (update/delete/transition); defaults to `read` */
|
|
7
|
+
manage?: ReadScope;
|
|
6
8
|
create: boolean;
|
|
7
9
|
/** null = all fields updatable; [] = none; otherwise the whitelist */
|
|
8
10
|
update: string[] | null;
|
|
@@ -16,7 +18,7 @@ export interface ResolvedPermission {
|
|
|
16
18
|
* Resolve the effective permission for a subject's roles.
|
|
17
19
|
* - no `permissions` map on the object → full CRUD (open mode)
|
|
18
20
|
* - permissions declared but none of the roles listed → denied (returns undefined)
|
|
19
|
-
* - multiple roles → merged: read
|
|
21
|
+
* - multiple roles → merged: read/manage take the most permissive scope, update/exclude union
|
|
20
22
|
*/
|
|
21
23
|
export declare function resolvePermission(def: ObjectDefinition, roles: readonly string[]): ResolvedPermission | undefined;
|
|
22
24
|
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/core/rbac/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAwB,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG3F,uFAAuF;AACvF,MAAM,WAAW,kBAAkB;IACjC,0CAA0C;IAC1C,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,sEAAsE;IACtE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,qDAAqD;IACrD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,uFAAuF;IACvF,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAC/B;
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/core/rbac/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAwB,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG3F,uFAAuF;AACvF,MAAM,WAAW,kBAAkB;IACjC,0CAA0C;IAC1C,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,iEAAiE;IACjE,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,sEAAsE;IACtE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,qDAAqD;IACrD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,uFAAuF;IACvF,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAC/B;AA6BD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,kBAAkB,GAAG,SAAS,CA4BhC"}
|
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
import { READ_SCOPES } from '../types/index.js';
|
|
2
|
-
const
|
|
2
|
+
const SCOPE_RANK = { own: 1, department: 2, all: 3 };
|
|
3
|
+
/** the most permissive scope among several (undefined when none is set) */
|
|
4
|
+
function mostPermissive(scopes) {
|
|
5
|
+
let best;
|
|
6
|
+
for (const scope of scopes) {
|
|
7
|
+
if (scope !== undefined && (best === undefined || SCOPE_RANK[scope] > SCOPE_RANK[best]))
|
|
8
|
+
best = scope;
|
|
9
|
+
}
|
|
10
|
+
return best;
|
|
11
|
+
}
|
|
3
12
|
/** defaults for a declared role: unspecified operations are denied (fail-closed) */
|
|
4
13
|
function declaredPermission(p) {
|
|
5
14
|
return {
|
|
6
15
|
read: p.read,
|
|
16
|
+
// manage defaults to the role's read scope (narrow read, broad manage is opt-in)
|
|
17
|
+
manage: p.manage ?? p.read,
|
|
7
18
|
create: p.create ?? false,
|
|
8
19
|
// update: true -> null (all fields updatable); false/undefined -> [] (none)
|
|
9
20
|
update: p.update === true ? null : (typeof p.update === 'boolean' ? [] : (p.update ?? [])),
|
|
@@ -17,11 +28,11 @@ function declaredPermission(p) {
|
|
|
17
28
|
* Resolve the effective permission for a subject's roles.
|
|
18
29
|
* - no `permissions` map on the object → full CRUD (open mode)
|
|
19
30
|
* - permissions declared but none of the roles listed → denied (returns undefined)
|
|
20
|
-
* - multiple roles → merged: read
|
|
31
|
+
* - multiple roles → merged: read/manage take the most permissive scope, update/exclude union
|
|
21
32
|
*/
|
|
22
33
|
export function resolvePermission(def, roles) {
|
|
23
34
|
if (def.permissions === undefined) {
|
|
24
|
-
return { read: READ_SCOPES.ALL, create: true, update: null, delete: true, exclude: [], createFields: null };
|
|
35
|
+
return { read: READ_SCOPES.ALL, manage: READ_SCOPES.ALL, create: true, update: null, delete: true, exclude: [], createFields: null };
|
|
25
36
|
}
|
|
26
37
|
const resolved = [];
|
|
27
38
|
for (const role of roles) {
|
|
@@ -31,12 +42,8 @@ export function resolvePermission(def, roles) {
|
|
|
31
42
|
}
|
|
32
43
|
if (resolved.length === 0)
|
|
33
44
|
return undefined;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
if (r.read !== undefined && (read === undefined || READ_RANK[r.read] > READ_RANK[read])) {
|
|
37
|
-
read = r.read;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
45
|
+
const read = mostPermissive(resolved.map((r) => r.read));
|
|
46
|
+
const manage = mostPermissive(resolved.map((r) => r.manage));
|
|
40
47
|
const update = resolved.some((r) => r.update === null)
|
|
41
48
|
? null
|
|
42
49
|
: Array.from(new Set(resolved.flatMap((r) => r.update ?? [])));
|
|
@@ -45,6 +52,7 @@ export function resolvePermission(def, roles) {
|
|
|
45
52
|
: Array.from(new Set(resolved.flatMap((r) => r.createFields ?? [])));
|
|
46
53
|
return {
|
|
47
54
|
read,
|
|
55
|
+
manage,
|
|
48
56
|
create: resolved.some((r) => r.create),
|
|
49
57
|
delete: resolved.some((r) => r.delete),
|
|
50
58
|
update,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/core/rbac/resolve.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/core/rbac/resolve.ts"],"names":[],"mappings":"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"}
|
package/dist/core/rbac/rls.d.ts
CHANGED
|
@@ -9,4 +9,10 @@ export declare function buildRlsPolicy(def: ObjectDefinition): string | undefine
|
|
|
9
9
|
export declare function buildRlsPolicyDdl(def: ObjectDefinition): string[];
|
|
10
10
|
/** GRANT the restricted-SQL role read access to one object */
|
|
11
11
|
export declare function buildRlsGrantDdl(def: ObjectDefinition, role: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* True when `role` is a safe, non-reserved identifier for `SET LOCAL ROLE` /
|
|
14
|
+
* `CREATE ROLE`. The name is always emitted quoted (`sqlIdent`), so this guards
|
|
15
|
+
* against pseudo-roles and reserved keywords rather than injection.
|
|
16
|
+
*/
|
|
17
|
+
export declare function isSafeRlsRole(role: string): boolean;
|
|
12
18
|
//# sourceMappingURL=rls.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rls.d.ts","sourceRoot":"","sources":["../../../src/core/rbac/rls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"rls.d.ts","sourceRoot":"","sources":["../../../src/core/rbac/rls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAiC1D,wBAAgB,UAAU,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,CAExD;AAUD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAwBxE;AAED,qFAAqF;AACrF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAQjE;AAED,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5E;AAkCD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGnD"}
|
package/dist/core/rbac/rls.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { READ_SCOPES, ROW_SCOPE_MARKERS } from '../types/index.js';
|
|
2
|
+
import { sqlIdent } from '../storage/sql-literals.js';
|
|
2
3
|
const q = (id) => `"${id}"`;
|
|
3
4
|
/**
|
|
4
5
|
* Row-level security policy generation for the script sandbox's restricted SQL
|
|
@@ -7,15 +8,21 @@ const q = (id) => `"${id}"`;
|
|
|
7
8
|
* `db.query` switches to a dedicated non-owner role (`SET LOCAL ROLE`) that IS
|
|
8
9
|
* subject to RLS, and the subject is carried in session GUCs:
|
|
9
10
|
*
|
|
10
|
-
* - `weavekit.roles`
|
|
11
|
-
* - `weavekit.actor_id`
|
|
12
|
-
* - `weavekit.
|
|
11
|
+
* - `weavekit.roles` comma-joined role names
|
|
12
|
+
* - `weavekit.actor_id` subject id (own scope)
|
|
13
|
+
* - `weavekit.department_id` subject department id (department scope)
|
|
13
14
|
*
|
|
14
15
|
* Unset GUCs resolve to NULL → the predicate is false → **0 rows (fail-closed)**.
|
|
15
16
|
*
|
|
16
17
|
* The predicate mirrors `resolvePermission` + `buildRowScope`: this is a second
|
|
17
18
|
* encoding of the same matrix, so a parity test (db.objects vs db.query must
|
|
18
19
|
* return the same rows for the same subject) guards against drift.
|
|
20
|
+
*
|
|
21
|
+
* Limitation: a script's `db.query` scopes `own`/`department` by flat equality
|
|
22
|
+
* on the marked column (internal source). The recursive department subtree and
|
|
23
|
+
* external-source translation are applied only by the application-layer
|
|
24
|
+
* `buildRowScope`; use `db.objects` for those. (Flat equality is strictly
|
|
25
|
+
* narrower, so RLS never over-exposes.)
|
|
19
26
|
*/
|
|
20
27
|
const POLICY_PREFIX = 'weavekit_read_';
|
|
21
28
|
export function policyName(def) {
|
|
@@ -49,10 +56,10 @@ export function buildRlsPolicy(def) {
|
|
|
49
56
|
clauses.push(`(${roleIn(role)} AND current_setting('weavekit.actor_id', true) = ${q(field)})`);
|
|
50
57
|
}
|
|
51
58
|
}
|
|
52
|
-
else if (p.read === READ_SCOPES.
|
|
53
|
-
const field = markerField(def, ROW_SCOPE_MARKERS.
|
|
59
|
+
else if (p.read === READ_SCOPES.DEPARTMENT) {
|
|
60
|
+
const field = markerField(def, ROW_SCOPE_MARKERS.DEPARTMENT);
|
|
54
61
|
if (field !== undefined) {
|
|
55
|
-
clauses.push(`(${roleIn(role)} AND current_setting('weavekit.
|
|
62
|
+
clauses.push(`(${roleIn(role)} AND current_setting('weavekit.department_id', true) = ${q(field)})`);
|
|
56
63
|
}
|
|
57
64
|
}
|
|
58
65
|
}
|
|
@@ -72,6 +79,44 @@ export function buildRlsPolicyDdl(def) {
|
|
|
72
79
|
}
|
|
73
80
|
/** GRANT the restricted-SQL role read access to one object */
|
|
74
81
|
export function buildRlsGrantDdl(def, role) {
|
|
75
|
-
return `GRANT SELECT ON ${q(def.name)} TO ${role};`;
|
|
82
|
+
return `GRANT SELECT ON ${q(def.name)} TO ${sqlIdent(role)};`;
|
|
83
|
+
}
|
|
84
|
+
/** the restricted-SQL role name shape (`weavekit_query`, …) */
|
|
85
|
+
const RLS_ROLE_RE = /^[a-z_][a-z0-9_]*$/;
|
|
86
|
+
/**
|
|
87
|
+
* PostgreSQL reserved keywords (Appendix C, "reserved" + "reserved, can be
|
|
88
|
+
* function or type name"). Rejected as a role name so a config typo can never
|
|
89
|
+
* produce an ambiguous DDL token; identifiers are also quoted below, so an
|
|
90
|
+
* accepted name is always emitted safely.
|
|
91
|
+
*/
|
|
92
|
+
const RESERVED_SQL_KEYWORDS = new Set([
|
|
93
|
+
'all', 'analyse', 'analyze', 'and', 'any', 'array', 'as', 'asc', 'asymmetric',
|
|
94
|
+
'authorization', 'binary', 'both', 'case', 'cast', 'check', 'collate',
|
|
95
|
+
'collation', 'column', 'concurrently', 'constraint', 'create', 'cross',
|
|
96
|
+
'current_catalog', 'current_date', 'current_role', 'current_schema',
|
|
97
|
+
'current_time', 'current_timestamp', 'current_user', 'default', 'deferrable',
|
|
98
|
+
'desc', 'distinct', 'do', 'else', 'end', 'except', 'false', 'fetch', 'for',
|
|
99
|
+
'foreign', 'freeze', 'from', 'full', 'grant', 'group', 'having', 'ilike',
|
|
100
|
+
'in', 'initially', 'inner', 'intersect', 'into', 'is', 'isnull', 'join',
|
|
101
|
+
'lateral', 'leading', 'left', 'like', 'limit', 'localtime', 'localtimestamp',
|
|
102
|
+
'natural', 'not', 'notnull', 'null', 'offset', 'on', 'only', 'or', 'order',
|
|
103
|
+
'outer', 'over', 'overlaps', 'placing', 'primary', 'references', 'returning',
|
|
104
|
+
'right', 'select', 'session_user', 'similar', 'some', 'symmetric', 'table',
|
|
105
|
+
'tablesample', 'then', 'to', 'trailing', 'true', 'union', 'unique', 'user',
|
|
106
|
+
'using', 'variadic', 'verbose', 'when', 'where', 'window', 'with',
|
|
107
|
+
]);
|
|
108
|
+
/** PostgreSQL pseudo-roles that cannot be created / used as a target role */
|
|
109
|
+
const PSEUDO_ROLES = new Set([
|
|
110
|
+
'public', 'current_user', 'session_user', 'current_role', 'current_catalog',
|
|
111
|
+
'current_schema', 'none', 'group',
|
|
112
|
+
]);
|
|
113
|
+
/**
|
|
114
|
+
* True when `role` is a safe, non-reserved identifier for `SET LOCAL ROLE` /
|
|
115
|
+
* `CREATE ROLE`. The name is always emitted quoted (`sqlIdent`), so this guards
|
|
116
|
+
* against pseudo-roles and reserved keywords rather than injection.
|
|
117
|
+
*/
|
|
118
|
+
export function isSafeRlsRole(role) {
|
|
119
|
+
const lower = role.toLowerCase();
|
|
120
|
+
return RLS_ROLE_RE.test(role) && !RESERVED_SQL_KEYWORDS.has(lower) && !PSEUDO_ROLES.has(lower);
|
|
76
121
|
}
|
|
77
122
|
//# sourceMappingURL=rls.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rls.js","sourceRoot":"","sources":["../../../src/core/rbac/rls.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"rls.js","sourceRoot":"","sources":["../../../src/core/rbac/rls.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
import type { ObjectDefinition, ReadScope } from '../types/index.js';
|
|
2
2
|
import type { Locale } from '../i18n/index.js';
|
|
3
|
-
import type {
|
|
3
|
+
import type { IdentitySubject } from '../provider/identity/types.js';
|
|
4
4
|
export interface RowScopeFragment {
|
|
5
5
|
sql: string;
|
|
6
6
|
params: unknown[];
|
|
7
7
|
}
|
|
8
8
|
/**
|
|
9
|
-
* Build the row-level WHERE fragment for a read
|
|
10
|
-
* - all → undefined (no restriction)
|
|
11
|
-
* - own →
|
|
12
|
-
* -
|
|
9
|
+
* Build the row-level WHERE fragment for a scope (`read` or `manage`):
|
|
10
|
+
* - `all` → undefined (no restriction)
|
|
11
|
+
* - `own` → the record's ownership column identifies the subject
|
|
12
|
+
* - `department` → the record's department (a declared `department` column, or
|
|
13
|
+
* derived from its owner's `weavekit_user.department_id`) is the subject's
|
|
14
|
+
* department or a descendant (recursive over `weavekit_department`)
|
|
15
|
+
*
|
|
16
|
+
* The fragment uses `$1` for the subject attribute; `builder.scopeSuffix`
|
|
17
|
+
* renumbers it against the surrounding query. `alias` qualifies the scope
|
|
18
|
+
* column references against a table alias (used when embedding the predicate in
|
|
19
|
+
* a correlated subquery, e.g. a details child scoped by its parent).
|
|
13
20
|
*/
|
|
14
|
-
export declare function buildRowScope(def: ObjectDefinition,
|
|
21
|
+
export declare function buildRowScope(def: ObjectDefinition, scope: ReadScope | undefined, subject: IdentitySubject, roles: readonly string[], locale?: Locale, alias?: string): RowScopeFragment | undefined;
|
|
15
22
|
//# sourceMappingURL=rowScope.d.ts.map
|