@redonvn/cli 0.1.10 → 0.1.11

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 (52) hide show
  1. package/dist/api/agent.d.ts +7 -0
  2. package/dist/api/agent.js +18 -0
  3. package/dist/api/agent.js.map +1 -0
  4. package/dist/api/auth.d.ts +5 -0
  5. package/dist/api/auth.js +14 -0
  6. package/dist/api/auth.js.map +1 -0
  7. package/dist/api/chat.d.ts +22 -0
  8. package/dist/api/chat.js +231 -0
  9. package/dist/api/chat.js.map +1 -0
  10. package/dist/auth/store.d.ts +7 -0
  11. package/dist/auth/store.js +17 -0
  12. package/dist/auth/store.js.map +1 -1
  13. package/dist/build-info.d.ts +2 -2
  14. package/dist/build-info.js +3 -3
  15. package/dist/build-info.js.map +1 -1
  16. package/dist/cli/commands/ask.js +1066 -324
  17. package/dist/cli/commands/ask.js.map +1 -1
  18. package/dist/cli/commands/login.d.ts +0 -1
  19. package/dist/cli/commands/login.js +7 -18
  20. package/dist/cli/commands/login.js.map +1 -1
  21. package/dist/cli/commands/logs.d.ts +4 -0
  22. package/dist/cli/commands/logs.js +66 -0
  23. package/dist/cli/commands/logs.js.map +1 -0
  24. package/dist/cli/commands/mcp.d.ts +3 -16
  25. package/dist/cli/commands/mcp.js +191 -74
  26. package/dist/cli/commands/mcp.js.map +1 -1
  27. package/dist/cli/commands/start.d.ts +7 -1
  28. package/dist/cli/commands/start.js +61 -2
  29. package/dist/cli/commands/start.js.map +1 -1
  30. package/dist/cli/commands/status.js +3 -5
  31. package/dist/cli/commands/status.js.map +1 -1
  32. package/dist/cli/commands/stop.d.ts +1 -0
  33. package/dist/cli/commands/stop.js +53 -0
  34. package/dist/cli/commands/stop.js.map +1 -0
  35. package/dist/cli/index.js +42 -3
  36. package/dist/cli/index.js.map +1 -1
  37. package/dist/cli-router/detect.d.ts +2 -1
  38. package/dist/cli-router/detect.js +10 -3
  39. package/dist/cli-router/detect.js.map +1 -1
  40. package/dist/config.d.ts +1 -1
  41. package/dist/daemon/tunnel.js +4 -3
  42. package/dist/daemon/tunnel.js.map +1 -1
  43. package/dist/mcp/chrome-launcher.d.ts +14 -0
  44. package/dist/mcp/chrome-launcher.js +114 -0
  45. package/dist/mcp/chrome-launcher.js.map +1 -0
  46. package/dist/mcp/client.d.ts +1 -0
  47. package/dist/mcp/client.js +9 -2
  48. package/dist/mcp/client.js.map +1 -1
  49. package/dist/mcp/config.d.ts +17 -9
  50. package/dist/mcp/config.js +134 -23
  51. package/dist/mcp/config.js.map +1 -1
  52. package/package.json +4 -2
@@ -0,0 +1,7 @@
1
+ import type { AgentItemDto, PaginatedResult } from '@redonvn/redai-cli-sdk';
2
+ import type { RedaiCliConfig } from '../auth/store';
3
+ export type { AgentItemDto as AgentItem };
4
+ type AgentCfg = Pick<RedaiCliConfig, 'apiBaseUrl' | 'apiKey' | 'workspaceId'>;
5
+ export declare function fetchAgentsPage(cfg: AgentCfg, page: number, limit?: number): Promise<PaginatedResult<AgentItemDto>>;
6
+ /** Compat: load first page only */
7
+ export declare function listAgents(cfg: AgentCfg, limit?: number): Promise<AgentItemDto[]>;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchAgentsPage = fetchAgentsPage;
4
+ exports.listAgents = listAgents;
5
+ const redai_cli_sdk_1 = require("@redonvn/redai-cli-sdk");
6
+ function makeSdk(cfg) {
7
+ return (0, redai_cli_sdk_1.createRedaiSdk)({ baseURL: cfg.apiBaseUrl, apiKey: cfg.apiKey, workspaceId: cfg.workspaceId ?? undefined });
8
+ }
9
+ async function fetchAgentsPage(cfg, page, limit = 20) {
10
+ const result = await makeSdk(cfg).agents.list({ page, limit, active: true });
11
+ return result ?? { items: [], meta: { totalItems: 0, itemCount: 0, itemsPerPage: limit, totalPages: 0, currentPage: page } };
12
+ }
13
+ /** Compat: load first page only */
14
+ async function listAgents(cfg, limit = 50) {
15
+ const result = await makeSdk(cfg).agents.list({ limit, active: true });
16
+ return result?.items ?? [];
17
+ }
18
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/api/agent.ts"],"names":[],"mappings":";;AAYA,0CAOC;AAGD,gCAGC;AAzBD,0DAAwD;AAQxD,SAAS,OAAO,CAAC,GAAa;IAC5B,OAAO,IAAA,8BAAc,EAAC,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,SAAS,EAAE,CAAC,CAAC;AACpH,CAAC;AAEM,KAAK,UAAU,eAAe,CACnC,GAAa,EACb,IAAY,EACZ,KAAK,GAAG,EAAE;IAEV,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7E,OAAO,MAAM,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC;AAC/H,CAAC;AAED,mCAAmC;AAC5B,KAAK,UAAU,UAAU,CAAC,GAAa,EAAE,KAAK,GAAG,EAAE;IACxD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,OAAO,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { CliVerifyRequestDto, CliVerifyResponseDto, CliMeResponseDto } from '@redonvn/redai-cli-sdk';
2
+ import type { RedaiCliConfig } from '../auth/store';
3
+ export type { CliVerifyRequestDto, CliVerifyResponseDto };
4
+ export declare function verifyApiKey(apiBaseUrl: string, apiKey: string, payload: CliVerifyRequestDto): Promise<CliVerifyResponseDto>;
5
+ export declare function checkMe(cfg: Pick<RedaiCliConfig, 'apiBaseUrl' | 'cliToken'>): Promise<CliMeResponseDto>;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.verifyApiKey = verifyApiKey;
4
+ exports.checkMe = checkMe;
5
+ const redai_cli_sdk_1 = require("@redonvn/redai-cli-sdk");
6
+ async function verifyApiKey(apiBaseUrl, apiKey, payload) {
7
+ const sdk = (0, redai_cli_sdk_1.createRedaiSdk)({ baseURL: apiBaseUrl, apiKey });
8
+ return sdk.auth.verify(payload);
9
+ }
10
+ async function checkMe(cfg) {
11
+ const sdk = (0, redai_cli_sdk_1.createRedaiSdk)({ baseURL: cfg.apiBaseUrl, cliToken: cfg.cliToken });
12
+ return sdk.auth.me('');
13
+ }
14
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/api/auth.ts"],"names":[],"mappings":";;AAMA,oCAOC;AAED,0BAKC;AApBD,0DAAwD;AAMjD,KAAK,UAAU,YAAY,CAChC,UAAkB,EAClB,MAAc,EACd,OAA4B;IAE5B,MAAM,GAAG,GAAG,IAAA,8BAAc,EAAC,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAEM,KAAK,UAAU,OAAO,CAC3B,GAAoD;IAEpD,MAAM,GAAG,GAAG,IAAA,8BAAc,EAAC,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChF,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { ThreadResponseDto } from '@redonvn/redai-cli-sdk';
2
+ import type { PaginatedResult } from '@redonvn/redai-cli-sdk';
3
+ import type { RedaiCliConfig } from '../auth/store';
4
+ export type { ThreadResponseDto };
5
+ type ChatCfg = Pick<RedaiCliConfig, 'apiBaseUrl' | 'apiKey' | 'workspaceId'>;
6
+ export interface SendMessageResult {
7
+ runId: string;
8
+ agentName?: string;
9
+ status?: string;
10
+ }
11
+ export interface StreamCallbacks {
12
+ onDelta: (text: string) => void;
13
+ onToolCall?: (toolName: string, toolArgs: Record<string, unknown>) => void;
14
+ onToolResult?: (toolName: string, result: unknown) => void;
15
+ onToolInterrupt?: (toolName: string, toolArgs: Record<string, unknown>) => void;
16
+ onDone?: (totalCost?: number) => void;
17
+ onError?: (message: string) => void;
18
+ }
19
+ export declare function fetchThreadsPage(cfg: ChatCfg, page: number, limit?: number): Promise<PaginatedResult<ThreadResponseDto>>;
20
+ export declare function createThread(cfg: ChatCfg, title: string): Promise<string>;
21
+ export declare function sendMessage(cfg: ChatCfg, threadId: string, prompt: string, agentId?: string | null): Promise<SendMessageResult>;
22
+ export declare function streamResponse(cfg: ChatCfg, threadId: string, runId: string, callbacks: StreamCallbacks | ((text: string) => void)): Promise<void>;
@@ -0,0 +1,231 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.fetchThreadsPage = fetchThreadsPage;
40
+ exports.createThread = createThread;
41
+ exports.sendMessage = sendMessage;
42
+ exports.streamResponse = streamResponse;
43
+ const axios_1 = __importDefault(require("axios"));
44
+ const redai_cli_sdk_1 = require("@redonvn/redai-cli-sdk");
45
+ function handleAxiosError(err) {
46
+ if (axios_1.default.isAxiosError(err)) {
47
+ const status = err.response?.status;
48
+ const msg = err.response?.data?.message ?? err.message;
49
+ if (status === 401)
50
+ throw new Error(`401 Unauthorized — ${msg}. Run \`redai login\` to refresh.`);
51
+ if (status === 403)
52
+ throw new Error(`403 Forbidden — ${msg}`);
53
+ throw new Error(`${status ?? 'Network error'} — ${msg}`);
54
+ }
55
+ throw err;
56
+ }
57
+ function makeSdk(cfg) {
58
+ return (0, redai_cli_sdk_1.createRedaiSdk)({
59
+ baseURL: cfg.apiBaseUrl,
60
+ apiKey: cfg.apiKey,
61
+ workspaceId: cfg.workspaceId ?? undefined,
62
+ });
63
+ }
64
+ function makeHttpClient(cfg) {
65
+ return new redai_cli_sdk_1.RedaiHttpClient({
66
+ baseURL: cfg.apiBaseUrl,
67
+ apiKey: cfg.apiKey,
68
+ workspaceId: cfg.workspaceId ?? undefined,
69
+ });
70
+ }
71
+ async function fetchThreadsPage(cfg, page, limit = 20) {
72
+ try {
73
+ const result = await makeSdk(cfg).chat.listThreads({ page, limit, sortBy: 'updatedAt' });
74
+ return result ?? { items: [], meta: { totalItems: 0, itemCount: 0, itemsPerPage: limit, totalPages: 0, currentPage: page } };
75
+ }
76
+ catch (err) {
77
+ handleAxiosError(err);
78
+ }
79
+ }
80
+ async function createThread(cfg, title) {
81
+ try {
82
+ const thread = await makeSdk(cfg).chat.createThread({ title });
83
+ if (!thread?.id)
84
+ throw new Error(`Server returned no thread ID — response: ${JSON.stringify(thread)}`);
85
+ return thread.id;
86
+ }
87
+ catch (err) {
88
+ handleAxiosError(err);
89
+ }
90
+ }
91
+ async function sendMessage(cfg, threadId, prompt, agentId) {
92
+ try {
93
+ const result = await makeSdk(cfg).chat.sendMessage(threadId, {
94
+ contentBlocks: { type: redai_cli_sdk_1.ContentBlockType.TEXT, text: prompt },
95
+ agentMode: redai_cli_sdk_1.ChatAgentMode.FAST,
96
+ agentId: agentId ?? null,
97
+ });
98
+ if (!result?.runId)
99
+ throw new Error('No runId returned from server');
100
+ return { runId: result.runId, agentName: result.agentName, status: result.status };
101
+ }
102
+ catch (err) {
103
+ handleAxiosError(err);
104
+ }
105
+ }
106
+ // Dispatch a single parsed SSE event to callbacks
107
+ function dispatchEvent(raw, cbs) {
108
+ const evt = raw;
109
+ switch (evt['type']) {
110
+ case 'text_message_content': {
111
+ const delta = evt['delta'];
112
+ if (typeof delta === 'string' && delta)
113
+ cbs.onDelta(delta);
114
+ return false;
115
+ }
116
+ case 'tool_call_start': {
117
+ const toolName = typeof evt['toolName'] === 'string' ? evt['toolName'] : '?';
118
+ const toolArgs = evt['toolArgs'] ?? {};
119
+ cbs.onToolCall?.(toolName, toolArgs);
120
+ return false;
121
+ }
122
+ case 'tool_call_end': {
123
+ const toolName = typeof evt['toolName'] === 'string' ? evt['toolName'] : '?';
124
+ cbs.onToolResult?.(toolName, evt['toolResult']);
125
+ return false;
126
+ }
127
+ case 'tool_call_interrupt': {
128
+ const toolName = typeof evt['toolName'] === 'string' ? evt['toolName'] : '?';
129
+ const toolArgs = evt['toolArgs'] ?? {};
130
+ cbs.onToolInterrupt?.(toolName, toolArgs);
131
+ return false;
132
+ }
133
+ case 'run_complete': {
134
+ const cost = typeof evt['totalCost'] === 'number' ? evt['totalCost'] : undefined;
135
+ cbs.onDone?.(cost);
136
+ return true;
137
+ }
138
+ case 'run_cancelled':
139
+ cbs.onDone?.();
140
+ return true;
141
+ case 'run_error': {
142
+ const err = evt['error'];
143
+ const msg = (typeof err?.['userMessage'] === 'string' ? err['userMessage'] : undefined)
144
+ ?? (typeof err?.['message'] === 'string' ? err['message'] : undefined)
145
+ ?? 'Unknown error';
146
+ cbs.onError?.(msg);
147
+ return true;
148
+ }
149
+ default:
150
+ return false;
151
+ }
152
+ }
153
+ async function streamResponse(cfg, threadId, runId, callbacks) {
154
+ // Accept old-style (onDelta only) or new-style callbacks
155
+ const cbs = typeof callbacks === 'function' ? { onDelta: callbacks } : callbacks;
156
+ const httpClient = makeHttpClient(cfg);
157
+ const headers = httpClient.apiKeyHeaders();
158
+ const url = `${cfg.apiBaseUrl}${redai_cli_sdk_1.CliApiPath.CHAT_THREAD_STREAM(threadId, runId)}`;
159
+ const { fetch: undiciFetch } = await Promise.resolve().then(() => __importStar(require('undici')));
160
+ const res = await undiciFetch(url, {
161
+ headers: { ...headers, Accept: 'text/event-stream' },
162
+ });
163
+ if (!res.body)
164
+ return;
165
+ const reader = res.body.getReader();
166
+ const decoder = new TextDecoder();
167
+ // SSE parser state: accumulate lines until blank line (end of one event block)
168
+ let buf = '';
169
+ let eventType = '';
170
+ let dataLine = '';
171
+ const processBlock = () => {
172
+ if (!dataLine)
173
+ return false;
174
+ try {
175
+ const evt = JSON.parse(dataLine);
176
+ // Prefer event type from the `event:` SSE field if payload.type missing
177
+ if (!evt['type'] && eventType)
178
+ evt['type'] = eventType;
179
+ return dispatchEvent(evt, cbs);
180
+ }
181
+ catch {
182
+ return false;
183
+ }
184
+ finally {
185
+ eventType = '';
186
+ dataLine = '';
187
+ }
188
+ };
189
+ // Yield to event loop so terminal can render each chunk before the next one arrives
190
+ const yieldToEventLoop = () => new Promise(resolve => setImmediate(resolve));
191
+ try {
192
+ while (true) {
193
+ const { done, value } = await reader.read();
194
+ if (done)
195
+ break;
196
+ buf += decoder.decode(value, { stream: true });
197
+ // Process complete lines
198
+ let nlIdx;
199
+ while ((nlIdx = buf.indexOf('\n')) !== -1) {
200
+ const line = buf.slice(0, nlIdx).replace(/\r$/, '');
201
+ buf = buf.slice(nlIdx + 1);
202
+ if (line === '') {
203
+ // Blank line = end of SSE event block
204
+ const isDone = processBlock();
205
+ // Yield after each event so the terminal renders it before processing the next one
206
+ await yieldToEventLoop();
207
+ if (isDone) {
208
+ reader.releaseLock();
209
+ return;
210
+ }
211
+ }
212
+ else if (line.startsWith('event: ')) {
213
+ eventType = line.slice(7).trim();
214
+ }
215
+ else if (line.startsWith('data: ')) {
216
+ dataLine = line.slice(6).trim();
217
+ }
218
+ // ignore id: and retry: lines
219
+ }
220
+ }
221
+ // Flush any remaining block (stream ended without final blank line)
222
+ processBlock();
223
+ }
224
+ finally {
225
+ try {
226
+ reader.releaseLock();
227
+ }
228
+ catch { /* already released */ }
229
+ }
230
+ }
231
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/api/chat.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,14 @@
1
1
  import { RedaiEnv } from '../config';
2
+ export interface RedaiSession {
3
+ /** threadId của conversation gần nhất, keyed bởi apiBaseUrl */
4
+ threads: Record<string, string>;
5
+ }
6
+ export declare function loadSession(): RedaiSession;
7
+ export declare function saveSession(session: RedaiSession): void;
2
8
  export interface RedaiCliConfig {
3
9
  /** Môi trường lúc login: 'dev' hoặc 'prod'. */
4
10
  env: RedaiEnv;
11
+ apiKey: string;
5
12
  cliToken: string;
6
13
  clientId: string;
7
14
  wsUrl: string;
@@ -3,11 +3,28 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.loadSession = loadSession;
7
+ exports.saveSession = saveSession;
6
8
  exports.loadConfig = loadConfig;
7
9
  exports.saveConfig = saveConfig;
8
10
  exports.clearConfig = clearConfig;
9
11
  const fs_1 = __importDefault(require("fs"));
12
+ const path_1 = __importDefault(require("path"));
10
13
  const config_1 = require("../config");
14
+ const REDAI_SESSION_FILE = path_1.default.join(config_1.REDAI_CONFIG_DIR, 'session.json');
15
+ function loadSession() {
16
+ try {
17
+ const raw = fs_1.default.readFileSync(REDAI_SESSION_FILE, 'utf8');
18
+ return JSON.parse(raw);
19
+ }
20
+ catch {
21
+ return { threads: {} };
22
+ }
23
+ }
24
+ function saveSession(session) {
25
+ ensureDir();
26
+ fs_1.default.writeFileSync(REDAI_SESSION_FILE, JSON.stringify(session, null, 2), { encoding: 'utf8', mode: 0o600 });
27
+ }
11
28
  function ensureDir() {
12
29
  if (!fs_1.default.existsSync(config_1.REDAI_CONFIG_DIR)) {
13
30
  fs_1.default.mkdirSync(config_1.REDAI_CONFIG_DIR, { recursive: true, mode: 0o700 });
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/auth/store.ts"],"names":[],"mappings":";;;;;AAuBA,gCAQC;AAED,gCAMC;AAED,kCAIC;AA7CD,4CAAoB;AACpB,sCAA0E;AAgB1E,SAAS,SAAS;IAChB,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,yBAAgB,CAAC,EAAE,CAAC;QACrC,YAAE,CAAC,SAAS,CAAC,yBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,SAAgB,UAAU;IACxB,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,0BAAiB,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAE,CAAC,YAAY,CAAC,0BAAiB,EAAE,MAAM,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,UAAU,CAAC,GAAmB;IAC5C,SAAS,EAAE,CAAC;IACZ,YAAE,CAAC,aAAa,CAAC,0BAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QAChE,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,WAAW;IACzB,IAAI,YAAE,CAAC,UAAU,CAAC,0BAAiB,CAAC,EAAE,CAAC;QACrC,YAAE,CAAC,UAAU,CAAC,0BAAiB,CAAC,CAAC;IACnC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/auth/store.ts"],"names":[],"mappings":";;;;;AAWA,kCAOC;AAED,kCAGC;AAuBD,gCAQC;AAED,gCAMC;AAED,kCAIC;AApED,4CAAoB;AACpB,gDAAwB;AACxB,sCAA0E;AAE1E,MAAM,kBAAkB,GAAG,cAAI,CAAC,IAAI,CAAC,yBAAgB,EAAE,cAAc,CAAC,CAAC;AAOvE,SAAgB,WAAW;IACzB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAE,CAAC,YAAY,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAED,SAAgB,WAAW,CAAC,OAAqB;IAC/C,SAAS,EAAE,CAAC;IACZ,YAAE,CAAC,aAAa,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5G,CAAC;AAiBD,SAAS,SAAS;IAChB,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,yBAAgB,CAAC,EAAE,CAAC;QACrC,YAAE,CAAC,SAAS,CAAC,yBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,SAAgB,UAAU;IACxB,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,0BAAiB,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAE,CAAC,YAAY,CAAC,0BAAiB,EAAE,MAAM,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,UAAU,CAAC,GAAmB;IAC5C,SAAS,EAAE,CAAC;IACZ,YAAE,CAAC,aAAa,CAAC,0BAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QAChE,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,WAAW;IACzB,IAAI,YAAE,CAAC,UAAU,CAAC,0BAAiB,CAAC,EAAE,CAAC;QACrC,YAAE,CAAC,UAAU,CAAC,0BAAiB,CAAC,CAAC;IACnC,CAAC;AACH,CAAC"}
@@ -1,6 +1,6 @@
1
1
  /** Env baked at build time. Runtime flag `--env` / `REDAI_ENV` vẫn override được. */
2
2
  export declare const BUILD_ENV: 'dev' | 'prod';
3
3
  /** Package version đọc từ package.json lúc build. Đồng bộ với npm version. */
4
- export declare const PKG_VERSION = "0.1.10";
4
+ export declare const PKG_VERSION = "0.1.11";
5
5
  /** ISO timestamp lúc build (informational). */
6
- export declare const BUILD_TIME = "2026-05-18T10:33:48.764Z";
6
+ export declare const BUILD_TIME = "2026-05-18T16:03:03.223Z";
@@ -4,9 +4,9 @@
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.BUILD_TIME = exports.PKG_VERSION = exports.BUILD_ENV = void 0;
6
6
  /** Env baked at build time. Runtime flag `--env` / `REDAI_ENV` vẫn override được. */
7
- exports.BUILD_ENV = 'dev';
7
+ exports.BUILD_ENV = 'prod';
8
8
  /** Package version đọc từ package.json lúc build. Đồng bộ với npm version. */
9
- exports.PKG_VERSION = '0.1.10';
9
+ exports.PKG_VERSION = '0.1.11';
10
10
  /** ISO timestamp lúc build (informational). */
11
- exports.BUILD_TIME = '2026-05-18T10:33:48.764Z';
11
+ exports.BUILD_TIME = '2026-05-18T16:03:03.223Z';
12
12
  //# sourceMappingURL=build-info.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"build-info.js","sourceRoot":"","sources":["../src/build-info.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sFAAsF;;;AAEtF,qFAAqF;AACxE,QAAA,SAAS,GAAmB,KAAK,CAAC;AAE/C,8EAA8E;AACjE,QAAA,WAAW,GAAG,QAAQ,CAAC;AAEpC,+CAA+C;AAClC,QAAA,UAAU,GAAG,0BAA0B,CAAC"}
1
+ {"version":3,"file":"build-info.js","sourceRoot":"","sources":["../src/build-info.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sFAAsF;;;AAEtF,qFAAqF;AACxE,QAAA,SAAS,GAAmB,MAAM,CAAC;AAEhD,8EAA8E;AACjE,QAAA,WAAW,GAAG,QAAQ,CAAC;AAEpC,+CAA+C;AAClC,QAAA,UAAU,GAAG,0BAA0B,CAAC"}