@objectstack/spec 0.3.3 → 0.4.1

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 (304) hide show
  1. package/dist/ai/conversation.zod.d.ts +14 -14
  2. package/dist/ai/cost.zod.d.ts +112 -112
  3. package/dist/ai/model-registry.zod.d.ts +44 -44
  4. package/dist/ai/nlq.zod.d.ts +2 -2
  5. package/dist/ai/orchestration.zod.d.ts +6 -6
  6. package/dist/ai/predictive.zod.d.ts +8 -8
  7. package/dist/ai/rag-pipeline.zod.d.ts +62 -62
  8. package/dist/api/contract.zod.d.ts +92 -92
  9. package/dist/api/discovery.zod.d.ts +2 -2
  10. package/dist/api/index.d.ts +2 -0
  11. package/dist/api/index.d.ts.map +1 -1
  12. package/dist/api/index.js +2 -0
  13. package/dist/api/odata.zod.d.ts +482 -0
  14. package/dist/api/odata.zod.d.ts.map +1 -0
  15. package/dist/api/odata.zod.js +401 -0
  16. package/dist/api/router.zod.d.ts +4 -4
  17. package/dist/auth/config.zod.d.ts +21 -21
  18. package/dist/auth/index.d.ts +1 -0
  19. package/dist/auth/index.d.ts.map +1 -1
  20. package/dist/auth/index.js +1 -0
  21. package/dist/auth/organization.zod.d.ts +2 -2
  22. package/dist/auth/role.zod.d.ts +14 -0
  23. package/dist/auth/role.zod.d.ts.map +1 -1
  24. package/dist/auth/role.zod.js +16 -1
  25. package/dist/auth/scim.zod.d.ts +2732 -0
  26. package/dist/auth/scim.zod.d.ts.map +1 -0
  27. package/dist/auth/scim.zod.js +811 -0
  28. package/dist/automation/approval.zod.d.ts +643 -0
  29. package/dist/automation/approval.zod.d.ts.map +1 -0
  30. package/dist/automation/approval.zod.js +84 -0
  31. package/dist/automation/connector.zod.d.ts +1284 -0
  32. package/dist/automation/connector.zod.d.ts.map +1 -0
  33. package/dist/automation/connector.zod.js +500 -0
  34. package/dist/automation/etl.zod.d.ts +623 -0
  35. package/dist/automation/etl.zod.d.ts.map +1 -0
  36. package/dist/automation/etl.zod.js +359 -0
  37. package/dist/automation/flow.zod.d.ts +6 -6
  38. package/dist/automation/index.d.ts +4 -0
  39. package/dist/automation/index.d.ts.map +1 -1
  40. package/dist/automation/index.js +4 -0
  41. package/dist/automation/sync.zod.d.ts +854 -0
  42. package/dist/automation/sync.zod.d.ts.map +1 -0
  43. package/dist/automation/sync.zod.js +444 -0
  44. package/dist/automation/webhook.zod.d.ts +24 -1
  45. package/dist/automation/webhook.zod.d.ts.map +1 -1
  46. package/dist/automation/webhook.zod.js +27 -3
  47. package/dist/automation/workflow.zod.d.ts +14 -0
  48. package/dist/automation/workflow.zod.d.ts.map +1 -1
  49. package/dist/automation/workflow.zod.js +16 -1
  50. package/dist/data/field.zod.d.ts +338 -8
  51. package/dist/data/field.zod.d.ts.map +1 -1
  52. package/dist/data/field.zod.js +100 -16
  53. package/dist/data/mapping.zod.d.ts +22 -10
  54. package/dist/data/mapping.zod.d.ts.map +1 -1
  55. package/dist/data/mapping.zod.js +16 -3
  56. package/dist/data/object.zod.d.ts +116 -22
  57. package/dist/data/object.zod.d.ts.map +1 -1
  58. package/dist/data/object.zod.js +4 -4
  59. package/dist/data/validation.zod.d.ts +18 -18
  60. package/dist/hub/composer.zod.d.ts +42 -1939
  61. package/dist/hub/composer.zod.d.ts.map +1 -1
  62. package/dist/hub/composer.zod.js +1 -1
  63. package/dist/hub/license.zod.d.ts +2 -2
  64. package/dist/hub/marketplace.zod.d.ts +6 -6
  65. package/dist/index.d.ts +2 -2
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +6 -3
  68. package/dist/permission/index.d.ts +7 -5
  69. package/dist/permission/index.d.ts.map +1 -1
  70. package/dist/permission/index.js +7 -5
  71. package/dist/permission/permission.zod.d.ts +14 -0
  72. package/dist/permission/permission.zod.d.ts.map +1 -1
  73. package/dist/permission/permission.zod.js +16 -1
  74. package/dist/permission/rls.zod.d.ts +605 -0
  75. package/dist/permission/rls.zod.d.ts.map +1 -0
  76. package/dist/permission/rls.zod.js +615 -0
  77. package/dist/permission/territory.zod.d.ts +13 -0
  78. package/dist/permission/territory.zod.d.ts.map +1 -1
  79. package/dist/permission/territory.zod.js +15 -1
  80. package/dist/shared/identifiers.zod.d.ts +87 -0
  81. package/dist/shared/identifiers.zod.d.ts.map +1 -0
  82. package/dist/shared/identifiers.zod.js +101 -0
  83. package/dist/shared/index.d.ts +6 -0
  84. package/dist/shared/index.d.ts.map +1 -0
  85. package/dist/{driver → shared}/index.js +5 -4
  86. package/dist/stack.zod.d.ts +19869 -0
  87. package/dist/stack.zod.d.ts.map +1 -0
  88. package/dist/stack.zod.js +248 -0
  89. package/dist/system/audit.zod.d.ts +12 -12
  90. package/dist/{kernel → system}/context.zod.d.ts.map +1 -1
  91. package/dist/{driver → system}/datasource.zod.d.ts +2 -2
  92. package/dist/{driver → system}/datasource.zod.d.ts.map +1 -1
  93. package/dist/{driver → system/driver}/mongo.zod.d.ts +2 -2
  94. package/dist/system/driver/mongo.zod.d.ts.map +1 -0
  95. package/dist/{driver → system/driver}/postgres.zod.d.ts +4 -4
  96. package/dist/system/driver/postgres.zod.d.ts.map +1 -0
  97. package/dist/{driver → system}/driver.zod.d.ts +14 -14
  98. package/dist/{driver → system}/driver.zod.d.ts.map +1 -1
  99. package/dist/system/events.zod.d.ts +15 -12
  100. package/dist/system/events.zod.d.ts.map +1 -1
  101. package/dist/system/events.zod.js +5 -1
  102. package/dist/system/feature.zod.d.ts +131 -0
  103. package/dist/system/feature.zod.d.ts.map +1 -0
  104. package/dist/system/feature.zod.js +45 -0
  105. package/dist/system/index.d.ts +10 -0
  106. package/dist/system/index.d.ts.map +1 -1
  107. package/dist/system/index.js +12 -0
  108. package/dist/system/job.zod.d.ts +8 -8
  109. package/dist/{kernel → system}/logger.zod.d.ts +4 -4
  110. package/dist/{kernel → system}/logger.zod.d.ts.map +1 -1
  111. package/dist/system/manifest.zod.d.ts +515 -0
  112. package/dist/system/manifest.zod.d.ts.map +1 -0
  113. package/dist/{kernel → system}/manifest.zod.js +0 -12
  114. package/dist/{kernel → system}/plugin.zod.d.ts.map +1 -1
  115. package/dist/{kernel → system}/scoped-storage.zod.d.ts +2 -2
  116. package/dist/{kernel → system}/scoped-storage.zod.d.ts.map +1 -1
  117. package/dist/ui/action.zod.d.ts +35 -10
  118. package/dist/ui/action.zod.d.ts.map +1 -1
  119. package/dist/ui/action.zod.js +30 -1
  120. package/dist/ui/app.zod.d.ts +23 -8
  121. package/dist/ui/app.zod.d.ts.map +1 -1
  122. package/dist/ui/app.zod.js +32 -4
  123. package/dist/ui/block.zod.d.ts +265 -0
  124. package/dist/ui/block.zod.d.ts.map +1 -0
  125. package/dist/ui/block.zod.js +90 -0
  126. package/dist/ui/component.zod.d.ts +265 -0
  127. package/dist/ui/component.zod.d.ts.map +1 -0
  128. package/dist/ui/component.zod.js +90 -0
  129. package/dist/ui/dashboard.zod.d.ts +15 -15
  130. package/dist/ui/dashboard.zod.d.ts.map +1 -1
  131. package/dist/ui/dashboard.zod.js +18 -8
  132. package/dist/ui/index.d.ts +1 -0
  133. package/dist/ui/index.d.ts.map +1 -1
  134. package/dist/ui/index.js +1 -0
  135. package/dist/ui/page.zod.d.ts +21 -3
  136. package/dist/ui/page.zod.d.ts.map +1 -1
  137. package/dist/ui/page.zod.js +37 -4
  138. package/dist/ui/report.zod.d.ts +7 -7
  139. package/dist/ui/view.zod.d.ts +252 -240
  140. package/dist/ui/view.zod.d.ts.map +1 -1
  141. package/dist/ui/view.zod.js +32 -3
  142. package/dist/ui/widget.zod.d.ts +673 -5
  143. package/dist/ui/widget.zod.d.ts.map +1 -1
  144. package/dist/ui/widget.zod.js +294 -1
  145. package/json-schema/api/ODataError.json +65 -0
  146. package/json-schema/api/ODataFilterFunction.json +39 -0
  147. package/json-schema/api/ODataFilterOperator.json +24 -0
  148. package/json-schema/api/ODataMetadata.json +115 -0
  149. package/json-schema/api/ODataQuery.json +89 -0
  150. package/json-schema/api/ODataResponse.json +37 -0
  151. package/json-schema/auth/Role.json +3 -2
  152. package/json-schema/auth/SCIMAddress.json +50 -0
  153. package/json-schema/auth/SCIMEmail.json +38 -0
  154. package/json-schema/auth/SCIMEnterpriseUser.json +55 -0
  155. package/json-schema/auth/SCIMError.json +52 -0
  156. package/json-schema/auth/SCIMGroup.json +102 -0
  157. package/json-schema/auth/SCIMGroupReference.json +36 -0
  158. package/json-schema/auth/SCIMListResponse.json +606 -0
  159. package/json-schema/auth/SCIMMemberReference.json +36 -0
  160. package/json-schema/auth/SCIMMeta.json +35 -0
  161. package/json-schema/auth/SCIMName.json +36 -0
  162. package/json-schema/auth/SCIMPatchOperation.json +31 -0
  163. package/json-schema/auth/SCIMPatchRequest.json +56 -0
  164. package/json-schema/auth/SCIMPhoneNumber.json +40 -0
  165. package/json-schema/auth/SCIMUser.json +462 -0
  166. package/json-schema/automation/ApprovalAction.json +35 -0
  167. package/json-schema/automation/ApprovalActionType.json +15 -0
  168. package/json-schema/automation/ApprovalProcess.json +326 -0
  169. package/json-schema/automation/ApprovalStep.json +147 -0
  170. package/json-schema/automation/ApproverType.json +16 -0
  171. package/json-schema/automation/AuthField.json +73 -0
  172. package/json-schema/automation/Authentication.json +159 -0
  173. package/json-schema/automation/AuthenticationType.json +18 -0
  174. package/json-schema/automation/ConflictResolution.json +16 -0
  175. package/json-schema/automation/Connector.json +440 -0
  176. package/json-schema/automation/ConnectorCategory.json +26 -0
  177. package/json-schema/automation/ConnectorInstance.json +69 -0
  178. package/json-schema/automation/ConnectorOperation.json +117 -0
  179. package/json-schema/automation/ConnectorTrigger.json +54 -0
  180. package/json-schema/automation/DataDestinationConfig.json +89 -0
  181. package/json-schema/automation/DataSourceConfig.json +34 -0
  182. package/json-schema/automation/DataSyncConfig.json +355 -0
  183. package/json-schema/automation/ETLDestination.json +57 -0
  184. package/json-schema/automation/ETLEndpointType.json +19 -0
  185. package/json-schema/automation/ETLPipeline.json +252 -0
  186. package/json-schema/automation/ETLPipelineRun.json +107 -0
  187. package/json-schema/automation/ETLRunStatus.json +17 -0
  188. package/json-schema/automation/ETLSource.json +60 -0
  189. package/json-schema/automation/ETLSyncMode.json +14 -0
  190. package/json-schema/automation/ETLTransformation.json +46 -0
  191. package/json-schema/automation/ETLTransformationType.json +21 -0
  192. package/json-schema/automation/FieldMapping.json +36 -0
  193. package/json-schema/automation/OAuth2Config.json +43 -0
  194. package/json-schema/automation/OperationParameter.json +59 -0
  195. package/json-schema/automation/OperationType.json +17 -0
  196. package/json-schema/automation/SyncDirection.json +14 -0
  197. package/json-schema/automation/SyncExecutionResult.json +135 -0
  198. package/json-schema/automation/SyncExecutionStatus.json +17 -0
  199. package/json-schema/automation/SyncMode.json +14 -0
  200. package/json-schema/automation/Webhook.json +3 -1
  201. package/json-schema/automation/WebhookReceiver.json +3 -1
  202. package/json-schema/automation/WorkflowRule.json +3 -2
  203. package/json-schema/data/Field.json +62 -4
  204. package/json-schema/data/FieldType.json +12 -2
  205. package/json-schema/data/Object.json +62 -4
  206. package/json-schema/data/SelectOption.json +4 -2
  207. package/json-schema/data/VectorConfig.json +51 -0
  208. package/json-schema/hub/ComposerResponse.json +0 -2162
  209. package/json-schema/permission/PermissionSet.json +3 -1
  210. package/json-schema/permission/RLSConfig.json +59 -0
  211. package/json-schema/permission/RLSEvaluationResult.json +40 -0
  212. package/json-schema/permission/RLSOperation.json +16 -0
  213. package/json-schema/permission/RLSUserContext.json +51 -0
  214. package/json-schema/permission/RowLevelSecurityPolicy.json +77 -0
  215. package/json-schema/permission/Territory.json +3 -1
  216. package/json-schema/shared/EventName.json +12 -0
  217. package/json-schema/shared/SnakeCaseIdentifier.json +12 -0
  218. package/json-schema/shared/SystemIdentifier.json +12 -0
  219. package/json-schema/system/Event.json +3 -2
  220. package/json-schema/system/FeatureFlag.json +87 -0
  221. package/json-schema/system/FeatureStrategy.json +16 -0
  222. package/json-schema/system/Manifest.json +395 -0
  223. package/json-schema/ui/Action.json +25 -4
  224. package/json-schema/ui/ActionParam.json +12 -2
  225. package/json-schema/ui/App.json +18 -7
  226. package/json-schema/ui/ChartType.json +9 -1
  227. package/json-schema/ui/Dashboard.json +9 -1
  228. package/json-schema/ui/DashboardNavItem.json +3 -1
  229. package/json-schema/ui/DashboardWidget.json +9 -1
  230. package/json-schema/ui/FieldWidgetProps.json +62 -4
  231. package/json-schema/ui/FormView.json +4 -1
  232. package/json-schema/ui/GroupNavItem.json +3 -1
  233. package/json-schema/ui/ListView.json +7 -1
  234. package/json-schema/ui/NavigationItem.json +15 -5
  235. package/json-schema/ui/ObjectNavItem.json +3 -1
  236. package/json-schema/ui/Page.json +36 -4
  237. package/json-schema/ui/PageCardProps.json +32 -0
  238. package/json-schema/ui/PageComponent.json +33 -3
  239. package/json-schema/ui/PageComponentType.json +32 -0
  240. package/json-schema/ui/PageHeaderProps.json +39 -0
  241. package/json-schema/ui/PageNavItem.json +3 -1
  242. package/json-schema/ui/PageRegion.json +33 -3
  243. package/json-schema/ui/PageTabsProps.json +55 -0
  244. package/json-schema/ui/RecordDetailsProps.json +37 -0
  245. package/json-schema/ui/RecordHighlightsProps.json +24 -0
  246. package/json-schema/ui/RecordRelatedListProps.json +39 -0
  247. package/json-schema/ui/UrlNavItem.json +3 -1
  248. package/json-schema/ui/View.json +22 -4
  249. package/json-schema/ui/WidgetEvent.json +42 -0
  250. package/json-schema/ui/WidgetLifecycle.json +40 -0
  251. package/json-schema/ui/WidgetManifest.json +262 -0
  252. package/json-schema/ui/WidgetProperty.json +58 -0
  253. package/package.json +1 -1
  254. package/prompts/architecture.md +5 -5
  255. package/prompts/create-new-project.md +85 -0
  256. package/dist/driver/index.d.ts +0 -5
  257. package/dist/driver/index.d.ts.map +0 -1
  258. package/dist/driver/mongo.zod.d.ts.map +0 -1
  259. package/dist/driver/postgres.zod.d.ts.map +0 -1
  260. package/dist/kernel/index.d.ts +0 -12
  261. package/dist/kernel/index.d.ts.map +0 -1
  262. package/dist/kernel/index.js +0 -27
  263. package/dist/kernel/manifest.zod.d.ts +0 -2153
  264. package/dist/kernel/manifest.zod.d.ts.map +0 -1
  265. package/json-schema/kernel/Manifest.json +0 -2557
  266. /package/dist/{kernel → system}/context.zod.d.ts +0 -0
  267. /package/dist/{kernel → system}/context.zod.js +0 -0
  268. /package/dist/{driver → system}/datasource.zod.js +0 -0
  269. /package/dist/{driver → system/driver}/mongo.zod.js +0 -0
  270. /package/dist/{driver → system/driver}/postgres.zod.js +0 -0
  271. /package/dist/{driver → system}/driver.zod.js +0 -0
  272. /package/dist/{kernel → system}/logger.zod.js +0 -0
  273. /package/dist/{kernel → system}/plugin.zod.d.ts +0 -0
  274. /package/dist/{kernel → system}/plugin.zod.js +0 -0
  275. /package/dist/{kernel → system}/scoped-storage.zod.js +0 -0
  276. /package/json-schema/{driver → system}/Datasource.json +0 -0
  277. /package/json-schema/{driver → system}/DatasourceCapabilities.json +0 -0
  278. /package/json-schema/{driver → system}/DriverCapabilities.json +0 -0
  279. /package/json-schema/{driver → system}/DriverDefinition.json +0 -0
  280. /package/json-schema/{driver → system}/DriverInterface.json +0 -0
  281. /package/json-schema/{driver → system}/DriverOptions.json +0 -0
  282. /package/json-schema/{driver → system}/DriverType.json +0 -0
  283. /package/json-schema/{kernel → system}/FileMetadata.json +0 -0
  284. /package/json-schema/{kernel → system}/I18nContext.json +0 -0
  285. /package/json-schema/{kernel → system}/KernelContext.json +0 -0
  286. /package/json-schema/{kernel → system}/LogEntry.json +0 -0
  287. /package/json-schema/{kernel → system}/LogFormat.json +0 -0
  288. /package/json-schema/{kernel → system}/LogLevel.json +0 -0
  289. /package/json-schema/{kernel → system}/Logger.json +0 -0
  290. /package/json-schema/{kernel → system}/LoggerConfig.json +0 -0
  291. /package/json-schema/{driver → system}/MongoConfig.json +0 -0
  292. /package/json-schema/{kernel → system}/ObjectQLClient.json +0 -0
  293. /package/json-schema/{kernel → system}/Plugin.json +0 -0
  294. /package/json-schema/{kernel → system}/PluginContext.json +0 -0
  295. /package/json-schema/{kernel → system}/PluginLifecycle.json +0 -0
  296. /package/json-schema/{driver → system}/PostgresConfig.json +0 -0
  297. /package/json-schema/{kernel → system}/Router.json +0 -0
  298. /package/json-schema/{kernel → system}/RuntimeMode.json +0 -0
  299. /package/json-schema/{kernel → system}/Scheduler.json +0 -0
  300. /package/json-schema/{kernel → system}/ScopedStorage.json +0 -0
  301. /package/json-schema/{kernel → system}/ScopedStorageConfig.json +0 -0
  302. /package/json-schema/{kernel → system}/StorageAdapterType.json +0 -0
  303. /package/json-schema/{kernel → system}/StorageScope.json +0 -0
  304. /package/json-schema/{kernel → system}/SystemAPI.json +0 -0
@@ -0,0 +1,615 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RLS = exports.RLSEvaluationResultSchema = exports.RLSUserContextSchema = exports.RLSConfigSchema = exports.RowLevelSecurityPolicySchema = exports.RLSOperation = void 0;
4
+ const zod_1 = require("zod");
5
+ /**
6
+ * # Row-Level Security (RLS) Protocol
7
+ *
8
+ * Implements fine-grained record-level access control inspired by PostgreSQL RLS
9
+ * and Salesforce Criteria-Based Sharing Rules.
10
+ *
11
+ * ## Overview
12
+ *
13
+ * Row-Level Security (RLS) allows you to control which rows users can access
14
+ * in database tables based on their identity and role. Unlike object-level
15
+ * permissions (CRUD), RLS provides record-level filtering.
16
+ *
17
+ * ## Use Cases
18
+ *
19
+ * 1. **Multi-Tenant Data Isolation**
20
+ * - Users only see records from their organization
21
+ * - `using: "tenant_id = current_user.tenant_id"`
22
+ *
23
+ * 2. **Ownership-Based Access**
24
+ * - Users only see records they own
25
+ * - `using: "owner_id = current_user.id"`
26
+ *
27
+ * 3. **Department-Based Access**
28
+ * - Users only see records from their department
29
+ * - `using: "department = current_user.department"`
30
+ *
31
+ * 4. **Regional Access Control**
32
+ * - Sales reps only see accounts in their territory
33
+ * - `using: "region IN (current_user.assigned_regions)"`
34
+ *
35
+ * 5. **Time-Based Access**
36
+ * - Users can only access active records
37
+ * - `using: "status = 'active' AND expiry_date > NOW()"`
38
+ *
39
+ * ## PostgreSQL RLS Comparison
40
+ *
41
+ * PostgreSQL RLS Example:
42
+ * ```sql
43
+ * CREATE POLICY tenant_isolation ON accounts
44
+ * FOR SELECT
45
+ * USING (tenant_id = current_setting('app.current_tenant_id')::uuid);
46
+ *
47
+ * CREATE POLICY account_insert ON accounts
48
+ * FOR INSERT
49
+ * WITH CHECK (tenant_id = current_setting('app.current_tenant_id')::uuid);
50
+ * ```
51
+ *
52
+ * ObjectStack RLS Equivalent:
53
+ * ```typescript
54
+ * {
55
+ * name: 'tenant_isolation',
56
+ * object: 'account',
57
+ * operation: 'select',
58
+ * using: 'tenant_id = current_user.tenant_id'
59
+ * }
60
+ * ```
61
+ *
62
+ * ## Salesforce Sharing Rules Comparison
63
+ *
64
+ * Salesforce uses "Sharing Rules" and "Role Hierarchy" for record-level access.
65
+ * ObjectStack RLS provides similar functionality with more flexibility.
66
+ *
67
+ * Salesforce:
68
+ * - Criteria-Based Sharing: Share records matching criteria with users/roles
69
+ * - Owner-Based Sharing: Share records based on owner's role
70
+ * - Manual Sharing: Individual record sharing
71
+ *
72
+ * ObjectStack RLS:
73
+ * - More flexible formula-based conditions
74
+ * - Direct SQL-like syntax
75
+ * - Supports complex logic with AND/OR/NOT
76
+ *
77
+ * ## Best Practices
78
+ *
79
+ * 1. **Always Define SELECT Policy**: Control what users can view
80
+ * 2. **Define INSERT/UPDATE CHECK Policies**: Prevent data leakage
81
+ * 3. **Use Role-Based Policies**: Apply different rules to different roles
82
+ * 4. **Test Thoroughly**: RLS can have complex interactions
83
+ * 5. **Monitor Performance**: Complex RLS policies can impact query performance
84
+ *
85
+ * ## Security Considerations
86
+ *
87
+ * 1. **Defense in Depth**: RLS is one layer; use with object permissions
88
+ * 2. **Default Deny**: If no policy matches, access is denied
89
+ * 3. **Policy Precedence**: More permissive policy wins (OR logic)
90
+ * 4. **Context Variables**: Ensure current_user context is always set
91
+ *
92
+ * @see https://www.postgresql.org/docs/current/ddl-rowsecurity.html
93
+ * @see https://help.salesforce.com/s/articleView?id=sf.security_sharing_rules.htm
94
+ */
95
+ /**
96
+ * RLS Operation Enum
97
+ * Specifies which database operation this policy applies to.
98
+ *
99
+ * - **select**: Controls which rows can be read (SELECT queries)
100
+ * - **insert**: Controls which rows can be inserted (INSERT statements)
101
+ * - **update**: Controls which rows can be updated (UPDATE statements)
102
+ * - **delete**: Controls which rows can be deleted (DELETE statements)
103
+ * - **all**: Shorthand for all operations (equivalent to defining 4 separate policies)
104
+ */
105
+ exports.RLSOperation = zod_1.z.enum(['select', 'insert', 'update', 'delete', 'all']);
106
+ /**
107
+ * Row-Level Security Policy Schema
108
+ *
109
+ * Defines a single RLS policy that filters records based on conditions.
110
+ * Multiple policies can be defined for the same object, and they are
111
+ * combined with OR logic (union of results).
112
+ *
113
+ * @example Multi-Tenant Isolation
114
+ * ```typescript
115
+ * {
116
+ * name: 'tenant_isolation',
117
+ * label: 'Multi-Tenant Data Isolation',
118
+ * object: 'account',
119
+ * operation: 'select',
120
+ * using: 'tenant_id = current_user.tenant_id',
121
+ * enabled: true
122
+ * }
123
+ * ```
124
+ *
125
+ * @example Owner-Based Access
126
+ * ```typescript
127
+ * {
128
+ * name: 'owner_access',
129
+ * label: 'Users Can View Their Own Records',
130
+ * object: 'opportunity',
131
+ * operation: 'select',
132
+ * using: 'owner_id = current_user.id',
133
+ * enabled: true
134
+ * }
135
+ * ```
136
+ *
137
+ * @example Manager Can View Team Records
138
+ * ```typescript
139
+ * {
140
+ * name: 'manager_team_access',
141
+ * label: 'Managers Can View Team Records',
142
+ * object: 'task',
143
+ * operation: 'select',
144
+ * using: 'assigned_to_id IN (SELECT id FROM users WHERE manager_id = current_user.id)',
145
+ * roles: ['manager', 'director'],
146
+ * enabled: true
147
+ * }
148
+ * ```
149
+ *
150
+ * @example Prevent Cross-Tenant Data Insertion
151
+ * ```typescript
152
+ * {
153
+ * name: 'tenant_insert_check',
154
+ * label: 'Prevent Cross-Tenant Data Creation',
155
+ * object: 'account',
156
+ * operation: 'insert',
157
+ * check: 'tenant_id = current_user.tenant_id',
158
+ * enabled: true
159
+ * }
160
+ * ```
161
+ *
162
+ * @example Regional Sales Access
163
+ * ```typescript
164
+ * {
165
+ * name: 'regional_sales_access',
166
+ * label: 'Sales Reps Access Regional Accounts',
167
+ * object: 'account',
168
+ * operation: 'select',
169
+ * using: 'region = current_user.region OR region IS NULL',
170
+ * roles: ['sales_rep'],
171
+ * enabled: true
172
+ * }
173
+ * ```
174
+ *
175
+ * @example Time-Based Access Control
176
+ * ```typescript
177
+ * {
178
+ * name: 'active_records_only',
179
+ * label: 'Users Only Access Active Records',
180
+ * object: 'contract',
181
+ * operation: 'select',
182
+ * using: 'status = "active" AND start_date <= NOW() AND end_date >= NOW()',
183
+ * enabled: true
184
+ * }
185
+ * ```
186
+ *
187
+ * @example Hierarchical Access (Role-Based)
188
+ * ```typescript
189
+ * {
190
+ * name: 'executive_full_access',
191
+ * label: 'Executives See All Records',
192
+ * object: 'account',
193
+ * operation: 'all',
194
+ * using: '1 = 1', // Always true - see everything
195
+ * roles: ['ceo', 'cfo', 'cto'],
196
+ * enabled: true
197
+ * }
198
+ * ```
199
+ */
200
+ exports.RowLevelSecurityPolicySchema = zod_1.z.object({
201
+ /**
202
+ * Unique identifier for this policy.
203
+ * Must be unique within the object.
204
+ * Use snake_case following ObjectStack naming conventions.
205
+ *
206
+ * @example "tenant_isolation", "owner_access", "manager_team_view"
207
+ */
208
+ name: zod_1.z.string()
209
+ .regex(/^[a-z_][a-z0-9_]*$/)
210
+ .describe('Policy unique identifier (snake_case)'),
211
+ /**
212
+ * Human-readable label for the policy.
213
+ * Used in admin UI and logs.
214
+ *
215
+ * @example "Multi-Tenant Data Isolation", "Owner-Based Access"
216
+ */
217
+ label: zod_1.z.string()
218
+ .optional()
219
+ .describe('Human-readable policy label'),
220
+ /**
221
+ * Description explaining what this policy does and why.
222
+ * Helps with governance and compliance.
223
+ *
224
+ * @example "Ensures users can only access records from their own tenant organization"
225
+ */
226
+ description: zod_1.z.string()
227
+ .optional()
228
+ .describe('Policy description and business justification'),
229
+ /**
230
+ * Target object (table) this policy applies to.
231
+ * Must reference a valid ObjectStack object name.
232
+ *
233
+ * @example "account", "opportunity", "contact", "custom_object"
234
+ */
235
+ object: zod_1.z.string()
236
+ .describe('Target object name'),
237
+ /**
238
+ * Database operation(s) this policy applies to.
239
+ *
240
+ * - **select**: Controls read access (SELECT queries)
241
+ * - **insert**: Controls insert access (INSERT statements)
242
+ * - **update**: Controls update access (UPDATE statements)
243
+ * - **delete**: Controls delete access (DELETE statements)
244
+ * - **all**: Applies to all operations
245
+ *
246
+ * @example "select" - Most common, controls what users can view
247
+ * @example "all" - Apply same rule to all operations
248
+ */
249
+ operation: exports.RLSOperation
250
+ .describe('Database operation this policy applies to'),
251
+ /**
252
+ * USING clause - Filter condition for SELECT/UPDATE/DELETE.
253
+ *
254
+ * This is a SQL-like expression evaluated for each row.
255
+ * Only rows where this expression returns TRUE are accessible.
256
+ *
257
+ * **Note**: For INSERT-only policies, USING is not required (only CHECK is needed).
258
+ * For SELECT/UPDATE/DELETE operations, USING is required.
259
+ *
260
+ * **Security Note**: RLS conditions are executed at the database level with
261
+ * parameterized queries. The implementation must use prepared statements
262
+ * to prevent SQL injection. Never concatenate user input directly into
263
+ * RLS conditions.
264
+ *
265
+ * **SQL Dialect**: Compatible with PostgreSQL SQL syntax. Implementations
266
+ * may adapt to other databases (MySQL, SQL Server, etc.) but should maintain
267
+ * semantic equivalence.
268
+ *
269
+ * Available context variables:
270
+ * - `current_user.id` - Current user's ID
271
+ * - `current_user.tenant_id` - Current user's tenant (maps to `tenantId` in RLSUserContext)
272
+ * - `current_user.role` - Current user's role
273
+ * - `current_user.department` - Current user's department
274
+ * - `current_user.*` - Any custom user field
275
+ * - `NOW()` - Current timestamp
276
+ * - `CURRENT_DATE` - Current date
277
+ * - `CURRENT_TIME` - Current time
278
+ *
279
+ * **Context Variable Mapping**: The RLSUserContext schema uses camelCase (e.g., `tenantId`),
280
+ * but expressions use snake_case with `current_user.` prefix (e.g., `current_user.tenant_id`).
281
+ * Implementations must handle this mapping.
282
+ *
283
+ * Supported operators:
284
+ * - Comparison: =, !=, <, >, <=, >=, <> (not equal)
285
+ * - Logical: AND, OR, NOT
286
+ * - NULL checks: IS NULL, IS NOT NULL
287
+ * - Set operations: IN, NOT IN
288
+ * - String: LIKE, NOT LIKE, ILIKE (case-insensitive)
289
+ * - Pattern matching: ~ (regex), !~ (not regex)
290
+ * - Subqueries: (SELECT ...)
291
+ * - Array operations: ANY, ALL
292
+ *
293
+ * **Prohibited**: Dynamic SQL, DDL statements, DML statements (INSERT/UPDATE/DELETE)
294
+ *
295
+ * @example "tenant_id = current_user.tenant_id"
296
+ * @example "owner_id = current_user.id OR created_by = current_user.id"
297
+ * @example "department IN (SELECT department FROM user_departments WHERE user_id = current_user.id)"
298
+ * @example "status = 'active' AND expiry_date > NOW()"
299
+ */
300
+ using: zod_1.z.string()
301
+ .optional()
302
+ .describe('Filter condition for SELECT/UPDATE/DELETE (PostgreSQL SQL WHERE clause syntax with parameterized context variables). Optional for INSERT-only policies.'),
303
+ /**
304
+ * CHECK clause - Validation for INSERT/UPDATE operations.
305
+ *
306
+ * Similar to USING but applies to new/modified rows.
307
+ * Prevents users from creating/updating rows they wouldn't be able to see.
308
+ *
309
+ * **Default Behavior**: If not specified, implementations should use the
310
+ * USING clause as the CHECK clause. This ensures data integrity by preventing
311
+ * users from creating records they cannot view.
312
+ *
313
+ * Use cases:
314
+ * - Prevent cross-tenant data creation
315
+ * - Enforce mandatory field values
316
+ * - Validate data integrity rules
317
+ * - Restrict certain operations (e.g., only allow creating "draft" status)
318
+ *
319
+ * @example "tenant_id = current_user.tenant_id"
320
+ * @example "status IN ('draft', 'pending')" - Only allow certain statuses
321
+ * @example "created_by = current_user.id" - Must be the creator
322
+ */
323
+ check: zod_1.z.string()
324
+ .optional()
325
+ .describe('Validation condition for INSERT/UPDATE (defaults to USING clause if not specified - enforced at application level)'),
326
+ /**
327
+ * Restrict this policy to specific roles.
328
+ * If specified, only users with these roles will have this policy applied.
329
+ * If omitted, policy applies to all users (except those with bypassRLS permission).
330
+ *
331
+ * Role names must match defined roles in the system.
332
+ *
333
+ * @example ["sales_rep", "account_manager"]
334
+ * @example ["employee"] - Apply to all employees
335
+ * @example ["guest"] - Special restrictions for guests
336
+ */
337
+ roles: zod_1.z.array(zod_1.z.string())
338
+ .optional()
339
+ .describe('Roles this policy applies to (omit for all roles)'),
340
+ /**
341
+ * Whether this policy is currently active.
342
+ * Disabled policies are not evaluated.
343
+ * Useful for temporary policy changes without deletion.
344
+ *
345
+ * @default true
346
+ */
347
+ enabled: zod_1.z.boolean()
348
+ .default(true)
349
+ .describe('Whether this policy is active'),
350
+ /**
351
+ * Policy priority for conflict resolution.
352
+ * Higher numbers = higher priority.
353
+ * When multiple policies apply, the most permissive wins (OR logic).
354
+ * Priority is only used for ordering evaluation (performance).
355
+ *
356
+ * @default 0
357
+ */
358
+ priority: zod_1.z.number()
359
+ .int()
360
+ .default(0)
361
+ .describe('Policy evaluation priority (higher = evaluated first)'),
362
+ /**
363
+ * Tags for policy categorization and reporting.
364
+ * Useful for governance, compliance, and auditing.
365
+ *
366
+ * @example ["compliance", "gdpr", "pci"]
367
+ * @example ["multi-tenant", "security"]
368
+ */
369
+ tags: zod_1.z.array(zod_1.z.string())
370
+ .optional()
371
+ .describe('Policy categorization tags'),
372
+ }).superRefine((data, ctx) => {
373
+ // Ensure at least one of USING or CHECK is provided
374
+ if (!data.using && !data.check) {
375
+ ctx.addIssue({
376
+ code: zod_1.z.ZodIssueCode.custom,
377
+ message: 'At least one of "using" or "check" must be specified. For SELECT/UPDATE/DELETE operations, provide "using". For INSERT operations, provide "check".',
378
+ });
379
+ }
380
+ // For non-insert operations, USING should typically be present
381
+ // This is a soft warning through documentation, not enforced here
382
+ // since 'all' and mixed operation types are valid
383
+ });
384
+ /**
385
+ * RLS Configuration Schema
386
+ *
387
+ * Global configuration for the Row-Level Security system.
388
+ * Defines how RLS is enforced across the entire platform.
389
+ */
390
+ exports.RLSConfigSchema = zod_1.z.object({
391
+ /**
392
+ * Global RLS enable/disable flag.
393
+ * When false, all RLS policies are ignored (use with caution!).
394
+ *
395
+ * @default true
396
+ */
397
+ enabled: zod_1.z.boolean()
398
+ .default(true)
399
+ .describe('Enable RLS enforcement globally'),
400
+ /**
401
+ * Default behavior when no policies match.
402
+ *
403
+ * - **deny**: Deny access (secure default)
404
+ * - **allow**: Allow access (permissive mode, not recommended)
405
+ *
406
+ * @default "deny"
407
+ */
408
+ defaultPolicy: zod_1.z.enum(['deny', 'allow'])
409
+ .default('deny')
410
+ .describe('Default action when no policies match'),
411
+ /**
412
+ * Whether to allow superusers to bypass RLS.
413
+ * Superusers include system administrators and service accounts.
414
+ *
415
+ * @default true
416
+ */
417
+ allowSuperuserBypass: zod_1.z.boolean()
418
+ .default(true)
419
+ .describe('Allow superusers to bypass RLS'),
420
+ /**
421
+ * List of roles that can bypass RLS.
422
+ * Users with these roles see all records regardless of policies.
423
+ *
424
+ * @example ["system_admin", "data_auditor"]
425
+ */
426
+ bypassRoles: zod_1.z.array(zod_1.z.string())
427
+ .optional()
428
+ .describe('Roles that bypass RLS (see all data)'),
429
+ /**
430
+ * Whether to log RLS policy evaluations.
431
+ * Useful for debugging and auditing.
432
+ * Can impact performance if enabled globally.
433
+ *
434
+ * @default false
435
+ */
436
+ logEvaluations: zod_1.z.boolean()
437
+ .default(false)
438
+ .describe('Log RLS policy evaluations for debugging'),
439
+ /**
440
+ * Cache RLS policy evaluation results.
441
+ * Can improve performance for frequently accessed records.
442
+ * Cache is invalidated when policies change or user context changes.
443
+ *
444
+ * @default true
445
+ */
446
+ cacheResults: zod_1.z.boolean()
447
+ .default(true)
448
+ .describe('Cache RLS evaluation results'),
449
+ /**
450
+ * Cache TTL in seconds.
451
+ * How long to cache RLS evaluation results.
452
+ *
453
+ * @default 300 (5 minutes)
454
+ */
455
+ cacheTtlSeconds: zod_1.z.number()
456
+ .int()
457
+ .positive()
458
+ .default(300)
459
+ .describe('Cache TTL in seconds'),
460
+ /**
461
+ * Performance optimization: Pre-fetch user context.
462
+ * Load user context once per request instead of per-query.
463
+ *
464
+ * @default true
465
+ */
466
+ prefetchUserContext: zod_1.z.boolean()
467
+ .default(true)
468
+ .describe('Pre-fetch user context for performance'),
469
+ });
470
+ /**
471
+ * User Context Schema
472
+ *
473
+ * Represents the current user's context for RLS evaluation.
474
+ * This data is used to evaluate USING and CHECK clauses.
475
+ */
476
+ exports.RLSUserContextSchema = zod_1.z.object({
477
+ /**
478
+ * User ID
479
+ */
480
+ id: zod_1.z.string()
481
+ .describe('User ID'),
482
+ /**
483
+ * User email
484
+ */
485
+ email: zod_1.z.string()
486
+ .email()
487
+ .optional()
488
+ .describe('User email'),
489
+ /**
490
+ * Tenant/Organization ID
491
+ */
492
+ tenantId: zod_1.z.string()
493
+ .optional()
494
+ .describe('Tenant/Organization ID'),
495
+ /**
496
+ * User role(s)
497
+ */
498
+ role: zod_1.z.union([
499
+ zod_1.z.string(),
500
+ zod_1.z.array(zod_1.z.string()),
501
+ ])
502
+ .optional()
503
+ .describe('User role(s)'),
504
+ /**
505
+ * User department
506
+ */
507
+ department: zod_1.z.string()
508
+ .optional()
509
+ .describe('User department'),
510
+ /**
511
+ * Additional custom attributes
512
+ * Can include any custom user fields for RLS evaluation
513
+ */
514
+ attributes: zod_1.z.record(zod_1.z.any())
515
+ .optional()
516
+ .describe('Additional custom user attributes'),
517
+ });
518
+ /**
519
+ * RLS Policy Evaluation Result
520
+ *
521
+ * Result of evaluating an RLS policy for a specific record.
522
+ * Used for debugging and audit logging.
523
+ */
524
+ exports.RLSEvaluationResultSchema = zod_1.z.object({
525
+ /**
526
+ * Policy name that was evaluated
527
+ */
528
+ policyName: zod_1.z.string()
529
+ .describe('Policy name'),
530
+ /**
531
+ * Whether access was granted
532
+ */
533
+ granted: zod_1.z.boolean()
534
+ .describe('Whether access was granted'),
535
+ /**
536
+ * Evaluation duration in milliseconds
537
+ */
538
+ durationMs: zod_1.z.number()
539
+ .optional()
540
+ .describe('Evaluation duration in milliseconds'),
541
+ /**
542
+ * Error message if evaluation failed
543
+ */
544
+ error: zod_1.z.string()
545
+ .optional()
546
+ .describe('Error message if evaluation failed'),
547
+ /**
548
+ * Evaluated USING clause result
549
+ */
550
+ usingResult: zod_1.z.boolean()
551
+ .optional()
552
+ .describe('USING clause evaluation result'),
553
+ /**
554
+ * Evaluated CHECK clause result (for INSERT/UPDATE)
555
+ */
556
+ checkResult: zod_1.z.boolean()
557
+ .optional()
558
+ .describe('CHECK clause evaluation result'),
559
+ });
560
+ /**
561
+ * Helper factory for creating RLS policies
562
+ */
563
+ exports.RLS = {
564
+ /**
565
+ * Create a simple owner-based policy
566
+ */
567
+ ownerPolicy: (object, ownerField = 'owner_id') => ({
568
+ name: `${object}_owner_access`,
569
+ label: `Owner Access for ${object}`,
570
+ object,
571
+ operation: 'all',
572
+ using: `${ownerField} = current_user.id`,
573
+ enabled: true,
574
+ priority: 0,
575
+ }),
576
+ /**
577
+ * Create a tenant isolation policy
578
+ */
579
+ tenantPolicy: (object, tenantField = 'tenant_id') => ({
580
+ name: `${object}_tenant_isolation`,
581
+ label: `Tenant Isolation for ${object}`,
582
+ object,
583
+ operation: 'all',
584
+ using: `${tenantField} = current_user.tenant_id`,
585
+ check: `${tenantField} = current_user.tenant_id`,
586
+ enabled: true,
587
+ priority: 0,
588
+ }),
589
+ /**
590
+ * Create a role-based policy
591
+ */
592
+ rolePolicy: (object, roles, condition) => ({
593
+ name: `${object}_${roles.join('_')}_access`,
594
+ label: `${roles.join(', ')} Access for ${object}`,
595
+ object,
596
+ operation: 'select',
597
+ using: condition,
598
+ roles,
599
+ enabled: true,
600
+ priority: 0,
601
+ }),
602
+ /**
603
+ * Create a permissive policy (allow all for specific roles)
604
+ */
605
+ allowAllPolicy: (object, roles) => ({
606
+ name: `${object}_${roles.join('_')}_full_access`,
607
+ label: `Full Access for ${roles.join(', ')}`,
608
+ object,
609
+ operation: 'all',
610
+ using: '1 = 1', // Always true
611
+ roles,
612
+ enabled: true,
613
+ priority: 0,
614
+ }),
615
+ };
@@ -39,6 +39,19 @@ export declare const TerritoryModelSchema: z.ZodObject<{
39
39
  /**
40
40
  * Territory Node Schema
41
41
  * A single node in the territory tree.
42
+ *
43
+ * **NAMING CONVENTION:**
44
+ * Territory names are machine identifiers and must be lowercase snake_case.
45
+ *
46
+ * @example Good territory names
47
+ * - 'west_coast'
48
+ * - 'emea_region'
49
+ * - 'healthcare_vertical'
50
+ * - 'strategic_accounts'
51
+ *
52
+ * @example Bad territory names (will be rejected)
53
+ * - 'WestCoast' (PascalCase)
54
+ * - 'West Coast' (spaces)
42
55
  */
43
56
  export declare const TerritorySchema: z.ZodObject<{
44
57
  /** Identity */
@@ -1 +1 @@
1
- {"version":3,"file":"territory.zod.d.ts","sourceRoot":"","sources":["../../src/permission/territory.zod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;;;;GAcG;AAEH,eAAO,MAAM,aAAa,uEAKxB,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;EAK/B,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,eAAe;IAC1B,eAAe;;;IAIf,gBAAgB;;;;IAKhB;;;;OAIG;;IAGH;;;OAGG;;IAGH,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;EAInB,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
1
+ {"version":3,"file":"territory.zod.d.ts","sourceRoot":"","sources":["../../src/permission/territory.zod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;;;;;;;;;;GAcG;AAEH,eAAO,MAAM,aAAa,uEAKxB,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;EAK/B,CAAC;AAEH;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,eAAe;IAC1B,eAAe;;;IAIf,gBAAgB;;;;IAKhB;;;;OAIG;;IAGH;;;OAGG;;IAGH,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;EAInB,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TerritorySchema = exports.TerritoryModelSchema = exports.TerritoryType = void 0;
4
4
  const zod_1 = require("zod");
5
+ const identifiers_zod_1 = require("../shared/identifiers.zod");
5
6
  /**
6
7
  * Territory Management Protocol
7
8
  * Defines a matrix reporting structure that exists parallel to the Role Hierarchy.
@@ -37,10 +38,23 @@ exports.TerritoryModelSchema = zod_1.z.object({
37
38
  /**
38
39
  * Territory Node Schema
39
40
  * A single node in the territory tree.
41
+ *
42
+ * **NAMING CONVENTION:**
43
+ * Territory names are machine identifiers and must be lowercase snake_case.
44
+ *
45
+ * @example Good territory names
46
+ * - 'west_coast'
47
+ * - 'emea_region'
48
+ * - 'healthcare_vertical'
49
+ * - 'strategic_accounts'
50
+ *
51
+ * @example Bad territory names (will be rejected)
52
+ * - 'WestCoast' (PascalCase)
53
+ * - 'West Coast' (spaces)
40
54
  */
41
55
  exports.TerritorySchema = zod_1.z.object({
42
56
  /** Identity */
43
- name: zod_1.z.string().regex(/^[a-z_][a-z0-9_]*$/),
57
+ name: identifiers_zod_1.SnakeCaseIdentifierSchema.describe('Territory unique name (lowercase snake_case)'),
44
58
  label: zod_1.z.string().describe('Territory Label (e.g. "West Coast")'),
45
59
  /** Structure */
46
60
  modelId: zod_1.z.string().describe('Belongs to which Territory Model'),