@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.
- package/README.md +224 -0
- package/dist/agent.d.ts +42 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +146 -0
- package/dist/agent.js.map +1 -0
- package/dist/auth/cli-auth.d.ts +83 -0
- package/dist/auth/cli-auth.d.ts.map +1 -0
- package/dist/auth/cli-auth.js +188 -0
- package/dist/auth/cli-auth.js.map +1 -0
- package/dist/auth/client-credentials-auth.d.ts +54 -0
- package/dist/auth/client-credentials-auth.d.ts.map +1 -0
- package/dist/auth/client-credentials-auth.js +147 -0
- package/dist/auth/client-credentials-auth.js.map +1 -0
- package/dist/auth/index.d.ts +20 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +16 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/token-auth.d.ts +40 -0
- package/dist/auth/token-auth.d.ts.map +1 -0
- package/dist/auth/token-auth.js +44 -0
- package/dist/auth/token-auth.js.map +1 -0
- package/dist/auth/types.d.ts +28 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +11 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/browser.d.ts +12 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +12 -0
- package/dist/browser.js.map +1 -0
- package/dist/client.d.ts +52 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +52 -0
- package/dist/client.js.map +1 -0
- package/dist/domains/applications.d.ts +23 -0
- package/dist/domains/applications.d.ts.map +1 -0
- package/dist/domains/applications.js +59 -0
- package/dist/domains/applications.js.map +1 -0
- package/dist/domains/audit.d.ts +13 -0
- package/dist/domains/audit.d.ts.map +1 -0
- package/dist/domains/audit.js +19 -0
- package/dist/domains/audit.js.map +1 -0
- package/dist/domains/branding.d.ts +16 -0
- package/dist/domains/branding.d.ts.map +1 -0
- package/dist/domains/branding.js +29 -0
- package/dist/domains/branding.js.map +1 -0
- package/dist/domains/bulk.d.ts +12 -0
- package/dist/domains/bulk.d.ts.map +1 -0
- package/dist/domains/bulk.js +14 -0
- package/dist/domains/bulk.js.map +1 -0
- package/dist/domains/clients.d.ts +22 -0
- package/dist/domains/clients.d.ts.map +1 -0
- package/dist/domains/clients.js +55 -0
- package/dist/domains/clients.js.map +1 -0
- package/dist/domains/config.d.ts +14 -0
- package/dist/domains/config.d.ts.map +1 -0
- package/dist/domains/config.js +23 -0
- package/dist/domains/config.js.map +1 -0
- package/dist/domains/custom-claims.d.ts +17 -0
- package/dist/domains/custom-claims.d.ts.map +1 -0
- package/dist/domains/custom-claims.js +35 -0
- package/dist/domains/custom-claims.js.map +1 -0
- package/dist/domains/exports.d.ts +12 -0
- package/dist/domains/exports.d.ts.map +1 -0
- package/dist/domains/exports.js +20 -0
- package/dist/domains/exports.js.map +1 -0
- package/dist/domains/helpers.d.ts +27 -0
- package/dist/domains/helpers.d.ts.map +1 -0
- package/dist/domains/helpers.js +46 -0
- package/dist/domains/helpers.js.map +1 -0
- package/dist/domains/imports.d.ts +12 -0
- package/dist/domains/imports.d.ts.map +1 -0
- package/dist/domains/imports.js +14 -0
- package/dist/domains/imports.js.map +1 -0
- package/dist/domains/index.d.ts +45 -0
- package/dist/domains/index.d.ts.map +1 -0
- package/dist/domains/index.js +46 -0
- package/dist/domains/index.js.map +1 -0
- package/dist/domains/keys.d.ts +14 -0
- package/dist/domains/keys.d.ts.map +1 -0
- package/dist/domains/keys.js +23 -0
- package/dist/domains/keys.js.map +1 -0
- package/dist/domains/organizations.d.ts +33 -0
- package/dist/domains/organizations.d.ts.map +1 -0
- package/dist/domains/organizations.js +69 -0
- package/dist/domains/organizations.js.map +1 -0
- package/dist/domains/permissions.d.ts +16 -0
- package/dist/domains/permissions.d.ts.map +1 -0
- package/dist/domains/permissions.js +31 -0
- package/dist/domains/permissions.js.map +1 -0
- package/dist/domains/roles.d.ts +19 -0
- package/dist/domains/roles.d.ts.map +1 -0
- package/dist/domains/roles.js +41 -0
- package/dist/domains/roles.js.map +1 -0
- package/dist/domains/sessions.d.ts +17 -0
- package/dist/domains/sessions.d.ts.map +1 -0
- package/dist/domains/sessions.js +28 -0
- package/dist/domains/sessions.js.map +1 -0
- package/dist/domains/stats.d.ts +12 -0
- package/dist/domains/stats.d.ts.map +1 -0
- package/dist/domains/stats.js +14 -0
- package/dist/domains/stats.js.map +1 -0
- package/dist/domains/two-factor.d.ts +14 -0
- package/dist/domains/two-factor.d.ts.map +1 -0
- package/dist/domains/two-factor.js +24 -0
- package/dist/domains/two-factor.js.map +1 -0
- package/dist/domains/user-claims.d.ts +14 -0
- package/dist/domains/user-claims.d.ts.map +1 -0
- package/dist/domains/user-claims.js +24 -0
- package/dist/domains/user-claims.js.map +1 -0
- package/dist/domains/user-roles.d.ts +14 -0
- package/dist/domains/user-roles.d.ts.map +1 -0
- package/dist/domains/user-roles.js +24 -0
- package/dist/domains/user-roles.js.map +1 -0
- package/dist/domains/users.d.ts +25 -0
- package/dist/domains/users.d.ts.map +1 -0
- package/dist/domains/users.js +67 -0
- package/dist/domains/users.js.map +1 -0
- package/dist/errors/index.d.ts +110 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +206 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/node.d.ts +14 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +12 -0
- package/dist/node.js.map +1 -0
- package/dist/pagination/index.d.ts +87 -0
- package/dist/pagination/index.d.ts.map +1 -0
- package/dist/pagination/index.js +67 -0
- package/dist/pagination/index.js.map +1 -0
- package/dist/transport/browser-transport.d.ts +64 -0
- package/dist/transport/browser-transport.d.ts.map +1 -0
- package/dist/transport/browser-transport.js +96 -0
- package/dist/transport/browser-transport.js.map +1 -0
- package/dist/transport/node-transport.d.ts +51 -0
- package/dist/transport/node-transport.d.ts.map +1 -0
- package/dist/transport/node-transport.js +108 -0
- package/dist/transport/node-transport.js.map +1 -0
- package/dist/transport/types.d.ts +84 -0
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/transport/types.js +13 -0
- package/dist/transport/types.js.map +1 -0
- package/dist/transport/utils.d.ts +78 -0
- package/dist/transport/utils.d.ts.map +1 -0
- package/dist/transport/utils.js +126 -0
- package/dist/transport/utils.js.map +1 -0
- package/dist/types/applications.d.ts +48 -0
- package/dist/types/applications.d.ts.map +1 -0
- package/dist/types/applications.js +7 -0
- package/dist/types/applications.js.map +1 -0
- package/dist/types/audit.d.ts +31 -0
- package/dist/types/audit.d.ts.map +1 -0
- package/dist/types/audit.js +7 -0
- package/dist/types/audit.js.map +1 -0
- package/dist/types/branding.d.ts +13 -0
- package/dist/types/branding.d.ts.map +1 -0
- package/dist/types/branding.js +7 -0
- package/dist/types/branding.js.map +1 -0
- package/dist/types/bulk.d.ts +22 -0
- package/dist/types/bulk.d.ts.map +1 -0
- package/dist/types/bulk.js +7 -0
- package/dist/types/bulk.js.map +1 -0
- package/dist/types/clients.d.ts +70 -0
- package/dist/types/clients.d.ts.map +1 -0
- package/dist/types/clients.js +7 -0
- package/dist/types/clients.js.map +1 -0
- package/dist/types/common.d.ts +75 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +7 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/config.d.ts +15 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +7 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/custom-claims.d.ts +48 -0
- package/dist/types/custom-claims.d.ts.map +1 -0
- package/dist/types/custom-claims.js +7 -0
- package/dist/types/custom-claims.js.map +1 -0
- package/dist/types/exports.d.ts +14 -0
- package/dist/types/exports.d.ts.map +1 -0
- package/dist/types/exports.js +7 -0
- package/dist/types/exports.js.map +1 -0
- package/dist/types/imports.d.ts +31 -0
- package/dist/types/imports.d.ts.map +1 -0
- package/dist/types/imports.js +7 -0
- package/dist/types/imports.js.map +1 -0
- package/dist/types/index.d.ts +26 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/keys.d.ts +14 -0
- package/dist/types/keys.d.ts.map +1 -0
- package/dist/types/keys.js +7 -0
- package/dist/types/keys.js.map +1 -0
- package/dist/types/organizations.d.ts +47 -0
- package/dist/types/organizations.d.ts.map +1 -0
- package/dist/types/organizations.js +7 -0
- package/dist/types/organizations.js.map +1 -0
- package/dist/types/permissions.d.ts +23 -0
- package/dist/types/permissions.d.ts.map +1 -0
- package/dist/types/permissions.js +7 -0
- package/dist/types/permissions.js.map +1 -0
- package/dist/types/roles.d.ts +30 -0
- package/dist/types/roles.d.ts.map +1 -0
- package/dist/types/roles.js +7 -0
- package/dist/types/roles.js.map +1 -0
- package/dist/types/sessions.d.ts +25 -0
- package/dist/types/sessions.d.ts.map +1 -0
- package/dist/types/sessions.js +7 -0
- package/dist/types/sessions.js.map +1 -0
- package/dist/types/stats.d.ts +18 -0
- package/dist/types/stats.d.ts.map +1 -0
- package/dist/types/stats.js +7 -0
- package/dist/types/stats.js.map +1 -0
- package/dist/types/two-factor.d.ts +14 -0
- package/dist/types/two-factor.d.ts.map +1 -0
- package/dist/types/two-factor.js +7 -0
- package/dist/types/two-factor.js.map +1 -0
- package/dist/types/user-claims.d.ts +16 -0
- package/dist/types/user-claims.d.ts.map +1 -0
- package/dist/types/user-claims.js +7 -0
- package/dist/types/user-claims.js.map +1 -0
- package/dist/types/user-roles.d.ts +17 -0
- package/dist/types/user-roles.d.ts.map +1 -0
- package/dist/types/user-roles.js +7 -0
- package/dist/types/user-roles.js.map +1 -0
- package/dist/types/users.d.ts +53 -0
- package/dist/types/users.d.ts.map +1 -0
- package/dist/types/users.js +7 -0
- package/dist/types/users.js.map +1 -0
- package/dist/version.d.ts +9 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +9 -0
- package/dist/version.js.map +1 -0
- 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.
|
package/dist/agent.d.ts
ADDED
|
@@ -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"}
|