@portaidentity/sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/README.md +224 -0
  2. package/dist/agent.d.ts +42 -0
  3. package/dist/agent.d.ts.map +1 -0
  4. package/dist/agent.js +146 -0
  5. package/dist/agent.js.map +1 -0
  6. package/dist/auth/cli-auth.d.ts +83 -0
  7. package/dist/auth/cli-auth.d.ts.map +1 -0
  8. package/dist/auth/cli-auth.js +188 -0
  9. package/dist/auth/cli-auth.js.map +1 -0
  10. package/dist/auth/client-credentials-auth.d.ts +54 -0
  11. package/dist/auth/client-credentials-auth.d.ts.map +1 -0
  12. package/dist/auth/client-credentials-auth.js +147 -0
  13. package/dist/auth/client-credentials-auth.js.map +1 -0
  14. package/dist/auth/index.d.ts +20 -0
  15. package/dist/auth/index.d.ts.map +1 -0
  16. package/dist/auth/index.js +16 -0
  17. package/dist/auth/index.js.map +1 -0
  18. package/dist/auth/token-auth.d.ts +40 -0
  19. package/dist/auth/token-auth.d.ts.map +1 -0
  20. package/dist/auth/token-auth.js +44 -0
  21. package/dist/auth/token-auth.js.map +1 -0
  22. package/dist/auth/types.d.ts +28 -0
  23. package/dist/auth/types.d.ts.map +1 -0
  24. package/dist/auth/types.js +11 -0
  25. package/dist/auth/types.js.map +1 -0
  26. package/dist/browser.d.ts +12 -0
  27. package/dist/browser.d.ts.map +1 -0
  28. package/dist/browser.js +12 -0
  29. package/dist/browser.js.map +1 -0
  30. package/dist/client.d.ts +52 -0
  31. package/dist/client.d.ts.map +1 -0
  32. package/dist/client.js +52 -0
  33. package/dist/client.js.map +1 -0
  34. package/dist/domains/applications.d.ts +23 -0
  35. package/dist/domains/applications.d.ts.map +1 -0
  36. package/dist/domains/applications.js +59 -0
  37. package/dist/domains/applications.js.map +1 -0
  38. package/dist/domains/audit.d.ts +13 -0
  39. package/dist/domains/audit.d.ts.map +1 -0
  40. package/dist/domains/audit.js +19 -0
  41. package/dist/domains/audit.js.map +1 -0
  42. package/dist/domains/branding.d.ts +16 -0
  43. package/dist/domains/branding.d.ts.map +1 -0
  44. package/dist/domains/branding.js +29 -0
  45. package/dist/domains/branding.js.map +1 -0
  46. package/dist/domains/bulk.d.ts +12 -0
  47. package/dist/domains/bulk.d.ts.map +1 -0
  48. package/dist/domains/bulk.js +14 -0
  49. package/dist/domains/bulk.js.map +1 -0
  50. package/dist/domains/clients.d.ts +22 -0
  51. package/dist/domains/clients.d.ts.map +1 -0
  52. package/dist/domains/clients.js +55 -0
  53. package/dist/domains/clients.js.map +1 -0
  54. package/dist/domains/config.d.ts +14 -0
  55. package/dist/domains/config.d.ts.map +1 -0
  56. package/dist/domains/config.js +23 -0
  57. package/dist/domains/config.js.map +1 -0
  58. package/dist/domains/custom-claims.d.ts +17 -0
  59. package/dist/domains/custom-claims.d.ts.map +1 -0
  60. package/dist/domains/custom-claims.js +35 -0
  61. package/dist/domains/custom-claims.js.map +1 -0
  62. package/dist/domains/exports.d.ts +12 -0
  63. package/dist/domains/exports.d.ts.map +1 -0
  64. package/dist/domains/exports.js +20 -0
  65. package/dist/domains/exports.js.map +1 -0
  66. package/dist/domains/helpers.d.ts +27 -0
  67. package/dist/domains/helpers.d.ts.map +1 -0
  68. package/dist/domains/helpers.js +46 -0
  69. package/dist/domains/helpers.js.map +1 -0
  70. package/dist/domains/imports.d.ts +12 -0
  71. package/dist/domains/imports.d.ts.map +1 -0
  72. package/dist/domains/imports.js +14 -0
  73. package/dist/domains/imports.js.map +1 -0
  74. package/dist/domains/index.d.ts +45 -0
  75. package/dist/domains/index.d.ts.map +1 -0
  76. package/dist/domains/index.js +46 -0
  77. package/dist/domains/index.js.map +1 -0
  78. package/dist/domains/keys.d.ts +14 -0
  79. package/dist/domains/keys.d.ts.map +1 -0
  80. package/dist/domains/keys.js +23 -0
  81. package/dist/domains/keys.js.map +1 -0
  82. package/dist/domains/organizations.d.ts +33 -0
  83. package/dist/domains/organizations.d.ts.map +1 -0
  84. package/dist/domains/organizations.js +69 -0
  85. package/dist/domains/organizations.js.map +1 -0
  86. package/dist/domains/permissions.d.ts +16 -0
  87. package/dist/domains/permissions.d.ts.map +1 -0
  88. package/dist/domains/permissions.js +31 -0
  89. package/dist/domains/permissions.js.map +1 -0
  90. package/dist/domains/roles.d.ts +19 -0
  91. package/dist/domains/roles.d.ts.map +1 -0
  92. package/dist/domains/roles.js +41 -0
  93. package/dist/domains/roles.js.map +1 -0
  94. package/dist/domains/sessions.d.ts +17 -0
  95. package/dist/domains/sessions.d.ts.map +1 -0
  96. package/dist/domains/sessions.js +28 -0
  97. package/dist/domains/sessions.js.map +1 -0
  98. package/dist/domains/stats.d.ts +12 -0
  99. package/dist/domains/stats.d.ts.map +1 -0
  100. package/dist/domains/stats.js +14 -0
  101. package/dist/domains/stats.js.map +1 -0
  102. package/dist/domains/two-factor.d.ts +14 -0
  103. package/dist/domains/two-factor.d.ts.map +1 -0
  104. package/dist/domains/two-factor.js +24 -0
  105. package/dist/domains/two-factor.js.map +1 -0
  106. package/dist/domains/user-claims.d.ts +14 -0
  107. package/dist/domains/user-claims.d.ts.map +1 -0
  108. package/dist/domains/user-claims.js +24 -0
  109. package/dist/domains/user-claims.js.map +1 -0
  110. package/dist/domains/user-roles.d.ts +14 -0
  111. package/dist/domains/user-roles.d.ts.map +1 -0
  112. package/dist/domains/user-roles.js +24 -0
  113. package/dist/domains/user-roles.js.map +1 -0
  114. package/dist/domains/users.d.ts +25 -0
  115. package/dist/domains/users.d.ts.map +1 -0
  116. package/dist/domains/users.js +67 -0
  117. package/dist/domains/users.js.map +1 -0
  118. package/dist/errors/index.d.ts +110 -0
  119. package/dist/errors/index.d.ts.map +1 -0
  120. package/dist/errors/index.js +206 -0
  121. package/dist/errors/index.js.map +1 -0
  122. package/dist/index.d.ts +24 -0
  123. package/dist/index.d.ts.map +1 -0
  124. package/dist/index.js +22 -0
  125. package/dist/index.js.map +1 -0
  126. package/dist/node.d.ts +14 -0
  127. package/dist/node.d.ts.map +1 -0
  128. package/dist/node.js +12 -0
  129. package/dist/node.js.map +1 -0
  130. package/dist/pagination/index.d.ts +87 -0
  131. package/dist/pagination/index.d.ts.map +1 -0
  132. package/dist/pagination/index.js +67 -0
  133. package/dist/pagination/index.js.map +1 -0
  134. package/dist/transport/browser-transport.d.ts +64 -0
  135. package/dist/transport/browser-transport.d.ts.map +1 -0
  136. package/dist/transport/browser-transport.js +96 -0
  137. package/dist/transport/browser-transport.js.map +1 -0
  138. package/dist/transport/node-transport.d.ts +51 -0
  139. package/dist/transport/node-transport.d.ts.map +1 -0
  140. package/dist/transport/node-transport.js +108 -0
  141. package/dist/transport/node-transport.js.map +1 -0
  142. package/dist/transport/types.d.ts +84 -0
  143. package/dist/transport/types.d.ts.map +1 -0
  144. package/dist/transport/types.js +13 -0
  145. package/dist/transport/types.js.map +1 -0
  146. package/dist/transport/utils.d.ts +78 -0
  147. package/dist/transport/utils.d.ts.map +1 -0
  148. package/dist/transport/utils.js +126 -0
  149. package/dist/transport/utils.js.map +1 -0
  150. package/dist/types/applications.d.ts +48 -0
  151. package/dist/types/applications.d.ts.map +1 -0
  152. package/dist/types/applications.js +7 -0
  153. package/dist/types/applications.js.map +1 -0
  154. package/dist/types/audit.d.ts +31 -0
  155. package/dist/types/audit.d.ts.map +1 -0
  156. package/dist/types/audit.js +7 -0
  157. package/dist/types/audit.js.map +1 -0
  158. package/dist/types/branding.d.ts +13 -0
  159. package/dist/types/branding.d.ts.map +1 -0
  160. package/dist/types/branding.js +7 -0
  161. package/dist/types/branding.js.map +1 -0
  162. package/dist/types/bulk.d.ts +22 -0
  163. package/dist/types/bulk.d.ts.map +1 -0
  164. package/dist/types/bulk.js +7 -0
  165. package/dist/types/bulk.js.map +1 -0
  166. package/dist/types/clients.d.ts +70 -0
  167. package/dist/types/clients.d.ts.map +1 -0
  168. package/dist/types/clients.js +7 -0
  169. package/dist/types/clients.js.map +1 -0
  170. package/dist/types/common.d.ts +75 -0
  171. package/dist/types/common.d.ts.map +1 -0
  172. package/dist/types/common.js +7 -0
  173. package/dist/types/common.js.map +1 -0
  174. package/dist/types/config.d.ts +15 -0
  175. package/dist/types/config.d.ts.map +1 -0
  176. package/dist/types/config.js +7 -0
  177. package/dist/types/config.js.map +1 -0
  178. package/dist/types/custom-claims.d.ts +48 -0
  179. package/dist/types/custom-claims.d.ts.map +1 -0
  180. package/dist/types/custom-claims.js +7 -0
  181. package/dist/types/custom-claims.js.map +1 -0
  182. package/dist/types/exports.d.ts +14 -0
  183. package/dist/types/exports.d.ts.map +1 -0
  184. package/dist/types/exports.js +7 -0
  185. package/dist/types/exports.js.map +1 -0
  186. package/dist/types/imports.d.ts +31 -0
  187. package/dist/types/imports.d.ts.map +1 -0
  188. package/dist/types/imports.js +7 -0
  189. package/dist/types/imports.js.map +1 -0
  190. package/dist/types/index.d.ts +26 -0
  191. package/dist/types/index.d.ts.map +1 -0
  192. package/dist/types/index.js +7 -0
  193. package/dist/types/index.js.map +1 -0
  194. package/dist/types/keys.d.ts +14 -0
  195. package/dist/types/keys.d.ts.map +1 -0
  196. package/dist/types/keys.js +7 -0
  197. package/dist/types/keys.js.map +1 -0
  198. package/dist/types/organizations.d.ts +47 -0
  199. package/dist/types/organizations.d.ts.map +1 -0
  200. package/dist/types/organizations.js +7 -0
  201. package/dist/types/organizations.js.map +1 -0
  202. package/dist/types/permissions.d.ts +23 -0
  203. package/dist/types/permissions.d.ts.map +1 -0
  204. package/dist/types/permissions.js +7 -0
  205. package/dist/types/permissions.js.map +1 -0
  206. package/dist/types/roles.d.ts +30 -0
  207. package/dist/types/roles.d.ts.map +1 -0
  208. package/dist/types/roles.js +7 -0
  209. package/dist/types/roles.js.map +1 -0
  210. package/dist/types/sessions.d.ts +25 -0
  211. package/dist/types/sessions.d.ts.map +1 -0
  212. package/dist/types/sessions.js +7 -0
  213. package/dist/types/sessions.js.map +1 -0
  214. package/dist/types/stats.d.ts +18 -0
  215. package/dist/types/stats.d.ts.map +1 -0
  216. package/dist/types/stats.js +7 -0
  217. package/dist/types/stats.js.map +1 -0
  218. package/dist/types/two-factor.d.ts +14 -0
  219. package/dist/types/two-factor.d.ts.map +1 -0
  220. package/dist/types/two-factor.js +7 -0
  221. package/dist/types/two-factor.js.map +1 -0
  222. package/dist/types/user-claims.d.ts +16 -0
  223. package/dist/types/user-claims.d.ts.map +1 -0
  224. package/dist/types/user-claims.js +7 -0
  225. package/dist/types/user-claims.js.map +1 -0
  226. package/dist/types/user-roles.d.ts +17 -0
  227. package/dist/types/user-roles.d.ts.map +1 -0
  228. package/dist/types/user-roles.js +7 -0
  229. package/dist/types/user-roles.js.map +1 -0
  230. package/dist/types/users.d.ts +53 -0
  231. package/dist/types/users.d.ts.map +1 -0
  232. package/dist/types/users.js +7 -0
  233. package/dist/types/users.js.map +1 -0
  234. package/dist/version.d.ts +9 -0
  235. package/dist/version.d.ts.map +1 -0
  236. package/dist/version.js +9 -0
  237. package/dist/version.js.map +1 -0
  238. package/package.json +51 -0
package/README.md ADDED
@@ -0,0 +1,224 @@
1
+ # @portaidentity/sdk
2
+
3
+ Universal TypeScript SDK for the Porta Admin API — works in **browsers**, **Node.js**, and **AI agents**.
4
+
5
+ ## Features
6
+
7
+ - **Transport abstraction** — `BrowserTransport` (CSRF cookies) and `NodeTransport` (Bearer tokens) with pluggable auth
8
+ - **19 domain namespaces** — Organizations, Applications, Clients, Users, Roles, Permissions, Custom Claims, Config, Keys, Audit, Stats, Sessions, Bulk, Branding, Exports, Two-Factor, Imports, User Roles, User Claims
9
+ - **Full TypeScript types** — SDK-owned type definitions for all entities, inputs, and responses
10
+ - **Pagination helpers** — `listAll()` auto-pagination and cursor-based support
11
+ - **Error hierarchy** — Typed errors (`PortaNotFoundError`, `PortaConflictError`, etc.) with HTTP status mapping
12
+ - **AI agent integration** — Tool definitions and `executeTool()` dispatcher for MCP/LLM integration
13
+ - **Zero runtime dependencies** — Uses only `fetch` (built into Node 22+ and browsers)
14
+
15
+ ## Installation
16
+
17
+ ```bash
18
+ # From the Porta project root (workspace dependency)
19
+ yarn add @portaidentity/sdk
20
+
21
+ # Or reference as file dependency
22
+ "@portaidentity/sdk": "file:../packages/porta-sdk"
23
+ ```
24
+
25
+ ## Quick Start
26
+
27
+ ### Browser (Admin GUI / BFF)
28
+
29
+ ```typescript
30
+ import { createPortaClient, createBrowserTransport } from '@portaidentity/sdk/browser';
31
+
32
+ const transport = createBrowserTransport({
33
+ baseUrl: '/api/admin', // BFF proxy path
34
+ csrfCookieName: '_csrf', // CSRF cookie name
35
+ csrfHeaderName: 'x-csrf-token',
36
+ on401: () => window.location.href = '/login',
37
+ });
38
+
39
+ const client = createPortaClient(transport);
40
+
41
+ // List organizations
42
+ const orgs = await client.organizations.list({ page: 1, pageSize: 20 });
43
+
44
+ // Create a user
45
+ const user = await client.users.create('org-id', {
46
+ email: 'user@example.com',
47
+ givenName: 'Jane',
48
+ familyName: 'Doe',
49
+ });
50
+ ```
51
+
52
+ ### Node.js (Automation / CLI)
53
+
54
+ ```typescript
55
+ import { createPortaClient, createNodeTransport, createTokenAuth } from '@portaidentity/sdk/node';
56
+
57
+ const auth = createTokenAuth('your-bearer-token');
58
+
59
+ const transport = createNodeTransport({
60
+ baseUrl: 'https://porta.local:3443/api/admin',
61
+ auth,
62
+ });
63
+
64
+ const client = createPortaClient(transport);
65
+
66
+ // List all organizations (auto-pagination)
67
+ const allOrgs = await client.organizations.listAll();
68
+
69
+ // Suspend a user
70
+ await client.users.suspend('org-id', 'user-id');
71
+
72
+ // Assign a role
73
+ await client.userRoles.assign('org-id', 'user-id', { roleId: 'role-id' });
74
+ ```
75
+
76
+ ### Client Credentials (Server-to-Server)
77
+
78
+ ```typescript
79
+ import { createPortaClient, createNodeTransport, createClientCredentialsAuth } from '@portaidentity/sdk/node';
80
+
81
+ const auth = createClientCredentialsAuth({
82
+ tokenUrl: 'https://porta.local:3443/super-admin/oidc/token',
83
+ clientId: 'my-service',
84
+ clientSecret: 'my-secret',
85
+ scope: 'openid',
86
+ });
87
+
88
+ const transport = createNodeTransport({
89
+ baseUrl: 'https://porta.local:3443/api/admin',
90
+ auth,
91
+ });
92
+
93
+ const client = createPortaClient(transport);
94
+ ```
95
+
96
+ ### AI Agent Integration
97
+
98
+ ```typescript
99
+ import { createPortaClient, getToolDefinitions, executeTool } from '@portaidentity/sdk/agent';
100
+ import { createNodeTransport, createTokenAuth } from '@portaidentity/sdk/node';
101
+
102
+ // Get tool definitions for LLM function calling
103
+ const tools = getToolDefinitions();
104
+ // → [{ name: 'organizations.list', description: '...', parameters: [...] }, ...]
105
+
106
+ // Execute a tool call from an AI agent
107
+ const client = createPortaClient(
108
+ createNodeTransport({ baseUrl: '...', auth: createTokenAuth('...') })
109
+ );
110
+
111
+ const result = await executeTool(client, 'organizations.list', { page: 1 });
112
+ ```
113
+
114
+ ## Domain Namespaces
115
+
116
+ | Namespace | Methods | Description |
117
+ |-----------|---------|-------------|
118
+ | `organizations` | 12 | CRUD, status lifecycle, slug validation, history |
119
+ | `applications` | 13 | CRUD, status, modules management, history |
120
+ | `clients` | 12 | CRUD, status, secret management, history |
121
+ | `users` | 19 | CRUD, 6 status transitions, password, email, export, purge |
122
+ | `roles` | 9 | CRUD, archive, permission assignment |
123
+ | `permissions` | 6 | CRUD, archive |
124
+ | `userRoles` | 3 | List, assign, remove role assignments |
125
+ | `userClaims` | 3 | List, set, remove claim values |
126
+ | `customClaims` | 6 | Claim definitions CRUD, archive |
127
+ | `config` | 3 | System configuration get/set/list |
128
+ | `keys` | 3 | Signing key list/generate/rotate |
129
+ | `audit` | 1 | Audit log listing with filters |
130
+ | `stats` | 1 | Dashboard statistics |
131
+ | `sessions` | 3 | Session listing and revocation |
132
+ | `bulk` | 1 | Bulk status operations |
133
+ | `branding` | 5 | Org branding settings and asset management |
134
+ | `exports` | 1 | CSV/JSON data export |
135
+ | `twoFactor` | 3 | 2FA status, disable, reset |
136
+ | `imports` | 1 | Declarative provisioning |
137
+
138
+ ## Auth Providers
139
+
140
+ | Provider | Use Case |
141
+ |----------|----------|
142
+ | `createTokenAuth(token)` | Static Bearer token (scripts, testing) |
143
+ | `createClientCredentialsAuth(opts)` | Server-to-server OAuth2 (with caching and concurrent dedup) |
144
+ | `createCliAuth(opts)` | CLI credentials file (`~/.porta/credentials.json`) with auto-refresh |
145
+
146
+ ## Error Handling
147
+
148
+ ```typescript
149
+ import { PortaNotFoundError, PortaConflictError, PortaHttpError } from '@portaidentity/sdk';
150
+
151
+ try {
152
+ await client.organizations.get('nonexistent');
153
+ } catch (err) {
154
+ if (err instanceof PortaNotFoundError) {
155
+ console.log('Not found:', err.message);
156
+ } else if (err instanceof PortaConflictError) {
157
+ console.log('Conflict — ETag mismatch?');
158
+ } else if (err instanceof PortaHttpError) {
159
+ console.log(`HTTP ${err.status}:`, err.details);
160
+ }
161
+ }
162
+ ```
163
+
164
+ ## Pagination
165
+
166
+ ```typescript
167
+ // Manual pagination
168
+ const page1 = await client.users.list('org-id', { page: 1, pageSize: 50 });
169
+ // → { data: User[], total: number, page: number, pageSize: number }
170
+
171
+ // Auto-pagination (fetches all pages)
172
+ const allUsers = await client.users.listAll('org-id');
173
+ // → User[]
174
+ ```
175
+
176
+ ## Architecture
177
+
178
+ ```
179
+ @portaidentity/sdk
180
+ ├── transport/ # HTTP abstraction layer
181
+ │ ├── types.ts # HttpTransport, TransportRequest, TransportResponse
182
+ │ ├── browser-transport.ts # Fetch + CSRF cookies + 401 redirect
183
+ │ └── node-transport.ts # Fetch + Bearer auth + 401 retry
184
+ ├── auth/ # Authentication providers
185
+ │ ├── token-auth.ts # Static token
186
+ │ ├── client-credentials-auth.ts # OAuth2 client_credentials
187
+ │ └── cli-auth.ts # File-based CLI credentials
188
+ ├── types/ # SDK-owned entity type definitions
189
+ ├── domains/ # 19 domain API namespaces
190
+ ├── errors/ # Typed error hierarchy
191
+ ├── pagination/ # Pagination types and helpers
192
+ ├── agent/ # AI agent tool definitions + executor
193
+ ├── client.ts # createPortaClient() factory
194
+ ├── index.ts # Main entrypoint
195
+ ├── browser.ts # Browser-specific entrypoint
196
+ ├── node.ts # Node.js-specific entrypoint
197
+ └── agent.ts # Agent-specific entrypoint
198
+ ```
199
+
200
+ ## Entrypoints
201
+
202
+ | Import Path | Includes | Excludes |
203
+ |------------|----------|----------|
204
+ | `@portaidentity/sdk` | Types, errors, pagination, client factory | Transport, auth (bring your own) |
205
+ | `@portaidentity/sdk/browser` | + BrowserTransport | NodeTransport, auth providers |
206
+ | `@portaidentity/sdk/node` | + NodeTransport, all auth providers | BrowserTransport |
207
+ | `@portaidentity/sdk/agent` | + Tool definitions, executeTool | Transports, auth |
208
+
209
+ ## Testing
210
+
211
+ ```bash
212
+ # Run all SDK tests (352 tests)
213
+ cd packages/porta-sdk && yarn test
214
+
215
+ # Type checking
216
+ yarn typecheck
217
+
218
+ # Full verify (lint + typecheck + test + build)
219
+ yarn verify
220
+ ```
221
+
222
+ ## License
223
+
224
+ MIT — See [LICENSE](../../LICENSE) for details.
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @portaidentity/sdk/agent — AI Agent entrypoint.
3
+ *
4
+ * Provides tool definitions for all Porta SDK operations and an executor
5
+ * that maps tool names + arguments to PortaClient method calls.
6
+ *
7
+ * @module @portaidentity/sdk/agent
8
+ */
9
+ import type { PortaClient } from './client.js';
10
+ export interface ToolParameter {
11
+ name: string;
12
+ type: 'string' | 'number' | 'boolean' | 'object';
13
+ description: string;
14
+ required: boolean;
15
+ enum?: string[];
16
+ }
17
+ export interface ToolDefinition {
18
+ name: string;
19
+ description: string;
20
+ parameters: ToolParameter[];
21
+ returns: string;
22
+ }
23
+ export interface ToolResult {
24
+ success: boolean;
25
+ data?: unknown;
26
+ error?: string;
27
+ }
28
+ /**
29
+ * Returns tool definitions for all Porta SDK operations.
30
+ * AI agents use these to discover available tools and their parameters.
31
+ */
32
+ export declare function getToolDefinitions(): ToolDefinition[];
33
+ /**
34
+ * Executes a tool by name with the given arguments against a PortaClient.
35
+ *
36
+ * @param client - A configured PortaClient instance
37
+ * @param toolName - Dot-notation tool name (e.g., 'organizations.list')
38
+ * @param args - Arguments matching the tool's parameter definitions
39
+ * @returns ToolResult with success/data or error
40
+ */
41
+ export declare function executeTool(client: PortaClient, toolName: string, args: Record<string, unknown>): Promise<ToolResult>;
42
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAM/C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAmHD;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,cAAc,EAAE,CAErD;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,UAAU,CAAC,CAkCrB"}
package/dist/agent.js ADDED
@@ -0,0 +1,146 @@
1
+ /**
2
+ * @portaidentity/sdk/agent — AI Agent entrypoint.
3
+ *
4
+ * Provides tool definitions for all Porta SDK operations and an executor
5
+ * that maps tool names + arguments to PortaClient method calls.
6
+ *
7
+ * @module @portaidentity/sdk/agent
8
+ */
9
+ // ---------------------------------------------------------------------------
10
+ // Parameter helpers
11
+ // ---------------------------------------------------------------------------
12
+ function param(name, type, description, required = true, enumValues) {
13
+ return { name, type, description, required, ...(enumValues ? { enum: enumValues } : {}) };
14
+ }
15
+ const ID = (name, desc) => param(name, 'string', desc);
16
+ const OPT_STR = (name, desc) => param(name, 'string', desc, false);
17
+ const OPT_NUM = (name, desc) => param(name, 'number', desc, false);
18
+ const OPT_OBJ = (name, desc) => param(name, 'object', desc, false);
19
+ const OBJ = (name, desc) => param(name, 'object', desc, true);
20
+ // Standard list params
21
+ const LIST_PARAMS = [
22
+ OPT_NUM('page', 'Page number'),
23
+ OPT_NUM('pageSize', 'Items per page'),
24
+ OPT_STR('search', 'Search query'),
25
+ OPT_STR('sort', 'Sort field'),
26
+ OPT_STR('order', 'Sort order (asc/desc)'),
27
+ ];
28
+ // ---------------------------------------------------------------------------
29
+ // Tool Definitions
30
+ // ---------------------------------------------------------------------------
31
+ const TOOL_DEFINITIONS = [
32
+ // Organizations
33
+ { name: 'organizations.list', description: 'List organizations with pagination', parameters: [...LIST_PARAMS], returns: 'PaginatedResponse<Organization>' },
34
+ { name: 'organizations.get', description: 'Get an organization by ID or slug', parameters: [ID('idOrSlug', 'Organization ID or slug')], returns: '{ data: Organization, etag: string | null }' },
35
+ { name: 'organizations.create', description: 'Create a new organization', parameters: [OBJ('input', 'CreateOrganizationInput')], returns: 'Organization' },
36
+ { name: 'organizations.update', description: 'Update an organization', parameters: [ID('idOrSlug', 'Organization ID or slug'), OBJ('input', 'UpdateOrganizationInput'), OPT_STR('etag', 'ETag for concurrency')], returns: 'Organization' },
37
+ { name: 'organizations.suspend', description: 'Suspend an organization', parameters: [ID('idOrSlug', 'Organization ID or slug')], returns: 'void' },
38
+ { name: 'organizations.activate', description: 'Activate an organization', parameters: [ID('idOrSlug', 'Organization ID or slug')], returns: 'void' },
39
+ { name: 'organizations.archive', description: 'Archive an organization', parameters: [ID('idOrSlug', 'Organization ID or slug')], returns: 'void' },
40
+ { name: 'organizations.destroy', description: 'Permanently delete an organization', parameters: [ID('idOrSlug', 'Organization ID or slug')], returns: 'DestroyResult' },
41
+ // Applications
42
+ { name: 'applications.list', description: 'List applications', parameters: [...LIST_PARAMS], returns: 'PaginatedResponse<Application>' },
43
+ { name: 'applications.get', description: 'Get an application by ID or slug', parameters: [ID('idOrSlug', 'Application ID or slug')], returns: '{ data: Application, etag: string | null }' },
44
+ { name: 'applications.create', description: 'Create a new application', parameters: [OBJ('input', 'CreateApplicationInput')], returns: 'Application' },
45
+ { name: 'applications.update', description: 'Update an application', parameters: [ID('idOrSlug', 'Application ID or slug'), OBJ('input', 'UpdateApplicationInput'), OPT_STR('etag', 'ETag')], returns: 'Application' },
46
+ // Clients
47
+ { name: 'clients.list', description: 'List clients', parameters: [...LIST_PARAMS], returns: 'PaginatedResponse<Client>' },
48
+ { name: 'clients.get', description: 'Get a client by ID', parameters: [ID('idOrClientId', 'Client ID or clientId')], returns: '{ data: Client, etag: string | null }' },
49
+ { name: 'clients.create', description: 'Create a new client', parameters: [OBJ('input', 'CreateClientInput')], returns: 'Client' },
50
+ { name: 'clients.update', description: 'Update a client', parameters: [ID('idOrClientId', 'Client ID'), OBJ('input', 'UpdateClientInput'), OPT_STR('etag', 'ETag')], returns: 'Client' },
51
+ { name: 'clients.generateSecret', description: 'Generate a new secret for a client', parameters: [ID('clientId', 'Client ID'), OPT_OBJ('input', 'GenerateSecretInput')], returns: 'GeneratedSecret' },
52
+ // Users
53
+ { name: 'users.list', description: 'List users in an organization', parameters: [ID('orgId', 'Organization ID'), ...LIST_PARAMS], returns: 'PaginatedResponse<User>' },
54
+ { name: 'users.get', description: 'Get a user by ID', parameters: [ID('orgId', 'Organization ID'), ID('userId', 'User ID')], returns: '{ data: User, etag: string | null }' },
55
+ { name: 'users.create', description: 'Create a new user', parameters: [OBJ('input', 'CreateUserInput')], returns: 'User' },
56
+ { name: 'users.invite', description: 'Invite a user', parameters: [OBJ('input', 'InviteUserInput')], returns: 'User' },
57
+ { name: 'users.suspend', description: 'Suspend a user', parameters: [ID('orgId', 'Organization ID'), ID('userId', 'User ID')], returns: 'void' },
58
+ { name: 'users.activate', description: 'Activate a user', parameters: [ID('orgId', 'Organization ID'), ID('userId', 'User ID')], returns: 'void' },
59
+ // Roles
60
+ { name: 'roles.list', description: 'List roles for an application', parameters: [ID('appId', 'Application ID'), ...LIST_PARAMS], returns: 'PaginatedResponse<Role>' },
61
+ { name: 'roles.get', description: 'Get a role with permissions', parameters: [ID('appId', 'Application ID'), ID('roleId', 'Role ID')], returns: 'RoleWithPermissions' },
62
+ { name: 'roles.create', description: 'Create a role', parameters: [ID('appId', 'Application ID'), OBJ('input', 'CreateRoleInput')], returns: 'Role' },
63
+ // Permissions
64
+ { name: 'permissions.list', description: 'List permissions for an application', parameters: [ID('appId', 'Application ID'), ...LIST_PARAMS], returns: 'PaginatedResponse<Permission>' },
65
+ { name: 'permissions.create', description: 'Create a permission', parameters: [ID('appId', 'Application ID'), OBJ('input', 'CreatePermissionInput')], returns: 'Permission' },
66
+ // User Roles
67
+ { name: 'userRoles.list', description: 'List role assignments for a user', parameters: [ID('orgId', 'Organization ID'), ID('userId', 'User ID')], returns: 'UserRoleAssignment[]' },
68
+ { name: 'userRoles.assign', description: 'Assign a role to a user', parameters: [ID('orgId', 'Organization ID'), ID('userId', 'User ID'), ID('roleId', 'Role ID')], returns: 'void' },
69
+ { name: 'userRoles.remove', description: 'Remove a role from a user', parameters: [ID('orgId', 'Organization ID'), ID('userId', 'User ID'), ID('roleId', 'Role ID')], returns: 'void' },
70
+ // Custom Claims
71
+ { name: 'customClaims.list', description: 'List claim definitions for an application', parameters: [ID('appId', 'Application ID'), ...LIST_PARAMS], returns: 'PaginatedResponse<ClaimDefinition>' },
72
+ { name: 'customClaims.create', description: 'Create a claim definition', parameters: [ID('appId', 'Application ID'), OBJ('input', 'CreateClaimDefinitionInput')], returns: 'ClaimDefinition' },
73
+ // Config
74
+ { name: 'config.list', description: 'List all system configuration entries', parameters: [], returns: 'ConfigEntry[]' },
75
+ { name: 'config.get', description: 'Get a config entry', parameters: [ID('key', 'Configuration key')], returns: 'ConfigEntry' },
76
+ { name: 'config.set', description: 'Set a config entry value', parameters: [ID('key', 'Configuration key'), ID('value', 'New value')], returns: 'ConfigEntry' },
77
+ // Keys
78
+ { name: 'keys.list', description: 'List signing keys', parameters: [], returns: 'SigningKey[]' },
79
+ { name: 'keys.generate', description: 'Generate a new signing key', parameters: [], returns: 'SigningKey' },
80
+ { name: 'keys.rotate', description: 'Rotate signing keys', parameters: [], returns: 'SigningKey' },
81
+ // Audit
82
+ { name: 'audit.list', description: 'List audit log entries', parameters: [...LIST_PARAMS, OPT_STR('eventType', 'Filter by event type'), OPT_STR('organizationId', 'Filter by org')], returns: 'PaginatedResponse<AuditEntry>' },
83
+ // Stats
84
+ { name: 'stats.get', description: 'Get dashboard statistics', parameters: [], returns: 'DashboardStats' },
85
+ // Sessions
86
+ { name: 'sessions.list', description: 'List active sessions', parameters: [OPT_NUM('page', 'Page'), OPT_NUM('pageSize', 'Page size'), OPT_STR('userId', 'Filter by user')], returns: 'PaginatedResponse<AdminSession>' },
87
+ { name: 'sessions.revoke', description: 'Revoke a session', parameters: [ID('sessionId', 'Session ID')], returns: 'void' },
88
+ { name: 'sessions.revokeForUser', description: 'Revoke all sessions for a user', parameters: [ID('userId', 'User ID')], returns: 'void' },
89
+ // Bulk
90
+ { name: 'bulk.execute', description: 'Execute a bulk status operation', parameters: [OBJ('input', 'BulkOperationInput')], returns: 'BulkOperationResult' },
91
+ // Two-Factor
92
+ { name: 'twoFactor.getStatus', description: 'Get 2FA status for a user', parameters: [ID('orgId', 'Organization ID'), ID('userId', 'User ID')], returns: 'TwoFactorStatus' },
93
+ { name: 'twoFactor.disable', description: 'Disable 2FA for a user', parameters: [ID('orgId', 'Organization ID'), ID('userId', 'User ID')], returns: 'void' },
94
+ // Imports
95
+ { name: 'imports.provision', description: 'Import/provision data declaratively', parameters: [OBJ('manifest', 'ImportManifest')], returns: 'ImportResult' },
96
+ ];
97
+ // ---------------------------------------------------------------------------
98
+ // Public API
99
+ // ---------------------------------------------------------------------------
100
+ /**
101
+ * Returns tool definitions for all Porta SDK operations.
102
+ * AI agents use these to discover available tools and their parameters.
103
+ */
104
+ export function getToolDefinitions() {
105
+ return TOOL_DEFINITIONS;
106
+ }
107
+ /**
108
+ * Executes a tool by name with the given arguments against a PortaClient.
109
+ *
110
+ * @param client - A configured PortaClient instance
111
+ * @param toolName - Dot-notation tool name (e.g., 'organizations.list')
112
+ * @param args - Arguments matching the tool's parameter definitions
113
+ * @returns ToolResult with success/data or error
114
+ */
115
+ export async function executeTool(client, toolName, args) {
116
+ try {
117
+ const [domain, method] = toolName.split('.');
118
+ if (!domain || !method) {
119
+ return { success: false, error: `Invalid tool name: ${toolName}. Expected format: domain.method` };
120
+ }
121
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
122
+ const domainObj = client[domain];
123
+ if (!domainObj) {
124
+ return { success: false, error: `Unknown domain: ${domain}` };
125
+ }
126
+ const fn = domainObj[method];
127
+ if (typeof fn !== 'function') {
128
+ return { success: false, error: `Unknown method: ${method} on domain ${domain}` };
129
+ }
130
+ // Build arguments array based on tool definition
131
+ const toolDef = TOOL_DEFINITIONS.find((t) => t.name === toolName);
132
+ if (!toolDef) {
133
+ return { success: false, error: `No tool definition found for: ${toolName}` };
134
+ }
135
+ const callArgs = toolDef.parameters
136
+ .filter((p) => p.required || args[p.name] !== undefined)
137
+ .map((p) => args[p.name]);
138
+ const result = await fn.call(domainObj, ...callArgs);
139
+ return { success: true, data: result };
140
+ }
141
+ catch (err) {
142
+ const message = err instanceof Error ? err.message : String(err);
143
+ return { success: false, error: message };
144
+ }
145
+ }
146
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * CliAuth — reuse Porta CLI stored credentials as an authentication provider.
3
+ *
4
+ * Reads credentials from `~/.porta/credentials.json` (the file created by
5
+ * `porta login`) and uses them for API authentication. Handles token expiry
6
+ * detection and automatic refresh via the refresh_token grant.
7
+ *
8
+ * Key behaviors:
9
+ * - Reads credentials file on first `getToken()` call, caches in memory
10
+ * - Checks `expiresAt` with 60s safety buffer to detect near-expired tokens
11
+ * - `refreshToken()` re-reads the file (CLI may have refreshed) then
12
+ * POSTs refresh_token grant to the token endpoint
13
+ * - Does NOT write back to the credentials file — only the CLI writes
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * import { createCliAuth } from '@portaidentity/sdk';
18
+ *
19
+ * // Uses default ~/.porta/credentials.json
20
+ * const auth = createCliAuth();
21
+ * const client = createPortaClient({ baseUrl: '...', auth });
22
+ *
23
+ * // Custom path for testing
24
+ * const auth2 = createCliAuth({ credentialsPath: '/tmp/test-creds.json' });
25
+ * ```
26
+ *
27
+ * @module auth/cli-auth
28
+ */
29
+ import type { AuthProvider } from './types.js';
30
+ /**
31
+ * Options for creating a CLI auth provider.
32
+ */
33
+ export interface CliAuthOptions {
34
+ /** Path to credentials file (default: '~/.porta/credentials.json') */
35
+ credentialsPath?: string;
36
+ }
37
+ /**
38
+ * Shape of the credentials file written by `porta login`.
39
+ *
40
+ * This matches the `StoredCredentials` interface from the CLI's token-store
41
+ * module. The SDK only reads these fields — it never writes them.
42
+ */
43
+ export interface StoredCredentials {
44
+ /** Porta server URL (e.g., 'https://porta.local:3443') */
45
+ server: string;
46
+ /** Organization slug for the admin org (e.g., 'porta-admin') */
47
+ orgSlug: string;
48
+ /** OIDC client_id used for the login flow */
49
+ clientId: string;
50
+ /** JWT access token for API requests */
51
+ accessToken: string;
52
+ /** Refresh token for obtaining new access tokens */
53
+ refreshToken: string;
54
+ /** OIDC ID token containing user identity claims */
55
+ idToken: string;
56
+ /** ISO 8601 datetime when the access token expires */
57
+ expiresAt: string;
58
+ /** Decoded user identity from the ID token */
59
+ userInfo: {
60
+ /** OIDC subject identifier (user ID) */
61
+ sub: string;
62
+ /** User email address */
63
+ email: string;
64
+ /** User display name */
65
+ name?: string;
66
+ };
67
+ }
68
+ /**
69
+ * Creates a CLI credentials authentication provider.
70
+ *
71
+ * Returns an {@link AuthProvider} that reads the Porta CLI's stored
72
+ * credentials file and uses them for API authentication. The provider
73
+ * caches credentials in memory and handles token refresh transparently.
74
+ *
75
+ * **Important:** This provider does NOT write back to the credentials file.
76
+ * Only the CLI (`porta login`, `porta logout`) manages the file. The SDK
77
+ * refreshes tokens in-memory only.
78
+ *
79
+ * @param options - Optional configuration (credentials file path)
80
+ * @returns An AuthProvider backed by CLI stored credentials
81
+ */
82
+ export declare function createCliAuth(options?: CliAuthOptions): AuthProvider;
83
+ //# sourceMappingURL=cli-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-auth.d.ts","sourceRoot":"","sources":["../../src/auth/cli-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO/C;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,QAAQ,EAAE;QACR,wCAAwC;QACxC,GAAG,EAAE,MAAM,CAAC;QACZ,yBAAyB;QACzB,KAAK,EAAE,MAAM,CAAC;QACd,wBAAwB;QACxB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AA8BD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,cAAmB,GAAG,YAAY,CAkJxE"}