@caltra/client 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 +21 -3
- package/dist/handoff_token_provider.d.ts +18 -0
- package/dist/handoff_token_provider.d.ts.map +1 -0
- package/dist/handoff_token_provider.js +66 -0
- package/dist/handoff_token_provider.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +11 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -11,11 +11,21 @@ npm install @caltra/client
|
|
|
11
11
|
## Use
|
|
12
12
|
|
|
13
13
|
```ts
|
|
14
|
-
import { CaltraClient } from "@caltra/client";
|
|
14
|
+
import { CaltraClient, CaltraHandoffTokenProvider } from "@caltra/client";
|
|
15
|
+
|
|
16
|
+
const handoffs = new CaltraHandoffTokenProvider({
|
|
17
|
+
apiUrl: "https://api.caltra.dev",
|
|
18
|
+
handoffProvider: async () => {
|
|
19
|
+
const response = await fetch("/api/caltra/handoff", { method: "POST" });
|
|
20
|
+
if (!response.ok) throw new Error("Caltra authentication failed.");
|
|
21
|
+
return (await response.json() as { handoff_code: string }).handoff_code;
|
|
22
|
+
},
|
|
23
|
+
});
|
|
15
24
|
|
|
16
25
|
const client = new CaltraClient({
|
|
17
26
|
apiUrl: "https://api.caltra.dev",
|
|
18
|
-
|
|
27
|
+
tokenInvalidator: () => handoffs.invalidate(),
|
|
28
|
+
tokenProvider: async () => await handoffs.getToken(),
|
|
19
29
|
});
|
|
20
30
|
|
|
21
31
|
const agents = await client.listAgents();
|
|
@@ -23,6 +33,14 @@ const session = await client.createSession({ agentId: agents.data[0].id });
|
|
|
23
33
|
const events = await client.openSessionEvents(session.id);
|
|
24
34
|
```
|
|
25
35
|
|
|
26
|
-
The
|
|
36
|
+
The customer endpoint authenticates the current user, calls Caltra's server-side
|
|
37
|
+
`POST /server/v1/workspaces/{workspace_id}/client-handoffs` endpoint with the stable external user
|
|
38
|
+
ID and exact browser origin, and returns only `handoff_code`. The SDK exchanges each code once,
|
|
39
|
+
caches only the resulting short-lived client token in memory, and requests a new handoff at the
|
|
40
|
+
server-provided refresh time. Never embed a Caltra server API key in a browser bundle.
|
|
41
|
+
|
|
42
|
+
The organization-level Clerk connection configures the upstream identity boundary separately. Until
|
|
43
|
+
direct Clerk exchange becomes available for SDK sessions, browser clients still use this
|
|
44
|
+
provider-neutral handoff contract.
|
|
27
45
|
|
|
28
46
|
The package is ESM-only. See the [Caltra SDK repository](https://github.com/caltra-dev/caltra-sdk) for development and integration-app instructions.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { CaltraHandoffTokenProviderOptions } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Exchanges customer-authenticated, single-use handoffs and retains only the resulting short-lived
|
|
4
|
+
* Caltra client token in browser memory.
|
|
5
|
+
*/
|
|
6
|
+
export declare class CaltraHandoffTokenProvider {
|
|
7
|
+
private readonly options;
|
|
8
|
+
private readonly apiUrl;
|
|
9
|
+
private configuration?;
|
|
10
|
+
private readonly fetchImplementation;
|
|
11
|
+
private pending?;
|
|
12
|
+
constructor(options: CaltraHandoffTokenProviderOptions);
|
|
13
|
+
getToken(): Promise<string>;
|
|
14
|
+
invalidate(): void;
|
|
15
|
+
private getConfiguration;
|
|
16
|
+
private exchange;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=handoff_token_provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoff_token_provider.d.ts","sourceRoot":"","sources":["../src/handoff_token_provider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,iCAAiC,EAElC,MAAM,YAAY,CAAC;AAQpB;;;GAGG;AACH,qBAAa,0BAA0B;IAMzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,aAAa,CAAC,CAA2B;IACjD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAe;IACnD,OAAO,CAAC,OAAO,CAAC,CAAoC;gBAEvB,OAAO,EAAE,iCAAiC;IAKjE,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IAIjC,UAAU,IAAI,IAAI;YAIJ,gBAAgB;YAiBhB,QAAQ;CAsBvB"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { CaltraApiError } from "./error.js";
|
|
3
|
+
const TokenConfigurationSchema = z.object({
|
|
4
|
+
client_token: z.string().min(1),
|
|
5
|
+
expires_at: z.iso.datetime(),
|
|
6
|
+
refresh_after: z.iso.datetime(),
|
|
7
|
+
}).strict();
|
|
8
|
+
/**
|
|
9
|
+
* Exchanges customer-authenticated, single-use handoffs and retains only the resulting short-lived
|
|
10
|
+
* Caltra client token in browser memory.
|
|
11
|
+
*/
|
|
12
|
+
export class CaltraHandoffTokenProvider {
|
|
13
|
+
options;
|
|
14
|
+
apiUrl;
|
|
15
|
+
configuration;
|
|
16
|
+
fetchImplementation;
|
|
17
|
+
pending;
|
|
18
|
+
constructor(options) {
|
|
19
|
+
this.options = options;
|
|
20
|
+
this.apiUrl = options.apiUrl.replace(/\/+$/, "");
|
|
21
|
+
this.fetchImplementation = options.fetch ?? globalThis.fetch.bind(globalThis);
|
|
22
|
+
}
|
|
23
|
+
async getToken() {
|
|
24
|
+
return (await this.getConfiguration()).clientToken;
|
|
25
|
+
}
|
|
26
|
+
invalidate() {
|
|
27
|
+
this.configuration = undefined;
|
|
28
|
+
}
|
|
29
|
+
async getConfiguration() {
|
|
30
|
+
if (this.configuration
|
|
31
|
+
&& Date.now() < this.configuration.refreshAfter.getTime()) {
|
|
32
|
+
return this.configuration;
|
|
33
|
+
}
|
|
34
|
+
if (this.pending)
|
|
35
|
+
return await this.pending;
|
|
36
|
+
this.pending = this.exchange();
|
|
37
|
+
try {
|
|
38
|
+
this.configuration = await this.pending;
|
|
39
|
+
return this.configuration;
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
this.pending = undefined;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async exchange() {
|
|
46
|
+
const handoffCode = await this.options.handoffProvider();
|
|
47
|
+
const response = await this.fetchImplementation(`${this.apiUrl}/client/v1/auth/handoffs/exchange`, {
|
|
48
|
+
body: JSON.stringify({ handoff_code: handoffCode }),
|
|
49
|
+
headers: { "content-type": "application/json" },
|
|
50
|
+
method: "POST",
|
|
51
|
+
});
|
|
52
|
+
if (!response.ok)
|
|
53
|
+
throw await CaltraApiError.fromResponse(response);
|
|
54
|
+
const value = TokenConfigurationSchema.parse(await response.json());
|
|
55
|
+
const configuration = {
|
|
56
|
+
clientToken: value.client_token,
|
|
57
|
+
expiresAt: new Date(value.expires_at),
|
|
58
|
+
refreshAfter: new Date(value.refresh_after),
|
|
59
|
+
};
|
|
60
|
+
if (configuration.refreshAfter >= configuration.expiresAt) {
|
|
61
|
+
throw new Error("Caltra returned an invalid client-token refresh window.");
|
|
62
|
+
}
|
|
63
|
+
return configuration;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=handoff_token_provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoff_token_provider.js","sourceRoot":"","sources":["../src/handoff_token_provider.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { CaltraClient } from "./client.js";
|
|
2
2
|
export { CaltraApiError } from "./error.js";
|
|
3
3
|
export { CaltraSessionEventConnection } from "./event_connection.js";
|
|
4
|
-
export
|
|
4
|
+
export { CaltraHandoffTokenProvider } from "./handoff_token_provider.js";
|
|
5
|
+
export type { CaltraAgent, CaltraApiProblem, CaltraClientOptions, CaltraHandoffProvider, CaltraHandoffTokenProviderOptions, CaltraMessageCompletedEvent, CaltraMessageDeltaEvent, CaltraMessageStartedEvent, CaltraMessageSubmission, CaltraPage, CaltraPageInput, CaltraSession, CaltraSessionEvent, CaltraSessionMessage, CaltraTokenProvider, CaltraTokenConfiguration, } from "./types.js";
|
|
5
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,YAAY,EACV,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EACnB,2BAA2B,EAC3B,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,UAAU,EACV,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,YAAY,EACV,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,iCAAiC,EACjC,2BAA2B,EAC3B,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,UAAU,EACV,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { CaltraClient } from "./client.js";
|
|
2
2
|
export { CaltraApiError } from "./error.js";
|
|
3
3
|
export { CaltraSessionEventConnection } from "./event_connection.js";
|
|
4
|
+
export { CaltraHandoffTokenProvider } from "./handoff_token_provider.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,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,15 @@
|
|
|
1
1
|
export type CaltraTokenProvider = () => Promise<string>;
|
|
2
|
+
export type CaltraHandoffProvider = () => Promise<string>;
|
|
3
|
+
export interface CaltraHandoffTokenProviderOptions {
|
|
4
|
+
apiUrl: string;
|
|
5
|
+
fetch?: typeof fetch;
|
|
6
|
+
handoffProvider: CaltraHandoffProvider;
|
|
7
|
+
}
|
|
8
|
+
export interface CaltraTokenConfiguration {
|
|
9
|
+
clientToken: string;
|
|
10
|
+
expiresAt: Date;
|
|
11
|
+
refreshAfter: Date;
|
|
12
|
+
}
|
|
2
13
|
export interface CaltraClientOptions {
|
|
3
14
|
apiUrl: string;
|
|
4
15
|
fetch?: typeof fetch;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;AAExD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC9C,aAAa,EAAE,mBAAmB,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC3D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,sBAAsB;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,KAAK,EAAE,iBAAiB,CAAC;IACzB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,sBAAsB,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,KAAK,EAAE,eAAe,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,sBAAsB,CAAC;IAC7B,KAAK,EAAE,mBAAmB,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,MAAM,kBAAkB,GAC1B,yBAAyB,GACzB,uBAAuB,GACvB,2BAA2B,CAAC;AAEhC,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;AAExD,MAAM,MAAM,qBAAqB,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;AAE1D,MAAM,WAAW,iCAAiC;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,eAAe,EAAE,qBAAqB,CAAC;CACxC;AAED,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,EAAE,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC9C,aAAa,EAAE,mBAAmB,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC3D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,sBAAsB;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,KAAK,EAAE,iBAAiB,CAAC;IACzB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,sBAAsB,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,KAAK,EAAE,eAAe,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,sBAAsB,CAAC;IAC7B,KAAK,EAAE,mBAAmB,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,MAAM,kBAAkB,GAC1B,yBAAyB,GACzB,uBAAuB,GACvB,2BAA2B,CAAC;AAEhC,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,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"}
|