@hiai-gg/hiai-docs 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 (216) hide show
  1. package/.all-contributorsrc +18 -0
  2. package/.claude/settings.local.json +61 -0
  3. package/.dockerignore +113 -0
  4. package/.env.example +68 -0
  5. package/.github/FUNDING.yml +5 -0
  6. package/.github/ISSUE_TEMPLATE/bug_report.md +74 -0
  7. package/.github/ISSUE_TEMPLATE/feature_request.md +78 -0
  8. package/.github/dependabot.yml +136 -0
  9. package/.github/pull_request_template.md +96 -0
  10. package/.github/workflows/ci.yml +283 -0
  11. package/AGENTS.md +237 -0
  12. package/CODE_OF_CONDUCT.md +134 -0
  13. package/CONTRIBUTING.md +77 -0
  14. package/Caddyfile +50 -0
  15. package/Dockerfile.backend +60 -0
  16. package/LICENSE +21 -0
  17. package/README.md +284 -0
  18. package/RELEASE_CHECKLIST.md +34 -0
  19. package/SECURITY.md +60 -0
  20. package/backend/package.json +43 -0
  21. package/backend/src/__tests__/auth-helpers.test.ts +51 -0
  22. package/backend/src/__tests__/chunker.test.ts +65 -0
  23. package/backend/src/__tests__/config.test.ts +91 -0
  24. package/backend/src/__tests__/csrf.test.ts +91 -0
  25. package/backend/src/__tests__/embedding.test.ts +48 -0
  26. package/backend/src/__tests__/rate-limit.test.ts +46 -0
  27. package/backend/src/__tests__/routes.test.ts +38 -0
  28. package/backend/src/__tests__/schema.test.ts +31 -0
  29. package/backend/src/__tests__/validation.test.ts +556 -0
  30. package/backend/src/api/middleware/auth.ts +56 -0
  31. package/backend/src/api/middleware/csrf.ts +91 -0
  32. package/backend/src/api/middleware/rate-limit.ts +77 -0
  33. package/backend/src/api/middleware/webhook-verify.ts +22 -0
  34. package/backend/src/api/routes/attachments.ts +280 -0
  35. package/backend/src/api/routes/auth.ts +52 -0
  36. package/backend/src/api/routes/collaboration.ts +121 -0
  37. package/backend/src/api/routes/documents.ts +664 -0
  38. package/backend/src/api/routes/folders.ts +226 -0
  39. package/backend/src/api/routes/search.ts +354 -0
  40. package/backend/src/api/routes/share.ts +512 -0
  41. package/backend/src/api/routes/tags.ts +247 -0
  42. package/backend/src/api/routes/versions.ts +99 -0
  43. package/backend/src/api/routes/webhooks.ts +43 -0
  44. package/backend/src/embedding/chunker.ts +74 -0
  45. package/backend/src/embedding/index.ts +117 -0
  46. package/backend/src/embedding/providers/ollama.ts +63 -0
  47. package/backend/src/embedding/providers/openrouter.ts +71 -0
  48. package/backend/src/embedding/utils.ts +13 -0
  49. package/backend/src/embedding/worker.ts +89 -0
  50. package/backend/src/index.ts +147 -0
  51. package/backend/src/lib/auth-helpers.ts +27 -0
  52. package/backend/src/lib/auth.ts +35 -0
  53. package/backend/src/lib/config.ts +73 -0
  54. package/backend/src/lib/db.ts +7 -0
  55. package/backend/src/lib/embedding-queue.ts +12 -0
  56. package/backend/src/lib/logger.ts +18 -0
  57. package/backend/src/lib/markdown-to-doc.ts +45 -0
  58. package/backend/src/lib/minio.ts +46 -0
  59. package/backend/src/lib/redis.ts +19 -0
  60. package/backend/src/lib/yjs-provider.ts +182 -0
  61. package/backend/tests/integration/_harness.ts +754 -0
  62. package/backend/tests/integration/auth.test.ts +296 -0
  63. package/backend/tests/integration/routes.documents.test.ts +459 -0
  64. package/backend/tests/integration/routes.folders.test.ts +337 -0
  65. package/backend/tests/integration/routes.search.test.ts +322 -0
  66. package/backend/tests/integration/routes.share.test.ts +773 -0
  67. package/backend/tests/integration/routes.tags.test.ts +425 -0
  68. package/backend/tests/integration/routes.versions.test.ts +233 -0
  69. package/backend/tsconfig.json +18 -0
  70. package/docker-compose.yml +218 -0
  71. package/docs/API.md +328 -0
  72. package/docs/ARCHITECTURE.md +75 -0
  73. package/docs/DEPLOYMENT.md +113 -0
  74. package/docs/PRODUCTION_STATUS.md +61 -0
  75. package/docs/openapi.json +385 -0
  76. package/frontend/.svelte-kit.old/ambient.d.ts +230 -0
  77. package/frontend/.svelte-kit.old/env.d.ts +1 -0
  78. package/frontend/.svelte-kit.old/generated/client/app.js +46 -0
  79. package/frontend/.svelte-kit.old/generated/client/matchers.js +1 -0
  80. package/frontend/.svelte-kit.old/generated/client/nodes/0.js +3 -0
  81. package/frontend/.svelte-kit.old/generated/client/nodes/1.js +1 -0
  82. package/frontend/.svelte-kit.old/generated/client/nodes/10.js +3 -0
  83. package/frontend/.svelte-kit.old/generated/client/nodes/2.js +1 -0
  84. package/frontend/.svelte-kit.old/generated/client/nodes/3.js +1 -0
  85. package/frontend/.svelte-kit.old/generated/client/nodes/4.js +1 -0
  86. package/frontend/.svelte-kit.old/generated/client/nodes/5.js +3 -0
  87. package/frontend/.svelte-kit.old/generated/client/nodes/6.js +1 -0
  88. package/frontend/.svelte-kit.old/generated/client/nodes/7.js +3 -0
  89. package/frontend/.svelte-kit.old/generated/client/nodes/8.js +1 -0
  90. package/frontend/.svelte-kit.old/generated/client/nodes/9.js +3 -0
  91. package/frontend/.svelte-kit.old/generated/root.js +3 -0
  92. package/frontend/.svelte-kit.old/generated/root.svelte +80 -0
  93. package/frontend/.svelte-kit.old/generated/server/internal.js +55 -0
  94. package/frontend/.svelte-kit.old/non-ambient.d.ts +59 -0
  95. package/frontend/.svelte-kit.old/tsconfig.json +59 -0
  96. package/frontend/.svelte-kit.old/types/route_meta_data.json +40 -0
  97. package/frontend/.svelte-kit.old/types/src/routes/$types.d.ts +21 -0
  98. package/frontend/.svelte-kit.old/types/src/routes/(app)/$types.d.ts +30 -0
  99. package/frontend/.svelte-kit.old/types/src/routes/(app)/docs/[id]/$types.d.ts +27 -0
  100. package/frontend/.svelte-kit.old/types/src/routes/(app)/docs/[id]/proxy+page.ts +25 -0
  101. package/frontend/.svelte-kit.old/types/src/routes/api/[...path]/$types.d.ts +10 -0
  102. package/frontend/.svelte-kit.old/types/src/routes/folders/[id]/$types.d.ts +27 -0
  103. package/frontend/.svelte-kit.old/types/src/routes/folders/[id]/proxy+page.ts +15 -0
  104. package/frontend/.svelte-kit.old/types/src/routes/login/$types.d.ts +17 -0
  105. package/frontend/.svelte-kit.old/types/src/routes/register/$types.d.ts +17 -0
  106. package/frontend/.svelte-kit.old/types/src/routes/s/[token]/$types.d.ts +20 -0
  107. package/frontend/.svelte-kit.old/types/src/routes/s/[token]/proxy+page.ts +6 -0
  108. package/frontend/.svelte-kit.old/types/src/routes/search/$types.d.ts +19 -0
  109. package/frontend/.svelte-kit.old/types/src/routes/search/proxy+page.ts +26 -0
  110. package/frontend/.svelte-kit.old/types/src/routes/settings/$types.d.ts +17 -0
  111. package/frontend/Dockerfile +44 -0
  112. package/frontend/biome.json +40 -0
  113. package/frontend/components.json +18 -0
  114. package/frontend/messages/en.json +434 -0
  115. package/frontend/package.json +70 -0
  116. package/frontend/project.inlang/settings.json +12 -0
  117. package/frontend/src/app.css +6 -0
  118. package/frontend/src/app.d.ts +13 -0
  119. package/frontend/src/app.html +30 -0
  120. package/frontend/src/hooks.server.ts +10 -0
  121. package/frontend/src/hooks.ts +10 -0
  122. package/frontend/src/lib/api/attachments.ts +45 -0
  123. package/frontend/src/lib/api/client.test.ts +15 -0
  124. package/frontend/src/lib/api/client.ts +57 -0
  125. package/frontend/src/lib/api/documents.ts +83 -0
  126. package/frontend/src/lib/api/folders.ts +180 -0
  127. package/frontend/src/lib/api/search.test.ts +52 -0
  128. package/frontend/src/lib/api/search.ts +128 -0
  129. package/frontend/src/lib/api/settings.ts +95 -0
  130. package/frontend/src/lib/api/share.ts +71 -0
  131. package/frontend/src/lib/api/tags.test.ts +91 -0
  132. package/frontend/src/lib/api/tags.ts +87 -0
  133. package/frontend/src/lib/auth-client.ts +10 -0
  134. package/frontend/src/lib/collaboration.ts +63 -0
  135. package/frontend/src/lib/components/AttachmentUpload.svelte +110 -0
  136. package/frontend/src/lib/components/DatePicker.svelte +322 -0
  137. package/frontend/src/lib/components/DocumentCard.svelte +166 -0
  138. package/frontend/src/lib/components/EmptyState.svelte +49 -0
  139. package/frontend/src/lib/components/FolderCard.svelte +93 -0
  140. package/frontend/src/lib/components/ScrollToTop.svelte +72 -0
  141. package/frontend/src/lib/components/SearchBar.svelte +47 -0
  142. package/frontend/src/lib/components/SearchResult.svelte +115 -0
  143. package/frontend/src/lib/components/SettingsDialog.svelte +271 -0
  144. package/frontend/src/lib/components/ShareDialog.svelte +158 -0
  145. package/frontend/src/lib/components/ShareLink.svelte +98 -0
  146. package/frontend/src/lib/components/TagCreateDialog.svelte +284 -0
  147. package/frontend/src/lib/components/VersionDiff.svelte +55 -0
  148. package/frontend/src/lib/components/VersionHistory.svelte +96 -0
  149. package/frontend/src/lib/components/editor/DocumentTitle.svelte +87 -0
  150. package/frontend/src/lib/components/editor/EditorToolbar.svelte +1367 -0
  151. package/frontend/src/lib/components/editor/HiAiEditor.svelte +531 -0
  152. package/frontend/src/lib/components/editor/LinkDialog.svelte +134 -0
  153. package/frontend/src/lib/components/editor/MarkdownToggle.svelte +88 -0
  154. package/frontend/src/lib/components/editor/editorExtensions.ts +53 -0
  155. package/frontend/src/lib/components/editor/markdown.ts +38 -0
  156. package/frontend/src/lib/components/sidebar/FolderTree.svelte +731 -0
  157. package/frontend/src/lib/components/sidebar/RecentDocs.svelte +311 -0
  158. package/frontend/src/lib/components/sidebar/Sidebar.svelte +156 -0
  159. package/frontend/src/lib/components/sidebar/TagList.svelte +200 -0
  160. package/frontend/src/lib/components/ui/confirm-dialog/ConfirmDialog.svelte +76 -0
  161. package/frontend/src/lib/components/ui/confirm-dialog/index.ts +1 -0
  162. package/frontend/src/lib/stores/tag-store.svelte.ts +56 -0
  163. package/frontend/src/lib/stores/theme.svelte.ts +97 -0
  164. package/frontend/src/lib/svelte.d.ts +6 -0
  165. package/frontend/src/lib/types.ts +44 -0
  166. package/frontend/src/lib/utils/clipboard.ts +17 -0
  167. package/frontend/src/lib/utils/strip-markdown.ts +59 -0
  168. package/frontend/src/lib/utils.ts +33 -0
  169. package/frontend/src/routes/(app)/+layout.svelte +17 -0
  170. package/frontend/src/routes/(app)/+page.server.ts +10 -0
  171. package/frontend/src/routes/(app)/+page.svelte +303 -0
  172. package/frontend/src/routes/(app)/docs/[id]/+page.server.ts +10 -0
  173. package/frontend/src/routes/(app)/docs/[id]/+page.svelte +1108 -0
  174. package/frontend/src/routes/(app)/docs/[id]/+page.ts +24 -0
  175. package/frontend/src/routes/(app)/search/+page.svelte +593 -0
  176. package/frontend/src/routes/(app)/search/+page.ts +25 -0
  177. package/frontend/src/routes/+error.svelte +12 -0
  178. package/frontend/src/routes/+layout.svelte +18 -0
  179. package/frontend/src/routes/+layout.ts +2 -0
  180. package/frontend/src/routes/api/[...path]/+server.ts +111 -0
  181. package/frontend/src/routes/folders/[id]/+page.server.ts +10 -0
  182. package/frontend/src/routes/folders/[id]/+page.svelte +319 -0
  183. package/frontend/src/routes/folders/[id]/+page.ts +14 -0
  184. package/frontend/src/routes/login/+page.svelte +90 -0
  185. package/frontend/src/routes/register/+page.svelte +97 -0
  186. package/frontend/src/routes/s/[token]/+page.svelte +496 -0
  187. package/frontend/src/routes/s/[token]/+page.ts +5 -0
  188. package/frontend/src/routes/settings/+page.svelte +175 -0
  189. package/frontend/static/favicon.png +0 -0
  190. package/frontend/static/logo.png +0 -0
  191. package/frontend/svelte.config.js +15 -0
  192. package/frontend/tsconfig.json +15 -0
  193. package/frontend/vite.config.ts +25 -0
  194. package/init.sql +9 -0
  195. package/logo.png +0 -0
  196. package/package.json +39 -0
  197. package/package.public.json +39 -0
  198. package/packages/db/drizzle.config.ts +10 -0
  199. package/packages/db/package.json +30 -0
  200. package/packages/db/src/client.ts +9 -0
  201. package/packages/db/src/index.ts +2 -0
  202. package/packages/db/src/migrations/0000_nice_bedlam.sql +165 -0
  203. package/packages/db/src/migrations/0001_w2_3_test.sql +5 -0
  204. package/packages/db/src/migrations/0002_rename_content_json.sql +2 -0
  205. package/packages/db/src/migrations/meta/0000_snapshot.json +1331 -0
  206. package/packages/db/src/migrations/meta/0001_snapshot.json +1399 -0
  207. package/packages/db/src/migrations/meta/0002_snapshot.json +1399 -0
  208. package/packages/db/src/migrations/meta/_journal.json +27 -0
  209. package/packages/db/src/schema.ts +378 -0
  210. package/packages/db/tsconfig.json +17 -0
  211. package/scripts/export-openapi.ts +37 -0
  212. package/scripts/health-check.sh +75 -0
  213. package/scripts/migrate.sh +135 -0
  214. package/scripts/prework_backup.sh +25 -0
  215. package/scripts/release.sh +83 -0
  216. package/tsconfig.json +25 -0
@@ -0,0 +1,434 @@
1
+ {
2
+ "$schema": "https://inlang.com/schema/message-format",
3
+ "app_name": "HiAi-Docs",
4
+ "app_description": "AI-first documentation platform",
5
+
6
+ "nav_dashboard": "Dashboard",
7
+ "nav_documents": "Documents",
8
+ "nav_folders": "Folders",
9
+ "nav_tags": "Tags",
10
+ "nav_search": "Search",
11
+ "nav_settings": "Settings",
12
+ "nav_logout": "Log out",
13
+
14
+ "dashboard_title": "Dashboard",
15
+ "dashboard_subtitle": "Your recent documents and quick access",
16
+ "dashboard_new_document": "New Document",
17
+ "dashboard_loading": "Loading...",
18
+ "dashboard_error_title": "Could not load documents",
19
+ "dashboard_error_retry": "Retry",
20
+ "dashboard_empty_title": "Create your first document",
21
+ "dashboard_empty_description": "Get started by creating a new document. Your notes will be automatically embedded for AI-powered search.",
22
+ "dashboard_page_title": "Dashboard - HiAi-Docs",
23
+
24
+ "doc_title_placeholder": "Untitled",
25
+ "doc_title_label": "Document title",
26
+ "doc_content_placeholder": "Start writing...",
27
+ "doc_delete_confirm": "Are you sure you want to delete this document?",
28
+ "doc_delete_success": "Document deleted",
29
+ "doc_save_success": "Document saved",
30
+ "doc_create_success": "Document created",
31
+ "doc_not_found": "Document not found",
32
+ "doc_load_error": "Failed to load document",
33
+ "doc_tags": "Tags",
34
+ "doc_versions": "Versions",
35
+ "doc_share": "Share",
36
+ "doc_delete": "Delete",
37
+ "doc_last_edited": "Last edited",
38
+ "doc_words": "words",
39
+ "doc_chars": "characters",
40
+ "doc_updated": "Updated {time}",
41
+ "doc_open_menu": "Open menu",
42
+ "doc_open": "Open",
43
+ "doc_duplicate": "Duplicate",
44
+ "doc_move_to_folder": "Move to folder",
45
+
46
+ "folders_title": "Folders",
47
+ "folders_subtitle": "Organize your documents into folders",
48
+ "folders_new": "New Folder",
49
+ "folders_empty": "No folders yet",
50
+ "folders_empty_description": "Create a folder to organize your documents.",
51
+ "folders_rename": "Rename",
52
+ "folders_delete": "Delete",
53
+ "folders_delete_confirm": "Delete this folder and all its contents?",
54
+ "folders_delete_title": "Delete folder",
55
+ "folders_delete_description": "Delete this folder and all its contents? This cannot be undone.",
56
+ "folders_name_placeholder": "Folder name",
57
+ "folders_documents": "documents",
58
+ "folders_document": "document",
59
+ "folders_subfolders": "subfolders",
60
+ "folders_move": "Move",
61
+
62
+ "tags_title": "Tags",
63
+ "tags_subtitle": "Organize documents with tags",
64
+ "tags_new": "New Tag",
65
+ "tags_edit": "Edit Tag",
66
+ "tags_empty": "No tags yet",
67
+ "tags_empty_description": "Create tags to categorize your documents.",
68
+ "tags_name_placeholder": "Tag name",
69
+ "tags_color": "Color",
70
+ "tags_documents_count": "{count} documents",
71
+ "tags_delete_confirm": "Delete this tag?",
72
+ "tags_delete_title": "Delete tag",
73
+ "tags_delete_description": "Are you sure you want to delete this tag? This cannot be undone.",
74
+ "tags_create_new": "New tag",
75
+ "tags_already_exists": "A tag with this name already exists",
76
+ "tags_add": "add",
77
+
78
+ "search_title": "Search",
79
+ "search_placeholder": "Search documents...",
80
+ "search_placeholder_shortcut": "Search documents...",
81
+ "search_no_results": "No results found",
82
+ "search_no_results_description": "Try different keywords or check your spelling.",
83
+ "search_filters": "Filters",
84
+ "search_folder": "Folder",
85
+ "search_tags": "Tags",
86
+ "search_date_from": "From",
87
+ "search_date_to": "To",
88
+ "search_clear_filters": "Clear filters",
89
+ "search_results_count": "{count} results",
90
+ "search_suggestions": "Suggestions",
91
+ "search_relevance": "Relevance",
92
+
93
+ "share_create_title": "Create Share Link",
94
+ "share_create_link": "Create share link",
95
+ "share_creating": "Creating...",
96
+ "share_password": "Password (optional)",
97
+ "share_password_protection": "Password protection",
98
+ "share_toggle_password": "Toggle password protection",
99
+ "share_enter_password": "Enter password",
100
+ "share_password_label": "Password",
101
+ "share_expires": "Expiration",
102
+ "share_expires_never": "Never",
103
+ "share_expires_1h": "1 hour",
104
+ "share_expires_1d": "1 day",
105
+ "share_expires_24h": "24 hours",
106
+ "share_expires_7d": "7 days",
107
+ "share_expires_30d": "30 days",
108
+ "share_guest_access": "Guest access",
109
+ "share_guests": "Guests:",
110
+ "share_add": "Add",
111
+ "share_copy_link": "Copy Link",
112
+ "share_copy": "Copy",
113
+ "share_link_copied": "Link copied!",
114
+ "share_link_created": "Share link created!",
115
+ "share_password_required": "Password required",
116
+ "share_invalid_password": "Invalid password",
117
+ "share_expired": "This link has expired",
118
+ "share_expired_label": "Expired",
119
+ "share_never_expires": "Never expires",
120
+ "share_expires_date": "Expires {date}",
121
+ "share_not_found": "Share link not found",
122
+ "share_rate_limited": "Too many requests. Please try again later.",
123
+ "share_guest_label": "Guest",
124
+ "share_read_only": "Read-only",
125
+ "share_revoke_link": "Revoke link",
126
+ "share_revoke_confirm": "Revoke this link?",
127
+ "share_yes": "Yes",
128
+
129
+ "settings_title": "Settings",
130
+ "settings_profile": "Profile",
131
+ "settings_account": "Account",
132
+ "settings_appearance": "Appearance",
133
+ "settings_language": "Language",
134
+ "settings_theme": "Theme",
135
+ "settings_theme_light": "Light",
136
+ "settings_theme_dark": "Dark",
137
+ "settings_theme_system": "System",
138
+ "theme_light": "Light",
139
+ "theme_dark": "Dark",
140
+ "theme_system": "System",
141
+ "settings_email": "Email",
142
+ "settings_name": "Name",
143
+ "settings_save": "Save changes",
144
+ "settings_saved": "Settings saved",
145
+ "settings_change_password": "Change password",
146
+ "password_label": "Password",
147
+ "new_password": "New password",
148
+ "confirm_password": "Confirm password",
149
+ "change_password": "Change password",
150
+ "settings_delete_account": "Delete account",
151
+ "settings_delete_account_confirm": "This action is permanent. Are you sure?",
152
+
153
+ "auth_login": "Log in",
154
+ "auth_signup": "Sign up",
155
+ "auth_email": "Email",
156
+ "auth_password": "Password",
157
+ "auth_confirm_password": "Confirm password",
158
+ "auth_forgot_password": "Forgot password?",
159
+ "auth_no_account": "Don't have an account?",
160
+ "auth_has_account": "Already have an account?",
161
+ "auth_login_error": "Invalid email or password",
162
+ "auth_signup_error": "Registration failed",
163
+ "auth_password_mismatch": "Passwords do not match",
164
+ "auth_email_required": "Email is required",
165
+ "auth_password_required": "Password is required",
166
+ "auth_password_min": "Password must be at least 8 characters",
167
+ "auth_name_placeholder": "Your name",
168
+ "auth_logout": "Log out",
169
+
170
+ "error_generic": "Something went wrong",
171
+ "error_not_found": "Page not found",
172
+ "error_unauthorized": "You need to log in to access this page",
173
+ "error_forbidden": "You don't have permission to access this page",
174
+ "error_network": "Network error. Please check your connection.",
175
+ "error_timeout": "Request timed out. Please try again.",
176
+ "error_server": "Server error. Please try again later.",
177
+
178
+ "action_save": "Save",
179
+ "action_cancel": "Cancel",
180
+ "action_delete": "Delete",
181
+ "action_edit": "Edit",
182
+ "action_create": "Create",
183
+ "action_close": "Close",
184
+ "action_confirm": "Confirm",
185
+ "action_back": "Back",
186
+ "action_done": "Done",
187
+ "action_loading": "Loading...",
188
+
189
+ "time_just_now": "just now",
190
+ "time_minutes_ago": "{count}m ago",
191
+ "time_hours_ago": "{count}h ago",
192
+ "time_days_ago": "{count}d ago",
193
+ "time_weeks_ago": "{count}w ago",
194
+
195
+ "sidebar_new_doc": "New Document",
196
+ "sidebar_recent": "Recent",
197
+ "sidebar_all_documents": "All Documents",
198
+ "sidebar_folders": "Docs",
199
+ "sidebar_tags": "Tags",
200
+ "sidebar_settings": "Settings",
201
+ "sidebar_search_placeholder": "Search...",
202
+
203
+ "editor_toolbar_bold": "Bold",
204
+ "editor_toolbar_italic": "Italic",
205
+ "editor_toolbar_underline": "Underline",
206
+ "editor_toolbar_code": "Code",
207
+ "editor_toolbar_link": "Link",
208
+ "editor_toolbar_image": "Image",
209
+ "editor_toolbar_bullet_list": "Bullet list",
210
+ "editor_toolbar_ordered_list": "Numbered list",
211
+ "editor_toolbar_list": "List",
212
+ "editor_toolbar_heading": "Heading",
213
+ "editor_toolbar_paragraph": "Paragraph",
214
+ "editor_toolbar_heading_1": "Heading 1",
215
+ "editor_toolbar_heading_2": "Heading 2",
216
+ "editor_toolbar_heading_3": "Heading 3",
217
+ "editor_toolbar_blockquote": "Quote",
218
+ "editor_toolbar_code_block": "Code block",
219
+ "editor_toolbar_horizontal_rule": "Divider",
220
+ "editor_toolbar_undo": "Undo",
221
+ "editor_toolbar_redo": "Redo",
222
+ "editor_toolbar_highlight": "Highlight",
223
+ "editor_toolbar_text_formatting": "Text formatting",
224
+ "editor_toolbar_emoji": "Emoji",
225
+ "editor_toolbar_align": "Align",
226
+ "editor_toolbar_align_left": "Align left",
227
+ "editor_toolbar_align_center": "Align center",
228
+ "editor_toolbar_align_right": "Align right",
229
+ "editor_toolbar_align_justify": "Align justify",
230
+ "editor_toolbar_copy": "Copy content",
231
+ "editor_toolbar_copied": "Copied to clipboard",
232
+ "editor_enter_url": "Enter URL:",
233
+ "editor_content_label": "Document content editor",
234
+ "editor_markdown_placeholder": "Write Markdown here...",
235
+ "editor_markdown_label": "Raw Markdown editor",
236
+
237
+ "version_history_title": "Version History",
238
+ "version_current": "Current version",
239
+ "version_restore": "Restore this version",
240
+ "version_restore_short": "Restore",
241
+ "version_restore_confirm": "Restore this version? Current content will be saved as a new version.",
242
+
243
+ "attachment_drop_here": "Drop file here or click to upload",
244
+ "attachment_types_hint": "Images, PDF, Markdown, Text - Max 10MB",
245
+ "attachment_file_too_large": "File too large ({size}). Max 10MB.",
246
+ "attachment_remove": "Remove",
247
+
248
+ "login_title": "Welcome back",
249
+ "login_subtitle": "Enter your credentials to access your documents",
250
+ "login_submit": "Sign in",
251
+ "login_loading": "Signing in...",
252
+ "login_or": "or",
253
+ "login_demo_hint": "Demo mode - use any email/password to sign in",
254
+ "login_page_title": "Login - HiAi-Docs",
255
+
256
+ "register_title": "Create account",
257
+ "register_subtitle": "Get started with HiAi-Docs",
258
+ "register_loading": "Creating account...",
259
+ "register_page_title": "Register - HiAi-Docs",
260
+
261
+ "breadcrumb_home": "Home",
262
+ "aria_breadcrumb": "Breadcrumb",
263
+
264
+ "editor_status_saved": "Saved",
265
+ "editor_status_saving": "Saving...",
266
+ "editor_status_unsaved": "Unsaved",
267
+ "editor_mode_label": "Editor mode",
268
+ "editor_wysiwyg_title": "WYSIWYG editor",
269
+ "editor_wysiwyg_mode_label": "WYSIWYG mode",
270
+ "editor_markdown_title": "Raw Markdown",
271
+ "editor_markdown_mode_label": "Markdown mode",
272
+ "editor_share_label": "Share document",
273
+ "editor_more_options": "More options",
274
+ "editor_export_md": "Export as .md",
275
+
276
+ "action_copy_link": "Copy link",
277
+ "action_copy_content": "Copy content",
278
+
279
+ "error_dismiss": "Dismiss error",
280
+
281
+ "doc_delete_confirm_hard": "Delete this document? This cannot be undone.",
282
+ "doc_save_content_error": "Failed to save content",
283
+ "doc_save_title_error": "Failed to save title",
284
+ "doc_delete_error": "Failed to delete document",
285
+ "doc_page_title": "{title} - HiAi-Docs",
286
+ "tags_load_error": "Failed to load tags",
287
+ "tag_add_error": "Failed to add tag",
288
+ "tag_remove_error": "Failed to remove tag",
289
+ "tag_add_label": "Add tag",
290
+ "tag_remove_label": "Remove tag",
291
+ "tag_no_tags_available": "No tags available",
292
+ "tag_drop_aria": "Tag menu",
293
+
294
+ "folder_click_to_rename": "Click to rename",
295
+ "folder_new_subfolder": "New Subfolder",
296
+ "folder_empty_title": "This folder is empty",
297
+ "folder_empty_description": "Create a document or subfolder to get started",
298
+ "folder_page_title": "{name} - HiAi-Docs",
299
+
300
+ "sort_name": "Name",
301
+ "sort_date_modified": "Date modified",
302
+ "sort_date_created": "Date created",
303
+
304
+ "share_page_title": "Shared Content - HiAi-Docs",
305
+ "share_load_error": "Failed to load shared content",
306
+ "share_network_error": "Network error",
307
+ "share_go_home": "Go to homepage",
308
+ "share_password_placeholder": "Enter password",
309
+ "share_access_button": "Access content",
310
+ "share_password_incorrect": "Incorrect password. Please try again.",
311
+ "share_via_label": "Shared via HiAi-Docs",
312
+ "share_copied": "Copied",
313
+ "share_empty_document": "Empty document",
314
+ "share_folder_empty": "This folder is empty",
315
+
316
+ "settings_page_title": "Settings - HiAi-Docs",
317
+ "settings_tab_embedding": "Embedding",
318
+ "settings_tab_danger": "Danger",
319
+ "settings_saving": "Saving...",
320
+ "settings_saved_status": "Saved!",
321
+ "settings_embedding_title": "Embedding Configuration",
322
+ "settings_embedding_provider": "Provider",
323
+ "settings_embedding_provider_ollama": "Ollama (local)",
324
+ "settings_embedding_provider_openrouter": "OpenRouter",
325
+ "settings_embedding_provider_voyage": "Voyage AI",
326
+ "settings_embedding_model": "Model",
327
+ "settings_embedding_save": "Save config",
328
+ "settings_dark_mode": "Dark mode",
329
+ "settings_dark_mode_description": "Toggle dark theme",
330
+ "settings_toggle_dark_mode": "Toggle dark mode",
331
+ "settings_danger_title": "Danger Zone",
332
+ "settings_danger_description": "Permanently delete your account and all associated data. This action cannot be undone.",
333
+ "settings_delete_confirm_text": "Are you sure?",
334
+ "settings_delete_confirm_yes": "Yes, delete",
335
+ "settings_delete_failed": "Failed to delete account",
336
+
337
+ "search_title_with_query": "Search: {query}",
338
+ "search_input_placeholder": "Search documents by title, content, or tags...",
339
+ "search_clear": "Clear search",
340
+ "search_toggle_filters": "Toggle filters",
341
+ "search_close_filters": "Close filters",
342
+ "search_clear_all_filters": "Clear all filters",
343
+ "search_folders": "Folders",
344
+ "search_date_range": "Date range",
345
+ "search_searching": "Searching...",
346
+ "search_result_for": "{count} result for",
347
+ "search_results_for": "{count} results for",
348
+ "search_pages_aria": "Search results pages",
349
+ "search_previous_page": "Previous page",
350
+ "search_next_page": "Next page",
351
+ "search_page_number": "Page {num}",
352
+ "search_no_results_query": "We couldn't find anything matching \"{query}\".",
353
+ "search_no_results_tip": "Try different keywords, check your spelling, or broaden your search.",
354
+ "search_new_search": "New search",
355
+ "search_try_searching": "Try searching for",
356
+ "search_empty_title": "Search your knowledge base",
357
+ "search_empty_description": "Find documents by title, content, or tags. Use filters to narrow down results.",
358
+ "search_popular": "Popular searches",
359
+
360
+ "sort_relevance": "Relevance",
361
+ "sort_date_newest": "Date (newest first)",
362
+ "sort_date_oldest": "Date (oldest first)",
363
+ "sort_name_asc": "Name (A-Z)",
364
+ "sort_name_desc": "Name (Z-A)",
365
+ "search_filter_label": "Filter",
366
+ "search_filter_label_aria": "Sort results",
367
+ "search_filter_all": "All",
368
+
369
+ "month_january": "January",
370
+ "month_february": "February",
371
+ "month_march": "March",
372
+ "month_april": "April",
373
+ "month_may": "May",
374
+ "month_june": "June",
375
+ "month_july": "July",
376
+ "month_august": "August",
377
+ "month_september": "September",
378
+ "month_october": "October",
379
+ "month_november": "November",
380
+ "month_december": "December",
381
+ "weekday_mo": "Mo",
382
+ "weekday_tu": "Tu",
383
+ "weekday_we": "We",
384
+ "weekday_th": "Th",
385
+ "weekday_fr": "Fr",
386
+ "weekday_sa": "Sa",
387
+ "weekday_su": "Su",
388
+ "date_picker_placeholder": "Select date",
389
+ "date_picker_clear": "Clear",
390
+ "date_picker_aria": "Choose date",
391
+ "date_picker_prev_month": "Previous month",
392
+ "date_picker_next_month": "Next month",
393
+
394
+ "error_validation": "Validation error",
395
+ "error_rate_limited": "Too many requests. Please try again later.",
396
+ "error_document_save": "Failed to save document",
397
+ "error_document_load": "Failed to load document",
398
+ "error_search_failed": "Search failed",
399
+
400
+ "editor_toolbar_table": "Table",
401
+ "editor_anonymous": "Anonymous",
402
+ "editor_saving_rate_limited": "Saving too quickly. Please wait.",
403
+ "editor_highlight_yellow": "Yellow",
404
+ "editor_highlight_orange": "Orange",
405
+ "editor_highlight_red": "Red",
406
+ "editor_highlight_green": "Green",
407
+ "editor_highlight_blue": "Blue",
408
+ "editor_highlight_purple": "Purple",
409
+ "editor_highlight_pink": "Pink",
410
+ "editor_highlight_gray": "Gray",
411
+
412
+ "share_copy_text": "Copy text",
413
+
414
+ "dashboard_import": "Import",
415
+ "dashboard_filter_label": "Filter:",
416
+ "dashboard_untitled_document": "Untitled Document",
417
+
418
+ "doc_no_folder": "No folder",
419
+ "doc_move_to_root": "Move to root",
420
+ "doc_new_folder": "New folder",
421
+ "doc_new_folder_name": "New folder name",
422
+ "doc_change_folder": "Change folder",
423
+ "doc_new_folder_name_aria": "New folder name input",
424
+
425
+ "sidebar_powered_by": "Powered by HiAi-Docs",
426
+
427
+ "scroll_to_top_aria": "Scroll to top",
428
+
429
+ "tag_custom_color": "Custom color",
430
+
431
+ "version_history_empty": "No versions yet.",
432
+
433
+ "ui_toggle_switch": "Toggle switch"
434
+ }
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "@hiai-docs/frontend",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "scripts": {
8
+ "dev": "vite dev",
9
+ "build": "vite build",
10
+ "preview": "vite preview",
11
+ "lint": "biome check src/",
12
+ "lint:fix": "biome check --fix src/",
13
+ "typecheck": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
14
+ "test": "bun test --path-ignore-patterns='*node_modules*' src/"
15
+ },
16
+ "dependencies": {
17
+ "@hiai-gg/hiai-ui": "workspace:*",
18
+ "@inlang/paraglide-js": "^2.19.0",
19
+ "@tiptap/core": "^3.26.1",
20
+ "@tiptap/extension-code-block-lowlight": "^3.26.1",
21
+ "@tiptap/extension-collaboration": "^3.26.1",
22
+ "@tiptap/extension-collaboration-cursor": "^2.26.2",
23
+ "@tiptap/extension-highlight": "^3.26.1",
24
+ "@tiptap/extension-image": "^3.27.1",
25
+ "@tiptap/extension-link": "^3.26.1",
26
+ "@tiptap/extension-list": "^3.26.1",
27
+ "@tiptap/extension-table": "3.26.1",
28
+ "@tiptap/extension-text-align": "^3.26.1",
29
+ "@tiptap/extension-underline": "^3.26.1",
30
+ "@tiptap/markdown": "^3.26.1",
31
+ "@tiptap/pm": "^3.26.1",
32
+ "@tiptap/starter-kit": "^3.26.1",
33
+ "better-auth": "^1.6.18",
34
+ "bits-ui": "^2.18.1",
35
+ "clsx": "^2.1.1",
36
+ "lowlight": "^3.3.0",
37
+ "lucide-svelte": "^0.577.0",
38
+ "marked": "^18.0.5",
39
+ "shadcn-svelte": "^1.3.0",
40
+ "svelte-dnd-action": "^0.9.70",
41
+ "svelte-tiptap": "^3.0.1",
42
+ "tailwind-merge": "^3.6.0",
43
+ "tailwind-variants": "^3.2.2",
44
+ "y-prosemirror": "^1.3.7",
45
+ "y-websocket": "^3.0.0",
46
+ "yjs": "^13.6.31",
47
+ "zod": "^4.4.3"
48
+ },
49
+ "devDependencies": {
50
+ "@better-auth/core": "^1.6.19",
51
+ "@biomejs/biome": "^2.4.15",
52
+ "@inlang/plugin-m-function-matcher": "^2.2.9",
53
+ "@inlang/plugin-message-format": "^4.4.0",
54
+ "@sveltejs/adapter-node": "^5.5.4",
55
+ "@sveltejs/kit": "^2.65.0",
56
+ "@sveltejs/vite-plugin-svelte": "^7.1.2",
57
+ "@tailwindcss/vite": "^4.3.1",
58
+ "@types/bun": "^1.3.14",
59
+ "@types/node": "^25.9.1",
60
+ "cookie": "^1.1.1",
61
+ "devalue": "^5.8.1",
62
+ "esm-env": "^1.2.2",
63
+ "nanostores": "^1.3.0",
64
+ "svelte": "^5.56.3",
65
+ "svelte-check": "^4.6.0",
66
+ "tailwindcss": "^4.3.1",
67
+ "typescript": "^5.8.0",
68
+ "vite": "^8.0.16"
69
+ }
70
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "$schema": "https://inlang.com/schema/project-settings",
3
+ "modules": [
4
+ "./node_modules/@inlang/plugin-message-format/dist/index.js",
5
+ "./node_modules/@inlang/plugin-m-function-matcher/dist/index.js"
6
+ ],
7
+ "plugin.inlang.messageFormat": {
8
+ "pathPattern": "/mnt/ai_data/projects/hiai-docs/frontend/messages/{languageTag}.json"
9
+ },
10
+ "sourceLanguageTag": "en",
11
+ "languageTags": ["en"]
12
+ }
@@ -0,0 +1,6 @@
1
+ @import "tailwindcss";
2
+
3
+ /* Canonical design tokens (oklch, shadcn-svelte new-york / slate) — single source
4
+ * of truth lives in @hiai-gg/hiai-ui. This file is intentionally minimal: docs-specific
5
+ * additions only. To change tokens, edit packages/hiai-ui/src/styles/tokens.css. */
6
+ @import "@hiai-gg/hiai-ui/styles/tokens.css";
@@ -0,0 +1,13 @@
1
+ // See https://svelte.dev/docs/kit/types#app.d.ts
2
+ // for information about these interfaces
3
+ declare global {
4
+ namespace App {
5
+ // interface Error {}
6
+ // interface Locals {}
7
+ // interface PageData {}
8
+ // interface PageState {}
9
+ // interface Platform {}
10
+ }
11
+ }
12
+
13
+ export {};
@@ -0,0 +1,30 @@
1
+ <!doctype html>
2
+ <html lang="%lang%" dir="%dir%">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <link rel="icon" href="%sveltekit.assets%/favicon.png" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
7
+ <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://cdn.embed.tiptap.dev; worker-src 'self' blob:; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob: https: http://localhost:9020 http://localhost:9000 http://minio:9000; connect-src 'self' http://localhost:* ws://localhost:*; frame-src 'self';" />
8
+ %sveltekit.head%
9
+ <script>
10
+ (function () {
11
+ try {
12
+ var stored = localStorage.getItem("hiai-docs-theme");
13
+ var prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
14
+ var isDark = stored === "dark" || ((stored === null || stored === "system") && prefersDark);
15
+ if (isDark) {
16
+ document.documentElement.classList.add("dark");
17
+ } else {
18
+ document.documentElement.classList.remove("dark");
19
+ }
20
+ } catch (_) {
21
+ /* no-op: localStorage may be unavailable (e.g. private mode) */
22
+ }
23
+ })();
24
+ </script>
25
+ </head>
26
+ <body data-sveltekit-preload-data="hover">
27
+ <a href="#main-content" class="skip-link">Skip to main content</a>
28
+ <div style="display: contents">%sveltekit.body%</div>
29
+ </body>
30
+ </html>
@@ -0,0 +1,10 @@
1
+ import type { Handle } from "@sveltejs/kit";
2
+ import { getLocale } from "$lib/paraglide/runtime";
3
+
4
+ export const handle: Handle = async ({ event, resolve }) => {
5
+ const locale = getLocale();
6
+ return resolve(event, {
7
+ transformPageChunk: ({ html }) =>
8
+ html.replace("%lang%", locale).replace("%dir%", "ltr"),
9
+ });
10
+ };
@@ -0,0 +1,10 @@
1
+ // De-localize incoming URLs (e.g. /de/about -> /about) before SvelteKit routes them.
2
+ // Required by the paraglide v2 SvelteKit integration even when only the source
3
+ // language is configured, so adding more locales is a settings.json change.
4
+
5
+ import type { Reroute } from "@sveltejs/kit";
6
+ import { deLocalizeUrl } from "$lib/paraglide/runtime";
7
+
8
+ export const reroute: Reroute = (request) => {
9
+ return deLocalizeUrl(request.url).pathname;
10
+ };
@@ -0,0 +1,45 @@
1
+ import { apiFetch } from "./client";
2
+
3
+ export interface Attachment {
4
+ id: string;
5
+ filename: string;
6
+ mimeType: string;
7
+ size: number;
8
+ url: string;
9
+ }
10
+
11
+ export interface AttachmentListResponse {
12
+ items: Attachment[];
13
+ }
14
+
15
+ const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB
16
+
17
+ export function uploadAttachment(
18
+ documentId: string,
19
+ file: File,
20
+ ): Promise<Attachment> {
21
+ const formData = new FormData();
22
+ formData.append("file", file);
23
+ return apiFetch<Attachment>(`/api/documents/${documentId}/attachments`, {
24
+ method: "POST",
25
+ body: formData,
26
+ // FormData uploads can exceed the default 10s client timeout.
27
+ timeout: 60_000,
28
+ });
29
+ }
30
+
31
+ export function listAttachments(
32
+ documentId: string,
33
+ ): Promise<AttachmentListResponse> {
34
+ return apiFetch<AttachmentListResponse>(
35
+ `/api/documents/${documentId}/attachments`,
36
+ );
37
+ }
38
+
39
+ export function isImageFile(file: File): boolean {
40
+ return file.type.startsWith("image/");
41
+ }
42
+
43
+ export function isFileSizeAllowed(file: File): boolean {
44
+ return file.size <= MAX_FILE_SIZE;
45
+ }
@@ -0,0 +1,15 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import { apiFetch } from "./client";
3
+
4
+ describe("apiFetch", () => {
5
+ test("is a function", () => {
6
+ expect(typeof apiFetch).toBe("function");
7
+ });
8
+
9
+ test("returns promise", () => {
10
+ const result = apiFetch("/api/test");
11
+ expect(result).toBeInstanceOf(Promise);
12
+ // Don't await - will fail with network error in test env
13
+ result.catch(() => {});
14
+ });
15
+ });