@astram/frontend-core 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -13,6 +13,8 @@ export { createRecordPolicyService } from './recordPolicyService.js';
13
13
  export type { RecordPolicyService, GuidedPolicy, PolicyCondition, PolicyOperator, PolicyRow, PolicyTypeSchema, PolicyFieldSchema, } from './recordPolicyService.js';
14
14
  export { createRecordShareService } from './recordShareService.js';
15
15
  export type { RecordShareService, ShareRequest, ShareView, ShareGranteeKind, } from './recordShareService.js';
16
+ export { createServiceAccountService } from './serviceAccountService.js';
17
+ export type { ServiceAccountService, ServiceAccountView, IssuedKey, CreateServiceAccountBody, UpdateServiceAccountBody, AssignableAccess, AssignableRole, AssignableScopeNode, AssignableResult, } from './serviceAccountService.js';
16
18
  export { isAuthenticated, accessTokenOf, tenantOf, principalOf } from './session.js';
17
19
  export { isRestorablePath, encodeReturnPath, decodeReturnPath } from './returnPath.js';
18
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,YAAY,EACV,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,SAAS,EACT,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,YAAY,EACV,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,SAAS,EACT,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,YAAY,EACV,qBAAqB,EACrB,kBAAkB,EAClB,SAAS,EACT,wBAAwB,EACxB,wBAAwB,EACxB,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -11,6 +11,7 @@ export { createAuditService } from './auditService.js';
11
11
  export { createCrossTenantService } from './crossTenantService.js';
12
12
  export { createRecordPolicyService } from './recordPolicyService.js';
13
13
  export { createRecordShareService } from './recordShareService.js';
14
+ export { createServiceAccountService } from './serviceAccountService.js';
14
15
  export { isAuthenticated, accessTokenOf, tenantOf, principalOf } from './session.js';
15
16
  export { isRestorablePath, encodeReturnPath, decodeReturnPath } from './returnPath.js';
16
17
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAUrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAOnE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAUrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAOnE,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AAYzE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * createServiceAccountService — platform-agnostic calls to the identity feature's SERVICE ACCOUNTS
3
+ * surface (ADR-0033): list/create/edit machine accounts + issue/rotate/revoke their `ask_…` API
4
+ * keys. Like {@link createCrossTenantService}, it takes an injected HTTP client and carries no
5
+ * platform code, so web + mobile share it. The bearer token is passed per call (the UI holds the
6
+ * session; the shared logic stays stateless).
7
+ *
8
+ * Every method resolves to a plain result object (never throws): `{ ok:true, ... }` on success,
9
+ * `{ ok:false, status, error }` on any non-2xx (401 = not authenticated, 403 = denied by policy /
10
+ * over the ADR-0029 ceiling, 404 = not in your tenant, 400 = the server's message, else generic).
11
+ *
12
+ * The server routes these hit (all `@Classified service_account:*`):
13
+ * GET /identity/service-accounts (read — list)
14
+ * GET /identity/service-accounts/assignable (create — picker source: what I may grant)
15
+ * GET /identity/service-accounts/:id (read — one)
16
+ * POST /identity/service-accounts (create)
17
+ * PATCH /identity/service-accounts/:id (update)
18
+ * POST /identity/service-accounts/:id/keys (manage_keys — issue)
19
+ * POST /identity/service-accounts/:id/keys/rotate (manage_keys — rotate)
20
+ * POST /identity/service-accounts/:id/keys/revoke (manage_keys — revoke)
21
+ *
22
+ * ⛔ The tenant/actor are NEVER sent by the client — the server stamps them from the authenticated
23
+ * principal. An account is shown by LABEL (+ `createdByName`); its `id` rides only as the route key
24
+ * (never a display value). ⛔ The raw `ask_…` key comes back EXACTLY ONCE from issue/rotate — the
25
+ * view must reveal it immediately (it is never retrievable again).
26
+ */
27
+ import type { HttpClient } from '../http/types.js';
28
+ /** A service-account row as returned by the list/get/create/update endpoints (label-only). */
29
+ export interface ServiceAccountView {
30
+ id: string;
31
+ label: string;
32
+ scopeSubtreeNodeIds: string[];
33
+ /** Resolved company names, same order as `scopeSubtreeNodeIds` (show these, never the ids). */
34
+ scopeLabels: string[];
35
+ roleIds: string[];
36
+ /** Resolved role names, same order as `roleIds` (show these, never the ids). */
37
+ roleLabels: string[];
38
+ status: string;
39
+ createdByName: string | null;
40
+ createdAtMs: number;
41
+ updatedAtMs: number | null;
42
+ }
43
+ /** A role the caller may grant (picker option). `id` is the value sent back; show `name`. */
44
+ export interface AssignableRole {
45
+ id: string;
46
+ name: string;
47
+ }
48
+ /** A scope node (company) the caller may grant. `parentId` is set only when the parent is also assignable. */
49
+ export interface AssignableScopeNode {
50
+ id: string;
51
+ name: string;
52
+ parentId: string | null;
53
+ }
54
+ /**
55
+ * What the caller may grant an agent — computed server-side from the SAME ceiling the create/update
56
+ * write enforces (ADR-0029), so the picker never offers what the save would reject. Nodes arrive
57
+ * tree-ordered (parent before children). An agent's existing role/node that is NOT in this set was
58
+ * assigned by someone with more access: show it checked + locked, and never send it — a non-root
59
+ * PATCH keeps it automatically (sending it is a 403).
60
+ */
61
+ export interface AssignableAccess {
62
+ roles: AssignableRole[];
63
+ scopeNodes: AssignableScopeNode[];
64
+ }
65
+ /** The ONE-TIME key reveal returned by issue/rotate — the only time the raw key exists. */
66
+ export interface IssuedKey {
67
+ apiKey: string;
68
+ accountLabel: string;
69
+ version: number;
70
+ expiresAtMs: number | null;
71
+ }
72
+ /** The create body — label + optional scope/roles (all ⊆ the caller's own, server-enforced). */
73
+ export interface CreateServiceAccountBody {
74
+ label: string;
75
+ scopeSubtreeNodeIds?: string[];
76
+ roleIds?: string[];
77
+ }
78
+ /**
79
+ * The update patch — any subset of label/scope/roles/status. `scopeSubtreeNodeIds: []` is a 400
80
+ * (an agent needs at least one node). For a non-root caller, `roleIds` / `scopeSubtreeNodeIds` list
81
+ * only items from {@link AssignableAccess}; the agent's locked (out-of-ceiling) items are preserved.
82
+ */
83
+ export interface UpdateServiceAccountBody {
84
+ label?: string;
85
+ scopeSubtreeNodeIds?: string[];
86
+ roleIds?: string[];
87
+ status?: 'active' | 'disabled';
88
+ }
89
+ export type ListResult = {
90
+ ok: true;
91
+ accounts: ServiceAccountView[];
92
+ } | {
93
+ ok: false;
94
+ status: number;
95
+ error: string;
96
+ };
97
+ export type AccountResult = {
98
+ ok: true;
99
+ account: ServiceAccountView;
100
+ } | {
101
+ ok: false;
102
+ status: number;
103
+ error: string;
104
+ };
105
+ export type KeyResult = {
106
+ ok: true;
107
+ key: IssuedKey;
108
+ } | {
109
+ ok: false;
110
+ status: number;
111
+ error: string;
112
+ };
113
+ export type OkResult = {
114
+ ok: true;
115
+ } | {
116
+ ok: false;
117
+ status: number;
118
+ error: string;
119
+ };
120
+ export type AssignableResult = ({
121
+ ok: true;
122
+ } & AssignableAccess) | {
123
+ ok: false;
124
+ status: number;
125
+ error: string;
126
+ };
127
+ export interface ServiceAccountService {
128
+ list(accessToken: string): Promise<ListResult>;
129
+ /** The roles + scope nodes the caller may grant (picker source; `service_account:create`). */
130
+ listAssignable(accessToken: string): Promise<AssignableResult>;
131
+ get(accessToken: string, id: string): Promise<AccountResult>;
132
+ create(accessToken: string, body: CreateServiceAccountBody): Promise<AccountResult>;
133
+ update(accessToken: string, id: string, body: UpdateServiceAccountBody): Promise<AccountResult>;
134
+ issueKey(accessToken: string, id: string, opts?: {
135
+ expiresAtMs?: number;
136
+ }): Promise<KeyResult>;
137
+ rotateKey(accessToken: string, id: string, opts?: {
138
+ expiresAtMs?: number;
139
+ }): Promise<KeyResult>;
140
+ revokeKeys(accessToken: string, id: string): Promise<OkResult>;
141
+ }
142
+ export declare function createServiceAccountService(http: HttpClient): ServiceAccountService;
143
+ //# sourceMappingURL=serviceAccountService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serviceAccountService.d.ts","sourceRoot":"","sources":["../../src/auth/serviceAccountService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ const BASE = '/identity/service-accounts';
2
+ export function createServiceAccountService(http) {
3
+ /** Map a non-2xx response to a `{ ok:false }` with a friendly, status-specific message. */
4
+ function fail(r, generic) {
5
+ if (r.status === 401)
6
+ return { ok: false, status: 401, error: 'Not authenticated (no/invalid token).' };
7
+ if (r.status === 403) {
8
+ return { ok: false, status: 403, error: msgOf(r.data) || 'You do not have access to do this.' };
9
+ }
10
+ if (r.status === 404)
11
+ return { ok: false, status: 404, error: 'Service account not found.' };
12
+ if (r.status === 400)
13
+ return { ok: false, status: 400, error: msgOf(r.data) || generic };
14
+ if (r.status === 409) {
15
+ return { ok: false, status: 409, error: msgOf(r.data) || 'Someone else changed this just now — reload and try again.' };
16
+ }
17
+ return { ok: false, status: r.status, error: generic };
18
+ }
19
+ /** Pull a server error message (`{ message }`) when present. */
20
+ function msgOf(data) {
21
+ if (data && typeof data === 'object' && 'message' in data) {
22
+ const m = data.message;
23
+ if (typeof m === 'string')
24
+ return m;
25
+ }
26
+ return null;
27
+ }
28
+ const auth = (accessToken) => ({ bearerToken: accessToken });
29
+ return {
30
+ async list(accessToken) {
31
+ const r = await http.get(BASE, auth(accessToken));
32
+ if (r.ok) {
33
+ const accounts = r.data?.accounts ?? [];
34
+ return { ok: true, accounts };
35
+ }
36
+ return fail(r, 'Could not load service accounts.');
37
+ },
38
+ async listAssignable(accessToken) {
39
+ const r = await http.get(`${BASE}/assignable`, auth(accessToken));
40
+ if (r.ok) {
41
+ const d = (r.data ?? {});
42
+ return {
43
+ ok: true,
44
+ roles: Array.isArray(d.roles) ? d.roles : [],
45
+ scopeNodes: Array.isArray(d.scopeNodes) ? d.scopeNodes : [],
46
+ };
47
+ }
48
+ // 404 here is not "account not found" — the route itself is missing/denied; keep it generic.
49
+ if (r.status === 404)
50
+ return { ok: false, status: 404, error: 'Could not load what you can assign.' };
51
+ return fail(r, 'Could not load what you can assign.');
52
+ },
53
+ async get(accessToken, id) {
54
+ const r = await http.get(`${BASE}/${encodeURIComponent(id)}`, auth(accessToken));
55
+ if (r.ok)
56
+ return { ok: true, account: r.data.account };
57
+ return fail(r, 'Could not load the service account.');
58
+ },
59
+ async create(accessToken, body) {
60
+ const r = await http.post(BASE, body, auth(accessToken));
61
+ if (r.ok)
62
+ return { ok: true, account: r.data.account };
63
+ return fail(r, 'Could not create the service account.');
64
+ },
65
+ async update(accessToken, id, body) {
66
+ const r = await http.patch(`${BASE}/${encodeURIComponent(id)}`, body, auth(accessToken));
67
+ if (r.ok)
68
+ return { ok: true, account: r.data.account };
69
+ return fail(r, 'Could not update the service account.');
70
+ },
71
+ async issueKey(accessToken, id, opts = {}) {
72
+ const r = await http.post(`${BASE}/${encodeURIComponent(id)}/keys`, opts.expiresAtMs !== undefined ? { expiresAtMs: opts.expiresAtMs } : {}, auth(accessToken));
73
+ if (r.ok)
74
+ return { ok: true, key: r.data.key };
75
+ return fail(r, 'Could not issue a key.');
76
+ },
77
+ async rotateKey(accessToken, id, opts = {}) {
78
+ const r = await http.post(`${BASE}/${encodeURIComponent(id)}/keys/rotate`, opts.expiresAtMs !== undefined ? { expiresAtMs: opts.expiresAtMs } : {}, auth(accessToken));
79
+ if (r.ok)
80
+ return { ok: true, key: r.data.key };
81
+ return fail(r, 'Could not rotate the key.');
82
+ },
83
+ async revokeKeys(accessToken, id) {
84
+ const r = await http.post(`${BASE}/${encodeURIComponent(id)}/keys/revoke`, {}, auth(accessToken));
85
+ if (r.ok)
86
+ return { ok: true };
87
+ return fail(r, 'Could not revoke the keys.');
88
+ },
89
+ };
90
+ }
91
+ //# sourceMappingURL=serviceAccountService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serviceAccountService.js","sourceRoot":"","sources":["../../src/auth/serviceAccountService.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astram/frontend-core",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "license": "MIT",
5
5
  "publishConfig": {
6
6
  "access": "public"