simple_node_characterai 1.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.
Files changed (42) hide show
  1. package/README.md +79 -0
  2. package/dist/Auth/index.d.ts +14 -0
  3. package/dist/Auth/index.d.ts.map +1 -0
  4. package/dist/Auth/index.js +49 -0
  5. package/dist/Auth/index.js.map +1 -0
  6. package/dist/Chat/Messages.d.ts +2 -0
  7. package/dist/Chat/Messages.d.ts.map +1 -0
  8. package/dist/Chat/Messages.js +3 -0
  9. package/dist/Chat/Messages.js.map +1 -0
  10. package/dist/Chat/index.d.ts +26 -0
  11. package/dist/Chat/index.d.ts.map +1 -0
  12. package/dist/Chat/index.js +176 -0
  13. package/dist/Chat/index.js.map +1 -0
  14. package/dist/EventBus/index.d.ts +8 -0
  15. package/dist/EventBus/index.d.ts.map +1 -0
  16. package/dist/EventBus/index.js +10 -0
  17. package/dist/EventBus/index.js.map +1 -0
  18. package/dist/Websocket/index.d.ts +20 -0
  19. package/dist/Websocket/index.d.ts.map +1 -0
  20. package/dist/Websocket/index.js +72 -0
  21. package/dist/Websocket/index.js.map +1 -0
  22. package/dist/api.d.ts +23 -0
  23. package/dist/api.d.ts.map +1 -0
  24. package/dist/api.js +51 -0
  25. package/dist/api.js.map +1 -0
  26. package/dist/index.d.ts +3 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +19 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/types/Chat.d.ts +127 -0
  31. package/dist/types/Chat.d.ts.map +1 -0
  32. package/dist/types/Chat.js +3 -0
  33. package/dist/types/Chat.js.map +1 -0
  34. package/dist/types/Profile.d.ts +29 -0
  35. package/dist/types/Profile.d.ts.map +1 -0
  36. package/dist/types/Profile.js +3 -0
  37. package/dist/types/Profile.js.map +1 -0
  38. package/dist/types/index.d.ts +3 -0
  39. package/dist/types/index.d.ts.map +1 -0
  40. package/dist/types/index.js +19 -0
  41. package/dist/types/index.js.map +1 -0
  42. package/package.json +42 -0
package/README.md ADDED
@@ -0,0 +1,79 @@
1
+ # THIS PACKAGE HEAVILY INSPIRED BY [node_characterai](https://github.com/realcoloride/node_characterai/tree/2.0) PACKAGE.
2
+
3
+ # Character AI (Node) Package
4
+
5
+ Simple Node.js library for interacting with Character.AI via HTTP and WebSocket with typescript. It provides simple primitives to authenticate, create chats, send messages, and fetch chat turns. Perfect usage for route handlers in Node.js applications that need interactions with Character.AI in custom interface.
6
+
7
+ ## Features
8
+ - Authenticate with a session token and initialize a WebSocket
9
+ - Create one-on-one chats with characters
10
+ - Send messages and await final replies
11
+ - Fetch chat turns (messages) with pagination
12
+ - Minimal, typed API with clear data models
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ npm install simple_node_characterai
18
+ ```
19
+
20
+ ## Quick Start
21
+
22
+ ```ts
23
+ import { authenticate, createNewConversation, sendMessage, getMessages, getProfile } from 'simple_node_characterai';
24
+
25
+ (async () => {
26
+ // 1) Authenticate with your session token (string without "Token " prefix is fine)
27
+ await authenticate('YOUR_SESSION_TOKEN');
28
+
29
+ // 2) Access the authenticated user profile
30
+ const profile = getProfile();
31
+ console.log('Logged in as:', profile.user.username);
32
+
33
+ // 3) Create a new chat with a character
34
+ const characterId = 'CHARACTER_ID';
35
+ const addTurn = await createNewConversation(characterId);
36
+ const chatId = addTurn.turn.turn_key.chat_id;
37
+
38
+ // 4) Send a message and wait for the final candidate
39
+ const response = await sendMessage('Hello!', characterId, chatId);
40
+ console.log(response.turn.candidates[0].raw_content);
41
+
42
+ // 5) Fetch latest turns (up to 50)
43
+ const turns = await getMessages(chatId);
44
+ console.log('Turns count:', turns.length);
45
+ })();
46
+ ```
47
+
48
+ ## API Reference
49
+
50
+ ### Auth
51
+
52
+ #### authenticate(sessionToken: string): Promise<void>
53
+ - Authenticates the user, validates the token, loads the profile, and opens the WebSocket.
54
+ - Accepts either raw token or `"Token XXX"` format.
55
+
56
+ #### getProfile(): Profile
57
+ - Returns the in-memory authenticated user profile.
58
+
59
+ ### Chat
60
+
61
+ #### createNewConversation(characterId: string): Promise<AddTurnResponse>
62
+ - Creates a new one-on-one chat with the specified character and resolves when the greeting turn arrives.
63
+ - Returns metadata and the initial turn.
64
+
65
+ #### sendMessage(message: string, characterId: string, chatId: string): Promise<UpdateTurnResponse>
66
+ - Sends a user message to an existing chat.
67
+ - Resolves when the model returns a final candidate for the turn.
68
+
69
+ #### getMessages(chatId: string, token?: string): Promise<Turn[]>
70
+ - Retrieves up to 50 turns for the given chat.
71
+ - If a `token` is provided, fetches the next page of results using `next_token`.
72
+
73
+ ## Notes
74
+ - This package is intended for personal use.
75
+ - Avoid logging tokens, cookies, or PII; keep sensitive information in memory.
76
+ - When building client-side applications, follow CORS restrictions; this package is designed for server-side Node usage.
77
+
78
+ ## Development
79
+ Still in development but ready to use for basic chatting usage, more feature will be added in the future.
@@ -0,0 +1,14 @@
1
+ import { type Profile } from "#types";
2
+ /**
3
+ * Authenticates the user and initializes WebSocket connection.
4
+ * Validates the session token, loads user profile, and connects to chat.
5
+ * @param sessionToken - Character.AI session token (with or without "Token " prefix).
6
+ * @returns Resolves when authentication and connection complete.
7
+ */
8
+ export declare const authenticate: (sessionToken: string) => Promise<void>;
9
+ /**
10
+ * Returns the authenticated user's profile.
11
+ * @returns Profile object of the current user.
12
+ */
13
+ export declare const getProfile: () => Profile;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAMtC;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GAAU,cAAc,MAAM,KAAI,OAAO,CAAC,IAAI,CAgBtE,CAAA;AAgBD;;;GAGG;AACH,eAAO,MAAM,UAAU,QAAQ,OAAe,CAAC"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getProfile = exports.authenticate = void 0;
4
+ const Websocket_1 = require("../Websocket");
5
+ const api_1 = require("../api");
6
+ let user = {};
7
+ /**
8
+ * Authenticates the user and initializes WebSocket connection.
9
+ * Validates the session token, loads user profile, and connects to chat.
10
+ * @param sessionToken - Character.AI session token (with or without "Token " prefix).
11
+ * @returns Resolves when authentication and connection complete.
12
+ */
13
+ const authenticate = async (sessionToken) => {
14
+ if (sessionToken.startsWith("Token "))
15
+ sessionToken = sessionToken.substring("Token ".length, sessionToken.length);
16
+ (0, api_1.updateToken)(sessionToken);
17
+ const req = await (0, api_1.request)("https://plus.character.ai/chat/user/settings/", {
18
+ method: "GET",
19
+ includeAuthorization: true
20
+ });
21
+ if (!req.ok)
22
+ throw Error("Invaild authentication token.");
23
+ await loadProfile();
24
+ await (0, Websocket_1.connect)({
25
+ edgeRollout: "60",
26
+ authorization: sessionToken
27
+ });
28
+ };
29
+ exports.authenticate = authenticate;
30
+ /**
31
+ * Loads the current user's profile into memory.
32
+ * Uses authorized request to fetch user details from Character.AI.
33
+ * @returns Resolves when the profile has been populated.
34
+ */
35
+ const loadProfile = async () => {
36
+ const result = await (0, api_1.request)("https://plus.character.ai/chat/user/", {
37
+ method: 'GET',
38
+ includeAuthorization: true
39
+ });
40
+ const profile = await result.json();
41
+ Object.assign(user, profile.user);
42
+ };
43
+ /**
44
+ * Returns the authenticated user's profile.
45
+ * @returns Profile object of the current user.
46
+ */
47
+ const getProfile = () => user;
48
+ exports.getProfile = getProfile;
49
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Auth/index.ts"],"names":[],"mappings":";;;AACA,4CAAuC;AACvC,gCAA8C;AAE9C,IAAI,IAAI,GAAY,EAAa,CAAC;AAElC;;;;;GAKG;AACI,MAAM,YAAY,GAAG,KAAK,EAAE,YAAoB,EAAkB,EAAE;IACvE,IAAI,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,YAAY,GAAG,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IAEnH,IAAA,iBAAW,EAAC,YAAY,CAAC,CAAC;IAE1B,MAAM,GAAG,GAAG,MAAM,IAAA,aAAO,EAAC,+CAA+C,EAAE;QACvE,MAAM,EAAE,KAAK;QACb,oBAAoB,EAAE,IAAI;KAC7B,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAE1D,MAAM,WAAW,EAAE,CAAC;IACpB,MAAM,IAAA,mBAAO,EAAC;QACV,WAAW,EAAE,IAAI;QACjB,aAAa,EAAE,YAAY;KAC9B,CAAC,CAAC;AACP,CAAC,CAAA;AAhBY,QAAA,YAAY,gBAgBxB;AAED;;;;GAIG;AACH,MAAM,WAAW,GAAG,KAAK,IAAoB,EAAE;IAC3C,MAAM,MAAM,GAAG,MAAM,IAAA,aAAO,EAAC,sCAAsC,EAAE;QACjE,MAAM,EAAE,KAAK;QACb,oBAAoB,EAAE,IAAI;KAC7B,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACpC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC,CAAA;AAED;;;GAGG;AACI,MAAM,UAAU,GAAG,GAAa,EAAE,CAAC,IAAI,CAAC;AAAlC,QAAA,UAAU,cAAwB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Messages.d.ts","sourceRoot":"","sources":["../../src/Chat/Messages.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=Messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Messages.js","sourceRoot":"","sources":["../../src/Chat/Messages.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import { AddTurnResponse, UpdateTurnResponse, Turn } from "../types/Chat";
2
+ /**
3
+ * Creates a new one-on-one chat for the given character.
4
+ * Opens a WebSocket request and resolves when the initial turn is added.
5
+ * @param characterId - The ID of the character to start a chat with.
6
+ * @returns AddTurnResponse containing chat metadata and the greeting turn.
7
+ */
8
+ export declare const createNewConversation: (characterId: string) => Promise<AddTurnResponse>;
9
+ /**
10
+ * Sends a message to an existing chat and waits for the final reply.
11
+ * Uses the WebSocket to create and generate a turn, resolving on final candidate.
12
+ * @param message - The user's text message to send.
13
+ * @param characterId - The target character's ID.
14
+ * @param chatId - The ID of the chat where the message is posted.
15
+ * @returns UpdateTurnResponse containing the generated turn with final candidate.
16
+ */
17
+ export declare const sendMessage: (message: string, characterId: string, chatId: string) => Promise<UpdateTurnResponse>;
18
+ /**
19
+ * Retrieves up to 50 messages (turns) for a given chat.
20
+ * If a `token` is provided, it fetches the next page of results.
21
+ * @param chatId - The ID of the chat whose messages are to be fetched.
22
+ * @param token - Optional pagination token for retrieving the next batch.
23
+ * @return Parsed JSON containing up to 50 messages.
24
+ */
25
+ export declare const getMessages: (chatId: string, token?: string) => Promise<Turn[]>;
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Chat/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAmD,kBAAkB,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAK3H;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAAU,aAAa,MAAM,KAAG,OAAO,CAAC,eAAe,CA0CxF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,GAAU,SAAS,MAAM,EAAE,aAAa,MAAM,EAAE,QAAQ,MAAM,KAAG,OAAO,CAAC,kBAAkB,CAqFlH,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GAAU,QAAQ,MAAM,EAAE,QAAQ,MAAM,KAAI,OAAO,CAAC,IAAI,EAAE,CAUjF,CAAA"}
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getMessages = exports.sendMessage = exports.createNewConversation = void 0;
7
+ const EventBus_1 = __importDefault(require("../EventBus"));
8
+ const Auth_1 = require("../Auth");
9
+ const Websocket_1 = require("../Websocket");
10
+ const uuid_1 = require("uuid");
11
+ const api_1 = require("../api");
12
+ /**
13
+ * Creates a new one-on-one chat for the given character.
14
+ * Opens a WebSocket request and resolves when the initial turn is added.
15
+ * @param characterId - The ID of the character to start a chat with.
16
+ * @returns AddTurnResponse containing chat metadata and the greeting turn.
17
+ */
18
+ const createNewConversation = async (characterId) => {
19
+ if (!characterId)
20
+ throw Error('Character ID is required for creating new conversation');
21
+ const websocket = (0, Websocket_1.getSocket)();
22
+ return new Promise((resolve, reject) => {
23
+ const request_id = (0, uuid_1.v4)();
24
+ const profile = (0, Auth_1.getProfile)();
25
+ const request = {
26
+ command: "create_chat",
27
+ request_id,
28
+ payload: {
29
+ chat: {
30
+ character_id: characterId,
31
+ creator_id: profile.user.id.toString(),
32
+ chat_id: request_id,
33
+ type: 'TYPE_ONE_ON_ONE',
34
+ visibility: 'VISIBILITY_PRIVATE'
35
+ },
36
+ chat_type: 'TYPE_ONE_ON_ONE',
37
+ with_greeting: true,
38
+ },
39
+ origin_id: "web-next"
40
+ };
41
+ const messageHandler = (data) => {
42
+ try {
43
+ const message = data.toString('utf-8');
44
+ const response = JSON.parse(message);
45
+ if (response.command === 'add_turn' && response.request_id === request_id) {
46
+ clearTimeout(timeout);
47
+ EventBus_1.default.off('message', messageHandler);
48
+ resolve(response);
49
+ }
50
+ }
51
+ catch { }
52
+ };
53
+ EventBus_1.default.on('message', messageHandler);
54
+ const timeout = setTimeout(() => {
55
+ EventBus_1.default.off('message', messageHandler);
56
+ reject(new Error('Timeout waiting for response'));
57
+ }, 30000);
58
+ websocket.send(JSON.stringify(request));
59
+ });
60
+ };
61
+ exports.createNewConversation = createNewConversation;
62
+ /**
63
+ * Sends a message to an existing chat and waits for the final reply.
64
+ * Uses the WebSocket to create and generate a turn, resolving on final candidate.
65
+ * @param message - The user's text message to send.
66
+ * @param characterId - The target character's ID.
67
+ * @param chatId - The ID of the chat where the message is posted.
68
+ * @returns UpdateTurnResponse containing the generated turn with final candidate.
69
+ */
70
+ const sendMessage = async (message, characterId, chatId) => {
71
+ if (!message)
72
+ throw Error('Message is required for sending message');
73
+ if (!chatId)
74
+ throw Error('Chat ID is required for sending message');
75
+ if (!characterId)
76
+ throw Error('Character ID is required for sending message');
77
+ const websocket = (0, Websocket_1.getSocket)();
78
+ return new Promise((resolve, reject) => {
79
+ console.log('sending message');
80
+ const uuid = (0, uuid_1.v4)();
81
+ const profile = (0, Auth_1.getProfile)();
82
+ const request = {
83
+ command: "create_and_generate_turn",
84
+ request_id: uuid,
85
+ payload: {
86
+ chat_type: "TYPE_ONE_ON_ONE",
87
+ num_candidates: 1,
88
+ tts_enabled: false,
89
+ selected_language: "",
90
+ character_id: characterId,
91
+ user_name: profile.user.username,
92
+ turn: {
93
+ turn_key: {
94
+ turn_id: uuid,
95
+ chat_id: chatId
96
+ },
97
+ author: {
98
+ author_id: profile.user.id.toString(),
99
+ is_human: true,
100
+ name: profile.user.username
101
+ },
102
+ candidates: [
103
+ {
104
+ candidate_id: uuid,
105
+ raw_content: message
106
+ }
107
+ ],
108
+ primary_candidate_id: uuid
109
+ },
110
+ previous_annotations: {
111
+ boring: 0,
112
+ not_boring: 0,
113
+ inaccurate: 0,
114
+ not_inaccurate: 0,
115
+ repetitive: 0,
116
+ not_repetitive: 0,
117
+ out_of_character: 0,
118
+ not_out_of_character: 0,
119
+ bad_memory: 0,
120
+ not_bad_memory: 0,
121
+ long: 0,
122
+ not_long: 0,
123
+ short: 0,
124
+ not_short: 0,
125
+ ends_chat_early: 0,
126
+ not_ends_chat_early: 0,
127
+ funny: 0,
128
+ not_funny: 0,
129
+ interesting: 0,
130
+ not_interesting: 0,
131
+ helpful: 0,
132
+ not_helpful: 0
133
+ },
134
+ generate_comparison: false
135
+ },
136
+ origin_id: "web-next"
137
+ };
138
+ const messageHandler = (data) => {
139
+ try {
140
+ const message = data.toString('utf-8');
141
+ const response = JSON.parse(message);
142
+ if (response.command === 'update_turn' && response.request_id === uuid && response.turn.candidates[0]?.is_final) {
143
+ clearTimeout(timeout);
144
+ EventBus_1.default.off('message', messageHandler);
145
+ resolve(response);
146
+ }
147
+ }
148
+ catch { }
149
+ };
150
+ EventBus_1.default.on('message', messageHandler);
151
+ const timeout = setTimeout(() => {
152
+ EventBus_1.default.off('message', messageHandler);
153
+ reject(new Error('Timeout waiting for response'));
154
+ }, 30000);
155
+ websocket.send(JSON.stringify(request));
156
+ });
157
+ };
158
+ exports.sendMessage = sendMessage;
159
+ /**
160
+ * Retrieves up to 50 messages (turns) for a given chat.
161
+ * If a `token` is provided, it fetches the next page of results.
162
+ * @param chatId - The ID of the chat whose messages are to be fetched.
163
+ * @param token - Optional pagination token for retrieving the next batch.
164
+ * @return Parsed JSON containing up to 50 messages.
165
+ */
166
+ const getMessages = async (chatId, token) => {
167
+ const query = token ? `?next_token=${encodeURIComponent(token)}` : '';
168
+ const req = await (0, api_1.request)(`https://neo.character.ai/turns/${chatId}/${query}`, {
169
+ method: 'GET',
170
+ includeAuthorization: true
171
+ });
172
+ const result = await req.json();
173
+ return result.turns;
174
+ };
175
+ exports.getMessages = getMessages;
176
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Chat/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { EventEmitter } from 'events';
2
+ declare const emitter: EventEmitter<any>;
3
+ /**
4
+ * Global event bus used to broadcast WebSocket messages and errors.
5
+ * Subscribers can listen to 'message' and other events across modules.
6
+ */
7
+ export default emitter;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/EventBus/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,QAAA,MAAM,OAAO,mBAAqB,CAAC;AAEnC;;;GAGG;AACH,eAAe,OAAO,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const events_1 = require("events");
4
+ const emitter = new events_1.EventEmitter();
5
+ /**
6
+ * Global event bus used to broadcast WebSocket messages and errors.
7
+ * Subscribers can listen to 'message' and other events across modules.
8
+ */
9
+ exports.default = emitter;
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/EventBus/index.ts"],"names":[],"mappings":";;AAAA,mCAAsC;AAEtC,MAAM,OAAO,GAAG,IAAI,qBAAY,EAAE,CAAC;AAEnC;;;GAGG;AACH,kBAAe,OAAO,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { WebSocket } from 'ws';
2
+ interface Options {
3
+ edgeRollout: string | '60';
4
+ authorization: string;
5
+ }
6
+ /**
7
+ * Establishes (or reuses) a WebSocket connection to Character.AI.
8
+ * Emits incoming messages through the global EventBus for subscribers.
9
+ * Handles reconnection attempts on unexpected close events.
10
+ * @param options - Initial connection options containing auth and rollout.
11
+ * @returns Resolves when the socket is open and ready.
12
+ */
13
+ export declare const connect: (options?: Options) => Promise<void>;
14
+ /**
15
+ * Returns the current WebSocket instance.
16
+ * @returns Active WebSocket or undefined if not connected.
17
+ */
18
+ export declare const getSocket: () => WebSocket;
19
+ export {};
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Websocket/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAG/B,UAAU,OAAO;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;CACzB;AAMD;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,GAAU,UAAU,OAAO,KAAI,OAAO,CAAC,IAAI,CAgD9D,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS,QAAQ,SAE7B,CAAA"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getSocket = exports.connect = void 0;
7
+ const ws_1 = require("ws");
8
+ const EventBus_1 = __importDefault(require("../EventBus"));
9
+ let websocket;
10
+ let savedOptions;
11
+ let reconnectAttempts = 0;
12
+ /**
13
+ * Establishes (or reuses) a WebSocket connection to Character.AI.
14
+ * Emits incoming messages through the global EventBus for subscribers.
15
+ * Handles reconnection attempts on unexpected close events.
16
+ * @param options - Initial connection options containing auth and rollout.
17
+ * @returns Resolves when the socket is open and ready.
18
+ */
19
+ const connect = async (options) => {
20
+ await new Promise((resolve, reject) => {
21
+ if (options)
22
+ savedOptions = options;
23
+ if (!savedOptions && !options)
24
+ return reject(new Error("Options required for initial connection"));
25
+ const opts = options || savedOptions;
26
+ if (websocket && websocket.readyState === ws_1.WebSocket.OPEN)
27
+ return resolve(websocket);
28
+ websocket = new ws_1.WebSocket('wss://neo.character.ai/ws/', {
29
+ headers: {
30
+ cookie: `HTTP_AUTHORIZATION="Token ${opts.authorization}"; edge_rollout=${opts.edgeRollout};`,
31
+ "Origin": "https://character.ai",
32
+ "Referer": "https://character.ai/",
33
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
34
+ }
35
+ });
36
+ websocket.on('message', data => {
37
+ EventBus_1.default.emit('message', data);
38
+ });
39
+ websocket.once('open', () => {
40
+ console.log('Character AI connected');
41
+ reconnectAttempts = 0;
42
+ resolve(websocket);
43
+ });
44
+ websocket.on('error', e => {
45
+ console.log('Character AI error:', e);
46
+ if (options)
47
+ reject(e);
48
+ });
49
+ websocket.on('close', (code, reason) => {
50
+ console.log(`Character AI disconnected (Code: ${code}, Reason: ${reason})`);
51
+ if (reconnectAttempts >= 5) {
52
+ console.log('Max reconnection attempts (5) reached. Giving up.');
53
+ return;
54
+ }
55
+ reconnectAttempts++;
56
+ console.log(`Attempting to reconnect in 5 seconds... (Attempt ${reconnectAttempts}/5)`);
57
+ setTimeout(() => {
58
+ (0, exports.connect)().catch(e => console.error("Reconnection failed:", e));
59
+ }, 5000);
60
+ });
61
+ });
62
+ };
63
+ exports.connect = connect;
64
+ /**
65
+ * Returns the current WebSocket instance.
66
+ * @returns Active WebSocket or undefined if not connected.
67
+ */
68
+ const getSocket = () => {
69
+ return websocket;
70
+ };
71
+ exports.getSocket = getSocket;
72
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Websocket/index.ts"],"names":[],"mappings":";;;;;;AAAA,2BAA+B;AAC/B,2DAAkC;AAOlC,IAAI,SAAqB,CAAC;AAC1B,IAAI,YAAqB,CAAC;AAC1B,IAAI,iBAAiB,GAAG,CAAC,CAAC;AAE1B;;;;;;GAMG;AACI,MAAM,OAAO,GAAG,KAAK,EAAE,OAAiB,EAAkB,EAAE;IAC/D,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAClC,IAAI,OAAO;YAAE,YAAY,GAAG,OAAO,CAAC;QACpC,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO;YAAE,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC,CAAC;QAEnG,MAAM,IAAI,GAAG,OAAO,IAAI,YAAY,CAAC;QAErC,IAAI,SAAS,IAAI,SAAS,CAAC,UAAU,KAAK,cAAS,CAAC,IAAI;YAAE,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;QAEpF,SAAS,GAAG,IAAI,cAAS,CAAC,4BAA4B,EAAE;YACpD,OAAO,EAAE;gBACL,MAAM,EAAE,6BAA6B,IAAI,CAAC,aAAa,mBAAmB,IAAI,CAAC,WAAW,GAAG;gBAC7F,QAAQ,EAAE,sBAAsB;gBAChC,SAAS,EAAE,uBAAuB;gBAClC,YAAY,EAAE,iHAAiH;aAClI;SACJ,CAAC,CAAC;QAEH,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE;YAC3B,kBAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;YACxB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtC,iBAAiB,GAAG,CAAC,CAAC;YACtB,OAAO,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE;YACtB,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC;YACtC,IAAI,OAAO;gBAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACnC,OAAO,CAAC,GAAG,CAAC,oCAAoC,IAAI,aAAa,MAAM,GAAG,CAAC,CAAC;YAE5E,IAAI,iBAAiB,IAAI,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;gBACjE,OAAO;YACX,CAAC;YAED,iBAAiB,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,oDAAoD,iBAAiB,KAAK,CAAC,CAAC;YACxF,UAAU,CAAC,GAAG,EAAE;gBACZ,IAAA,eAAO,GAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC,CAAC;YACnE,CAAC,EAAE,IAAI,CAAC,CAAC;QACb,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAA;AAhDY,QAAA,OAAO,WAgDnB;AAED;;;GAGG;AACI,MAAM,SAAS,GAAG,GAAe,EAAE;IACtC,OAAO,SAAS,CAAC;AACrB,CAAC,CAAA;AAFY,QAAA,SAAS,aAErB"}
package/dist/api.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ interface RequesterOptions {
2
+ method: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE';
3
+ includeAuthorization?: boolean;
4
+ body?: string;
5
+ contentType?: 'application/json' | 'application/x-www-form-urlencoded' | 'multipart/form-data';
6
+ formData?: Record<string, string | Blob>;
7
+ fileFieldName?: string;
8
+ }
9
+ /**
10
+ * Updates the module-level authorization header value.
11
+ * @param token - Raw session token string without the "Token " prefix.
12
+ */
13
+ export declare const updateToken: (token: string) => void;
14
+ /**
15
+ * Performs an HTTP request to Character.AI with optional authorization.
16
+ * Adds realistic browser headers and supports JSON or form payloads.
17
+ * @param url - Target endpoint URL.
18
+ * @param options - Request options including method, auth, and body.
19
+ * @returns Fetch Response from the remote server.
20
+ */
21
+ export declare const request: (url: string, options: RequesterOptions) => Promise<Response>;
22
+ export {};
23
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAEA,UAAU,gBAAgB;IACtB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;IACpD,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,kBAAkB,GAAG,mCAAmC,GAAG,qBAAqB,CAAC;IAC/F,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAID;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,SAGxC,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,GAAU,KAAK,MAAM,EAAE,SAAS,gBAAgB,sBA6BnE,CAAA"}
package/dist/api.js ADDED
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.request = exports.updateToken = void 0;
4
+ let authorization = "";
5
+ /**
6
+ * Updates the module-level authorization header value.
7
+ * @param token - Raw session token string without the "Token " prefix.
8
+ */
9
+ const updateToken = (token) => {
10
+ if (!token)
11
+ return;
12
+ authorization = `Token ${token}`;
13
+ };
14
+ exports.updateToken = updateToken;
15
+ /**
16
+ * Performs an HTTP request to Character.AI with optional authorization.
17
+ * Adds realistic browser headers and supports JSON or form payloads.
18
+ * @param url - Target endpoint URL.
19
+ * @param options - Request options including method, auth, and body.
20
+ * @returns Fetch Response from the remote server.
21
+ */
22
+ const request = async (url, options) => {
23
+ let headers = {
24
+ "User-Agent": "Character.AI",
25
+ "DNT": "1",
26
+ "Sec-GPC": "1",
27
+ "Connection": "close",
28
+ "Upgrade-Insecure-Requests": "1",
29
+ "Sec-Fetch-Dest": "empty",
30
+ "Sec-Fetch-Mode": "cors",
31
+ "Sec-Fetch-Site": "same-origin",
32
+ "Origin": "https://character.ai",
33
+ "Referer": "https://character.ai/",
34
+ "TE": "trailers"
35
+ };
36
+ let body = options.body;
37
+ if (options.includeAuthorization)
38
+ headers["Authorization"] = authorization;
39
+ if (options.contentType)
40
+ headers["Content-Type"] = options.contentType;
41
+ if (options.formData) {
42
+ const formData = options.contentType == 'application/x-www-form-urlencoded' ? new URLSearchParams() : new FormData();
43
+ Object.entries(options.formData).forEach((entry) => formData.append(entry[0], entry[1]));
44
+ body = formData;
45
+ }
46
+ if (typeof body === "string")
47
+ headers["Content-Length"] = body.length;
48
+ return await fetch(url, { headers, method: options.method, body });
49
+ };
50
+ exports.request = request;
51
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":";;;AAWA,IAAI,aAAa,GAAW,EAAE,CAAC;AAE/B;;;GAGG;AACI,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,EAAE;IACzC,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,aAAa,GAAG,SAAS,KAAK,EAAE,CAAC;AACrC,CAAC,CAAA;AAHY,QAAA,WAAW,eAGvB;AAED;;;;;;GAMG;AACI,MAAM,OAAO,GAAG,KAAK,EAAE,GAAW,EAAE,OAAyB,EAAE,EAAE;IACpE,IAAI,OAAO,GAAQ;QACf,YAAY,EAAE,cAAc;QAC5B,KAAK,EAAE,GAAG;QACV,SAAS,EAAE,GAAG;QACd,YAAY,EAAE,OAAO;QACrB,2BAA2B,EAAE,GAAG;QAChC,gBAAgB,EAAE,OAAO;QACzB,gBAAgB,EAAE,MAAM;QACxB,gBAAgB,EAAE,aAAa;QAC/B,QAAQ,EAAE,sBAAsB;QAChC,SAAS,EAAE,uBAAuB;QAClC,IAAI,EAAE,UAAU;KACnB,CAAA;IAED,IAAI,IAAI,GAAQ,OAAO,CAAC,IAAI,CAAC;IAE7B,IAAI,OAAO,CAAC,oBAAoB;QAAE,OAAO,CAAC,eAAe,CAAC,GAAG,aAAa,CAAC;IAC3E,IAAI,OAAO,CAAC,WAAW;QAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IAEvE,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnB,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,IAAI,mCAAmC,CAAC,CAAC,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC;QACrH,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAQ,CAAC,CAAC,CAAC;QAChG,IAAI,GAAG,QAAQ,CAAC;IACpB,CAAC;IAED,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IAEtE,OAAO,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AACvE,CAAC,CAAA;AA7BY,QAAA,OAAO,WA6BnB"}
@@ -0,0 +1,3 @@
1
+ export * from './Auth';
2
+ export * from './Chat';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./Auth"), exports);
18
+ __exportStar(require("./Chat"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,yCAAuB"}
@@ -0,0 +1,127 @@
1
+ export interface TurnKey {
2
+ turn_id: string;
3
+ chat_id: string;
4
+ }
5
+ export interface Author {
6
+ author_id: string;
7
+ is_human?: boolean;
8
+ name: string;
9
+ }
10
+ export interface Editor {
11
+ author_id: string;
12
+ name: string;
13
+ }
14
+ export interface Candidate {
15
+ candidate_id: string;
16
+ raw_content: string;
17
+ create_time?: string;
18
+ is_final?: boolean;
19
+ model_type?: string;
20
+ editor?: Editor;
21
+ }
22
+ export interface PreviousAnnotations {
23
+ boring: number;
24
+ not_boring: number;
25
+ inaccurate: number;
26
+ not_inaccurate: number;
27
+ repetitive: number;
28
+ not_repetitive: number;
29
+ out_of_character: number;
30
+ not_out_of_character: number;
31
+ bad_memory: number;
32
+ not_bad_memory: number;
33
+ long: number;
34
+ not_long: number;
35
+ short: number;
36
+ not_short: number;
37
+ ends_chat_early: number;
38
+ not_ends_chat_early: number;
39
+ funny: number;
40
+ not_funny: number;
41
+ interesting: number;
42
+ not_interesting: number;
43
+ helpful: number;
44
+ not_helpful: number;
45
+ }
46
+ export interface Turn {
47
+ turn_key: TurnKey;
48
+ author: Author;
49
+ candidates: Candidate[];
50
+ primary_candidate_id: string;
51
+ create_time?: string;
52
+ last_update_time?: string;
53
+ state?: string;
54
+ }
55
+ export interface Payload {
56
+ chat_type: 'TYPE_ONE_ON_ONE';
57
+ num_candidates: number;
58
+ tts_enabled: boolean;
59
+ selected_language: string;
60
+ character_id: string;
61
+ user_name: string;
62
+ turn: Turn;
63
+ previous_annotations: PreviousAnnotations;
64
+ generate_comparison: boolean;
65
+ }
66
+ export interface CreateAndGenerateTurnRequest {
67
+ command: 'create_and_generate_turn';
68
+ request_id: string;
69
+ payload: Payload;
70
+ origin_id: 'web-next';
71
+ }
72
+ export interface ChatInfo {
73
+ type: 'TYPE_ONE_ON_ONE';
74
+ }
75
+ export interface GenerationMode {
76
+ mode: 'MODE_NORMAL';
77
+ remaining_quota_frac: number;
78
+ }
79
+ export interface AddTurnResponse {
80
+ turn: Turn;
81
+ chat_info: ChatInfo;
82
+ command: 'add_turn';
83
+ request_id: string;
84
+ generation_mode?: GenerationMode;
85
+ }
86
+ export interface UpdateTurnResponse {
87
+ turn: Turn;
88
+ chat_info: ChatInfo;
89
+ generation_mode: GenerationMode;
90
+ command: 'update_turn';
91
+ request_id: string;
92
+ }
93
+ export interface ChatProperties {
94
+ chat_id: string;
95
+ creator_id: string | number;
96
+ visibility: 'VISIBILITY_PRIVATE';
97
+ character_id: string;
98
+ type: 'TYPE_ONE_ON_ONE';
99
+ }
100
+ export interface CreateChatPayload {
101
+ chat_type: 'TYPE_ONE_ON_ONE';
102
+ chat: ChatProperties;
103
+ with_greeting: boolean;
104
+ }
105
+ export interface CreateChatRequest {
106
+ command: 'create_chat';
107
+ request_id: string;
108
+ payload: CreateChatPayload;
109
+ origin_id: 'web-next';
110
+ }
111
+ export interface ChatResponseProperties {
112
+ chat_id: string;
113
+ create_time: string;
114
+ creator_id: string;
115
+ character_id: string;
116
+ state: 'STATE_ACTIVE';
117
+ type: 'TYPE_ONE_ON_ONE';
118
+ visibility: 'VISIBILITY_PRIVATE';
119
+ preferred_model_type: 'MODEL_TYPE_DEEP_SYNTH_LITE';
120
+ model_preference_version: string;
121
+ }
122
+ export interface CreateChatResponse {
123
+ chat: ChatResponseProperties;
124
+ command: 'create_chat_response';
125
+ request_id: string;
126
+ }
127
+ //# sourceMappingURL=Chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Chat.d.ts","sourceRoot":"","sources":["../../src/types/Chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=Chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Chat.js","sourceRoot":"","sources":["../../src/types/Chat.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ export interface Profile {
2
+ user: {
3
+ username: string;
4
+ id: number;
5
+ first_name: string;
6
+ account: {
7
+ name: string;
8
+ avatar_type: string | 'DEFAULT';
9
+ onboarding_complete: boolean;
10
+ avatar_file_name: string;
11
+ mobile_onboarding_complete: boolean | null;
12
+ };
13
+ is_staff: boolean;
14
+ subscription: any | null;
15
+ entitlements: any[];
16
+ };
17
+ is_human: boolean;
18
+ name: string;
19
+ email: string;
20
+ date_joined: string;
21
+ needs_to_acknowledge_policy: boolean;
22
+ suspended_until: string | null;
23
+ hidden_characters: any[];
24
+ blocked_users: any[];
25
+ bio: string;
26
+ interests: any | null;
27
+ date_of_birth: string;
28
+ }
29
+ //# sourceMappingURL=Profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Profile.d.ts","sourceRoot":"","sources":["../../src/types/Profile.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE;YACP,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;YAChC,mBAAmB,EAAE,OAAO,CAAC;YAC7B,gBAAgB,EAAE,MAAM,CAAC;YACzB,0BAA0B,EAAE,OAAO,GAAG,IAAI,CAAC;SAC5C,CAAC;QACF,QAAQ,EAAE,OAAO,CAAC;QAClB,YAAY,EAAE,GAAG,GAAG,IAAI,CAAC;QACzB,YAAY,EAAE,GAAG,EAAE,CAAC;KACrB,CAAC;IACF,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,2BAA2B,EAAE,OAAO,CAAC;IACrC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,iBAAiB,EAAE,GAAG,EAAE,CAAC;IACzB,aAAa,EAAE,GAAG,EAAE,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=Profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Profile.js","sourceRoot":"","sources":["../../src/types/Profile.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export * from './Chat';
2
+ export * from './Profile';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./Chat"), exports);
18
+ __exportStar(require("./Profile"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,4CAA0B"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "simple_node_characterai",
3
+ "version": "1.1.0",
4
+ "main": "dist/index.js",
5
+ "types": "dist/index.d.ts",
6
+ "scripts": {
7
+ "build": "tsc",
8
+ "prepublishOnly": "npm run build"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "keywords": ["character", "ai", "character_ai", "cai", "c.ai", "characterai"],
14
+ "author": "Nadila Vira",
15
+ "license": "ISC",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "https://github.com/IqroNegoro/simple_node_characterai.git"
19
+ },
20
+ "homepage": "https://github.com/IqroNegoro/simple_node_characterai#readme",
21
+ "bugs": {
22
+ "url": "https://github.com/IqroNegoro/simple_node_characterai/issues"
23
+ },
24
+ "funding": {
25
+ "type": "individual",
26
+ "url": "https://github.com/sponsors/IqroNegoro"
27
+ },
28
+ "engines": {
29
+ "node": ">=22.12.0"
30
+ },
31
+ "description": "Simple Node.js library for interacting with Character.AI via HTTP and WebSocket with typescript",
32
+ "devDependencies": {
33
+ "@types/node": "^25.0.3",
34
+ "@types/uuid": "^11.0.0",
35
+ "@types/ws": "^8.18.1",
36
+ "typescript": "^5.9.3"
37
+ },
38
+ "dependencies": {
39
+ "uuid": "^13.0.0",
40
+ "ws": "^8.18.3"
41
+ }
42
+ }