@sylphx/management 0.1.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/CHANGELOG.md +88 -0
- package/LICENSE +21 -0
- package/README.md +157 -101
- package/dist/admin.d.ts +168 -0
- package/dist/admin.d.ts.map +1 -0
- package/dist/admin.js +123 -0
- package/dist/adminBootstrap.d.ts +46 -0
- package/dist/adminBootstrap.d.ts.map +1 -0
- package/dist/adminBootstrap.js +33 -0
- package/dist/adminBuilds.d.ts +72 -0
- package/dist/adminBuilds.d.ts.map +1 -0
- package/dist/adminBuilds.js +29 -0
- package/dist/adminEnvServices.d.ts +41 -0
- package/dist/adminEnvServices.d.ts.map +1 -0
- package/dist/adminEnvServices.js +22 -0
- package/dist/adminRateLimits.d.ts +61 -0
- package/dist/adminRateLimits.d.ts.map +1 -0
- package/dist/adminRateLimits.js +44 -0
- package/dist/adminReconcile.d.ts +45 -0
- package/dist/adminReconcile.d.ts.map +1 -0
- package/dist/adminReconcile.js +20 -0
- package/dist/adminResources.d.ts +97 -0
- package/dist/adminResources.d.ts.map +1 -0
- package/dist/adminResources.js +40 -0
- package/dist/adminSecrets.d.ts +60 -0
- package/dist/adminSecrets.d.ts.map +1 -0
- package/dist/adminSecrets.js +43 -0
- package/dist/adminTenants.d.ts +41 -0
- package/dist/adminTenants.d.ts.map +1 -0
- package/dist/adminTenants.js +29 -0
- package/dist/ai.d.ts +148 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +29 -0
- package/dist/analytics.d.ts +49 -0
- package/dist/analytics.d.ts.map +1 -0
- package/dist/analytics.js +23 -0
- package/dist/auth.d.ts +39 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +27 -0
- package/dist/authSettings.d.ts +71 -0
- package/dist/authSettings.d.ts.map +1 -0
- package/dist/authSettings.js +39 -0
- package/dist/backups.d.ts +66 -0
- package/dist/backups.d.ts.map +1 -0
- package/dist/backups.js +32 -0
- package/dist/billing.d.ts +105 -0
- package/dist/billing.d.ts.map +1 -0
- package/dist/billing.js +42 -0
- package/dist/billingSettings.d.ts +78 -0
- package/dist/billingSettings.d.ts.map +1 -0
- package/dist/billingSettings.js +54 -0
- package/dist/branchDatabases.d.ts +53 -0
- package/dist/branchDatabases.d.ts.map +1 -0
- package/dist/branchDatabases.js +38 -0
- package/dist/certs.d.ts +63 -0
- package/dist/certs.d.ts.map +1 -0
- package/dist/certs.js +28 -0
- package/dist/ciSettings.d.ts +77 -0
- package/dist/ciSettings.d.ts.map +1 -0
- package/dist/ciSettings.js +41 -0
- package/dist/client.d.ts +36 -38
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +32 -90
- package/dist/consent.d.ts +111 -0
- package/dist/consent.d.ts.map +1 -0
- package/dist/consent.js +35 -0
- package/dist/databases.d.ts +17 -0
- package/dist/databases.d.ts.map +1 -0
- package/dist/databases.js +32 -0
- package/dist/deployments.d.ts +22 -0
- package/dist/deployments.d.ts.map +1 -0
- package/dist/deployments.js +39 -0
- package/dist/domains.d.ts +26 -0
- package/dist/domains.d.ts.map +1 -0
- package/dist/domains.js +39 -0
- package/dist/edgeDeployments.d.ts +43 -0
- package/dist/edgeDeployments.d.ts.map +1 -0
- package/dist/edgeDeployments.js +32 -0
- package/dist/email.d.ts +45 -0
- package/dist/email.d.ts.map +1 -0
- package/dist/email.js +21 -0
- package/dist/engagement.d.ts +100 -0
- package/dist/engagement.d.ts.map +1 -0
- package/dist/engagement.js +28 -0
- package/dist/envVars.d.ts +17 -0
- package/dist/envVars.d.ts.map +1 -0
- package/dist/envVars.js +34 -0
- package/dist/environments.d.ts +41 -0
- package/dist/environments.d.ts.map +1 -0
- package/dist/environments.js +54 -0
- package/dist/errors.d.ts +8 -3
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +8 -2
- package/dist/experiments.d.ts +80 -0
- package/dist/experiments.d.ts.map +1 -0
- package/dist/experiments.js +23 -0
- package/dist/flags.d.ts +85 -0
- package/dist/flags.d.ts.map +1 -0
- package/dist/flags.js +25 -0
- package/dist/functions.d.ts +39 -0
- package/dist/functions.d.ts.map +1 -0
- package/dist/functions.js +40 -0
- package/dist/github.d.ts +33 -0
- package/dist/github.d.ts.map +1 -0
- package/dist/github.js +22 -0
- package/dist/http.d.ts +49 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +97 -0
- package/dist/index.d.ts +85 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +86 -20
- package/dist/kv.d.ts +66 -0
- package/dist/kv.d.ts.map +1 -0
- package/dist/kv.js +36 -0
- package/dist/logs.d.ts +14 -0
- package/dist/logs.d.ts.map +1 -0
- package/dist/logs.js +17 -0
- package/dist/management.d.ts +55 -0
- package/dist/management.d.ts.map +1 -0
- package/dist/management.js +31 -0
- package/dist/monitoring.d.ts +65 -0
- package/dist/monitoring.d.ts.map +1 -0
- package/dist/monitoring.js +29 -0
- package/dist/newsletter.d.ts +279 -0
- package/dist/newsletter.d.ts.map +1 -0
- package/dist/newsletter.js +98 -0
- package/dist/notifications.d.ts +30 -0
- package/dist/notifications.d.ts.map +1 -0
- package/dist/notifications.js +19 -0
- package/dist/oidc.d.ts +46 -0
- package/dist/oidc.d.ts.map +1 -0
- package/dist/oidc.js +25 -0
- package/dist/organizations.d.ts +24 -0
- package/dist/organizations.d.ts.map +1 -0
- package/dist/organizations.js +42 -0
- package/dist/plans.d.ts +66 -0
- package/dist/plans.d.ts.map +1 -0
- package/dist/plans.js +42 -0
- package/dist/privacy.d.ts +138 -0
- package/dist/privacy.d.ts.map +1 -0
- package/dist/privacy.js +41 -0
- package/dist/projects.d.ts +14 -0
- package/dist/projects.d.ts.map +1 -0
- package/dist/projects.js +22 -0
- package/dist/realtime.d.ts +33 -0
- package/dist/realtime.d.ts.map +1 -0
- package/dist/realtime.js +19 -0
- package/dist/referrals.d.ts +100 -0
- package/dist/referrals.d.ts.map +1 -0
- package/dist/referrals.js +33 -0
- package/dist/refresh.d.ts +44 -0
- package/dist/refresh.d.ts.map +1 -0
- package/dist/refresh.js +33 -0
- package/dist/remoteConfig.d.ts +15 -0
- package/dist/remoteConfig.d.ts.map +1 -0
- package/dist/remoteConfig.js +35 -0
- package/dist/resourceBindings.d.ts +19 -0
- package/dist/resourceBindings.d.ts.map +1 -0
- package/dist/resourceBindings.js +24 -0
- package/dist/runners.d.ts +60 -0
- package/dist/runners.d.ts.map +1 -0
- package/dist/runners.js +17 -0
- package/dist/saml.d.ts +44 -0
- package/dist/saml.d.ts.map +1 -0
- package/dist/saml.js +77 -0
- package/dist/sandboxes.d.ts +15 -0
- package/dist/sandboxes.d.ts.map +1 -0
- package/dist/sandboxes.js +18 -0
- package/dist/search.d.ts +66 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +29 -0
- package/dist/secrets.d.ts +50 -0
- package/dist/secrets.d.ts.map +1 -0
- package/dist/secrets.js +61 -0
- package/dist/security.d.ts +58 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +49 -0
- package/dist/serviceTokenRequests.d.ts +71 -0
- package/dist/serviceTokenRequests.d.ts.map +1 -0
- package/dist/serviceTokenRequests.js +43 -0
- package/dist/serviceTokens.d.ts +65 -0
- package/dist/serviceTokens.d.ts.map +1 -0
- package/dist/serviceTokens.js +22 -0
- package/dist/services.d.ts +10 -0
- package/dist/services.d.ts.map +1 -0
- package/dist/services.js +15 -0
- package/dist/sessionReplay.d.ts +116 -0
- package/dist/sessionReplay.d.ts.map +1 -0
- package/dist/sessionReplay.js +29 -0
- package/dist/storage.d.ts +12 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +10 -0
- package/dist/tasks.d.ts +29 -0
- package/dist/tasks.d.ts.map +1 -0
- package/dist/tasks.js +29 -0
- package/dist/types.d.ts +59 -155
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +17 -3
- package/dist/user.d.ts +99 -0
- package/dist/user.d.ts.map +1 -0
- package/dist/user.js +58 -0
- package/dist/users.d.ts +9 -0
- package/dist/users.d.ts.map +1 -0
- package/dist/users.js +11 -0
- package/dist/volumes.d.ts +16 -0
- package/dist/volumes.d.ts.map +1 -0
- package/dist/volumes.js +9 -0
- package/dist/webhooks.d.ts +77 -0
- package/dist/webhooks.d.ts.map +1 -0
- package/dist/webhooks.js +27 -0
- package/package.json +194 -5
- package/dist/request.d.ts +0 -5
- package/dist/request.d.ts.map +0 -1
- package/dist/request.js +0 -1
- package/dist/resources/config.d.ts +0 -30
- package/dist/resources/config.d.ts.map +0 -1
- package/dist/resources/config.js +0 -62
- package/dist/resources/databases.d.ts +0 -26
- package/dist/resources/databases.d.ts.map +0 -1
- package/dist/resources/databases.js +0 -29
- package/dist/resources/deployments.d.ts +0 -24
- package/dist/resources/deployments.d.ts.map +0 -1
- package/dist/resources/deployments.js +0 -30
- package/dist/resources/domains.d.ts +0 -30
- package/dist/resources/domains.d.ts.map +0 -1
- package/dist/resources/domains.js +0 -46
- package/dist/resources/env-vars.d.ts +0 -19
- package/dist/resources/env-vars.d.ts.map +0 -1
- package/dist/resources/env-vars.js +0 -30
- package/dist/resources/environments.d.ts +0 -16
- package/dist/resources/environments.d.ts.map +0 -1
- package/dist/resources/environments.js +0 -24
- package/dist/resources/logs.d.ts +0 -13
- package/dist/resources/logs.d.ts.map +0 -1
- package/dist/resources/logs.js +0 -20
- package/dist/resources/org.d.ts +0 -15
- package/dist/resources/org.d.ts.map +0 -1
- package/dist/resources/org.js +0 -25
- package/dist/resources/projects.d.ts +0 -19
- package/dist/resources/projects.d.ts.map +0 -1
- package/dist/resources/projects.js +0 -19
- package/dist/resources/resources.d.ts +0 -26
- package/dist/resources/resources.d.ts.map +0 -1
- package/dist/resources/resources.js +0 -32
- package/dist/resources/services.d.ts +0 -21
- package/dist/resources/services.d.ts.map +0 -1
- package/dist/resources/services.js +0 -30
- package/dist/resources/storage.d.ts +0 -21
- package/dist/resources/storage.d.ts.map +0 -1
- package/dist/resources/storage.js +0 -25
- package/dist/resources/tasks.d.ts +0 -42
- package/dist/resources/tasks.d.ts.map +0 -1
- package/dist/resources/tasks.js +0 -49
- package/dist/resources/user.d.ts +0 -9
- package/dist/resources/user.d.ts.map +0 -1
- package/dist/resources/user.js +0 -10
- package/dist/resources/volumes.d.ts +0 -20
- package/dist/resources/volumes.d.ts.map +0 -1
- package/dist/resources/volumes.js +0 -19
package/dist/security.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Console — user-facing security settings (Management plane).
|
|
3
|
+
*
|
|
4
|
+
* Mirrors `apps/api/src/server/platform/routes/security/*`. Paths come
|
|
5
|
+
* from `@sylphx/contract` (`securityEndpoints`, mount `/security/*`).
|
|
6
|
+
*
|
|
7
|
+
* This is the SDK surface the CLI / Console UI use to drive the
|
|
8
|
+
* authenticated user's own security settings — distinct from
|
|
9
|
+
* `@sylphx/sdk.auth` (BaaS plane, end-user sign-in/sign-up) and from
|
|
10
|
+
* `authSettings.ts` (Management plane, project-level OAuth/SAML config).
|
|
11
|
+
*
|
|
12
|
+
* Initial scope (ADR-089 closure for P0-1 — email change). Other
|
|
13
|
+
* sub-namespaces (2FA, OAuth, password, passkeys, sessions, score,
|
|
14
|
+
* alerts) follow the same pattern as endpoints stabilise.
|
|
15
|
+
*/
|
|
16
|
+
import { securityEndpoints } from '@sylphx/contract';
|
|
17
|
+
import { request } from './http.js';
|
|
18
|
+
/**
|
|
19
|
+
* Request a change of the authenticated user's email address.
|
|
20
|
+
*
|
|
21
|
+
* The Platform issues a 32-byte verification token, persists a pending
|
|
22
|
+
* `email_change_requests` row, and emails the verification link to the
|
|
23
|
+
* **new** address. The current address is left untouched until the user
|
|
24
|
+
* confirms via {@link confirmEmailChange}. Audit-emitted as
|
|
25
|
+
* `email_change.create` with the new address masked.
|
|
26
|
+
*
|
|
27
|
+
* Errors:
|
|
28
|
+
* - 409 — `newEmail` is already in use by another account
|
|
29
|
+
* - 404 — current user not found (should not happen for a valid session)
|
|
30
|
+
*/
|
|
31
|
+
export const requestEmailChange = (client, body) => {
|
|
32
|
+
const { method, path } = securityEndpoints.email.requestChange;
|
|
33
|
+
return request(client, method, path, { body });
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Confirm a pending email change using the token delivered via email.
|
|
37
|
+
*
|
|
38
|
+
* On success the `users.email` column is updated, the pending request is
|
|
39
|
+
* deleted, a security alert is recorded, and a notification is sent to
|
|
40
|
+
* the **previous** address. Audit-emitted as `user.update` with
|
|
41
|
+
* `metadata.action = 'email_changed'`.
|
|
42
|
+
*
|
|
43
|
+
* Errors:
|
|
44
|
+
* - 422 — invalid or expired token (the row is cleaned up on expiry)
|
|
45
|
+
*/
|
|
46
|
+
export const confirmEmailChange = (client, body) => {
|
|
47
|
+
const { method, path } = securityEndpoints.email.confirmChange;
|
|
48
|
+
return request(client, method, path, { body });
|
|
49
|
+
};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service-token requests — user-submitted requests for org-scoped service
|
|
3
|
+
* tokens that require admin approval before a token is minted. Paired
|
|
4
|
+
* with `serviceTokens.ts` (which owns the final credential).
|
|
5
|
+
*
|
|
6
|
+
* POST /orgs/:orgId/service-token-requests — submit
|
|
7
|
+
* GET /orgs/:orgId/service-token-requests — list
|
|
8
|
+
* GET /orgs/:orgId/service-token-requests/:id — get
|
|
9
|
+
* POST /orgs/:orgId/service-token-requests/:id/approve — admin approve
|
|
10
|
+
* POST /orgs/:orgId/service-token-requests/:id/deny — admin deny
|
|
11
|
+
* POST /orgs/:orgId/service-token-requests/:id/cancel — requester cancel
|
|
12
|
+
* POST /orgs/:orgId/service-token-requests/:id/mint — mint after approve
|
|
13
|
+
*/
|
|
14
|
+
import type { Client } from './client.js';
|
|
15
|
+
export type ServiceTokenRequestStatus = 'pending' | 'approved' | 'denied' | 'cancelled' | 'minted' | 'expired';
|
|
16
|
+
export interface ServiceTokenRequestView {
|
|
17
|
+
readonly id: string;
|
|
18
|
+
readonly orgId: string;
|
|
19
|
+
readonly requestedBy: string;
|
|
20
|
+
readonly name: string;
|
|
21
|
+
readonly scopes: readonly string[];
|
|
22
|
+
readonly projectId: string | null;
|
|
23
|
+
readonly environmentId: string | null;
|
|
24
|
+
readonly reason: string | null;
|
|
25
|
+
readonly status: ServiceTokenRequestStatus;
|
|
26
|
+
readonly createdAt: string;
|
|
27
|
+
readonly decidedAt: string | null;
|
|
28
|
+
readonly decidedBy: string | null;
|
|
29
|
+
readonly mintedAt: string | null;
|
|
30
|
+
readonly tokenId: string | null;
|
|
31
|
+
}
|
|
32
|
+
export interface SubmitInput {
|
|
33
|
+
readonly name: string;
|
|
34
|
+
readonly scopes: readonly string[];
|
|
35
|
+
readonly projectId?: string | null;
|
|
36
|
+
readonly environmentId?: string | null;
|
|
37
|
+
readonly reason?: string;
|
|
38
|
+
readonly expiresInDays?: number | null;
|
|
39
|
+
}
|
|
40
|
+
export declare const submit: (client: Client, orgId: string, body: SubmitInput) => Promise<{
|
|
41
|
+
request: ServiceTokenRequestView;
|
|
42
|
+
}>;
|
|
43
|
+
export declare const list: (client: Client, orgId: string, query?: {
|
|
44
|
+
readonly status?: ServiceTokenRequestStatus;
|
|
45
|
+
}) => Promise<{
|
|
46
|
+
requests: readonly ServiceTokenRequestView[];
|
|
47
|
+
}>;
|
|
48
|
+
export declare const get: (client: Client, orgId: string, id: string) => Promise<{
|
|
49
|
+
request: ServiceTokenRequestView;
|
|
50
|
+
}>;
|
|
51
|
+
export declare const approve: (client: Client, orgId: string, id: string, body?: {
|
|
52
|
+
readonly note?: string;
|
|
53
|
+
}) => Promise<{
|
|
54
|
+
request: ServiceTokenRequestView;
|
|
55
|
+
}>;
|
|
56
|
+
export declare const deny: (client: Client, orgId: string, id: string, body?: {
|
|
57
|
+
readonly reason?: string;
|
|
58
|
+
}) => Promise<{
|
|
59
|
+
request: ServiceTokenRequestView;
|
|
60
|
+
}>;
|
|
61
|
+
export declare const cancel: (client: Client, orgId: string, id: string) => Promise<{
|
|
62
|
+
request: ServiceTokenRequestView;
|
|
63
|
+
}>;
|
|
64
|
+
export interface MintResult {
|
|
65
|
+
/** Raw bearer token — shown ONCE; the server stores a hash. */
|
|
66
|
+
readonly token: string;
|
|
67
|
+
readonly tokenId: string;
|
|
68
|
+
readonly request: ServiceTokenRequestView;
|
|
69
|
+
}
|
|
70
|
+
export declare const mint: (client: Client, orgId: string, id: string) => Promise<MintResult>;
|
|
71
|
+
//# sourceMappingURL=serviceTokenRequests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serviceTokenRequests.d.ts","sourceRoot":"","sources":["../src/serviceTokenRequests.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service-token requests — user-submitted requests for org-scoped service
|
|
3
|
+
* tokens that require admin approval before a token is minted. Paired
|
|
4
|
+
* with `serviceTokens.ts` (which owns the final credential).
|
|
5
|
+
*
|
|
6
|
+
* POST /orgs/:orgId/service-token-requests — submit
|
|
7
|
+
* GET /orgs/:orgId/service-token-requests — list
|
|
8
|
+
* GET /orgs/:orgId/service-token-requests/:id — get
|
|
9
|
+
* POST /orgs/:orgId/service-token-requests/:id/approve — admin approve
|
|
10
|
+
* POST /orgs/:orgId/service-token-requests/:id/deny — admin deny
|
|
11
|
+
* POST /orgs/:orgId/service-token-requests/:id/cancel — requester cancel
|
|
12
|
+
* POST /orgs/:orgId/service-token-requests/:id/mint — mint after approve
|
|
13
|
+
*/
|
|
14
|
+
import { serviceTokenRequestsEndpoints } from '@sylphx/contract';
|
|
15
|
+
import { interpolatePath, request } from './http.js';
|
|
16
|
+
export const submit = (client, orgId, body) => {
|
|
17
|
+
const { method, path } = serviceTokenRequestsEndpoints.submit;
|
|
18
|
+
return request(client, method, interpolatePath(path, { orgId }), { body });
|
|
19
|
+
};
|
|
20
|
+
export const list = (client, orgId, query) => {
|
|
21
|
+
const { method, path } = serviceTokenRequestsEndpoints.list;
|
|
22
|
+
return request(client, method, interpolatePath(path, { orgId }), query ? { query } : {});
|
|
23
|
+
};
|
|
24
|
+
export const get = (client, orgId, id) => {
|
|
25
|
+
const { method, path } = serviceTokenRequestsEndpoints.get;
|
|
26
|
+
return request(client, method, interpolatePath(path, { orgId, id }));
|
|
27
|
+
};
|
|
28
|
+
export const approve = (client, orgId, id, body = {}) => {
|
|
29
|
+
const { method, path } = serviceTokenRequestsEndpoints.approve;
|
|
30
|
+
return request(client, method, interpolatePath(path, { orgId, id }), { body });
|
|
31
|
+
};
|
|
32
|
+
export const deny = (client, orgId, id, body = {}) => {
|
|
33
|
+
const { method, path } = serviceTokenRequestsEndpoints.deny;
|
|
34
|
+
return request(client, method, interpolatePath(path, { orgId, id }), { body });
|
|
35
|
+
};
|
|
36
|
+
export const cancel = (client, orgId, id) => {
|
|
37
|
+
const { method, path } = serviceTokenRequestsEndpoints.cancel;
|
|
38
|
+
return request(client, method, interpolatePath(path, { orgId, id }));
|
|
39
|
+
};
|
|
40
|
+
export const mint = (client, orgId, id) => {
|
|
41
|
+
const { method, path } = serviceTokenRequestsEndpoints.mint;
|
|
42
|
+
return request(client, method, interpolatePath(path, { orgId, id }));
|
|
43
|
+
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service tokens (ADR-059 §3) — org-scoped bearer tokens for CI / agent
|
|
3
|
+
* workloads. Each token has a name, a scope set, optional project/env
|
|
4
|
+
* binding, and optional IP allowlist.
|
|
5
|
+
*
|
|
6
|
+
* GET /orgs/:orgId/service-tokens?includeRevoked=
|
|
7
|
+
* POST /orgs/:orgId/service-tokens — returns raw token once
|
|
8
|
+
* GET /orgs/:orgId/service-tokens/:id — metadata only
|
|
9
|
+
* DELETE /orgs/:orgId/service-tokens/:id — revoke
|
|
10
|
+
* POST /orgs/:orgId/service-tokens/:id/rotate — issue new + revoke old
|
|
11
|
+
*
|
|
12
|
+
* The raw token value is returned ONLY at create() and rotate() time —
|
|
13
|
+
* the API stores a SHA-256 hash at rest (ADR-055 Rule A).
|
|
14
|
+
*/
|
|
15
|
+
import type { Client } from './client.js';
|
|
16
|
+
export interface ServiceTokenView {
|
|
17
|
+
readonly id: string;
|
|
18
|
+
readonly orgId: string;
|
|
19
|
+
readonly name: string;
|
|
20
|
+
readonly tokenPrefix: string | null;
|
|
21
|
+
readonly projectId: string | null;
|
|
22
|
+
readonly environmentId: string | null;
|
|
23
|
+
readonly scopes: readonly string[] | null;
|
|
24
|
+
readonly ipAllowlist: readonly string[] | null;
|
|
25
|
+
readonly createdBy: string | null;
|
|
26
|
+
readonly createdAt: string;
|
|
27
|
+
readonly expiresAt: string | null;
|
|
28
|
+
readonly lastUsedAt: string | null;
|
|
29
|
+
readonly revokedAt: string | null;
|
|
30
|
+
readonly revokedBy: string | null;
|
|
31
|
+
readonly useCount: number;
|
|
32
|
+
}
|
|
33
|
+
export interface ListOptions {
|
|
34
|
+
readonly includeRevoked?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export declare const list: (client: Client, orgId: string, options?: ListOptions) => Promise<{
|
|
37
|
+
tokens: readonly ServiceTokenView[];
|
|
38
|
+
}>;
|
|
39
|
+
export interface CreateInput {
|
|
40
|
+
readonly name: string;
|
|
41
|
+
readonly scopes: readonly string[];
|
|
42
|
+
readonly projectId?: string | null;
|
|
43
|
+
readonly environmentId?: string | null;
|
|
44
|
+
readonly expiresInDays?: number | null;
|
|
45
|
+
readonly ipAllowlist?: readonly string[] | null;
|
|
46
|
+
}
|
|
47
|
+
export interface CreateResult {
|
|
48
|
+
/** Raw bearer token — shown ONCE; the server only keeps a hash. */
|
|
49
|
+
readonly token: string;
|
|
50
|
+
readonly view: ServiceTokenView;
|
|
51
|
+
}
|
|
52
|
+
export declare const create: (client: Client, orgId: string, input: CreateInput) => Promise<CreateResult>;
|
|
53
|
+
export declare const get: (client: Client, orgId: string, tokenId: string) => Promise<{
|
|
54
|
+
view: ServiceTokenView;
|
|
55
|
+
}>;
|
|
56
|
+
export declare const revoke: (client: Client, orgId: string, tokenId: string) => Promise<{
|
|
57
|
+
view: ServiceTokenView;
|
|
58
|
+
}>;
|
|
59
|
+
export interface RotateResult {
|
|
60
|
+
readonly token: string;
|
|
61
|
+
readonly oldView: ServiceTokenView;
|
|
62
|
+
readonly newView: ServiceTokenView;
|
|
63
|
+
}
|
|
64
|
+
export declare const rotate: (client: Client, orgId: string, tokenId: string) => Promise<RotateResult>;
|
|
65
|
+
//# sourceMappingURL=serviceTokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serviceTokens.d.ts","sourceRoot":"","sources":["../src/serviceTokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGzC,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IACrC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IACzC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CACjC;AAED,eAAO,MAAM,IAAI,GAChB,QAAQ,MAAM,EACd,OAAO,MAAM,EACb,UAAU,WAAW,KACnB,OAAO,CAAC;IAAE,MAAM,EAAE,SAAS,gBAAgB,EAAE,CAAA;CAAE,CAG/C,CAAA;AAEH,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;CAC/C;AAED,MAAM,WAAW,YAAY;IAC5B,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;CAC/B;AAED,eAAO,MAAM,MAAM,GAAI,QAAQ,MAAM,EAAE,OAAO,MAAM,EAAE,OAAO,WAAW,KAAG,OAAO,CAAC,YAAY,CACD,CAAA;AAE9F,eAAO,MAAM,GAAG,GACf,QAAQ,MAAM,EACd,OAAO,MAAM,EACb,SAAS,MAAM,KACb,OAAO,CAAC;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAKnC,CAAA;AAEF,eAAO,MAAM,MAAM,GAClB,QAAQ,MAAM,EACd,OAAO,MAAM,EACb,SAAS,MAAM,KACb,OAAO,CAAC;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAKnC,CAAA;AAEF,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAA;IAClC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAA;CAClC;AAED,eAAO,MAAM,MAAM,GAAI,QAAQ,MAAM,EAAE,OAAO,MAAM,EAAE,SAAS,MAAM,KAAG,OAAO,CAAC,YAAY,CAK1F,CAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service tokens (ADR-059 §3) — org-scoped bearer tokens for CI / agent
|
|
3
|
+
* workloads. Each token has a name, a scope set, optional project/env
|
|
4
|
+
* binding, and optional IP allowlist.
|
|
5
|
+
*
|
|
6
|
+
* GET /orgs/:orgId/service-tokens?includeRevoked=
|
|
7
|
+
* POST /orgs/:orgId/service-tokens — returns raw token once
|
|
8
|
+
* GET /orgs/:orgId/service-tokens/:id — metadata only
|
|
9
|
+
* DELETE /orgs/:orgId/service-tokens/:id — revoke
|
|
10
|
+
* POST /orgs/:orgId/service-tokens/:id/rotate — issue new + revoke old
|
|
11
|
+
*
|
|
12
|
+
* The raw token value is returned ONLY at create() and rotate() time —
|
|
13
|
+
* the API stores a SHA-256 hash at rest (ADR-055 Rule A).
|
|
14
|
+
*/
|
|
15
|
+
import { request } from './http.js';
|
|
16
|
+
export const list = (client, orgId, options) => request(client, 'GET', `/orgs/${encodeURIComponent(orgId)}/service-tokens`, {
|
|
17
|
+
query: { includeRevoked: options?.includeRevoked ? 'true' : undefined },
|
|
18
|
+
});
|
|
19
|
+
export const create = (client, orgId, input) => request(client, 'POST', `/orgs/${encodeURIComponent(orgId)}/service-tokens`, { body: input });
|
|
20
|
+
export const get = (client, orgId, tokenId) => request(client, 'GET', `/orgs/${encodeURIComponent(orgId)}/service-tokens/${encodeURIComponent(tokenId)}`);
|
|
21
|
+
export const revoke = (client, orgId, tokenId) => request(client, 'DELETE', `/orgs/${encodeURIComponent(orgId)}/service-tokens/${encodeURIComponent(tokenId)}`);
|
|
22
|
+
export const rotate = (client, orgId, tokenId) => request(client, 'POST', `/orgs/${encodeURIComponent(orgId)}/service-tokens/${encodeURIComponent(tokenId)}/rotate`);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Per-project services — list / get / deploy / delete. */
|
|
2
|
+
import type { Client } from './client.js';
|
|
3
|
+
import type { DeployResult, Service } from './types.js';
|
|
4
|
+
export declare const list: (client: Client, projectId: string) => Promise<Service[]>;
|
|
5
|
+
export declare const get: (client: Client, projectId: string, name: string) => Promise<Service>;
|
|
6
|
+
/** Deploy a specific service — resolves envType → environmentId first. */
|
|
7
|
+
export declare const deploy: (client: Client, projectId: string, name: string, envType: string) => Promise<DeployResult>;
|
|
8
|
+
declare const _delete: (client: Client, projectId: string, name: string) => Promise<void>;
|
|
9
|
+
export { _delete as delete };
|
|
10
|
+
//# sourceMappingURL=services.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAE3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGzC,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEvD,eAAO,MAAM,IAAI,GAAU,QAAQ,MAAM,EAAE,WAAW,MAAM,KAAG,OAAO,CAAC,OAAO,EAAE,CAO/E,CAAA;AAED,eAAO,MAAM,GAAG,GAAI,QAAQ,MAAM,EAAE,WAAW,MAAM,EAAE,MAAM,MAAM,KAAG,OAAO,CAAC,OAAO,CAKnF,CAAA;AAEF,0EAA0E;AAC1E,eAAO,MAAM,MAAM,GAClB,QAAQ,MAAM,EACd,WAAW,MAAM,EACjB,MAAM,MAAM,EACZ,SAAS,MAAM,KACb,OAAO,CAAC,YAAY,CAQtB,CAAA;AAED,QAAA,MAAM,OAAO,GAAI,QAAQ,MAAM,EAAE,WAAW,MAAM,EAAE,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAK7E,CAAA;AACF,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,CAAA"}
|
package/dist/services.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Per-project services — list / get / deploy / delete. */
|
|
2
|
+
import { resolveId as resolveEnvId } from './environments.js';
|
|
3
|
+
import { request } from './http.js';
|
|
4
|
+
export const list = async (client, projectId) => {
|
|
5
|
+
const res = await request(client, 'GET', `/projects/${encodeURIComponent(projectId)}/services`);
|
|
6
|
+
return Array.isArray(res) ? res : (res.data ?? []);
|
|
7
|
+
};
|
|
8
|
+
export const get = (client, projectId, name) => request(client, 'GET', `/projects/${encodeURIComponent(projectId)}/services/${encodeURIComponent(name)}`);
|
|
9
|
+
/** Deploy a specific service — resolves envType → environmentId first. */
|
|
10
|
+
export const deploy = async (client, projectId, name, envType) => {
|
|
11
|
+
const environmentId = await resolveEnvId(client, projectId, envType);
|
|
12
|
+
return request(client, 'POST', `/projects/${encodeURIComponent(projectId)}/services/${encodeURIComponent(name)}/deploy`, { body: environmentId ? { environmentId } : {} });
|
|
13
|
+
};
|
|
14
|
+
const _delete = (client, projectId, name) => request(client, 'DELETE', `/projects/${encodeURIComponent(projectId)}/services/${encodeURIComponent(name)}`);
|
|
15
|
+
export { _delete as delete };
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session replay — rrweb-style session recordings for debugging + UX research.
|
|
3
|
+
*
|
|
4
|
+
* GET /session-replay/projects/:projectId/sessions
|
|
5
|
+
* GET /session-replay/projects/:projectId/sessions/stats
|
|
6
|
+
* GET /session-replay/projects/:projectId/sessions/:sessionId
|
|
7
|
+
* DELETE /session-replay/projects/:projectId/sessions/:sessionId
|
|
8
|
+
*
|
|
9
|
+
* The full session payload (`get()`) decompresses every rrweb event into a
|
|
10
|
+
* plain array — it can be large (MB+) for long sessions. The list endpoint
|
|
11
|
+
* returns summary rows only; fetch the full recording only for playback.
|
|
12
|
+
*/
|
|
13
|
+
import type { Client } from './client.js';
|
|
14
|
+
export interface SessionMarker {
|
|
15
|
+
readonly type: string;
|
|
16
|
+
readonly timestamp: number;
|
|
17
|
+
readonly payload?: Readonly<Record<string, unknown>>;
|
|
18
|
+
}
|
|
19
|
+
export interface SessionReplaySummary {
|
|
20
|
+
readonly id: string;
|
|
21
|
+
readonly sessionId: string;
|
|
22
|
+
readonly userId: string | null;
|
|
23
|
+
readonly url: string | null;
|
|
24
|
+
readonly userAgent: string | null;
|
|
25
|
+
readonly screenWidth: number | null;
|
|
26
|
+
readonly screenHeight: number | null;
|
|
27
|
+
readonly devicePixelRatio: number | null;
|
|
28
|
+
readonly timezone: string | null;
|
|
29
|
+
readonly language: string | null;
|
|
30
|
+
readonly duration: number | null;
|
|
31
|
+
readonly eventCount: number;
|
|
32
|
+
readonly bytesStored: number;
|
|
33
|
+
readonly hasErrors: boolean;
|
|
34
|
+
readonly errorIds: readonly string[];
|
|
35
|
+
readonly hasRageClicks: boolean;
|
|
36
|
+
readonly hasDeadClicks: boolean;
|
|
37
|
+
readonly rageClickCount: number;
|
|
38
|
+
readonly deadClickCount: number;
|
|
39
|
+
readonly networkRequestCount: number;
|
|
40
|
+
readonly consoleLogCount: number;
|
|
41
|
+
readonly markers: readonly SessionMarker[];
|
|
42
|
+
readonly isComplete: boolean;
|
|
43
|
+
readonly startedAt: string;
|
|
44
|
+
readonly endedAt: string | null;
|
|
45
|
+
readonly createdAt: string;
|
|
46
|
+
readonly updatedAt: string;
|
|
47
|
+
}
|
|
48
|
+
export interface RageClick {
|
|
49
|
+
readonly timestamp: number;
|
|
50
|
+
readonly element: string;
|
|
51
|
+
readonly selector?: string;
|
|
52
|
+
readonly clickCount: number;
|
|
53
|
+
readonly duration?: number;
|
|
54
|
+
readonly x?: number;
|
|
55
|
+
readonly y?: number;
|
|
56
|
+
}
|
|
57
|
+
export interface DeadClick {
|
|
58
|
+
readonly timestamp: number;
|
|
59
|
+
readonly element: string;
|
|
60
|
+
readonly selector?: string;
|
|
61
|
+
readonly expectedAction?: string;
|
|
62
|
+
readonly x?: number;
|
|
63
|
+
readonly y?: number;
|
|
64
|
+
readonly waitTime?: number;
|
|
65
|
+
}
|
|
66
|
+
export interface NetworkRequest {
|
|
67
|
+
readonly timestamp: number;
|
|
68
|
+
readonly method: string;
|
|
69
|
+
readonly url: string;
|
|
70
|
+
readonly status: number;
|
|
71
|
+
readonly duration: number;
|
|
72
|
+
}
|
|
73
|
+
export interface ConsoleLog {
|
|
74
|
+
readonly timestamp: number;
|
|
75
|
+
readonly level: 'log' | 'info' | 'warn' | 'error';
|
|
76
|
+
readonly message: string;
|
|
77
|
+
readonly stack?: string;
|
|
78
|
+
}
|
|
79
|
+
export interface SessionReplayFull extends SessionReplaySummary {
|
|
80
|
+
readonly events: readonly Readonly<Record<string, unknown>>[];
|
|
81
|
+
readonly rageClicks: readonly RageClick[];
|
|
82
|
+
readonly deadClicks: readonly DeadClick[];
|
|
83
|
+
readonly networkRequests: readonly NetworkRequest[];
|
|
84
|
+
readonly consoleLogs: readonly ConsoleLog[];
|
|
85
|
+
}
|
|
86
|
+
export interface ListOptions {
|
|
87
|
+
readonly limit?: number;
|
|
88
|
+
readonly offset?: number;
|
|
89
|
+
readonly hasErrors?: boolean;
|
|
90
|
+
readonly hasRageClicks?: boolean;
|
|
91
|
+
readonly hasDeadClicks?: boolean;
|
|
92
|
+
readonly userId?: string;
|
|
93
|
+
readonly startDate?: string;
|
|
94
|
+
readonly endDate?: string;
|
|
95
|
+
}
|
|
96
|
+
export interface ListResult {
|
|
97
|
+
readonly sessions: readonly SessionReplaySummary[];
|
|
98
|
+
readonly total: number;
|
|
99
|
+
readonly hasMore: boolean;
|
|
100
|
+
}
|
|
101
|
+
export declare const list: (client: Client, projectId: string, options?: ListOptions) => Promise<ListResult>;
|
|
102
|
+
export interface SessionStats {
|
|
103
|
+
readonly totalSessions: number;
|
|
104
|
+
readonly sessionsThisMonth: number;
|
|
105
|
+
readonly sessionsThisWeek: number;
|
|
106
|
+
readonly sessionsWithErrors: number;
|
|
107
|
+
readonly sessionsWithRageClicks: number;
|
|
108
|
+
readonly totalStorageBytes: number;
|
|
109
|
+
}
|
|
110
|
+
export declare const stats: (client: Client, projectId: string) => Promise<SessionStats>;
|
|
111
|
+
export declare const get: (client: Client, projectId: string, sessionId: string) => Promise<SessionReplayFull>;
|
|
112
|
+
declare const _delete: (client: Client, projectId: string, sessionId: string) => Promise<{
|
|
113
|
+
success: boolean;
|
|
114
|
+
}>;
|
|
115
|
+
export { _delete as delete };
|
|
116
|
+
//# sourceMappingURL=sessionReplay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionReplay.d.ts","sourceRoot":"","sources":["../src/sessionReplay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGzC,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CACpD;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAA;IACpC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAA;IAC1C,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;IACjD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,iBAAkB,SAAQ,oBAAoB;IAC9D,QAAQ,CAAC,MAAM,EAAE,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,CAAA;IAC7D,QAAQ,CAAC,UAAU,EAAE,SAAS,SAAS,EAAE,CAAA;IACzC,QAAQ,CAAC,UAAU,EAAE,SAAS,SAAS,EAAE,CAAA;IACzC,QAAQ,CAAC,eAAe,EAAE,SAAS,cAAc,EAAE,CAAA;IACnD,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAA;CAC3C;AAED,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,QAAQ,EAAE,SAAS,oBAAoB,EAAE,CAAA;IAClD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CACzB;AAED,eAAO,MAAM,IAAI,GAChB,QAAQ,MAAM,EACd,WAAW,MAAM,EACjB,UAAU,WAAW,KACnB,OAAO,CAAC,UAAU,CAclB,CAAA;AAEH,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAA;IACnC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAA;IACvC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;CAClC;AAED,eAAO,MAAM,KAAK,GAAI,QAAQ,MAAM,EAAE,WAAW,MAAM,KAAG,OAAO,CAAC,YAAY,CACqB,CAAA;AAEnG,eAAO,MAAM,GAAG,GACf,QAAQ,MAAM,EACd,WAAW,MAAM,EACjB,WAAW,MAAM,KACf,OAAO,CAAC,iBAAiB,CAK1B,CAAA;AAEF,QAAA,MAAM,OAAO,GACZ,QAAQ,MAAM,EACd,WAAW,MAAM,EACjB,WAAW,MAAM,KACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAK7B,CAAA;AACF,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session replay — rrweb-style session recordings for debugging + UX research.
|
|
3
|
+
*
|
|
4
|
+
* GET /session-replay/projects/:projectId/sessions
|
|
5
|
+
* GET /session-replay/projects/:projectId/sessions/stats
|
|
6
|
+
* GET /session-replay/projects/:projectId/sessions/:sessionId
|
|
7
|
+
* DELETE /session-replay/projects/:projectId/sessions/:sessionId
|
|
8
|
+
*
|
|
9
|
+
* The full session payload (`get()`) decompresses every rrweb event into a
|
|
10
|
+
* plain array — it can be large (MB+) for long sessions. The list endpoint
|
|
11
|
+
* returns summary rows only; fetch the full recording only for playback.
|
|
12
|
+
*/
|
|
13
|
+
import { request } from './http.js';
|
|
14
|
+
export const list = (client, projectId, options) => request(client, 'GET', `/session-replay/projects/${encodeURIComponent(projectId)}/sessions`, {
|
|
15
|
+
query: {
|
|
16
|
+
limit: options?.limit !== undefined ? String(options.limit) : undefined,
|
|
17
|
+
offset: options?.offset !== undefined ? String(options.offset) : undefined,
|
|
18
|
+
hasErrors: options?.hasErrors !== undefined ? String(options.hasErrors) : undefined,
|
|
19
|
+
hasRageClicks: options?.hasRageClicks !== undefined ? String(options.hasRageClicks) : undefined,
|
|
20
|
+
hasDeadClicks: options?.hasDeadClicks !== undefined ? String(options.hasDeadClicks) : undefined,
|
|
21
|
+
userId: options?.userId,
|
|
22
|
+
startDate: options?.startDate,
|
|
23
|
+
endDate: options?.endDate,
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
export const stats = (client, projectId) => request(client, 'GET', `/session-replay/projects/${encodeURIComponent(projectId)}/sessions/stats`);
|
|
27
|
+
export const get = (client, projectId, sessionId) => request(client, 'GET', `/session-replay/projects/${encodeURIComponent(projectId)}/sessions/${encodeURIComponent(sessionId)}`);
|
|
28
|
+
const _delete = (client, projectId, sessionId) => request(client, 'DELETE', `/session-replay/projects/${encodeURIComponent(projectId)}/sessions/${encodeURIComponent(sessionId)}`);
|
|
29
|
+
export { _delete as delete };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Blob storage — list / create / delete. */
|
|
2
|
+
import type { Client } from './client.js';
|
|
3
|
+
import type { StorageResource } from './types.js';
|
|
4
|
+
export declare const list: (client: Client, projectId: string, envType?: string) => Promise<StorageResource[]>;
|
|
5
|
+
export interface CreateInput {
|
|
6
|
+
readonly name: string;
|
|
7
|
+
readonly envType: string;
|
|
8
|
+
}
|
|
9
|
+
export declare const create: (client: Client, projectId: string, input: CreateInput) => Promise<StorageResource>;
|
|
10
|
+
declare const _delete: (client: Client, projectId: string, storageId: string) => Promise<void>;
|
|
11
|
+
export { _delete as delete };
|
|
12
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAE7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD,eAAO,MAAM,IAAI,GAChB,QAAQ,MAAM,EACd,WAAW,MAAM,EACjB,UAAU,MAAM,KACd,OAAO,CAAC,eAAe,EAAE,CAQ3B,CAAA;AAED,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACxB;AAED,eAAO,MAAM,MAAM,GAClB,QAAQ,MAAM,EACd,WAAW,MAAM,EACjB,OAAO,WAAW,KAChB,OAAO,CAAC,eAAe,CACqE,CAAA;AAE/F,QAAA,MAAM,OAAO,GAAI,QAAQ,MAAM,EAAE,WAAW,MAAM,EAAE,WAAW,MAAM,KAAG,OAAO,CAAC,IAAI,CAKlF,CAAA;AACF,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,CAAA"}
|
package/dist/storage.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Blob storage — list / create / delete. */
|
|
2
|
+
import { request } from './http.js';
|
|
3
|
+
export const list = async (client, projectId, envType) => {
|
|
4
|
+
const res = await request(client, 'GET', `/projects/${encodeURIComponent(projectId)}/storage`);
|
|
5
|
+
const arr = Array.isArray(res) ? res : [];
|
|
6
|
+
return envType ? arr.filter((r) => !r.envType || r.envType === envType) : arr;
|
|
7
|
+
};
|
|
8
|
+
export const create = (client, projectId, input) => request(client, 'POST', `/projects/${encodeURIComponent(projectId)}/storage`, { body: input });
|
|
9
|
+
const _delete = (client, projectId, storageId) => request(client, 'DELETE', `/projects/${encodeURIComponent(projectId)}/storage/${encodeURIComponent(storageId)}`);
|
|
10
|
+
export { _delete as delete };
|
package/dist/tasks.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Task definitions (jobs / crons / services) — upsert by taskName + envId. */
|
|
2
|
+
import type { Client } from './client.js';
|
|
3
|
+
import type { Task } from './types.js';
|
|
4
|
+
export declare const list: (client: Client, projectId: string, envType?: string) => Promise<Task[]>;
|
|
5
|
+
export interface CreateInput {
|
|
6
|
+
readonly taskName: string;
|
|
7
|
+
readonly envType: string;
|
|
8
|
+
readonly executionMode?: 'job' | 'service' | 'cron';
|
|
9
|
+
readonly command?: readonly string[];
|
|
10
|
+
readonly imageRef?: string;
|
|
11
|
+
readonly machineConfig?: {
|
|
12
|
+
cpu?: string;
|
|
13
|
+
memory?: string;
|
|
14
|
+
gpu?: string;
|
|
15
|
+
};
|
|
16
|
+
readonly handlerPath?: string;
|
|
17
|
+
readonly timeoutSeconds?: number;
|
|
18
|
+
readonly retryConfig?: {
|
|
19
|
+
maxAttempts?: number;
|
|
20
|
+
backoff?: 'fixed' | 'exponential';
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export declare const create: (client: Client, projectId: string, input: CreateInput) => Promise<Task>;
|
|
24
|
+
export declare const get: (client: Client, projectId: string, taskId: string) => Promise<Task>;
|
|
25
|
+
export type UpdateInput = Partial<Pick<Task, 'executionMode' | 'command' | 'imageRef' | 'machineConfig' | 'handlerPath' | 'timeoutSeconds' | 'retryConfig'>>;
|
|
26
|
+
export declare const update: (client: Client, projectId: string, taskId: string, input: UpdateInput) => Promise<Task>;
|
|
27
|
+
declare const _delete: (client: Client, projectId: string, taskId: string) => Promise<void>;
|
|
28
|
+
export { _delete as delete };
|
|
29
|
+
//# sourceMappingURL=tasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../src/tasks.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAE/E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGzC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAEtC,eAAO,MAAM,IAAI,GAChB,QAAQ,MAAM,EACd,WAAW,MAAM,EACjB,UAAU,MAAM,KACd,OAAO,CAAC,IAAI,EAAE,CAShB,CAAA;AAED,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,CAAA;IACnD,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACxE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,GAAG,aAAa,CAAA;KAAE,CAAA;CAClF;AAED,eAAO,MAAM,MAAM,GAClB,QAAQ,MAAM,EACd,WAAW,MAAM,EACjB,OAAO,WAAW,KAChB,OAAO,CAAC,IAAI,CAad,CAAA;AAED,eAAO,MAAM,GAAG,GAAU,QAAQ,MAAM,EAAE,WAAW,MAAM,EAAE,QAAQ,MAAM,KAAG,OAAO,CAAC,IAAI,CAOzF,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,OAAO,CAChC,IAAI,CACH,IAAI,EACF,eAAe,GACf,SAAS,GACT,UAAU,GACV,eAAe,GACf,aAAa,GACb,gBAAgB,GAChB,aAAa,CACf,CACD,CAAA;AAED,eAAO,MAAM,MAAM,GAClB,QAAQ,MAAM,EACd,WAAW,MAAM,EACjB,QAAQ,MAAM,EACd,OAAO,WAAW,KAChB,OAAO,CAAC,IAAI,CAQd,CAAA;AAED,QAAA,MAAM,OAAO,GAAU,QAAQ,MAAM,EAAE,WAAW,MAAM,EAAE,QAAQ,MAAM,KAAG,OAAO,CAAC,IAAI,CAMtF,CAAA;AACD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,CAAA"}
|
package/dist/tasks.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Task definitions (jobs / crons / services) — upsert by taskName + envId. */
|
|
2
|
+
import { resolveId as resolveEnvId } from './environments.js';
|
|
3
|
+
import { request } from './http.js';
|
|
4
|
+
export const list = async (client, projectId, envType) => {
|
|
5
|
+
const envId = envType ? await resolveEnvId(client, projectId, envType) : undefined;
|
|
6
|
+
const res = await request(client, 'GET', `/projects/${encodeURIComponent(projectId)}/tasks`, envId ? { query: { envId } } : {});
|
|
7
|
+
return res.tasks ?? [];
|
|
8
|
+
};
|
|
9
|
+
export const create = async (client, projectId, input) => {
|
|
10
|
+
const envId = await resolveEnvId(client, projectId, input.envType);
|
|
11
|
+
if (!envId) {
|
|
12
|
+
throw new Error(`Environment '${input.envType}' not found for project '${projectId}'`);
|
|
13
|
+
}
|
|
14
|
+
const { envType: _drop, ...rest } = input;
|
|
15
|
+
const res = await request(client, 'POST', `/projects/${encodeURIComponent(projectId)}/tasks`, { body: { ...rest, envId } });
|
|
16
|
+
return res.task;
|
|
17
|
+
};
|
|
18
|
+
export const get = async (client, projectId, taskId) => {
|
|
19
|
+
const res = await request(client, 'GET', `/projects/${encodeURIComponent(projectId)}/tasks/${encodeURIComponent(taskId)}`);
|
|
20
|
+
return res.task;
|
|
21
|
+
};
|
|
22
|
+
export const update = async (client, projectId, taskId, input) => {
|
|
23
|
+
const res = await request(client, 'PATCH', `/projects/${encodeURIComponent(projectId)}/tasks/${encodeURIComponent(taskId)}`, { body: input });
|
|
24
|
+
return res.task;
|
|
25
|
+
};
|
|
26
|
+
const _delete = async (client, projectId, taskId) => {
|
|
27
|
+
await request(client, 'DELETE', `/projects/${encodeURIComponent(projectId)}/tasks/${encodeURIComponent(taskId)}`);
|
|
28
|
+
};
|
|
29
|
+
export { _delete as delete };
|