@fengyunxuezhang/tiez 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.
Files changed (63) hide show
  1. package/README.md +77 -0
  2. package/bin/tiez.js +50 -0
  3. package/dist/api/auth-routes.d.ts +3 -0
  4. package/dist/api/auth-routes.d.ts.map +1 -0
  5. package/dist/api/auth-routes.js +29 -0
  6. package/dist/api/auth-routes.js.map +1 -0
  7. package/dist/api/billing-routes.d.ts +3 -0
  8. package/dist/api/billing-routes.d.ts.map +1 -0
  9. package/dist/api/billing-routes.js +20 -0
  10. package/dist/api/billing-routes.js.map +1 -0
  11. package/dist/api/chat.d.ts +3 -0
  12. package/dist/api/chat.d.ts.map +1 -0
  13. package/dist/api/chat.js +70 -0
  14. package/dist/api/chat.js.map +1 -0
  15. package/dist/api/models.d.ts +3 -0
  16. package/dist/api/models.d.ts.map +1 -0
  17. package/dist/api/models.js +11 -0
  18. package/dist/api/models.js.map +1 -0
  19. package/dist/api/server.d.ts +2 -0
  20. package/dist/api/server.d.ts.map +1 -0
  21. package/dist/api/server.js +88 -0
  22. package/dist/api/server.js.map +1 -0
  23. package/dist/cli/commands.d.ts +19 -0
  24. package/dist/cli/commands.d.ts.map +1 -0
  25. package/dist/cli/commands.js +66 -0
  26. package/dist/cli/commands.js.map +1 -0
  27. package/dist/cli/index.d.ts +3 -0
  28. package/dist/cli/index.d.ts.map +1 -0
  29. package/dist/cli/index.js +145 -0
  30. package/dist/cli/index.js.map +1 -0
  31. package/dist/config.d.ts +10 -0
  32. package/dist/config.d.ts.map +1 -0
  33. package/dist/config.js +24 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/db/index.d.ts +4 -0
  36. package/dist/db/index.d.ts.map +1 -0
  37. package/dist/db/index.js +80 -0
  38. package/dist/db/index.js.map +1 -0
  39. package/dist/index.d.ts +7 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +51 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/middleware/auth.d.ts +3 -0
  44. package/dist/middleware/auth.d.ts.map +1 -0
  45. package/dist/middleware/auth.js +32 -0
  46. package/dist/middleware/auth.js.map +1 -0
  47. package/dist/services/billing.d.ts +11 -0
  48. package/dist/services/billing.d.ts.map +1 -0
  49. package/dist/services/billing.js +45 -0
  50. package/dist/services/billing.js.map +1 -0
  51. package/dist/services/llm.d.ts +11 -0
  52. package/dist/services/llm.d.ts.map +1 -0
  53. package/dist/services/llm.js +29 -0
  54. package/dist/services/llm.js.map +1 -0
  55. package/dist/services/model-router.d.ts +7 -0
  56. package/dist/services/model-router.d.ts.map +1 -0
  57. package/dist/services/model-router.js +39 -0
  58. package/dist/services/model-router.js.map +1 -0
  59. package/dist/services/user.d.ts +44 -0
  60. package/dist/services/user.d.ts.map +1 -0
  61. package/dist/services/user.js +73 -0
  62. package/dist/services/user.js.map +1 -0
  63. package/package.json +42 -0
@@ -0,0 +1,145 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ const readline = __importStar(require("readline"));
41
+ const openai_1 = __importDefault(require("openai"));
42
+ const commands_1 = require("./commands");
43
+ const API_KEY = process.env.TIEZ_API_KEY || '';
44
+ const BASE_URL = process.env.TIEZ_BASE_URL || 'http://127.0.0.1:8000';
45
+ const BANNER = `
46
+ ╔══════════════════════════════════════════════════════╗
47
+ ║ 铁子 (Tiez) v0.1.0 — 嵌入式开发 AI 助手 ║
48
+ ║ 输入 /help 查看命令 ║
49
+ ╚══════════════════════════════════════════════════════╝
50
+ `;
51
+ function buildPrompt(state) {
52
+ const parts = ['铁子'];
53
+ if (state.chip)
54
+ parts.push(state.chip);
55
+ if (state.mode !== 'quick')
56
+ parts.push(state.mode);
57
+ return `[${parts.join('|')}]> `;
58
+ }
59
+ function buildSystemPrompt(state) {
60
+ const lines = ['你是一个嵌入式开发专家。'];
61
+ if (state.chip)
62
+ lines.push(`当前芯片型号: ${state.chip}`);
63
+ if (state.mode === 'deep')
64
+ lines.push('请提供详细的实现方案,包含完整代码、寄存器配置说明和注意事项。');
65
+ else if (state.mode === 'review')
66
+ lines.push('请从安全性、健壮性、性能角度审查代码,列出问题并给出改进建议。');
67
+ else
68
+ lines.push('先给出核心代码,再简要解释。');
69
+ return lines.join('\n');
70
+ }
71
+ async function chat(state, input) {
72
+ if (!API_KEY) {
73
+ console.log('\x1b[33m错误: 未设置 TIEZ_API_KEY 环境变量\x1b[0m');
74
+ return '';
75
+ }
76
+ const client = new openai_1.default({ apiKey: API_KEY, baseURL: `${BASE_URL}/v1` });
77
+ const messages = [{ role: 'system', content: buildSystemPrompt(state) }];
78
+ for (const f of state.loadedFiles) {
79
+ messages.push({ role: 'system', content: `用户加载了文件 ${f.path}:\n\`\`\`\n${f.content}\n\`\`\`` });
80
+ }
81
+ for (const m of state.messages)
82
+ messages.push(m);
83
+ messages.push({ role: 'user', content: input });
84
+ try {
85
+ const stream = await client.chat.completions.create({
86
+ model: 'tiez-default',
87
+ messages,
88
+ stream: true,
89
+ });
90
+ let full = '';
91
+ for await (const chunk of stream) {
92
+ const content = chunk.choices?.[0]?.delta?.content || '';
93
+ full += content;
94
+ process.stdout.write(content);
95
+ }
96
+ console.log();
97
+ return full;
98
+ }
99
+ catch (e) {
100
+ console.log(`\x1b[31m请求失败: ${e.message}\x1b[0m`);
101
+ return '';
102
+ }
103
+ }
104
+ async function main() {
105
+ console.log(BANNER);
106
+ if (!API_KEY) {
107
+ console.log('\x1b[33m⚠ 未设置 TIEZ_API_KEY 环境变量\x1b[0m');
108
+ console.log(' 设置: export TIEZ_API_KEY="sk-tiez-你的Key"\n');
109
+ }
110
+ const state = { chip: '', mode: 'quick', messages: [], loadedFiles: [], lastResponse: '' };
111
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout, prompt: '' });
112
+ const ask = () => {
113
+ const prompt = buildPrompt(state);
114
+ rl.question(prompt, async (input) => {
115
+ input = input.trim();
116
+ if (!input) {
117
+ ask();
118
+ return;
119
+ }
120
+ if (input.startsWith('/')) {
121
+ const result = (0, commands_1.handleCommand)(input, state);
122
+ console.log(result.message);
123
+ if (result.exit) {
124
+ rl.close();
125
+ return;
126
+ }
127
+ ask();
128
+ return;
129
+ }
130
+ console.log('\x1b[32m┌─ 你 ──────────────────────────────────────\x1b[0m');
131
+ console.log(input);
132
+ console.log('\x1b[33m┌─ 铁子 ────────────────────────────────────\x1b[0m');
133
+ state.lastResponse = await chat(state, input);
134
+ state.messages.push({ role: 'user', content: input });
135
+ state.messages.push({ role: 'assistant', content: state.lastResponse });
136
+ if (state.messages.length > 20)
137
+ state.messages = state.messages.slice(-20);
138
+ ask();
139
+ });
140
+ };
141
+ rl.on('close', () => { console.log('再见!'); process.exit(0); });
142
+ ask();
143
+ }
144
+ main();
145
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare const config: {
2
+ port: number;
3
+ deepseekApiKey: string;
4
+ deepseekBaseUrl: string;
5
+ deepseekModel: string;
6
+ deepseekModelPro: string;
7
+ dataDir: string;
8
+ };
9
+ export declare const DB_PATH: string;
10
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,MAAM;;;;;;;CASlB,CAAC;AAOF,eAAO,MAAM,OAAO,QAAuC,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,24 @@
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.DB_PATH = exports.config = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ exports.config = {
10
+ port: parseInt(process.env.TIEZ_PORT || '8000', 10),
11
+ deepseekApiKey: process.env.DEEPSEEK_API_KEY || '',
12
+ deepseekBaseUrl: process.env.DEEPSEEK_BASE_URL || 'https://api.deepseek.com/v1',
13
+ deepseekModel: 'deepseek-chat',
14
+ deepseekModelPro: 'deepseek-reasoner',
15
+ dataDir: process.env.TIEZ_ROOT
16
+ ? path_1.default.join(process.env.TIEZ_ROOT, 'data')
17
+ : path_1.default.join(__dirname, '..', 'data'),
18
+ };
19
+ // 确保数据目录存在
20
+ if (!fs_1.default.existsSync(exports.config.dataDir)) {
21
+ fs_1.default.mkdirSync(exports.config.dataDir, { recursive: true });
22
+ }
23
+ exports.DB_PATH = path_1.default.join(exports.config.dataDir, 'tiez.db');
24
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,4CAAoB;AAEP,QAAA,MAAM,GAAG;IACpB,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,EAAE,EAAE,CAAC;IACnD,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE;IAClD,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,6BAA6B;IAC/E,aAAa,EAAE,eAAe;IAC9B,gBAAgB,EAAE,mBAAmB;IACrC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS;QAC5B,CAAC,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC;QAC1C,CAAC,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC;CACvC,CAAC;AAEF,WAAW;AACX,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,cAAM,CAAC,OAAO,CAAC,EAAE,CAAC;IACnC,YAAE,CAAC,SAAS,CAAC,cAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACpD,CAAC;AAEY,QAAA,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,cAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import Database from 'better-sqlite3';
2
+ export declare function getDb(): Database.Database;
3
+ export declare function closeDb(): void;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAKtC,wBAAgB,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAQzC;AAyDD,wBAAgB,OAAO,SAKtB"}
@@ -0,0 +1,80 @@
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.getDb = getDb;
7
+ exports.closeDb = closeDb;
8
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
9
+ const config_1 = require("../config");
10
+ let _db = null;
11
+ function getDb() {
12
+ if (!_db) {
13
+ _db = new better_sqlite3_1.default(config_1.DB_PATH);
14
+ _db.pragma('journal_mode = WAL');
15
+ _db.pragma('foreign_keys = ON');
16
+ initSchema(_db);
17
+ }
18
+ return _db;
19
+ }
20
+ function initSchema(db) {
21
+ db.exec(`
22
+ CREATE TABLE IF NOT EXISTS users (
23
+ id TEXT PRIMARY KEY,
24
+ email TEXT UNIQUE NOT NULL,
25
+ password_hash TEXT NOT NULL,
26
+ display_name TEXT DEFAULT '',
27
+ role TEXT DEFAULT 'user',
28
+ plan TEXT DEFAULT 'free',
29
+ tokens_quota INTEGER DEFAULT 500000,
30
+ tokens_used INTEGER DEFAULT 0,
31
+ tokens_balance INTEGER DEFAULT 500000,
32
+ is_active INTEGER DEFAULT 1,
33
+ created_at TEXT DEFAULT (datetime('now')),
34
+ updated_at TEXT DEFAULT (datetime('now'))
35
+ );
36
+
37
+ CREATE TABLE IF NOT EXISTS api_keys (
38
+ id TEXT PRIMARY KEY,
39
+ user_id TEXT NOT NULL REFERENCES users(id),
40
+ key_hash TEXT NOT NULL,
41
+ key_prefix TEXT NOT NULL,
42
+ name TEXT DEFAULT '',
43
+ status TEXT DEFAULT 'active',
44
+ last_used_at TEXT,
45
+ created_at TEXT DEFAULT (datetime('now'))
46
+ );
47
+
48
+ CREATE TABLE IF NOT EXISTS billing_records (
49
+ id TEXT PRIMARY KEY,
50
+ user_id TEXT NOT NULL REFERENCES users(id),
51
+ api_key_id TEXT,
52
+ request_id TEXT UNIQUE NOT NULL,
53
+ model TEXT NOT NULL,
54
+ tokens_prompt INTEGER DEFAULT 0,
55
+ tokens_completion INTEGER DEFAULT 0,
56
+ tokens_total INTEGER DEFAULT 0,
57
+ cost_tiez REAL DEFAULT 0,
58
+ type TEXT DEFAULT 'deduct',
59
+ created_at TEXT DEFAULT (datetime('now'))
60
+ );
61
+
62
+ CREATE TABLE IF NOT EXISTS topup_records (
63
+ id TEXT PRIMARY KEY,
64
+ user_id TEXT NOT NULL REFERENCES users(id),
65
+ amount_rmb REAL NOT NULL,
66
+ tokens_granted INTEGER NOT NULL,
67
+ payment_method TEXT DEFAULT 'manual',
68
+ payment_status TEXT DEFAULT 'success',
69
+ notes TEXT DEFAULT '',
70
+ created_at TEXT DEFAULT (datetime('now'))
71
+ );
72
+ `);
73
+ }
74
+ function closeDb() {
75
+ if (_db) {
76
+ _db.close();
77
+ _db = null;
78
+ }
79
+ }
80
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":";;;;;AAKA,sBAQC;AAyDD,0BAKC;AA3ED,oEAAsC;AACtC,sCAAoC;AAEpC,IAAI,GAAG,GAA6B,IAAI,CAAC;AAEzC,SAAgB,KAAK;IACnB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,GAAG,IAAI,wBAAQ,CAAC,gBAAO,CAAC,CAAC;QAC5B,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACjC,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAChC,UAAU,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CAAC,EAAqB;IACvC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDP,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,OAAO;IACrB,IAAI,GAAG,EAAE,CAAC;QACR,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,GAAG,GAAG,IAAI,CAAC;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * 铁子 (Tiez) — 嵌入式开发 AI 助手
4
+ * API 服务入口
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG"}
package/dist/index.js ADDED
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * 铁子 (Tiez) — 嵌入式开发 AI 助手
5
+ * API 服务入口
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ const db_1 = require("./db");
9
+ const user_1 = require("./services/user");
10
+ const server_1 = require("./api/server");
11
+ const config_1 = require("./config");
12
+ function initDb() {
13
+ (0, db_1.getDb)();
14
+ console.log('数据库初始化完成');
15
+ }
16
+ function createAdmin(email, password) {
17
+ initDb();
18
+ const service = new user_1.UserService();
19
+ let user = service.getUserByEmail(email);
20
+ if (user) {
21
+ console.log(`用户已存在: ${email}`);
22
+ return;
23
+ }
24
+ user = service.createUser(email, password, 'premium', 'admin');
25
+ const { rawKey, apiKey } = service.createApiKey(user.id, 'default');
26
+ console.log(`管理员创建成功: ${email}`);
27
+ console.log(`API Key: ${rawKey}`);
28
+ }
29
+ function startServer() {
30
+ initDb();
31
+ const app = (0, server_1.createApp)();
32
+ app.listen(config_1.config.port, () => {
33
+ console.log(`\n 铁子 (Tiez) v0.1.0 服务已启动`);
34
+ console.log(` API: http://localhost:${config_1.config.port}/v1`);
35
+ console.log(` 管理后台: http://localhost:${config_1.config.port}/web/`);
36
+ console.log(` 健康检查: http://localhost:${config_1.config.port}/health\n`);
37
+ });
38
+ }
39
+ // CLI 模式判断
40
+ const args = process.argv.slice(2);
41
+ const cmd = args[0];
42
+ if (cmd === 'init') {
43
+ initDb();
44
+ }
45
+ else if (cmd === 'admin' && args[1] && args[2]) {
46
+ createAdmin(args[1], args[2]);
47
+ }
48
+ else {
49
+ startServer();
50
+ }
51
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AACA;;;GAGG;;AAEH,6BAA6B;AAC7B,0CAA8C;AAC9C,yCAAyC;AACzC,qCAAkC;AAElC,SAAS,MAAM;IACb,IAAA,UAAK,GAAE,CAAC;IACR,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,WAAW,CAAC,KAAa,EAAE,QAAgB;IAClD,MAAM,EAAE,CAAC;IACT,MAAM,OAAO,GAAG,IAAI,kBAAW,EAAE,CAAC;IAClC,IAAI,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IACD,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,WAAW;IAClB,MAAM,EAAE,CAAC;IACT,MAAM,GAAG,GAAG,IAAA,kBAAS,GAAE,CAAC;IACxB,GAAG,CAAC,MAAM,CAAC,eAAM,CAAC,IAAI,EAAE,GAAG,EAAE;QAC3B,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,gCAAgC,eAAM,CAAC,IAAI,KAAK,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,4BAA4B,eAAM,CAAC,IAAI,OAAO,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,4BAA4B,eAAM,CAAC,IAAI,WAAW,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,WAAW;AACX,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAEpB,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC;AACX,CAAC;KAAM,IAAI,GAAG,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACjD,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAChC,CAAC;KAAM,CAAC;IACN,WAAW,EAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ export declare function authMiddleware(req: Request, res: Response, next: NextFunction): void | Response<any, Record<string, any>>;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAM1D,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,6CA0B7E"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.authMiddleware = authMiddleware;
4
+ const user_1 = require("../services/user");
5
+ const userService = new user_1.UserService();
6
+ const PUBLIC_PATHS = ['/health', '/docs', '/openapi.json', '/v1/billing/plans'];
7
+ function authMiddleware(req, res, next) {
8
+ if (PUBLIC_PATHS.some(p => req.path.startsWith(p)))
9
+ return next();
10
+ // Get API Key: header first, then query param
11
+ let rawKey = '';
12
+ const auth = req.headers.authorization || '';
13
+ if (auth.startsWith('Bearer ')) {
14
+ rawKey = auth.slice(7);
15
+ }
16
+ else {
17
+ rawKey = req.query.api_key || '';
18
+ }
19
+ if (!rawKey) {
20
+ return res.status(401).json({ error: { message: 'Missing API Key', type: 'auth_error', code: 401 } });
21
+ }
22
+ const user = userService.authenticate(rawKey);
23
+ if (!user) {
24
+ return res.status(401).json({ error: { message: 'Invalid API Key', type: 'auth_error', code: 401 } });
25
+ }
26
+ if (!user.is_active) {
27
+ return res.status(403).json({ error: { message: 'Account disabled', type: 'auth_error', code: 403 } });
28
+ }
29
+ req.user = user;
30
+ next();
31
+ }
32
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":";;AAMA,wCA0BC;AA/BD,2CAA+C;AAE/C,MAAM,WAAW,GAAG,IAAI,kBAAW,EAAE,CAAC;AACtC,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,eAAe,EAAE,mBAAmB,CAAC,CAAC;AAEhF,SAAgB,cAAc,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IAC5E,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,EAAE,CAAC;IAElE,8CAA8C;IAC9C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;IAC7C,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,MAAM,GAAI,GAAG,CAAC,KAAK,CAAC,OAAkB,IAAI,EAAE,CAAC;IAC/C,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACxG,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACxG,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACzG,CAAC;IAEA,GAAW,CAAC,IAAI,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,CAAC;AACT,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { User } from './user';
2
+ export declare class BillingService {
3
+ preAuth(user: User, estimatedTokens: number): boolean;
4
+ settle(user: User, tokensTotal: number, model: string, requestId: string, apiKeyId?: string): void;
5
+ topup(user: User, amountRmb: number, tokensGranted: number, notes?: string): void;
6
+ getUsageStats(user: User): any;
7
+ static estimateTokens(messages: {
8
+ content?: string;
9
+ }[]): number;
10
+ }
11
+ //# sourceMappingURL=billing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing.d.ts","sourceRoot":"","sources":["../../src/services/billing.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE3C,qBAAa,cAAc;IACzB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO;IAIrD,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IASlG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,IAAI;IAO7E,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,GAAG;IAsB9B,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,MAAM;CAIhE"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BillingService = void 0;
4
+ const uuid_1 = require("uuid");
5
+ const db_1 = require("../db");
6
+ class BillingService {
7
+ preAuth(user, estimatedTokens) {
8
+ return user.tokens_balance >= estimatedTokens;
9
+ }
10
+ settle(user, tokensTotal, model, requestId, apiKeyId) {
11
+ const db = (0, db_1.getDb)();
12
+ db.prepare(`INSERT INTO billing_records (id, user_id, api_key_id, request_id, model, tokens_total, cost_tiez, type)
13
+ VALUES (?, ?, ?, ?, ?, ?, ?, 'deduct')`)
14
+ .run((0, uuid_1.v4)(), user.id, apiKeyId || null, requestId, model, tokensTotal, tokensTotal);
15
+ db.prepare('UPDATE users SET tokens_balance = MAX(0, tokens_balance - ?), tokens_used = tokens_used + ? WHERE id = ?')
16
+ .run(tokensTotal, tokensTotal, user.id);
17
+ }
18
+ topup(user, amountRmb, tokensGranted, notes = '') {
19
+ const db = (0, db_1.getDb)();
20
+ db.prepare(`INSERT INTO topup_records (id, user_id, amount_rmb, tokens_granted, notes)
21
+ VALUES (?, ?, ?, ?, ?)`).run((0, uuid_1.v4)(), user.id, amountRmb, tokensGranted, notes);
22
+ db.prepare('UPDATE users SET tokens_balance = tokens_balance + ? WHERE id = ?').run(tokensGranted, user.id);
23
+ }
24
+ getUsageStats(user) {
25
+ const db = (0, db_1.getDb)();
26
+ const row = db.prepare(`SELECT COALESCE(SUM(tokens_total), 0) as monthly_used FROM billing_records
27
+ WHERE user_id = ? AND type = 'deduct' AND created_at >= date('now', 'start of month')`).get(user.id);
28
+ const recent = db.prepare(`SELECT id, model, tokens_total as tokens, created_at as time FROM billing_records
29
+ WHERE user_id = ? ORDER BY created_at DESC LIMIT 20`).all(user.id);
30
+ return {
31
+ plan: user.plan,
32
+ monthly_quota: user.tokens_quota,
33
+ monthly_used: row.monthly_used,
34
+ monthly_remaining: Math.max(0, user.tokens_quota - row.monthly_used),
35
+ balance: user.tokens_balance,
36
+ recent_requests: recent,
37
+ };
38
+ }
39
+ static estimateTokens(messages) {
40
+ const totalChars = messages.reduce((sum, m) => sum + (m.content?.length || 0), 0);
41
+ return Math.ceil(totalChars * 2 * 1.2) + 2048;
42
+ }
43
+ }
44
+ exports.BillingService = BillingService;
45
+ //# sourceMappingURL=billing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/services/billing.ts"],"names":[],"mappings":";;;AAAA,+BAAoC;AACpC,8BAA8B;AAG9B,MAAa,cAAc;IACzB,OAAO,CAAC,IAAU,EAAE,eAAuB;QACzC,OAAO,IAAI,CAAC,cAAc,IAAI,eAAe,CAAC;IAChD,CAAC;IAED,MAAM,CAAC,IAAU,EAAE,WAAmB,EAAE,KAAa,EAAE,SAAiB,EAAE,QAAiB;QACzF,MAAM,EAAE,GAAG,IAAA,UAAK,GAAE,CAAC;QACnB,EAAE,CAAC,OAAO,CAAC;6CAC8B,CAAC;aACvC,GAAG,CAAC,IAAA,SAAM,GAAE,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,IAAI,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QACxF,EAAE,CAAC,OAAO,CAAC,0GAA0G,CAAC;aACnH,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,IAAU,EAAE,SAAiB,EAAE,aAAqB,EAAE,KAAK,GAAG,EAAE;QACpE,MAAM,EAAE,GAAG,IAAA,UAAK,GAAE,CAAC;QACnB,EAAE,CAAC,OAAO,CAAC;6BACc,CAAC,CAAC,GAAG,CAAC,IAAA,SAAM,GAAE,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;QACnF,EAAE,CAAC,OAAO,CAAC,mEAAmE,CAAC,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9G,CAAC;IAED,aAAa,CAAC,IAAU;QACtB,MAAM,EAAE,GAAG,IAAA,UAAK,GAAE,CAAC;QACnB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CACpB;6FACuF,CACxF,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAQ,CAAC;QAEtB,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB;2DACqD,CACtD,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,aAAa,EAAE,IAAI,CAAC,YAAY;YAChC,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,iBAAiB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;YACpE,OAAO,EAAE,IAAI,CAAC,cAAc;YAC5B,eAAe,EAAE,MAAM;SACxB,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,QAAgC;QACpD,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;IAChD,CAAC;CACF;AA/CD,wCA+CC"}
@@ -0,0 +1,11 @@
1
+ import OpenAI from 'openai';
2
+ export declare class LLMService {
3
+ private client;
4
+ constructor();
5
+ complete(messages: any[], model?: string, stream?: boolean, maxTokens?: number, temperature?: number): Promise<(import("openai/streaming").Stream<OpenAI.Chat.Completions.ChatCompletionChunk> & {
6
+ _request_id?: string | null;
7
+ }) | (OpenAI.Chat.Completions.ChatCompletion & {
8
+ _request_id?: string | null;
9
+ })>;
10
+ }
11
+ //# sourceMappingURL=llm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/services/llm.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAS;;IASjB,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,KAAK,SAAkB,EAAE,MAAM,UAAQ,EAAE,SAAS,SAAO,EAAE,WAAW,SAAM;;;;;CAU7G"}
@@ -0,0 +1,29 @@
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.LLMService = void 0;
7
+ const openai_1 = __importDefault(require("openai"));
8
+ const config_1 = require("../config");
9
+ class LLMService {
10
+ client;
11
+ constructor() {
12
+ this.client = new openai_1.default({
13
+ apiKey: config_1.config.deepseekApiKey || 'sk-placeholder',
14
+ baseURL: config_1.config.deepseekBaseUrl,
15
+ });
16
+ }
17
+ async complete(messages, model = 'deepseek-chat', stream = false, maxTokens = 4096, temperature = 0.3) {
18
+ if (stream) {
19
+ return this.client.chat.completions.create({
20
+ model, messages, stream: true, max_tokens: maxTokens, temperature,
21
+ });
22
+ }
23
+ return this.client.chat.completions.create({
24
+ model, messages, stream: false, max_tokens: maxTokens, temperature,
25
+ });
26
+ }
27
+ }
28
+ exports.LLMService = LLMService;
29
+ //# sourceMappingURL=llm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../../src/services/llm.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAC5B,sCAAmC;AAEnC,MAAa,UAAU;IACb,MAAM,CAAS;IAEvB;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAM,CAAC;YACvB,MAAM,EAAE,eAAM,CAAC,cAAc,IAAI,gBAAgB;YACjD,OAAO,EAAE,eAAM,CAAC,eAAe;SAChC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAe,EAAE,KAAK,GAAG,eAAe,EAAE,MAAM,GAAG,KAAK,EAAE,SAAS,GAAG,IAAI,EAAE,WAAW,GAAG,GAAG;QAC1G,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBACzC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW;aAClE,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACzC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW;SACnE,CAAC,CAAC;IACL,CAAC;CACF;AApBD,gCAoBC"}
@@ -0,0 +1,7 @@
1
+ export declare function resolveModel(requestedModel: string, plan: string): string;
2
+ export declare function getAvailableModels(plan: string): {
3
+ id: string;
4
+ object: string;
5
+ owned_by: string;
6
+ }[];
7
+ //# sourceMappingURL=model-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-router.d.ts","sourceRoot":"","sources":["../../src/services/model-router.ts"],"names":[],"mappings":"AAiBA,wBAAgB,YAAY,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAYzE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,CAMnG"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveModel = resolveModel;
4
+ exports.getAvailableModels = getAvailableModels;
5
+ const config_1 = require("../config");
6
+ const MODEL_MAP = {
7
+ 'tiez-default': config_1.config.deepseekModel,
8
+ 'tiez-pro': config_1.config.deepseekModelPro,
9
+ 'tiez-code': config_1.config.deepseekModel,
10
+ 'tiez-review': config_1.config.deepseekModelPro,
11
+ };
12
+ const PLAN_MODELS = {
13
+ free: ['tiez-default'],
14
+ trial: ['tiez-default', 'tiez-code'],
15
+ pro: ['tiez-default', 'tiez-pro', 'tiez-code'],
16
+ premium: ['tiez-default', 'tiez-pro', 'tiez-code', 'tiez-review'],
17
+ team: ['tiez-default', 'tiez-pro', 'tiez-code', 'tiez-review'],
18
+ };
19
+ function resolveModel(requestedModel, plan) {
20
+ if (requestedModel === config_1.config.deepseekModel || requestedModel === config_1.config.deepseekModelPro) {
21
+ return requestedModel;
22
+ }
23
+ if (requestedModel in MODEL_MAP) {
24
+ const available = PLAN_MODELS[plan] || ['tiez-default'];
25
+ if (available.includes(requestedModel)) {
26
+ return MODEL_MAP[requestedModel];
27
+ }
28
+ return MODEL_MAP['tiez-default'];
29
+ }
30
+ return MODEL_MAP['tiez-default'];
31
+ }
32
+ function getAvailableModels(plan) {
33
+ return (PLAN_MODELS[plan] || ['tiez-default']).map(id => ({
34
+ id,
35
+ object: 'model',
36
+ owned_by: 'tiez',
37
+ }));
38
+ }
39
+ //# sourceMappingURL=model-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-router.js","sourceRoot":"","sources":["../../src/services/model-router.ts"],"names":[],"mappings":";;AAiBA,oCAYC;AAED,gDAMC;AArCD,sCAAmC;AAEnC,MAAM,SAAS,GAA2B;IACxC,cAAc,EAAE,eAAM,CAAC,aAAa;IACpC,UAAU,EAAE,eAAM,CAAC,gBAAgB;IACnC,WAAW,EAAE,eAAM,CAAC,aAAa;IACjC,aAAa,EAAE,eAAM,CAAC,gBAAgB;CACvC,CAAC;AAEF,MAAM,WAAW,GAA6B;IAC5C,IAAI,EAAE,CAAC,cAAc,CAAC;IACtB,KAAK,EAAE,CAAC,cAAc,EAAE,WAAW,CAAC;IACpC,GAAG,EAAE,CAAC,cAAc,EAAE,UAAU,EAAE,WAAW,CAAC;IAC9C,OAAO,EAAE,CAAC,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,CAAC;IACjE,IAAI,EAAE,CAAC,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,CAAC;CAC/D,CAAC;AAEF,SAAgB,YAAY,CAAC,cAAsB,EAAE,IAAY;IAC/D,IAAI,cAAc,KAAK,eAAM,CAAC,aAAa,IAAI,cAAc,KAAK,eAAM,CAAC,gBAAgB,EAAE,CAAC;QAC1F,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,IAAI,cAAc,IAAI,SAAS,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACxD,IAAI,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACvC,OAAO,SAAS,CAAC,cAAc,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,SAAS,CAAC,cAAc,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,SAAS,CAAC,cAAc,CAAC,CAAC;AACnC,CAAC;AAED,SAAgB,kBAAkB,CAAC,IAAY;IAC7C,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACxD,EAAE;QACF,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,44 @@
1
+ export declare const PLAN_QUOTAS: Record<string, {
2
+ tokens: number;
3
+ rpm: number;
4
+ tpm: number;
5
+ price: number;
6
+ }>;
7
+ export interface User {
8
+ id: string;
9
+ email: string;
10
+ password_hash: string;
11
+ display_name: string;
12
+ role: string;
13
+ plan: string;
14
+ tokens_quota: number;
15
+ tokens_used: number;
16
+ tokens_balance: number;
17
+ is_active: number;
18
+ created_at: string;
19
+ updated_at: string;
20
+ }
21
+ export interface ApiKey {
22
+ id: string;
23
+ user_id: string;
24
+ key_hash: string;
25
+ key_prefix: string;
26
+ name: string;
27
+ status: string;
28
+ last_used_at: string | null;
29
+ created_at: string;
30
+ }
31
+ export declare class UserService {
32
+ createUser(email: string, password: string, plan?: string, role?: string): User;
33
+ getUserByEmail(email: string): User | undefined;
34
+ getUserById(id: string): User | undefined;
35
+ verifyPassword(user: User, password: string): boolean;
36
+ createApiKey(userId: string, name?: string): {
37
+ rawKey: string;
38
+ apiKey: ApiKey;
39
+ };
40
+ getApiKeys(userId: string): ApiKey[];
41
+ revokeApiKey(keyId: string, userId: string): boolean;
42
+ authenticate(rawKey: string): User | undefined;
43
+ }
44
+ //# sourceMappingURL=user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/services/user.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAMnG,CAAC;AAEF,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB;AAOD,qBAAa,WAAW;IACtB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,SAAS,EAAE,IAAI,SAAS,GAAG,IAAI;IAS/E,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAI/C,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAIzC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIrD,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,SAAK,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAoB3E,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAIpC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAKpD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;CAO/C"}