@inkbox/sdk 0.1.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 +369 -0
- package/dist/_http.d.ts +24 -0
- package/dist/_http.d.ts.map +1 -0
- package/dist/_http.js +90 -0
- package/dist/_http.js.map +1 -0
- package/dist/agent_identity.d.ts +184 -0
- package/dist/agent_identity.d.ts.map +1 -0
- package/dist/agent_identity.js +262 -0
- package/dist/agent_identity.js.map +1 -0
- package/dist/identities/resources/identities.d.ts +80 -0
- package/dist/identities/resources/identities.d.ts.map +1 -0
- package/dist/identities/resources/identities.js +103 -0
- package/dist/identities/resources/identities.js.map +1 -0
- package/dist/identities/types.d.ts +77 -0
- package/dist/identities/types.d.ts.map +1 -0
- package/dist/identities/types.js +44 -0
- package/dist/identities/types.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/inkbox.d.ts +92 -0
- package/dist/inkbox.d.ts.map +1 -0
- package/dist/inkbox.js +117 -0
- package/dist/inkbox.js.map +1 -0
- package/dist/mail/resources/mailboxes.d.ts +61 -0
- package/dist/mail/resources/mailboxes.d.ts.map +1 -0
- package/dist/mail/resources/mailboxes.js +83 -0
- package/dist/mail/resources/mailboxes.js.map +1 -0
- package/dist/mail/resources/messages.d.ts +100 -0
- package/dist/mail/resources/messages.d.ts.map +1 -0
- package/dist/mail/resources/messages.js +141 -0
- package/dist/mail/resources/messages.js.map +1 -0
- package/dist/mail/resources/threads.d.ts +36 -0
- package/dist/mail/resources/threads.d.ts.map +1 -0
- package/dist/mail/resources/threads.js +53 -0
- package/dist/mail/resources/threads.js.map +1 -0
- package/dist/mail/types.d.ts +113 -0
- package/dist/mail/types.d.ts.map +1 -0
- package/dist/mail/types.js +65 -0
- package/dist/mail/types.js.map +1 -0
- package/dist/phone/resources/calls.d.ts +45 -0
- package/dist/phone/resources/calls.d.ts.map +1 -0
- package/dist/phone/resources/calls.js +57 -0
- package/dist/phone/resources/calls.js.map +1 -0
- package/dist/phone/resources/numbers.d.ts +61 -0
- package/dist/phone/resources/numbers.d.ts.map +1 -0
- package/dist/phone/resources/numbers.js +85 -0
- package/dist/phone/resources/numbers.js.map +1 -0
- package/dist/phone/resources/transcripts.d.ts +19 -0
- package/dist/phone/resources/transcripts.d.ts.map +1 -0
- package/dist/phone/resources/transcripts.js +23 -0
- package/dist/phone/resources/transcripts.js.map +1 -0
- package/dist/phone/types.d.ts +108 -0
- package/dist/phone/types.d.ts.map +1 -0
- package/dist/phone/types.js +62 -0
- package/dist/phone/types.js.map +1 -0
- package/dist/signing_keys.d.ts +40 -0
- package/dist/signing_keys.d.ts.map +1 -0
- package/dist/signing_keys.js +59 -0
- package/dist/signing_keys.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* inkbox-phone TypeScript SDK — public types.
|
|
3
|
+
*/
|
|
4
|
+
export interface PhoneNumber {
|
|
5
|
+
id: string;
|
|
6
|
+
number: string;
|
|
7
|
+
/** "toll_free" | "local" */
|
|
8
|
+
type: string;
|
|
9
|
+
/** "active" | "paused" | "released" */
|
|
10
|
+
status: string;
|
|
11
|
+
/** "auto_accept" | "auto_reject" | "webhook" */
|
|
12
|
+
incomingCallAction: string;
|
|
13
|
+
clientWebsocketUrl: string | null;
|
|
14
|
+
incomingCallWebhookUrl: string | null;
|
|
15
|
+
createdAt: Date;
|
|
16
|
+
updatedAt: Date;
|
|
17
|
+
}
|
|
18
|
+
export interface PhoneCall {
|
|
19
|
+
id: string;
|
|
20
|
+
localPhoneNumber: string;
|
|
21
|
+
remotePhoneNumber: string;
|
|
22
|
+
/** "outbound" | "inbound" */
|
|
23
|
+
direction: string;
|
|
24
|
+
/** "initiated" | "ringing" | "answered" | "completed" | "failed" | "canceled" */
|
|
25
|
+
status: string;
|
|
26
|
+
clientWebsocketUrl: string | null;
|
|
27
|
+
useInkboxTts: boolean | null;
|
|
28
|
+
useInkboxStt: boolean | null;
|
|
29
|
+
/** "local" | "remote" | "max_duration" | "voicemail" | "rejected" */
|
|
30
|
+
hangupReason: string | null;
|
|
31
|
+
startedAt: Date | null;
|
|
32
|
+
endedAt: Date | null;
|
|
33
|
+
createdAt: Date;
|
|
34
|
+
updatedAt: Date;
|
|
35
|
+
}
|
|
36
|
+
export interface RateLimitInfo {
|
|
37
|
+
callsUsed: number;
|
|
38
|
+
callsRemaining: number;
|
|
39
|
+
callsLimit: number;
|
|
40
|
+
minutesUsed: number;
|
|
41
|
+
minutesRemaining: number;
|
|
42
|
+
minutesLimit: number;
|
|
43
|
+
}
|
|
44
|
+
export interface PhoneCallWithRateLimit extends PhoneCall {
|
|
45
|
+
rateLimit: RateLimitInfo;
|
|
46
|
+
}
|
|
47
|
+
export interface PhoneTranscript {
|
|
48
|
+
id: string;
|
|
49
|
+
callId: string;
|
|
50
|
+
seq: number;
|
|
51
|
+
tsMs: number;
|
|
52
|
+
/** "local" | "remote" | "system" */
|
|
53
|
+
party: string;
|
|
54
|
+
text: string;
|
|
55
|
+
createdAt: Date;
|
|
56
|
+
}
|
|
57
|
+
export interface RawPhoneNumber {
|
|
58
|
+
id: string;
|
|
59
|
+
number: string;
|
|
60
|
+
type: string;
|
|
61
|
+
status: string;
|
|
62
|
+
incoming_call_action: string;
|
|
63
|
+
client_websocket_url: string | null;
|
|
64
|
+
incoming_call_webhook_url: string | null;
|
|
65
|
+
created_at: string;
|
|
66
|
+
updated_at: string;
|
|
67
|
+
}
|
|
68
|
+
export interface RawPhoneCall {
|
|
69
|
+
id: string;
|
|
70
|
+
local_phone_number: string;
|
|
71
|
+
remote_phone_number: string;
|
|
72
|
+
direction: string;
|
|
73
|
+
status: string;
|
|
74
|
+
client_websocket_url: string | null;
|
|
75
|
+
use_inkbox_tts: boolean | null;
|
|
76
|
+
use_inkbox_stt: boolean | null;
|
|
77
|
+
hangup_reason: string | null;
|
|
78
|
+
started_at: string | null;
|
|
79
|
+
ended_at: string | null;
|
|
80
|
+
created_at: string;
|
|
81
|
+
updated_at: string;
|
|
82
|
+
}
|
|
83
|
+
export interface RawRateLimitInfo {
|
|
84
|
+
calls_used: number;
|
|
85
|
+
calls_remaining: number;
|
|
86
|
+
calls_limit: number;
|
|
87
|
+
minutes_used: number;
|
|
88
|
+
minutes_remaining: number;
|
|
89
|
+
minutes_limit: number;
|
|
90
|
+
}
|
|
91
|
+
export interface RawPhoneCallWithRateLimit extends RawPhoneCall {
|
|
92
|
+
rate_limit: RawRateLimitInfo;
|
|
93
|
+
}
|
|
94
|
+
export interface RawPhoneTranscript {
|
|
95
|
+
id: string;
|
|
96
|
+
call_id: string;
|
|
97
|
+
seq: number;
|
|
98
|
+
ts_ms: number;
|
|
99
|
+
party: string;
|
|
100
|
+
text: string;
|
|
101
|
+
created_at: string;
|
|
102
|
+
}
|
|
103
|
+
export declare function parsePhoneNumber(r: RawPhoneNumber): PhoneNumber;
|
|
104
|
+
export declare function parsePhoneCall(r: RawPhoneCall): PhoneCall;
|
|
105
|
+
export declare function parseRateLimitInfo(r: RawRateLimitInfo): RateLimitInfo;
|
|
106
|
+
export declare function parsePhoneCallWithRateLimit(r: RawPhoneCallWithRateLimit): PhoneCallWithRateLimit;
|
|
107
|
+
export declare function parsePhoneTranscript(r: RawPhoneTranscript): PhoneTranscript;
|
|
108
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/phone/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* inkbox-phone TypeScript SDK — public types.
|
|
3
|
+
*/
|
|
4
|
+
// ---- parsers ----
|
|
5
|
+
export function parsePhoneNumber(r) {
|
|
6
|
+
return {
|
|
7
|
+
id: r.id,
|
|
8
|
+
number: r.number,
|
|
9
|
+
type: r.type,
|
|
10
|
+
status: r.status,
|
|
11
|
+
incomingCallAction: r.incoming_call_action,
|
|
12
|
+
clientWebsocketUrl: r.client_websocket_url,
|
|
13
|
+
incomingCallWebhookUrl: r.incoming_call_webhook_url,
|
|
14
|
+
createdAt: new Date(r.created_at),
|
|
15
|
+
updatedAt: new Date(r.updated_at),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function parsePhoneCall(r) {
|
|
19
|
+
return {
|
|
20
|
+
id: r.id,
|
|
21
|
+
localPhoneNumber: r.local_phone_number,
|
|
22
|
+
remotePhoneNumber: r.remote_phone_number,
|
|
23
|
+
direction: r.direction,
|
|
24
|
+
status: r.status,
|
|
25
|
+
clientWebsocketUrl: r.client_websocket_url,
|
|
26
|
+
useInkboxTts: r.use_inkbox_tts,
|
|
27
|
+
useInkboxStt: r.use_inkbox_stt,
|
|
28
|
+
hangupReason: r.hangup_reason,
|
|
29
|
+
startedAt: r.started_at ? new Date(r.started_at) : null,
|
|
30
|
+
endedAt: r.ended_at ? new Date(r.ended_at) : null,
|
|
31
|
+
createdAt: new Date(r.created_at),
|
|
32
|
+
updatedAt: new Date(r.updated_at),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export function parseRateLimitInfo(r) {
|
|
36
|
+
return {
|
|
37
|
+
callsUsed: r.calls_used,
|
|
38
|
+
callsRemaining: r.calls_remaining,
|
|
39
|
+
callsLimit: r.calls_limit,
|
|
40
|
+
minutesUsed: r.minutes_used,
|
|
41
|
+
minutesRemaining: r.minutes_remaining,
|
|
42
|
+
minutesLimit: r.minutes_limit,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export function parsePhoneCallWithRateLimit(r) {
|
|
46
|
+
return {
|
|
47
|
+
...parsePhoneCall(r),
|
|
48
|
+
rateLimit: parseRateLimitInfo(r.rate_limit),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export function parsePhoneTranscript(r) {
|
|
52
|
+
return {
|
|
53
|
+
id: r.id,
|
|
54
|
+
callId: r.call_id,
|
|
55
|
+
seq: r.seq,
|
|
56
|
+
tsMs: r.ts_ms,
|
|
57
|
+
party: r.party,
|
|
58
|
+
text: r.text,
|
|
59
|
+
createdAt: new Date(r.created_at),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/phone/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiHH,oBAAoB;AAEpB,MAAM,UAAU,gBAAgB,CAAC,CAAiB;IAChD,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,kBAAkB,EAAE,CAAC,CAAC,oBAAoB;QAC1C,kBAAkB,EAAE,CAAC,CAAC,oBAAoB;QAC1C,sBAAsB,EAAE,CAAC,CAAC,yBAAyB;QACnD,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;QACjC,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,CAAe;IAC5C,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,gBAAgB,EAAE,CAAC,CAAC,kBAAkB;QACtC,iBAAiB,EAAE,CAAC,CAAC,mBAAmB;QACxC,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,kBAAkB,EAAE,CAAC,CAAC,oBAAoB;QAC1C,YAAY,EAAE,CAAC,CAAC,cAAc;QAC9B,YAAY,EAAE,CAAC,CAAC,cAAc;QAC9B,YAAY,EAAE,CAAC,CAAC,aAAa;QAC7B,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI;QACvD,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;QACjD,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;QACjC,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,CAAmB;IACpD,OAAO;QACL,SAAS,EAAE,CAAC,CAAC,UAAU;QACvB,cAAc,EAAE,CAAC,CAAC,eAAe;QACjC,UAAU,EAAE,CAAC,CAAC,WAAW;QACzB,WAAW,EAAE,CAAC,CAAC,YAAY;QAC3B,gBAAgB,EAAE,CAAC,CAAC,iBAAiB;QACrC,YAAY,EAAE,CAAC,CAAC,aAAa;KAC9B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,CAA4B;IAE5B,OAAO;QACL,GAAG,cAAc,CAAC,CAAC,CAAC;QACpB,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC,UAAU,CAAC;KAC5C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,CAAqB;IACxD,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,MAAM,EAAE,CAAC,CAAC,OAAO;QACjB,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,IAAI,EAAE,CAAC,CAAC,KAAK;QACb,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;KAClC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Org-level webhook signing key management.
|
|
3
|
+
*
|
|
4
|
+
* Shared across all Inkbox clients (mail, phone, etc.).
|
|
5
|
+
*/
|
|
6
|
+
import { HttpTransport } from "./_http.js";
|
|
7
|
+
export interface SigningKey {
|
|
8
|
+
/** Plaintext signing key — returned once on creation/rotation. Store securely. */
|
|
9
|
+
signingKey: string;
|
|
10
|
+
createdAt: Date;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Verify that an incoming webhook request was sent by Inkbox.
|
|
14
|
+
*
|
|
15
|
+
* @param payload - Raw request body as a Buffer or string.
|
|
16
|
+
* @param headers - Request headers object (keys are lowercased internally).
|
|
17
|
+
* @param secret - Your signing key, with or without a `whsec_` prefix.
|
|
18
|
+
* @returns True if the signature is valid.
|
|
19
|
+
*/
|
|
20
|
+
export declare function verifyWebhook({ payload, headers, secret, }: {
|
|
21
|
+
payload: Buffer | string;
|
|
22
|
+
headers: Record<string, string | string[] | undefined>;
|
|
23
|
+
secret: string;
|
|
24
|
+
}): boolean;
|
|
25
|
+
export declare class SigningKeysResource {
|
|
26
|
+
private readonly http;
|
|
27
|
+
constructor(http: HttpTransport);
|
|
28
|
+
/**
|
|
29
|
+
* Create or rotate the webhook signing key for your organisation.
|
|
30
|
+
*
|
|
31
|
+
* The first call creates a new key; subsequent calls rotate (replace) the
|
|
32
|
+
* existing key. The plaintext `signingKey` is returned **once** —
|
|
33
|
+
* store it securely as it cannot be retrieved again.
|
|
34
|
+
*
|
|
35
|
+
* Use the returned key to verify `X-Inkbox-Signature` headers on
|
|
36
|
+
* incoming webhook requests.
|
|
37
|
+
*/
|
|
38
|
+
createOrRotate(): Promise<SigningKey>;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=signing_keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signing_keys.d.ts","sourceRoot":"","sources":["../src/signing_keys.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAI3C,MAAM,WAAW,UAAU;IACzB,kFAAkF;IAClF,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;CACjB;AAcD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,OAAO,EACP,MAAM,GACP,EAAE;IACD,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAeV;AAED,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,aAAa;IAEhD;;;;;;;;;OASG;IACG,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC;CAI5C"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Org-level webhook signing key management.
|
|
3
|
+
*
|
|
4
|
+
* Shared across all Inkbox clients (mail, phone, etc.).
|
|
5
|
+
*/
|
|
6
|
+
import { createHmac, timingSafeEqual } from "crypto";
|
|
7
|
+
const PATH = "/signing-keys";
|
|
8
|
+
function parseSigningKey(r) {
|
|
9
|
+
return {
|
|
10
|
+
signingKey: r.signing_key,
|
|
11
|
+
createdAt: new Date(r.created_at),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Verify that an incoming webhook request was sent by Inkbox.
|
|
16
|
+
*
|
|
17
|
+
* @param payload - Raw request body as a Buffer or string.
|
|
18
|
+
* @param headers - Request headers object (keys are lowercased internally).
|
|
19
|
+
* @param secret - Your signing key, with or without a `whsec_` prefix.
|
|
20
|
+
* @returns True if the signature is valid.
|
|
21
|
+
*/
|
|
22
|
+
export function verifyWebhook({ payload, headers, secret, }) {
|
|
23
|
+
const h = {};
|
|
24
|
+
for (const [k, v] of Object.entries(headers)) {
|
|
25
|
+
h[k.toLowerCase()] = Array.isArray(v) ? v[0] : v;
|
|
26
|
+
}
|
|
27
|
+
const signature = h["x-inkbox-signature"] ?? "";
|
|
28
|
+
const requestId = h["x-inkbox-request-id"] ?? "";
|
|
29
|
+
const timestamp = h["x-inkbox-timestamp"] ?? "";
|
|
30
|
+
if (!signature.startsWith("sha256="))
|
|
31
|
+
return false;
|
|
32
|
+
const key = secret.startsWith("whsec_") ? secret.slice("whsec_".length) : secret;
|
|
33
|
+
const body = typeof payload === "string" ? Buffer.from(payload) : payload;
|
|
34
|
+
const message = Buffer.concat([Buffer.from(`${requestId}.${timestamp}.`), body]);
|
|
35
|
+
const expected = createHmac("sha256", key).update(message).digest("hex");
|
|
36
|
+
const received = signature.slice("sha256=".length);
|
|
37
|
+
return timingSafeEqual(Buffer.from(expected), Buffer.from(received));
|
|
38
|
+
}
|
|
39
|
+
export class SigningKeysResource {
|
|
40
|
+
http;
|
|
41
|
+
constructor(http) {
|
|
42
|
+
this.http = http;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Create or rotate the webhook signing key for your organisation.
|
|
46
|
+
*
|
|
47
|
+
* The first call creates a new key; subsequent calls rotate (replace) the
|
|
48
|
+
* existing key. The plaintext `signingKey` is returned **once** —
|
|
49
|
+
* store it securely as it cannot be retrieved again.
|
|
50
|
+
*
|
|
51
|
+
* Use the returned key to verify `X-Inkbox-Signature` headers on
|
|
52
|
+
* incoming webhook requests.
|
|
53
|
+
*/
|
|
54
|
+
async createOrRotate() {
|
|
55
|
+
const data = await this.http.post(PATH, {});
|
|
56
|
+
return parseSigningKey(data);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=signing_keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signing_keys.js","sourceRoot":"","sources":["../src/signing_keys.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAGrD,MAAM,IAAI,GAAG,eAAe,CAAC;AAa7B,SAAS,eAAe,CAAC,CAAgB;IACvC,OAAO;QACL,UAAU,EAAE,CAAC,CAAC,WAAW;QACzB,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;KAClC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,OAAO,EACP,OAAO,EACP,MAAM,GAKP;IACC,MAAM,CAAC,GAAuC,EAAE,CAAC;IACjD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,MAAM,SAAS,GAAG,CAAC,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC;IAChD,MAAM,SAAS,GAAG,CAAC,CAAC,qBAAqB,CAAC,IAAI,EAAE,CAAC;IACjD,MAAM,SAAS,GAAG,CAAC,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC;IAChD,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACjF,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC1E,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,SAAS,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACjF,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACnD,OAAO,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,OAAO,mBAAmB;IACD;IAA7B,YAA6B,IAAmB;QAAnB,SAAI,GAAJ,IAAI,CAAe;IAAG,CAAC;IAEpD;;;;;;;;;OASG;IACH,KAAK,CAAC,cAAc;QAClB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAgB,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3D,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;CACF"}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@inkbox/sdk",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "TypeScript SDK for the Inkbox API",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc",
|
|
20
|
+
"test": "vitest run",
|
|
21
|
+
"test:coverage": "vitest run --coverage",
|
|
22
|
+
"prepublishOnly": "npm run build"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/node": "^25.5.0",
|
|
26
|
+
"@vitest/coverage-v8": "^2.0.0",
|
|
27
|
+
"typescript": "^5.4.0",
|
|
28
|
+
"vitest": "^2.0.0"
|
|
29
|
+
},
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "https://github.com/vectorlyapp/inkbox",
|
|
33
|
+
"directory": "inkbox/typescript"
|
|
34
|
+
},
|
|
35
|
+
"homepage": "https://inkbox.ai",
|
|
36
|
+
"bugs": {
|
|
37
|
+
"url": "https://github.com/vectorlyapp/inkbox/issues"
|
|
38
|
+
},
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=18"
|
|
41
|
+
}
|
|
42
|
+
}
|