@sylphx/management 0.2.0 → 0.2.1

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/dist/admin.d.ts CHANGED
@@ -98,7 +98,7 @@ export declare const retireJwtKey: (client: Client, keyId: string) => Promise<{
98
98
  /**
99
99
  * Trigger a project migration between regions. Phase 4b Matrix-2 gap.
100
100
  * Underlying endpoint on the platform API is
101
- * `POST /admin/projects/:id/migrate` — the SDK wraps it directly rather
101
+ * `POST /operator/projects/:id/migrate` — the SDK wraps it directly rather
102
102
  * than going through `adminProjectsEndpoints` because migration is its
103
103
  * own operational concern (drain → cut-over → warm-up).
104
104
  */
@@ -138,4 +138,31 @@ export declare const updateUserRole: (client: Client, userId: string, body: {
138
138
  }) => Promise<{
139
139
  user: AdminUserView;
140
140
  }>;
141
+ /**
142
+ * L-15 (2026-05-02): manually verify a user's email. Super-admin only on the
143
+ * platform tenant. The Management API endpoint exists at
144
+ * `POST /admin/users/users/:userId/verify-email`; the SDK helper was the
145
+ * missing piece blocking operators from validating the new-user E2E flow
146
+ * without (a) a real email inbox or (b) a forbidden direct DB UPDATE.
147
+ */
148
+ export declare const verifyUserEmail: (client: Client, userId: string) => Promise<{
149
+ readonly id: string;
150
+ readonly email: string;
151
+ }>;
152
+ /**
153
+ * L-15 (2026-05-02): soft-delete a platform user. Super-admin only;
154
+ * cannot delete oneself. Existing sessions are revoked first.
155
+ */
156
+ export declare const deleteUser: (client: Client, userId: string) => Promise<{
157
+ readonly id: string;
158
+ readonly email: string;
159
+ }>;
160
+ /**
161
+ * L-15 (2026-05-02): revoke ALL sessions for a user (force re-login).
162
+ * Super-admin only.
163
+ */
164
+ export declare const revokeUserSessions: (client: Client, userId: string) => Promise<{
165
+ readonly userId: string;
166
+ readonly revokedCount: number;
167
+ }>;
141
168
  //# sourceMappingURL=admin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../src/admin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../src/admin.ts"],"names":[],"mappings":"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"}
package/dist/admin.js CHANGED
@@ -68,11 +68,11 @@ export const retireJwtKey = (client, keyId) => {
68
68
  /**
69
69
  * Trigger a project migration between regions. Phase 4b Matrix-2 gap.
70
70
  * Underlying endpoint on the platform API is
71
- * `POST /admin/projects/:id/migrate` — the SDK wraps it directly rather
71
+ * `POST /operator/projects/:id/migrate` — the SDK wraps it directly rather
72
72
  * than going through `adminProjectsEndpoints` because migration is its
73
73
  * own operational concern (drain → cut-over → warm-up).
74
74
  */
75
- export const migrateProject = (client, projectId, body) => request(client, 'POST', `/admin/projects/${encodeURIComponent(projectId)}/migrate`, { body });
75
+ export const migrateProject = (client, projectId, body) => request(client, 'POST', `/operator/projects/${encodeURIComponent(projectId)}/migrate`, { body });
76
76
  /**
77
77
  * Regenerate an environment's deploy / API key. Already exposed on
78
78
  * `adminProjectsEndpoints.regenerateKey`; surfaced here under the `admin`
@@ -94,3 +94,30 @@ export const updateUserRole = (client, userId, body) => {
94
94
  const { method, path } = adminUsersEndpoints.updateRole;
95
95
  return request(client, method, interpolatePath(path, { userId }), { body });
96
96
  };
97
+ /**
98
+ * L-15 (2026-05-02): manually verify a user's email. Super-admin only on the
99
+ * platform tenant. The Management API endpoint exists at
100
+ * `POST /admin/users/users/:userId/verify-email`; the SDK helper was the
101
+ * missing piece blocking operators from validating the new-user E2E flow
102
+ * without (a) a real email inbox or (b) a forbidden direct DB UPDATE.
103
+ */
104
+ export const verifyUserEmail = (client, userId) => {
105
+ const { method, path } = adminUsersEndpoints.verifyEmail;
106
+ return request(client, method, interpolatePath(path, { userId }));
107
+ };
108
+ /**
109
+ * L-15 (2026-05-02): soft-delete a platform user. Super-admin only;
110
+ * cannot delete oneself. Existing sessions are revoked first.
111
+ */
112
+ export const deleteUser = (client, userId) => {
113
+ const { method, path } = adminUsersEndpoints.delete;
114
+ return request(client, method, interpolatePath(path, { userId }));
115
+ };
116
+ /**
117
+ * L-15 (2026-05-02): revoke ALL sessions for a user (force re-login).
118
+ * Super-admin only.
119
+ */
120
+ export const revokeUserSessions = (client, userId) => {
121
+ const { method, path } = adminUsersEndpoints.revokeSessions;
122
+ return request(client, method, interpolatePath(path, { userId }));
123
+ };
package/dist/http.d.ts CHANGED
@@ -9,11 +9,32 @@
9
9
  * the raw text.
10
10
  * - Returns `undefined` for 204 No Content.
11
11
  * - Accepts optional `body` (JSON-stringified) and `query` (URL-encoded).
12
+ * - Auto-injects an `Idempotency-Key` header on every mutation
13
+ * (POST / PUT / PATCH / DELETE) unless one is explicitly provided
14
+ * or `idempotency: false` is set. See `RequestOptions.idempotencyKey`.
12
15
  */
13
16
  import type { Client } from './client.js';
14
17
  export interface RequestOptions {
15
18
  readonly body?: unknown;
16
19
  readonly query?: Readonly<Record<string, string | undefined>>;
20
+ /**
21
+ * Explicit Idempotency-Key. When omitted on a mutating method, the
22
+ * SDK auto-generates a fresh UUID v4 per call so accidental
23
+ * network-retries of the SAME SDK invocation are server-side
24
+ * dedup'd (server middleware `idempotencyMiddleware` enforces).
25
+ *
26
+ * Pass an explicit key when:
27
+ * - The caller wants cross-process retry safety (e.g. a CI script
28
+ * re-running on retry must produce the same logical mutation).
29
+ * - The caller is replaying the SAME deterministic operation and
30
+ * expects the cached response.
31
+ *
32
+ * Pass `null` to opt out entirely (the server middleware no-ops on
33
+ * absent header — this is the "I know what I'm doing" escape hatch
34
+ * for endpoints that DO accept duplicate non-idempotent submissions
35
+ * by design, e.g. usage-counter increments).
36
+ */
37
+ readonly idempotencyKey?: string | null;
17
38
  }
18
39
  /**
19
40
  * Substitute `:param` tokens in a contract-sourced path with URL-encoded
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGzC,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;CAC7D;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAO9F;AAED,wBAAsB,OAAO,CAAC,CAAC,EAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,cAAc,GACnB,OAAO,CAAC,CAAC,CAAC,CA6CZ"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAMzC,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;IAC7D;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACvC;AAYD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAO9F;AAED,wBAAsB,OAAO,CAAC,CAAC,EAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,cAAc,GACnB,OAAO,CAAC,CAAC,CAAC,CA0DZ"}
package/dist/http.js CHANGED
@@ -9,8 +9,22 @@
9
9
  * the raw text.
10
10
  * - Returns `undefined` for 204 No Content.
11
11
  * - Accepts optional `body` (JSON-stringified) and `query` (URL-encoded).
12
+ * - Auto-injects an `Idempotency-Key` header on every mutation
13
+ * (POST / PUT / PATCH / DELETE) unless one is explicitly provided
14
+ * or `idempotency: false` is set. See `RequestOptions.idempotencyKey`.
12
15
  */
13
16
  import { ApiError } from './errors.js';
17
+ /** HTTP methods we treat as mutations for idempotency-key injection. */
18
+ const MUTATING_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);
19
+ /**
20
+ * Generate a fresh idempotency key per call. We use `crypto.randomUUID`
21
+ * (available in Bun, Node 20+, Deno, Workers, modern browsers — all our
22
+ * supported runtimes). The server accepts any opaque string ≤256 chars;
23
+ * UUID v4 is 36 chars and collision-free at our volumes.
24
+ */
25
+ function newIdempotencyKey() {
26
+ return crypto.randomUUID();
27
+ }
14
28
  /**
15
29
  * Substitute `:param` tokens in a contract-sourced path with URL-encoded
16
30
  * values. Throws if any token is missing from `params` — the SDK should
@@ -46,6 +60,18 @@ export async function request(client, method, path, opts) {
46
60
  // WAFs) reject GET / DELETE requests carrying a bodyless Content-Type.
47
61
  if (hasBody)
48
62
  headers['Content-Type'] = 'application/json';
63
+ // Auto-inject Idempotency-Key on mutations. The server middleware
64
+ // at `apps/api/.../idempotency.ts` is mounted globally and no-ops
65
+ // on safe methods + on requests without the header — sending it
66
+ // gratuitously is harmless on routes that don't expect it. The key
67
+ // is ALWAYS sent for mutations unless caller passes `null` to opt
68
+ // out (e.g. usage-counter endpoints that want duplicate writes).
69
+ if (MUTATING_METHODS.has(method.toUpperCase())) {
70
+ const explicit = opts?.idempotencyKey;
71
+ if (explicit !== null) {
72
+ headers['Idempotency-Key'] = explicit ?? newIdempotencyKey();
73
+ }
74
+ }
49
75
  const res = await fetch(url, {
50
76
  method,
51
77
  headers,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sylphx/management",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Sylphx Management SDK — pure-FP Promise client for the Sylphx Platform Management API. 55+ namespaces covering the full PaaS surface (ADR-089 Phase 4b 100% coverage), types derived from @sylphx/contract (Effect Schema SSOT).",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -193,7 +193,7 @@
193
193
  "prepublishOnly": "bun run build"
194
194
  },
195
195
  "dependencies": {
196
- "@sylphx/contract": "workspace:*"
196
+ "@sylphx/contract": "0.2.1"
197
197
  },
198
198
  "files": [
199
199
  "dist",