@astrale-domains/shell 0.1.7 → 0.1.8

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 (41) hide show
  1. package/dist/domain.d.ts +24 -2
  2. package/dist/domain.js +13 -1
  3. package/dist/functions/authority/roles.js +45 -30
  4. package/dist/functions/group/assign-member.js +6 -3
  5. package/dist/functions/group/change-group-membership.js +86 -39
  6. package/dist/functions/group/group-membership-errors.js +1 -1
  7. package/dist/functions/group/index.js +2 -2
  8. package/dist/functions/group/legacy/index.js +1 -1
  9. package/dist/functions/group/legacy/membership.js +21 -17
  10. package/dist/functions/group/membership-laws.js +5 -8
  11. package/dist/functions/group/unassign-member.js +6 -3
  12. package/dist/functions/invitation/send-invitation.js +57 -7
  13. package/dist/mutations/group/index.js +1 -1
  14. package/dist/mutations/group/set-group-membership.js +45 -13
  15. package/dist/mutations/invitation/write-invitation.js +19 -2
  16. package/dist/queries/composition/index.js +1 -1
  17. package/dist/queries/composition/read-role-nodes.js +48 -13
  18. package/dist/queries/group/index.js +1 -0
  19. package/dist/queries/group/legacy/index.js +1 -0
  20. package/dist/queries/group/legacy/read-members-of-group.js +27 -0
  21. package/dist/queries/group/read-group-members.js +73 -0
  22. package/dist/queries/invitation/index.js +1 -1
  23. package/dist/queries/invitation/read-invitation.js +33 -8
  24. package/dist/queries/role/index.js +1 -1
  25. package/dist/queries/role/read-role-node.js +8 -0
  26. package/dist/runtime.d.ts +2172 -64
  27. package/dist/runtime.js +3 -1
  28. package/dist/schema/modules/application/legacy/functions/list-entrypoints.js +5 -4
  29. package/dist/schema/modules/group/classes/group-profile-link.d.ts +1 -1
  30. package/dist/schema/modules/group/classes/group.d.ts +14 -0
  31. package/dist/schema/modules/group/classes/group.js +12 -2
  32. package/dist/schema/modules/group/functions/assign-members.js +17 -0
  33. package/dist/schema/modules/group/functions/index.js +2 -0
  34. package/dist/schema/modules/group/functions/unassign-members.js +17 -0
  35. package/dist/schema/modules/group/types/group-membership-input.js +8 -0
  36. package/dist/schema/modules/group/types/index.js +1 -1
  37. package/dist/schema/modules/invitation/classes/invitation.js +4 -2
  38. package/dist/schema/modules/role/core/roles.d.ts +2 -0
  39. package/dist/schema/modules/role/core/roles.js +1 -0
  40. package/dist/schema/schema.d.ts +95 -8
  41. package/package.json +2 -2
package/dist/runtime.js CHANGED
@@ -2,7 +2,7 @@ import { defineRuntime } from '@astrale-os/sdk/runtime';
2
2
  // L-SHELL-11: the legacy handler of listEntrypoints, through its owner's facade.
3
3
  import { legacyListEntrypoints } from './functions/application/index.js';
4
4
  import { disconnectDirectory } from './functions/directory/index.js';
5
- import { assignMember, create as createGroup, deprovision as deprovisionGroup, provision as provisionGroup, remove as deleteGroup, unassignMember, update as updateGroup, } from './functions/group/index.js';
5
+ import { assignMember, assignMembers, create as createGroup, deprovision as deprovisionGroup, provision as provisionGroup, remove as deleteGroup, unassignMember, unassignMembers, update as updateGroup, } from './functions/group/index.js';
6
6
  import { accept as acceptInvitation, cancel as cancelInvitation, resend as resendInvitation, send as sendInvitation, } from './functions/invitation/index.js';
7
7
  import { link, rename, unlink } from './functions/namespace/index.js';
8
8
  import { create as createUser, deactivate, deprovision as deprovisionUser, invite,
@@ -30,6 +30,8 @@ const functions = [
30
30
  deleteGroup,
31
31
  assignMember,
32
32
  unassignMember,
33
+ assignMembers,
34
+ unassignMembers,
33
35
  provisionGroup,
34
36
  deprovisionGroup,
35
37
  disconnectDirectory,
@@ -1,7 +1,7 @@
1
1
  import { func } from '@astrale-os/sdk/schema';
2
2
  import { z } from 'zod';
3
3
  import { legacyApplicationsGroup } from '../../../group/legacy/index.js';
4
- import { profileRoles } from '../../../role/index.js';
4
+ import { atomicRoles } from '../../../role/index.js';
5
5
  import { hasRole } from '../../../../policies/index.js';
6
6
  import { legacyEntrypointEntry } from '../entrypoint-entry.js';
7
7
  /**
@@ -9,13 +9,14 @@ import { legacyEntrypointEntry } from '../entrypoint-entry.js';
9
9
  * Shell's own authority (L-SHELL-11). Replaced by the visitor's own Query (V2). Removal: Shell major
10
10
  * (delivery step 5) after 1Pact step 4.
11
11
  *
12
- * Its legacy `can_use` holders keep it (AM5): Administrators and Members through `workspace.member`,
13
- * which the release makes them hold (AM3), and the Applications group itself.
12
+ * Whoever opens the OS view lists its applications: holders of `os.viewer`, which `workspace.member`
13
+ * holds through the release, so its legacy `can_use` holders keep it (AM5): Administrators and
14
+ * Members through their profiles (AM3), and the Applications group itself.
14
15
  */
15
16
  export const legacyListEntrypoints = func({
16
17
  description: 'List the entrypoint View and name of every installed Domain that declares one.',
17
18
  auth: 'authorized',
18
19
  input: z.strictObject({}),
19
20
  output: z.object({ entrypoints: z.array(legacyEntrypointEntry) }),
20
- policy: ({ anyOf, check, ref }) => anyOf(check(hasRole, ref(profileRoles['workspace.member'])), check(hasRole, ref(legacyApplicationsGroup))),
21
+ policy: ({ anyOf, check, ref }) => anyOf(check(hasRole, ref(atomicRoles['os.viewer'])), check(hasRole, ref(legacyApplicationsGroup))),
21
22
  });
@@ -14,7 +14,7 @@ export declare const group_profile: import("@astrale-os/sdk/schema").DirectedEdg
14
14
  readonly abstract: false;
15
15
  readonly depth: 1;
16
16
  readonly properties: "attributes" | "description" | "directory" | "externalId" | "frozen" | "icon" | "iss" | "name" | "sub";
17
- readonly methods: "assignMember" | "create" | "delete" | "deprovision" | "provision" | "unassignMember" | "update";
17
+ readonly methods: "assignMember" | "assignMembers" | "create" | "delete" | "deprovision" | "provision" | "unassignMember" | "unassignMembers" | "update";
18
18
  }[];
19
19
  readonly outgoing: "0..1";
20
20
  };
@@ -74,6 +74,20 @@ export declare const Group: import("@astrale-os/sdk/schema").AuthoredNodeClass<{
74
74
  readonly mode: 'value';
75
75
  readonly value: Record<string, never>;
76
76
  }, "authorized", true, false, undefined, undefined>>;
77
+ readonly assignMembers: import("@astrale-os/sdk/schema").Method<import("@astrale-os/sdk/schema").CallableProjection<{
78
+ members: string[];
79
+ group: string;
80
+ }, {
81
+ readonly mode: 'value';
82
+ readonly value: Record<string, never>;
83
+ }, "authorized", true, false, undefined, undefined>>;
84
+ readonly unassignMembers: import("@astrale-os/sdk/schema").Method<import("@astrale-os/sdk/schema").CallableProjection<{
85
+ members: string[];
86
+ group: string;
87
+ }, {
88
+ readonly mode: 'value';
89
+ readonly value: Record<string, never>;
90
+ }, "authorized", true, false, undefined, undefined>>;
77
91
  readonly provision: import("@astrale-os/sdk/schema").Method<import("@astrale-os/sdk/schema").CallableProjection<{
78
92
  directory: string;
79
93
  externalId: string;
@@ -1,7 +1,7 @@
1
1
  import { classIcon, nodeClass, property } from '@astrale-os/sdk/schema';
2
2
  import { UsersRound } from '@astrale-os/sdk/schema/icons';
3
3
  import { attributesProperty } from '../../../types/index.js';
4
- import { assignMember, create, deprovision, provision, remove, unassignMember, update, } from '../functions/index.js';
4
+ import { assignMember, assignMembers, create, deprovision, provision, remove, unassignMember, unassignMembers, update, } from '../functions/index.js';
5
5
  // Seams L-SHELL-1, L-SHELL-2: the relaxations existing groups and extending Domains still need.
6
6
  import { LEGACY_GROUP_EXTENDS, LEGACY_GROUP_INHERITANCE, LEGACY_GROUP_READ, } from '../legacy/index.js';
7
7
  const text = { type: 'string', minLength: 1, maxLength: 200 };
@@ -28,5 +28,15 @@ export const Group = nodeClass({
28
28
  read: LEGACY_GROUP_READ,
29
29
  traverse: true,
30
30
  },
31
- methods: { create, update, delete: remove, assignMember, unassignMember, provision, deprovision },
31
+ methods: {
32
+ create,
33
+ update,
34
+ delete: remove,
35
+ assignMember,
36
+ unassignMember,
37
+ assignMembers,
38
+ unassignMembers,
39
+ provision,
40
+ deprovision,
41
+ },
32
42
  });
@@ -0,0 +1,17 @@
1
+ import { method } from '@astrale-os/sdk/schema';
2
+ import { z } from 'zod';
3
+ import { atomicRoles } from '../../role/index.js';
4
+ import { hasRole } from '../../../policies/index.js';
5
+ import { legacyMembershipOwnerAdmission } from '../legacy/index.js';
6
+ import { groupMembersInput } from '../types/index.js';
7
+ /** Make several accounts or groups members of this group in one call (G1-G3 checked once). */
8
+ export const assignMembers = method({
9
+ static: true,
10
+ description: 'Make several accounts or groups members of a group.',
11
+ auth: 'authorized',
12
+ input: groupMembersInput,
13
+ output: z.object({}),
14
+ policy: (context) => context.anyOf(context.check(hasRole, context.ref(atomicRoles['group.writer'])), context.check(hasRole, context.ref(atomicRoles['directory.provisioner'])),
15
+ // Seam L-SHELL-9: a Domain that extends Group manages the members of its own groups.
16
+ legacyMembershipOwnerAdmission(context, context.input.group)),
17
+ });
@@ -3,5 +3,7 @@ export { update } from './update-group.js';
3
3
  export { remove } from './delete-group.js';
4
4
  export { assignMember } from './assign-member.js';
5
5
  export { unassignMember } from './unassign-member.js';
6
+ export { assignMembers } from './assign-members.js';
7
+ export { unassignMembers } from './unassign-members.js';
6
8
  export { provision } from './provision-group.js';
7
9
  export { deprovision } from './deprovision-group.js';
@@ -0,0 +1,17 @@
1
+ import { method } from '@astrale-os/sdk/schema';
2
+ import { z } from 'zod';
3
+ import { atomicRoles } from '../../role/index.js';
4
+ import { hasRole } from '../../../policies/index.js';
5
+ import { legacyMembershipOwnerAdmission } from '../legacy/index.js';
6
+ import { groupMembersInput } from '../types/index.js';
7
+ /** Withdraw several direct members from a group in one call (G2, G3 checked once). */
8
+ export const unassignMembers = method({
9
+ static: true,
10
+ description: 'Withdraw several accounts or groups from a group.',
11
+ auth: 'authorized',
12
+ input: groupMembersInput,
13
+ output: z.object({}),
14
+ policy: (context) => context.anyOf(context.check(hasRole, context.ref(atomicRoles['group.writer'])), context.check(hasRole, context.ref(atomicRoles['directory.provisioner'])),
15
+ // Seam L-SHELL-9: a Domain that extends Group manages the members of its own groups.
16
+ legacyMembershipOwnerAdmission(context, context.input.group)),
17
+ });
@@ -6,3 +6,11 @@ export const groupMembershipInput = z.object({
6
6
  member: path(() => User, () => Group),
7
7
  group: path(() => Group),
8
8
  });
9
+ /**
10
+ * Several accounts or groups to add to or withdraw from one group, in one call. A Path is not
11
+ * allowed inside a list, so each member is an exact @NodeId the Action checks.
12
+ */
13
+ export const groupMembersInput = z.object({
14
+ members: z.array(z.string().min(2).max(512)).min(1).max(100),
15
+ group: path(() => Group),
16
+ });
@@ -1,2 +1,2 @@
1
- export { groupMembershipInput } from './group-membership-input.js';
1
+ export { groupMembersInput, groupMembershipInput } from './group-membership-input.js';
2
2
  export { directoryId, externalId, groupDescription, groupIcon, groupName, nodeReference, } from './group.js';
@@ -5,8 +5,8 @@ import { hasRole } from '../../../policies/index.js';
5
5
  import { accept, cancel, resend, send } from '../functions/index.js';
6
6
  import { INVITATION_STATUSES } from '../types/index.js';
7
7
  /**
8
- * One invitation of an account, kept by the durable run of `Invitation.send` that it names. The
9
- * email stays on the account's profile. Only Shell writes it; `user.writer` reads it, so the pending
8
+ * One invitation of an account, kept by the durable run of `Invitation.send` that it names. An
9
+ * account has at most one pending invitation. Only Shell writes it; `user.writer` reads it, so the pending
10
10
  * invitations are one Query on `status`.
11
11
  */
12
12
  export const Invitation = nodeClass({
@@ -21,6 +21,8 @@ export const Invitation = nodeClass({
21
21
  // The durable run that keeps it, and the number of events it has received (resends).
22
22
  execution: property({ type: 'string', minLength: 1, maxLength: 200 }),
23
23
  round: property({ type: 'integer', minimum: 0 }),
24
+ // The email it was sent to, in lower case: a new invitation to the same email resends this one.
25
+ email: property({ type: 'string', minLength: 3, maxLength: 320 }, { required: false }),
24
26
  },
25
27
  policies: {
26
28
  read: ({ check, ref }) => check(hasRole, ref(atomicRoles['user.writer'])),
@@ -19,6 +19,7 @@ export declare const atomicRoles: {
19
19
  readonly 'user-profile.reader': import("@astrale-os/sdk/schema").CoreNode;
20
20
  readonly 'user-profile.self-writer': import("@astrale-os/sdk/schema").CoreNode;
21
21
  readonly 'group-profile.reader': import("@astrale-os/sdk/schema").CoreNode;
22
+ readonly 'os.viewer': import("@astrale-os/sdk/schema").CoreNode;
22
23
  };
23
24
  export declare const shellRoles: {
24
25
  readonly 'workspace.member': import("@astrale-os/sdk/schema").CoreNode;
@@ -31,6 +32,7 @@ export declare const shellRoles: {
31
32
  readonly 'user-profile.reader': import("@astrale-os/sdk/schema").CoreNode;
32
33
  readonly 'user-profile.self-writer': import("@astrale-os/sdk/schema").CoreNode;
33
34
  readonly 'group-profile.reader': import("@astrale-os/sdk/schema").CoreNode;
35
+ readonly 'os.viewer': import("@astrale-os/sdk/schema").CoreNode;
34
36
  };
35
37
  /** The profile a person is given, by its name. */
36
38
  export type ProfileName = 'member' | 'admin';
@@ -25,6 +25,7 @@ export const atomicRoles = {
25
25
  'user-profile.reader': role('user-profile.reader', 'May read the name, email and image of every person.'),
26
26
  'user-profile.self-writer': role('user-profile.self-writer', 'May change its own name and image, never its email.'),
27
27
  'group-profile.reader': role('group-profile.reader', 'May read the name, description and image of every group.'),
28
+ 'os.viewer': role('os.viewer', 'Opens the OS view and lists its applications.'),
28
29
  };
29
30
  export const shellRoles = { ...profileRoles, ...atomicRoles };
30
31
  export const PROFILE_NAMES = ['member', 'admin'];
@@ -322,6 +322,20 @@ declare const classes: {
322
322
  readonly mode: 'value';
323
323
  readonly value: Record<string, never>;
324
324
  }, "authorized", true, false, undefined, undefined>>;
325
+ readonly assignMembers: import("@astrale-os/sdk/schema").Method<import("@astrale-os/sdk/schema").CallableProjection<{
326
+ members: string[];
327
+ group: string;
328
+ }, {
329
+ readonly mode: 'value';
330
+ readonly value: Record<string, never>;
331
+ }, "authorized", true, false, undefined, undefined>>;
332
+ readonly unassignMembers: import("@astrale-os/sdk/schema").Method<import("@astrale-os/sdk/schema").CallableProjection<{
333
+ members: string[];
334
+ group: string;
335
+ }, {
336
+ readonly mode: 'value';
337
+ readonly value: Record<string, never>;
338
+ }, "authorized", true, false, undefined, undefined>>;
325
339
  readonly provision: import("@astrale-os/sdk/schema").Method<import("@astrale-os/sdk/schema").CallableProjection<{
326
340
  directory: string;
327
341
  externalId: string;
@@ -365,7 +379,7 @@ declare const classes: {
365
379
  readonly abstract: false;
366
380
  readonly depth: 1;
367
381
  readonly properties: "attributes" | "description" | "directory" | "externalId" | "frozen" | "icon" | "iss" | "name" | "sub";
368
- readonly methods: "assignMember" | "create" | "delete" | "deprovision" | "provision" | "unassignMember" | "update";
382
+ readonly methods: "assignMember" | "assignMembers" | "create" | "delete" | "deprovision" | "provision" | "unassignMember" | "unassignMembers" | "update";
369
383
  }[];
370
384
  readonly outgoing: "0..1";
371
385
  };
@@ -423,6 +437,13 @@ declare const classes: {
423
437
  readonly description?: string;
424
438
  readonly immutable?: import("@astrale-os/sdk/schema").PropertyImmutability;
425
439
  }>;
440
+ email: import("@astrale-os/sdk/schema").AuthoredProperty<{
441
+ readonly type: "string";
442
+ readonly minLength: 3;
443
+ readonly maxLength: 320;
444
+ }, {
445
+ readonly required: false;
446
+ }>;
426
447
  };
427
448
  readonly policies: {
428
449
  readonly read: ({ check, ref }: import("@astrale-os/sdk/schema").ClassRuleContext) => import("@astrale-os/sdk/schema").PolicyCheckExpression<import("@astrale-os/sdk/schema").PolicyRef, import("@astrale-os/sdk/schema").ClassRuleObject>;
@@ -467,7 +488,7 @@ declare const classes: {
467
488
  readonly kind: 'node';
468
489
  readonly abstract: false;
469
490
  readonly depth: 0;
470
- readonly properties: "execution" | "expiresAt" | "round" | "status";
491
+ readonly properties: "email" | "execution" | "expiresAt" | "round" | "status";
471
492
  readonly methods: "accept" | "cancel" | "resend" | "send";
472
493
  }[];
473
494
  readonly outgoing: "0..1";
@@ -905,6 +926,20 @@ declare const input: {
905
926
  readonly mode: 'value';
906
927
  readonly value: Record<string, never>;
907
928
  }, "authorized", true, false, undefined, undefined>>;
929
+ readonly assignMembers: import("@astrale-os/sdk/schema").Method<import("@astrale-os/sdk/schema").CallableProjection<{
930
+ members: string[];
931
+ group: string;
932
+ }, {
933
+ readonly mode: 'value';
934
+ readonly value: Record<string, never>;
935
+ }, "authorized", true, false, undefined, undefined>>;
936
+ readonly unassignMembers: import("@astrale-os/sdk/schema").Method<import("@astrale-os/sdk/schema").CallableProjection<{
937
+ members: string[];
938
+ group: string;
939
+ }, {
940
+ readonly mode: 'value';
941
+ readonly value: Record<string, never>;
942
+ }, "authorized", true, false, undefined, undefined>>;
908
943
  readonly provision: import("@astrale-os/sdk/schema").Method<import("@astrale-os/sdk/schema").CallableProjection<{
909
944
  directory: string;
910
945
  externalId: string;
@@ -948,7 +983,7 @@ declare const input: {
948
983
  readonly abstract: false;
949
984
  readonly depth: 1;
950
985
  readonly properties: "attributes" | "description" | "directory" | "externalId" | "frozen" | "icon" | "iss" | "name" | "sub";
951
- readonly methods: "assignMember" | "create" | "delete" | "deprovision" | "provision" | "unassignMember" | "update";
986
+ readonly methods: "assignMember" | "assignMembers" | "create" | "delete" | "deprovision" | "provision" | "unassignMember" | "unassignMembers" | "update";
952
987
  }[];
953
988
  readonly outgoing: "0..1";
954
989
  };
@@ -1006,6 +1041,13 @@ declare const input: {
1006
1041
  readonly description?: string;
1007
1042
  readonly immutable?: import("@astrale-os/sdk/schema").PropertyImmutability;
1008
1043
  }>;
1044
+ email: import("@astrale-os/sdk/schema").AuthoredProperty<{
1045
+ readonly type: "string";
1046
+ readonly minLength: 3;
1047
+ readonly maxLength: 320;
1048
+ }, {
1049
+ readonly required: false;
1050
+ }>;
1009
1051
  };
1010
1052
  readonly policies: {
1011
1053
  readonly read: ({ check, ref }: import("@astrale-os/sdk/schema").ClassRuleContext) => import("@astrale-os/sdk/schema").PolicyCheckExpression<import("@astrale-os/sdk/schema").PolicyRef, import("@astrale-os/sdk/schema").ClassRuleObject>;
@@ -1050,7 +1092,7 @@ declare const input: {
1050
1092
  readonly kind: 'node';
1051
1093
  readonly abstract: false;
1052
1094
  readonly depth: 0;
1053
- readonly properties: "execution" | "expiresAt" | "round" | "status";
1095
+ readonly properties: "email" | "execution" | "expiresAt" | "round" | "status";
1054
1096
  readonly methods: "accept" | "cancel" | "resend" | "send";
1055
1097
  }[];
1056
1098
  readonly outgoing: "0..1";
@@ -1230,6 +1272,7 @@ declare const input: {
1230
1272
  readonly 'user-profile.reader': import("@astrale-os/sdk/schema").CoreNode;
1231
1273
  readonly 'user-profile.self-writer': import("@astrale-os/sdk/schema").CoreNode;
1232
1274
  readonly 'group-profile.reader': import("@astrale-os/sdk/schema").CoreNode;
1275
+ readonly 'os.viewer': import("@astrale-os/sdk/schema").CoreNode;
1233
1276
  readonly admin: import("@astrale-os/sdk/schema").CoreNode;
1234
1277
  readonly member: import("@astrale-os/sdk/schema").CoreNode;
1235
1278
  readonly applications: import("@astrale-os/sdk/schema").CoreNode;
@@ -1564,6 +1607,20 @@ export declare const ShellSchema: import("@astrale-os/sdk/schema").AuthoredSchem
1564
1607
  readonly mode: 'value';
1565
1608
  readonly value: Record<string, never>;
1566
1609
  }, "authorized", true, false, undefined, undefined>>;
1610
+ readonly assignMembers: import("@astrale-os/sdk/schema").Method<import("@astrale-os/sdk/schema").CallableProjection<{
1611
+ members: string[];
1612
+ group: string;
1613
+ }, {
1614
+ readonly mode: 'value';
1615
+ readonly value: Record<string, never>;
1616
+ }, "authorized", true, false, undefined, undefined>>;
1617
+ readonly unassignMembers: import("@astrale-os/sdk/schema").Method<import("@astrale-os/sdk/schema").CallableProjection<{
1618
+ members: string[];
1619
+ group: string;
1620
+ }, {
1621
+ readonly mode: 'value';
1622
+ readonly value: Record<string, never>;
1623
+ }, "authorized", true, false, undefined, undefined>>;
1567
1624
  readonly provision: import("@astrale-os/sdk/schema").Method<import("@astrale-os/sdk/schema").CallableProjection<{
1568
1625
  directory: string;
1569
1626
  externalId: string;
@@ -1607,7 +1664,7 @@ export declare const ShellSchema: import("@astrale-os/sdk/schema").AuthoredSchem
1607
1664
  readonly abstract: false;
1608
1665
  readonly depth: 1;
1609
1666
  readonly properties: "attributes" | "description" | "directory" | "externalId" | "frozen" | "icon" | "iss" | "name" | "sub";
1610
- readonly methods: "assignMember" | "create" | "delete" | "deprovision" | "provision" | "unassignMember" | "update";
1667
+ readonly methods: "assignMember" | "assignMembers" | "create" | "delete" | "deprovision" | "provision" | "unassignMember" | "unassignMembers" | "update";
1611
1668
  }[];
1612
1669
  readonly outgoing: "0..1";
1613
1670
  };
@@ -1665,6 +1722,13 @@ export declare const ShellSchema: import("@astrale-os/sdk/schema").AuthoredSchem
1665
1722
  readonly description?: string;
1666
1723
  readonly immutable?: import("@astrale-os/sdk/schema").PropertyImmutability;
1667
1724
  }>;
1725
+ email: import("@astrale-os/sdk/schema").AuthoredProperty<{
1726
+ readonly type: "string";
1727
+ readonly minLength: 3;
1728
+ readonly maxLength: 320;
1729
+ }, {
1730
+ readonly required: false;
1731
+ }>;
1668
1732
  };
1669
1733
  readonly policies: {
1670
1734
  readonly read: ({ check, ref }: import("@astrale-os/sdk/schema").ClassRuleContext) => import("@astrale-os/sdk/schema").PolicyCheckExpression<import("@astrale-os/sdk/schema").PolicyRef, import("@astrale-os/sdk/schema").ClassRuleObject>;
@@ -1709,7 +1773,7 @@ export declare const ShellSchema: import("@astrale-os/sdk/schema").AuthoredSchem
1709
1773
  readonly kind: 'node';
1710
1774
  readonly abstract: false;
1711
1775
  readonly depth: 0;
1712
- readonly properties: "execution" | "expiresAt" | "round" | "status";
1776
+ readonly properties: "email" | "execution" | "expiresAt" | "round" | "status";
1713
1777
  readonly methods: "accept" | "cancel" | "resend" | "send";
1714
1778
  }[];
1715
1779
  readonly outgoing: "0..1";
@@ -1889,6 +1953,7 @@ export declare const ShellSchema: import("@astrale-os/sdk/schema").AuthoredSchem
1889
1953
  readonly 'user-profile.reader': import("@astrale-os/sdk/schema").CoreNode;
1890
1954
  readonly 'user-profile.self-writer': import("@astrale-os/sdk/schema").CoreNode;
1891
1955
  readonly 'group-profile.reader': import("@astrale-os/sdk/schema").CoreNode;
1956
+ readonly 'os.viewer': import("@astrale-os/sdk/schema").CoreNode;
1892
1957
  readonly admin: import("@astrale-os/sdk/schema").CoreNode;
1893
1958
  readonly member: import("@astrale-os/sdk/schema").CoreNode;
1894
1959
  readonly applications: import("@astrale-os/sdk/schema").CoreNode;
@@ -2225,6 +2290,20 @@ export declare const S: schema.ResolvedDomainOf<import("@astrale-os/sdk/schema")
2225
2290
  readonly mode: 'value';
2226
2291
  readonly value: Record<string, never>;
2227
2292
  }, "authorized", true, false, undefined, undefined>>;
2293
+ readonly assignMembers: import("@astrale-os/sdk/schema").Method<import("@astrale-os/sdk/schema").CallableProjection<{
2294
+ members: string[];
2295
+ group: string;
2296
+ }, {
2297
+ readonly mode: 'value';
2298
+ readonly value: Record<string, never>;
2299
+ }, "authorized", true, false, undefined, undefined>>;
2300
+ readonly unassignMembers: import("@astrale-os/sdk/schema").Method<import("@astrale-os/sdk/schema").CallableProjection<{
2301
+ members: string[];
2302
+ group: string;
2303
+ }, {
2304
+ readonly mode: 'value';
2305
+ readonly value: Record<string, never>;
2306
+ }, "authorized", true, false, undefined, undefined>>;
2228
2307
  readonly provision: import("@astrale-os/sdk/schema").Method<import("@astrale-os/sdk/schema").CallableProjection<{
2229
2308
  directory: string;
2230
2309
  externalId: string;
@@ -2268,7 +2347,7 @@ export declare const S: schema.ResolvedDomainOf<import("@astrale-os/sdk/schema")
2268
2347
  readonly abstract: false;
2269
2348
  readonly depth: 1;
2270
2349
  readonly properties: "attributes" | "description" | "directory" | "externalId" | "frozen" | "icon" | "iss" | "name" | "sub";
2271
- readonly methods: "assignMember" | "create" | "delete" | "deprovision" | "provision" | "unassignMember" | "update";
2350
+ readonly methods: "assignMember" | "assignMembers" | "create" | "delete" | "deprovision" | "provision" | "unassignMember" | "unassignMembers" | "update";
2272
2351
  }[];
2273
2352
  readonly outgoing: "0..1";
2274
2353
  };
@@ -2326,6 +2405,13 @@ export declare const S: schema.ResolvedDomainOf<import("@astrale-os/sdk/schema")
2326
2405
  readonly description?: string;
2327
2406
  readonly immutable?: import("@astrale-os/sdk/schema").PropertyImmutability;
2328
2407
  }>;
2408
+ email: import("@astrale-os/sdk/schema").AuthoredProperty<{
2409
+ readonly type: "string";
2410
+ readonly minLength: 3;
2411
+ readonly maxLength: 320;
2412
+ }, {
2413
+ readonly required: false;
2414
+ }>;
2329
2415
  };
2330
2416
  readonly policies: {
2331
2417
  readonly read: ({ check, ref }: import("@astrale-os/sdk/schema").ClassRuleContext) => import("@astrale-os/sdk/schema").PolicyCheckExpression<import("@astrale-os/sdk/schema").PolicyRef, import("@astrale-os/sdk/schema").ClassRuleObject>;
@@ -2370,7 +2456,7 @@ export declare const S: schema.ResolvedDomainOf<import("@astrale-os/sdk/schema")
2370
2456
  readonly kind: 'node';
2371
2457
  readonly abstract: false;
2372
2458
  readonly depth: 0;
2373
- readonly properties: "execution" | "expiresAt" | "round" | "status";
2459
+ readonly properties: "email" | "execution" | "expiresAt" | "round" | "status";
2374
2460
  readonly methods: "accept" | "cancel" | "resend" | "send";
2375
2461
  }[];
2376
2462
  readonly outgoing: "0..1";
@@ -2550,6 +2636,7 @@ export declare const S: schema.ResolvedDomainOf<import("@astrale-os/sdk/schema")
2550
2636
  readonly 'user-profile.reader': import("@astrale-os/sdk/schema").CoreNode;
2551
2637
  readonly 'user-profile.self-writer': import("@astrale-os/sdk/schema").CoreNode;
2552
2638
  readonly 'group-profile.reader': import("@astrale-os/sdk/schema").CoreNode;
2639
+ readonly 'os.viewer': import("@astrale-os/sdk/schema").CoreNode;
2553
2640
  readonly admin: import("@astrale-os/sdk/schema").CoreNode;
2554
2641
  readonly member: import("@astrale-os/sdk/schema").CoreNode;
2555
2642
  readonly applications: import("@astrale-os/sdk/schema").CoreNode;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astrale-domains/shell",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "description": "Astrale Shell Domain schema and remote product implementation",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -58,7 +58,7 @@
58
58
  },
59
59
  "devDependencies": {
60
60
  "@astrale-os/ox": "0.1.4",
61
- "@astrale-os/sdk": "0.6.0-beta.60",
61
+ "@astrale-os/sdk": "0.6.0-beta.61",
62
62
  "@astrale-os/shell-react": "0.6.0-beta.11",
63
63
  "@astrale-os/ui": "1.0.0-beta.37",
64
64
  "@astrale/typescript-config": "npm:@jsr/astrale__typescript-config@~2.0.0",