@objectstack/plugin-sharing 7.3.0 → 7.4.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/dist/index.mjs CHANGED
@@ -1,5 +1,1662 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropNames = Object.getOwnPropertyNames;
3
+ var __esm = (fn, res) => function __init() {
4
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
5
+ };
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+
11
+ // src/translations/en.objects.generated.ts
12
+ var enObjects;
13
+ var init_en_objects_generated = __esm({
14
+ "src/translations/en.objects.generated.ts"() {
15
+ "use strict";
16
+ enObjects = {
17
+ sys_record_share: {
18
+ label: "Record Share",
19
+ pluralLabel: "Record Shares",
20
+ description: "Per-record sharing grant \u2014 extends OWD with explicit access",
21
+ fields: {
22
+ id: {
23
+ label: "Share ID"
24
+ },
25
+ object_name: {
26
+ label: "Object",
27
+ help: "Short object name of the shared record"
28
+ },
29
+ record_id: {
30
+ label: "Record",
31
+ help: "Primary key of the shared record within object_name"
32
+ },
33
+ recipient_type: {
34
+ label: "Recipient Type",
35
+ help: "Kind of principal that holds the grant",
36
+ options: {
37
+ user: "user",
38
+ group: "group",
39
+ role: "role",
40
+ role_and_subordinates: "role_and_subordinates",
41
+ guest: "guest"
42
+ }
43
+ },
44
+ recipient_id: {
45
+ label: "Recipient",
46
+ help: "ID of the user/group/role that receives access"
47
+ },
48
+ access_level: {
49
+ label: "Access Level",
50
+ help: "What the recipient can do \u2014 read | edit | full (transfer/share/delete)",
51
+ options: {
52
+ read: "read",
53
+ edit: "edit",
54
+ full: "full"
55
+ }
56
+ },
57
+ source: {
58
+ label: "Source",
59
+ help: "Why this grant exists \u2014 used by the rule evaluator to reconcile",
60
+ options: {
61
+ manual: "manual",
62
+ rule: "rule",
63
+ team: "team",
64
+ inherited: "inherited"
65
+ }
66
+ },
67
+ source_id: {
68
+ label: "Source ID",
69
+ help: "Rule name / team id when source != manual"
70
+ },
71
+ granted_by: {
72
+ label: "Granted By",
73
+ help: "User that created the grant (manual only)"
74
+ },
75
+ reason: {
76
+ label: "Reason",
77
+ help: "Optional free-text explanation surfaced to the recipient"
78
+ },
79
+ created_at: {
80
+ label: "Created At"
81
+ },
82
+ updated_at: {
83
+ label: "Updated At"
84
+ }
85
+ },
86
+ _views: {
87
+ granted_to_me: {
88
+ label: "Granted to Me"
89
+ },
90
+ granted_by_me: {
91
+ label: "Granted by Me"
92
+ },
93
+ by_object: {
94
+ label: "By Object"
95
+ },
96
+ manual_grants: {
97
+ label: "Manual Grants"
98
+ },
99
+ rule_grants: {
100
+ label: "Rule Grants"
101
+ },
102
+ all_shares: {
103
+ label: "All"
104
+ }
105
+ }
106
+ },
107
+ sys_sharing_rule: {
108
+ label: "Sharing Rule",
109
+ pluralLabel: "Sharing Rules",
110
+ description: "Declarative sharing rule that auto-materialises sys_record_share grants. Authored via defineSharingRule() in code or the Studio criteria builder.",
111
+ fields: {
112
+ id: {
113
+ label: "Rule ID"
114
+ },
115
+ organization_id: {
116
+ label: "Organization",
117
+ help: "Tenant that owns this rule; null = global"
118
+ },
119
+ name: {
120
+ label: "Name",
121
+ help: "Unique snake_case rule name"
122
+ },
123
+ label: {
124
+ label: "Display Label"
125
+ },
126
+ description: {
127
+ label: "Description"
128
+ },
129
+ object_name: {
130
+ label: "Object",
131
+ help: "Short object name (e.g. opportunity, account)"
132
+ },
133
+ criteria_json: {
134
+ label: "Criteria (FilterCondition JSON)",
135
+ help: "JSON FilterCondition matched against records of object_name. Empty = match all."
136
+ },
137
+ recipient_type: {
138
+ label: "Recipient Type",
139
+ help: "Kind of principal that receives access \u2014 expanded to user grants at evaluation time. `department` walks the parent_department_id tree; `team` is flat (better-auth).",
140
+ options: {
141
+ user: "user",
142
+ team: "team",
143
+ department: "department",
144
+ role: "role",
145
+ queue: "queue"
146
+ }
147
+ },
148
+ recipient_id: {
149
+ label: "Recipient",
150
+ help: "department id / team id / role name / queue name / user id depending on recipient_type"
151
+ },
152
+ access_level: {
153
+ label: "Access Level",
154
+ options: {
155
+ read: "read",
156
+ edit: "edit",
157
+ full: "full"
158
+ }
159
+ },
160
+ active: {
161
+ label: "Active",
162
+ help: "Only active rules participate in lifecycle evaluation"
163
+ },
164
+ created_at: {
165
+ label: "Created At"
166
+ },
167
+ updated_at: {
168
+ label: "Updated At"
169
+ }
170
+ },
171
+ _views: {
172
+ active: {
173
+ label: "Active"
174
+ },
175
+ inactive: {
176
+ label: "Inactive"
177
+ },
178
+ by_object: {
179
+ label: "By Object"
180
+ },
181
+ all_rules: {
182
+ label: "All"
183
+ }
184
+ }
185
+ },
186
+ sys_share_link: {
187
+ label: "Share Link",
188
+ pluralLabel: "Share Links",
189
+ description: "Opaque capability token granting access to a single record. Notion/Figma-style public link sharing.",
190
+ fields: {
191
+ id: {
192
+ label: "Link ID"
193
+ },
194
+ token: {
195
+ label: "Token",
196
+ help: "Opaque URL-safe random token (\u2265 22 chars). The only secret in this row."
197
+ },
198
+ object_name: {
199
+ label: "Object",
200
+ help: "Short object name of the shared record (e.g. ai_conversation, contracts_contract)"
201
+ },
202
+ record_id: {
203
+ label: "Record",
204
+ help: "Primary key of the shared record within object_name"
205
+ },
206
+ permission: {
207
+ label: "Permission",
208
+ help: "What the link holder can do with the record",
209
+ options: {
210
+ view: "View",
211
+ comment: "Comment",
212
+ edit: "Edit"
213
+ }
214
+ },
215
+ audience: {
216
+ label: "Audience",
217
+ help: "Gating layer applied on top of the token check",
218
+ options: {
219
+ public: "Public (indexable)",
220
+ link_only: "Anyone with the link",
221
+ signed_in: "Signed-in users",
222
+ email: "Specific emails"
223
+ }
224
+ },
225
+ expires_at: {
226
+ label: "Expires At",
227
+ help: "When set, resolveToken returns null after this timestamp"
228
+ },
229
+ email_allowlist: {
230
+ label: "Email Allowlist",
231
+ help: "Lowercased addresses checked when audience=email"
232
+ },
233
+ password_hash: {
234
+ label: "Password Hash",
235
+ help: "Argon2/bcrypt hash. When set, the UI prompts for a password before rendering."
236
+ },
237
+ redact_fields: {
238
+ label: "Per-Link Redactions",
239
+ help: "Extra fields stripped from the response, on top of the object-default set"
240
+ },
241
+ label: {
242
+ label: "Label",
243
+ help: 'Free-text shown in the share dialog (e.g. "ACME Q3 contract")'
244
+ },
245
+ revoked_at: {
246
+ label: "Revoked At",
247
+ help: "When set, the link is permanently disabled"
248
+ },
249
+ created_by: {
250
+ label: "Created By",
251
+ help: "Issuer of the link"
252
+ },
253
+ created_at: {
254
+ label: "Created At"
255
+ },
256
+ last_used_at: {
257
+ label: "Last Used At",
258
+ help: "Stamped by resolveToken; used by the dashboard to highlight active links"
259
+ },
260
+ use_count: {
261
+ label: "Use Count",
262
+ help: "Incremented by resolveToken on every successful resolution"
263
+ }
264
+ },
265
+ _views: {
266
+ active_links: {
267
+ label: "Active"
268
+ },
269
+ by_me: {
270
+ label: "Created by Me"
271
+ },
272
+ revoked: {
273
+ label: "Revoked"
274
+ },
275
+ all_links: {
276
+ label: "All"
277
+ }
278
+ }
279
+ }
280
+ };
281
+ }
282
+ });
283
+
284
+ // src/translations/zh-CN.objects.generated.ts
285
+ var zhCNObjects;
286
+ var init_zh_CN_objects_generated = __esm({
287
+ "src/translations/zh-CN.objects.generated.ts"() {
288
+ "use strict";
289
+ zhCNObjects = {
290
+ sys_record_share: {
291
+ label: "\u8BB0\u5F55\u5171\u4EAB",
292
+ pluralLabel: "\u8BB0\u5F55\u5171\u4EAB",
293
+ description: "\u6309\u8BB0\u5F55\u7C92\u5EA6\u7684\u5171\u4EAB\u6388\u6743\u2014\u2014\u5728 OWD \u57FA\u7840\u4E0A\u63D0\u4F9B\u663E\u5F0F\u8BBF\u95EE",
294
+ fields: {
295
+ id: {
296
+ label: "\u5171\u4EAB ID"
297
+ },
298
+ object_name: {
299
+ label: "\u5BF9\u8C61",
300
+ help: "\u88AB\u5171\u4EAB\u8BB0\u5F55\u7684\u77ED\u5BF9\u8C61\u540D"
301
+ },
302
+ record_id: {
303
+ label: "\u8BB0\u5F55",
304
+ help: "object_name \u5BF9\u5E94\u5BF9\u8C61\u5185\u8BE5\u5171\u4EAB\u8BB0\u5F55\u7684\u4E3B\u952E"
305
+ },
306
+ recipient_type: {
307
+ label: "\u63A5\u6536\u65B9\u7C7B\u578B",
308
+ help: "\u6301\u6709\u8BE5\u6388\u6743\u7684\u4E3B\u4F53\u7C7B\u578B",
309
+ options: {
310
+ user: "\u7528\u6237",
311
+ group: "\u7EC4",
312
+ role: "\u89D2\u8272",
313
+ role_and_subordinates: "\u89D2\u8272\u53CA\u4E0B\u7EA7",
314
+ guest: "\u8BBF\u5BA2"
315
+ }
316
+ },
317
+ recipient_id: {
318
+ label: "\u63A5\u6536\u65B9",
319
+ help: "\u83B7\u5F97\u8BBF\u95EE\u6743\u9650\u7684\u7528\u6237 / \u7EC4 / \u89D2\u8272 ID"
320
+ },
321
+ access_level: {
322
+ label: "\u8BBF\u95EE\u7EA7\u522B",
323
+ help: "\u63A5\u6536\u65B9\u53EF\u4EE5\u6267\u884C\u7684\u64CD\u4F5C\u2014\u2014read | edit | full\uFF08\u8F6C\u79FB / \u5171\u4EAB / \u5220\u9664\uFF09",
324
+ options: {
325
+ read: "\u8BFB\u53D6",
326
+ edit: "\u7F16\u8F91",
327
+ full: "\u5B8C\u5168\u8BBF\u95EE"
328
+ }
329
+ },
330
+ source: {
331
+ label: "\u6765\u6E90",
332
+ help: "\u8BE5\u6388\u6743\u5B58\u5728\u7684\u539F\u56E0\u2014\u2014\u4F9B\u89C4\u5219\u6C42\u503C\u5668\u5BF9\u8D26\u4F7F\u7528",
333
+ options: {
334
+ manual: "\u624B\u52A8",
335
+ rule: "\u89C4\u5219",
336
+ team: "\u56E2\u961F",
337
+ inherited: "\u7EE7\u627F"
338
+ }
339
+ },
340
+ source_id: {
341
+ label: "\u6765\u6E90 ID",
342
+ help: "\u5F53 source != manual \u65F6\uFF0C\u5BF9\u5E94\u89C4\u5219\u540D / \u56E2\u961F ID"
343
+ },
344
+ granted_by: {
345
+ label: "\u6388\u6743\u4EBA",
346
+ help: "\u521B\u5EFA\u8BE5\u6388\u6743\u7684\u7528\u6237\uFF08\u4EC5\u624B\u52A8\u6388\u6743\uFF09"
347
+ },
348
+ reason: {
349
+ label: "\u539F\u56E0",
350
+ help: "\u53EF\u9009\u7684\u81EA\u7531\u6587\u672C\u8BF4\u660E\uFF0C\u4F1A\u5C55\u793A\u7ED9\u63A5\u6536\u65B9"
351
+ },
352
+ created_at: {
353
+ label: "\u521B\u5EFA\u65F6\u95F4"
354
+ },
355
+ updated_at: {
356
+ label: "\u66F4\u65B0\u65F6\u95F4"
357
+ }
358
+ },
359
+ _views: {
360
+ granted_to_me: {
361
+ label: "\u6388\u4E88\u6211\u7684"
362
+ },
363
+ granted_by_me: {
364
+ label: "\u6211\u6388\u4E88\u7684"
365
+ },
366
+ by_object: {
367
+ label: "\u6309\u5BF9\u8C61"
368
+ },
369
+ manual_grants: {
370
+ label: "\u624B\u52A8\u6388\u6743"
371
+ },
372
+ rule_grants: {
373
+ label: "\u89C4\u5219\u6388\u6743"
374
+ },
375
+ all_shares: {
376
+ label: "\u5168\u90E8"
377
+ }
378
+ }
379
+ },
380
+ sys_sharing_rule: {
381
+ label: "\u5171\u4EAB\u89C4\u5219",
382
+ pluralLabel: "\u5171\u4EAB\u89C4\u5219",
383
+ description: "\u58F0\u660E\u5F0F\u5171\u4EAB\u89C4\u5219\uFF0C\u4F1A\u81EA\u52A8\u751F\u6210 sys_record_share \u6388\u6743\u3002\u53EF\u5728\u4EE3\u7801\u4E2D\u901A\u8FC7 defineSharingRule() \u7F16\u5199\uFF0C\u6216\u5728 Studio \u6761\u4EF6\u6784\u5EFA\u5668\u4E2D\u7EF4\u62A4\u3002",
384
+ fields: {
385
+ id: {
386
+ label: "\u89C4\u5219 ID"
387
+ },
388
+ organization_id: {
389
+ label: "\u7EC4\u7EC7",
390
+ help: "\u62E5\u6709\u8BE5\u89C4\u5219\u7684\u79DF\u6237\uFF1Bnull = \u5168\u5C40"
391
+ },
392
+ name: {
393
+ label: "\u540D\u79F0",
394
+ help: "\u552F\u4E00\u7684 snake_case \u89C4\u5219\u540D\u79F0"
395
+ },
396
+ label: {
397
+ label: "\u663E\u793A\u6807\u7B7E"
398
+ },
399
+ description: {
400
+ label: "\u63CF\u8FF0"
401
+ },
402
+ object_name: {
403
+ label: "\u5BF9\u8C61",
404
+ help: "\u77ED\u5BF9\u8C61\u540D\uFF08\u4F8B\u5982 opportunity\u3001account\uFF09"
405
+ },
406
+ criteria_json: {
407
+ label: "\u6761\u4EF6\uFF08FilterCondition JSON\uFF09",
408
+ help: "\u9488\u5BF9 object_name \u8BB0\u5F55\u5339\u914D\u7684 JSON FilterCondition\u3002\u4E3A\u7A7A\u8868\u793A\u5339\u914D\u5168\u90E8\u3002"
409
+ },
410
+ recipient_type: {
411
+ label: "\u63A5\u6536\u65B9\u7C7B\u578B",
412
+ help: "\u63A5\u6536\u8BBF\u95EE\u6743\u9650\u7684\u4E3B\u4F53\u7C7B\u578B\u2014\u2014\u6C42\u503C\u65F6\u4F1A\u5C55\u5F00\u4E3A\u7528\u6237\u6388\u6743\u3002`department` \u4F1A\u6CBF parent_department_id \u6811\u5C55\u5F00\uFF1B`team` \u4E3A\u6241\u5E73\u7ED3\u6784\uFF08better-auth\uFF09\u3002",
413
+ options: {
414
+ user: "\u7528\u6237",
415
+ team: "\u56E2\u961F",
416
+ department: "\u90E8\u95E8",
417
+ role: "\u89D2\u8272",
418
+ queue: "\u961F\u5217"
419
+ }
420
+ },
421
+ recipient_id: {
422
+ label: "\u63A5\u6536\u65B9",
423
+ help: "\u6839\u636E recipient_type \u586B\u5199 department id / team id / role name / queue name / user id"
424
+ },
425
+ access_level: {
426
+ label: "\u8BBF\u95EE\u7EA7\u522B",
427
+ options: {
428
+ read: "\u8BFB\u53D6",
429
+ edit: "\u7F16\u8F91",
430
+ full: "\u5B8C\u5168\u8BBF\u95EE"
431
+ }
432
+ },
433
+ active: {
434
+ label: "\u542F\u7528",
435
+ help: "\u53EA\u6709\u542F\u7528\u7684\u89C4\u5219\u624D\u4F1A\u53C2\u4E0E\u751F\u547D\u5468\u671F\u6C42\u503C"
436
+ },
437
+ created_at: {
438
+ label: "\u521B\u5EFA\u65F6\u95F4"
439
+ },
440
+ updated_at: {
441
+ label: "\u66F4\u65B0\u65F6\u95F4"
442
+ }
443
+ },
444
+ _views: {
445
+ active: {
446
+ label: "\u542F\u7528"
447
+ },
448
+ inactive: {
449
+ label: "\u505C\u7528"
450
+ },
451
+ by_object: {
452
+ label: "\u6309\u5BF9\u8C61"
453
+ },
454
+ all_rules: {
455
+ label: "\u5168\u90E8"
456
+ }
457
+ }
458
+ },
459
+ sys_share_link: {
460
+ label: "\u5171\u4EAB\u94FE\u63A5",
461
+ pluralLabel: "\u5171\u4EAB\u94FE\u63A5",
462
+ description: "\u6388\u4E88\u5BF9\u5355\u6761\u8BB0\u5F55\u8BBF\u95EE\u6743\u9650\u7684\u4E0D\u900F\u660E\u80FD\u529B\u4EE4\u724C\u3002\u7C7B\u4F3C Notion/Figma \u7684\u516C\u5F00\u94FE\u63A5\u5171\u4EAB\u3002",
463
+ fields: {
464
+ id: {
465
+ label: "\u94FE\u63A5 ID"
466
+ },
467
+ token: {
468
+ label: "\u4EE4\u724C",
469
+ help: "URL \u5B89\u5168\u7684\u4E0D\u900F\u660E\u968F\u673A\u4EE4\u724C\uFF08\u2265 22 \u4E2A\u5B57\u7B26\uFF09\u3002\u672C\u8BB0\u5F55\u4E2D\u552F\u4E00\u7684\u673A\u5BC6\u4FE1\u606F\u3002"
470
+ },
471
+ object_name: {
472
+ label: "\u5BF9\u8C61",
473
+ help: "\u6240\u5171\u4EAB\u8BB0\u5F55\u7684\u5BF9\u8C61\u77ED\u540D\u79F0\uFF08\u4F8B\u5982 ai_conversation\u3001contracts_contract\uFF09"
474
+ },
475
+ record_id: {
476
+ label: "\u8BB0\u5F55",
477
+ help: "object_name \u5185\u6240\u5171\u4EAB\u8BB0\u5F55\u7684\u4E3B\u952E"
478
+ },
479
+ permission: {
480
+ label: "\u6743\u9650",
481
+ help: "\u94FE\u63A5\u6301\u6709\u8005\u53EF\u5BF9\u8BE5\u8BB0\u5F55\u6267\u884C\u7684\u64CD\u4F5C",
482
+ options: {
483
+ view: "\u67E5\u770B",
484
+ comment: "\u8BC4\u8BBA",
485
+ edit: "\u7F16\u8F91"
486
+ }
487
+ },
488
+ audience: {
489
+ label: "\u53D7\u4F17",
490
+ help: "\u5728\u4EE4\u724C\u6821\u9A8C\u4E4B\u4E0A\u989D\u5916\u65BD\u52A0\u7684\u8BBF\u95EE\u9650\u5236\u5C42",
491
+ options: {
492
+ public: "\u516C\u5F00\uFF08\u53EF\u88AB\u7D22\u5F15\uFF09",
493
+ link_only: "\u4EFB\u4F55\u6301\u6709\u94FE\u63A5\u7684\u4EBA",
494
+ signed_in: "\u5DF2\u767B\u5F55\u7528\u6237",
495
+ email: "\u6307\u5B9A\u90AE\u7BB1"
496
+ }
497
+ },
498
+ expires_at: {
499
+ label: "\u8FC7\u671F\u65F6\u95F4",
500
+ help: "\u8BBE\u7F6E\u540E\uFF0C\u8D85\u8FC7\u6B64\u65F6\u95F4\u70B9 resolveToken \u5C06\u8FD4\u56DE null"
501
+ },
502
+ email_allowlist: {
503
+ label: "\u90AE\u7BB1\u767D\u540D\u5355",
504
+ help: "\u5F53 audience=email \u65F6\u6821\u9A8C\u7684\u5C0F\u5199\u90AE\u7BB1\u5730\u5740"
505
+ },
506
+ password_hash: {
507
+ label: "\u5BC6\u7801\u54C8\u5E0C",
508
+ help: "Argon2/bcrypt \u54C8\u5E0C\u503C\u3002\u8BBE\u7F6E\u540E\uFF0C\u754C\u9762\u4F1A\u5728\u5448\u73B0\u5185\u5BB9\u524D\u63D0\u793A\u8F93\u5165\u5BC6\u7801\u3002"
509
+ },
510
+ redact_fields: {
511
+ label: "\u6309\u94FE\u63A5\u8131\u654F\u5B57\u6BB5",
512
+ help: "\u5728\u5BF9\u8C61\u9ED8\u8BA4\u8131\u654F\u96C6\u4E4B\u4E0A\uFF0C\u4ECE\u54CD\u5E94\u4E2D\u989D\u5916\u5254\u9664\u7684\u5B57\u6BB5"
513
+ },
514
+ label: {
515
+ label: "\u6807\u7B7E",
516
+ help: '\u5728\u5171\u4EAB\u5BF9\u8BDD\u6846\u4E2D\u663E\u793A\u7684\u81EA\u7531\u6587\u672C\uFF08\u4F8B\u5982 "ACME Q3 \u5408\u540C"\uFF09'
517
+ },
518
+ revoked_at: {
519
+ label: "\u64A4\u9500\u65F6\u95F4",
520
+ help: "\u8BBE\u7F6E\u540E\uFF0C\u8BE5\u94FE\u63A5\u5C06\u88AB\u6C38\u4E45\u505C\u7528"
521
+ },
522
+ created_by: {
523
+ label: "\u521B\u5EFA\u4EBA",
524
+ help: "\u94FE\u63A5\u7684\u7B7E\u53D1\u8005"
525
+ },
526
+ created_at: {
527
+ label: "\u521B\u5EFA\u65F6\u95F4"
528
+ },
529
+ last_used_at: {
530
+ label: "\u6700\u8FD1\u4F7F\u7528\u65F6\u95F4",
531
+ help: "\u7531 resolveToken \u6807\u8BB0\uFF1B\u4EEA\u8868\u76D8\u636E\u6B64\u9AD8\u4EAE\u663E\u793A\u6D3B\u8DC3\u94FE\u63A5"
532
+ },
533
+ use_count: {
534
+ label: "\u4F7F\u7528\u6B21\u6570",
535
+ help: "\u6BCF\u6B21\u6210\u529F\u89E3\u6790\u65F6\u7531 resolveToken \u9012\u589E"
536
+ }
537
+ },
538
+ _views: {
539
+ active_links: {
540
+ label: "\u6D3B\u8DC3"
541
+ },
542
+ by_me: {
543
+ label: "\u6211\u521B\u5EFA\u7684"
544
+ },
545
+ revoked: {
546
+ label: "\u5DF2\u64A4\u9500"
547
+ },
548
+ all_links: {
549
+ label: "\u5168\u90E8"
550
+ }
551
+ }
552
+ }
553
+ };
554
+ }
555
+ });
556
+
557
+ // src/translations/ja-JP.objects.generated.ts
558
+ var jaJPObjects;
559
+ var init_ja_JP_objects_generated = __esm({
560
+ "src/translations/ja-JP.objects.generated.ts"() {
561
+ "use strict";
562
+ jaJPObjects = {
563
+ sys_record_share: {
564
+ label: "\u30EC\u30B3\u30FC\u30C9\u5171\u6709",
565
+ pluralLabel: "\u30EC\u30B3\u30FC\u30C9\u5171\u6709",
566
+ description: "\u30EC\u30B3\u30FC\u30C9\u3054\u3068\u306E\u5171\u6709\u4ED8\u4E0E \u2014 OWD \u306B\u660E\u793A\u7684\u306A\u30A2\u30AF\u30BB\u30B9\u3092\u8FFD\u52A0",
567
+ fields: {
568
+ id: {
569
+ label: "\u5171\u6709 ID"
570
+ },
571
+ object_name: {
572
+ label: "\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8",
573
+ help: "\u5171\u6709\u30EC\u30B3\u30FC\u30C9\u306E\u77ED\u3044\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u540D"
574
+ },
575
+ record_id: {
576
+ label: "\u30EC\u30B3\u30FC\u30C9",
577
+ help: "object_name \u5185\u306E\u5171\u6709\u30EC\u30B3\u30FC\u30C9\u306E\u4E3B\u30AD\u30FC"
578
+ },
579
+ recipient_type: {
580
+ label: "\u53D7\u4FE1\u8005\u30BF\u30A4\u30D7",
581
+ help: "\u4ED8\u4E0E\u3092\u4FDD\u6301\u3059\u308B\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u306E\u7A2E\u5225",
582
+ options: {
583
+ user: "\u30E6\u30FC\u30B6\u30FC",
584
+ group: "\u30B0\u30EB\u30FC\u30D7",
585
+ role: "\u30ED\u30FC\u30EB",
586
+ role_and_subordinates: "\u30ED\u30FC\u30EB\u3068\u4E0B\u4F4D\u968E\u5C64",
587
+ guest: "\u30B2\u30B9\u30C8"
588
+ }
589
+ },
590
+ recipient_id: {
591
+ label: "\u53D7\u4FE1\u8005",
592
+ help: "\u30A2\u30AF\u30BB\u30B9\u3092\u53D7\u3051\u53D6\u308B\u30E6\u30FC\u30B6\u30FC/\u30B0\u30EB\u30FC\u30D7/\u30ED\u30FC\u30EB\u306E ID"
593
+ },
594
+ access_level: {
595
+ label: "\u30A2\u30AF\u30BB\u30B9\u30EC\u30D9\u30EB",
596
+ help: "\u53D7\u4FE1\u8005\u306B\u8A31\u53EF\u3055\u308C\u308B\u64CD\u4F5C \u2014 read | edit | full\uFF08\u8EE2\u9001/\u5171\u6709/\u524A\u9664\uFF09",
597
+ options: {
598
+ read: "\u95B2\u89A7",
599
+ edit: "\u7DE8\u96C6",
600
+ full: "\u30D5\u30EB\u30A2\u30AF\u30BB\u30B9"
601
+ }
602
+ },
603
+ source: {
604
+ label: "\u30BD\u30FC\u30B9",
605
+ help: "\u3053\u306E\u4ED8\u4E0E\u304C\u5B58\u5728\u3059\u308B\u7406\u7531 \u2014 \u30EB\u30FC\u30EB\u8A55\u4FA1\u8005\u304C\u8ABF\u6574\u306B\u4F7F\u7528",
606
+ options: {
607
+ manual: "\u624B\u52D5",
608
+ rule: "\u30EB\u30FC\u30EB",
609
+ team: "\u30C1\u30FC\u30E0",
610
+ inherited: "\u7D99\u627F"
611
+ }
612
+ },
613
+ source_id: {
614
+ label: "\u30BD\u30FC\u30B9 ID",
615
+ help: "source != manual \u306E\u5834\u5408\u306E\u30EB\u30FC\u30EB\u540D / \u30C1\u30FC\u30E0 ID"
616
+ },
617
+ granted_by: {
618
+ label: "\u4ED8\u4E0E\u8005",
619
+ help: "\u4ED8\u4E0E\u3092\u4F5C\u6210\u3057\u305F\u30E6\u30FC\u30B6\u30FC\uFF08\u624B\u52D5\u306E\u307F\uFF09"
620
+ },
621
+ reason: {
622
+ label: "\u7406\u7531",
623
+ help: "\u53D7\u4FE1\u8005\u306B\u8868\u793A\u3055\u308C\u308B\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u81EA\u7531\u8A18\u8FF0\u8AAC\u660E"
624
+ },
625
+ created_at: {
626
+ label: "\u4F5C\u6210\u65E5\u6642"
627
+ },
628
+ updated_at: {
629
+ label: "\u66F4\u65B0\u65E5\u6642"
630
+ }
631
+ },
632
+ _views: {
633
+ granted_to_me: {
634
+ label: "\u81EA\u5206\u3078\u306E\u4ED8\u4E0E"
635
+ },
636
+ granted_by_me: {
637
+ label: "\u81EA\u5206\u306B\u3088\u308B\u4ED8\u4E0E"
638
+ },
639
+ by_object: {
640
+ label: "\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u5225"
641
+ },
642
+ manual_grants: {
643
+ label: "\u624B\u52D5\u4ED8\u4E0E"
644
+ },
645
+ rule_grants: {
646
+ label: "\u30EB\u30FC\u30EB\u4ED8\u4E0E"
647
+ },
648
+ all_shares: {
649
+ label: "\u3059\u3079\u3066"
650
+ }
651
+ }
652
+ },
653
+ sys_sharing_rule: {
654
+ label: "\u5171\u6709\u30EB\u30FC\u30EB",
655
+ pluralLabel: "\u5171\u6709\u30EB\u30FC\u30EB",
656
+ description: "sys_record_share \u4ED8\u4E0E\u3092\u81EA\u52D5\u30DE\u30C6\u30EA\u30A2\u30E9\u30A4\u30BA\u3059\u308B\u5BA3\u8A00\u7684\u5171\u6709\u30EB\u30FC\u30EB\u3002\u30B3\u30FC\u30C9\u306E defineSharingRule() \u307E\u305F\u306F Studio \u306E\u6761\u4EF6\u30D3\u30EB\u30C0\u30FC\u3067\u4F5C\u6210\u3057\u307E\u3059\u3002",
657
+ fields: {
658
+ id: {
659
+ label: "\u30EB\u30FC\u30EB ID"
660
+ },
661
+ organization_id: {
662
+ label: "\u7D44\u7E54",
663
+ help: "\u3053\u306E\u30EB\u30FC\u30EB\u3092\u6240\u6709\u3059\u308B\u30C6\u30CA\u30F3\u30C8\u3002null = \u30B0\u30ED\u30FC\u30D0\u30EB"
664
+ },
665
+ name: {
666
+ label: "\u540D\u524D",
667
+ help: "\u4E00\u610F\u306E snake_case \u30EB\u30FC\u30EB\u540D"
668
+ },
669
+ label: {
670
+ label: "\u8868\u793A\u540D"
671
+ },
672
+ description: {
673
+ label: "\u8AAC\u660E"
674
+ },
675
+ object_name: {
676
+ label: "\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8",
677
+ help: "\u77ED\u3044\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u540D\uFF08\u4F8B: opportunity\u3001account\uFF09"
678
+ },
679
+ criteria_json: {
680
+ label: "\u6761\u4EF6\uFF08FilterCondition JSON\uFF09",
681
+ help: "object_name \u306E\u30EC\u30B3\u30FC\u30C9\u306B\u5BFE\u3057\u3066\u30DE\u30C3\u30C1\u3059\u308B JSON FilterCondition\u3002\u7A7A = \u3059\u3079\u3066\u306B\u30DE\u30C3\u30C1\u3002"
682
+ },
683
+ recipient_type: {
684
+ label: "\u53D7\u4FE1\u8005\u30BF\u30A4\u30D7",
685
+ help: "\u30A2\u30AF\u30BB\u30B9\u3092\u53D7\u3051\u53D6\u308B\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u306E\u7A2E\u5225 \u2014 \u8A55\u4FA1\u6642\u306B\u30E6\u30FC\u30B6\u30FC\u4ED8\u4E0E\u306B\u5C55\u958B\u3055\u308C\u307E\u3059\u3002`department` \u306F parent_department_id \u30C4\u30EA\u30FC\u3092\u305F\u3069\u308A\u307E\u3059\u3002`team` \u306F\u30D5\u30E9\u30C3\u30C8\uFF08better-auth\uFF09\u3002",
686
+ options: {
687
+ user: "\u30E6\u30FC\u30B6\u30FC",
688
+ team: "\u30C1\u30FC\u30E0",
689
+ department: "\u90E8\u9580",
690
+ role: "\u30ED\u30FC\u30EB",
691
+ queue: "\u30AD\u30E5\u30FC"
692
+ }
693
+ },
694
+ recipient_id: {
695
+ label: "\u53D7\u4FE1\u8005",
696
+ help: "recipient_type \u306B\u5FDC\u3058\u305F\u90E8\u9580 ID / \u30C1\u30FC\u30E0 ID / \u30ED\u30FC\u30EB\u540D / \u30AD\u30E5\u30FC\u540D / \u30E6\u30FC\u30B6\u30FC ID"
697
+ },
698
+ access_level: {
699
+ label: "\u30A2\u30AF\u30BB\u30B9\u30EC\u30D9\u30EB",
700
+ options: {
701
+ read: "\u95B2\u89A7",
702
+ edit: "\u7DE8\u96C6",
703
+ full: "\u30D5\u30EB\u30A2\u30AF\u30BB\u30B9"
704
+ }
705
+ },
706
+ active: {
707
+ label: "\u6709\u52B9",
708
+ help: "\u6709\u52B9\u306A\u30EB\u30FC\u30EB\u306E\u307F\u304C\u30E9\u30A4\u30D5\u30B5\u30A4\u30AF\u30EB\u8A55\u4FA1\u306B\u53C2\u52A0\u3057\u307E\u3059"
709
+ },
710
+ created_at: {
711
+ label: "\u4F5C\u6210\u65E5\u6642"
712
+ },
713
+ updated_at: {
714
+ label: "\u66F4\u65B0\u65E5\u6642"
715
+ }
716
+ },
717
+ _views: {
718
+ active: {
719
+ label: "\u6709\u52B9"
720
+ },
721
+ inactive: {
722
+ label: "\u7121\u52B9"
723
+ },
724
+ by_object: {
725
+ label: "\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u5225"
726
+ },
727
+ all_rules: {
728
+ label: "\u3059\u3079\u3066"
729
+ }
730
+ }
731
+ },
732
+ sys_share_link: {
733
+ label: "\u5171\u6709\u30EA\u30F3\u30AF",
734
+ pluralLabel: "\u5171\u6709\u30EA\u30F3\u30AF",
735
+ description: "\u5358\u4E00\u30EC\u30B3\u30FC\u30C9\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u3092\u8A31\u53EF\u3059\u308B\u4E0D\u900F\u660E\u306A\u30B1\u30FC\u30D1\u30D3\u30EA\u30C6\u30A3\u30C8\u30FC\u30AF\u30F3\u3002Notion / Figma \u30B9\u30BF\u30A4\u30EB\u306E\u516C\u958B\u30EA\u30F3\u30AF\u5171\u6709\u3002",
736
+ fields: {
737
+ id: {
738
+ label: "\u30EA\u30F3\u30AF ID"
739
+ },
740
+ token: {
741
+ label: "\u30C8\u30FC\u30AF\u30F3",
742
+ help: "URL \u30BB\u30FC\u30D5\u306A\u4E0D\u900F\u660E\u30E9\u30F3\u30C0\u30E0\u30C8\u30FC\u30AF\u30F3\uFF0822 \u6587\u5B57\u4EE5\u4E0A\uFF09\u3002\u3053\u306E\u884C\u3067\u552F\u4E00\u306E\u6A5F\u5BC6\u60C5\u5831\u3067\u3059\u3002"
743
+ },
744
+ object_name: {
745
+ label: "\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8",
746
+ help: "\u5171\u6709\u5BFE\u8C61\u30EC\u30B3\u30FC\u30C9\u306E\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u77ED\u7E2E\u540D\uFF08\u4F8B: ai_conversation\u3001contracts_contract\uFF09"
747
+ },
748
+ record_id: {
749
+ label: "\u30EC\u30B3\u30FC\u30C9",
750
+ help: "object_name \u5185\u306B\u304A\u3051\u308B\u5171\u6709\u5BFE\u8C61\u30EC\u30B3\u30FC\u30C9\u306E\u4E3B\u30AD\u30FC"
751
+ },
752
+ permission: {
753
+ label: "\u6A29\u9650",
754
+ help: "\u30EA\u30F3\u30AF\u4FDD\u6301\u8005\u304C\u30EC\u30B3\u30FC\u30C9\u306B\u5BFE\u3057\u3066\u5B9F\u884C\u3067\u304D\u308B\u64CD\u4F5C",
755
+ options: {
756
+ view: "\u95B2\u89A7",
757
+ comment: "\u30B3\u30E1\u30F3\u30C8",
758
+ edit: "\u7DE8\u96C6"
759
+ }
760
+ },
761
+ audience: {
762
+ label: "\u5BFE\u8C61\u8005",
763
+ help: "\u30C8\u30FC\u30AF\u30F3\u691C\u8A3C\u306E\u4E0A\u306B\u9069\u7528\u3055\u308C\u308B\u30A2\u30AF\u30BB\u30B9\u5236\u5FA1\u30EC\u30A4\u30E4\u30FC",
764
+ options: {
765
+ public: "\u516C\u958B\uFF08\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u53EF\u80FD\uFF09",
766
+ link_only: "\u30EA\u30F3\u30AF\u3092\u77E5\u3063\u3066\u3044\u308B\u5168\u54E1",
767
+ signed_in: "\u30B5\u30A4\u30F3\u30A4\u30F3\u6E08\u307F\u30E6\u30FC\u30B6\u30FC",
768
+ email: "\u7279\u5B9A\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9"
769
+ }
770
+ },
771
+ expires_at: {
772
+ label: "\u6709\u52B9\u671F\u9650",
773
+ help: "\u8A2D\u5B9A\u3059\u308B\u3068\u3001\u3053\u306E\u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\u4EE5\u964D\u306F resolveToken \u304C null \u3092\u8FD4\u3057\u307E\u3059"
774
+ },
775
+ email_allowlist: {
776
+ label: "\u30E1\u30FC\u30EB\u8A31\u53EF\u30EA\u30B9\u30C8",
777
+ help: "audience=email \u306E\u3068\u304D\u306B\u7167\u5408\u3055\u308C\u308B\u5C0F\u6587\u5B57\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9"
778
+ },
779
+ password_hash: {
780
+ label: "\u30D1\u30B9\u30EF\u30FC\u30C9\u30CF\u30C3\u30B7\u30E5",
781
+ help: "Argon2/bcrypt \u30CF\u30C3\u30B7\u30E5\u3002\u8A2D\u5B9A\u3059\u308B\u3068\u3001\u8868\u793A\u524D\u306B UI \u304C\u30D1\u30B9\u30EF\u30FC\u30C9\u306E\u5165\u529B\u3092\u6C42\u3081\u307E\u3059\u3002"
782
+ },
783
+ redact_fields: {
784
+ label: "\u30EA\u30F3\u30AF\u5358\u4F4D\u306E\u30DE\u30B9\u30AD\u30F3\u30B0",
785
+ help: "\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u65E2\u5B9A\u306E\u30DE\u30B9\u30AD\u30F3\u30B0\u96C6\u5408\u306B\u52A0\u3048\u3066\u3001\u30EC\u30B9\u30DD\u30F3\u30B9\u304B\u3089\u9664\u5916\u3059\u308B\u8FFD\u52A0\u30D5\u30A3\u30FC\u30EB\u30C9"
786
+ },
787
+ label: {
788
+ label: "\u30E9\u30D9\u30EB",
789
+ help: '\u5171\u6709\u30C0\u30A4\u30A2\u30ED\u30B0\u306B\u8868\u793A\u3055\u308C\u308B\u81EA\u7531\u8A18\u8FF0\u30C6\u30AD\u30B9\u30C8\uFF08\u4F8B: "ACME Q3 contract"\uFF09'
790
+ },
791
+ revoked_at: {
792
+ label: "\u5931\u52B9\u65E5\u6642",
793
+ help: "\u8A2D\u5B9A\u3059\u308B\u3068\u3001\u30EA\u30F3\u30AF\u306F\u6052\u4E45\u7684\u306B\u7121\u52B9\u5316\u3055\u308C\u307E\u3059"
794
+ },
795
+ created_by: {
796
+ label: "\u4F5C\u6210\u8005",
797
+ help: "\u30EA\u30F3\u30AF\u306E\u767A\u884C\u8005"
798
+ },
799
+ created_at: {
800
+ label: "\u4F5C\u6210\u65E5\u6642"
801
+ },
802
+ last_used_at: {
803
+ label: "\u6700\u7D42\u4F7F\u7528\u65E5\u6642",
804
+ help: "resolveToken \u306B\u3088\u3063\u3066\u8A18\u9332\u3055\u308C\u307E\u3059\u3002\u30C0\u30C3\u30B7\u30E5\u30DC\u30FC\u30C9\u3067\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30EA\u30F3\u30AF\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059"
805
+ },
806
+ use_count: {
807
+ label: "\u4F7F\u7528\u56DE\u6570",
808
+ help: "\u89E3\u6C7A\u304C\u6210\u529F\u3059\u308B\u305F\u3073\u306B resolveToken \u306B\u3088\u3063\u3066\u52A0\u7B97\u3055\u308C\u307E\u3059"
809
+ }
810
+ },
811
+ _views: {
812
+ active_links: {
813
+ label: "\u30A2\u30AF\u30C6\u30A3\u30D6"
814
+ },
815
+ by_me: {
816
+ label: "\u81EA\u5206\u304C\u4F5C\u6210"
817
+ },
818
+ revoked: {
819
+ label: "\u5931\u52B9\u6E08\u307F"
820
+ },
821
+ all_links: {
822
+ label: "\u3059\u3079\u3066"
823
+ }
824
+ }
825
+ }
826
+ };
827
+ }
828
+ });
829
+
830
+ // src/translations/es-ES.objects.generated.ts
831
+ var esESObjects;
832
+ var init_es_ES_objects_generated = __esm({
833
+ "src/translations/es-ES.objects.generated.ts"() {
834
+ "use strict";
835
+ esESObjects = {
836
+ sys_record_share: {
837
+ label: "Compartici\xF3n de registro",
838
+ pluralLabel: "Comparticiones de registro",
839
+ description: "Concesi\xF3n de compartici\xF3n por registro; ampl\xEDa OWD con acceso expl\xEDcito.",
840
+ fields: {
841
+ id: {
842
+ label: "ID de compartici\xF3n"
843
+ },
844
+ object_name: {
845
+ label: "Objeto",
846
+ help: "Nombre corto del objeto del registro compartido."
847
+ },
848
+ record_id: {
849
+ label: "Registro",
850
+ help: "Clave primaria del registro compartido dentro de object_name."
851
+ },
852
+ recipient_type: {
853
+ label: "Tipo de destinatario",
854
+ help: "Tipo de principal que posee la concesi\xF3n.",
855
+ options: {
856
+ user: "Usuario",
857
+ group: "Grupo",
858
+ role: "Rol",
859
+ role_and_subordinates: "Rol y subordinados",
860
+ guest: "Invitado"
861
+ }
862
+ },
863
+ recipient_id: {
864
+ label: "Destinatario",
865
+ help: "ID del usuario/grupo/rol que recibe acceso."
866
+ },
867
+ access_level: {
868
+ label: "Nivel de acceso",
869
+ help: "Lo que puede hacer el destinatario: read | edit | full (transfer/share/delete).",
870
+ options: {
871
+ read: "Leer",
872
+ edit: "Editar",
873
+ full: "Total"
874
+ }
875
+ },
876
+ source: {
877
+ label: "Origen",
878
+ help: "Motivo por el que existe esta concesi\xF3n; lo utiliza el evaluador de reglas para reconciliar.",
879
+ options: {
880
+ manual: "Manual",
881
+ rule: "Regla",
882
+ team: "Equipo",
883
+ inherited: "Heredado"
884
+ }
885
+ },
886
+ source_id: {
887
+ label: "ID de origen",
888
+ help: "Nombre de la regla / ID del equipo cuando source != manual."
889
+ },
890
+ granted_by: {
891
+ label: "Concedido por",
892
+ help: "Usuario que cre\xF3 la concesi\xF3n (solo manual)."
893
+ },
894
+ reason: {
895
+ label: "Motivo",
896
+ help: "Explicaci\xF3n opcional en texto libre que se muestra al destinatario."
897
+ },
898
+ created_at: {
899
+ label: "Creado el"
900
+ },
901
+ updated_at: {
902
+ label: "Actualizado el"
903
+ }
904
+ },
905
+ _views: {
906
+ granted_to_me: {
907
+ label: "Concedidos a m\xED"
908
+ },
909
+ granted_by_me: {
910
+ label: "Concedidos por m\xED"
911
+ },
912
+ by_object: {
913
+ label: "Por objeto"
914
+ },
915
+ manual_grants: {
916
+ label: "Concesiones manuales"
917
+ },
918
+ rule_grants: {
919
+ label: "Concesiones por regla"
920
+ },
921
+ all_shares: {
922
+ label: "Todas"
923
+ }
924
+ }
925
+ },
926
+ sys_sharing_rule: {
927
+ label: "Regla de compartici\xF3n",
928
+ pluralLabel: "Reglas de compartici\xF3n",
929
+ description: "Regla de compartici\xF3n declarativa que materializa autom\xE1ticamente concesiones de sys_record_share. Se define mediante defineSharingRule() en c\xF3digo o con el generador de criterios de Studio.",
930
+ fields: {
931
+ id: {
932
+ label: "ID de regla"
933
+ },
934
+ organization_id: {
935
+ label: "Organizaci\xF3n",
936
+ help: "Tenant que posee esta regla; null = global."
937
+ },
938
+ name: {
939
+ label: "Nombre",
940
+ help: "Nombre de regla snake_case \xFAnico."
941
+ },
942
+ label: {
943
+ label: "Nombre visible"
944
+ },
945
+ description: {
946
+ label: "Descripci\xF3n"
947
+ },
948
+ object_name: {
949
+ label: "Objeto",
950
+ help: "Nombre corto del objeto (p. ej. opportunity, account)."
951
+ },
952
+ criteria_json: {
953
+ label: "Criterios (JSON de FilterCondition)",
954
+ help: "FilterCondition JSON comparado con los registros de object_name. Vac\xEDo = coincide con todos."
955
+ },
956
+ recipient_type: {
957
+ label: "Tipo de destinatario",
958
+ help: "Tipo de principal que recibe acceso; se expande a concesiones de usuario durante la evaluaci\xF3n. `department` recorre el \xE1rbol parent_department_id; `team` es plano (better-auth).",
959
+ options: {
960
+ user: "Usuario",
961
+ team: "Equipo",
962
+ department: "Departamento",
963
+ role: "Rol",
964
+ queue: "Cola"
965
+ }
966
+ },
967
+ recipient_id: {
968
+ label: "Destinatario",
969
+ help: "ID de departamento / ID de equipo / nombre del rol / nombre de la cola / ID del usuario seg\xFAn recipient_type."
970
+ },
971
+ access_level: {
972
+ label: "Nivel de acceso",
973
+ options: {
974
+ read: "Leer",
975
+ edit: "Editar",
976
+ full: "Total"
977
+ }
978
+ },
979
+ active: {
980
+ label: "Activo",
981
+ help: "Solo las reglas activas participan en la evaluaci\xF3n del ciclo de vida."
982
+ },
983
+ created_at: {
984
+ label: "Creado el"
985
+ },
986
+ updated_at: {
987
+ label: "Actualizado el"
988
+ }
989
+ },
990
+ _views: {
991
+ active: {
992
+ label: "Activo"
993
+ },
994
+ inactive: {
995
+ label: "Inactivo"
996
+ },
997
+ by_object: {
998
+ label: "Por objeto"
999
+ },
1000
+ all_rules: {
1001
+ label: "Todas"
1002
+ }
1003
+ }
1004
+ },
1005
+ sys_share_link: {
1006
+ label: "Enlace de uso compartido",
1007
+ pluralLabel: "Enlaces de uso compartido",
1008
+ description: "Token de capacidad opaco que concede acceso a un \xFAnico registro. Uso compartido mediante enlace p\xFAblico al estilo de Notion/Figma.",
1009
+ fields: {
1010
+ id: {
1011
+ label: "ID del enlace"
1012
+ },
1013
+ token: {
1014
+ label: "Token",
1015
+ help: "Token aleatorio opaco seguro para URL (\u2265 22 caracteres). El \xFAnico secreto de esta fila."
1016
+ },
1017
+ object_name: {
1018
+ label: "Objeto",
1019
+ help: "Nombre corto del objeto del registro compartido (p. ej. ai_conversation, contracts_contract)"
1020
+ },
1021
+ record_id: {
1022
+ label: "Registro",
1023
+ help: "Clave principal del registro compartido dentro de object_name"
1024
+ },
1025
+ permission: {
1026
+ label: "Permiso",
1027
+ help: "Lo que el titular del enlace puede hacer con el registro",
1028
+ options: {
1029
+ view: "Ver",
1030
+ comment: "Comentar",
1031
+ edit: "Editar"
1032
+ }
1033
+ },
1034
+ audience: {
1035
+ label: "Audiencia",
1036
+ help: "Capa de control aplicada por encima de la verificaci\xF3n del token",
1037
+ options: {
1038
+ public: "P\xFAblico (indexable)",
1039
+ link_only: "Cualquier persona con el enlace",
1040
+ signed_in: "Usuarios con sesi\xF3n iniciada",
1041
+ email: "Correos espec\xEDficos"
1042
+ }
1043
+ },
1044
+ expires_at: {
1045
+ label: "Caduca el",
1046
+ help: "Cuando se establece, resolveToken devuelve null despu\xE9s de esta marca de tiempo"
1047
+ },
1048
+ email_allowlist: {
1049
+ label: "Lista de correos permitidos",
1050
+ help: "Direcciones en min\xFAsculas que se comprueban cuando audience=email"
1051
+ },
1052
+ password_hash: {
1053
+ label: "Hash de contrase\xF1a",
1054
+ help: "Hash Argon2/bcrypt. Cuando se establece, la interfaz solicita una contrase\xF1a antes de mostrar el contenido."
1055
+ },
1056
+ redact_fields: {
1057
+ label: "Campos ocultos por enlace",
1058
+ help: "Campos adicionales que se eliminan de la respuesta, adem\xE1s del conjunto predeterminado del objeto"
1059
+ },
1060
+ label: {
1061
+ label: "Etiqueta",
1062
+ help: 'Texto libre que se muestra en el cuadro de di\xE1logo de uso compartido (p. ej. "ACME Q3 contract")'
1063
+ },
1064
+ revoked_at: {
1065
+ label: "Revocado el",
1066
+ help: "Cuando se establece, el enlace queda deshabilitado permanentemente"
1067
+ },
1068
+ created_by: {
1069
+ label: "Creado por",
1070
+ help: "Emisor del enlace"
1071
+ },
1072
+ created_at: {
1073
+ label: "Creado el"
1074
+ },
1075
+ last_used_at: {
1076
+ label: "\xDAltimo uso el",
1077
+ help: "Lo registra resolveToken; el panel lo usa para resaltar los enlaces activos"
1078
+ },
1079
+ use_count: {
1080
+ label: "N\xFAmero de usos",
1081
+ help: "Lo incrementa resolveToken en cada resoluci\xF3n correcta"
1082
+ }
1083
+ },
1084
+ _views: {
1085
+ active_links: {
1086
+ label: "Activos"
1087
+ },
1088
+ by_me: {
1089
+ label: "Creados por m\xED"
1090
+ },
1091
+ revoked: {
1092
+ label: "Revocados"
1093
+ },
1094
+ all_links: {
1095
+ label: "Todos"
1096
+ }
1097
+ }
1098
+ }
1099
+ };
1100
+ }
1101
+ });
1102
+
1103
+ // src/translations/index.ts
1104
+ var translations_exports = {};
1105
+ __export(translations_exports, {
1106
+ SharingTranslations: () => SharingTranslations
1107
+ });
1108
+ var SharingTranslations;
1109
+ var init_translations = __esm({
1110
+ "src/translations/index.ts"() {
1111
+ "use strict";
1112
+ init_en_objects_generated();
1113
+ init_zh_CN_objects_generated();
1114
+ init_ja_JP_objects_generated();
1115
+ init_es_ES_objects_generated();
1116
+ SharingTranslations = {
1117
+ en: { objects: enObjects },
1118
+ "zh-CN": { objects: zhCNObjects },
1119
+ "ja-JP": { objects: jaJPObjects },
1120
+ "es-ES": { objects: esESObjects }
1121
+ };
1122
+ }
1123
+ });
1124
+
1125
+ // src/objects/sys-record-share.object.ts
1126
+ import { ObjectSchema, Field } from "@objectstack/spec/data";
1127
+ var SysRecordShare = ObjectSchema.create({
1128
+ name: "sys_record_share",
1129
+ label: "Record Share",
1130
+ pluralLabel: "Record Shares",
1131
+ icon: "share",
1132
+ isSystem: true,
1133
+ managedBy: "system",
1134
+ description: "Per-record sharing grant \u2014 extends OWD with explicit access",
1135
+ titleFormat: "{object_name}/{record_id} \u2192 {recipient_id} ({access_level})",
1136
+ compactLayout: ["object_name", "record_id", "recipient_id", "access_level", "source"],
1137
+ listViews: {
1138
+ granted_to_me: {
1139
+ type: "grid",
1140
+ name: "granted_to_me",
1141
+ label: "Granted to Me",
1142
+ data: { provider: "object", object: "sys_record_share" },
1143
+ columns: ["object_name", "record_id", "access_level", "source", "granted_by", "created_at"],
1144
+ filter: [
1145
+ { field: "recipient_type", operator: "equals", value: "user" },
1146
+ { field: "recipient_id", operator: "equals", value: "{current_user_id}" }
1147
+ ],
1148
+ sort: [{ field: "created_at", order: "desc" }],
1149
+ pagination: { pageSize: 50 }
1150
+ },
1151
+ granted_by_me: {
1152
+ type: "grid",
1153
+ name: "granted_by_me",
1154
+ label: "Granted by Me",
1155
+ data: { provider: "object", object: "sys_record_share" },
1156
+ columns: ["object_name", "record_id", "recipient_id", "access_level", "source", "created_at"],
1157
+ filter: [
1158
+ { field: "granted_by", operator: "equals", value: "{current_user_id}" }
1159
+ ],
1160
+ sort: [{ field: "created_at", order: "desc" }],
1161
+ pagination: { pageSize: 50 }
1162
+ },
1163
+ by_object: {
1164
+ type: "grid",
1165
+ name: "by_object",
1166
+ label: "By Object",
1167
+ data: { provider: "object", object: "sys_record_share" },
1168
+ columns: ["object_name", "record_id", "recipient_id", "access_level", "source", "created_at"],
1169
+ sort: [{ field: "object_name", order: "asc" }, { field: "created_at", order: "desc" }],
1170
+ grouping: { fields: [{ field: "object_name", order: "asc", collapsed: false }] },
1171
+ pagination: { pageSize: 100 }
1172
+ },
1173
+ manual_grants: {
1174
+ type: "grid",
1175
+ name: "manual_grants",
1176
+ label: "Manual Grants",
1177
+ data: { provider: "object", object: "sys_record_share" },
1178
+ columns: ["object_name", "record_id", "recipient_id", "access_level", "granted_by", "reason", "created_at"],
1179
+ filter: [{ field: "source", operator: "equals", value: "manual" }],
1180
+ sort: [{ field: "created_at", order: "desc" }],
1181
+ pagination: { pageSize: 50 }
1182
+ },
1183
+ rule_grants: {
1184
+ type: "grid",
1185
+ name: "rule_grants",
1186
+ label: "Rule Grants",
1187
+ data: { provider: "object", object: "sys_record_share" },
1188
+ columns: ["object_name", "record_id", "recipient_id", "access_level", "source_id", "created_at"],
1189
+ filter: [{ field: "source", operator: "in", value: ["rule", "team", "inherited"] }],
1190
+ sort: [{ field: "source_id", order: "asc" }, { field: "created_at", order: "desc" }],
1191
+ pagination: { pageSize: 50 }
1192
+ },
1193
+ all_shares: {
1194
+ type: "grid",
1195
+ name: "all_shares",
1196
+ label: "All",
1197
+ data: { provider: "object", object: "sys_record_share" },
1198
+ columns: ["object_name", "record_id", "recipient_type", "recipient_id", "access_level", "source", "created_at"],
1199
+ sort: [{ field: "created_at", order: "desc" }],
1200
+ pagination: { pageSize: 100 }
1201
+ }
1202
+ },
1203
+ fields: {
1204
+ id: Field.text({
1205
+ label: "Share ID",
1206
+ required: true,
1207
+ readonly: true,
1208
+ group: "System"
1209
+ }),
1210
+ // ── Target (which record is being shared) ────────────────────
1211
+ object_name: Field.text({
1212
+ label: "Object",
1213
+ required: true,
1214
+ maxLength: 100,
1215
+ description: "Short object name of the shared record",
1216
+ group: "Target"
1217
+ }),
1218
+ record_id: Field.text({
1219
+ label: "Record",
1220
+ required: true,
1221
+ maxLength: 100,
1222
+ description: "Primary key of the shared record within object_name",
1223
+ group: "Target"
1224
+ }),
1225
+ // ── Recipient (who receives access) ──────────────────────────
1226
+ recipient_type: Field.select(
1227
+ ["user", "group", "role", "role_and_subordinates", "guest"],
1228
+ {
1229
+ label: "Recipient Type",
1230
+ required: true,
1231
+ defaultValue: "user",
1232
+ description: "Kind of principal that holds the grant",
1233
+ group: "Recipient"
1234
+ }
1235
+ ),
1236
+ recipient_id: Field.text({
1237
+ label: "Recipient",
1238
+ required: true,
1239
+ maxLength: 100,
1240
+ description: "ID of the user/group/role that receives access",
1241
+ group: "Recipient"
1242
+ }),
1243
+ access_level: Field.select(
1244
+ ["read", "edit", "full"],
1245
+ {
1246
+ label: "Access Level",
1247
+ required: true,
1248
+ defaultValue: "read",
1249
+ description: "What the recipient can do \u2014 read | edit | full (transfer/share/delete)",
1250
+ group: "Recipient"
1251
+ }
1252
+ ),
1253
+ // ── Provenance ───────────────────────────────────────────────
1254
+ source: Field.select(
1255
+ ["manual", "rule", "team", "inherited"],
1256
+ {
1257
+ label: "Source",
1258
+ required: true,
1259
+ defaultValue: "manual",
1260
+ description: "Why this grant exists \u2014 used by the rule evaluator to reconcile",
1261
+ group: "Provenance"
1262
+ }
1263
+ ),
1264
+ source_id: Field.text({
1265
+ label: "Source ID",
1266
+ required: false,
1267
+ maxLength: 200,
1268
+ description: "Rule name / team id when source != manual",
1269
+ group: "Provenance"
1270
+ }),
1271
+ granted_by: Field.lookup("sys_user", {
1272
+ label: "Granted By",
1273
+ required: false,
1274
+ description: "User that created the grant (manual only)",
1275
+ group: "Provenance"
1276
+ }),
1277
+ reason: Field.text({
1278
+ label: "Reason",
1279
+ required: false,
1280
+ maxLength: 500,
1281
+ description: "Optional free-text explanation surfaced to the recipient",
1282
+ group: "Provenance"
1283
+ }),
1284
+ // ── Lifecycle ────────────────────────────────────────────────
1285
+ created_at: Field.datetime({
1286
+ label: "Created At",
1287
+ required: true,
1288
+ defaultValue: "NOW()",
1289
+ readonly: true,
1290
+ group: "System"
1291
+ }),
1292
+ updated_at: Field.datetime({
1293
+ label: "Updated At",
1294
+ required: false,
1295
+ group: "System"
1296
+ })
1297
+ },
1298
+ indexes: [
1299
+ // Hot path: "all records visible to user U on object O" — the
1300
+ // middleware reads (object_name, recipient_type, recipient_id) to
1301
+ // build the `id IN (...)` predicate on every find.
1302
+ { fields: ["object_name", "recipient_type", "recipient_id"] },
1303
+ // "all grants on this record" — used by the share-management UI
1304
+ // and by canEdit() to look up explicit grants.
1305
+ { fields: ["object_name", "record_id"] },
1306
+ // Reconciliation key for rule-driven shares.
1307
+ { fields: ["source", "source_id"] }
1308
+ ]
1309
+ });
1310
+
1311
+ // src/objects/sys-sharing-rule.object.ts
1312
+ import { ObjectSchema as ObjectSchema2, Field as Field2 } from "@objectstack/spec/data";
1313
+ var SysSharingRule = ObjectSchema2.create({
1314
+ name: "sys_sharing_rule",
1315
+ label: "Sharing Rule",
1316
+ pluralLabel: "Sharing Rules",
1317
+ icon: "shield-check",
1318
+ isSystem: true,
1319
+ managedBy: "config",
1320
+ // Sharing rules can now be authored visually via the Studio criteria
1321
+ // builder (apps/studio/src/components/SharingCriteriaBuilder.tsx).
1322
+ // We still recommend `defineSharingRule({...})` for repo-controlled
1323
+ // baselines, but admins can safely create/edit/delete from the UI.
1324
+ userActions: { create: true, edit: true, delete: true, import: false },
1325
+ description: "Declarative sharing rule that auto-materialises sys_record_share grants. Authored via defineSharingRule() in code or the Studio criteria builder.",
1326
+ displayNameField: "name",
1327
+ titleFormat: "{label}",
1328
+ compactLayout: ["name", "object_name", "recipient_type", "recipient_id", "access_level", "active"],
1329
+ listViews: {
1330
+ active: {
1331
+ type: "grid",
1332
+ name: "active",
1333
+ label: "Active",
1334
+ data: { provider: "object", object: "sys_sharing_rule" },
1335
+ columns: ["label", "object_name", "recipient_type", "recipient_id", "access_level", "updated_at"],
1336
+ filter: [{ field: "active", operator: "equals", value: true }],
1337
+ sort: [{ field: "object_name", order: "asc" }, { field: "label", order: "asc" }],
1338
+ pagination: { pageSize: 50 }
1339
+ },
1340
+ inactive: {
1341
+ type: "grid",
1342
+ name: "inactive",
1343
+ label: "Inactive",
1344
+ data: { provider: "object", object: "sys_sharing_rule" },
1345
+ columns: ["label", "object_name", "recipient_type", "recipient_id", "updated_at"],
1346
+ filter: [{ field: "active", operator: "equals", value: false }],
1347
+ sort: [{ field: "label", order: "asc" }],
1348
+ pagination: { pageSize: 50 }
1349
+ },
1350
+ by_object: {
1351
+ type: "grid",
1352
+ name: "by_object",
1353
+ label: "By Object",
1354
+ data: { provider: "object", object: "sys_sharing_rule" },
1355
+ columns: ["object_name", "label", "recipient_type", "access_level", "active"],
1356
+ sort: [{ field: "object_name", order: "asc" }, { field: "label", order: "asc" }],
1357
+ grouping: { fields: [{ field: "object_name", order: "asc", collapsed: false }] },
1358
+ pagination: { pageSize: 100 }
1359
+ },
1360
+ all_rules: {
1361
+ type: "grid",
1362
+ name: "all_rules",
1363
+ label: "All",
1364
+ data: { provider: "object", object: "sys_sharing_rule" },
1365
+ columns: ["label", "object_name", "recipient_type", "recipient_id", "access_level", "active", "updated_at"],
1366
+ sort: [{ field: "label", order: "asc" }],
1367
+ pagination: { pageSize: 50 }
1368
+ }
1369
+ },
1370
+ fields: {
1371
+ id: Field2.text({ label: "Rule ID", required: true, readonly: true, group: "System" }),
1372
+ organization_id: Field2.lookup("sys_organization", {
1373
+ label: "Organization",
1374
+ required: false,
1375
+ group: "System",
1376
+ description: "Tenant that owns this rule; null = global"
1377
+ }),
1378
+ name: Field2.text({
1379
+ label: "Name",
1380
+ required: true,
1381
+ maxLength: 100,
1382
+ description: "Unique snake_case rule name",
1383
+ group: "Identity"
1384
+ }),
1385
+ label: Field2.text({
1386
+ label: "Display Label",
1387
+ required: true,
1388
+ maxLength: 200,
1389
+ group: "Identity"
1390
+ }),
1391
+ description: Field2.textarea({
1392
+ label: "Description",
1393
+ required: false,
1394
+ group: "Identity"
1395
+ }),
1396
+ object_name: Field2.text({
1397
+ label: "Object",
1398
+ required: true,
1399
+ maxLength: 100,
1400
+ description: "Short object name (e.g. opportunity, account)",
1401
+ group: "Target"
1402
+ }),
1403
+ criteria_json: Field2.textarea({
1404
+ label: "Criteria (FilterCondition JSON)",
1405
+ required: false,
1406
+ description: "JSON FilterCondition matched against records of object_name. Empty = match all.",
1407
+ group: "Target"
1408
+ }),
1409
+ recipient_type: Field2.select(
1410
+ ["user", "team", "department", "role", "queue"],
1411
+ {
1412
+ label: "Recipient Type",
1413
+ required: true,
1414
+ defaultValue: "department",
1415
+ description: "Kind of principal that receives access \u2014 expanded to user grants at evaluation time. `department` walks the parent_department_id tree; `team` is flat (better-auth).",
1416
+ group: "Recipient"
1417
+ }
1418
+ ),
1419
+ recipient_id: Field2.text({
1420
+ label: "Recipient",
1421
+ required: true,
1422
+ maxLength: 200,
1423
+ description: "department id / team id / role name / queue name / user id depending on recipient_type",
1424
+ group: "Recipient"
1425
+ }),
1426
+ access_level: Field2.select(
1427
+ ["read", "edit", "full"],
1428
+ {
1429
+ label: "Access Level",
1430
+ required: true,
1431
+ defaultValue: "read",
1432
+ group: "Recipient"
1433
+ }
1434
+ ),
1435
+ active: Field2.boolean({
1436
+ label: "Active",
1437
+ required: false,
1438
+ defaultValue: true,
1439
+ description: "Only active rules participate in lifecycle evaluation",
1440
+ group: "Lifecycle"
1441
+ }),
1442
+ created_at: Field2.datetime({
1443
+ label: "Created At",
1444
+ required: true,
1445
+ defaultValue: "NOW()",
1446
+ readonly: true,
1447
+ group: "System"
1448
+ }),
1449
+ updated_at: Field2.datetime({
1450
+ label: "Updated At",
1451
+ required: false,
1452
+ group: "System"
1453
+ })
1454
+ },
1455
+ indexes: [
1456
+ { fields: ["object_name", "active"] },
1457
+ { fields: ["name"], unique: true },
1458
+ { fields: ["organization_id"] }
1459
+ ]
1460
+ });
1461
+
1462
+ // src/objects/sys-share-link.object.ts
1463
+ import { ObjectSchema as ObjectSchema3, Field as Field3 } from "@objectstack/spec/data";
1464
+ var SysShareLink = ObjectSchema3.create({
1465
+ name: "sys_share_link",
1466
+ label: "Share Link",
1467
+ pluralLabel: "Share Links",
1468
+ icon: "link-2",
1469
+ isSystem: true,
1470
+ managedBy: "system",
1471
+ description: "Opaque capability token granting access to a single record. Notion/Figma-style public link sharing.",
1472
+ titleFormat: "{object_name}/{record_id} ({permission})",
1473
+ compactLayout: ["object_name", "record_id", "permission", "audience", "expires_at", "revoked_at"],
1474
+ listViews: {
1475
+ active_links: {
1476
+ type: "grid",
1477
+ name: "active_links",
1478
+ label: "Active",
1479
+ data: { provider: "object", object: "sys_share_link" },
1480
+ columns: ["object_name", "record_id", "permission", "audience", "expires_at", "use_count", "last_used_at"],
1481
+ filter: [{ field: "revoked_at", operator: "isNull" }],
1482
+ sort: [{ field: "created_at", order: "desc" }],
1483
+ pagination: { pageSize: 100 }
1484
+ },
1485
+ by_me: {
1486
+ type: "grid",
1487
+ name: "by_me",
1488
+ label: "Created by Me",
1489
+ data: { provider: "object", object: "sys_share_link" },
1490
+ columns: ["object_name", "record_id", "permission", "audience", "expires_at", "revoked_at"],
1491
+ filter: [{ field: "created_by", operator: "equals", value: "{current_user_id}" }],
1492
+ sort: [{ field: "created_at", order: "desc" }],
1493
+ pagination: { pageSize: 100 }
1494
+ },
1495
+ revoked: {
1496
+ type: "grid",
1497
+ name: "revoked",
1498
+ label: "Revoked",
1499
+ data: { provider: "object", object: "sys_share_link" },
1500
+ columns: ["object_name", "record_id", "revoked_at", "created_by"],
1501
+ filter: [{ field: "revoked_at", operator: "isNotNull" }],
1502
+ sort: [{ field: "revoked_at", order: "desc" }],
1503
+ pagination: { pageSize: 50 }
1504
+ },
1505
+ all_links: {
1506
+ type: "grid",
1507
+ name: "all_links",
1508
+ label: "All",
1509
+ data: { provider: "object", object: "sys_share_link" },
1510
+ columns: ["object_name", "record_id", "permission", "audience", "expires_at", "revoked_at", "created_at"],
1511
+ sort: [{ field: "created_at", order: "desc" }],
1512
+ pagination: { pageSize: 200 }
1513
+ }
1514
+ },
1515
+ fields: {
1516
+ id: Field3.text({
1517
+ label: "Link ID",
1518
+ required: true,
1519
+ readonly: true,
1520
+ group: "System"
1521
+ }),
1522
+ // ── Token (the secret) ───────────────────────────────────────
1523
+ token: Field3.text({
1524
+ label: "Token",
1525
+ required: true,
1526
+ maxLength: 64,
1527
+ description: "Opaque URL-safe random token (\u2265 22 chars). The only secret in this row.",
1528
+ group: "Token"
1529
+ }),
1530
+ // ── Target ───────────────────────────────────────────────────
1531
+ object_name: Field3.text({
1532
+ label: "Object",
1533
+ required: true,
1534
+ maxLength: 100,
1535
+ description: "Short object name of the shared record (e.g. ai_conversation, contracts_contract)",
1536
+ group: "Target"
1537
+ }),
1538
+ record_id: Field3.text({
1539
+ label: "Record",
1540
+ required: true,
1541
+ maxLength: 100,
1542
+ description: "Primary key of the shared record within object_name",
1543
+ group: "Target"
1544
+ }),
1545
+ // ── Access Policy ────────────────────────────────────────────
1546
+ permission: Field3.select(
1547
+ [
1548
+ { label: "View", value: "view" },
1549
+ { label: "Comment", value: "comment" },
1550
+ { label: "Edit", value: "edit" }
1551
+ ],
1552
+ {
1553
+ label: "Permission",
1554
+ required: true,
1555
+ defaultValue: "view",
1556
+ description: "What the link holder can do with the record",
1557
+ group: "Access Policy"
1558
+ }
1559
+ ),
1560
+ audience: Field3.select(
1561
+ [
1562
+ { label: "Public (indexable)", value: "public" },
1563
+ { label: "Anyone with the link", value: "link_only" },
1564
+ { label: "Signed-in users", value: "signed_in" },
1565
+ { label: "Specific emails", value: "email" }
1566
+ ],
1567
+ {
1568
+ label: "Audience",
1569
+ required: true,
1570
+ defaultValue: "link_only",
1571
+ description: "Gating layer applied on top of the token check",
1572
+ group: "Access Policy"
1573
+ }
1574
+ ),
1575
+ expires_at: Field3.datetime({
1576
+ label: "Expires At",
1577
+ description: "When set, resolveToken returns null after this timestamp",
1578
+ group: "Access Policy"
1579
+ }),
1580
+ email_allowlist: Field3.json({
1581
+ label: "Email Allowlist",
1582
+ description: "Lowercased addresses checked when audience=email",
1583
+ group: "Access Policy"
1584
+ }),
1585
+ password_hash: Field3.text({
1586
+ label: "Password Hash",
1587
+ maxLength: 256,
1588
+ description: "Argon2/bcrypt hash. When set, the UI prompts for a password before rendering.",
1589
+ group: "Access Policy"
1590
+ }),
1591
+ redact_fields: Field3.json({
1592
+ label: "Per-Link Redactions",
1593
+ description: "Extra fields stripped from the response, on top of the object-default set",
1594
+ group: "Access Policy"
1595
+ }),
1596
+ label: Field3.text({
1597
+ label: "Label",
1598
+ maxLength: 200,
1599
+ description: 'Free-text shown in the share dialog (e.g. "ACME Q3 contract")',
1600
+ group: "Metadata"
1601
+ }),
1602
+ // ── Lifecycle ────────────────────────────────────────────────
1603
+ revoked_at: Field3.datetime({
1604
+ label: "Revoked At",
1605
+ readonly: true,
1606
+ description: "When set, the link is permanently disabled",
1607
+ group: "Lifecycle"
1608
+ }),
1609
+ created_by: Field3.lookup("sys_user", {
1610
+ label: "Created By",
1611
+ readonly: true,
1612
+ description: "Issuer of the link",
1613
+ group: "Lifecycle"
1614
+ }),
1615
+ created_at: Field3.datetime({
1616
+ label: "Created At",
1617
+ required: true,
1618
+ defaultValue: "NOW()",
1619
+ readonly: true,
1620
+ group: "Lifecycle"
1621
+ }),
1622
+ last_used_at: Field3.datetime({
1623
+ label: "Last Used At",
1624
+ readonly: true,
1625
+ description: "Stamped by resolveToken; used by the dashboard to highlight active links",
1626
+ group: "Lifecycle"
1627
+ }),
1628
+ use_count: Field3.number({
1629
+ label: "Use Count",
1630
+ defaultValue: 0,
1631
+ readonly: true,
1632
+ description: "Incremented by resolveToken on every successful resolution",
1633
+ group: "Lifecycle"
1634
+ })
1635
+ },
1636
+ indexes: [
1637
+ // Hot path: resolveToken — one row lookup per public request.
1638
+ { fields: ["token"], unique: true },
1639
+ // Management UI: "all links for this record".
1640
+ { fields: ["object_name", "record_id"] },
1641
+ // "Active links I issued".
1642
+ { fields: ["created_by", "revoked_at"] },
1643
+ // Reaper for expired rows (background sweep).
1644
+ { fields: ["expires_at"] }
1645
+ ],
1646
+ enable: {
1647
+ trackHistory: false,
1648
+ searchable: false,
1649
+ apiEnabled: true,
1650
+ // The /api/v1/share-links endpoints are the authoritative surface;
1651
+ // the generic data API is exposed read-only for the admin grid.
1652
+ apiMethods: ["get", "list"],
1653
+ trash: false,
1654
+ mru: false,
1655
+ clone: false
1656
+ }
1657
+ });
1658
+
1
1659
  // src/index.ts
2
- import { SysRecordShare as SysRecordShare2, SysSharingRule as SysSharingRule2, SysShareLink as SysShareLink2 } from "@objectstack/platform-objects/security";
3
1660
  import { SysDepartment as SysDepartment2, SysDepartmentMember as SysDepartmentMember2 } from "@objectstack/platform-objects/identity";
4
1661
 
5
1662
  // src/sharing-service.ts
@@ -1217,7 +2874,6 @@ function unbindAllRuleHooks(engine) {
1217
2874
  }
1218
2875
 
1219
2876
  // src/sharing-plugin.ts
1220
- import { SysRecordShare, SysSharingRule, SysShareLink } from "@objectstack/platform-objects/security";
1221
2877
  import { SysDepartment, SysDepartmentMember } from "@objectstack/platform-objects/identity";
1222
2878
  var SharingServicePlugin = class {
1223
2879
  constructor(options = {}) {
@@ -1236,8 +2892,36 @@ var SharingServicePlugin = class {
1236
2892
  scope: "system",
1237
2893
  defaultDatasource: "cloud",
1238
2894
  namespace: "sys",
1239
- objects: [SysRecordShare, SysSharingRule, SysDepartment, SysDepartmentMember, SysShareLink]
2895
+ objects: [SysRecordShare, SysSharingRule, SysDepartment, SysDepartmentMember, SysShareLink],
2896
+ // ADR-0029 D7 — contribute the sharing entries into the Setup app's
2897
+ // `group_access_control` slot (priority 200 so they sit after plugin-
2898
+ // security's Roles / Permission Sets). This plugin owns these objects (K2).
2899
+ navigationContributions: [
2900
+ {
2901
+ app: "setup",
2902
+ group: "group_access_control",
2903
+ priority: 200,
2904
+ items: [
2905
+ { id: "nav_sharing_rules", type: "object", label: "Sharing Rules", objectName: "sys_sharing_rule", icon: "share-2", requiresObject: "sys_sharing_rule", requiredPermissions: ["manage_platform_settings"] },
2906
+ { id: "nav_record_shares", type: "object", label: "Record Shares", objectName: "sys_record_share", icon: "link", requiresObject: "sys_record_share", requiredPermissions: ["manage_platform_settings"] }
2907
+ ]
2908
+ }
2909
+ ]
1240
2910
  });
2911
+ if (typeof ctx.hook === "function") {
2912
+ ctx.hook("kernel:ready", async () => {
2913
+ try {
2914
+ const i18n = ctx.getService("i18n");
2915
+ if (i18n && typeof i18n.loadTranslations === "function") {
2916
+ const { SharingTranslations: SharingTranslations2 } = await Promise.resolve().then(() => (init_translations(), translations_exports));
2917
+ for (const [locale, data] of Object.entries(SharingTranslations2)) {
2918
+ i18n.loadTranslations(locale, data);
2919
+ }
2920
+ }
2921
+ } catch {
2922
+ }
2923
+ });
2924
+ }
1241
2925
  ctx.logger.info("SharingServicePlugin: schema registered");
1242
2926
  }
1243
2927
  async start(ctx) {
@@ -1388,9 +3072,9 @@ export {
1388
3072
  SharingServicePlugin,
1389
3073
  SysDepartment2 as SysDepartment,
1390
3074
  SysDepartmentMember2 as SysDepartmentMember,
1391
- SysRecordShare2 as SysRecordShare,
1392
- SysShareLink2 as SysShareLink,
1393
- SysSharingRule2 as SysSharingRule,
3075
+ SysRecordShare,
3076
+ SysShareLink,
3077
+ SysSharingRule,
1394
3078
  TeamGraphService,
1395
3079
  bindRuleHooks,
1396
3080
  buildSharingMiddleware,