@caltra/server 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -13,6 +13,22 @@ const workspace = await caltra.workspaces.get({
13
13
  });
14
14
  ```
15
15
 
16
+ Create an origin-bound client authorization for an authenticated product user without exposing the
17
+ Caltra API key or client token to browser code:
18
+
19
+ ```ts
20
+ const authorization = await caltra.clientAuthorizations.create({
21
+ origin: config.customerWebOrigin,
22
+ tenantUser: { externalId: user.id },
23
+ workspace: {
24
+ externalId: organization.id,
25
+ createIfMissing: { name: organization.name },
26
+ },
27
+ });
28
+
29
+ return { authorization_code: authorization.authorizationCode };
30
+ ```
31
+
16
32
  Without `createIfMissing`, `workspaces.get()` returns `null` when the external ID is unknown. With
17
33
  `createIfMissing`, concurrent calls converge on the same workspace for the API key's Caltra
18
34
  organization.
package/dist/client.d.ts CHANGED
@@ -1,7 +1,9 @@
1
1
  import type { CaltraServerClientOptions } from "./types.js";
2
+ import { CaltraClientAuthorizationsClient } from "./client_authorizations.js";
2
3
  import { CaltraWorkspacesClient } from "./workspaces.js";
3
4
  /** Provides authenticated, server-only access to Caltra resources without exposing the API key. */
4
5
  export declare class CaltraServerClient {
6
+ readonly clientAuthorizations: CaltraClientAuthorizationsClient;
5
7
  readonly workspaces: CaltraWorkspacesClient;
6
8
  constructor(options: CaltraServerClientOptions);
7
9
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,mGAAmG;AACnG,qBAAa,kBAAkB;IAC7B,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;gBAEhC,OAAO,EAAE,yBAAyB;CAK/C"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,gCAAgC,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,mGAAmG;AACnG,qBAAa,kBAAkB;IAC7B,QAAQ,CAAC,oBAAoB,EAAE,gCAAgC,CAAC;IAChE,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;gBAEhC,OAAO,EAAE,yBAAyB;CAW/C"}
package/dist/client.js CHANGED
@@ -1,11 +1,14 @@
1
+ import { CaltraClientAuthorizationsClient } from "./client_authorizations.js";
1
2
  import { CaltraWorkspacesClient } from "./workspaces.js";
2
3
  /** Provides authenticated, server-only access to Caltra resources without exposing the API key. */
3
4
  export class CaltraServerClient {
5
+ clientAuthorizations;
4
6
  workspaces;
5
7
  constructor(options) {
6
8
  const apiUrl = (options.apiUrl ?? "https://api.caltra.dev").replace(/\/+$/, "");
7
9
  const fetchImplementation = options.fetch ?? globalThis.fetch.bind(globalThis);
8
10
  this.workspaces = new CaltraWorkspacesClient(options.apiKey, apiUrl, fetchImplementation);
11
+ this.clientAuthorizations = new CaltraClientAuthorizationsClient(options.apiKey, apiUrl, fetchImplementation, this.workspaces);
9
12
  }
10
13
  }
11
14
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,mGAAmG;AACnG,MAAM,OAAO,kBAAkB;IACpB,UAAU,CAAyB;IAE5C,YAAY,OAAkC;QAC5C,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,wBAAwB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAChF,MAAM,mBAAmB,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/E,IAAI,CAAC,UAAU,GAAG,IAAI,sBAAsB,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC5F,CAAC;CACF"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gCAAgC,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,mGAAmG;AACnG,MAAM,OAAO,kBAAkB;IACpB,oBAAoB,CAAmC;IACvD,UAAU,CAAyB;IAE5C,YAAY,OAAkC;QAC5C,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,wBAAwB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAChF,MAAM,mBAAmB,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/E,IAAI,CAAC,UAAU,GAAG,IAAI,sBAAsB,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;QAC1F,IAAI,CAAC,oBAAoB,GAAG,IAAI,gCAAgC,CAC9D,OAAO,CAAC,MAAM,EACd,MAAM,EACN,mBAAmB,EACnB,IAAI,CAAC,UAAU,CAChB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import type { CaltraClientAuthorization, CaltraClientAuthorizationCreate } from "./types.js";
2
+ import type { CaltraWorkspacesClient } from "./workspaces.js";
3
+ /** Creates origin-bound browser authorizations without exposing Caltra credentials to the browser. */
4
+ export declare class CaltraClientAuthorizationsClient {
5
+ private readonly apiKey;
6
+ private readonly apiUrl;
7
+ private readonly fetchImplementation;
8
+ private readonly workspaces;
9
+ constructor(apiKey: string, apiUrl: string, fetchImplementation: typeof fetch, workspaces: CaltraWorkspacesClient);
10
+ create(input: CaltraClientAuthorizationCreate): Promise<CaltraClientAuthorization>;
11
+ }
12
+ //# sourceMappingURL=client_authorizations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client_authorizations.d.ts","sourceRoot":"","sources":["../src/client_authorizations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,yBAAyB,EACzB,+BAA+B,EAChC,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAO9D,sGAAsG;AACtG,qBAAa,gCAAgC;IAEzC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAHV,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,OAAO,KAAK,EACjC,UAAU,EAAE,sBAAsB;IAG/C,MAAM,CAAC,KAAK,EAAE,+BAA+B,GAAG,OAAO,CAAC,yBAAyB,CAAC;CAwBzF"}
@@ -0,0 +1,42 @@
1
+ import { z } from "zod";
2
+ import { CaltraServerError } from "./error.js";
3
+ const ClientAuthorizationSchema = z.object({
4
+ authorization_code: z.string().min(1),
5
+ expires_at: z.iso.datetime(),
6
+ }).strict();
7
+ /** Creates origin-bound browser authorizations without exposing Caltra credentials to the browser. */
8
+ export class CaltraClientAuthorizationsClient {
9
+ apiKey;
10
+ apiUrl;
11
+ fetchImplementation;
12
+ workspaces;
13
+ constructor(apiKey, apiUrl, fetchImplementation, workspaces) {
14
+ this.apiKey = apiKey;
15
+ this.apiUrl = apiUrl;
16
+ this.fetchImplementation = fetchImplementation;
17
+ this.workspaces = workspaces;
18
+ }
19
+ async create(input) {
20
+ const workspace = await this.workspaces.get(input.workspace);
21
+ const headers = new Headers({ "content-type": "application/json" });
22
+ headers.set("authorization", `Bearer ${this.apiKey}`);
23
+ const response = await this.fetchImplementation(`${this.apiUrl}/server/v1/workspaces/${encodeURIComponent(workspace.id)}/client-authorizations`, {
24
+ body: JSON.stringify({
25
+ ...(input.agentIds ? { agent_ids: input.agentIds } : {}),
26
+ origin: input.origin,
27
+ tenant_user: { external_id: input.tenantUser.externalId },
28
+ }),
29
+ headers,
30
+ method: "POST",
31
+ });
32
+ if (!response.ok)
33
+ throw await CaltraServerError.fromResponse(response);
34
+ const authorization = ClientAuthorizationSchema.parse(await response.json());
35
+ return {
36
+ authorizationCode: authorization.authorization_code,
37
+ expiresAt: new Date(authorization.expires_at),
38
+ workspace,
39
+ };
40
+ }
41
+ }
42
+ //# sourceMappingURL=client_authorizations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client_authorizations.js","sourceRoot":"","sources":["../src/client_authorizations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAO/C,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE;CAC7B,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,sGAAsG;AACtG,MAAM,OAAO,gCAAgC;IAExB;IACA;IACA;IACA;IAJnB,YACmB,MAAc,EACd,MAAc,EACd,mBAAiC,EACjC,UAAkC;QAHlC,WAAM,GAAN,MAAM,CAAQ;QACd,WAAM,GAAN,MAAM,CAAQ;QACd,wBAAmB,GAAnB,mBAAmB,CAAc;QACjC,eAAU,GAAV,UAAU,CAAwB;IAClD,CAAC;IAEJ,KAAK,CAAC,MAAM,CAAC,KAAsC;QACjD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAC7C,GAAG,IAAI,CAAC,MAAM,yBAAyB,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC,wBAAwB,EAC/F;YACE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxD,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,WAAW,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE;aAC1D,CAAC;YACF,OAAO;YACP,MAAM,EAAE,MAAM;SACf,CACF,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,MAAM,iBAAiB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACvE,MAAM,aAAa,GAAG,yBAAyB,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7E,OAAO;YACL,iBAAiB,EAAE,aAAa,CAAC,kBAAkB;YACnD,SAAS,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;YAC7C,SAAS;SACV,CAAC;IACJ,CAAC;CACF"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export { CaltraServerClient } from "./client.js";
2
+ export { CaltraClientAuthorizationsClient } from "./client_authorizations.js";
2
3
  export { CaltraServerError } from "./error.js";
3
4
  export { CaltraWorkspacesClient } from "./workspaces.js";
4
- export type { CaltraServerClientOptions, CaltraServerProblem, CaltraServerWorkspace, CaltraWorkspaceCreateIfMissing, CaltraWorkspaceLookup, } from "./types.js";
5
+ export type { CaltraClientAuthorization, CaltraClientAuthorizationCreate, CaltraServerClientOptions, CaltraServerProblem, CaltraServerWorkspace, CaltraWorkspaceCreateIfMissing, CaltraWorkspaceLookup, } from "./types.js";
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,YAAY,EACV,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACrB,8BAA8B,EAC9B,qBAAqB,GACtB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,gCAAgC,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,YAAY,EACV,yBAAyB,EACzB,+BAA+B,EAC/B,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACrB,8BAA8B,EAC9B,qBAAqB,GACtB,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export { CaltraServerClient } from "./client.js";
2
+ export { CaltraClientAuthorizationsClient } from "./client_authorizations.js";
2
3
  export { CaltraServerError } from "./error.js";
3
4
  export { CaltraWorkspacesClient } from "./workspaces.js";
4
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,gCAAgC,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/types.d.ts CHANGED
@@ -8,6 +8,19 @@ export interface CaltraServerWorkspace {
8
8
  id: string;
9
9
  name: string;
10
10
  }
11
+ export interface CaltraClientAuthorizationCreate {
12
+ agentIds?: string[];
13
+ origin: string;
14
+ tenantUser: {
15
+ externalId: string;
16
+ };
17
+ workspace: CaltraWorkspaceCreateIfMissing;
18
+ }
19
+ export interface CaltraClientAuthorization {
20
+ authorizationCode: string;
21
+ expiresAt: Date;
22
+ workspace: CaltraServerWorkspace;
23
+ }
11
24
  export interface CaltraServerProblem {
12
25
  code: string;
13
26
  detail: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,8BAA+B,SAAQ,qBAAqB;IAC3E,eAAe,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACnC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,SAAS,EAAE,8BAA8B,CAAC;CAC3C;AAED,MAAM,WAAW,yBAAyB;IACxC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,qBAAqB,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,8BAA+B,SAAQ,qBAAqB;IAC3E,eAAe,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACnC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@caltra/server",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Server-side SDK for the Caltra Server API",
5
5
  "type": "module",
6
6
  "sideEffects": false,