@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.
Files changed (204) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +228 -0
  3. package/README.zh-CN.md +228 -0
  4. package/package.json +38 -0
  5. package/server/dist/admin/userAdminRoutes.d.ts +7 -0
  6. package/server/dist/admin/userAdminRoutes.js +91 -0
  7. package/server/dist/admin/userAdminRoutes.js.map +1 -0
  8. package/server/dist/app.d.ts +22 -0
  9. package/server/dist/app.js +993 -0
  10. package/server/dist/app.js.map +1 -0
  11. package/server/dist/auth/adminInit.d.ts +41 -0
  12. package/server/dist/auth/adminInit.js +126 -0
  13. package/server/dist/auth/adminInit.js.map +1 -0
  14. package/server/dist/auth/bootstrapAdmin.d.ts +6 -0
  15. package/server/dist/auth/bootstrapAdmin.js +11 -0
  16. package/server/dist/auth/bootstrapAdmin.js.map +1 -0
  17. package/server/dist/auth/httpAuth.d.ts +16 -0
  18. package/server/dist/auth/httpAuth.js +31 -0
  19. package/server/dist/auth/httpAuth.js.map +1 -0
  20. package/server/dist/auth/password.d.ts +2 -0
  21. package/server/dist/auth/password.js +68 -0
  22. package/server/dist/auth/password.js.map +1 -0
  23. package/server/dist/auth/requireAdmin.d.ts +2 -0
  24. package/server/dist/auth/requireAdmin.js +14 -0
  25. package/server/dist/auth/requireAdmin.js.map +1 -0
  26. package/server/dist/auth/roles.d.ts +3 -0
  27. package/server/dist/auth/roles.js +13 -0
  28. package/server/dist/auth/roles.js.map +1 -0
  29. package/server/dist/auth/session.d.ts +24 -0
  30. package/server/dist/auth/session.js +127 -0
  31. package/server/dist/auth/session.js.map +1 -0
  32. package/server/dist/auth/sqlite/authDb.d.ts +18 -0
  33. package/server/dist/auth/sqlite/authDb.js +26 -0
  34. package/server/dist/auth/sqlite/authDb.js.map +1 -0
  35. package/server/dist/auth/sqlite/legacyImport.d.ts +22 -0
  36. package/server/dist/auth/sqlite/legacyImport.js +208 -0
  37. package/server/dist/auth/sqlite/legacyImport.js.map +1 -0
  38. package/server/dist/auth/sqlite/schema.d.ts +11 -0
  39. package/server/dist/auth/sqlite/schema.js +47 -0
  40. package/server/dist/auth/sqlite/schema.js.map +1 -0
  41. package/server/dist/auth/sqlite/sqliteUserStore.d.ts +12 -0
  42. package/server/dist/auth/sqlite/sqliteUserStore.js +194 -0
  43. package/server/dist/auth/sqlite/sqliteUserStore.js.map +1 -0
  44. package/server/dist/auth/userStore.d.ts +19 -0
  45. package/server/dist/auth/userStore.js +26 -0
  46. package/server/dist/auth/userStore.js.map +1 -0
  47. package/server/dist/auth/userTypes.d.ts +13 -0
  48. package/server/dist/auth/userTypes.js +3 -0
  49. package/server/dist/auth/userTypes.js.map +1 -0
  50. package/server/dist/chat/attachmentPathRedaction.d.ts +5 -0
  51. package/server/dist/chat/attachmentPathRedaction.js +67 -0
  52. package/server/dist/chat/attachmentPathRedaction.js.map +1 -0
  53. package/server/dist/chat/chatItemEnricher.d.ts +5 -0
  54. package/server/dist/chat/chatItemEnricher.js +40 -0
  55. package/server/dist/chat/chatItemEnricher.js.map +1 -0
  56. package/server/dist/chat/codexEventProjector.d.ts +33 -0
  57. package/server/dist/chat/codexEventProjector.js +482 -0
  58. package/server/dist/chat/codexEventProjector.js.map +1 -0
  59. package/server/dist/chat/contextUsageProjector.d.ts +10 -0
  60. package/server/dist/chat/contextUsageProjector.js +472 -0
  61. package/server/dist/chat/contextUsageProjector.js.map +1 -0
  62. package/server/dist/chat/fileChangeExtractor.d.ts +5 -0
  63. package/server/dist/chat/fileChangeExtractor.js +121 -0
  64. package/server/dist/chat/fileChangeExtractor.js.map +1 -0
  65. package/server/dist/chat/markdown/markdownAst.d.ts +5 -0
  66. package/server/dist/chat/markdown/markdownAst.js +154 -0
  67. package/server/dist/chat/markdown/markdownAst.js.map +1 -0
  68. package/server/dist/chat/systemToolCallSummary.d.ts +10 -0
  69. package/server/dist/chat/systemToolCallSummary.js +112 -0
  70. package/server/dist/chat/systemToolCallSummary.js.map +1 -0
  71. package/server/dist/chat/terminal/terminalPlainText.d.ts +14 -0
  72. package/server/dist/chat/terminal/terminalPlainText.js +139 -0
  73. package/server/dist/chat/terminal/terminalPlainText.js.map +1 -0
  74. package/server/dist/chat/textMetrics.d.ts +9 -0
  75. package/server/dist/chat/textMetrics.js +24 -0
  76. package/server/dist/chat/textMetrics.js.map +1 -0
  77. package/server/dist/chat/threadTurnsProjector.d.ts +12 -0
  78. package/server/dist/chat/threadTurnsProjector.js +292 -0
  79. package/server/dist/chat/threadTurnsProjector.js.map +1 -0
  80. package/server/dist/chat/todoPlanProjector.d.ts +8 -0
  81. package/server/dist/chat/todoPlanProjector.js +94 -0
  82. package/server/dist/chat/todoPlanProjector.js.map +1 -0
  83. package/server/dist/chat/todoPlanTypes.d.ts +21 -0
  84. package/server/dist/chat/todoPlanTypes.js +3 -0
  85. package/server/dist/chat/todoPlanTypes.js.map +1 -0
  86. package/server/dist/chat/types.d.ts +138 -0
  87. package/server/dist/chat/types.js +3 -0
  88. package/server/dist/chat/types.js.map +1 -0
  89. package/server/dist/cli/configArg.d.ts +21 -0
  90. package/server/dist/cli/configArg.js +70 -0
  91. package/server/dist/cli/configArg.js.map +1 -0
  92. package/server/dist/codex/appServerProcess.d.ts +24 -0
  93. package/server/dist/codex/appServerProcess.js +56 -0
  94. package/server/dist/codex/appServerProcess.js.map +1 -0
  95. package/server/dist/codex/cliArgs.d.ts +17 -0
  96. package/server/dist/codex/cliArgs.js +34 -0
  97. package/server/dist/codex/cliArgs.js.map +1 -0
  98. package/server/dist/codex/codexAppServer.d.ts +103 -0
  99. package/server/dist/codex/codexAppServer.js +206 -0
  100. package/server/dist/codex/codexAppServer.js.map +1 -0
  101. package/server/dist/codex/jsonl.d.ts +4 -0
  102. package/server/dist/codex/jsonl.js +23 -0
  103. package/server/dist/codex/jsonl.js.map +1 -0
  104. package/server/dist/codex/jsonrpc.d.ts +43 -0
  105. package/server/dist/codex/jsonrpc.js +96 -0
  106. package/server/dist/codex/jsonrpc.js.map +1 -0
  107. package/server/dist/config/serverConfig.d.ts +150 -0
  108. package/server/dist/config/serverConfig.js +64 -0
  109. package/server/dist/config/serverConfig.js.map +1 -0
  110. package/server/dist/env.d.ts +101 -0
  111. package/server/dist/env.js +523 -0
  112. package/server/dist/env.js.map +1 -0
  113. package/server/dist/history/http/historyRoutes.d.ts +18 -0
  114. package/server/dist/history/http/historyRoutes.js +67 -0
  115. package/server/dist/history/http/historyRoutes.js.map +1 -0
  116. package/server/dist/history/index.d.ts +24 -0
  117. package/server/dist/history/index.js +30 -0
  118. package/server/dist/history/index.js.map +1 -0
  119. package/server/dist/history/ingest/historyIngestService.d.ts +15 -0
  120. package/server/dist/history/ingest/historyIngestService.js +42 -0
  121. package/server/dist/history/ingest/historyIngestService.js.map +1 -0
  122. package/server/dist/history/projector/extractIds.d.ts +36 -0
  123. package/server/dist/history/projector/extractIds.js +111 -0
  124. package/server/dist/history/projector/extractIds.js.map +1 -0
  125. package/server/dist/history/projector/projectCodexEvent.d.ts +27 -0
  126. package/server/dist/history/projector/projectCodexEvent.js +845 -0
  127. package/server/dist/history/projector/projectCodexEvent.js.map +1 -0
  128. package/server/dist/history/query/historyQueryService.d.ts +34 -0
  129. package/server/dist/history/query/historyQueryService.js +170 -0
  130. package/server/dist/history/query/historyQueryService.js.map +1 -0
  131. package/server/dist/history/sqlite/schema.d.ts +11 -0
  132. package/server/dist/history/sqlite/schema.js +34 -0
  133. package/server/dist/history/sqlite/schema.js.map +1 -0
  134. package/server/dist/history/sqlite/sqliteHistoryStore.d.ts +69 -0
  135. package/server/dist/history/sqlite/sqliteHistoryStore.js +206 -0
  136. package/server/dist/history/sqlite/sqliteHistoryStore.js.map +1 -0
  137. package/server/dist/history/types.d.ts +29 -0
  138. package/server/dist/history/types.js +3 -0
  139. package/server/dist/history/types.js.map +1 -0
  140. package/server/dist/index.d.ts +1 -0
  141. package/server/dist/index.js +166 -0
  142. package/server/dist/index.js.map +1 -0
  143. package/server/dist/security/executionPolicy.d.ts +33 -0
  144. package/server/dist/security/executionPolicy.js +72 -0
  145. package/server/dist/security/executionPolicy.js.map +1 -0
  146. package/server/dist/security/origin.d.ts +11 -0
  147. package/server/dist/security/origin.js +40 -0
  148. package/server/dist/security/origin.js.map +1 -0
  149. package/server/dist/settings/sqliteUserSettingsStore.d.ts +12 -0
  150. package/server/dist/settings/sqliteUserSettingsStore.js +62 -0
  151. package/server/dist/settings/sqliteUserSettingsStore.js.map +1 -0
  152. package/server/dist/settings/userSettingsRoutes.d.ts +8 -0
  153. package/server/dist/settings/userSettingsRoutes.js +55 -0
  154. package/server/dist/settings/userSettingsRoutes.js.map +1 -0
  155. package/server/dist/settings/userSettingsStore.d.ts +19 -0
  156. package/server/dist/settings/userSettingsStore.js +26 -0
  157. package/server/dist/settings/userSettingsStore.js.map +1 -0
  158. package/server/dist/settings/userSettingsTypes.d.ts +70 -0
  159. package/server/dist/settings/userSettingsTypes.js +196 -0
  160. package/server/dist/settings/userSettingsTypes.js.map +1 -0
  161. package/server/dist/status/codexTaskTracker.d.ts +21 -0
  162. package/server/dist/status/codexTaskTracker.js +123 -0
  163. package/server/dist/status/codexTaskTracker.js.map +1 -0
  164. package/server/dist/status/threadContextUsage.d.ts +19 -0
  165. package/server/dist/status/threadContextUsage.js +229 -0
  166. package/server/dist/status/threadContextUsage.js.map +1 -0
  167. package/server/dist/threadList/threadListServerCache.d.ts +10 -0
  168. package/server/dist/threadList/threadListServerCache.js +42 -0
  169. package/server/dist/threadList/threadListServerCache.js.map +1 -0
  170. package/server/dist/tools/cwdSuggest.d.ts +11 -0
  171. package/server/dist/tools/cwdSuggest.js +128 -0
  172. package/server/dist/tools/cwdSuggest.js.map +1 -0
  173. package/server/dist/workspace/accessControl.d.ts +16 -0
  174. package/server/dist/workspace/accessControl.js +82 -0
  175. package/server/dist/workspace/accessControl.js.map +1 -0
  176. package/server/dist/workspace/sqliteUserWorkspaceStore.d.ts +12 -0
  177. package/server/dist/workspace/sqliteUserWorkspaceStore.js +82 -0
  178. package/server/dist/workspace/sqliteUserWorkspaceStore.js.map +1 -0
  179. package/server/dist/workspace/threadAccess.d.ts +19 -0
  180. package/server/dist/workspace/threadAccess.js +22 -0
  181. package/server/dist/workspace/threadAccess.js.map +1 -0
  182. package/server/dist/workspace/threadListVisibility.d.ts +25 -0
  183. package/server/dist/workspace/threadListVisibility.js +104 -0
  184. package/server/dist/workspace/threadListVisibility.js.map +1 -0
  185. package/server/dist/workspace/userWorkspaceRoutes.d.ts +7 -0
  186. package/server/dist/workspace/userWorkspaceRoutes.js +124 -0
  187. package/server/dist/workspace/userWorkspaceRoutes.js.map +1 -0
  188. package/server/dist/workspace/userWorkspaceStore.d.ts +12 -0
  189. package/server/dist/workspace/userWorkspaceStore.js +23 -0
  190. package/server/dist/workspace/userWorkspaceStore.js.map +1 -0
  191. package/server/dist/ws/socketIoBridge.d.ts +32 -0
  192. package/server/dist/ws/socketIoBridge.js +194 -0
  193. package/server/dist/ws/socketIoBridge.js.map +1 -0
  194. package/server/dist/ws/types.d.ts +113 -0
  195. package/server/dist/ws/types.js +3 -0
  196. package/server/dist/ws/types.js.map +1 -0
  197. package/server/dist/ws/wsHub.d.ts +119 -0
  198. package/server/dist/ws/wsHub.js +1259 -0
  199. package/server/dist/ws/wsHub.js.map +1 -0
  200. package/web/dist/assets/index-CY6cnwQz.js +174 -0
  201. package/web/dist/assets/index-DI7kJHr2.css +32 -0
  202. package/web/dist/favicon-mask.svg +9 -0
  203. package/web/dist/favicon.svg +26 -0
  204. 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,11 @@
1
+ /**
2
+ * 仅依赖 `exec` 的 SQLite schema 初始化接口。
3
+ */
4
+ type SqliteExecDb = {
5
+ exec: (sql: string) => unknown;
6
+ };
7
+ /**
8
+ * 初始化认证与工作区设置相关表结构。
9
+ */
10
+ export declare function applyAuthSchema(db: SqliteExecDb): void;
11
+ export {};
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=userTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userTypes.js","sourceRoot":"","sources":["../../src/auth/userTypes.ts"],"names":[],"mappings":""}