@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.
Files changed (259) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/LICENSE +21 -0
  3. package/README.md +157 -101
  4. package/dist/admin.d.ts +168 -0
  5. package/dist/admin.d.ts.map +1 -0
  6. package/dist/admin.js +123 -0
  7. package/dist/adminBootstrap.d.ts +46 -0
  8. package/dist/adminBootstrap.d.ts.map +1 -0
  9. package/dist/adminBootstrap.js +33 -0
  10. package/dist/adminBuilds.d.ts +72 -0
  11. package/dist/adminBuilds.d.ts.map +1 -0
  12. package/dist/adminBuilds.js +29 -0
  13. package/dist/adminEnvServices.d.ts +41 -0
  14. package/dist/adminEnvServices.d.ts.map +1 -0
  15. package/dist/adminEnvServices.js +22 -0
  16. package/dist/adminRateLimits.d.ts +61 -0
  17. package/dist/adminRateLimits.d.ts.map +1 -0
  18. package/dist/adminRateLimits.js +44 -0
  19. package/dist/adminReconcile.d.ts +45 -0
  20. package/dist/adminReconcile.d.ts.map +1 -0
  21. package/dist/adminReconcile.js +20 -0
  22. package/dist/adminResources.d.ts +97 -0
  23. package/dist/adminResources.d.ts.map +1 -0
  24. package/dist/adminResources.js +40 -0
  25. package/dist/adminSecrets.d.ts +60 -0
  26. package/dist/adminSecrets.d.ts.map +1 -0
  27. package/dist/adminSecrets.js +43 -0
  28. package/dist/adminTenants.d.ts +41 -0
  29. package/dist/adminTenants.d.ts.map +1 -0
  30. package/dist/adminTenants.js +29 -0
  31. package/dist/ai.d.ts +148 -0
  32. package/dist/ai.d.ts.map +1 -0
  33. package/dist/ai.js +29 -0
  34. package/dist/analytics.d.ts +49 -0
  35. package/dist/analytics.d.ts.map +1 -0
  36. package/dist/analytics.js +23 -0
  37. package/dist/auth.d.ts +39 -0
  38. package/dist/auth.d.ts.map +1 -0
  39. package/dist/auth.js +27 -0
  40. package/dist/authSettings.d.ts +71 -0
  41. package/dist/authSettings.d.ts.map +1 -0
  42. package/dist/authSettings.js +39 -0
  43. package/dist/backups.d.ts +66 -0
  44. package/dist/backups.d.ts.map +1 -0
  45. package/dist/backups.js +32 -0
  46. package/dist/billing.d.ts +105 -0
  47. package/dist/billing.d.ts.map +1 -0
  48. package/dist/billing.js +42 -0
  49. package/dist/billingSettings.d.ts +78 -0
  50. package/dist/billingSettings.d.ts.map +1 -0
  51. package/dist/billingSettings.js +54 -0
  52. package/dist/branchDatabases.d.ts +53 -0
  53. package/dist/branchDatabases.d.ts.map +1 -0
  54. package/dist/branchDatabases.js +38 -0
  55. package/dist/certs.d.ts +63 -0
  56. package/dist/certs.d.ts.map +1 -0
  57. package/dist/certs.js +28 -0
  58. package/dist/ciSettings.d.ts +77 -0
  59. package/dist/ciSettings.d.ts.map +1 -0
  60. package/dist/ciSettings.js +41 -0
  61. package/dist/client.d.ts +36 -38
  62. package/dist/client.d.ts.map +1 -1
  63. package/dist/client.js +32 -90
  64. package/dist/consent.d.ts +111 -0
  65. package/dist/consent.d.ts.map +1 -0
  66. package/dist/consent.js +35 -0
  67. package/dist/databases.d.ts +17 -0
  68. package/dist/databases.d.ts.map +1 -0
  69. package/dist/databases.js +32 -0
  70. package/dist/deployments.d.ts +22 -0
  71. package/dist/deployments.d.ts.map +1 -0
  72. package/dist/deployments.js +39 -0
  73. package/dist/domains.d.ts +26 -0
  74. package/dist/domains.d.ts.map +1 -0
  75. package/dist/domains.js +39 -0
  76. package/dist/edgeDeployments.d.ts +43 -0
  77. package/dist/edgeDeployments.d.ts.map +1 -0
  78. package/dist/edgeDeployments.js +32 -0
  79. package/dist/email.d.ts +45 -0
  80. package/dist/email.d.ts.map +1 -0
  81. package/dist/email.js +21 -0
  82. package/dist/engagement.d.ts +100 -0
  83. package/dist/engagement.d.ts.map +1 -0
  84. package/dist/engagement.js +28 -0
  85. package/dist/envVars.d.ts +17 -0
  86. package/dist/envVars.d.ts.map +1 -0
  87. package/dist/envVars.js +34 -0
  88. package/dist/environments.d.ts +41 -0
  89. package/dist/environments.d.ts.map +1 -0
  90. package/dist/environments.js +54 -0
  91. package/dist/errors.d.ts +8 -3
  92. package/dist/errors.d.ts.map +1 -1
  93. package/dist/errors.js +8 -2
  94. package/dist/experiments.d.ts +80 -0
  95. package/dist/experiments.d.ts.map +1 -0
  96. package/dist/experiments.js +23 -0
  97. package/dist/flags.d.ts +85 -0
  98. package/dist/flags.d.ts.map +1 -0
  99. package/dist/flags.js +25 -0
  100. package/dist/functions.d.ts +39 -0
  101. package/dist/functions.d.ts.map +1 -0
  102. package/dist/functions.js +40 -0
  103. package/dist/github.d.ts +33 -0
  104. package/dist/github.d.ts.map +1 -0
  105. package/dist/github.js +22 -0
  106. package/dist/http.d.ts +49 -0
  107. package/dist/http.d.ts.map +1 -0
  108. package/dist/http.js +97 -0
  109. package/dist/index.d.ts +85 -20
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +86 -20
  112. package/dist/kv.d.ts +66 -0
  113. package/dist/kv.d.ts.map +1 -0
  114. package/dist/kv.js +36 -0
  115. package/dist/logs.d.ts +14 -0
  116. package/dist/logs.d.ts.map +1 -0
  117. package/dist/logs.js +17 -0
  118. package/dist/management.d.ts +55 -0
  119. package/dist/management.d.ts.map +1 -0
  120. package/dist/management.js +31 -0
  121. package/dist/monitoring.d.ts +65 -0
  122. package/dist/monitoring.d.ts.map +1 -0
  123. package/dist/monitoring.js +29 -0
  124. package/dist/newsletter.d.ts +279 -0
  125. package/dist/newsletter.d.ts.map +1 -0
  126. package/dist/newsletter.js +98 -0
  127. package/dist/notifications.d.ts +30 -0
  128. package/dist/notifications.d.ts.map +1 -0
  129. package/dist/notifications.js +19 -0
  130. package/dist/oidc.d.ts +46 -0
  131. package/dist/oidc.d.ts.map +1 -0
  132. package/dist/oidc.js +25 -0
  133. package/dist/organizations.d.ts +24 -0
  134. package/dist/organizations.d.ts.map +1 -0
  135. package/dist/organizations.js +42 -0
  136. package/dist/plans.d.ts +66 -0
  137. package/dist/plans.d.ts.map +1 -0
  138. package/dist/plans.js +42 -0
  139. package/dist/privacy.d.ts +138 -0
  140. package/dist/privacy.d.ts.map +1 -0
  141. package/dist/privacy.js +41 -0
  142. package/dist/projects.d.ts +14 -0
  143. package/dist/projects.d.ts.map +1 -0
  144. package/dist/projects.js +22 -0
  145. package/dist/realtime.d.ts +33 -0
  146. package/dist/realtime.d.ts.map +1 -0
  147. package/dist/realtime.js +19 -0
  148. package/dist/referrals.d.ts +100 -0
  149. package/dist/referrals.d.ts.map +1 -0
  150. package/dist/referrals.js +33 -0
  151. package/dist/refresh.d.ts +44 -0
  152. package/dist/refresh.d.ts.map +1 -0
  153. package/dist/refresh.js +33 -0
  154. package/dist/remoteConfig.d.ts +15 -0
  155. package/dist/remoteConfig.d.ts.map +1 -0
  156. package/dist/remoteConfig.js +35 -0
  157. package/dist/resourceBindings.d.ts +19 -0
  158. package/dist/resourceBindings.d.ts.map +1 -0
  159. package/dist/resourceBindings.js +24 -0
  160. package/dist/runners.d.ts +60 -0
  161. package/dist/runners.d.ts.map +1 -0
  162. package/dist/runners.js +17 -0
  163. package/dist/saml.d.ts +44 -0
  164. package/dist/saml.d.ts.map +1 -0
  165. package/dist/saml.js +77 -0
  166. package/dist/sandboxes.d.ts +15 -0
  167. package/dist/sandboxes.d.ts.map +1 -0
  168. package/dist/sandboxes.js +18 -0
  169. package/dist/search.d.ts +66 -0
  170. package/dist/search.d.ts.map +1 -0
  171. package/dist/search.js +29 -0
  172. package/dist/secrets.d.ts +50 -0
  173. package/dist/secrets.d.ts.map +1 -0
  174. package/dist/secrets.js +61 -0
  175. package/dist/security.d.ts +58 -0
  176. package/dist/security.d.ts.map +1 -0
  177. package/dist/security.js +49 -0
  178. package/dist/serviceTokenRequests.d.ts +71 -0
  179. package/dist/serviceTokenRequests.d.ts.map +1 -0
  180. package/dist/serviceTokenRequests.js +43 -0
  181. package/dist/serviceTokens.d.ts +65 -0
  182. package/dist/serviceTokens.d.ts.map +1 -0
  183. package/dist/serviceTokens.js +22 -0
  184. package/dist/services.d.ts +10 -0
  185. package/dist/services.d.ts.map +1 -0
  186. package/dist/services.js +15 -0
  187. package/dist/sessionReplay.d.ts +116 -0
  188. package/dist/sessionReplay.d.ts.map +1 -0
  189. package/dist/sessionReplay.js +29 -0
  190. package/dist/storage.d.ts +12 -0
  191. package/dist/storage.d.ts.map +1 -0
  192. package/dist/storage.js +10 -0
  193. package/dist/tasks.d.ts +29 -0
  194. package/dist/tasks.d.ts.map +1 -0
  195. package/dist/tasks.js +29 -0
  196. package/dist/types.d.ts +59 -155
  197. package/dist/types.d.ts.map +1 -1
  198. package/dist/types.js +17 -3
  199. package/dist/user.d.ts +99 -0
  200. package/dist/user.d.ts.map +1 -0
  201. package/dist/user.js +58 -0
  202. package/dist/users.d.ts +9 -0
  203. package/dist/users.d.ts.map +1 -0
  204. package/dist/users.js +11 -0
  205. package/dist/volumes.d.ts +16 -0
  206. package/dist/volumes.d.ts.map +1 -0
  207. package/dist/volumes.js +9 -0
  208. package/dist/webhooks.d.ts +77 -0
  209. package/dist/webhooks.d.ts.map +1 -0
  210. package/dist/webhooks.js +27 -0
  211. package/package.json +194 -5
  212. package/dist/request.d.ts +0 -5
  213. package/dist/request.d.ts.map +0 -1
  214. package/dist/request.js +0 -1
  215. package/dist/resources/config.d.ts +0 -30
  216. package/dist/resources/config.d.ts.map +0 -1
  217. package/dist/resources/config.js +0 -62
  218. package/dist/resources/databases.d.ts +0 -26
  219. package/dist/resources/databases.d.ts.map +0 -1
  220. package/dist/resources/databases.js +0 -29
  221. package/dist/resources/deployments.d.ts +0 -24
  222. package/dist/resources/deployments.d.ts.map +0 -1
  223. package/dist/resources/deployments.js +0 -30
  224. package/dist/resources/domains.d.ts +0 -30
  225. package/dist/resources/domains.d.ts.map +0 -1
  226. package/dist/resources/domains.js +0 -46
  227. package/dist/resources/env-vars.d.ts +0 -19
  228. package/dist/resources/env-vars.d.ts.map +0 -1
  229. package/dist/resources/env-vars.js +0 -30
  230. package/dist/resources/environments.d.ts +0 -16
  231. package/dist/resources/environments.d.ts.map +0 -1
  232. package/dist/resources/environments.js +0 -24
  233. package/dist/resources/logs.d.ts +0 -13
  234. package/dist/resources/logs.d.ts.map +0 -1
  235. package/dist/resources/logs.js +0 -20
  236. package/dist/resources/org.d.ts +0 -15
  237. package/dist/resources/org.d.ts.map +0 -1
  238. package/dist/resources/org.js +0 -25
  239. package/dist/resources/projects.d.ts +0 -19
  240. package/dist/resources/projects.d.ts.map +0 -1
  241. package/dist/resources/projects.js +0 -19
  242. package/dist/resources/resources.d.ts +0 -26
  243. package/dist/resources/resources.d.ts.map +0 -1
  244. package/dist/resources/resources.js +0 -32
  245. package/dist/resources/services.d.ts +0 -21
  246. package/dist/resources/services.d.ts.map +0 -1
  247. package/dist/resources/services.js +0 -30
  248. package/dist/resources/storage.d.ts +0 -21
  249. package/dist/resources/storage.d.ts.map +0 -1
  250. package/dist/resources/storage.js +0 -25
  251. package/dist/resources/tasks.d.ts +0 -42
  252. package/dist/resources/tasks.d.ts.map +0 -1
  253. package/dist/resources/tasks.js +0 -49
  254. package/dist/resources/user.d.ts +0 -9
  255. package/dist/resources/user.d.ts.map +0 -1
  256. package/dist/resources/user.js +0 -10
  257. package/dist/resources/volumes.d.ts +0 -20
  258. package/dist/resources/volumes.d.ts.map +0 -1
  259. package/dist/resources/volumes.js +0 -19
@@ -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"}
@@ -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":"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"}
@@ -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"}
@@ -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 };
@@ -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 };