@very_aq/codex-cli-web 0.0.1
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.
- package/LICENSE +21 -0
- package/README.md +228 -0
- package/README.zh-CN.md +228 -0
- package/package.json +38 -0
- package/server/dist/admin/userAdminRoutes.d.ts +7 -0
- package/server/dist/admin/userAdminRoutes.js +91 -0
- package/server/dist/admin/userAdminRoutes.js.map +1 -0
- package/server/dist/app.d.ts +22 -0
- package/server/dist/app.js +993 -0
- package/server/dist/app.js.map +1 -0
- package/server/dist/auth/adminInit.d.ts +41 -0
- package/server/dist/auth/adminInit.js +126 -0
- package/server/dist/auth/adminInit.js.map +1 -0
- package/server/dist/auth/bootstrapAdmin.d.ts +6 -0
- package/server/dist/auth/bootstrapAdmin.js +11 -0
- package/server/dist/auth/bootstrapAdmin.js.map +1 -0
- package/server/dist/auth/httpAuth.d.ts +16 -0
- package/server/dist/auth/httpAuth.js +31 -0
- package/server/dist/auth/httpAuth.js.map +1 -0
- package/server/dist/auth/password.d.ts +2 -0
- package/server/dist/auth/password.js +68 -0
- package/server/dist/auth/password.js.map +1 -0
- package/server/dist/auth/requireAdmin.d.ts +2 -0
- package/server/dist/auth/requireAdmin.js +14 -0
- package/server/dist/auth/requireAdmin.js.map +1 -0
- package/server/dist/auth/roles.d.ts +3 -0
- package/server/dist/auth/roles.js +13 -0
- package/server/dist/auth/roles.js.map +1 -0
- package/server/dist/auth/session.d.ts +24 -0
- package/server/dist/auth/session.js +127 -0
- package/server/dist/auth/session.js.map +1 -0
- package/server/dist/auth/sqlite/authDb.d.ts +18 -0
- package/server/dist/auth/sqlite/authDb.js +26 -0
- package/server/dist/auth/sqlite/authDb.js.map +1 -0
- package/server/dist/auth/sqlite/legacyImport.d.ts +22 -0
- package/server/dist/auth/sqlite/legacyImport.js +208 -0
- package/server/dist/auth/sqlite/legacyImport.js.map +1 -0
- package/server/dist/auth/sqlite/schema.d.ts +11 -0
- package/server/dist/auth/sqlite/schema.js +47 -0
- package/server/dist/auth/sqlite/schema.js.map +1 -0
- package/server/dist/auth/sqlite/sqliteUserStore.d.ts +12 -0
- package/server/dist/auth/sqlite/sqliteUserStore.js +194 -0
- package/server/dist/auth/sqlite/sqliteUserStore.js.map +1 -0
- package/server/dist/auth/userStore.d.ts +19 -0
- package/server/dist/auth/userStore.js +26 -0
- package/server/dist/auth/userStore.js.map +1 -0
- package/server/dist/auth/userTypes.d.ts +13 -0
- package/server/dist/auth/userTypes.js +3 -0
- package/server/dist/auth/userTypes.js.map +1 -0
- package/server/dist/chat/attachmentPathRedaction.d.ts +5 -0
- package/server/dist/chat/attachmentPathRedaction.js +67 -0
- package/server/dist/chat/attachmentPathRedaction.js.map +1 -0
- package/server/dist/chat/chatItemEnricher.d.ts +5 -0
- package/server/dist/chat/chatItemEnricher.js +40 -0
- package/server/dist/chat/chatItemEnricher.js.map +1 -0
- package/server/dist/chat/codexEventProjector.d.ts +33 -0
- package/server/dist/chat/codexEventProjector.js +482 -0
- package/server/dist/chat/codexEventProjector.js.map +1 -0
- package/server/dist/chat/contextUsageProjector.d.ts +10 -0
- package/server/dist/chat/contextUsageProjector.js +472 -0
- package/server/dist/chat/contextUsageProjector.js.map +1 -0
- package/server/dist/chat/fileChangeExtractor.d.ts +5 -0
- package/server/dist/chat/fileChangeExtractor.js +121 -0
- package/server/dist/chat/fileChangeExtractor.js.map +1 -0
- package/server/dist/chat/markdown/markdownAst.d.ts +5 -0
- package/server/dist/chat/markdown/markdownAst.js +154 -0
- package/server/dist/chat/markdown/markdownAst.js.map +1 -0
- package/server/dist/chat/systemToolCallSummary.d.ts +10 -0
- package/server/dist/chat/systemToolCallSummary.js +112 -0
- package/server/dist/chat/systemToolCallSummary.js.map +1 -0
- package/server/dist/chat/terminal/terminalPlainText.d.ts +14 -0
- package/server/dist/chat/terminal/terminalPlainText.js +139 -0
- package/server/dist/chat/terminal/terminalPlainText.js.map +1 -0
- package/server/dist/chat/textMetrics.d.ts +9 -0
- package/server/dist/chat/textMetrics.js +24 -0
- package/server/dist/chat/textMetrics.js.map +1 -0
- package/server/dist/chat/threadTurnsProjector.d.ts +12 -0
- package/server/dist/chat/threadTurnsProjector.js +292 -0
- package/server/dist/chat/threadTurnsProjector.js.map +1 -0
- package/server/dist/chat/todoPlanProjector.d.ts +8 -0
- package/server/dist/chat/todoPlanProjector.js +94 -0
- package/server/dist/chat/todoPlanProjector.js.map +1 -0
- package/server/dist/chat/todoPlanTypes.d.ts +21 -0
- package/server/dist/chat/todoPlanTypes.js +3 -0
- package/server/dist/chat/todoPlanTypes.js.map +1 -0
- package/server/dist/chat/types.d.ts +138 -0
- package/server/dist/chat/types.js +3 -0
- package/server/dist/chat/types.js.map +1 -0
- package/server/dist/cli/configArg.d.ts +21 -0
- package/server/dist/cli/configArg.js +70 -0
- package/server/dist/cli/configArg.js.map +1 -0
- package/server/dist/codex/appServerProcess.d.ts +24 -0
- package/server/dist/codex/appServerProcess.js +56 -0
- package/server/dist/codex/appServerProcess.js.map +1 -0
- package/server/dist/codex/cliArgs.d.ts +17 -0
- package/server/dist/codex/cliArgs.js +34 -0
- package/server/dist/codex/cliArgs.js.map +1 -0
- package/server/dist/codex/codexAppServer.d.ts +103 -0
- package/server/dist/codex/codexAppServer.js +206 -0
- package/server/dist/codex/codexAppServer.js.map +1 -0
- package/server/dist/codex/jsonl.d.ts +4 -0
- package/server/dist/codex/jsonl.js +23 -0
- package/server/dist/codex/jsonl.js.map +1 -0
- package/server/dist/codex/jsonrpc.d.ts +43 -0
- package/server/dist/codex/jsonrpc.js +96 -0
- package/server/dist/codex/jsonrpc.js.map +1 -0
- package/server/dist/config/serverConfig.d.ts +150 -0
- package/server/dist/config/serverConfig.js +64 -0
- package/server/dist/config/serverConfig.js.map +1 -0
- package/server/dist/env.d.ts +101 -0
- package/server/dist/env.js +523 -0
- package/server/dist/env.js.map +1 -0
- package/server/dist/history/http/historyRoutes.d.ts +18 -0
- package/server/dist/history/http/historyRoutes.js +67 -0
- package/server/dist/history/http/historyRoutes.js.map +1 -0
- package/server/dist/history/index.d.ts +24 -0
- package/server/dist/history/index.js +30 -0
- package/server/dist/history/index.js.map +1 -0
- package/server/dist/history/ingest/historyIngestService.d.ts +15 -0
- package/server/dist/history/ingest/historyIngestService.js +42 -0
- package/server/dist/history/ingest/historyIngestService.js.map +1 -0
- package/server/dist/history/projector/extractIds.d.ts +36 -0
- package/server/dist/history/projector/extractIds.js +111 -0
- package/server/dist/history/projector/extractIds.js.map +1 -0
- package/server/dist/history/projector/projectCodexEvent.d.ts +27 -0
- package/server/dist/history/projector/projectCodexEvent.js +845 -0
- package/server/dist/history/projector/projectCodexEvent.js.map +1 -0
- package/server/dist/history/query/historyQueryService.d.ts +34 -0
- package/server/dist/history/query/historyQueryService.js +170 -0
- package/server/dist/history/query/historyQueryService.js.map +1 -0
- package/server/dist/history/sqlite/schema.d.ts +11 -0
- package/server/dist/history/sqlite/schema.js +34 -0
- package/server/dist/history/sqlite/schema.js.map +1 -0
- package/server/dist/history/sqlite/sqliteHistoryStore.d.ts +69 -0
- package/server/dist/history/sqlite/sqliteHistoryStore.js +206 -0
- package/server/dist/history/sqlite/sqliteHistoryStore.js.map +1 -0
- package/server/dist/history/types.d.ts +29 -0
- package/server/dist/history/types.js +3 -0
- package/server/dist/history/types.js.map +1 -0
- package/server/dist/index.d.ts +1 -0
- package/server/dist/index.js +166 -0
- package/server/dist/index.js.map +1 -0
- package/server/dist/security/executionPolicy.d.ts +33 -0
- package/server/dist/security/executionPolicy.js +72 -0
- package/server/dist/security/executionPolicy.js.map +1 -0
- package/server/dist/security/origin.d.ts +11 -0
- package/server/dist/security/origin.js +40 -0
- package/server/dist/security/origin.js.map +1 -0
- package/server/dist/settings/sqliteUserSettingsStore.d.ts +12 -0
- package/server/dist/settings/sqliteUserSettingsStore.js +62 -0
- package/server/dist/settings/sqliteUserSettingsStore.js.map +1 -0
- package/server/dist/settings/userSettingsRoutes.d.ts +8 -0
- package/server/dist/settings/userSettingsRoutes.js +55 -0
- package/server/dist/settings/userSettingsRoutes.js.map +1 -0
- package/server/dist/settings/userSettingsStore.d.ts +19 -0
- package/server/dist/settings/userSettingsStore.js +26 -0
- package/server/dist/settings/userSettingsStore.js.map +1 -0
- package/server/dist/settings/userSettingsTypes.d.ts +70 -0
- package/server/dist/settings/userSettingsTypes.js +196 -0
- package/server/dist/settings/userSettingsTypes.js.map +1 -0
- package/server/dist/status/codexTaskTracker.d.ts +21 -0
- package/server/dist/status/codexTaskTracker.js +123 -0
- package/server/dist/status/codexTaskTracker.js.map +1 -0
- package/server/dist/status/threadContextUsage.d.ts +19 -0
- package/server/dist/status/threadContextUsage.js +229 -0
- package/server/dist/status/threadContextUsage.js.map +1 -0
- package/server/dist/threadList/threadListServerCache.d.ts +10 -0
- package/server/dist/threadList/threadListServerCache.js +42 -0
- package/server/dist/threadList/threadListServerCache.js.map +1 -0
- package/server/dist/tools/cwdSuggest.d.ts +11 -0
- package/server/dist/tools/cwdSuggest.js +128 -0
- package/server/dist/tools/cwdSuggest.js.map +1 -0
- package/server/dist/workspace/accessControl.d.ts +16 -0
- package/server/dist/workspace/accessControl.js +82 -0
- package/server/dist/workspace/accessControl.js.map +1 -0
- package/server/dist/workspace/sqliteUserWorkspaceStore.d.ts +12 -0
- package/server/dist/workspace/sqliteUserWorkspaceStore.js +82 -0
- package/server/dist/workspace/sqliteUserWorkspaceStore.js.map +1 -0
- package/server/dist/workspace/threadAccess.d.ts +19 -0
- package/server/dist/workspace/threadAccess.js +22 -0
- package/server/dist/workspace/threadAccess.js.map +1 -0
- package/server/dist/workspace/threadListVisibility.d.ts +25 -0
- package/server/dist/workspace/threadListVisibility.js +104 -0
- package/server/dist/workspace/threadListVisibility.js.map +1 -0
- package/server/dist/workspace/userWorkspaceRoutes.d.ts +7 -0
- package/server/dist/workspace/userWorkspaceRoutes.js +124 -0
- package/server/dist/workspace/userWorkspaceRoutes.js.map +1 -0
- package/server/dist/workspace/userWorkspaceStore.d.ts +12 -0
- package/server/dist/workspace/userWorkspaceStore.js +23 -0
- package/server/dist/workspace/userWorkspaceStore.js.map +1 -0
- package/server/dist/ws/socketIoBridge.d.ts +32 -0
- package/server/dist/ws/socketIoBridge.js +194 -0
- package/server/dist/ws/socketIoBridge.js.map +1 -0
- package/server/dist/ws/types.d.ts +113 -0
- package/server/dist/ws/types.js +3 -0
- package/server/dist/ws/types.js.map +1 -0
- package/server/dist/ws/wsHub.d.ts +119 -0
- package/server/dist/ws/wsHub.js +1259 -0
- package/server/dist/ws/wsHub.js.map +1 -0
- package/web/dist/assets/index-CY6cnwQz.js +174 -0
- package/web/dist/assets/index-DI7kJHr2.css +32 -0
- package/web/dist/favicon-mask.svg +9 -0
- package/web/dist/favicon.svg +26 -0
- package/web/dist/index.html +75 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/auth/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
/**
|
|
3
|
+
* 认证数据库句柄与事务工具。
|
|
4
|
+
*/
|
|
5
|
+
export type AuthDb = {
|
|
6
|
+
db: Database.Database;
|
|
7
|
+
runInTransaction: <T>(callback: () => T) => T;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* 创建认证数据库连接所需参数。
|
|
11
|
+
*/
|
|
12
|
+
export type CreateAuthDbOptions = {
|
|
13
|
+
dbPath: string;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* 创建并初始化认证数据库连接。
|
|
17
|
+
*/
|
|
18
|
+
export declare function createAuthDb(options: CreateAuthDbOptions): AuthDb;
|
|
@@ -0,0 +1,26 @@
|
|
|
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.createAuthDb = createAuthDb;
|
|
7
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
10
|
+
const schema_1 = require("./schema");
|
|
11
|
+
/**
|
|
12
|
+
* 创建并初始化认证数据库连接。
|
|
13
|
+
*/
|
|
14
|
+
function createAuthDb(options) {
|
|
15
|
+
const normalizedDbPath = node_path_1.default.resolve(String(options.dbPath ?? "").trim());
|
|
16
|
+
if (!normalizedDbPath)
|
|
17
|
+
throw new Error("auth dbPath is required");
|
|
18
|
+
const dbDirPath = node_path_1.default.dirname(normalizedDbPath);
|
|
19
|
+
node_fs_1.default.mkdirSync(dbDirPath, { recursive: true });
|
|
20
|
+
const db = new better_sqlite3_1.default(normalizedDbPath);
|
|
21
|
+
(0, schema_1.applyAuthSchema)(db);
|
|
22
|
+
const transaction = db.transaction((callback) => callback());
|
|
23
|
+
const runInTransaction = (callback) => transaction(callback);
|
|
24
|
+
return { db, runInTransaction };
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=authDb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authDb.js","sourceRoot":"","sources":["../../../src/auth/sqlite/authDb.ts"],"names":[],"mappings":";;;;;AAuBA,oCAaC;AApCD,sDAAyB;AACzB,0DAA6B;AAC7B,oEAAsC;AACtC,qCAA2C;AAiB3C;;GAEG;AACH,SAAgB,YAAY,CAAC,OAA4B;IACvD,MAAM,gBAAgB,GAAG,mBAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3E,IAAI,CAAC,gBAAgB;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAElE,MAAM,SAAS,GAAG,mBAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACjD,iBAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,gBAAgB,CAAC,CAAC;IAC1C,IAAA,wBAAe,EAAC,EAAE,CAAC,CAAC;IAEpB,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,QAAuB,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5E,MAAM,gBAAgB,GAAG,CAAI,QAAiB,EAAK,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAM,CAAC;IACjF,OAAO,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AuthDb } from "./authDb";
|
|
2
|
+
/**
|
|
3
|
+
* 旧 JSON 导入执行参数。
|
|
4
|
+
*/
|
|
5
|
+
export type LegacyImportOptions = {
|
|
6
|
+
authDb: AuthDb;
|
|
7
|
+
usersFilePath: string;
|
|
8
|
+
userWorkspacesFilePath: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* 旧 JSON 导入结果摘要。
|
|
12
|
+
*/
|
|
13
|
+
export type LegacyImportResult = {
|
|
14
|
+
imported: boolean;
|
|
15
|
+
importedUsers: number;
|
|
16
|
+
importedAssignedWorkspaces: number;
|
|
17
|
+
importedWorkspaceDirs: number;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* 当 DB 为空时导入旧 JSON 配置数据。
|
|
21
|
+
*/
|
|
22
|
+
export declare function maybeImportLegacyJsonSettings(options: LegacyImportOptions): Promise<LegacyImportResult>;
|
|
@@ -0,0 +1,208 @@
|
|
|
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.maybeImportLegacyJsonSettings = maybeImportLegacyJsonSettings;
|
|
7
|
+
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
/**
|
|
10
|
+
* 规范化用户名输入。
|
|
11
|
+
*/
|
|
12
|
+
function normalizeUsername(username) {
|
|
13
|
+
return String(username ?? "").trim();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 规范化角色值。
|
|
17
|
+
*/
|
|
18
|
+
function normalizeRole(role) {
|
|
19
|
+
return role === "admin" ? "admin" : "member";
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 去重并保序地规范化“分配工作区”。
|
|
23
|
+
*/
|
|
24
|
+
function normalizeAssignedWorkspaces(workspaces) {
|
|
25
|
+
const input = Array.isArray(workspaces) ? workspaces : [];
|
|
26
|
+
const seen = new Set();
|
|
27
|
+
const normalized = [];
|
|
28
|
+
for (const workspacePath of input) {
|
|
29
|
+
const trimmedWorkspacePath = String(workspacePath ?? "").trim();
|
|
30
|
+
if (!trimmedWorkspacePath)
|
|
31
|
+
continue;
|
|
32
|
+
if (seen.has(trimmedWorkspacePath))
|
|
33
|
+
continue;
|
|
34
|
+
seen.add(trimmedWorkspacePath);
|
|
35
|
+
normalized.push(trimmedWorkspacePath);
|
|
36
|
+
}
|
|
37
|
+
return normalized;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 去重并保序地规范化“用户保存工作目录”。
|
|
41
|
+
*/
|
|
42
|
+
function normalizeWorkspaceDirs(workspaceDirs) {
|
|
43
|
+
const input = Array.isArray(workspaceDirs) ? workspaceDirs : [];
|
|
44
|
+
const seen = new Set();
|
|
45
|
+
const normalized = [];
|
|
46
|
+
for (const workspaceDir of input) {
|
|
47
|
+
const resolvedWorkspaceDir = node_path_1.default.resolve(String(workspaceDir ?? "").trim());
|
|
48
|
+
if (!resolvedWorkspaceDir)
|
|
49
|
+
continue;
|
|
50
|
+
if (seen.has(resolvedWorkspaceDir))
|
|
51
|
+
continue;
|
|
52
|
+
seen.add(resolvedWorkspaceDir);
|
|
53
|
+
normalized.push(resolvedWorkspaceDir);
|
|
54
|
+
}
|
|
55
|
+
return normalized;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 安全读取 JSON 文件;文件不存在时返回 null。
|
|
59
|
+
*/
|
|
60
|
+
async function readJsonFileIfExists(filePath) {
|
|
61
|
+
const normalizedFilePath = String(filePath ?? "").trim();
|
|
62
|
+
if (!normalizedFilePath)
|
|
63
|
+
return null;
|
|
64
|
+
try {
|
|
65
|
+
const rawJson = await promises_1.default.readFile(normalizedFilePath, "utf8");
|
|
66
|
+
return JSON.parse(rawJson);
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
if (error?.code === "ENOENT")
|
|
70
|
+
return null;
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 读取并解析旧版 users.json。
|
|
76
|
+
*/
|
|
77
|
+
async function readLegacyUsers(filePath) {
|
|
78
|
+
const raw = await readJsonFileIfExists(filePath);
|
|
79
|
+
const users = Array.isArray(raw?.users) ? raw.users : [];
|
|
80
|
+
const seen = new Set();
|
|
81
|
+
const normalizedUsers = [];
|
|
82
|
+
for (const user of users) {
|
|
83
|
+
const username = normalizeUsername(user?.username);
|
|
84
|
+
if (!username || seen.has(username))
|
|
85
|
+
continue;
|
|
86
|
+
const passwordHash = String(user?.passwordHash ?? "").trim();
|
|
87
|
+
if (!passwordHash)
|
|
88
|
+
continue;
|
|
89
|
+
seen.add(username);
|
|
90
|
+
normalizedUsers.push({
|
|
91
|
+
username,
|
|
92
|
+
role: normalizeRole(user?.role),
|
|
93
|
+
passwordHash,
|
|
94
|
+
workspaces: normalizeAssignedWorkspaces(user?.workspaces),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
return normalizedUsers;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* 读取并解析旧版 user-workspaces.json。
|
|
101
|
+
*/
|
|
102
|
+
async function readLegacyWorkspaceEntries(filePath) {
|
|
103
|
+
const raw = await readJsonFileIfExists(filePath);
|
|
104
|
+
const users = Array.isArray(raw?.users) ? raw.users : [];
|
|
105
|
+
const seen = new Set();
|
|
106
|
+
const normalizedEntries = [];
|
|
107
|
+
for (const user of users) {
|
|
108
|
+
const username = normalizeUsername(user?.username);
|
|
109
|
+
if (!username || seen.has(username))
|
|
110
|
+
continue;
|
|
111
|
+
seen.add(username);
|
|
112
|
+
normalizedEntries.push({
|
|
113
|
+
username,
|
|
114
|
+
workspaceDirs: normalizeWorkspaceDirs(user?.workspaceDirs),
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
return normalizedEntries;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* 当 DB 为空时导入旧 JSON 配置数据。
|
|
121
|
+
*/
|
|
122
|
+
async function maybeImportLegacyJsonSettings(options) {
|
|
123
|
+
const db = options.authDb.db;
|
|
124
|
+
const userCountRow = db.prepare(`SELECT COUNT(*) AS count FROM auth_users`).get();
|
|
125
|
+
const userCount = Number(userCountRow?.count ?? 0);
|
|
126
|
+
if (userCount > 0) {
|
|
127
|
+
return {
|
|
128
|
+
imported: false,
|
|
129
|
+
importedUsers: 0,
|
|
130
|
+
importedAssignedWorkspaces: 0,
|
|
131
|
+
importedWorkspaceDirs: 0,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
const legacyUsers = await readLegacyUsers(options.usersFilePath);
|
|
135
|
+
const legacyWorkspaceEntries = await readLegacyWorkspaceEntries(options.userWorkspacesFilePath);
|
|
136
|
+
if (legacyUsers.length === 0 && legacyWorkspaceEntries.length === 0) {
|
|
137
|
+
return {
|
|
138
|
+
imported: false,
|
|
139
|
+
importedUsers: 0,
|
|
140
|
+
importedAssignedWorkspaces: 0,
|
|
141
|
+
importedWorkspaceDirs: 0,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
const insertUserStatement = db.prepare(`
|
|
145
|
+
INSERT OR REPLACE INTO auth_users (
|
|
146
|
+
username, role, password_hash, created_at_ms, updated_at_ms
|
|
147
|
+
) VALUES (
|
|
148
|
+
@username, @role, @passwordHash, @createdAtMs, @updatedAtMs
|
|
149
|
+
)
|
|
150
|
+
`);
|
|
151
|
+
const insertAssignedWorkspaceStatement = db.prepare(`
|
|
152
|
+
INSERT OR REPLACE INTO auth_user_assigned_workspaces (
|
|
153
|
+
username, workspace_path, ord
|
|
154
|
+
) VALUES (
|
|
155
|
+
@username, @workspacePath, @ord
|
|
156
|
+
)
|
|
157
|
+
`);
|
|
158
|
+
const insertWorkspaceDirStatement = db.prepare(`
|
|
159
|
+
INSERT OR REPLACE INTO auth_user_workspace_dirs (
|
|
160
|
+
username, workspace_dir, ord
|
|
161
|
+
) VALUES (
|
|
162
|
+
@username, @workspaceDir, @ord
|
|
163
|
+
)
|
|
164
|
+
`);
|
|
165
|
+
const nowMs = Date.now();
|
|
166
|
+
let importedUsers = 0;
|
|
167
|
+
let importedAssignedWorkspaces = 0;
|
|
168
|
+
let importedWorkspaceDirs = 0;
|
|
169
|
+
options.authDb.runInTransaction(() => {
|
|
170
|
+
for (const legacyUser of legacyUsers) {
|
|
171
|
+
insertUserStatement.run({
|
|
172
|
+
username: legacyUser.username,
|
|
173
|
+
role: normalizeRole(legacyUser.role),
|
|
174
|
+
passwordHash: legacyUser.passwordHash,
|
|
175
|
+
createdAtMs: nowMs,
|
|
176
|
+
updatedAtMs: nowMs,
|
|
177
|
+
});
|
|
178
|
+
importedUsers += 1;
|
|
179
|
+
for (let index = 0; index < legacyUser.workspaces.length; index += 1) {
|
|
180
|
+
const workspacePath = legacyUser.workspaces[index];
|
|
181
|
+
insertAssignedWorkspaceStatement.run({
|
|
182
|
+
username: legacyUser.username,
|
|
183
|
+
workspacePath,
|
|
184
|
+
ord: index,
|
|
185
|
+
});
|
|
186
|
+
importedAssignedWorkspaces += 1;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
for (const legacyWorkspaceEntry of legacyWorkspaceEntries) {
|
|
190
|
+
for (let index = 0; index < legacyWorkspaceEntry.workspaceDirs.length; index += 1) {
|
|
191
|
+
const workspaceDir = legacyWorkspaceEntry.workspaceDirs[index];
|
|
192
|
+
insertWorkspaceDirStatement.run({
|
|
193
|
+
username: legacyWorkspaceEntry.username,
|
|
194
|
+
workspaceDir,
|
|
195
|
+
ord: index,
|
|
196
|
+
});
|
|
197
|
+
importedWorkspaceDirs += 1;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
return {
|
|
202
|
+
imported: importedUsers > 0 || importedAssignedWorkspaces > 0 || importedWorkspaceDirs > 0,
|
|
203
|
+
importedUsers,
|
|
204
|
+
importedAssignedWorkspaces,
|
|
205
|
+
importedWorkspaceDirs,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=legacyImport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacyImport.js","sourceRoot":"","sources":["../../../src/auth/sqlite/legacyImport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applyAuthSchema = applyAuthSchema;
|
|
4
|
+
/**
|
|
5
|
+
* 初始化认证与工作区设置相关表结构。
|
|
6
|
+
*/
|
|
7
|
+
function applyAuthSchema(db) {
|
|
8
|
+
db.exec(`
|
|
9
|
+
PRAGMA journal_mode=WAL;
|
|
10
|
+
PRAGMA synchronous=NORMAL;
|
|
11
|
+
|
|
12
|
+
CREATE TABLE IF NOT EXISTS auth_users (
|
|
13
|
+
username TEXT PRIMARY KEY,
|
|
14
|
+
role TEXT NOT NULL,
|
|
15
|
+
password_hash TEXT NOT NULL,
|
|
16
|
+
created_at_ms INTEGER NOT NULL,
|
|
17
|
+
updated_at_ms INTEGER NOT NULL
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
CREATE TABLE IF NOT EXISTS auth_user_assigned_workspaces (
|
|
21
|
+
username TEXT NOT NULL,
|
|
22
|
+
workspace_path TEXT NOT NULL,
|
|
23
|
+
ord INTEGER NOT NULL,
|
|
24
|
+
PRIMARY KEY(username, workspace_path)
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
CREATE INDEX IF NOT EXISTS idx_auth_assigned_workspaces_username_ord
|
|
28
|
+
ON auth_user_assigned_workspaces(username, ord);
|
|
29
|
+
|
|
30
|
+
CREATE TABLE IF NOT EXISTS auth_user_workspace_dirs (
|
|
31
|
+
username TEXT NOT NULL,
|
|
32
|
+
workspace_dir TEXT NOT NULL,
|
|
33
|
+
ord INTEGER NOT NULL,
|
|
34
|
+
PRIMARY KEY(username, workspace_dir)
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
CREATE INDEX IF NOT EXISTS idx_auth_workspace_dirs_username_ord
|
|
38
|
+
ON auth_user_workspace_dirs(username, ord);
|
|
39
|
+
|
|
40
|
+
CREATE TABLE IF NOT EXISTS auth_user_settings (
|
|
41
|
+
username TEXT PRIMARY KEY,
|
|
42
|
+
settings_json TEXT NOT NULL,
|
|
43
|
+
updated_at_ms INTEGER NOT NULL
|
|
44
|
+
);
|
|
45
|
+
`);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/auth/sqlite/schema.ts"],"names":[],"mappings":";;AAUA,0CAuCC;AA1CD;;GAEG;AACH,SAAgB,eAAe,CAAC,EAAgB;IAC9C,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCP,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { UserStore } from "../userStore";
|
|
2
|
+
import type { AuthDb } from "./authDb";
|
|
3
|
+
/**
|
|
4
|
+
* SQLite 用户仓库创建参数。
|
|
5
|
+
*/
|
|
6
|
+
export type CreateSqliteUserStoreOptions = {
|
|
7
|
+
authDb: AuthDb;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* 基于 SQLite 创建用户仓库。
|
|
11
|
+
*/
|
|
12
|
+
export declare function createSqliteUserStore(options: CreateSqliteUserStoreOptions): UserStore;
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createSqliteUserStore = createSqliteUserStore;
|
|
4
|
+
const password_1 = require("../password");
|
|
5
|
+
/**
|
|
6
|
+
* 规范化用户名输入。
|
|
7
|
+
*/
|
|
8
|
+
function normalizeUsername(username) {
|
|
9
|
+
return String(username ?? "").trim();
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 规范化角色值。
|
|
13
|
+
*/
|
|
14
|
+
function normalizeRole(role) {
|
|
15
|
+
return role === "admin" ? "admin" : "member";
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 去重并保序地规范化分配工作区列表。
|
|
19
|
+
*/
|
|
20
|
+
function normalizeAssignedWorkspaces(workspaces) {
|
|
21
|
+
const seen = new Set();
|
|
22
|
+
const normalized = [];
|
|
23
|
+
for (const workspacePath of workspaces ?? []) {
|
|
24
|
+
const trimmedWorkspacePath = String(workspacePath ?? "").trim();
|
|
25
|
+
if (!trimmedWorkspacePath)
|
|
26
|
+
continue;
|
|
27
|
+
if (seen.has(trimmedWorkspacePath))
|
|
28
|
+
continue;
|
|
29
|
+
seen.add(trimmedWorkspacePath);
|
|
30
|
+
normalized.push(trimmedWorkspacePath);
|
|
31
|
+
}
|
|
32
|
+
return normalized;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 将数据库行映射为服务端用户结构。
|
|
36
|
+
*/
|
|
37
|
+
function toStoredUser(userRow, workspaces) {
|
|
38
|
+
return {
|
|
39
|
+
username: userRow.username,
|
|
40
|
+
role: normalizeRole(userRow.role),
|
|
41
|
+
passwordHash: userRow.password_hash,
|
|
42
|
+
workspaces,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 基于 SQLite 创建用户仓库。
|
|
47
|
+
*/
|
|
48
|
+
function createSqliteUserStore(options) {
|
|
49
|
+
const db = options.authDb.db;
|
|
50
|
+
const runInTransaction = options.authDb.runInTransaction;
|
|
51
|
+
const insertUserStatement = db.prepare(`
|
|
52
|
+
INSERT INTO auth_users (
|
|
53
|
+
username, role, password_hash, created_at_ms, updated_at_ms
|
|
54
|
+
) VALUES (
|
|
55
|
+
@username, @role, @passwordHash, @createdAtMs, @updatedAtMs
|
|
56
|
+
)
|
|
57
|
+
`);
|
|
58
|
+
const getUserByUsernameStatement = db.prepare(`
|
|
59
|
+
SELECT username, role, password_hash
|
|
60
|
+
FROM auth_users
|
|
61
|
+
WHERE username = ?
|
|
62
|
+
LIMIT 1
|
|
63
|
+
`);
|
|
64
|
+
const listUsersStatement = db.prepare(`
|
|
65
|
+
SELECT username, role, password_hash
|
|
66
|
+
FROM auth_users
|
|
67
|
+
ORDER BY username ASC
|
|
68
|
+
`);
|
|
69
|
+
const updatePasswordStatement = db.prepare(`
|
|
70
|
+
UPDATE auth_users
|
|
71
|
+
SET password_hash = @passwordHash, updated_at_ms = @updatedAtMs
|
|
72
|
+
WHERE username = @username
|
|
73
|
+
`);
|
|
74
|
+
const deleteAssignedWorkspacesStatement = db.prepare(`
|
|
75
|
+
DELETE FROM auth_user_assigned_workspaces
|
|
76
|
+
WHERE username = ?
|
|
77
|
+
`);
|
|
78
|
+
const insertAssignedWorkspaceStatement = db.prepare(`
|
|
79
|
+
INSERT OR REPLACE INTO auth_user_assigned_workspaces (
|
|
80
|
+
username, workspace_path, ord
|
|
81
|
+
) VALUES (
|
|
82
|
+
@username, @workspacePath, @ord
|
|
83
|
+
)
|
|
84
|
+
`);
|
|
85
|
+
const listAssignedWorkspacesByUsernameStatement = db.prepare(`
|
|
86
|
+
SELECT username, workspace_path
|
|
87
|
+
FROM auth_user_assigned_workspaces
|
|
88
|
+
WHERE username = ?
|
|
89
|
+
ORDER BY ord ASC
|
|
90
|
+
`);
|
|
91
|
+
const listAllAssignedWorkspacesStatement = db.prepare(`
|
|
92
|
+
SELECT username, workspace_path
|
|
93
|
+
FROM auth_user_assigned_workspaces
|
|
94
|
+
ORDER BY username ASC, ord ASC
|
|
95
|
+
`);
|
|
96
|
+
const getStoredUserSync = (username) => {
|
|
97
|
+
const userRow = getUserByUsernameStatement.get(username);
|
|
98
|
+
if (!userRow)
|
|
99
|
+
return null;
|
|
100
|
+
const workspaceRows = listAssignedWorkspacesByUsernameStatement.all(username);
|
|
101
|
+
const workspaces = workspaceRows.map((workspaceRow) => workspaceRow.workspace_path);
|
|
102
|
+
return toStoredUser(userRow, workspaces);
|
|
103
|
+
};
|
|
104
|
+
return {
|
|
105
|
+
async createUser(input) {
|
|
106
|
+
const username = normalizeUsername(input.username);
|
|
107
|
+
if (!username)
|
|
108
|
+
throw new Error("username is required");
|
|
109
|
+
const password = String(input.password ?? "");
|
|
110
|
+
if (!password)
|
|
111
|
+
throw new Error("password is required");
|
|
112
|
+
const existingUser = getUserByUsernameStatement.get(username);
|
|
113
|
+
if (existingUser)
|
|
114
|
+
throw new Error("username already exists");
|
|
115
|
+
const nowMs = Date.now();
|
|
116
|
+
const passwordHash = await (0, password_1.hashPassword)(password);
|
|
117
|
+
insertUserStatement.run({
|
|
118
|
+
username,
|
|
119
|
+
role: normalizeRole(input.role),
|
|
120
|
+
passwordHash,
|
|
121
|
+
createdAtMs: nowMs,
|
|
122
|
+
updatedAtMs: nowMs,
|
|
123
|
+
});
|
|
124
|
+
return {
|
|
125
|
+
username,
|
|
126
|
+
role: normalizeRole(input.role),
|
|
127
|
+
passwordHash,
|
|
128
|
+
workspaces: [],
|
|
129
|
+
};
|
|
130
|
+
},
|
|
131
|
+
async getUserByUsername(usernameRaw) {
|
|
132
|
+
const username = normalizeUsername(usernameRaw);
|
|
133
|
+
if (!username)
|
|
134
|
+
return null;
|
|
135
|
+
return getStoredUserSync(username);
|
|
136
|
+
},
|
|
137
|
+
async setUserPassword(usernameRaw, passwordRaw) {
|
|
138
|
+
const username = normalizeUsername(usernameRaw);
|
|
139
|
+
if (!username)
|
|
140
|
+
throw new Error("username is required");
|
|
141
|
+
const password = String(passwordRaw ?? "");
|
|
142
|
+
if (!password)
|
|
143
|
+
throw new Error("password is required");
|
|
144
|
+
const passwordHash = await (0, password_1.hashPassword)(password);
|
|
145
|
+
const result = updatePasswordStatement.run({
|
|
146
|
+
username,
|
|
147
|
+
passwordHash,
|
|
148
|
+
updatedAtMs: Date.now(),
|
|
149
|
+
});
|
|
150
|
+
if (Number(result.changes ?? 0) <= 0)
|
|
151
|
+
throw new Error("user not found");
|
|
152
|
+
const updatedUser = getStoredUserSync(username);
|
|
153
|
+
if (!updatedUser)
|
|
154
|
+
throw new Error("user not found");
|
|
155
|
+
return updatedUser;
|
|
156
|
+
},
|
|
157
|
+
async assignWorkspaces(usernameRaw, workspaces) {
|
|
158
|
+
const username = normalizeUsername(usernameRaw);
|
|
159
|
+
if (!username)
|
|
160
|
+
throw new Error("username is required");
|
|
161
|
+
const existingUser = getUserByUsernameStatement.get(username);
|
|
162
|
+
if (!existingUser)
|
|
163
|
+
throw new Error("user not found");
|
|
164
|
+
const normalizedWorkspaces = normalizeAssignedWorkspaces(workspaces);
|
|
165
|
+
runInTransaction(() => {
|
|
166
|
+
deleteAssignedWorkspacesStatement.run(username);
|
|
167
|
+
for (let index = 0; index < normalizedWorkspaces.length; index += 1) {
|
|
168
|
+
const workspacePath = normalizedWorkspaces[index];
|
|
169
|
+
insertAssignedWorkspaceStatement.run({
|
|
170
|
+
username,
|
|
171
|
+
workspacePath,
|
|
172
|
+
ord: index,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
const updatedUser = getStoredUserSync(username);
|
|
177
|
+
if (!updatedUser)
|
|
178
|
+
throw new Error("user not found");
|
|
179
|
+
return updatedUser;
|
|
180
|
+
},
|
|
181
|
+
async listUsers() {
|
|
182
|
+
const userRows = listUsersStatement.all();
|
|
183
|
+
const workspaceRows = listAllAssignedWorkspacesStatement.all();
|
|
184
|
+
const workspacesByUsername = new Map();
|
|
185
|
+
for (const workspaceRow of workspaceRows) {
|
|
186
|
+
const currentWorkspaces = workspacesByUsername.get(workspaceRow.username) ?? [];
|
|
187
|
+
currentWorkspaces.push(workspaceRow.workspace_path);
|
|
188
|
+
workspacesByUsername.set(workspaceRow.username, currentWorkspaces);
|
|
189
|
+
}
|
|
190
|
+
return userRows.map((userRow) => toStoredUser(userRow, workspacesByUsername.get(userRow.username) ?? []));
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=sqliteUserStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqliteUserStore.js","sourceRoot":"","sources":["../../../src/auth/sqlite/sqliteUserStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type AuthDb } from "./sqlite/authDb";
|
|
2
|
+
import type { CreateUserInput, StoredUser } from "./userTypes";
|
|
3
|
+
export type UserStore = {
|
|
4
|
+
createUser(input: CreateUserInput): Promise<StoredUser>;
|
|
5
|
+
getUserByUsername(username: string): Promise<StoredUser | null>;
|
|
6
|
+
setUserPassword(username: string, password: string): Promise<StoredUser>;
|
|
7
|
+
assignWorkspaces(username: string, workspaces: string[]): Promise<StoredUser>;
|
|
8
|
+
listUsers(): Promise<StoredUser[]>;
|
|
9
|
+
};
|
|
10
|
+
type CreateUserStoreOptions = {
|
|
11
|
+
filePath?: string;
|
|
12
|
+
dbPath?: string;
|
|
13
|
+
authDb?: AuthDb;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* 创建用户仓库(当前默认使用 SQLite)。
|
|
17
|
+
*/
|
|
18
|
+
export declare function createUserStore(opts: CreateUserStoreOptions): Promise<UserStore>;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
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.createUserStore = createUserStore;
|
|
7
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
8
|
+
const authDb_1 = require("./sqlite/authDb");
|
|
9
|
+
const sqliteUserStore_1 = require("./sqlite/sqliteUserStore");
|
|
10
|
+
/**
|
|
11
|
+
* 解析 user store 的 SQLite 路径。
|
|
12
|
+
*/
|
|
13
|
+
function resolveUserStoreDbPath(opts) {
|
|
14
|
+
const rawDbPath = String(opts.dbPath ?? opts.filePath ?? "").trim();
|
|
15
|
+
if (!rawDbPath)
|
|
16
|
+
throw new Error("user store dbPath is required");
|
|
17
|
+
return node_path_1.default.resolve(rawDbPath);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 创建用户仓库(当前默认使用 SQLite)。
|
|
21
|
+
*/
|
|
22
|
+
async function createUserStore(opts) {
|
|
23
|
+
const authDb = opts.authDb ?? (0, authDb_1.createAuthDb)({ dbPath: resolveUserStoreDbPath(opts) });
|
|
24
|
+
return (0, sqliteUserStore_1.createSqliteUserStore)({ authDb });
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=userStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userStore.js","sourceRoot":"","sources":["../../src/auth/userStore.ts"],"names":[],"mappings":";;;;;AAuCA,0CAGC;AA1CD,0DAA6B;AAC7B,4CAA4D;AAC5D,8DAAiE;AAyBjE;;GAEG;AACH,SAAS,sBAAsB,CAAC,IAA4B;IAC1D,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpE,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACjE,OAAO,mBAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,eAAe,CAAC,IAA4B;IAChE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAA,qBAAY,EAAC,EAAE,MAAM,EAAE,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrF,OAAO,IAAA,uCAAqB,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type UserRole = "admin" | "member";
|
|
2
|
+
export type StoredUser = {
|
|
3
|
+
username: string;
|
|
4
|
+
role: UserRole;
|
|
5
|
+
passwordHash: string;
|
|
6
|
+
workspaces: string[];
|
|
7
|
+
};
|
|
8
|
+
export type CreateUserInput = {
|
|
9
|
+
username: string;
|
|
10
|
+
password: string;
|
|
11
|
+
role: UserRole;
|
|
12
|
+
};
|
|
13
|
+
export type PublicUser = Omit<StoredUser, "passwordHash">;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userTypes.js","sourceRoot":"","sources":["../../src/auth/userTypes.ts"],"names":[],"mappings":""}
|