@astrale-domains/shell 0.1.0-beta.23 → 0.1.0-beta.24

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 (238) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +83 -79
  3. package/dist/application.d.ts +6 -5
  4. package/dist/application.js +20 -51
  5. package/dist/functions/group/assign-user-to-group.d.ts +27 -0
  6. package/dist/functions/group/assign-user-to-group.js +4 -0
  7. package/dist/functions/group/change-user-group-membership.d.ts +7 -0
  8. package/dist/functions/group/change-user-group-membership.js +34 -0
  9. package/dist/functions/group/group-membership-errors.d.ts +28 -0
  10. package/dist/functions/group/group-membership-errors.js +23 -0
  11. package/dist/functions/group/index.d.ts +2 -3
  12. package/dist/functions/group/index.js +2 -3
  13. package/dist/functions/group/unassign-user-from-group.d.ts +27 -0
  14. package/dist/functions/group/unassign-user-from-group.js +4 -0
  15. package/dist/functions/user/index.d.ts +1 -3
  16. package/dist/functions/user/index.js +1 -3
  17. package/dist/functions/user/invite-user.d.ts +30 -0
  18. package/dist/functions/user/invite-user.js +39 -0
  19. package/dist/index.d.ts +1 -1
  20. package/dist/index.js +1 -1
  21. package/dist/integrations/index.d.ts +1 -0
  22. package/dist/integrations/index.js +1 -0
  23. package/dist/integrations/integrations.d.ts +9 -0
  24. package/dist/integrations/integrations.js +2 -0
  25. package/dist/integrations/user-invitation/index.d.ts +4 -0
  26. package/dist/integrations/user-invitation/index.js +3 -0
  27. package/dist/integrations/user-invitation/invitation-request-failure.d.ts +5 -0
  28. package/dist/integrations/user-invitation/invitation-request-failure.js +9 -0
  29. package/dist/integrations/user-invitation/invite-user-request.d.ts +6 -0
  30. package/dist/integrations/user-invitation/invite-user-request.js +1 -0
  31. package/dist/integrations/user-invitation/request-user-invitation.d.ts +8 -0
  32. package/dist/integrations/user-invitation/request-user-invitation.js +9 -0
  33. package/dist/mutations/group/index.d.ts +1 -1
  34. package/dist/mutations/group/index.js +1 -1
  35. package/dist/mutations/group/set-user-group-membership.d.ts +26 -0
  36. package/dist/mutations/group/set-user-group-membership.js +29 -0
  37. package/dist/providers/admin-enrollment/create-admin-enrollment-provider.d.ts +7 -0
  38. package/dist/providers/admin-enrollment/create-admin-enrollment-provider.js +78 -0
  39. package/dist/providers/admin-enrollment/decode-admin-invitation-response.d.ts +7 -0
  40. package/dist/providers/admin-enrollment/decode-admin-invitation-response.js +20 -0
  41. package/dist/providers/admin-enrollment/index.d.ts +1 -0
  42. package/dist/providers/admin-enrollment/index.js +1 -0
  43. package/dist/providers/admin-enrollment/read-enrollment-response.d.ts +1 -0
  44. package/dist/providers/admin-enrollment/read-enrollment-response.js +34 -0
  45. package/dist/queries/group/index.d.ts +2 -0
  46. package/dist/queries/group/index.js +2 -0
  47. package/dist/queries/group/read-group-membership-endpoints.d.ts +13 -0
  48. package/dist/queries/group/read-group-membership-endpoints.js +18 -0
  49. package/dist/queries/group/read-user-group-membership.d.ts +15 -0
  50. package/dist/queries/group/read-user-group-membership.js +35 -0
  51. package/dist/runtime.d.ts +94 -9
  52. package/dist/runtime.js +9 -5
  53. package/dist/schema/index.d.ts +4 -4
  54. package/dist/schema/index.js +3 -4
  55. package/dist/schema/modules/group/classes/group.d.ts +4 -6
  56. package/dist/schema/modules/group/classes/group.js +4 -6
  57. package/dist/schema/modules/group/classes/index.d.ts +2 -0
  58. package/dist/schema/modules/group/classes/index.js +2 -0
  59. package/dist/schema/modules/group/classes/member-of-group.js +2 -3
  60. package/dist/schema/modules/group/core/administrators-group.js +6 -0
  61. package/dist/schema/modules/group/core/index.d.ts +2 -0
  62. package/dist/schema/modules/group/core/index.js +2 -0
  63. package/dist/schema/modules/group/core/members-group.js +6 -0
  64. package/dist/schema/modules/group/functions/assign-user-to-group.d.ts +7 -0
  65. package/dist/schema/modules/group/functions/assign-user-to-group.js +11 -0
  66. package/dist/schema/modules/group/functions/index.d.ts +2 -0
  67. package/dist/schema/modules/group/functions/index.js +2 -0
  68. package/dist/schema/modules/group/functions/unassign-user-from-group.d.ts +7 -0
  69. package/dist/schema/modules/group/functions/unassign-user-from-group.js +11 -0
  70. package/dist/schema/modules/group/index.d.ts +3 -9
  71. package/dist/schema/modules/group/index.js +3 -9
  72. package/dist/schema/modules/group/policies/belongs-to-group.d.ts +1 -0
  73. package/dist/schema/modules/group/policies/belongs-to-group.js +5 -0
  74. package/dist/schema/modules/group/policies/index.d.ts +1 -0
  75. package/dist/schema/modules/group/policies/index.js +1 -0
  76. package/dist/schema/modules/group/types/group-user-reference.d.ts +6 -0
  77. package/dist/schema/modules/group/types/group-user-reference.js +8 -0
  78. package/dist/schema/modules/group/types/index.d.ts +1 -0
  79. package/dist/schema/modules/group/types/index.js +1 -0
  80. package/dist/schema/modules/user/classes/index.d.ts +1 -0
  81. package/dist/schema/modules/user/classes/index.js +1 -0
  82. package/dist/schema/modules/user/classes/user.d.ts +5 -8
  83. package/dist/schema/modules/user/classes/user.js +7 -7
  84. package/dist/schema/modules/user/functions/index.d.ts +1 -0
  85. package/dist/schema/modules/user/functions/index.js +1 -0
  86. package/dist/schema/modules/user/functions/invite-user.d.ts +11 -0
  87. package/dist/schema/modules/user/functions/invite-user.js +12 -0
  88. package/dist/schema/modules/user/index.d.ts +2 -6
  89. package/dist/schema/modules/user/index.js +2 -6
  90. package/dist/schema/modules/user/types/index.d.ts +1 -0
  91. package/dist/schema/modules/user/types/index.js +1 -0
  92. package/dist/schema/modules/user/types/invitation-summary.d.ts +16 -0
  93. package/dist/schema/modules/user/types/invitation-summary.js +15 -0
  94. package/dist/schema/policies/administers-shell-class.d.ts +2 -0
  95. package/dist/schema/policies/administers-shell-class.js +11 -0
  96. package/dist/schema/policies/index.d.ts +2 -0
  97. package/dist/schema/policies/index.js +2 -0
  98. package/dist/schema/policies/owns-class.d.ts +1 -0
  99. package/dist/schema/policies/owns-class.js +7 -0
  100. package/dist/schema/schema.d.ts +14 -69
  101. package/dist/schema/schema.js +10 -27
  102. package/dist/schema/views/application-view.d.ts +1 -0
  103. package/dist/schema/views/application-view.js +4 -0
  104. package/dist/schema/views/index.d.ts +1 -0
  105. package/dist/schema/views/index.js +1 -0
  106. package/dist/utils/canonical-node-path/index.d.ts +1 -0
  107. package/dist/utils/canonical-node-path/index.js +1 -0
  108. package/dist/utils/canonical-node-path/parse-canonical-node-path.d.ts +2 -0
  109. package/dist/utils/canonical-node-path/parse-canonical-node-path.js +8 -0
  110. package/package.json +16 -7
  111. package/dist/functions/group/assign.d.ts +0 -3
  112. package/dist/functions/group/assign.js +0 -3
  113. package/dist/functions/group/change.d.ts +0 -6
  114. package/dist/functions/group/change.js +0 -41
  115. package/dist/functions/group/unassign.d.ts +0 -3
  116. package/dist/functions/group/unassign.js +0 -3
  117. package/dist/functions/registry/index.d.ts +0 -12
  118. package/dist/functions/registry/index.js +0 -12
  119. package/dist/functions/setup/admin.d.ts +0 -3
  120. package/dist/functions/setup/admin.js +0 -3
  121. package/dist/functions/setup/index.d.ts +0 -4
  122. package/dist/functions/setup/index.js +0 -4
  123. package/dist/functions/setup/member.d.ts +0 -3
  124. package/dist/functions/setup/member.js +0 -3
  125. package/dist/functions/setup/provision.d.ts +0 -5
  126. package/dist/functions/setup/provision.js +0 -70
  127. package/dist/functions/setup/run.d.ts +0 -7
  128. package/dist/functions/setup/run.js +0 -82
  129. package/dist/functions/space/access.d.ts +0 -7
  130. package/dist/functions/space/access.js +0 -41
  131. package/dist/functions/space/add.d.ts +0 -3
  132. package/dist/functions/space/add.js +0 -3
  133. package/dist/functions/space/default.d.ts +0 -3
  134. package/dist/functions/space/default.js +0 -37
  135. package/dist/functions/space/index.d.ts +0 -4
  136. package/dist/functions/space/index.js +0 -4
  137. package/dist/functions/space/remove.d.ts +0 -3
  138. package/dist/functions/space/remove.js +0 -3
  139. package/dist/functions/user/resolve-home.d.ts +0 -3
  140. package/dist/functions/user/resolve-home.js +0 -19
  141. package/dist/mutations/group/membership.d.ts +0 -23
  142. package/dist/mutations/group/membership.js +0 -32
  143. package/dist/mutations/space/access.d.ts +0 -25
  144. package/dist/mutations/space/access.js +0 -23
  145. package/dist/mutations/space/default.d.ts +0 -19
  146. package/dist/mutations/space/default.js +0 -23
  147. package/dist/mutations/space/index.d.ts +0 -2
  148. package/dist/mutations/space/index.js +0 -2
  149. package/dist/mutations/user/index.d.ts +0 -1
  150. package/dist/mutations/user/index.js +0 -1
  151. package/dist/mutations/user/repair.d.ts +0 -22
  152. package/dist/mutations/user/repair.js +0 -104
  153. package/dist/queries/space/access.d.ts +0 -9
  154. package/dist/queries/space/access.js +0 -12
  155. package/dist/queries/space/admin.d.ts +0 -9
  156. package/dist/queries/space/admin.js +0 -20
  157. package/dist/queries/space/index.d.ts +0 -3
  158. package/dist/queries/space/index.js +0 -3
  159. package/dist/queries/space/member.d.ts +0 -9
  160. package/dist/queries/space/member.js +0 -17
  161. package/dist/queries/user/groups.d.ts +0 -10
  162. package/dist/queries/user/groups.js +0 -41
  163. package/dist/queries/user/home.d.ts +0 -9
  164. package/dist/queries/user/home.js +0 -21
  165. package/dist/queries/user/index.d.ts +0 -5
  166. package/dist/queries/user/index.js +0 -5
  167. package/dist/queries/user/owned-spaces.d.ts +0 -9
  168. package/dist/queries/user/owned-spaces.js +0 -17
  169. package/dist/queries/user/profile.d.ts +0 -4
  170. package/dist/queries/user/profile.js +0 -16
  171. package/dist/queries/user/setup.d.ts +0 -13
  172. package/dist/queries/user/setup.js +0 -16
  173. package/dist/rules/user/index.d.ts +0 -1
  174. package/dist/rules/user/index.js +0 -1
  175. package/dist/rules/user/setup.d.ts +0 -38
  176. package/dist/rules/user/setup.js +0 -95
  177. package/dist/schema/modules/group/core/admin-group.js +0 -2
  178. package/dist/schema/modules/group/core/core.d.ts +0 -8
  179. package/dist/schema/modules/group/core/core.js +0 -6
  180. package/dist/schema/modules/group/core/identity.d.ts +0 -1
  181. package/dist/schema/modules/group/core/identity.js +0 -10
  182. package/dist/schema/modules/group/core/member-group.js +0 -2
  183. package/dist/schema/modules/group/functions/assign-user.d.ts +0 -7
  184. package/dist/schema/modules/group/functions/assign-user.js +0 -12
  185. package/dist/schema/modules/group/functions/unassign-user.d.ts +0 -7
  186. package/dist/schema/modules/group/functions/unassign-user.js +0 -12
  187. package/dist/schema/modules/group/policies/may-setup-users.d.ts +0 -1
  188. package/dist/schema/modules/group/policies/may-setup-users.js +0 -6
  189. package/dist/schema/modules/group/types/membership.d.ts +0 -276
  190. package/dist/schema/modules/group/types/membership.js +0 -5
  191. package/dist/schema/modules/group/views/group.d.ts +0 -1
  192. package/dist/schema/modules/group/views/group.js +0 -6
  193. package/dist/schema/modules/space/classes/administers-space.d.ts +0 -16
  194. package/dist/schema/modules/space/classes/administers-space.js +0 -9
  195. package/dist/schema/modules/space/classes/default-space.d.ts +0 -16
  196. package/dist/schema/modules/space/classes/default-space.js +0 -8
  197. package/dist/schema/modules/space/classes/member-of-space.d.ts +0 -16
  198. package/dist/schema/modules/space/classes/member-of-space.js +0 -9
  199. package/dist/schema/modules/space/classes/owns-space.d.ts +0 -16
  200. package/dist/schema/modules/space/classes/owns-space.js +0 -9
  201. package/dist/schema/modules/space/classes/space.d.ts +0 -15
  202. package/dist/schema/modules/space/classes/space.js +0 -15
  203. package/dist/schema/modules/space/core/core.d.ts +0 -7
  204. package/dist/schema/modules/space/core/core.js +0 -12
  205. package/dist/schema/modules/space/core/default-space.d.ts +0 -1
  206. package/dist/schema/modules/space/core/default-space.js +0 -6
  207. package/dist/schema/modules/space/functions/add-user.d.ts +0 -8
  208. package/dist/schema/modules/space/functions/add-user.js +0 -12
  209. package/dist/schema/modules/space/functions/remove-user.d.ts +0 -7
  210. package/dist/schema/modules/space/functions/remove-user.js +0 -11
  211. package/dist/schema/modules/space/functions/set-default.d.ts +0 -5
  212. package/dist/schema/modules/space/functions/set-default.js +0 -11
  213. package/dist/schema/modules/space/index.d.ts +0 -14
  214. package/dist/schema/modules/space/index.js +0 -14
  215. package/dist/schema/modules/space/policies/belongs-to-space.d.ts +0 -1
  216. package/dist/schema/modules/space/policies/belongs-to-space.js +0 -9
  217. package/dist/schema/modules/space/policies/may-administer-space.d.ts +0 -1
  218. package/dist/schema/modules/space/policies/may-administer-space.js +0 -8
  219. package/dist/schema/modules/space/policies/owns-space.d.ts +0 -1
  220. package/dist/schema/modules/space/policies/owns-space.js +0 -7
  221. package/dist/schema/modules/space/types/access.d.ts +0 -280
  222. package/dist/schema/modules/space/types/access.js +0 -12
  223. package/dist/schema/modules/space/views/space.d.ts +0 -1
  224. package/dist/schema/modules/space/views/space.js +0 -6
  225. package/dist/schema/modules/user/functions/resolve-home.d.ts +0 -7
  226. package/dist/schema/modules/user/functions/resolve-home.js +0 -11
  227. package/dist/schema/modules/user/functions/setup-admin.d.ts +0 -15
  228. package/dist/schema/modules/user/functions/setup-admin.js +0 -11
  229. package/dist/schema/modules/user/functions/setup-member.d.ts +0 -15
  230. package/dist/schema/modules/user/functions/setup-member.js +0 -11
  231. package/dist/schema/modules/user/types/setup-user.d.ts +0 -13
  232. package/dist/schema/modules/user/types/setup-user.js +0 -14
  233. package/dist/schema/modules/user/views/home.d.ts +0 -1
  234. package/dist/schema/modules/user/views/home.js +0 -4
  235. package/dist/schema/modules/user/views/user.d.ts +0 -1
  236. package/dist/schema/modules/user/views/user.js +0 -6
  237. /package/dist/schema/modules/group/core/{admin-group.d.ts → administrators-group.d.ts} +0 -0
  238. /package/dist/schema/modules/group/core/{member-group.d.ts → members-group.d.ts} +0 -0
@@ -0,0 +1,7 @@
1
+ export declare const assignUser: import("@astrale-os/sdk/schema").Method<import("@astrale-os/sdk/schema").CallableProjection<{
2
+ user: string;
3
+ group: string;
4
+ }, {
5
+ readonly mode: 'value';
6
+ readonly value: Record<string, never>;
7
+ }, "authorized", true, "default">>;
@@ -0,0 +1,11 @@
1
+ import { method } from '@astrale-os/sdk/schema';
2
+ import { z } from 'zod';
3
+ import { ownsClass, administersShellClass } from '../../../policies/index.js';
4
+ import { groupMembershipInput } from '../types/index.js';
5
+ export const assignUser = method({
6
+ static: true,
7
+ auth: 'authorized',
8
+ input: groupMembershipInput,
9
+ output: z.object({}),
10
+ policy: ({ anyOf, check, input }) => anyOf(check(administersShellClass, input.group), check(ownsClass, input.group)),
11
+ });
@@ -0,0 +1,2 @@
1
+ export { assignUser } from './assign-user-to-group.js';
2
+ export { unassignUser } from './unassign-user-from-group.js';
@@ -0,0 +1,2 @@
1
+ export { assignUser } from './assign-user-to-group.js';
2
+ export { unassignUser } from './unassign-user-from-group.js';
@@ -0,0 +1,7 @@
1
+ export declare const unassignUser: import("@astrale-os/sdk/schema").Method<import("@astrale-os/sdk/schema").CallableProjection<{
2
+ user: string;
3
+ group: string;
4
+ }, {
5
+ readonly mode: 'value';
6
+ readonly value: Record<string, never>;
7
+ }, "authorized", true, "default">>;
@@ -0,0 +1,11 @@
1
+ import { method } from '@astrale-os/sdk/schema';
2
+ import { z } from 'zod';
3
+ import { ownsClass, administersShellClass } from '../../../policies/index.js';
4
+ import { groupMembershipInput } from '../types/index.js';
5
+ export const unassignUser = method({
6
+ static: true,
7
+ auth: 'authorized',
8
+ input: groupMembershipInput,
9
+ output: z.object({}),
10
+ policy: ({ anyOf, check, input }) => anyOf(check(administersShellClass, input.group), check(ownsClass, input.group)),
11
+ });
@@ -1,9 +1,3 @@
1
- export { Group } from './classes/group.js';
2
- export { member_of_group } from './classes/member-of-group.js';
3
- export { adminGroup } from './core/admin-group.js';
4
- export { groupCore } from './core/core.js';
5
- export { memberGroup } from './core/member-group.js';
6
- export { groupAssignUser } from './functions/assign-user.js';
7
- export { groupUnassignUser } from './functions/unassign-user.js';
8
- export { maySetupUsers } from './policies/may-setup-users.js';
9
- export { groupView } from './views/group.js';
1
+ export { Group, member_of_group } from './classes/index.js';
2
+ export { adminGroup, memberGroup } from './core/index.js';
3
+ export { belongsToGroup } from './policies/index.js';
@@ -1,9 +1,3 @@
1
- export { Group } from './classes/group.js';
2
- export { member_of_group } from './classes/member-of-group.js';
3
- export { adminGroup } from './core/admin-group.js';
4
- export { groupCore } from './core/core.js';
5
- export { memberGroup } from './core/member-group.js';
6
- export { groupAssignUser } from './functions/assign-user.js';
7
- export { groupUnassignUser } from './functions/unassign-user.js';
8
- export { maySetupUsers } from './policies/may-setup-users.js';
9
- export { groupView } from './views/group.js';
1
+ export { Group, member_of_group } from './classes/index.js';
2
+ export { adminGroup, memberGroup } from './core/index.js';
3
+ export { belongsToGroup } from './policies/index.js';
@@ -0,0 +1 @@
1
+ export declare const belongsToGroup: import("@astrale-os/sdk/schema").Policy;
@@ -0,0 +1,5 @@
1
+ import { policy } from '@astrale-os/sdk/schema';
2
+ import { member_of_group } from '../classes/member-of-group.js';
3
+ export const belongsToGroup = policy({
4
+ match: ({ edge, subject, object }) => edge({ source: subject, class: () => member_of_group, target: object }),
5
+ });
@@ -0,0 +1 @@
1
+ export { belongsToGroup } from './belongs-to-group.js';
@@ -0,0 +1 @@
1
+ export { belongsToGroup } from './belongs-to-group.js';
@@ -0,0 +1,6 @@
1
+ import type { NodeClass } from '@astrale-os/sdk/schema';
2
+ import { z } from 'zod';
3
+ export declare const groupMembershipInput: z.ZodObject<{
4
+ user: import("@astrale-os/sdk/schema").PathAuthoring<readonly [() => NodeClass]>;
5
+ group: import("@astrale-os/sdk/schema").PathAuthoring<readonly [() => NodeClass]>;
6
+ }, z.core.$strip>;
@@ -0,0 +1,8 @@
1
+ import { path } from '@astrale-os/sdk/schema';
2
+ import { z } from 'zod';
3
+ import { User } from '../../user/index.js';
4
+ import { Group } from '../classes/group.js';
5
+ export const groupMembershipInput = z.object({
6
+ user: path(() => User),
7
+ group: path(() => Group),
8
+ });
@@ -0,0 +1 @@
1
+ export { groupMembershipInput } from './group-user-reference.js';
@@ -0,0 +1 @@
1
+ export { groupMembershipInput } from './group-user-reference.js';
@@ -0,0 +1 @@
1
+ export { User } from './user.js';
@@ -0,0 +1 @@
1
+ export { User } from './user.js';
@@ -1,18 +1,15 @@
1
1
  import { nodeClass, type ClassIcon, type Kernel } from '@astrale-os/sdk/schema';
2
2
  import { z } from 'zod';
3
- import { resolveHome } from '../functions/resolve-home.js';
4
- declare const displayName: import("@astrale-os/sdk/schema").Property<z.ZodString, {
5
- readonly required: false;
6
- }, never>;
3
+ import { invite } from '../functions/index.js';
4
+ declare const creationKey: z.ZodOptional<z.ZodString>;
7
5
  export interface UserConfig {
8
- readonly description: string;
9
- readonly extends: readonly [Kernel['classes']['Identity']];
10
6
  readonly icon: ClassIcon;
7
+ readonly extends: readonly [Kernel['classes']['Identity']];
11
8
  readonly properties: {
12
- readonly displayName: typeof displayName;
9
+ readonly creationKey: typeof creationKey;
13
10
  };
14
11
  readonly methods: {
15
- readonly resolveHome: typeof resolveHome;
12
+ readonly invite: typeof invite;
16
13
  };
17
14
  }
18
15
  export declare const User: ReturnType<typeof nodeClass<UserConfig>>;
@@ -1,12 +1,12 @@
1
- import { classIcon, K, nodeClass, property, } from '@astrale-os/sdk/schema';
1
+ import { K, classIcon, nodeClass } from '@astrale-os/sdk/schema';
2
2
  import { UserRound } from '@astrale-os/sdk/schema/icons';
3
3
  import { z } from 'zod';
4
- import { resolveHome } from '../functions/resolve-home.js';
5
- const displayName = property(z.string().min(1).max(160), { required: false });
4
+ import { invite } from '../functions/index.js';
5
+ // Correlation for Admin-owned creation; never an authentication credential.
6
+ const creationKey = z.string().min(1).max(512).optional();
6
7
  export const User = nodeClass({
7
- description: 'One externally identified person using Shell.',
8
- extends: [K.classes.Identity],
9
8
  icon: classIcon.lucide(UserRound),
10
- properties: { displayName },
11
- methods: { resolveHome },
9
+ extends: [K.classes.Identity],
10
+ properties: { creationKey },
11
+ methods: { invite },
12
12
  });
@@ -0,0 +1 @@
1
+ export { invite } from './invite-user.js';
@@ -0,0 +1 @@
1
+ export { invite } from './invite-user.js';
@@ -0,0 +1,11 @@
1
+ export declare const invite: import("@astrale-os/sdk/schema").Method<import("@astrale-os/sdk/schema").CallableProjection<{
2
+ user: string;
3
+ email: string;
4
+ }, {
5
+ readonly mode: 'value';
6
+ readonly value: {
7
+ invitationId: string;
8
+ user: string;
9
+ state: "accepted" | "cancelled" | "completed" | "expired" | "failed" | "pending" | "registered" | "registering";
10
+ };
11
+ }, "authorized", true, "default">>;
@@ -0,0 +1,12 @@
1
+ import { method, path } from '@astrale-os/sdk/schema';
2
+ import { z } from 'zod';
3
+ import { ownsClass, administersShellClass } from '../../../policies/index.js';
4
+ import { User } from '../classes/index.js';
5
+ import { invitationSummary } from '../types/index.js';
6
+ export const invite = method({
7
+ static: true,
8
+ auth: 'authorized',
9
+ input: z.object({ user: path(() => User), email: z.string().min(3).max(320) }),
10
+ output: invitationSummary,
11
+ policy: ({ anyOf, check, input }) => anyOf(check(administersShellClass, input.user), check(ownsClass, input.user)),
12
+ });
@@ -1,6 +1,2 @@
1
- export { User } from './classes/user.js';
2
- export { resolveHome } from './functions/resolve-home.js';
3
- export { setupAdmin } from './functions/setup-admin.js';
4
- export { setupMember } from './functions/setup-member.js';
5
- export { homeView } from './views/home.js';
6
- export { userView } from './views/user.js';
1
+ export { User } from './classes/index.js';
2
+ export { invitationSummary, type InvitationSummary } from './types/index.js';
@@ -1,6 +1,2 @@
1
- export { User } from './classes/user.js';
2
- export { resolveHome } from './functions/resolve-home.js';
3
- export { setupAdmin } from './functions/setup-admin.js';
4
- export { setupMember } from './functions/setup-member.js';
5
- export { homeView } from './views/home.js';
6
- export { userView } from './views/user.js';
1
+ export { User } from './classes/index.js';
2
+ export { invitationSummary } from './types/index.js';
@@ -0,0 +1 @@
1
+ export { invitationSummary, type InvitationSummary } from './invitation-summary.js';
@@ -0,0 +1 @@
1
+ export { invitationSummary } from './invitation-summary.js';
@@ -0,0 +1,16 @@
1
+ import { z } from 'zod';
2
+ export declare const invitationSummary: z.ZodObject<{
3
+ invitationId: z.ZodString;
4
+ user: z.ZodString;
5
+ state: z.ZodEnum<{
6
+ accepted: "accepted";
7
+ cancelled: "cancelled";
8
+ completed: "completed";
9
+ expired: "expired";
10
+ failed: "failed";
11
+ pending: "pending";
12
+ registered: "registered";
13
+ registering: "registering";
14
+ }>;
15
+ }, z.core.$strip>;
16
+ export type InvitationSummary = z.infer<typeof invitationSummary>;
@@ -0,0 +1,15 @@
1
+ import { z } from 'zod';
2
+ export const invitationSummary = z.object({
3
+ invitationId: z.string().min(1),
4
+ user: z.string().min(1),
5
+ state: z.enum([
6
+ 'pending',
7
+ 'accepted',
8
+ 'registering',
9
+ 'registered',
10
+ 'completed',
11
+ 'cancelled',
12
+ 'expired',
13
+ 'failed',
14
+ ]),
15
+ });
@@ -0,0 +1,2 @@
1
+ /** Instance administration applies to Shell's concrete classes, not foreign descendants. */
2
+ export declare const administersShellClass: import("@astrale-os/sdk/schema").Policy;
@@ -0,0 +1,11 @@
1
+ import { K, policy } from '@astrale-os/sdk/schema';
2
+ import { Group, member_of_group, adminGroup } from '../modules/group/index.js';
3
+ /** Instance administration applies to Shell's concrete classes, not foreign descendants. */
4
+ export const administersShellClass = policy({
5
+ match: ({ exists, subject, object, ref, edge, allOf }) => exists(({ node }) => {
6
+ const concrete = node();
7
+ const owner = node(); // of_domain restricts this witness to a protected Domain endpoint.
8
+ const group = ref(() => Group);
9
+ return allOf(edge({ source: subject, class: () => member_of_group, target: ref(adminGroup) }), { source: ref(adminGroup), class: K.classes.instance_of.ref, target: group }, { source: group, class: K.classes.of_domain.ref, target: owner }, { source: concrete, class: K.classes.of_domain.ref, target: owner }, { source: object, class: K.classes.instance_of.ref, target: concrete });
10
+ }),
11
+ });
@@ -0,0 +1,2 @@
1
+ export { ownsClass } from './owns-class.js';
2
+ export { administersShellClass } from './administers-shell-class.js';
@@ -0,0 +1,2 @@
1
+ export { ownsClass } from './owns-class.js';
2
+ export { administersShellClass } from './administers-shell-class.js';
@@ -0,0 +1 @@
1
+ export declare const ownsClass: import("@astrale-os/sdk/schema").Policy;
@@ -0,0 +1,7 @@
1
+ import { K, policy } from '@astrale-os/sdk/schema';
2
+ export const ownsClass = policy({
3
+ match: ({ exists, subject, object, allOf }) => exists(({ node }) => {
4
+ const concrete = node(); // Périmètre défini par les deux edges kernel protégés.
5
+ return allOf({ source: object, class: K.classes.instance_of.ref, target: concrete }, { source: concrete, class: K.classes.of_domain.ref, target: subject });
6
+ }),
7
+ });
@@ -1,93 +1,38 @@
1
- import { defineSchema, KernelSchema, schema, type builder, type CallableInputOf, type CallableResultOf } from '@astrale-os/sdk/schema';
1
+ import { defineSchema, KernelSchema, schema } from '@astrale-os/sdk/schema';
2
2
  import { Group, member_of_group } from './modules/group/index.js';
3
- import { Space, administers_space, default_space, member_of_space, owns_space } from './modules/space/index.js';
4
3
  import { User } from './modules/user/index.js';
5
4
  export declare const ORIGIN: 'shell.astrale.ai';
6
- export declare const ShellCore: {
7
- nodes: {
8
- admin: builder.CoreNode;
9
- member: builder.CoreNode;
10
- 'default-space': builder.CoreNode;
11
- };
12
- edges: builder.CoreEdge[];
13
- };
14
5
  declare const dependencies: Readonly<{
15
- kernel: KernelSchema;
6
+ kernel: typeof KernelSchema;
16
7
  }>;
17
- declare const functions: {
18
- readonly setupAdmin: builder.Function<builder.CallableProjection<{
19
- operationId: string;
20
- issuer: string;
21
- subject: string;
22
- displayName: string;
23
- personalSpaceName: string;
24
- }, {
25
- readonly mode: 'value';
26
- readonly value: {
27
- userId: string;
28
- personalSpaceId: string;
29
- changed: boolean;
30
- };
31
- }, "authorized", false, "default">>;
32
- readonly setupMember: builder.Function<builder.CallableProjection<{
33
- operationId: string;
34
- issuer: string;
35
- subject: string;
36
- displayName: string;
37
- personalSpaceName: string;
38
- }, {
39
- readonly mode: 'value';
40
- readonly value: {
41
- userId: string;
42
- personalSpaceId: string;
43
- changed: boolean;
44
- };
45
- }, "authorized", false, "default">>;
46
- };
47
8
  export type ShellClasses = {
48
- readonly Group: typeof Group;
49
- readonly Space: typeof Space;
50
9
  readonly User: typeof User;
51
- readonly administers_space: typeof administers_space;
52
- readonly default_space: typeof default_space;
10
+ readonly Group: typeof Group;
53
11
  readonly member_of_group: typeof member_of_group;
54
- readonly member_of_space: typeof member_of_space;
55
- readonly owns_space: typeof owns_space;
56
12
  };
57
13
  declare const policies: {
58
- readonly belongsToSpace: builder.Policy;
59
- readonly mayAdministerSpace: builder.Policy;
60
- readonly maySetupUsers: builder.Policy;
61
- readonly ownsSpace: builder.Policy;
14
+ readonly belongsToGroup: import("@astrale-os/sdk/schema").Policy;
15
+ readonly ownsClass: import("@astrale-os/sdk/schema").Policy;
16
+ readonly administersShellClass: import("@astrale-os/sdk/schema").Policy;
62
17
  };
63
18
  declare const views: {
64
- readonly group: builder.View;
65
- readonly home: builder.View;
66
- readonly space: builder.View;
67
- readonly user: builder.View;
19
+ readonly application: import("@astrale-os/sdk/schema").View;
20
+ };
21
+ declare const core: {
22
+ readonly nodes: {
23
+ readonly admin: import("@astrale-os/sdk/schema").CoreNode;
24
+ readonly member: import("@astrale-os/sdk/schema").CoreNode;
25
+ };
68
26
  };
69
27
  export interface ShellSchemaInput {
70
28
  readonly dependencies: typeof dependencies;
71
- readonly functions: typeof functions;
72
29
  readonly classes: ShellClasses;
73
30
  readonly policies: typeof policies;
74
31
  readonly views: typeof views;
75
- readonly core: typeof ShellCore;
32
+ readonly core: typeof core;
76
33
  }
77
34
  export declare const ShellSchema: ReturnType<typeof defineSchema<typeof ORIGIN, ShellSchemaInput>>;
78
35
  export type ShellSchema = typeof ShellSchema;
79
36
  export declare const S: schema.ResolvedDomainOf<typeof ShellSchema>;
80
37
  export type Shell = schema.DomainOf<ShellSchema>;
81
- export type GroupMembershipInput = CallableInputOf<typeof S.classes.Group.self.methods.assignUser>;
82
- export type GroupMembershipResult = CallableResultOf<typeof S.classes.Group.self.methods.assignUser>;
83
- export type ResolveHomeResult = CallableResultOf<typeof S.classes.User.self.methods.resolveHome>;
84
- export type SetDefaultSpaceInput = CallableInputOf<typeof S.classes.Space.self.methods.setDefault>;
85
- export type SetDefaultSpaceResult = CallableResultOf<typeof S.classes.Space.self.methods.setDefault>;
86
- export type SetupUserInput = CallableInputOf<typeof S.functions.setupMember>;
87
- export type SetupUserResult = CallableResultOf<typeof S.functions.setupMember>;
88
- export type SpaceUserAccessInput = CallableInputOf<typeof S.classes.Space.self.methods.addUser>;
89
- export type SpaceUserAccess = SpaceUserAccessInput['access'];
90
- export type SpaceUserAccessResult = CallableResultOf<typeof S.classes.Space.self.methods.addUser>;
91
- export type SpaceUserInput = CallableInputOf<typeof S.classes.Space.self.methods.removeUser>;
92
- export type SpaceUserResult = CallableResultOf<typeof S.classes.Space.self.methods.removeUser>;
93
38
  export {};
@@ -1,37 +1,20 @@
1
- import { defineSchema, KernelSchema, schema, } from '@astrale-os/sdk/schema';
2
- import { Group, adminGroup, groupCore, groupView, maySetupUsers, memberGroup, member_of_group, } from '#schema/modules/group';
3
- import { Space, administers_space, belongsToSpace, default_space, defaultSpace, mayAdministerSpace, member_of_space, owns_space, ownsSpace, spaceCore, spaceView, } from '#schema/modules/space';
4
- import { User, homeView, setupAdmin, setupMember, userView } from '#schema/modules/user';
1
+ import { defineSchema, KernelSchema, schema } from '@astrale-os/sdk/schema';
2
+ import { Group, member_of_group, adminGroup, memberGroup, belongsToGroup, } from './modules/group/index.js';
3
+ import { User } from './modules/user/index.js';
4
+ import { ownsClass, administersShellClass } from './policies/index.js';
5
+ import { applicationView } from './views/index.js';
5
6
  export const ORIGIN = 'shell.astrale.ai';
6
- export const ShellCore = {
7
- nodes: {
8
- admin: adminGroup,
9
- member: memberGroup,
10
- 'default-space': defaultSpace,
11
- },
12
- edges: [...(groupCore.edges ?? []), ...(spaceCore.edges ?? [])],
13
- };
14
7
  const dependencies = { kernel: KernelSchema };
15
- const functions = { setupAdmin, setupMember };
16
- const classes = {
17
- Group,
18
- Space,
19
- User,
20
- administers_space,
21
- default_space,
22
- member_of_group,
23
- member_of_space,
24
- owns_space,
25
- };
26
- const policies = { belongsToSpace, mayAdministerSpace, maySetupUsers, ownsSpace };
27
- const views = { group: groupView, home: homeView, space: spaceView, user: userView };
8
+ const classes = { User, Group, member_of_group };
9
+ const policies = { belongsToGroup, ownsClass, administersShellClass };
10
+ const views = { application: applicationView };
11
+ const core = { nodes: { admin: adminGroup, member: memberGroup } };
28
12
  const input = {
29
13
  dependencies,
30
- functions,
31
14
  classes,
32
15
  policies,
33
16
  views,
34
- core: ShellCore,
17
+ core,
35
18
  };
36
19
  export const ShellSchema = defineSchema(ORIGIN, input);
37
20
  export const S = schema.resolve(ShellSchema);
@@ -0,0 +1 @@
1
+ export declare const applicationView: import("@astrale-os/sdk/schema").View;
@@ -0,0 +1,4 @@
1
+ import { view } from '@astrale-os/sdk/schema';
2
+ export const applicationView = view({
3
+ description: 'Users and groups in this instance.',
4
+ });
@@ -0,0 +1 @@
1
+ export { applicationView } from './application-view.js';
@@ -0,0 +1 @@
1
+ export { applicationView } from './application-view.js';
@@ -0,0 +1 @@
1
+ export { canonicalNodeId } from './parse-canonical-node-path.js';
@@ -0,0 +1 @@
1
+ export { canonicalNodeId } from './parse-canonical-node-path.js';
@@ -0,0 +1,2 @@
1
+ import type { NodeId } from '@astrale-os/sdk/graph/node';
2
+ export declare function canonicalNodeId(value: string, invalid?: () => Error): NodeId;
@@ -0,0 +1,8 @@
1
+ import { Path } from '@astrale-os/sdk/graph/path';
2
+ export function canonicalNodeId(value, invalid = () => new TypeError('An exact canonical @NodeId path is required.')) {
3
+ const parsed = Path.parse(value);
4
+ if (parsed.ast.anchor.kind !== 'id' || parsed.ast.steps.length !== 0) {
5
+ throw invalid();
6
+ }
7
+ return parsed.ast.anchor.id;
8
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astrale-domains/shell",
3
- "version": "0.1.0-beta.23",
3
+ "version": "0.1.0-beta.24",
4
4
  "description": "Astrale Shell Domain schema and remote product implementation",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -21,10 +21,18 @@
21
21
  "#mutations/*": "./dist/mutations/*/index.js",
22
22
  "#queries": "./dist/queries/index.js",
23
23
  "#queries/*": "./dist/queries/*/index.js",
24
- "#rules": "./dist/rules/index.js",
25
- "#rules/*": "./dist/rules/*/index.js",
26
24
  "#schema": "./dist/schema/index.js",
27
- "#schema/*": "./dist/schema/*/index.js"
25
+ "#schema/*": "./dist/schema/*/index.js",
26
+ "#integrations": "./dist/integrations/index.js",
27
+ "#integrations/*": "./dist/integrations/*/index.js",
28
+ "#providers": "./dist/providers/index.js",
29
+ "#providers/*": "./dist/providers/*/index.js",
30
+ "#utils": "./dist/utils/index.js",
31
+ "#utils/*": "./dist/utils/*/index.js",
32
+ "#ui": "./dist/ui/index.js",
33
+ "#ui/*": "./dist/ui/*/index.js",
34
+ "#views": "./dist/views/index.js",
35
+ "#views/*": "./dist/views/*/index.js"
28
36
  },
29
37
  "exports": {
30
38
  ".": {
@@ -50,15 +58,16 @@
50
58
  },
51
59
  "devDependencies": {
52
60
  "@astrale-os/ox": "0.1.4",
53
- "@astrale-os/sdk": "0.5.0-beta.109",
61
+ "@astrale-os/sdk": "0.5.0-beta.122",
54
62
  "@astrale/typescript-config": "npm:@jsr/astrale__typescript-config@~1.1.3",
55
- "@types/node": "^22.0.0",
63
+ "@types/node": "26.2.0",
64
+ "happy-dom": "20.11.2",
56
65
  "oxlint": "1.78.0",
57
66
  "typescript": "7.0.2",
58
67
  "vitest": "4.1.10"
59
68
  },
60
69
  "peerDependencies": {
61
- "@astrale-os/sdk": ">=0.5.0-beta.109 <1.0.0"
70
+ "@astrale-os/sdk": ">=0.5.0-beta.122 <1.0.0"
62
71
  },
63
72
  "devEngines": {
64
73
  "runtime": {
@@ -1,3 +0,0 @@
1
- import { type WorkflowDefinition } from '@astrale-os/sdk/workflow';
2
- import type { ShellSchema } from '../../schema/index.js';
3
- export declare const assignGroupUserWorkflow: WorkflowDefinition<typeof ShellSchema, 'Group.assignUser'>;
@@ -1,3 +0,0 @@
1
- import { defineWorkflow } from '@astrale-os/sdk/workflow';
2
- import { changeMembership } from './change.js';
3
- export const assignGroupUserWorkflow = defineWorkflow()('Group.assignUser', (context) => changeMembership(context, true));
@@ -1,6 +0,0 @@
1
- import type { WorkflowContext } from '@astrale-os/sdk/workflow';
2
- import type { S, Shell } from '../../schema/index.js';
3
- type GroupCallable = typeof S.classes.Group.self.methods.assignUser | typeof S.classes.Group.self.methods.unassignUser;
4
- type GroupContext = WorkflowContext<GroupCallable, Shell>;
5
- export declare function changeMembership(context: GroupContext, present: boolean): Promise<Readonly<Record<never, never>>>;
6
- export {};
@@ -1,41 +0,0 @@
1
- import { InvocationError } from '@astrale-os/sdk/execution';
2
- import { changeGroupMembership } from '#mutations/group';
3
- import { observeUserGroups } from '#queries/user';
4
- export async function changeMembership(context, present) {
5
- const observed = await context.step.run('observe-membership', () => context.graph.self.query(observeUserGroups, context.input.user));
6
- const current = membershipState(observed, context.self);
7
- if (matches(current, present))
8
- return Object.freeze({});
9
- const result = await context.step.run('change-membership', () => context.graph.self.mutate(changeGroupMembership, {
10
- user: context.input.user,
11
- group: context.self,
12
- present,
13
- current,
14
- guard: observed.guard,
15
- }));
16
- if (result.ok)
17
- return Object.freeze({});
18
- if (result.outcomeKnown)
19
- return membershipConflict(result.code);
20
- const recovered = await context.step.run('recover-membership', () => context.graph.self.query(observeUserGroups, context.input.user));
21
- if (matches(membershipState(recovered, context.self), present))
22
- return Object.freeze({});
23
- throw new InvocationError('BACKEND_UNAVAILABLE', 'Group membership outcome remains unknown after exact observation.', { reason: { code: result.code, details: {} } });
24
- }
25
- function membershipState(observation, group) {
26
- return Object.freeze({
27
- membership: includes(observation.groups, group),
28
- authority: includes(observation.authorities, group),
29
- });
30
- }
31
- function matches(state, present) {
32
- return state.membership === present && state.authority === present;
33
- }
34
- function includes(groups, group) {
35
- return groups.some(({ id }) => id === group);
36
- }
37
- function membershipConflict(code) {
38
- throw new InvocationError('CONFLICT', 'Group membership conflicted with concurrent graph state.', {
39
- reason: { code, details: {} },
40
- });
41
- }
@@ -1,3 +0,0 @@
1
- import { type WorkflowDefinition } from '@astrale-os/sdk/workflow';
2
- import type { ShellSchema } from '../../schema/index.js';
3
- export declare const unassignGroupUserWorkflow: WorkflowDefinition<typeof ShellSchema, 'Group.unassignUser'>;
@@ -1,3 +0,0 @@
1
- import { defineWorkflow } from '@astrale-os/sdk/workflow';
2
- import { changeMembership } from './change.js';
3
- export const unassignGroupUserWorkflow = defineWorkflow()('Group.unassignUser', (context) => changeMembership(context, false));