node-type-registry 0.37.0 → 0.39.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.
Files changed (113) hide show
  1. package/blueprint-types.generated.d.ts +13 -11
  2. package/codegen/generate-types.js +11 -7
  3. package/data/index.d.ts +0 -15
  4. package/data/index.js +1 -31
  5. package/esm/blueprint-types.generated.d.ts +13 -11
  6. package/esm/codegen/generate-types.js +11 -7
  7. package/esm/data/index.d.ts +0 -15
  8. package/esm/data/index.js +0 -15
  9. package/esm/event/index.d.ts +2 -0
  10. package/esm/event/index.js +2 -0
  11. package/esm/event/referral.d.ts +2 -0
  12. package/esm/event/referral.js +62 -0
  13. package/esm/index.d.ts +4 -0
  14. package/esm/index.js +12 -0
  15. package/esm/job/index.d.ts +1 -0
  16. package/esm/job/index.js +1 -0
  17. package/esm/limit/index.d.ts +8 -0
  18. package/esm/limit/index.js +8 -0
  19. package/esm/module-presets/auth-email-magic.js +2 -2
  20. package/esm/module-presets/auth-email.js +5 -5
  21. package/esm/module-presets/auth-hardened.js +2 -2
  22. package/esm/module-presets/auth-passkey.js +2 -2
  23. package/esm/module-presets/auth-sso.d.ts +1 -1
  24. package/esm/module-presets/auth-sso.js +5 -5
  25. package/esm/module-presets/b2b-storage.js +6 -6
  26. package/esm/module-presets/b2b.js +2 -2
  27. package/esm/module-presets/minimal.d.ts +1 -1
  28. package/esm/module-presets/minimal.js +3 -3
  29. package/esm/{data/data-chunks.js → process/chunks.js} +2 -3
  30. package/esm/{data/data-file-embedding.js → process/file-embedding.js} +2 -2
  31. package/esm/process/index.d.ts +5 -0
  32. package/esm/process/index.js +5 -0
  33. package/event/index.d.ts +2 -0
  34. package/event/index.js +7 -0
  35. package/event/referral.d.ts +2 -0
  36. package/event/referral.js +65 -0
  37. package/index.d.ts +4 -0
  38. package/index.js +12 -0
  39. package/job/index.d.ts +1 -0
  40. package/job/index.js +5 -0
  41. package/limit/index.d.ts +8 -0
  42. package/limit/index.js +19 -0
  43. package/module-presets/auth-email-magic.js +2 -2
  44. package/module-presets/auth-email.js +5 -5
  45. package/module-presets/auth-hardened.js +2 -2
  46. package/module-presets/auth-passkey.js +2 -2
  47. package/module-presets/auth-sso.d.ts +1 -1
  48. package/module-presets/auth-sso.js +5 -5
  49. package/module-presets/b2b-storage.js +6 -6
  50. package/module-presets/b2b.js +2 -2
  51. package/module-presets/minimal.d.ts +1 -1
  52. package/module-presets/minimal.js +3 -3
  53. package/package.json +2 -2
  54. package/{data/data-chunks.js → process/chunks.js} +2 -3
  55. package/{data/data-file-embedding.js → process/file-embedding.js} +2 -2
  56. package/process/index.d.ts +5 -0
  57. package/process/index.js +13 -0
  58. /package/{data/event-tracker.d.ts → esm/event/tracker.d.ts} +0 -0
  59. /package/esm/{data/event-tracker.js → event/tracker.js} +0 -0
  60. /package/{data/data-job-trigger.d.ts → esm/job/trigger.d.ts} +0 -0
  61. /package/esm/{data/data-job-trigger.js → job/trigger.js} +0 -0
  62. /package/{data/data-aggregate-limit-counter.d.ts → esm/limit/enforce-aggregate.d.ts} +0 -0
  63. /package/esm/{data/data-aggregate-limit-counter.js → limit/enforce-aggregate.js} +0 -0
  64. /package/{data/data-limit-counter.d.ts → esm/limit/enforce-counter.d.ts} +0 -0
  65. /package/esm/{data/data-limit-counter.js → limit/enforce-counter.js} +0 -0
  66. /package/{data/data-feature-flag.d.ts → esm/limit/enforce-feature.d.ts} +0 -0
  67. /package/esm/{data/data-feature-flag.js → limit/enforce-feature.js} +0 -0
  68. /package/{data/data-meter-rate-limit.d.ts → esm/limit/enforce-rate.d.ts} +0 -0
  69. /package/esm/{data/data-meter-rate-limit.js → limit/enforce-rate.js} +0 -0
  70. /package/{data/data-billing-meter.d.ts → esm/limit/track-usage.d.ts} +0 -0
  71. /package/esm/{data/data-billing-meter.js → limit/track-usage.js} +0 -0
  72. /package/{data/limit-warning-aggregate.d.ts → esm/limit/warning-aggregate.d.ts} +0 -0
  73. /package/esm/{data/limit-warning-aggregate.js → limit/warning-aggregate.js} +0 -0
  74. /package/{data/limit-warning-counter.d.ts → esm/limit/warning-counter.d.ts} +0 -0
  75. /package/esm/{data/limit-warning-counter.js → limit/warning-counter.js} +0 -0
  76. /package/{data/limit-warning-rate.d.ts → esm/limit/warning-rate.d.ts} +0 -0
  77. /package/esm/{data/limit-warning-rate.js → limit/warning-rate.js} +0 -0
  78. /package/{data/data-chunks.d.ts → esm/process/chunks.d.ts} +0 -0
  79. /package/{data/process-extraction.d.ts → esm/process/extraction.d.ts} +0 -0
  80. /package/esm/{data/process-extraction.js → process/extraction.js} +0 -0
  81. /package/{data/data-file-embedding.d.ts → esm/process/file-embedding.d.ts} +0 -0
  82. /package/{data/data-image-embedding.d.ts → esm/process/image-embedding.d.ts} +0 -0
  83. /package/esm/{data/data-image-embedding.js → process/image-embedding.js} +0 -0
  84. /package/{data/process-image-versions.d.ts → esm/process/image-versions.d.ts} +0 -0
  85. /package/esm/{data/process-image-versions.js → process/image-versions.js} +0 -0
  86. /package/{esm/data/event-tracker.d.ts → event/tracker.d.ts} +0 -0
  87. /package/{data/event-tracker.js → event/tracker.js} +0 -0
  88. /package/{esm/data/data-job-trigger.d.ts → job/trigger.d.ts} +0 -0
  89. /package/{data/data-job-trigger.js → job/trigger.js} +0 -0
  90. /package/{esm/data/data-aggregate-limit-counter.d.ts → limit/enforce-aggregate.d.ts} +0 -0
  91. /package/{data/data-aggregate-limit-counter.js → limit/enforce-aggregate.js} +0 -0
  92. /package/{esm/data/data-limit-counter.d.ts → limit/enforce-counter.d.ts} +0 -0
  93. /package/{data/data-limit-counter.js → limit/enforce-counter.js} +0 -0
  94. /package/{esm/data/data-feature-flag.d.ts → limit/enforce-feature.d.ts} +0 -0
  95. /package/{data/data-feature-flag.js → limit/enforce-feature.js} +0 -0
  96. /package/{esm/data/data-meter-rate-limit.d.ts → limit/enforce-rate.d.ts} +0 -0
  97. /package/{data/data-meter-rate-limit.js → limit/enforce-rate.js} +0 -0
  98. /package/{esm/data/data-billing-meter.d.ts → limit/track-usage.d.ts} +0 -0
  99. /package/{data/data-billing-meter.js → limit/track-usage.js} +0 -0
  100. /package/{esm/data/limit-warning-aggregate.d.ts → limit/warning-aggregate.d.ts} +0 -0
  101. /package/{data/limit-warning-aggregate.js → limit/warning-aggregate.js} +0 -0
  102. /package/{esm/data/limit-warning-counter.d.ts → limit/warning-counter.d.ts} +0 -0
  103. /package/{data/limit-warning-counter.js → limit/warning-counter.js} +0 -0
  104. /package/{esm/data/limit-warning-rate.d.ts → limit/warning-rate.d.ts} +0 -0
  105. /package/{data/limit-warning-rate.js → limit/warning-rate.js} +0 -0
  106. /package/{esm/data/data-chunks.d.ts → process/chunks.d.ts} +0 -0
  107. /package/{esm/data/process-extraction.d.ts → process/extraction.d.ts} +0 -0
  108. /package/{data/process-extraction.js → process/extraction.js} +0 -0
  109. /package/{esm/data/data-file-embedding.d.ts → process/file-embedding.d.ts} +0 -0
  110. /package/{esm/data/data-image-embedding.d.ts → process/image-embedding.d.ts} +0 -0
  111. /package/{data/data-image-embedding.js → process/image-embedding.js} +0 -0
  112. /package/{esm/data/process-image-versions.d.ts → process/image-versions.d.ts} +0 -0
  113. /package/{data/process-image-versions.js → process/image-versions.js} +0 -0
@@ -38,8 +38,8 @@ export const PresetAuthEmailMagic = {
38
38
  'levels_module:app',
39
39
  'memberships_module:app',
40
40
  'sessions_module',
41
- 'secrets_module',
42
- 'encrypted_secrets_module',
41
+ 'user_state_module',
42
+ 'config_secrets_user_module',
43
43
  'emails_module',
44
44
  'rls_module',
45
45
  'user_auth_module',
@@ -23,7 +23,7 @@ export const PresetAuthEmail = {
23
23
  summary: 'Standard email/password auth flow with app-level permissions. No orgs, no SSO, no MFA.',
24
24
  description: 'Installs `user_auth_module` with exactly the table dependencies its insert trigger ' +
25
25
  'hard-requires: users, app-scoped memberships (plus their permissions/limits/levels ' +
26
- 'dependencies), emails, secrets, encrypted secrets, sessions, plus RLS. You get the ' +
26
+ 'dependencies), emails, user state, user secrets, sessions, plus RLS. You get the ' +
27
27
  'standard password-based auth procedures (sign_up, sign_in, reset_password, ' +
28
28
  "verify_email, delete_account, ...) and that's it. Everything else in the module " +
29
29
  'catalog — SSO, passkeys, SMS, rate limits, orgs, invites — is deliberately omitted. ' +
@@ -49,8 +49,8 @@ export const PresetAuthEmail = {
49
49
  'levels_module:app',
50
50
  'memberships_module:app',
51
51
  'sessions_module',
52
- 'secrets_module',
53
- 'encrypted_secrets_module',
52
+ 'user_state_module',
53
+ 'config_secrets_user_module',
54
54
  'emails_module',
55
55
  'rls_module',
56
56
  'user_auth_module'
@@ -62,8 +62,8 @@ export const PresetAuthEmail = {
62
62
  'limits_module:app': 'Required by `memberships_module:app`: NOT NULL FK to caps table.',
63
63
  'levels_module:app': 'Required by `memberships_module:app`: NOT NULL FK to levels table.',
64
64
  emails_module: 'Required by the `user_auth_module` insert trigger (`RAISE EXCEPTION REQUIRES emails_module`).',
65
- encrypted_secrets_module: 'Required for password hashing; referenced by `set_password`, `verify_password`, and reset flows.',
66
- secrets_module: 'API-key storage (`create_api_key`, `revoke_api_key`, `my_api_keys`).'
65
+ config_secrets_user_module: 'Required for password hashing; referenced by `set_password`, `verify_password`, and reset flows.',
66
+ user_state_module: 'API-key storage (`create_api_key`, `revoke_api_key`, `my_api_keys`).'
67
67
  },
68
68
  omits_notes: {
69
69
  rate_limits_module: 'Omitted intentionally; throttle_* helpers are null-safe and the auth procs compile without it. Add later via `auth:hardened`.',
@@ -35,8 +35,8 @@ export const PresetAuthHardened = {
35
35
  'levels_module:app',
36
36
  'memberships_module:app',
37
37
  'sessions_module',
38
- 'secrets_module',
39
- 'encrypted_secrets_module',
38
+ 'user_state_module',
39
+ 'config_secrets_user_module',
40
40
  'emails_module',
41
41
  'rls_module',
42
42
  'user_auth_module',
@@ -36,8 +36,8 @@ export const PresetAuthPasskey = {
36
36
  'levels_module:app',
37
37
  'memberships_module:app',
38
38
  'sessions_module',
39
- 'secrets_module',
40
- 'encrypted_secrets_module',
39
+ 'user_state_module',
40
+ 'config_secrets_user_module',
41
41
  'emails_module',
42
42
  'rls_module',
43
43
  'user_auth_module',
@@ -6,7 +6,7 @@ import type { ModulePreset } from './types';
6
6
  * `(provider, external_id)`) and `identity_providers_module` (the provider
7
7
  * config: URLs, client_id, encrypted client_secret, scopes, PKCE/nonce
8
8
  * knobs). The generator then emits `sign_in_identity` / `sign_up_identity`
9
- * procedures which rely on `encrypted_secrets_module` to decrypt the client
9
+ * procedures which rely on `config_secrets_user_module` to decrypt the client
10
10
  * secret at auth time.
11
11
  *
12
12
  * Password fallback stays on by default (break-glass for admins); flip the
@@ -5,7 +5,7 @@
5
5
  * `(provider, external_id)`) and `identity_providers_module` (the provider
6
6
  * config: URLs, client_id, encrypted client_secret, scopes, PKCE/nonce
7
7
  * knobs). The generator then emits `sign_in_identity` / `sign_up_identity`
8
- * procedures which rely on `encrypted_secrets_module` to decrypt the client
8
+ * procedures which rely on `config_secrets_user_module` to decrypt the client
9
9
  * secret at auth time.
10
10
  *
11
11
  * Password fallback stays on by default (break-glass for admins); flip the
@@ -26,7 +26,7 @@ export const PresetAuthSso = {
26
26
  'encrypted client secrets) and `connected_accounts_module` (the junction mapping a ' +
27
27
  'Constructive user to a `(provider, external_id)` pair). The generator emits ' +
28
28
  '`sign_in_identity` and `sign_up_identity` procedures which decrypt the client secret ' +
29
- 'through `encrypted_secrets_module` at auth time. Keep password flows as break-glass, or ' +
29
+ 'through `config_secrets_user_module` at auth time. Keep password flows as break-glass, or ' +
30
30
  'disable them via `app_settings_auth` toggles for strictly-SSO deployments.',
31
31
  good_for: [
32
32
  'B2B apps where end users sign in via their employer IdP',
@@ -45,8 +45,8 @@ export const PresetAuthSso = {
45
45
  'levels_module:app',
46
46
  'memberships_module:app',
47
47
  'sessions_module',
48
- 'secrets_module',
49
- 'encrypted_secrets_module',
48
+ 'user_state_module',
49
+ 'config_secrets_user_module',
50
50
  'emails_module',
51
51
  'rls_module',
52
52
  'user_auth_module',
@@ -56,7 +56,7 @@ export const PresetAuthSso = {
56
56
  includes_notes: {
57
57
  connected_accounts_module: 'Junction table for (user, provider, external_id). Without it, `sign_in_identity` does not compile.',
58
58
  identity_providers_module: 'Provider config table (URLs, client_id, encrypted client_secret, scopes, PKCE knobs).',
59
- encrypted_secrets_module: 'Required by `auth:email` already; also used by SSO to decrypt the provider client_secret at auth time.'
59
+ config_secrets_user_module: 'Required by `auth:email` already; also used by SSO to decrypt the provider client_secret at auth time.'
60
60
  },
61
61
  omits_notes: {
62
62
  webauthn_credentials_module: 'No passkeys — add `auth:passkey` or move to `auth:hardened`.',
@@ -17,9 +17,9 @@ export const PresetB2bStorage = {
17
17
  'hierarchy), plus `storage_module` for file uploads. The storage module creates ' +
18
18
  '`app_buckets` and `app_files` tables with full RLS: AuthzPublishable for public reads, ' +
19
19
  'AuthzAppMembership for member access, AuthzDirectOwner for uploader-only modify/delete. ' +
20
- 'Entity-type provisioning with `has_storage=true` adds per-scope storage tables ' +
21
- 'automatically. Choose this when your B2B app needs file uploads, avatars, attachments, ' +
22
- 'or any object storage tied to workspaces.',
20
+ 'Entity-type provisioning with a non-empty `storage` array adds per-scope storage tables ' +
21
+ 'automatically (multiple modules per entity via storage_key). Choose this when your B2B ' +
22
+ 'app needs file uploads, avatars, attachments, or any object storage tied to workspaces.',
23
23
  good_for: [
24
24
  'B2B SaaS with file uploads (documents, avatars, attachments)',
25
25
  'Apps where storage is scoped to orgs/workspaces',
@@ -41,8 +41,8 @@ export const PresetB2bStorage = {
41
41
  'memberships_module:app',
42
42
  'memberships_module:org',
43
43
  'sessions_module',
44
- 'secrets_module',
45
- 'encrypted_secrets_module',
44
+ 'user_state_module',
45
+ 'config_secrets_user_module',
46
46
  'emails_module',
47
47
  'rls_module',
48
48
  'user_auth_module',
@@ -62,7 +62,7 @@ export const PresetB2bStorage = {
62
62
  'devices_module'
63
63
  ],
64
64
  includes_notes: {
65
- storage_module: 'File upload infrastructure: app_buckets + app_files tables with RLS. Entity-type storage scopes layered on top via `has_storage=true`.',
65
+ storage_module: 'File upload infrastructure: app_buckets + app_files tables with RLS. Entity-type storage scopes layered on top via the `storage` array (array-only format, supports multiple modules per entity via storage_key).',
66
66
  devices_module: 'Device tracking and trusted-device MFA bypass.'
67
67
  },
68
68
  omits_notes: {
@@ -37,8 +37,8 @@ export const PresetB2b = {
37
37
  'memberships_module:app',
38
38
  'memberships_module:org',
39
39
  'sessions_module',
40
- 'secrets_module',
41
- 'encrypted_secrets_module',
40
+ 'user_state_module',
41
+ 'config_secrets_user_module',
42
42
  'emails_module',
43
43
  'rls_module',
44
44
  'user_auth_module',
@@ -5,7 +5,7 @@ import type { ModulePreset } from './types';
5
5
  *
6
6
  * This is the barest foundation: a `users` table, a `sessions` table so
7
7
  * something upstream can mint tokens, `rls_module` so row-level security
8
- * is enforceable, and `secrets_module` so you can issue API keys. Nothing
8
+ * is enforceable, and `user_state_module` so you can issue API keys. Nothing
9
9
  * else.
10
10
  *
11
11
  * You still write your own identity bridge on top (or rely on a header-based
@@ -4,7 +4,7 @@
4
4
  *
5
5
  * This is the barest foundation: a `users` table, a `sessions` table so
6
6
  * something upstream can mint tokens, `rls_module` so row-level security
7
- * is enforceable, and `secrets_module` so you can issue API keys. Nothing
7
+ * is enforceable, and `user_state_module` so you can issue API keys. Nothing
8
8
  * else.
9
9
  *
10
10
  * You still write your own identity bridge on top (or rely on a header-based
@@ -32,13 +32,13 @@ export const PresetMinimal = {
32
32
  'users_module',
33
33
  'sessions_module',
34
34
  'rls_module',
35
- 'secrets_module'
35
+ 'user_state_module'
36
36
  ],
37
37
  includes_notes: {
38
38
  users_module: 'The canonical users table. Required by every preset.',
39
39
  sessions_module: 'Session/token storage; needed so whatever upstream auth can mint a session row.',
40
40
  rls_module: 'RLS policy infrastructure. Without it, row-level security is not enforced.',
41
- secrets_module: 'API-key storage. Optional for this preset but almost always wanted alongside upstream auth.'
41
+ user_state_module: 'API-key storage. Optional for this preset but almost always wanted alongside upstream auth.'
42
42
  },
43
43
  omits_notes: {
44
44
  user_auth_module: 'No server-side sign_up/sign_in procedures in this preset.',
@@ -90,9 +90,8 @@ export const ProcessChunks = {
90
90
  type: 'array',
91
91
  items: { type: 'string', enum: ['fulltext', 'bm25', 'trigram'] },
92
92
  description: 'Text search indexes to create on the chunks content column. ' +
93
- 'Enables keyword-based retrieval alongside vector search for ' +
94
- 'hybrid RAG workflows.',
95
- default: ['fulltext']
93
+ 'Omit to mirror the parent table\'s text search indexes. ' +
94
+ 'Set explicitly to override (e.g. ["fulltext", "bm25"]).'
96
95
  },
97
96
  // ── Job trigger ────────────────────────────────────────────────
98
97
  enqueue_chunking_job: {
@@ -156,8 +156,8 @@ export const ProcessFileEmbedding = {
156
156
  type: 'array',
157
157
  items: { type: 'string', enum: ['fulltext', 'bm25', 'trigram'] },
158
158
  description: 'Text search indexes to create on the chunks content column. ' +
159
- 'Enables keyword-based retrieval alongside vector search.',
160
- default: ['fulltext']
159
+ 'Omit to mirror the parent table\'s text search indexes. ' +
160
+ 'Set explicitly to override.'
161
161
  },
162
162
  enqueue_chunking_job: {
163
163
  type: 'boolean',
@@ -0,0 +1,5 @@
1
+ export { ProcessChunks } from './chunks';
2
+ export { ProcessExtraction } from './extraction';
3
+ export { ProcessFileEmbedding } from './file-embedding';
4
+ export { ProcessImageEmbedding } from './image-embedding';
5
+ export { ProcessImageVersions } from './image-versions';
@@ -0,0 +1,5 @@
1
+ export { ProcessChunks } from './chunks';
2
+ export { ProcessExtraction } from './extraction';
3
+ export { ProcessFileEmbedding } from './file-embedding';
4
+ export { ProcessImageEmbedding } from './image-embedding';
5
+ export { ProcessImageVersions } from './image-versions';
@@ -0,0 +1,2 @@
1
+ export { EventReferral } from './referral';
2
+ export { EventTracker } from './tracker';
package/event/index.js ADDED
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventTracker = exports.EventReferral = void 0;
4
+ var referral_1 = require("./referral");
5
+ Object.defineProperty(exports, "EventReferral", { enumerable: true, get: function () { return referral_1.EventReferral; } });
6
+ var tracker_1 = require("./tracker");
7
+ Object.defineProperty(exports, "EventTracker", { enumerable: true, get: function () { return tracker_1.EventTracker; } });
@@ -0,0 +1,2 @@
1
+ import type { NodeTypeDefinition } from '../types';
2
+ export declare const EventReferral: NodeTypeDefinition;
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventReferral = void 0;
4
+ const conditions_1 = require("../conditions");
5
+ exports.EventReferral = {
6
+ name: 'EventReferral',
7
+ slug: 'event_referral',
8
+ category: 'event',
9
+ display_name: 'Event Referral',
10
+ description: 'Creates triggers that record events for the referrer (inviter) when their ' +
11
+ 'invitees perform actions on a watched table. Resolves the referrer automatically ' +
12
+ 'via the invites module\'s claimed_invites table using the membership_type context. ' +
13
+ 'Supports the same compound condition system as EventTracker. Use with achievements ' +
14
+ 'to unlock levels and grant credits based on invitee activity.',
15
+ parameter_schema: {
16
+ type: 'object',
17
+ $defs: conditions_1.conditionDefs,
18
+ properties: {
19
+ event_name: {
20
+ type: 'string',
21
+ description: 'Event type name to record for the referrer (e.g., "invitee_uploaded_avatar", "invitee_completed_onboarding")'
22
+ },
23
+ events: {
24
+ type: 'array',
25
+ items: {
26
+ type: 'string',
27
+ enum: [
28
+ 'INSERT',
29
+ 'UPDATE',
30
+ 'DELETE'
31
+ ]
32
+ },
33
+ description: 'DML events that trigger recording',
34
+ default: ['INSERT']
35
+ },
36
+ actor_field: {
37
+ type: 'string',
38
+ format: 'column-ref',
39
+ description: 'Column containing the invitee (actor) ID on the source table — used to look up the referrer via claimed_invites.receiver_id',
40
+ default: 'owner_id'
41
+ },
42
+ entity_field: {
43
+ type: 'string',
44
+ format: 'column-ref',
45
+ description: 'Column containing the entity ID (org/group) for entity-scoped referral events. Omit for user-only events.'
46
+ },
47
+ auto_register_type: {
48
+ type: 'boolean',
49
+ description: 'Automatically register the event_name in event_types during provisioning',
50
+ default: true
51
+ },
52
+ ...conditions_1.conditionProperties
53
+ },
54
+ required: [
55
+ 'event_name'
56
+ ]
57
+ },
58
+ tags: [
59
+ 'events',
60
+ 'referral',
61
+ 'invites',
62
+ 'analytics',
63
+ 'tracking'
64
+ ]
65
+ };
package/index.d.ts CHANGED
@@ -2,7 +2,11 @@ export * from './authz';
2
2
  export * from './blueprint-types.generated';
3
3
  export * from './conditions';
4
4
  export * from './data';
5
+ export * from './event';
6
+ export * from './job';
7
+ export * from './limit';
5
8
  export * from './module-presets';
9
+ export * from './process';
6
10
  export * from './relation';
7
11
  export type { JSONSchema, NodeTypeDefinition } from './types';
8
12
  export * from './view';
package/index.js CHANGED
@@ -41,16 +41,28 @@ __exportStar(require("./authz"), exports);
41
41
  __exportStar(require("./blueprint-types.generated"), exports);
42
42
  __exportStar(require("./conditions"), exports);
43
43
  __exportStar(require("./data"), exports);
44
+ __exportStar(require("./event"), exports);
45
+ __exportStar(require("./job"), exports);
46
+ __exportStar(require("./limit"), exports);
44
47
  __exportStar(require("./module-presets"), exports);
48
+ __exportStar(require("./process"), exports);
45
49
  __exportStar(require("./relation"), exports);
46
50
  __exportStar(require("./view"), exports);
47
51
  const authz = __importStar(require("./authz"));
48
52
  const data = __importStar(require("./data"));
53
+ const event = __importStar(require("./event"));
54
+ const job = __importStar(require("./job"));
55
+ const limit = __importStar(require("./limit"));
56
+ const process = __importStar(require("./process"));
49
57
  const relation = __importStar(require("./relation"));
50
58
  const view = __importStar(require("./view"));
51
59
  exports.allNodeTypes = [
52
60
  ...Object.values(authz),
53
61
  ...Object.values(data),
62
+ ...Object.values(event),
63
+ ...Object.values(job),
64
+ ...Object.values(limit),
65
+ ...Object.values(process),
54
66
  ...Object.values(relation),
55
67
  ...Object.values(view)
56
68
  ];
package/job/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export { JobTrigger } from './trigger';
package/job/index.js ADDED
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JobTrigger = void 0;
4
+ var trigger_1 = require("./trigger");
5
+ Object.defineProperty(exports, "JobTrigger", { enumerable: true, get: function () { return trigger_1.JobTrigger; } });
@@ -0,0 +1,8 @@
1
+ export { LimitEnforceAggregate } from './enforce-aggregate';
2
+ export { LimitEnforceCounter } from './enforce-counter';
3
+ export { LimitEnforceFeature } from './enforce-feature';
4
+ export { LimitEnforceRate } from './enforce-rate';
5
+ export { LimitTrackUsage } from './track-usage';
6
+ export { LimitWarningAggregate } from './warning-aggregate';
7
+ export { LimitWarningCounter } from './warning-counter';
8
+ export { LimitWarningRate } from './warning-rate';
package/limit/index.js ADDED
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LimitWarningRate = exports.LimitWarningCounter = exports.LimitWarningAggregate = exports.LimitTrackUsage = exports.LimitEnforceRate = exports.LimitEnforceFeature = exports.LimitEnforceCounter = exports.LimitEnforceAggregate = void 0;
4
+ var enforce_aggregate_1 = require("./enforce-aggregate");
5
+ Object.defineProperty(exports, "LimitEnforceAggregate", { enumerable: true, get: function () { return enforce_aggregate_1.LimitEnforceAggregate; } });
6
+ var enforce_counter_1 = require("./enforce-counter");
7
+ Object.defineProperty(exports, "LimitEnforceCounter", { enumerable: true, get: function () { return enforce_counter_1.LimitEnforceCounter; } });
8
+ var enforce_feature_1 = require("./enforce-feature");
9
+ Object.defineProperty(exports, "LimitEnforceFeature", { enumerable: true, get: function () { return enforce_feature_1.LimitEnforceFeature; } });
10
+ var enforce_rate_1 = require("./enforce-rate");
11
+ Object.defineProperty(exports, "LimitEnforceRate", { enumerable: true, get: function () { return enforce_rate_1.LimitEnforceRate; } });
12
+ var track_usage_1 = require("./track-usage");
13
+ Object.defineProperty(exports, "LimitTrackUsage", { enumerable: true, get: function () { return track_usage_1.LimitTrackUsage; } });
14
+ var warning_aggregate_1 = require("./warning-aggregate");
15
+ Object.defineProperty(exports, "LimitWarningAggregate", { enumerable: true, get: function () { return warning_aggregate_1.LimitWarningAggregate; } });
16
+ var warning_counter_1 = require("./warning-counter");
17
+ Object.defineProperty(exports, "LimitWarningCounter", { enumerable: true, get: function () { return warning_counter_1.LimitWarningCounter; } });
18
+ var warning_rate_1 = require("./warning-rate");
19
+ Object.defineProperty(exports, "LimitWarningRate", { enumerable: true, get: function () { return warning_rate_1.LimitWarningRate; } });
@@ -41,8 +41,8 @@ exports.PresetAuthEmailMagic = {
41
41
  'levels_module:app',
42
42
  'memberships_module:app',
43
43
  'sessions_module',
44
- 'secrets_module',
45
- 'encrypted_secrets_module',
44
+ 'user_state_module',
45
+ 'config_secrets_user_module',
46
46
  'emails_module',
47
47
  'rls_module',
48
48
  'user_auth_module',
@@ -26,7 +26,7 @@ exports.PresetAuthEmail = {
26
26
  summary: 'Standard email/password auth flow with app-level permissions. No orgs, no SSO, no MFA.',
27
27
  description: 'Installs `user_auth_module` with exactly the table dependencies its insert trigger ' +
28
28
  'hard-requires: users, app-scoped memberships (plus their permissions/limits/levels ' +
29
- 'dependencies), emails, secrets, encrypted secrets, sessions, plus RLS. You get the ' +
29
+ 'dependencies), emails, user state, user secrets, sessions, plus RLS. You get the ' +
30
30
  'standard password-based auth procedures (sign_up, sign_in, reset_password, ' +
31
31
  "verify_email, delete_account, ...) and that's it. Everything else in the module " +
32
32
  'catalog — SSO, passkeys, SMS, rate limits, orgs, invites — is deliberately omitted. ' +
@@ -52,8 +52,8 @@ exports.PresetAuthEmail = {
52
52
  'levels_module:app',
53
53
  'memberships_module:app',
54
54
  'sessions_module',
55
- 'secrets_module',
56
- 'encrypted_secrets_module',
55
+ 'user_state_module',
56
+ 'config_secrets_user_module',
57
57
  'emails_module',
58
58
  'rls_module',
59
59
  'user_auth_module'
@@ -65,8 +65,8 @@ exports.PresetAuthEmail = {
65
65
  'limits_module:app': 'Required by `memberships_module:app`: NOT NULL FK to caps table.',
66
66
  'levels_module:app': 'Required by `memberships_module:app`: NOT NULL FK to levels table.',
67
67
  emails_module: 'Required by the `user_auth_module` insert trigger (`RAISE EXCEPTION REQUIRES emails_module`).',
68
- encrypted_secrets_module: 'Required for password hashing; referenced by `set_password`, `verify_password`, and reset flows.',
69
- secrets_module: 'API-key storage (`create_api_key`, `revoke_api_key`, `my_api_keys`).'
68
+ config_secrets_user_module: 'Required for password hashing; referenced by `set_password`, `verify_password`, and reset flows.',
69
+ user_state_module: 'API-key storage (`create_api_key`, `revoke_api_key`, `my_api_keys`).'
70
70
  },
71
71
  omits_notes: {
72
72
  rate_limits_module: 'Omitted intentionally; throttle_* helpers are null-safe and the auth procs compile without it. Add later via `auth:hardened`.',
@@ -38,8 +38,8 @@ exports.PresetAuthHardened = {
38
38
  'levels_module:app',
39
39
  'memberships_module:app',
40
40
  'sessions_module',
41
- 'secrets_module',
42
- 'encrypted_secrets_module',
41
+ 'user_state_module',
42
+ 'config_secrets_user_module',
43
43
  'emails_module',
44
44
  'rls_module',
45
45
  'user_auth_module',
@@ -39,8 +39,8 @@ exports.PresetAuthPasskey = {
39
39
  'levels_module:app',
40
40
  'memberships_module:app',
41
41
  'sessions_module',
42
- 'secrets_module',
43
- 'encrypted_secrets_module',
42
+ 'user_state_module',
43
+ 'config_secrets_user_module',
44
44
  'emails_module',
45
45
  'rls_module',
46
46
  'user_auth_module',
@@ -6,7 +6,7 @@ import type { ModulePreset } from './types';
6
6
  * `(provider, external_id)`) and `identity_providers_module` (the provider
7
7
  * config: URLs, client_id, encrypted client_secret, scopes, PKCE/nonce
8
8
  * knobs). The generator then emits `sign_in_identity` / `sign_up_identity`
9
- * procedures which rely on `encrypted_secrets_module` to decrypt the client
9
+ * procedures which rely on `config_secrets_user_module` to decrypt the client
10
10
  * secret at auth time.
11
11
  *
12
12
  * Password fallback stays on by default (break-glass for admins); flip the
@@ -8,7 +8,7 @@ exports.PresetAuthSso = void 0;
8
8
  * `(provider, external_id)`) and `identity_providers_module` (the provider
9
9
  * config: URLs, client_id, encrypted client_secret, scopes, PKCE/nonce
10
10
  * knobs). The generator then emits `sign_in_identity` / `sign_up_identity`
11
- * procedures which rely on `encrypted_secrets_module` to decrypt the client
11
+ * procedures which rely on `config_secrets_user_module` to decrypt the client
12
12
  * secret at auth time.
13
13
  *
14
14
  * Password fallback stays on by default (break-glass for admins); flip the
@@ -29,7 +29,7 @@ exports.PresetAuthSso = {
29
29
  'encrypted client secrets) and `connected_accounts_module` (the junction mapping a ' +
30
30
  'Constructive user to a `(provider, external_id)` pair). The generator emits ' +
31
31
  '`sign_in_identity` and `sign_up_identity` procedures which decrypt the client secret ' +
32
- 'through `encrypted_secrets_module` at auth time. Keep password flows as break-glass, or ' +
32
+ 'through `config_secrets_user_module` at auth time. Keep password flows as break-glass, or ' +
33
33
  'disable them via `app_settings_auth` toggles for strictly-SSO deployments.',
34
34
  good_for: [
35
35
  'B2B apps where end users sign in via their employer IdP',
@@ -48,8 +48,8 @@ exports.PresetAuthSso = {
48
48
  'levels_module:app',
49
49
  'memberships_module:app',
50
50
  'sessions_module',
51
- 'secrets_module',
52
- 'encrypted_secrets_module',
51
+ 'user_state_module',
52
+ 'config_secrets_user_module',
53
53
  'emails_module',
54
54
  'rls_module',
55
55
  'user_auth_module',
@@ -59,7 +59,7 @@ exports.PresetAuthSso = {
59
59
  includes_notes: {
60
60
  connected_accounts_module: 'Junction table for (user, provider, external_id). Without it, `sign_in_identity` does not compile.',
61
61
  identity_providers_module: 'Provider config table (URLs, client_id, encrypted client_secret, scopes, PKCE knobs).',
62
- encrypted_secrets_module: 'Required by `auth:email` already; also used by SSO to decrypt the provider client_secret at auth time.'
62
+ config_secrets_user_module: 'Required by `auth:email` already; also used by SSO to decrypt the provider client_secret at auth time.'
63
63
  },
64
64
  omits_notes: {
65
65
  webauthn_credentials_module: 'No passkeys — add `auth:passkey` or move to `auth:hardened`.',
@@ -20,9 +20,9 @@ exports.PresetB2bStorage = {
20
20
  'hierarchy), plus `storage_module` for file uploads. The storage module creates ' +
21
21
  '`app_buckets` and `app_files` tables with full RLS: AuthzPublishable for public reads, ' +
22
22
  'AuthzAppMembership for member access, AuthzDirectOwner for uploader-only modify/delete. ' +
23
- 'Entity-type provisioning with `has_storage=true` adds per-scope storage tables ' +
24
- 'automatically. Choose this when your B2B app needs file uploads, avatars, attachments, ' +
25
- 'or any object storage tied to workspaces.',
23
+ 'Entity-type provisioning with a non-empty `storage` array adds per-scope storage tables ' +
24
+ 'automatically (multiple modules per entity via storage_key). Choose this when your B2B ' +
25
+ 'app needs file uploads, avatars, attachments, or any object storage tied to workspaces.',
26
26
  good_for: [
27
27
  'B2B SaaS with file uploads (documents, avatars, attachments)',
28
28
  'Apps where storage is scoped to orgs/workspaces',
@@ -44,8 +44,8 @@ exports.PresetB2bStorage = {
44
44
  'memberships_module:app',
45
45
  'memberships_module:org',
46
46
  'sessions_module',
47
- 'secrets_module',
48
- 'encrypted_secrets_module',
47
+ 'user_state_module',
48
+ 'config_secrets_user_module',
49
49
  'emails_module',
50
50
  'rls_module',
51
51
  'user_auth_module',
@@ -65,7 +65,7 @@ exports.PresetB2bStorage = {
65
65
  'devices_module'
66
66
  ],
67
67
  includes_notes: {
68
- storage_module: 'File upload infrastructure: app_buckets + app_files tables with RLS. Entity-type storage scopes layered on top via `has_storage=true`.',
68
+ storage_module: 'File upload infrastructure: app_buckets + app_files tables with RLS. Entity-type storage scopes layered on top via the `storage` array (array-only format, supports multiple modules per entity via storage_key).',
69
69
  devices_module: 'Device tracking and trusted-device MFA bypass.'
70
70
  },
71
71
  omits_notes: {
@@ -40,8 +40,8 @@ exports.PresetB2b = {
40
40
  'memberships_module:app',
41
41
  'memberships_module:org',
42
42
  'sessions_module',
43
- 'secrets_module',
44
- 'encrypted_secrets_module',
43
+ 'user_state_module',
44
+ 'config_secrets_user_module',
45
45
  'emails_module',
46
46
  'rls_module',
47
47
  'user_auth_module',
@@ -5,7 +5,7 @@ import type { ModulePreset } from './types';
5
5
  *
6
6
  * This is the barest foundation: a `users` table, a `sessions` table so
7
7
  * something upstream can mint tokens, `rls_module` so row-level security
8
- * is enforceable, and `secrets_module` so you can issue API keys. Nothing
8
+ * is enforceable, and `user_state_module` so you can issue API keys. Nothing
9
9
  * else.
10
10
  *
11
11
  * You still write your own identity bridge on top (or rely on a header-based
@@ -7,7 +7,7 @@ exports.PresetMinimal = void 0;
7
7
  *
8
8
  * This is the barest foundation: a `users` table, a `sessions` table so
9
9
  * something upstream can mint tokens, `rls_module` so row-level security
10
- * is enforceable, and `secrets_module` so you can issue API keys. Nothing
10
+ * is enforceable, and `user_state_module` so you can issue API keys. Nothing
11
11
  * else.
12
12
  *
13
13
  * You still write your own identity bridge on top (or rely on a header-based
@@ -35,13 +35,13 @@ exports.PresetMinimal = {
35
35
  'users_module',
36
36
  'sessions_module',
37
37
  'rls_module',
38
- 'secrets_module'
38
+ 'user_state_module'
39
39
  ],
40
40
  includes_notes: {
41
41
  users_module: 'The canonical users table. Required by every preset.',
42
42
  sessions_module: 'Session/token storage; needed so whatever upstream auth can mint a session row.',
43
43
  rls_module: 'RLS policy infrastructure. Without it, row-level security is not enforced.',
44
- secrets_module: 'API-key storage. Optional for this preset but almost always wanted alongside upstream auth.'
44
+ user_state_module: 'API-key storage. Optional for this preset but almost always wanted alongside upstream auth.'
45
45
  },
46
46
  omits_notes: {
47
47
  user_auth_module: 'No server-side sign_up/sign_in procedures in this preset.',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-type-registry",
3
- "version": "0.37.0",
3
+ "version": "0.39.0",
4
4
  "description": "Node type definitions for the Constructive blueprint system. Single source of truth for all Authz*, Data*, Relation*, and View* node types.",
5
5
  "author": "Constructive <developers@constructive.io>",
6
6
  "main": "index.js",
@@ -47,5 +47,5 @@
47
47
  "registry",
48
48
  "graphile"
49
49
  ],
50
- "gitHead": "62282a9e2b4a72a68c6c3c6a8729e3a0a42a54b2"
50
+ "gitHead": "7b7c25cb21fd0e97c2ab3c94b994b0ca89bd3247"
51
51
  }