@stacklink/sdk 0.3.7 → 0.3.9

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.
@@ -0,0 +1,143 @@
1
+ /** Optional browser entry point. No PIN, private key, or plaintext is sent by
2
+ * this module. Dispatch the prepared ciphertext through normal Stacklink tools. */
3
+ import { type ChatWithJuicebox, type CreateChatOptions, type SendPayload, type PreparedConversationChange, type PublicKeyRegistrationPayload } from '@xdevplatform/chat-xdk';
4
+ export interface XChatPublicKeyRecord {
5
+ user_id: string;
6
+ public_key_version: string;
7
+ public_key: string;
8
+ signing_public_key: string;
9
+ identity_public_key_signature: string;
10
+ }
11
+ export declare function createStacklinkXChat(input: {
12
+ accountId: string;
13
+ userId: string;
14
+ signingKeyVersion: string;
15
+ juiceboxConfig?: string;
16
+ getAuthToken: CreateChatOptions['getAuthToken'];
17
+ }): Promise<StacklinkXChat>;
18
+ export declare class StacklinkXChat {
19
+ #private;
20
+ readonly accountId: string;
21
+ readonly userId: string;
22
+ constructor(accountId: string, userId: string, chat: ChatWithJuicebox, signingKeyVersion: string);
23
+ private current;
24
+ private withPin;
25
+ unlock(pin: Uint8Array): Promise<void>;
26
+ setup(pin: Uint8Array): Promise<import("@xdevplatform/chat-xdk").PublicKeys>;
27
+ changePin(oldPin: Uint8Array, newPin: Uint8Array): Promise<void>;
28
+ lock(): Promise<void>;
29
+ close(): Promise<void>;
30
+ updateConfig(config: string): void;
31
+ setIdentityVersion(version: string): void;
32
+ isUnlocked(): boolean;
33
+ generateRegistration(): {
34
+ public_key: {
35
+ signing_public_key_signature?: string;
36
+ public_key_fingerprint?: string;
37
+ identity_public_key_signature: string;
38
+ public_key: string;
39
+ registration_method: string;
40
+ signing_public_key: string;
41
+ };
42
+ version?: string;
43
+ generate_version: boolean;
44
+ };
45
+ getPublicKeys(): import("@xdevplatform/chat-xdk").PublicKeys;
46
+ getPublicKeyFingerprint(): string;
47
+ setParticipants(records: XChatPublicKeyRecord[]): void;
48
+ decryptEvents(...args: Parameters<ChatWithJuicebox['decryptEvents']>): import("@xdevplatform/chat-xdk").DecryptEventsResult;
49
+ decryptEvent(...args: Parameters<ChatWithJuicebox['decryptEvent']>): import("@xdevplatform/chat-xdk").Event;
50
+ encryptMessage(...args: Parameters<ChatWithJuicebox['encryptMessage']>): {
51
+ message_id: string;
52
+ encoded_message_create_event: string;
53
+ encoded_message_event_signature: string;
54
+ };
55
+ encryptReply(...args: Parameters<ChatWithJuicebox['encryptReply']>): {
56
+ message_id: string;
57
+ encoded_message_create_event: string;
58
+ encoded_message_event_signature: string;
59
+ };
60
+ encryptEdit(...args: Parameters<ChatWithJuicebox['encryptEdit']>): {
61
+ message_id: string;
62
+ encoded_message_create_event: string;
63
+ encoded_message_event_signature: string;
64
+ };
65
+ encryptAddReaction(...args: Parameters<ChatWithJuicebox['encryptAddReaction']>): {
66
+ message_id: string;
67
+ encoded_message_create_event: string;
68
+ encoded_message_event_signature: string;
69
+ };
70
+ encryptRemoveReaction(...args: Parameters<ChatWithJuicebox['encryptRemoveReaction']>): {
71
+ message_id: string;
72
+ encoded_message_create_event: string;
73
+ encoded_message_event_signature: string;
74
+ };
75
+ prepareMessageDelete(...args: Parameters<ChatWithJuicebox['prepareMessageDelete']>): {
76
+ message_id: string;
77
+ encoded_message_event_detail: string;
78
+ message_event_signature: {
79
+ signature: string;
80
+ signature_version: string;
81
+ public_key_version: string;
82
+ };
83
+ };
84
+ private verifiedParticipants;
85
+ prepareConversationKeyChange(...args: Parameters<ChatWithJuicebox['prepareConversationKeyChange']>): PreparedConversationChange;
86
+ prepareGroupCreate(...args: Parameters<ChatWithJuicebox['prepareGroupCreate']>): PreparedConversationChange;
87
+ prepareGroupMembersChange(...args: Parameters<ChatWithJuicebox['prepareGroupMembersChange']>): PreparedConversationChange;
88
+ encryptMedia(...args: Parameters<ChatWithJuicebox['encryptStream']>): Uint8Array<ArrayBufferLike>;
89
+ decryptMedia(...args: Parameters<ChatWithJuicebox['decryptStream']>): Uint8Array<ArrayBufferLike>;
90
+ mediaEncryptor(...args: Parameters<ChatWithJuicebox['streamEncryptor']>): import("@xdevplatform/chat-xdk").StreamEncryptor;
91
+ mediaDecryptor(...args: Parameters<ChatWithJuicebox['streamDecryptor']>): import("@xdevplatform/chat-xdk").StreamDecryptor;
92
+ }
93
+ export declare function xChatMessageBody(payload: SendPayload): {
94
+ message_id: string;
95
+ encoded_message_create_event: string;
96
+ encoded_message_event_signature: string;
97
+ };
98
+ /** X's official sample uses colon-separated direct-conversation IDs in signed
99
+ * crypto events and hyphen-separated IDs in HTTP paths. Never alter group IDs. */
100
+ export declare function xChatApiConversationId(cryptoId: string): string;
101
+ export declare function xChatCryptoConversationId(apiId: string): string;
102
+ export declare function xChatActionSignature(signature: PreparedConversationChange['actionSignatures'][number]): {
103
+ message_id: string;
104
+ encoded_message_event_detail: string;
105
+ message_event_signature: {
106
+ signature: string;
107
+ signature_version: string;
108
+ public_key_version: string;
109
+ };
110
+ };
111
+ export declare function xChatConversationChangeBody(change: PreparedConversationChange): {
112
+ conversation_key_version: string;
113
+ conversation_participant_keys: {
114
+ user_id: string;
115
+ encrypted_conversation_key: string;
116
+ public_key_version: string;
117
+ }[];
118
+ action_signatures: {
119
+ message_id: string;
120
+ encoded_message_event_detail: string;
121
+ message_event_signature: {
122
+ signature: string;
123
+ signature_version: string;
124
+ public_key_version: string;
125
+ };
126
+ }[];
127
+ };
128
+ export declare function xChatRegistrationBody(registration: PublicKeyRegistrationPayload): {
129
+ public_key: {
130
+ signing_public_key_signature?: string;
131
+ public_key_fingerprint?: string;
132
+ identity_public_key_signature: string;
133
+ public_key: string;
134
+ registration_method: string;
135
+ signing_public_key: string;
136
+ };
137
+ version?: string;
138
+ generate_version: boolean;
139
+ };
140
+ /** Read only the exact realm requested by the official SDK. Keep the provider's
141
+ * original config for WASM so realm keys and recovery thresholds are preserved. */
142
+ export declare function xChatRealmToken(juiceboxConfig: string, realmId: string): string;
143
+ //# sourceMappingURL=x-chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x-chat.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/x-chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,171 @@
1
+ /** Optional browser entry point. No PIN, private key, or plaintext is sent by
2
+ * this module. Dispatch the prepared ciphertext through normal Stacklink tools. */
3
+ import { createChat } from '@xdevplatform/chat-xdk';
4
+ // The official Juicebox binding has a process-wide auth callback. Serialize
5
+ // backup work across all connected accounts in this JS realm.
6
+ let backupQueue = Promise.resolve();
7
+ function serializeBackup(work) {
8
+ const result = backupQueue.then(work, work);
9
+ backupQueue = result.then(() => undefined, () => undefined);
10
+ return result;
11
+ }
12
+ export async function createStacklinkXChat(input) {
13
+ if (!('window' in globalThis))
14
+ throw new Error('Personal X Chat must run on the user device in a browser. Use the official native Chat XDK for bot-owned keys.');
15
+ if (!input.accountId || !input.userId || !input.signingKeyVersion)
16
+ throw new Error('Bind Chat to one exact connected account, X user and registered key version.');
17
+ const chat = await serializeBackup(() => createChat({ ...(input.juiceboxConfig ? { juiceboxConfig: input.juiceboxConfig } : {}), getAuthToken: input.getAuthToken }));
18
+ chat.setIdentity(input.userId, input.signingKeyVersion);
19
+ chat.setRejectUnverified(true);
20
+ chat.setCacheKeys(true);
21
+ return new StacklinkXChat(input.accountId, input.userId, chat, input.signingKeyVersion);
22
+ }
23
+ export class StacklinkXChat {
24
+ #chat;
25
+ #closed = false;
26
+ #participants = new Map();
27
+ #signingKeyVersion;
28
+ #closing;
29
+ accountId;
30
+ userId;
31
+ constructor(accountId, userId, chat, signingKeyVersion) {
32
+ this.accountId = accountId;
33
+ this.userId = userId;
34
+ this.#chat = chat;
35
+ this.#signingKeyVersion = signingKeyVersion;
36
+ }
37
+ current() {
38
+ if (this.#closed)
39
+ throw new Error('This X Chat session is closed.');
40
+ return this.#chat;
41
+ }
42
+ async withPin(pin, work) {
43
+ this.current();
44
+ const local = pin.slice();
45
+ try {
46
+ return await serializeBackup(async () => {
47
+ this.current();
48
+ const result = await work(local);
49
+ // XDK recovery imports key material and clears its session identity.
50
+ // Restore the exact registered version before any signed operation.
51
+ this.#chat.setIdentity(this.userId, this.#signingKeyVersion);
52
+ this.#participants.clear();
53
+ this.#chat.setSigningKeys([]);
54
+ return result;
55
+ });
56
+ }
57
+ finally {
58
+ local.fill(0);
59
+ }
60
+ }
61
+ unlock(pin) { return this.withPin(pin, (local) => this.#chat.unlock(local)); }
62
+ setup(pin) { return this.withPin(pin, (local) => this.#chat.setup(local)); }
63
+ async changePin(oldPin, newPin) {
64
+ const next = newPin.slice();
65
+ try {
66
+ await this.withPin(oldPin, (previous) => this.#chat.changePin(previous, next));
67
+ }
68
+ finally {
69
+ next.fill(0);
70
+ }
71
+ }
72
+ async lock() { await serializeBackup(async () => { if (!this.#closed) {
73
+ this.#chat.lock();
74
+ this.#participants.clear();
75
+ } }); }
76
+ close() {
77
+ this.#closed = true;
78
+ this.#participants.clear();
79
+ this.#closing ??= serializeBackup(async () => { this.#chat.lock(); this.#chat.free(); });
80
+ return this.#closing;
81
+ }
82
+ updateConfig(config) { this.current().updateConfig(config); }
83
+ setIdentityVersion(version) { this.current().setIdentity(this.userId, version); this.#signingKeyVersion = version; }
84
+ isUnlocked() { return !this.#closed && this.#chat.isUnlocked(); }
85
+ generateRegistration() { return xChatRegistrationBody(this.current().generateKeypairs()); }
86
+ getPublicKeys() { return this.current().getPublicKeys(); }
87
+ getPublicKeyFingerprint() { return this.current().getPublicKeyFingerprint(); }
88
+ setParticipants(records) {
89
+ const chat = this.current();
90
+ for (const record of records)
91
+ if (!chat.verifyKeyBinding(record.public_key, record.signing_public_key, record.identity_public_key_signature))
92
+ throw new Error('X Chat participant key binding is invalid.');
93
+ this.#participants = new Map(records.map((record) => [JSON.stringify([record.user_id, record.public_key_version]), record.public_key]));
94
+ chat.setSigningKeys(records.map((record) => ({ userId: record.user_id, publicKeyVersion: record.public_key_version,
95
+ publicKey: record.signing_public_key, identityPublicKey: record.public_key, identityPublicKeySignature: record.identity_public_key_signature })));
96
+ }
97
+ decryptEvents(...args) { return this.current().decryptEvents(...args); }
98
+ decryptEvent(...args) { return this.current().decryptEvent(...args); }
99
+ encryptMessage(...args) { return xChatMessageBody(this.current().encryptMessage(...args)); }
100
+ encryptReply(...args) { return xChatMessageBody(this.current().encryptReply(...args)); }
101
+ encryptEdit(...args) { return xChatMessageBody(this.current().encryptEdit(...args)); }
102
+ encryptAddReaction(...args) { return xChatMessageBody(this.current().encryptAddReaction(...args)); }
103
+ encryptRemoveReaction(...args) { return xChatMessageBody(this.current().encryptRemoveReaction(...args)); }
104
+ prepareMessageDelete(...args) { return xChatActionSignature(this.current().prepareMessageDelete(...args)); }
105
+ verifiedParticipants(input) {
106
+ this.current();
107
+ for (const key of input.publicKeys)
108
+ if (this.#participants.get(JSON.stringify([key.userId, key.keyVersion])) !== key.publicKey)
109
+ throw new Error('Verify every participant key with setParticipants before sharing a conversation key.');
110
+ }
111
+ prepareConversationKeyChange(...args) { this.verifiedParticipants(args[0]); return this.current().prepareConversationKeyChange(...args); }
112
+ prepareGroupCreate(...args) { this.verifiedParticipants(args[0]); return this.current().prepareGroupCreate(...args); }
113
+ prepareGroupMembersChange(...args) { this.verifiedParticipants(args[0]); return this.current().prepareGroupMembersChange(...args); }
114
+ encryptMedia(...args) { return this.current().encryptStream(...args); }
115
+ decryptMedia(...args) { return this.current().decryptStream(...args); }
116
+ mediaEncryptor(...args) { return this.current().streamEncryptor(...args); }
117
+ mediaDecryptor(...args) { return this.current().streamDecryptor(...args); }
118
+ }
119
+ export function xChatMessageBody(payload) {
120
+ return { message_id: payload.messageId, encoded_message_create_event: payload.encryptedContent, encoded_message_event_signature: payload.encodedEventSignature };
121
+ }
122
+ /** X's official sample uses colon-separated direct-conversation IDs in signed
123
+ * crypto events and hyphen-separated IDs in HTTP paths. Never alter group IDs. */
124
+ export function xChatApiConversationId(cryptoId) {
125
+ const parts = cryptoId.split(':');
126
+ if (parts.length === 1)
127
+ return cryptoId;
128
+ if (parts.length !== 2 || parts.some((part) => !part.length || part.length > 19 || [...part].some((character) => character < '0' || character > '9')))
129
+ throw new Error('Invalid X Chat direct conversation ID.');
130
+ return parts.join('-');
131
+ }
132
+ export function xChatCryptoConversationId(apiId) {
133
+ const parts = apiId.split('-');
134
+ if (parts.length === 1)
135
+ return apiId;
136
+ if (parts.length !== 2 || parts.some((part) => !part.length || part.length > 19 || [...part].some((character) => character < '0' || character > '9')))
137
+ throw new Error('Invalid X Chat direct conversation ID.');
138
+ return parts.join(':');
139
+ }
140
+ export function xChatActionSignature(signature) {
141
+ return { message_id: signature.messageId, encoded_message_event_detail: signature.encodedMessageEventDetail,
142
+ message_event_signature: { signature: signature.signature, signature_version: signature.signatureVersion, public_key_version: signature.publicKeyVersion } };
143
+ }
144
+ export function xChatConversationChangeBody(change) {
145
+ // Deliberately excludes the raw conversation key. Keep that byte array on device.
146
+ return { conversation_key_version: change.conversationKeyVersion,
147
+ conversation_participant_keys: change.participantKeys.map((key) => ({ user_id: key.userId, encrypted_conversation_key: key.encryptedKey, public_key_version: key.publicKeyVersion })),
148
+ action_signatures: change.actionSignatures.map(xChatActionSignature) };
149
+ }
150
+ export function xChatRegistrationBody(registration) {
151
+ const key = registration.publicKey;
152
+ return { generate_version: registration.generateVersion, ...(registration.version ? { version: registration.version } : {}), public_key: {
153
+ identity_public_key_signature: key.identityPublicKeySignature, public_key: key.publicKey,
154
+ registration_method: key.registrationMethod, signing_public_key: key.signingPublicKey,
155
+ ...(key.publicKeyFingerprint ? { public_key_fingerprint: key.publicKeyFingerprint } : {}),
156
+ ...(key.signingPublicKeySignature ? { signing_public_key_signature: key.signingPublicKeySignature } : {}),
157
+ } };
158
+ }
159
+ /** Read only the exact realm requested by the official SDK. Keep the provider's
160
+ * original config for WASM so realm keys and recovery thresholds are preserved. */
161
+ export function xChatRealmToken(juiceboxConfig, realmId) {
162
+ const config = JSON.parse(juiceboxConfig);
163
+ if (config === null || typeof config !== 'object' || !('token_map' in config) || !Array.isArray(config.token_map))
164
+ throw new Error('X did not return secure-backup realm tokens.');
165
+ for (const entry of config.token_map) {
166
+ if (entry?.key === realmId && typeof entry?.value?.token === 'string' && entry.value.token)
167
+ return entry.value.token;
168
+ }
169
+ throw new Error('Refresh the connected user public-key record to obtain the requested backup realm token.');
170
+ }
171
+ //# sourceMappingURL=x-chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x-chat.js","sourceRoot":"","sources":["../../../../../src/sdk/x-chat.ts"],"names":[],"mappings":"AAAA;mFACmF;AACnF,OAAO,EAAE,UAAU,EAAuI,MAAM,wBAAwB,CAAC;AAEzL,4EAA4E;AAC5E,8DAA8D;AAC9D,IAAI,WAAW,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;AACtD,SAAS,eAAe,CAAI,IAAsB;IAChD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5C,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC;AAChB,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAI1C;IACC,IAAI,CAAC,CAAC,QAAQ,IAAI,UAAU,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gHAAgH,CAAC,CAAC;IACjK,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB;QAAE,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;IACnK,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IACtK,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACxD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACxB,OAAO,IAAI,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,OAAO,cAAc;IACzB,KAAK,CAAmB;IACxB,OAAO,GAAG,KAAK,CAAC;IAChB,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,kBAAkB,CAAS;IAC3B,QAAQ,CAAiB;IAChB,SAAS,CAAS;IAClB,MAAM,CAAS;IACxB,YAAY,SAAiB,EAAE,MAAc,EAAE,IAAsB,EAAE,iBAAyB;QAC9F,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpE,IAAI,CAAC,kBAAkB,GAAG,iBAAiB,CAAC;IAC9C,CAAC;IACO,OAAO;QACb,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IACO,KAAK,CAAC,OAAO,CAAI,GAAe,EAAE,IAAqC;QAC7E,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,OAAO,MAAM,eAAe,CAAC,KAAK,IAAI,EAAE;gBACtC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC;gBACjC,qEAAqE;gBACrE,oEAAoE;gBACpE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBAC7D,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;gBAC9B,OAAO,MAAM,CAAC;YAChB,CAAC,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;IAC9B,CAAC;IACD,MAAM,CAAC,GAAe,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,KAAK,CAAC,GAAe,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,KAAK,CAAC,SAAS,CAAC,MAAkB,EAAE,MAAkB;QACpD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC;YAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;QAAC,CAAC;gBAC/E,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;IAC3B,CAAC;IACD,KAAK,CAAC,IAAI,KAAK,MAAM,eAAe,CAAC,KAAK,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9H,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,KAAK,eAAe,CAAC,KAAK,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzF,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IACD,YAAY,CAAC,MAAc,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACrE,kBAAkB,CAAC,OAAe,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAC5H,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACjE,oBAAoB,KAAK,OAAO,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3F,aAAa,KAAK,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAC1D,uBAAuB,KAAK,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC;IAC9E,eAAe,CAAC,OAA+B;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,6BAA6B,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC5M,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACxI,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,CAAC,kBAAkB;YAChH,SAAS,EAAE,MAAM,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,CAAC,UAAU,EAAE,0BAA0B,EAAE,MAAM,CAAC,6BAA6B,EAAE,CAAC,CAAC,CAAC,CAAC;IACtJ,CAAC;IACD,aAAa,CAAC,GAAG,IAAmD,IAAI,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvH,YAAY,CAAC,GAAG,IAAkD,IAAI,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpH,cAAc,CAAC,GAAG,IAAoD,IAAI,OAAO,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5I,YAAY,CAAC,GAAG,IAAkD,IAAI,OAAO,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtI,WAAW,CAAC,GAAG,IAAiD,IAAI,OAAO,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACnI,kBAAkB,CAAC,GAAG,IAAwD,IAAI,OAAO,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACxJ,qBAAqB,CAAC,GAAG,IAA2D,IAAI,OAAO,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACjK,oBAAoB,CAAC,GAAG,IAA0D,IAAI,OAAO,oBAAoB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1J,oBAAoB,CAAC,KAAuF;QAClH,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,UAAU;YAAE,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAC;IAC1O,CAAC;IACD,4BAA4B,CAAC,GAAG,IAAkE,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,4BAA4B,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxM,kBAAkB,CAAC,GAAG,IAAwD,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1K,yBAAyB,CAAC,GAAG,IAA+D,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,yBAAyB,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/L,YAAY,CAAC,GAAG,IAAmD,IAAI,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtH,YAAY,CAAC,GAAG,IAAmD,IAAI,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtH,cAAc,CAAC,GAAG,IAAqD,IAAI,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5H,cAAc,CAAC,GAAG,IAAqD,IAAI,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;CAC7H;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAoB;IACnD,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE,4BAA4B,EAAE,OAAO,CAAC,gBAAgB,EAAE,+BAA+B,EAAE,OAAO,CAAC,qBAAqB,EAAE,CAAC;AACnK,CAAC;AACD;kFACkF;AAClF,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IACxC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,GAAG,GAAG,IAAI,SAAS,GAAG,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACjN,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AACD,MAAM,UAAU,yBAAyB,CAAC,KAAa;IACrD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,GAAG,GAAG,IAAI,SAAS,GAAG,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACjN,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AACD,MAAM,UAAU,oBAAoB,CAAC,SAAiE;IACpG,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,SAAS,EAAE,4BAA4B,EAAE,SAAS,CAAC,yBAAyB;QACzG,uBAAuB,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,iBAAiB,EAAE,SAAS,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,SAAS,CAAC,gBAAgB,EAAE,EAAE,CAAC;AACjK,CAAC;AACD,MAAM,UAAU,2BAA2B,CAAC,MAAkC;IAC5E,kFAAkF;IAClF,OAAO,EAAE,wBAAwB,EAAE,MAAM,CAAC,sBAAsB;QAC9D,6BAA6B,EAAE,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,0BAA0B,EAAE,GAAG,CAAC,YAAY,EAAE,kBAAkB,EAAE,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACrL,iBAAiB,EAAE,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC;AAC3E,CAAC;AACD,MAAM,UAAU,qBAAqB,CAAC,YAA0C;IAC9E,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC;IACnC,OAAO,EAAE,gBAAgB,EAAE,YAAY,CAAC,eAAe,EAAE,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE;YACvI,6BAA6B,EAAE,GAAG,CAAC,0BAA0B,EAAE,UAAU,EAAE,GAAG,CAAC,SAAS;YACxF,mBAAmB,EAAE,GAAG,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,GAAG,CAAC,gBAAgB;YACrF,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,GAAG,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzF,GAAG,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,4BAA4B,EAAE,GAAG,CAAC,yBAAyB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1G,EAAE,CAAC;AACN,CAAC;AAED;mFACmF;AACnF,MAAM,UAAU,eAAe,CAAC,cAAsB,EAAE,OAAe;IACrE,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACnD,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACnL,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrC,IAAI,KAAK,EAAE,GAAG,KAAK,OAAO,IAAI,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;IACvH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,0FAA0F,CAAC,CAAC;AAC9G,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stacklink/sdk",
3
- "version": "0.3.7",
3
+ "version": "0.3.9",
4
4
  "description": "TypeScript SDK and agent-harness adapters for Stacklink.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "type": "module",
@@ -48,7 +48,11 @@
48
48
  "types": "./dist/src/sdk/langchain.d.ts",
49
49
  "default": "./dist/src/sdk/langchain.js"
50
50
  },
51
- "./compatibility.json": "./compatibility.json"
51
+ "./compatibility.json": "./compatibility.json",
52
+ "./x-chat": {
53
+ "types": "./dist/src/sdk/x-chat.d.ts",
54
+ "default": "./dist/src/sdk/x-chat.js"
55
+ }
52
56
  },
53
57
  "dependencies": {
54
58
  "ajv": "^8.20.0",
@@ -58,7 +62,9 @@
58
62
  "@anthropic-ai/claude-agent-sdk": "^0.3.214",
59
63
  "@openai/agents": "^0.13.3",
60
64
  "ai": "^7.0.0",
61
- "openai": "^6.46.0"
65
+ "openai": "^6.46.0",
66
+ "@xdevplatform/chat-xdk": "0.5.0",
67
+ "juicebox-sdk": "0.3.7"
62
68
  },
63
69
  "peerDependenciesMeta": {
64
70
  "@anthropic-ai/claude-agent-sdk": {
@@ -72,6 +78,12 @@
72
78
  },
73
79
  "openai": {
74
80
  "optional": true
81
+ },
82
+ "@xdevplatform/chat-xdk": {
83
+ "optional": true
84
+ },
85
+ "juicebox-sdk": {
86
+ "optional": true
75
87
  }
76
88
  },
77
89
  "scripts": {