@lssm/lib.identity-rbac 0.0.0-canary-20251217062943 → 0.0.0-canary-20251217072406

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 (141) hide show
  1. package/dist/contracts/dist/capabilities/openbanking.js +88 -1
  2. package/dist/contracts/dist/client/index.js +5 -1
  3. package/dist/contracts/dist/client/react/feature-render.js +2 -1
  4. package/dist/contracts/dist/client/react/form-render.js +4 -1
  5. package/dist/contracts/dist/client/react/index.js +4 -1
  6. package/dist/contracts/dist/contract-registry/index.js +1 -1
  7. package/dist/contracts/dist/contract-registry/schemas.js +60 -1
  8. package/dist/contracts/dist/docs/PUBLISHING.docblock.js +16 -76
  9. package/dist/contracts/dist/docs/accessibility_wcag_compliance_specs.docblock.js +16 -350
  10. package/dist/contracts/dist/docs/index.js +29 -1
  11. package/dist/contracts/dist/docs/presentations.js +71 -1
  12. package/dist/contracts/dist/docs/registry.js +44 -1
  13. package/dist/contracts/dist/docs/tech/PHASE_1_QUICKSTART.docblock.js +16 -383
  14. package/dist/contracts/dist/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS.docblock.js +16 -68
  15. package/dist/contracts/dist/docs/tech/PHASE_3_AUTO_EVOLUTION.docblock.js +16 -140
  16. package/dist/contracts/dist/docs/tech/PHASE_4_PERSONALIZATION_ENGINE.docblock.js +16 -86
  17. package/dist/contracts/dist/docs/tech/PHASE_5_ZERO_TOUCH_OPERATIONS.docblock.js +16 -1
  18. package/dist/contracts/dist/docs/tech/auth/better-auth-nextjs.docblock.js +24 -2
  19. package/dist/contracts/dist/docs/tech/contracts/openapi-export.docblock.js +21 -2
  20. package/dist/contracts/dist/docs/tech/lifecycle-stage-system.docblock.js +16 -213
  21. package/dist/contracts/dist/docs/tech/llm/llm-integration.docblock.js +73 -5
  22. package/dist/contracts/dist/docs/tech/mcp-endpoints.docblock.js +37 -1
  23. package/dist/contracts/dist/docs/tech/presentation-runtime.docblock.js +16 -1
  24. package/dist/contracts/dist/docs/tech/schema/README.docblock.js +20 -262
  25. package/dist/contracts/dist/docs/tech/studio/learning-events.docblock.js +48 -1
  26. package/dist/contracts/dist/docs/tech/studio/learning-journeys.docblock.js +24 -2
  27. package/dist/contracts/dist/docs/tech/studio/platform-admin-panel.docblock.js +23 -2
  28. package/dist/contracts/dist/docs/tech/studio/project-access-teams.docblock.js +25 -16
  29. package/dist/contracts/dist/docs/tech/studio/project-routing.docblock.js +67 -1
  30. package/dist/contracts/dist/docs/tech/studio/sandbox-unlogged.docblock.js +22 -2
  31. package/dist/contracts/dist/docs/tech/studio/team-invitations.docblock.js +40 -36
  32. package/dist/contracts/dist/docs/tech/studio/workspace-ops.docblock.js +47 -1
  33. package/dist/contracts/dist/docs/tech/studio/workspaces.docblock.js +23 -2
  34. package/dist/contracts/dist/docs/tech/telemetry-ingest.docblock.js +36 -3
  35. package/dist/contracts/dist/docs/tech/templates/runtime.docblock.js +20 -1
  36. package/dist/contracts/dist/docs/tech/vscode-extension.docblock.js +36 -3
  37. package/dist/contracts/dist/docs/tech/workflows/overview.docblock.js +20 -1
  38. package/dist/contracts/dist/events.js +10 -1
  39. package/dist/contracts/dist/experiments/evaluator.js +1 -1
  40. package/dist/contracts/dist/index.js +71 -1
  41. package/dist/contracts/dist/install.js +2 -1
  42. package/dist/contracts/dist/integrations/contracts.js +377 -1
  43. package/dist/contracts/dist/integrations/index.js +18 -1
  44. package/dist/contracts/dist/integrations/openbanking/contracts/accounts.js +228 -1
  45. package/dist/contracts/dist/integrations/openbanking/contracts/balances.js +159 -1
  46. package/dist/contracts/dist/integrations/openbanking/contracts/index.js +3 -1
  47. package/dist/contracts/dist/integrations/openbanking/contracts/transactions.js +210 -1
  48. package/dist/contracts/dist/integrations/openbanking/models.js +242 -1
  49. package/dist/contracts/dist/integrations/openbanking/telemetry.js +13 -1
  50. package/dist/contracts/dist/integrations/providers/elevenlabs.js +52 -1
  51. package/dist/contracts/dist/integrations/providers/gcs-storage.js +75 -1
  52. package/dist/contracts/dist/integrations/providers/gmail.js +87 -1
  53. package/dist/contracts/dist/integrations/providers/google-calendar.js +66 -1
  54. package/dist/contracts/dist/integrations/providers/index.js +11 -1
  55. package/dist/contracts/dist/integrations/providers/mistral.js +68 -1
  56. package/dist/contracts/dist/integrations/providers/postmark.js +68 -1
  57. package/dist/contracts/dist/integrations/providers/powens.js +116 -1
  58. package/dist/contracts/dist/integrations/providers/qdrant.js +73 -1
  59. package/dist/contracts/dist/integrations/providers/registry.js +10 -1
  60. package/dist/contracts/dist/integrations/providers/stripe.js +83 -1
  61. package/dist/contracts/dist/integrations/providers/twilio-sms.js +61 -1
  62. package/dist/contracts/dist/jsonschema.js +1 -1
  63. package/dist/contracts/dist/knowledge/contracts.js +306 -1
  64. package/dist/contracts/dist/knowledge/index.js +7 -1
  65. package/dist/contracts/dist/knowledge/spaces/email-threads.js +34 -1
  66. package/dist/contracts/dist/knowledge/spaces/financial-docs.js +34 -1
  67. package/dist/contracts/dist/knowledge/spaces/financial-overview.js +38 -1
  68. package/dist/contracts/dist/knowledge/spaces/index.js +6 -1
  69. package/dist/contracts/dist/knowledge/spaces/product-canon.js +34 -1
  70. package/dist/contracts/dist/knowledge/spaces/support-faq.js +37 -1
  71. package/dist/contracts/dist/knowledge/spaces/uploaded-docs.js +34 -1
  72. package/dist/contracts/dist/llm/exporters.js +19 -1
  73. package/dist/contracts/dist/llm/index.js +2 -1
  74. package/dist/contracts/dist/llm/prompts.js +1 -1
  75. package/dist/contracts/dist/onboarding-base.js +196 -1
  76. package/dist/contracts/dist/openapi.js +1 -1
  77. package/dist/contracts/dist/ownership.js +21 -1
  78. package/dist/contracts/dist/presentations.js +1 -1
  79. package/dist/contracts/dist/presentations.v2.js +11 -1
  80. package/dist/contracts/dist/prompt.js +1 -1
  81. package/dist/contracts/dist/promptRegistry.js +1 -1
  82. package/dist/contracts/dist/regenerator/index.js +1 -1
  83. package/dist/contracts/dist/regenerator/service.js +6 -1
  84. package/dist/contracts/dist/registry.js +2 -1
  85. package/dist/contracts/dist/resources.js +1 -1
  86. package/dist/contracts/dist/schema/dist/EnumType.js +2 -1
  87. package/dist/contracts/dist/schema/dist/FieldType.js +49 -1
  88. package/dist/contracts/dist/schema/dist/ScalarTypeEnum.js +236 -1
  89. package/dist/contracts/dist/schema/dist/SchemaModel.js +34 -1
  90. package/dist/contracts/dist/schema/dist/entity/defineEntity.js +1 -1
  91. package/dist/contracts/dist/schema/dist/entity/index.js +2 -1
  92. package/dist/contracts/dist/schema/dist/entity/types.js +1 -1
  93. package/dist/contracts/dist/schema/dist/index.js +6 -1
  94. package/dist/contracts/dist/server/graphql-pothos.js +6 -1
  95. package/dist/contracts/dist/server/index.js +8 -1
  96. package/dist/contracts/dist/server/mcp/createMcpServer.js +4 -1
  97. package/dist/contracts/dist/server/mcp/registerPresentations.js +2 -1
  98. package/dist/contracts/dist/server/mcp/registerPrompts.js +1 -1
  99. package/dist/contracts/dist/server/mcp/registerResources.js +2 -1
  100. package/dist/contracts/dist/server/mcp/registerTools.js +1 -1
  101. package/dist/contracts/dist/server/provider-mcp.js +1 -1
  102. package/dist/contracts/dist/server/rest-elysia.js +1 -1
  103. package/dist/contracts/dist/server/rest-express.js +1 -1
  104. package/dist/contracts/dist/server/rest-generic.js +1 -1
  105. package/dist/contracts/dist/server/rest-next-app.js +1 -1
  106. package/dist/contracts/dist/server/rest-next-pages.js +1 -1
  107. package/dist/contracts/dist/spec.js +34 -1
  108. package/dist/contracts/dist/telemetry/index.js +1 -1
  109. package/dist/contracts/dist/telemetry/tracker.js +1 -1
  110. package/dist/contracts/dist/tests/index.js +1 -1
  111. package/dist/contracts/dist/tests/runner.js +2 -1
  112. package/dist/contracts/dist/workflow/index.js +1 -1
  113. package/dist/contracts/dist/workflow/runner.js +1 -1
  114. package/dist/contracts/index.js +5 -1
  115. package/dist/contracts/organization.d.ts +193 -193
  116. package/dist/contracts/organization.js +607 -1
  117. package/dist/contracts/rbac.d.ts +126 -126
  118. package/dist/contracts/rbac.js +487 -1
  119. package/dist/contracts/user.d.ts +139 -139
  120. package/dist/contracts/user.js +335 -1
  121. package/dist/entities/index.d.ts +160 -160
  122. package/dist/entities/index.js +35 -1
  123. package/dist/entities/organization.d.ts +59 -59
  124. package/dist/entities/organization.js +151 -1
  125. package/dist/entities/rbac.js +138 -1
  126. package/dist/entities/user.js +194 -1
  127. package/dist/events.d.ts +174 -174
  128. package/dist/events.js +543 -1
  129. package/dist/identity-rbac.feature.js +186 -1
  130. package/dist/index.js +14 -1
  131. package/dist/policies/engine.js +167 -1
  132. package/dist/policies/index.js +3 -1
  133. package/dist/schema/dist/EnumType.js +2 -1
  134. package/dist/schema/dist/FieldType.js +49 -1
  135. package/dist/schema/dist/ScalarTypeEnum.js +236 -1
  136. package/dist/schema/dist/SchemaModel.js +34 -1
  137. package/dist/schema/dist/entity/defineEntity.js +236 -1
  138. package/dist/schema/dist/entity/index.js +2 -1
  139. package/dist/schema/dist/entity/types.js +1 -1
  140. package/dist/schema/dist/index.js +6 -1
  141. package/package.json +5 -5
@@ -1 +1,607 @@
1
- import{l as e}from"../schema/dist/ScalarTypeEnum.js";import{t}from"../schema/dist/SchemaModel.js";import"../schema/dist/index.js";import{n,t as r}from"./dist/spec.js";import"./dist/index.js";import{SuccessResultModel as i}from"./user.js";const a=[`platform.identity-rbac`],o=new t({name:`Organization`,description:`Organization details`,fields:{id:{type:e.String_unsecure(),isOptional:!1},name:{type:e.String_unsecure(),isOptional:!1},slug:{type:e.String_unsecure(),isOptional:!0},logo:{type:e.URL(),isOptional:!0},description:{type:e.String_unsecure(),isOptional:!0},type:{type:e.String_unsecure(),isOptional:!1},onboardingCompleted:{type:e.Boolean(),isOptional:!1},createdAt:{type:e.DateTime(),isOptional:!1}}}),s=new t({name:`MemberUser`,description:`Basic user info within a member`,fields:{id:{type:e.String_unsecure(),isOptional:!1},email:{type:e.EmailAddress(),isOptional:!1},name:{type:e.String_unsecure(),isOptional:!0}}}),c=new t({name:`Member`,description:`Organization member`,fields:{id:{type:e.String_unsecure(),isOptional:!1},userId:{type:e.String_unsecure(),isOptional:!1},organizationId:{type:e.String_unsecure(),isOptional:!1},role:{type:e.String_unsecure(),isOptional:!1},createdAt:{type:e.DateTime(),isOptional:!1},user:{type:s,isOptional:!1}}}),l=new t({name:`Invitation`,description:`Organization invitation`,fields:{id:{type:e.String_unsecure(),isOptional:!1},email:{type:e.EmailAddress(),isOptional:!1},role:{type:e.String_unsecure(),isOptional:!0},status:{type:e.String_unsecure(),isOptional:!1},expiresAt:{type:e.DateTime(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1}}}),u=new t({name:`CreateOrgInput`,description:`Input for creating an organization`,fields:{name:{type:e.NonEmptyString(),isOptional:!1},slug:{type:e.String_unsecure(),isOptional:!0},description:{type:e.String_unsecure(),isOptional:!0},type:{type:e.String_unsecure(),isOptional:!0}}}),d=new t({name:`GetOrgInput`,description:`Input for getting an organization`,fields:{orgId:{type:e.String_unsecure(),isOptional:!1}}}),f=new t({name:`UpdateOrgInput`,description:`Input for updating an organization`,fields:{orgId:{type:e.String_unsecure(),isOptional:!1},name:{type:e.String_unsecure(),isOptional:!0},slug:{type:e.String_unsecure(),isOptional:!0},logo:{type:e.URL(),isOptional:!0},description:{type:e.String_unsecure(),isOptional:!0}}}),p=new t({name:`InviteMemberInput`,description:`Input for inviting a member`,fields:{orgId:{type:e.String_unsecure(),isOptional:!1},email:{type:e.EmailAddress(),isOptional:!1},role:{type:e.String_unsecure(),isOptional:!1},teamId:{type:e.String_unsecure(),isOptional:!0}}}),m=new t({name:`AcceptInviteInput`,description:`Input for accepting an invitation`,fields:{invitationId:{type:e.String_unsecure(),isOptional:!1}}}),h=new t({name:`RemoveMemberInput`,description:`Input for removing a member`,fields:{orgId:{type:e.String_unsecure(),isOptional:!1},userId:{type:e.String_unsecure(),isOptional:!1}}}),g=new t({name:`MemberRemovedPayload`,description:`Payload for member removed event`,fields:{orgId:{type:e.String_unsecure(),isOptional:!1},userId:{type:e.String_unsecure(),isOptional:!1}}}),_=new t({name:`ListMembersInput`,description:`Input for listing members`,fields:{orgId:{type:e.String_unsecure(),isOptional:!1},limit:{type:e.Int_unsecure(),isOptional:!0},offset:{type:e.Int_unsecure(),isOptional:!0}}}),v=new t({name:`ListMembersOutput`,description:`Output for listing members`,fields:{members:{type:c,isOptional:!1,isArray:!0},total:{type:e.Int_unsecure(),isOptional:!1}}}),y=new t({name:`OrganizationWithRole`,description:`Organization with user role`,fields:{id:{type:e.String_unsecure(),isOptional:!1},name:{type:e.String_unsecure(),isOptional:!1},slug:{type:e.String_unsecure(),isOptional:!0},logo:{type:e.URL(),isOptional:!0},description:{type:e.String_unsecure(),isOptional:!0},type:{type:e.String_unsecure(),isOptional:!1},onboardingCompleted:{type:e.Boolean(),isOptional:!1},createdAt:{type:e.DateTime(),isOptional:!1},role:{type:e.String_unsecure(),isOptional:!1}}}),b=new t({name:`ListUserOrgsOutput`,description:`Output for listing user organizations`,fields:{organizations:{type:y,isOptional:!1,isArray:!0}}}),x=r({meta:{name:`identity.org.create`,version:1,stability:`stable`,owners:[...a],tags:[`identity`,`org`,`create`],description:`Create a new organization.`,goal:`Allow users to create new organizations/workspaces.`,context:`Called during onboarding or when creating additional workspaces.`},io:{input:u,output:o,errors:{SLUG_EXISTS:{description:`An organization with this slug already exists`,http:409,gqlCode:`SLUG_EXISTS`,when:`Slug is already taken`}}},policy:{auth:`user`},sideEffects:{emits:[{name:`org.created`,version:1,when:`Organization is created`,payload:o}],audit:[`org.created`]}}),S=n({meta:{name:`identity.org.get`,version:1,stability:`stable`,owners:[...a],tags:[`identity`,`org`,`get`],description:`Get organization details.`,goal:`Retrieve organization information.`,context:`Called when viewing organization settings or dashboard.`},io:{input:d,output:o},policy:{auth:`user`}}),C=r({meta:{name:`identity.org.update`,version:1,stability:`stable`,owners:[...a],tags:[`identity`,`org`,`update`],description:`Update organization details.`,goal:`Allow org admins to update organization settings.`,context:`Organization settings page.`},io:{input:f,output:o},policy:{auth:`user`},sideEffects:{emits:[{name:`org.updated`,version:1,when:`Organization is updated`,payload:o}],audit:[`org.updated`]}}),w=r({meta:{name:`identity.org.invite`,version:1,stability:`stable`,owners:[...a],tags:[`identity`,`org`,`invite`,`member`],description:`Invite a user to join the organization.`,goal:`Allow org admins to invite new members.`,context:`Team management. Sends invitation email.`},io:{input:p,output:l,errors:{ALREADY_MEMBER:{description:`User is already a member of this organization`,http:409,gqlCode:`ALREADY_MEMBER`,when:`Invitee is already a member`},INVITE_PENDING:{description:`An invitation for this email is already pending`,http:409,gqlCode:`INVITE_PENDING`,when:`Active invitation exists`}}},policy:{auth:`user`},sideEffects:{emits:[{name:`org.invite.sent`,version:1,when:`Invitation is sent`,payload:l}],audit:[`org.invite.sent`]}}),T=r({meta:{name:`identity.org.invite.accept`,version:1,stability:`stable`,owners:[...a],tags:[`identity`,`org`,`invite`,`accept`],description:`Accept an organization invitation.`,goal:`Allow users to join organizations via invitation.`,context:`Called from invitation email link.`},io:{input:m,output:c,errors:{INVITE_EXPIRED:{description:`The invitation has expired`,http:410,gqlCode:`INVITE_EXPIRED`,when:`Invitation is past expiry date`},INVITE_USED:{description:`The invitation has already been used`,http:409,gqlCode:`INVITE_USED`,when:`Invitation was already accepted`}}},policy:{auth:`user`},sideEffects:{emits:[{name:`org.member.added`,version:1,when:`Member joins org`,payload:c}],audit:[`org.member.added`]}}),E=r({meta:{name:`identity.org.member.remove`,version:1,stability:`stable`,owners:[...a],tags:[`identity`,`org`,`member`,`remove`],description:`Remove a member from the organization.`,goal:`Allow org admins to remove members.`,context:`Team management.`},io:{input:h,output:i,errors:{CANNOT_REMOVE_OWNER:{description:`Cannot remove the organization owner`,http:403,gqlCode:`CANNOT_REMOVE_OWNER`,when:`Target is the org owner`}}},policy:{auth:`user`},sideEffects:{emits:[{name:`org.member.removed`,version:1,when:`Member is removed`,payload:g}],audit:[`org.member.removed`]}}),D=n({meta:{name:`identity.org.members.list`,version:1,stability:`stable`,owners:[...a],tags:[`identity`,`org`,`member`,`list`],description:`List organization members.`,goal:`View all members of an organization.`,context:`Team management page.`},io:{input:_,output:v},policy:{auth:`user`}}),O=n({meta:{name:`identity.org.list`,version:1,stability:`stable`,owners:[...a],tags:[`identity`,`org`,`list`],description:`List organizations the current user belongs to.`,goal:`Show user their organizations for workspace switching.`,context:`Workspace switcher, org selection.`},io:{input:null,output:b},policy:{auth:`user`}});export{T as AcceptInviteContract,m as AcceptInviteInputModel,x as CreateOrgContract,u as CreateOrgInputModel,S as GetOrgContract,d as GetOrgInputModel,l as InvitationModel,w as InviteMemberContract,p as InviteMemberInputModel,D as ListMembersContract,_ as ListMembersInputModel,v as ListMembersOutputModel,O as ListUserOrgsContract,b as ListUserOrgsOutputModel,c as MemberModel,g as MemberRemovedPayloadModel,s as MemberUserModel,o as OrganizationModel,y as OrganizationWithRoleModel,E as RemoveMemberContract,h as RemoveMemberInputModel,C as UpdateOrgContract,f as UpdateOrgInputModel};
1
+ import { ScalarTypeEnum } from "../schema/dist/ScalarTypeEnum.js";
2
+ import { SchemaModel } from "../schema/dist/SchemaModel.js";
3
+ import "../schema/dist/index.js";
4
+ import { defineCommand, defineQuery } from "./dist/spec.js";
5
+ import "./dist/index.js";
6
+ import { SuccessResultModel } from "./user.js";
7
+
8
+ //#region src/contracts/organization.ts
9
+ const OWNERS = ["platform.identity-rbac"];
10
+ const OrganizationModel = new SchemaModel({
11
+ name: "Organization",
12
+ description: "Organization details",
13
+ fields: {
14
+ id: {
15
+ type: ScalarTypeEnum.String_unsecure(),
16
+ isOptional: false
17
+ },
18
+ name: {
19
+ type: ScalarTypeEnum.String_unsecure(),
20
+ isOptional: false
21
+ },
22
+ slug: {
23
+ type: ScalarTypeEnum.String_unsecure(),
24
+ isOptional: true
25
+ },
26
+ logo: {
27
+ type: ScalarTypeEnum.URL(),
28
+ isOptional: true
29
+ },
30
+ description: {
31
+ type: ScalarTypeEnum.String_unsecure(),
32
+ isOptional: true
33
+ },
34
+ type: {
35
+ type: ScalarTypeEnum.String_unsecure(),
36
+ isOptional: false
37
+ },
38
+ onboardingCompleted: {
39
+ type: ScalarTypeEnum.Boolean(),
40
+ isOptional: false
41
+ },
42
+ createdAt: {
43
+ type: ScalarTypeEnum.DateTime(),
44
+ isOptional: false
45
+ }
46
+ }
47
+ });
48
+ const MemberUserModel = new SchemaModel({
49
+ name: "MemberUser",
50
+ description: "Basic user info within a member",
51
+ fields: {
52
+ id: {
53
+ type: ScalarTypeEnum.String_unsecure(),
54
+ isOptional: false
55
+ },
56
+ email: {
57
+ type: ScalarTypeEnum.EmailAddress(),
58
+ isOptional: false
59
+ },
60
+ name: {
61
+ type: ScalarTypeEnum.String_unsecure(),
62
+ isOptional: true
63
+ }
64
+ }
65
+ });
66
+ const MemberModel = new SchemaModel({
67
+ name: "Member",
68
+ description: "Organization member",
69
+ fields: {
70
+ id: {
71
+ type: ScalarTypeEnum.String_unsecure(),
72
+ isOptional: false
73
+ },
74
+ userId: {
75
+ type: ScalarTypeEnum.String_unsecure(),
76
+ isOptional: false
77
+ },
78
+ organizationId: {
79
+ type: ScalarTypeEnum.String_unsecure(),
80
+ isOptional: false
81
+ },
82
+ role: {
83
+ type: ScalarTypeEnum.String_unsecure(),
84
+ isOptional: false
85
+ },
86
+ createdAt: {
87
+ type: ScalarTypeEnum.DateTime(),
88
+ isOptional: false
89
+ },
90
+ user: {
91
+ type: MemberUserModel,
92
+ isOptional: false
93
+ }
94
+ }
95
+ });
96
+ const InvitationModel = new SchemaModel({
97
+ name: "Invitation",
98
+ description: "Organization invitation",
99
+ fields: {
100
+ id: {
101
+ type: ScalarTypeEnum.String_unsecure(),
102
+ isOptional: false
103
+ },
104
+ email: {
105
+ type: ScalarTypeEnum.EmailAddress(),
106
+ isOptional: false
107
+ },
108
+ role: {
109
+ type: ScalarTypeEnum.String_unsecure(),
110
+ isOptional: true
111
+ },
112
+ status: {
113
+ type: ScalarTypeEnum.String_unsecure(),
114
+ isOptional: false
115
+ },
116
+ expiresAt: {
117
+ type: ScalarTypeEnum.DateTime(),
118
+ isOptional: true
119
+ },
120
+ createdAt: {
121
+ type: ScalarTypeEnum.DateTime(),
122
+ isOptional: false
123
+ }
124
+ }
125
+ });
126
+ const CreateOrgInputModel = new SchemaModel({
127
+ name: "CreateOrgInput",
128
+ description: "Input for creating an organization",
129
+ fields: {
130
+ name: {
131
+ type: ScalarTypeEnum.NonEmptyString(),
132
+ isOptional: false
133
+ },
134
+ slug: {
135
+ type: ScalarTypeEnum.String_unsecure(),
136
+ isOptional: true
137
+ },
138
+ description: {
139
+ type: ScalarTypeEnum.String_unsecure(),
140
+ isOptional: true
141
+ },
142
+ type: {
143
+ type: ScalarTypeEnum.String_unsecure(),
144
+ isOptional: true
145
+ }
146
+ }
147
+ });
148
+ const GetOrgInputModel = new SchemaModel({
149
+ name: "GetOrgInput",
150
+ description: "Input for getting an organization",
151
+ fields: { orgId: {
152
+ type: ScalarTypeEnum.String_unsecure(),
153
+ isOptional: false
154
+ } }
155
+ });
156
+ const UpdateOrgInputModel = new SchemaModel({
157
+ name: "UpdateOrgInput",
158
+ description: "Input for updating an organization",
159
+ fields: {
160
+ orgId: {
161
+ type: ScalarTypeEnum.String_unsecure(),
162
+ isOptional: false
163
+ },
164
+ name: {
165
+ type: ScalarTypeEnum.String_unsecure(),
166
+ isOptional: true
167
+ },
168
+ slug: {
169
+ type: ScalarTypeEnum.String_unsecure(),
170
+ isOptional: true
171
+ },
172
+ logo: {
173
+ type: ScalarTypeEnum.URL(),
174
+ isOptional: true
175
+ },
176
+ description: {
177
+ type: ScalarTypeEnum.String_unsecure(),
178
+ isOptional: true
179
+ }
180
+ }
181
+ });
182
+ const InviteMemberInputModel = new SchemaModel({
183
+ name: "InviteMemberInput",
184
+ description: "Input for inviting a member",
185
+ fields: {
186
+ orgId: {
187
+ type: ScalarTypeEnum.String_unsecure(),
188
+ isOptional: false
189
+ },
190
+ email: {
191
+ type: ScalarTypeEnum.EmailAddress(),
192
+ isOptional: false
193
+ },
194
+ role: {
195
+ type: ScalarTypeEnum.String_unsecure(),
196
+ isOptional: false
197
+ },
198
+ teamId: {
199
+ type: ScalarTypeEnum.String_unsecure(),
200
+ isOptional: true
201
+ }
202
+ }
203
+ });
204
+ const AcceptInviteInputModel = new SchemaModel({
205
+ name: "AcceptInviteInput",
206
+ description: "Input for accepting an invitation",
207
+ fields: { invitationId: {
208
+ type: ScalarTypeEnum.String_unsecure(),
209
+ isOptional: false
210
+ } }
211
+ });
212
+ const RemoveMemberInputModel = new SchemaModel({
213
+ name: "RemoveMemberInput",
214
+ description: "Input for removing a member",
215
+ fields: {
216
+ orgId: {
217
+ type: ScalarTypeEnum.String_unsecure(),
218
+ isOptional: false
219
+ },
220
+ userId: {
221
+ type: ScalarTypeEnum.String_unsecure(),
222
+ isOptional: false
223
+ }
224
+ }
225
+ });
226
+ const MemberRemovedPayloadModel = new SchemaModel({
227
+ name: "MemberRemovedPayload",
228
+ description: "Payload for member removed event",
229
+ fields: {
230
+ orgId: {
231
+ type: ScalarTypeEnum.String_unsecure(),
232
+ isOptional: false
233
+ },
234
+ userId: {
235
+ type: ScalarTypeEnum.String_unsecure(),
236
+ isOptional: false
237
+ }
238
+ }
239
+ });
240
+ const ListMembersInputModel = new SchemaModel({
241
+ name: "ListMembersInput",
242
+ description: "Input for listing members",
243
+ fields: {
244
+ orgId: {
245
+ type: ScalarTypeEnum.String_unsecure(),
246
+ isOptional: false
247
+ },
248
+ limit: {
249
+ type: ScalarTypeEnum.Int_unsecure(),
250
+ isOptional: true
251
+ },
252
+ offset: {
253
+ type: ScalarTypeEnum.Int_unsecure(),
254
+ isOptional: true
255
+ }
256
+ }
257
+ });
258
+ const ListMembersOutputModel = new SchemaModel({
259
+ name: "ListMembersOutput",
260
+ description: "Output for listing members",
261
+ fields: {
262
+ members: {
263
+ type: MemberModel,
264
+ isOptional: false,
265
+ isArray: true
266
+ },
267
+ total: {
268
+ type: ScalarTypeEnum.Int_unsecure(),
269
+ isOptional: false
270
+ }
271
+ }
272
+ });
273
+ const OrganizationWithRoleModel = new SchemaModel({
274
+ name: "OrganizationWithRole",
275
+ description: "Organization with user role",
276
+ fields: {
277
+ id: {
278
+ type: ScalarTypeEnum.String_unsecure(),
279
+ isOptional: false
280
+ },
281
+ name: {
282
+ type: ScalarTypeEnum.String_unsecure(),
283
+ isOptional: false
284
+ },
285
+ slug: {
286
+ type: ScalarTypeEnum.String_unsecure(),
287
+ isOptional: true
288
+ },
289
+ logo: {
290
+ type: ScalarTypeEnum.URL(),
291
+ isOptional: true
292
+ },
293
+ description: {
294
+ type: ScalarTypeEnum.String_unsecure(),
295
+ isOptional: true
296
+ },
297
+ type: {
298
+ type: ScalarTypeEnum.String_unsecure(),
299
+ isOptional: false
300
+ },
301
+ onboardingCompleted: {
302
+ type: ScalarTypeEnum.Boolean(),
303
+ isOptional: false
304
+ },
305
+ createdAt: {
306
+ type: ScalarTypeEnum.DateTime(),
307
+ isOptional: false
308
+ },
309
+ role: {
310
+ type: ScalarTypeEnum.String_unsecure(),
311
+ isOptional: false
312
+ }
313
+ }
314
+ });
315
+ const ListUserOrgsOutputModel = new SchemaModel({
316
+ name: "ListUserOrgsOutput",
317
+ description: "Output for listing user organizations",
318
+ fields: { organizations: {
319
+ type: OrganizationWithRoleModel,
320
+ isOptional: false,
321
+ isArray: true
322
+ } }
323
+ });
324
+ /**
325
+ * Create a new organization.
326
+ */
327
+ const CreateOrgContract = defineCommand({
328
+ meta: {
329
+ name: "identity.org.create",
330
+ version: 1,
331
+ stability: "stable",
332
+ owners: [...OWNERS],
333
+ tags: [
334
+ "identity",
335
+ "org",
336
+ "create"
337
+ ],
338
+ description: "Create a new organization.",
339
+ goal: "Allow users to create new organizations/workspaces.",
340
+ context: "Called during onboarding or when creating additional workspaces."
341
+ },
342
+ io: {
343
+ input: CreateOrgInputModel,
344
+ output: OrganizationModel,
345
+ errors: { SLUG_EXISTS: {
346
+ description: "An organization with this slug already exists",
347
+ http: 409,
348
+ gqlCode: "SLUG_EXISTS",
349
+ when: "Slug is already taken"
350
+ } }
351
+ },
352
+ policy: { auth: "user" },
353
+ sideEffects: {
354
+ emits: [{
355
+ name: "org.created",
356
+ version: 1,
357
+ when: "Organization is created",
358
+ payload: OrganizationModel
359
+ }],
360
+ audit: ["org.created"]
361
+ }
362
+ });
363
+ /**
364
+ * Get organization details.
365
+ */
366
+ const GetOrgContract = defineQuery({
367
+ meta: {
368
+ name: "identity.org.get",
369
+ version: 1,
370
+ stability: "stable",
371
+ owners: [...OWNERS],
372
+ tags: [
373
+ "identity",
374
+ "org",
375
+ "get"
376
+ ],
377
+ description: "Get organization details.",
378
+ goal: "Retrieve organization information.",
379
+ context: "Called when viewing organization settings or dashboard."
380
+ },
381
+ io: {
382
+ input: GetOrgInputModel,
383
+ output: OrganizationModel
384
+ },
385
+ policy: { auth: "user" }
386
+ });
387
+ /**
388
+ * Update organization.
389
+ */
390
+ const UpdateOrgContract = defineCommand({
391
+ meta: {
392
+ name: "identity.org.update",
393
+ version: 1,
394
+ stability: "stable",
395
+ owners: [...OWNERS],
396
+ tags: [
397
+ "identity",
398
+ "org",
399
+ "update"
400
+ ],
401
+ description: "Update organization details.",
402
+ goal: "Allow org admins to update organization settings.",
403
+ context: "Organization settings page."
404
+ },
405
+ io: {
406
+ input: UpdateOrgInputModel,
407
+ output: OrganizationModel
408
+ },
409
+ policy: { auth: "user" },
410
+ sideEffects: {
411
+ emits: [{
412
+ name: "org.updated",
413
+ version: 1,
414
+ when: "Organization is updated",
415
+ payload: OrganizationModel
416
+ }],
417
+ audit: ["org.updated"]
418
+ }
419
+ });
420
+ /**
421
+ * Invite a member to the organization.
422
+ */
423
+ const InviteMemberContract = defineCommand({
424
+ meta: {
425
+ name: "identity.org.invite",
426
+ version: 1,
427
+ stability: "stable",
428
+ owners: [...OWNERS],
429
+ tags: [
430
+ "identity",
431
+ "org",
432
+ "invite",
433
+ "member"
434
+ ],
435
+ description: "Invite a user to join the organization.",
436
+ goal: "Allow org admins to invite new members.",
437
+ context: "Team management. Sends invitation email."
438
+ },
439
+ io: {
440
+ input: InviteMemberInputModel,
441
+ output: InvitationModel,
442
+ errors: {
443
+ ALREADY_MEMBER: {
444
+ description: "User is already a member of this organization",
445
+ http: 409,
446
+ gqlCode: "ALREADY_MEMBER",
447
+ when: "Invitee is already a member"
448
+ },
449
+ INVITE_PENDING: {
450
+ description: "An invitation for this email is already pending",
451
+ http: 409,
452
+ gqlCode: "INVITE_PENDING",
453
+ when: "Active invitation exists"
454
+ }
455
+ }
456
+ },
457
+ policy: { auth: "user" },
458
+ sideEffects: {
459
+ emits: [{
460
+ name: "org.invite.sent",
461
+ version: 1,
462
+ when: "Invitation is sent",
463
+ payload: InvitationModel
464
+ }],
465
+ audit: ["org.invite.sent"]
466
+ }
467
+ });
468
+ /**
469
+ * Accept an invitation.
470
+ */
471
+ const AcceptInviteContract = defineCommand({
472
+ meta: {
473
+ name: "identity.org.invite.accept",
474
+ version: 1,
475
+ stability: "stable",
476
+ owners: [...OWNERS],
477
+ tags: [
478
+ "identity",
479
+ "org",
480
+ "invite",
481
+ "accept"
482
+ ],
483
+ description: "Accept an organization invitation.",
484
+ goal: "Allow users to join organizations via invitation.",
485
+ context: "Called from invitation email link."
486
+ },
487
+ io: {
488
+ input: AcceptInviteInputModel,
489
+ output: MemberModel,
490
+ errors: {
491
+ INVITE_EXPIRED: {
492
+ description: "The invitation has expired",
493
+ http: 410,
494
+ gqlCode: "INVITE_EXPIRED",
495
+ when: "Invitation is past expiry date"
496
+ },
497
+ INVITE_USED: {
498
+ description: "The invitation has already been used",
499
+ http: 409,
500
+ gqlCode: "INVITE_USED",
501
+ when: "Invitation was already accepted"
502
+ }
503
+ }
504
+ },
505
+ policy: { auth: "user" },
506
+ sideEffects: {
507
+ emits: [{
508
+ name: "org.member.added",
509
+ version: 1,
510
+ when: "Member joins org",
511
+ payload: MemberModel
512
+ }],
513
+ audit: ["org.member.added"]
514
+ }
515
+ });
516
+ /**
517
+ * Remove a member from the organization.
518
+ */
519
+ const RemoveMemberContract = defineCommand({
520
+ meta: {
521
+ name: "identity.org.member.remove",
522
+ version: 1,
523
+ stability: "stable",
524
+ owners: [...OWNERS],
525
+ tags: [
526
+ "identity",
527
+ "org",
528
+ "member",
529
+ "remove"
530
+ ],
531
+ description: "Remove a member from the organization.",
532
+ goal: "Allow org admins to remove members.",
533
+ context: "Team management."
534
+ },
535
+ io: {
536
+ input: RemoveMemberInputModel,
537
+ output: SuccessResultModel,
538
+ errors: { CANNOT_REMOVE_OWNER: {
539
+ description: "Cannot remove the organization owner",
540
+ http: 403,
541
+ gqlCode: "CANNOT_REMOVE_OWNER",
542
+ when: "Target is the org owner"
543
+ } }
544
+ },
545
+ policy: { auth: "user" },
546
+ sideEffects: {
547
+ emits: [{
548
+ name: "org.member.removed",
549
+ version: 1,
550
+ when: "Member is removed",
551
+ payload: MemberRemovedPayloadModel
552
+ }],
553
+ audit: ["org.member.removed"]
554
+ }
555
+ });
556
+ /**
557
+ * List organization members.
558
+ */
559
+ const ListMembersContract = defineQuery({
560
+ meta: {
561
+ name: "identity.org.members.list",
562
+ version: 1,
563
+ stability: "stable",
564
+ owners: [...OWNERS],
565
+ tags: [
566
+ "identity",
567
+ "org",
568
+ "member",
569
+ "list"
570
+ ],
571
+ description: "List organization members.",
572
+ goal: "View all members of an organization.",
573
+ context: "Team management page."
574
+ },
575
+ io: {
576
+ input: ListMembersInputModel,
577
+ output: ListMembersOutputModel
578
+ },
579
+ policy: { auth: "user" }
580
+ });
581
+ /**
582
+ * List user's organizations.
583
+ */
584
+ const ListUserOrgsContract = defineQuery({
585
+ meta: {
586
+ name: "identity.org.list",
587
+ version: 1,
588
+ stability: "stable",
589
+ owners: [...OWNERS],
590
+ tags: [
591
+ "identity",
592
+ "org",
593
+ "list"
594
+ ],
595
+ description: "List organizations the current user belongs to.",
596
+ goal: "Show user their organizations for workspace switching.",
597
+ context: "Workspace switcher, org selection."
598
+ },
599
+ io: {
600
+ input: null,
601
+ output: ListUserOrgsOutputModel
602
+ },
603
+ policy: { auth: "user" }
604
+ });
605
+
606
+ //#endregion
607
+ export { AcceptInviteContract, AcceptInviteInputModel, CreateOrgContract, CreateOrgInputModel, GetOrgContract, GetOrgInputModel, InvitationModel, InviteMemberContract, InviteMemberInputModel, ListMembersContract, ListMembersInputModel, ListMembersOutputModel, ListUserOrgsContract, ListUserOrgsOutputModel, MemberModel, MemberRemovedPayloadModel, MemberUserModel, OrganizationModel, OrganizationWithRoleModel, RemoveMemberContract, RemoveMemberInputModel, UpdateOrgContract, UpdateOrgInputModel };