@qnote/q-ai-note 1.0.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 (72) hide show
  1. package/README.md +50 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +55 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/server/aiClient.d.ts +11 -0
  7. package/dist/server/aiClient.d.ts.map +1 -0
  8. package/dist/server/aiClient.js +83 -0
  9. package/dist/server/aiClient.js.map +1 -0
  10. package/dist/server/api/batchRecovery.d.ts +11 -0
  11. package/dist/server/api/batchRecovery.d.ts.map +1 -0
  12. package/dist/server/api/batchRecovery.js +68 -0
  13. package/dist/server/api/batchRecovery.js.map +1 -0
  14. package/dist/server/api/chat.d.ts +3 -0
  15. package/dist/server/api/chat.d.ts.map +1 -0
  16. package/dist/server/api/chat.js +485 -0
  17. package/dist/server/api/chat.js.map +1 -0
  18. package/dist/server/api/diary.d.ts +3 -0
  19. package/dist/server/api/diary.d.ts.map +1 -0
  20. package/dist/server/api/diary.js +102 -0
  21. package/dist/server/api/diary.js.map +1 -0
  22. package/dist/server/api/sandbox.d.ts +3 -0
  23. package/dist/server/api/sandbox.d.ts.map +1 -0
  24. package/dist/server/api/sandbox.js +87 -0
  25. package/dist/server/api/sandbox.js.map +1 -0
  26. package/dist/server/api/settings.d.ts +3 -0
  27. package/dist/server/api/settings.d.ts.map +1 -0
  28. package/dist/server/api/settings.js +45 -0
  29. package/dist/server/api/settings.js.map +1 -0
  30. package/dist/server/api/workItem.d.ts +3 -0
  31. package/dist/server/api/workItem.d.ts.map +1 -0
  32. package/dist/server/api/workItem.js +290 -0
  33. package/dist/server/api/workItem.js.map +1 -0
  34. package/dist/server/chatUtils.d.ts +15 -0
  35. package/dist/server/chatUtils.d.ts.map +1 -0
  36. package/dist/server/chatUtils.js +52 -0
  37. package/dist/server/chatUtils.js.map +1 -0
  38. package/dist/server/config.d.ts +14 -0
  39. package/dist/server/config.d.ts.map +1 -0
  40. package/dist/server/config.js +56 -0
  41. package/dist/server/config.js.map +1 -0
  42. package/dist/server/db.d.ts +6 -0
  43. package/dist/server/db.d.ts.map +1 -0
  44. package/dist/server/db.js +106 -0
  45. package/dist/server/db.js.map +1 -0
  46. package/dist/server/index.d.ts +5 -0
  47. package/dist/server/index.d.ts.map +1 -0
  48. package/dist/server/index.js +72 -0
  49. package/dist/server/index.js.map +1 -0
  50. package/dist/server/react/agent.d.ts +56 -0
  51. package/dist/server/react/agent.d.ts.map +1 -0
  52. package/dist/server/react/agent.js +219 -0
  53. package/dist/server/react/agent.js.map +1 -0
  54. package/dist/server/react/prompts.d.ts +13 -0
  55. package/dist/server/react/prompts.d.ts.map +1 -0
  56. package/dist/server/react/prompts.js +84 -0
  57. package/dist/server/react/prompts.js.map +1 -0
  58. package/dist/server/react/tools.d.ts +67 -0
  59. package/dist/server/react/tools.d.ts.map +1 -0
  60. package/dist/server/react/tools.js +208 -0
  61. package/dist/server/react/tools.js.map +1 -0
  62. package/dist/server/types.d.ts +59 -0
  63. package/dist/server/types.d.ts.map +1 -0
  64. package/dist/server/types.js +2 -0
  65. package/dist/server/types.js.map +1 -0
  66. package/dist/web/app.js +1081 -0
  67. package/dist/web/chatView.js +31 -0
  68. package/dist/web/index.html +218 -0
  69. package/dist/web/shared.js +49 -0
  70. package/dist/web/styles.css +1320 -0
  71. package/dist/web/vueRenderers.js +191 -0
  72. package/package.json +46 -0
package/README.md ADDED
@@ -0,0 +1,50 @@
1
+ # q-ai-note
2
+
3
+ AI-assisted personal work sandbox and diary system.
4
+
5
+ ## Install
6
+
7
+ Use without global install:
8
+
9
+ ```bash
10
+ npx @qnote/q-ai-note
11
+ ```
12
+
13
+ Install globally:
14
+
15
+ ```bash
16
+ npm i -g @qnote/q-ai-note
17
+ q-ai-note
18
+ ```
19
+
20
+ ## Usage
21
+
22
+ ```bash
23
+ q-ai-note --port 3200
24
+ ```
25
+
26
+ Then open `http://localhost:3200`.
27
+
28
+ ## Data and config paths
29
+
30
+ - Config: `~/.q-ai-note/config.json`
31
+ - Database: `~/.q-ai-note/data/q-ai-note.db`
32
+
33
+ You can override runtime paths with environment variables:
34
+
35
+ - `Q_AI_NOTE_CONFIG_DIR`
36
+ - `Q_AI_NOTE_DATA_DIR`
37
+ - `Q_AI_NOTE_DB_PATH`
38
+
39
+ Backward-compatible legacy variables are still supported:
40
+
41
+ - `PERSONAL_AI_NOTEBOOK_CONFIG_DIR`
42
+ - `PERSONAL_AI_NOTEBOOK_DATA_DIR`
43
+ - `PERSONAL_AI_NOTEBOOK_DB_PATH`
44
+
45
+ ## Publish to npm
46
+
47
+ ```bash
48
+ npm login
49
+ npm publish --access public
50
+ ```
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env node
2
+ import { startServer } from './server/index.js';
3
+ function parseArgs(argv) {
4
+ const options = {
5
+ port: Number(process.env.PORT || 3000),
6
+ help: false,
7
+ };
8
+ for (let i = 0; i < argv.length; i += 1) {
9
+ const arg = argv[i];
10
+ if (arg === '-h' || arg === '--help') {
11
+ options.help = true;
12
+ continue;
13
+ }
14
+ if (arg === '-p' || arg === '--port') {
15
+ const next = argv[i + 1];
16
+ if (next) {
17
+ const port = Number(next);
18
+ if (Number.isFinite(port) && port > 0) {
19
+ options.port = port;
20
+ i += 1;
21
+ }
22
+ }
23
+ continue;
24
+ }
25
+ }
26
+ return options;
27
+ }
28
+ function printHelp() {
29
+ console.log(`
30
+ q-ai-note
31
+
32
+ Usage:
33
+ q-ai-note [--port <port>]
34
+
35
+ Options:
36
+ -p, --port Set server port (default: 3000 or PORT env)
37
+ -h, --help Show this help message
38
+
39
+ Examples:
40
+ npx q-ai-note
41
+ q-ai-note --port 3200
42
+ PORT=3200 q-ai-note
43
+ `);
44
+ }
45
+ function bootstrap() {
46
+ const options = parseArgs(process.argv.slice(2));
47
+ if (options.help) {
48
+ printHelp();
49
+ return;
50
+ }
51
+ startServer(options.port);
52
+ console.log(`q-ai-note is ready at http://localhost:${options.port}`);
53
+ }
54
+ bootstrap();
55
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAOhD,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,OAAO,GAAe;QAC1B,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;QACtC,IAAI,EAAE,KAAK;KACZ,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;YACpB,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC1B,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;oBACtC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;oBACpB,CAAC,IAAI,CAAC,CAAC;gBACT,CAAC;YACH,CAAC;YACD,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;CAcb,CAAC,CAAC;AACH,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,SAAS,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,0CAA0C,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,EAAE,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface AiMessage {
2
+ role: 'system' | 'user' | 'assistant';
3
+ content: string;
4
+ }
5
+ interface CallAiOptions {
6
+ convertSystemToUserForMiniMax?: boolean;
7
+ }
8
+ export declare function callAiMessages(messages: AiMessage[], options?: CallAiOptions): Promise<string>;
9
+ export declare function callAiText(prompt: string): Promise<string>;
10
+ export {};
11
+ //# sourceMappingURL=aiClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aiClient.d.ts","sourceRoot":"","sources":["../../src/server/aiClient.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,aAAa;IACrB,6BAA6B,CAAC,EAAE,OAAO,CAAC;CACzC;AAsBD,wBAAsB,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgFxG;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEhE"}
@@ -0,0 +1,83 @@
1
+ import { getAllSettings } from './config.js';
2
+ function getAiSettings() {
3
+ const settings = getAllSettings();
4
+ const normalizedKey = String(settings.api_key || '').trim().replace(/^Bearer\s+/i, '');
5
+ return {
6
+ api_url: settings.api_url || 'https://api.minimax.com/v1',
7
+ api_key: normalizedKey,
8
+ model: settings.model || 'M2-her',
9
+ group_id: settings.group_id,
10
+ proxy: settings.proxy,
11
+ };
12
+ }
13
+ export async function callAiMessages(messages, options = {}) {
14
+ const settings = getAiSettings();
15
+ if (!settings.api_key) {
16
+ return 'AI configuration not found. Please set API key in settings.';
17
+ }
18
+ const isMiniMax = settings.api_url.includes('minimax');
19
+ let endpoint = `${settings.api_url}/chat/completions`;
20
+ const processedMessages = options.convertSystemToUserForMiniMax && isMiniMax
21
+ ? messages.map((message) => {
22
+ if (message.role === 'system') {
23
+ return {
24
+ role: 'user',
25
+ content: `你是AI助手。以下是系统提示:\n\n${message.content}`,
26
+ };
27
+ }
28
+ return message;
29
+ })
30
+ : messages;
31
+ let requestBody = {
32
+ model: settings.model,
33
+ messages: processedMessages,
34
+ };
35
+ if (isMiniMax) {
36
+ endpoint = `${settings.api_url}/text/chatcompletion_v2`;
37
+ if (settings.group_id) {
38
+ requestBody = {
39
+ ...requestBody,
40
+ group_id: settings.group_id,
41
+ };
42
+ }
43
+ }
44
+ try {
45
+ const fetchOptions = {
46
+ method: 'POST',
47
+ headers: {
48
+ 'Content-Type': 'application/json',
49
+ Authorization: `Bearer ${settings.api_key}`,
50
+ },
51
+ body: JSON.stringify(requestBody),
52
+ };
53
+ if (settings.proxy) {
54
+ fetchOptions.proxy = settings.proxy;
55
+ }
56
+ const response = await fetch(endpoint, fetchOptions);
57
+ if (!response.ok) {
58
+ const errorText = await response.text();
59
+ return `AI request failed: ${response.status} - ${errorText}`;
60
+ }
61
+ const data = await response.json();
62
+ if (isMiniMax) {
63
+ const mmResp = data;
64
+ if (mmResp.base_resp && mmResp.base_resp.status_code !== 0) {
65
+ return `AI error: ${mmResp.base_resp.status_msg || 'Unknown error'} (code: ${mmResp.base_resp.status_code})`;
66
+ }
67
+ return mmResp.choices?.[0]?.message?.content || 'No response from AI';
68
+ }
69
+ const openaiChoices = data;
70
+ return openaiChoices.choices?.[0]?.message?.content || 'No response from AI';
71
+ }
72
+ catch (error) {
73
+ const errMsg = String(error);
74
+ if (errMsg.includes('fetch failed') || errMsg.includes('ENOTFOUND') || errMsg.includes('ECONNREFUSED')) {
75
+ return `Network error: Cannot connect to ${settings.api_url}. Please check your network/proxy settings.`;
76
+ }
77
+ return `AI request error: ${errMsg}`;
78
+ }
79
+ }
80
+ export async function callAiText(prompt) {
81
+ return callAiMessages([{ role: 'user', content: prompt }]);
82
+ }
83
+ //# sourceMappingURL=aiClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aiClient.js","sourceRoot":"","sources":["../../src/server/aiClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ interface BatchToolAction {
2
+ action_type: string;
3
+ action_input: Record<string, unknown>;
4
+ }
5
+ export declare function extractBatchNamesFromContent(content: string): string[];
6
+ export declare function supplementBatchCreateActionsByContent(batchActions: BatchToolAction[], content: string): {
7
+ batch_actions: BatchToolAction[];
8
+ supplemented_names: string[];
9
+ };
10
+ export {};
11
+ //# sourceMappingURL=batchRecovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batchRecovery.d.ts","sourceRoot":"","sources":["../../../src/server/api/batchRecovery.ts"],"names":[],"mappings":"AAAA,UAAU,eAAe;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAaD,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CA2BtE;AAED,wBAAgB,qCAAqC,CACnD,YAAY,EAAE,eAAe,EAAE,EAC/B,OAAO,EAAE,MAAM,GACd;IAAE,aAAa,EAAE,eAAe,EAAE,CAAC;IAAC,kBAAkB,EAAE,MAAM,EAAE,CAAA;CAAE,CA6CpE"}
@@ -0,0 +1,68 @@
1
+ function unique(items) {
2
+ return Array.from(new Set(items));
3
+ }
4
+ function stripTrailingCountHint(text) {
5
+ return text
6
+ .replace(/[“”"'`]/g, '')
7
+ .replace(/(?:共|总共)?\s*(?:这)?\s*(?:\d+|[一二两三四五六七八九十]+)\s*个\s*$/u, '')
8
+ .trim();
9
+ }
10
+ export function extractBatchNamesFromContent(content) {
11
+ const trimmed = String(content || '').trim();
12
+ if (!trimmed) {
13
+ return [];
14
+ }
15
+ const marker = /(增加|新增|添加|创建|加上)([\s\S]+)$/u.exec(trimmed);
16
+ if (!marker) {
17
+ return [];
18
+ }
19
+ const rawTail = stripTrailingCountHint(marker[2]);
20
+ const candidate = rawTail
21
+ .replace(/[。!?.!?]+$/g, '')
22
+ .trim();
23
+ if (!candidate || !/[\/、,,]/.test(candidate)) {
24
+ return [];
25
+ }
26
+ return unique(candidate
27
+ .split(/[\/、,,]/)
28
+ .map((item) => stripTrailingCountHint(item))
29
+ .map((item) => item.replace(/^(?:和|及|与)/u, '').trim())
30
+ .filter((item) => item.length > 0 && item.length <= 50));
31
+ }
32
+ export function supplementBatchCreateActionsByContent(batchActions, content) {
33
+ if (!Array.isArray(batchActions) || batchActions.length === 0) {
34
+ return { batch_actions: batchActions, supplemented_names: [] };
35
+ }
36
+ if (!batchActions.every((item) => item.action_type === 'create_work_item')) {
37
+ return { batch_actions: batchActions, supplemented_names: [] };
38
+ }
39
+ const intendedNames = extractBatchNamesFromContent(content);
40
+ if (intendedNames.length === 0 || intendedNames.length <= batchActions.length) {
41
+ return { batch_actions: batchActions, supplemented_names: [] };
42
+ }
43
+ const firstInput = batchActions[0].action_input || {};
44
+ const sandboxId = String(firstInput.sandbox_id || '').trim();
45
+ const parentId = String(firstInput.parent_id || '').trim();
46
+ if (!sandboxId || !parentId) {
47
+ return { batch_actions: batchActions, supplemented_names: [] };
48
+ }
49
+ const existingNames = new Set(batchActions
50
+ .map((item) => String(item.action_input?.name || '').trim())
51
+ .filter(Boolean));
52
+ const missingNames = intendedNames.filter((name) => !existingNames.has(name));
53
+ if (missingNames.length === 0) {
54
+ return { batch_actions: batchActions, supplemented_names: [] };
55
+ }
56
+ const supplemented = missingNames.map((name) => ({
57
+ action_type: 'create_work_item',
58
+ action_input: {
59
+ ...firstInput,
60
+ name,
61
+ },
62
+ }));
63
+ return {
64
+ batch_actions: [...batchActions, ...supplemented],
65
+ supplemented_names: missingNames,
66
+ };
67
+ }
68
+ //# sourceMappingURL=batchRecovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batchRecovery.js","sourceRoot":"","sources":["../../../src/server/api/batchRecovery.ts"],"names":[],"mappings":"AAKA,SAAS,MAAM,CAAC,KAAe;IAC7B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY;IAC1C,OAAO,IAAI;SACR,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,sDAAsD,EAAE,EAAE,CAAC;SACnE,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,OAAe;IAC1D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAG,6BAA6B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,OAAO;SACtB,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;SAC1B,IAAI,EAAE,CAAC;IAEV,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,MAAM,CACX,SAAS;SACN,KAAK,CAAC,SAAS,CAAC;SAChB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;SAC3C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;SACrD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAC1D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qCAAqC,CACnD,YAA+B,EAC/B,OAAe;IAEf,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,kBAAkB,EAAE,EAAE,EAAE,CAAC;IACjE,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,KAAK,kBAAkB,CAAC,EAAE,CAAC;QAC3E,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,kBAAkB,EAAE,EAAE,EAAE,CAAC;IACjE,CAAC;IAED,MAAM,aAAa,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAC5D,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;QAC9E,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,kBAAkB,EAAE,EAAE,EAAE,CAAC;IACjE,CAAC;IAED,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC;IACtD,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7D,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAE3D,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,kBAAkB,EAAE,EAAE,EAAE,CAAC;IACjE,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,GAAG,CAC3B,YAAY;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;SAC3D,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC;IAEF,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9E,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,kBAAkB,EAAE,EAAE,EAAE,CAAC;IACjE,CAAC;IAED,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/C,WAAW,EAAE,kBAAkB;QAC/B,YAAY,EAAE;YACZ,GAAG,UAAU;YACb,IAAI;SACL;KACF,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,aAAa,EAAE,CAAC,GAAG,YAAY,EAAE,GAAG,YAAY,CAAC;QACjD,kBAAkB,EAAE,YAAY;KACjC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/server/api/chat.ts"],"names":[],"mappings":"AASA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAmhBxB,eAAe,MAAM,CAAC"}