@qnote/q-ai-note 1.0.5 → 1.0.7

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 (50) hide show
  1. package/README.md +41 -0
  2. package/dist/cli.js +55 -18
  3. package/dist/cli.js.map +1 -1
  4. package/dist/server/accessControl.d.ts +29 -0
  5. package/dist/server/accessControl.d.ts.map +1 -0
  6. package/dist/server/accessControl.js +161 -0
  7. package/dist/server/accessControl.js.map +1 -0
  8. package/dist/server/api/accessHelpers.d.ts +11 -0
  9. package/dist/server/api/accessHelpers.d.ts.map +1 -0
  10. package/dist/server/api/accessHelpers.js +45 -0
  11. package/dist/server/api/accessHelpers.js.map +1 -0
  12. package/dist/server/api/chat.d.ts.map +1 -1
  13. package/dist/server/api/chat.js +31 -0
  14. package/dist/server/api/chat.js.map +1 -1
  15. package/dist/server/api/diary.d.ts.map +1 -1
  16. package/dist/server/api/diary.js +61 -1
  17. package/dist/server/api/diary.js.map +1 -1
  18. package/dist/server/api/nodeEntities.d.ts.map +1 -1
  19. package/dist/server/api/nodeEntities.js +31 -0
  20. package/dist/server/api/nodeEntities.js.map +1 -1
  21. package/dist/server/api/projectSettings.d.ts +3 -0
  22. package/dist/server/api/projectSettings.d.ts.map +1 -0
  23. package/dist/server/api/projectSettings.js +29 -0
  24. package/dist/server/api/projectSettings.js.map +1 -0
  25. package/dist/server/api/sandbox.d.ts.map +1 -1
  26. package/dist/server/api/sandbox.js +35 -1
  27. package/dist/server/api/sandbox.js.map +1 -1
  28. package/dist/server/api/settings.d.ts.map +1 -1
  29. package/dist/server/api/settings.js +25 -1
  30. package/dist/server/api/settings.js.map +1 -1
  31. package/dist/server/api/workItem.d.ts.map +1 -1
  32. package/dist/server/api/workItem.js +59 -0
  33. package/dist/server/api/workItem.js.map +1 -1
  34. package/dist/server/config.d.ts +3 -2
  35. package/dist/server/config.d.ts.map +1 -1
  36. package/dist/server/config.js +6 -1
  37. package/dist/server/config.js.map +1 -1
  38. package/dist/server/index.d.ts +8 -2
  39. package/dist/server/index.d.ts.map +1 -1
  40. package/dist/server/index.js +102 -4
  41. package/dist/server/index.js.map +1 -1
  42. package/dist/server/projectConfig.d.ts +37 -0
  43. package/dist/server/projectConfig.d.ts.map +1 -0
  44. package/dist/server/projectConfig.js +180 -0
  45. package/dist/server/projectConfig.js.map +1 -0
  46. package/dist/web/app.js +760 -44
  47. package/dist/web/index.html +107 -60
  48. package/dist/web/styles.css +256 -11
  49. package/dist/web/vueRenderers.js +71 -57
  50. package/package.json +2 -2
@@ -0,0 +1,180 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { getResolvedDbPath } from './db.js';
4
+ const PROJECT_CONFIG_FILE = 'project-config.json';
5
+ function getProjectConfigPath() {
6
+ return path.join(getResolvedDbPath(), PROJECT_CONFIG_FILE);
7
+ }
8
+ function normalizePageAccess(value) {
9
+ const input = value && typeof value === 'object' ? value : {};
10
+ return {
11
+ sandboxes: Boolean(input.sandboxes),
12
+ diaries: Boolean(input.diaries),
13
+ changes: Boolean(input.changes),
14
+ settings: Boolean(input.settings),
15
+ };
16
+ }
17
+ function normalizeAccessLevel(value) {
18
+ const raw = String(value || '').trim();
19
+ if (raw === 'write' || raw === 'read' || raw === 'none')
20
+ return raw;
21
+ return 'none';
22
+ }
23
+ function normalizeIp(value) {
24
+ const raw = String(value || '').trim();
25
+ if (!raw)
26
+ return '';
27
+ if (raw.startsWith('::ffff:'))
28
+ return raw.slice(7);
29
+ return raw;
30
+ }
31
+ function defaultProjectConfig() {
32
+ return {
33
+ version: Date.now(),
34
+ users: [],
35
+ profiles: [
36
+ {
37
+ id: 'default-viewer',
38
+ name: '默认访客',
39
+ apply_to_all_users: true,
40
+ page_access: {
41
+ sandboxes: true,
42
+ diaries: true,
43
+ changes: true,
44
+ settings: false,
45
+ },
46
+ sandbox_access: {
47
+ all: 'read',
48
+ items: [],
49
+ },
50
+ },
51
+ ],
52
+ bindings: [],
53
+ };
54
+ }
55
+ export function normalizeProjectConfig(input) {
56
+ const raw = input && typeof input === 'object' ? input : {};
57
+ const usersRaw = Array.isArray(raw.users) ? raw.users : [];
58
+ const profilesRaw = Array.isArray(raw.profiles) ? raw.profiles : [];
59
+ const bindingsRaw = Array.isArray(raw.bindings) ? raw.bindings : [];
60
+ const users = usersRaw.map((row, idx) => {
61
+ const item = row && typeof row === 'object' ? row : {};
62
+ const id = String(item.id || '').trim() || `user-${idx + 1}`;
63
+ const name = String(item.name || '').trim() || id;
64
+ const ips = Array.isArray(item.ips)
65
+ ? item.ips.map((ip) => normalizeIp(ip)).filter((ip) => Boolean(ip) && !ip.includes('/'))
66
+ : [];
67
+ return { id, name, ips: Array.from(new Set(ips)) };
68
+ });
69
+ const profiles = profilesRaw.map((row, idx) => {
70
+ const item = row && typeof row === 'object' ? row : {};
71
+ const sandboxAccessRaw = item.sandbox_access && typeof item.sandbox_access === 'object'
72
+ ? item.sandbox_access
73
+ : {};
74
+ const itemsRaw = Array.isArray(sandboxAccessRaw.items) ? sandboxAccessRaw.items : [];
75
+ const items = itemsRaw.map((sub) => {
76
+ const entry = sub && typeof sub === 'object' ? sub : {};
77
+ return {
78
+ sandbox_id: String(entry.sandbox_id || '').trim(),
79
+ access: normalizeAccessLevel(entry.access),
80
+ };
81
+ }).filter((entry) => Boolean(entry.sandbox_id));
82
+ const id = String(item.id || '').trim() || `profile-${idx + 1}`;
83
+ const name = String(item.name || '').trim() || id;
84
+ return {
85
+ id,
86
+ name,
87
+ apply_to_all_users: Boolean(item.apply_to_all_users),
88
+ page_access: normalizePageAccess(item.page_access),
89
+ sandbox_access: {
90
+ all: normalizeAccessLevel(sandboxAccessRaw.all),
91
+ items,
92
+ },
93
+ };
94
+ });
95
+ const bindings = bindingsRaw.map((row) => {
96
+ const item = row && typeof row === 'object' ? row : {};
97
+ const profileIds = Array.isArray(item.profile_ids)
98
+ ? item.profile_ids.map((id) => String(id || '').trim()).filter((id) => Boolean(id))
99
+ : [];
100
+ return {
101
+ user_id: String(item.user_id || '').trim(),
102
+ profile_ids: Array.from(new Set(profileIds)),
103
+ };
104
+ }).filter((row) => Boolean(row.user_id));
105
+ const versionRaw = Number(raw.version);
106
+ const version = Number.isFinite(versionRaw) ? Math.floor(versionRaw) : Date.now();
107
+ return {
108
+ version,
109
+ users,
110
+ profiles: profiles.length ? profiles : defaultProjectConfig().profiles,
111
+ bindings,
112
+ };
113
+ }
114
+ export function validateProjectConfig(config) {
115
+ const errors = [];
116
+ const userIdSet = new Set();
117
+ const profileIdSet = new Set();
118
+ const ipOwner = new Map();
119
+ for (const user of config.users) {
120
+ if (userIdSet.has(user.id)) {
121
+ errors.push(`用户 ID 重复: ${user.id}`);
122
+ }
123
+ userIdSet.add(user.id);
124
+ for (const ip of user.ips) {
125
+ if (ipOwner.has(ip)) {
126
+ errors.push(`IP 不能被多个用户复用: ${ip}`);
127
+ }
128
+ else {
129
+ ipOwner.set(ip, user.id);
130
+ }
131
+ }
132
+ }
133
+ for (const profile of config.profiles) {
134
+ if (profileIdSet.has(profile.id)) {
135
+ errors.push(`Profile ID 重复: ${profile.id}`);
136
+ }
137
+ profileIdSet.add(profile.id);
138
+ }
139
+ for (const binding of config.bindings) {
140
+ if (!userIdSet.has(binding.user_id)) {
141
+ errors.push(`绑定了不存在的用户: ${binding.user_id}`);
142
+ }
143
+ for (const profileId of binding.profile_ids) {
144
+ if (!profileIdSet.has(profileId)) {
145
+ errors.push(`绑定了不存在的 Profile: ${profileId}`);
146
+ }
147
+ }
148
+ }
149
+ return errors;
150
+ }
151
+ export function readProjectConfig() {
152
+ const configPath = getProjectConfigPath();
153
+ try {
154
+ if (!fs.existsSync(configPath)) {
155
+ return defaultProjectConfig();
156
+ }
157
+ const text = fs.readFileSync(configPath, 'utf-8');
158
+ const json = JSON.parse(text);
159
+ return normalizeProjectConfig(json);
160
+ }
161
+ catch {
162
+ return defaultProjectConfig();
163
+ }
164
+ }
165
+ export function saveProjectConfig(input) {
166
+ const normalized = normalizeProjectConfig(input);
167
+ normalized.version = Date.now();
168
+ const errors = validateProjectConfig(normalized);
169
+ if (errors.length > 0) {
170
+ throw new Error(errors.join('; '));
171
+ }
172
+ const configPath = getProjectConfigPath();
173
+ fs.mkdirSync(path.dirname(configPath), { recursive: true });
174
+ fs.writeFileSync(configPath, JSON.stringify(normalized, null, 2));
175
+ return normalized;
176
+ }
177
+ export function getProjectConfigPathForDebug() {
178
+ return getProjectConfigPath();
179
+ }
180
+ //# sourceMappingURL=projectConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectConfig.js","sourceRoot":"","sources":["../../src/server/projectConfig.ts"],"names":[],"mappings":"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"}