@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.
- package/.all-contributorsrc +18 -0
- package/.claude/settings.local.json +61 -0
- package/.dockerignore +113 -0
- package/.env.example +68 -0
- package/.github/FUNDING.yml +5 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +74 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +78 -0
- package/.github/dependabot.yml +136 -0
- package/.github/pull_request_template.md +96 -0
- package/.github/workflows/ci.yml +283 -0
- package/AGENTS.md +237 -0
- package/CODE_OF_CONDUCT.md +134 -0
- package/CONTRIBUTING.md +77 -0
- package/Caddyfile +50 -0
- package/Dockerfile.backend +60 -0
- package/LICENSE +21 -0
- package/README.md +284 -0
- package/RELEASE_CHECKLIST.md +34 -0
- package/SECURITY.md +60 -0
- package/backend/package.json +43 -0
- package/backend/src/__tests__/auth-helpers.test.ts +51 -0
- package/backend/src/__tests__/chunker.test.ts +65 -0
- package/backend/src/__tests__/config.test.ts +91 -0
- package/backend/src/__tests__/csrf.test.ts +91 -0
- package/backend/src/__tests__/embedding.test.ts +48 -0
- package/backend/src/__tests__/rate-limit.test.ts +46 -0
- package/backend/src/__tests__/routes.test.ts +38 -0
- package/backend/src/__tests__/schema.test.ts +31 -0
- package/backend/src/__tests__/validation.test.ts +556 -0
- package/backend/src/api/middleware/auth.ts +56 -0
- package/backend/src/api/middleware/csrf.ts +91 -0
- package/backend/src/api/middleware/rate-limit.ts +77 -0
- package/backend/src/api/middleware/webhook-verify.ts +22 -0
- package/backend/src/api/routes/attachments.ts +280 -0
- package/backend/src/api/routes/auth.ts +52 -0
- package/backend/src/api/routes/collaboration.ts +121 -0
- package/backend/src/api/routes/documents.ts +664 -0
- package/backend/src/api/routes/folders.ts +226 -0
- package/backend/src/api/routes/search.ts +354 -0
- package/backend/src/api/routes/share.ts +512 -0
- package/backend/src/api/routes/tags.ts +247 -0
- package/backend/src/api/routes/versions.ts +99 -0
- package/backend/src/api/routes/webhooks.ts +43 -0
- package/backend/src/embedding/chunker.ts +74 -0
- package/backend/src/embedding/index.ts +117 -0
- package/backend/src/embedding/providers/ollama.ts +63 -0
- package/backend/src/embedding/providers/openrouter.ts +71 -0
- package/backend/src/embedding/utils.ts +13 -0
- package/backend/src/embedding/worker.ts +89 -0
- package/backend/src/index.ts +147 -0
- package/backend/src/lib/auth-helpers.ts +27 -0
- package/backend/src/lib/auth.ts +35 -0
- package/backend/src/lib/config.ts +73 -0
- package/backend/src/lib/db.ts +7 -0
- package/backend/src/lib/embedding-queue.ts +12 -0
- package/backend/src/lib/logger.ts +18 -0
- package/backend/src/lib/markdown-to-doc.ts +45 -0
- package/backend/src/lib/minio.ts +46 -0
- package/backend/src/lib/redis.ts +19 -0
- package/backend/src/lib/yjs-provider.ts +182 -0
- package/backend/tests/integration/_harness.ts +754 -0
- package/backend/tests/integration/auth.test.ts +296 -0
- package/backend/tests/integration/routes.documents.test.ts +459 -0
- package/backend/tests/integration/routes.folders.test.ts +337 -0
- package/backend/tests/integration/routes.search.test.ts +322 -0
- package/backend/tests/integration/routes.share.test.ts +773 -0
- package/backend/tests/integration/routes.tags.test.ts +425 -0
- package/backend/tests/integration/routes.versions.test.ts +233 -0
- package/backend/tsconfig.json +18 -0
- package/docker-compose.yml +218 -0
- package/docs/API.md +328 -0
- package/docs/ARCHITECTURE.md +75 -0
- package/docs/DEPLOYMENT.md +113 -0
- package/docs/PRODUCTION_STATUS.md +61 -0
- package/docs/openapi.json +385 -0
- package/frontend/.svelte-kit.old/ambient.d.ts +230 -0
- package/frontend/.svelte-kit.old/env.d.ts +1 -0
- package/frontend/.svelte-kit.old/generated/client/app.js +46 -0
- package/frontend/.svelte-kit.old/generated/client/matchers.js +1 -0
- package/frontend/.svelte-kit.old/generated/client/nodes/0.js +3 -0
- package/frontend/.svelte-kit.old/generated/client/nodes/1.js +1 -0
- package/frontend/.svelte-kit.old/generated/client/nodes/10.js +3 -0
- package/frontend/.svelte-kit.old/generated/client/nodes/2.js +1 -0
- package/frontend/.svelte-kit.old/generated/client/nodes/3.js +1 -0
- package/frontend/.svelte-kit.old/generated/client/nodes/4.js +1 -0
- package/frontend/.svelte-kit.old/generated/client/nodes/5.js +3 -0
- package/frontend/.svelte-kit.old/generated/client/nodes/6.js +1 -0
- package/frontend/.svelte-kit.old/generated/client/nodes/7.js +3 -0
- package/frontend/.svelte-kit.old/generated/client/nodes/8.js +1 -0
- package/frontend/.svelte-kit.old/generated/client/nodes/9.js +3 -0
- package/frontend/.svelte-kit.old/generated/root.js +3 -0
- package/frontend/.svelte-kit.old/generated/root.svelte +80 -0
- package/frontend/.svelte-kit.old/generated/server/internal.js +55 -0
- package/frontend/.svelte-kit.old/non-ambient.d.ts +59 -0
- package/frontend/.svelte-kit.old/tsconfig.json +59 -0
- package/frontend/.svelte-kit.old/types/route_meta_data.json +40 -0
- package/frontend/.svelte-kit.old/types/src/routes/$types.d.ts +21 -0
- package/frontend/.svelte-kit.old/types/src/routes/(app)/$types.d.ts +30 -0
- package/frontend/.svelte-kit.old/types/src/routes/(app)/docs/[id]/$types.d.ts +27 -0
- package/frontend/.svelte-kit.old/types/src/routes/(app)/docs/[id]/proxy+page.ts +25 -0
- package/frontend/.svelte-kit.old/types/src/routes/api/[...path]/$types.d.ts +10 -0
- package/frontend/.svelte-kit.old/types/src/routes/folders/[id]/$types.d.ts +27 -0
- package/frontend/.svelte-kit.old/types/src/routes/folders/[id]/proxy+page.ts +15 -0
- package/frontend/.svelte-kit.old/types/src/routes/login/$types.d.ts +17 -0
- package/frontend/.svelte-kit.old/types/src/routes/register/$types.d.ts +17 -0
- package/frontend/.svelte-kit.old/types/src/routes/s/[token]/$types.d.ts +20 -0
- package/frontend/.svelte-kit.old/types/src/routes/s/[token]/proxy+page.ts +6 -0
- package/frontend/.svelte-kit.old/types/src/routes/search/$types.d.ts +19 -0
- package/frontend/.svelte-kit.old/types/src/routes/search/proxy+page.ts +26 -0
- package/frontend/.svelte-kit.old/types/src/routes/settings/$types.d.ts +17 -0
- package/frontend/Dockerfile +44 -0
- package/frontend/biome.json +40 -0
- package/frontend/components.json +18 -0
- package/frontend/messages/en.json +434 -0
- package/frontend/package.json +70 -0
- package/frontend/project.inlang/settings.json +12 -0
- package/frontend/src/app.css +6 -0
- package/frontend/src/app.d.ts +13 -0
- package/frontend/src/app.html +30 -0
- package/frontend/src/hooks.server.ts +10 -0
- package/frontend/src/hooks.ts +10 -0
- package/frontend/src/lib/api/attachments.ts +45 -0
- package/frontend/src/lib/api/client.test.ts +15 -0
- package/frontend/src/lib/api/client.ts +57 -0
- package/frontend/src/lib/api/documents.ts +83 -0
- package/frontend/src/lib/api/folders.ts +180 -0
- package/frontend/src/lib/api/search.test.ts +52 -0
- package/frontend/src/lib/api/search.ts +128 -0
- package/frontend/src/lib/api/settings.ts +95 -0
- package/frontend/src/lib/api/share.ts +71 -0
- package/frontend/src/lib/api/tags.test.ts +91 -0
- package/frontend/src/lib/api/tags.ts +87 -0
- package/frontend/src/lib/auth-client.ts +10 -0
- package/frontend/src/lib/collaboration.ts +63 -0
- package/frontend/src/lib/components/AttachmentUpload.svelte +110 -0
- package/frontend/src/lib/components/DatePicker.svelte +322 -0
- package/frontend/src/lib/components/DocumentCard.svelte +166 -0
- package/frontend/src/lib/components/EmptyState.svelte +49 -0
- package/frontend/src/lib/components/FolderCard.svelte +93 -0
- package/frontend/src/lib/components/ScrollToTop.svelte +72 -0
- package/frontend/src/lib/components/SearchBar.svelte +47 -0
- package/frontend/src/lib/components/SearchResult.svelte +115 -0
- package/frontend/src/lib/components/SettingsDialog.svelte +271 -0
- package/frontend/src/lib/components/ShareDialog.svelte +158 -0
- package/frontend/src/lib/components/ShareLink.svelte +98 -0
- package/frontend/src/lib/components/TagCreateDialog.svelte +284 -0
- package/frontend/src/lib/components/VersionDiff.svelte +55 -0
- package/frontend/src/lib/components/VersionHistory.svelte +96 -0
- package/frontend/src/lib/components/editor/DocumentTitle.svelte +87 -0
- package/frontend/src/lib/components/editor/EditorToolbar.svelte +1367 -0
- package/frontend/src/lib/components/editor/HiAiEditor.svelte +531 -0
- package/frontend/src/lib/components/editor/LinkDialog.svelte +134 -0
- package/frontend/src/lib/components/editor/MarkdownToggle.svelte +88 -0
- package/frontend/src/lib/components/editor/editorExtensions.ts +53 -0
- package/frontend/src/lib/components/editor/markdown.ts +38 -0
- package/frontend/src/lib/components/sidebar/FolderTree.svelte +731 -0
- package/frontend/src/lib/components/sidebar/RecentDocs.svelte +311 -0
- package/frontend/src/lib/components/sidebar/Sidebar.svelte +156 -0
- package/frontend/src/lib/components/sidebar/TagList.svelte +200 -0
- package/frontend/src/lib/components/ui/confirm-dialog/ConfirmDialog.svelte +76 -0
- package/frontend/src/lib/components/ui/confirm-dialog/index.ts +1 -0
- package/frontend/src/lib/stores/tag-store.svelte.ts +56 -0
- package/frontend/src/lib/stores/theme.svelte.ts +97 -0
- package/frontend/src/lib/svelte.d.ts +6 -0
- package/frontend/src/lib/types.ts +44 -0
- package/frontend/src/lib/utils/clipboard.ts +17 -0
- package/frontend/src/lib/utils/strip-markdown.ts +59 -0
- package/frontend/src/lib/utils.ts +33 -0
- package/frontend/src/routes/(app)/+layout.svelte +17 -0
- package/frontend/src/routes/(app)/+page.server.ts +10 -0
- package/frontend/src/routes/(app)/+page.svelte +303 -0
- package/frontend/src/routes/(app)/docs/[id]/+page.server.ts +10 -0
- package/frontend/src/routes/(app)/docs/[id]/+page.svelte +1108 -0
- package/frontend/src/routes/(app)/docs/[id]/+page.ts +24 -0
- package/frontend/src/routes/(app)/search/+page.svelte +593 -0
- package/frontend/src/routes/(app)/search/+page.ts +25 -0
- package/frontend/src/routes/+error.svelte +12 -0
- package/frontend/src/routes/+layout.svelte +18 -0
- package/frontend/src/routes/+layout.ts +2 -0
- package/frontend/src/routes/api/[...path]/+server.ts +111 -0
- package/frontend/src/routes/folders/[id]/+page.server.ts +10 -0
- package/frontend/src/routes/folders/[id]/+page.svelte +319 -0
- package/frontend/src/routes/folders/[id]/+page.ts +14 -0
- package/frontend/src/routes/login/+page.svelte +90 -0
- package/frontend/src/routes/register/+page.svelte +97 -0
- package/frontend/src/routes/s/[token]/+page.svelte +496 -0
- package/frontend/src/routes/s/[token]/+page.ts +5 -0
- package/frontend/src/routes/settings/+page.svelte +175 -0
- package/frontend/static/favicon.png +0 -0
- package/frontend/static/logo.png +0 -0
- package/frontend/svelte.config.js +15 -0
- package/frontend/tsconfig.json +15 -0
- package/frontend/vite.config.ts +25 -0
- package/init.sql +9 -0
- package/logo.png +0 -0
- package/package.json +39 -0
- package/package.public.json +39 -0
- package/packages/db/drizzle.config.ts +10 -0
- package/packages/db/package.json +30 -0
- package/packages/db/src/client.ts +9 -0
- package/packages/db/src/index.ts +2 -0
- package/packages/db/src/migrations/0000_nice_bedlam.sql +165 -0
- package/packages/db/src/migrations/0001_w2_3_test.sql +5 -0
- package/packages/db/src/migrations/0002_rename_content_json.sql +2 -0
- package/packages/db/src/migrations/meta/0000_snapshot.json +1331 -0
- package/packages/db/src/migrations/meta/0001_snapshot.json +1399 -0
- package/packages/db/src/migrations/meta/0002_snapshot.json +1399 -0
- package/packages/db/src/migrations/meta/_journal.json +27 -0
- package/packages/db/src/schema.ts +378 -0
- package/packages/db/tsconfig.json +17 -0
- package/scripts/export-openapi.ts +37 -0
- package/scripts/health-check.sh +75 -0
- package/scripts/migrate.sh +135 -0
- package/scripts/prework_backup.sh +25 -0
- package/scripts/release.sh +83 -0
- package/tsconfig.json +25 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
<!-- MarkdownToggle.svelte — Raw Markdown editing view -->
|
|
2
|
+
<script lang="ts">
|
|
3
|
+
import * as m from "$lib/paraglide/messages.js";
|
|
4
|
+
import type { EditorOutput } from "./HiAiEditor.svelte";
|
|
5
|
+
import { markdownToJson } from "./markdown";
|
|
6
|
+
|
|
7
|
+
const {
|
|
8
|
+
content = "",
|
|
9
|
+
onUpdate = (_output: EditorOutput) => {},
|
|
10
|
+
}: {
|
|
11
|
+
content?: string;
|
|
12
|
+
onUpdate?: (output: EditorOutput) => void;
|
|
13
|
+
} = $props();
|
|
14
|
+
|
|
15
|
+
let textarea = $state<HTMLTextAreaElement | null>(null);
|
|
16
|
+
|
|
17
|
+
// Persist + parse the new markdown into a ProseMirror doc so the
|
|
18
|
+
// `contentJson` field stays in sync. Without this the wysiwyg editor
|
|
19
|
+
// would show stale content the next time the user switches modes.
|
|
20
|
+
// Parsing happens synchronously on every keystroke — the underlying
|
|
21
|
+
// `marked` tokenizer is fast and `generateJSON` is cheap for the
|
|
22
|
+
// document sizes we expect in the editor.
|
|
23
|
+
function emitUpdate(markdown: string) {
|
|
24
|
+
const json = markdownToJson(markdown);
|
|
25
|
+
onUpdate({ markdown, json });
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function handleInput(e: Event) {
|
|
29
|
+
const target = e.target as HTMLTextAreaElement;
|
|
30
|
+
emitUpdate(target.value);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function handleKeydown(e: KeyboardEvent) {
|
|
34
|
+
if (e.key === "Tab") {
|
|
35
|
+
e.preventDefault();
|
|
36
|
+
const target = e.target as HTMLTextAreaElement;
|
|
37
|
+
const start = target.selectionStart;
|
|
38
|
+
const end = target.selectionEnd;
|
|
39
|
+
target.value = `${target.value.substring(0, start)}\t${target.value.substring(end)}`;
|
|
40
|
+
target.selectionStart = target.selectionEnd = start + 1;
|
|
41
|
+
emitUpdate(target.value);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
</script>
|
|
45
|
+
|
|
46
|
+
<div class="markdown-toggle">
|
|
47
|
+
<textarea
|
|
48
|
+
bind:this={textarea}
|
|
49
|
+
value={content}
|
|
50
|
+
oninput={handleInput}
|
|
51
|
+
onkeydown={handleKeydown}
|
|
52
|
+
class="markdown-textarea"
|
|
53
|
+
spellcheck="false"
|
|
54
|
+
placeholder={m.editor_markdown_placeholder()}
|
|
55
|
+
aria-label={m.editor_markdown_label()}
|
|
56
|
+
></textarea>
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
<style>
|
|
60
|
+
.markdown-toggle {
|
|
61
|
+
flex: 1;
|
|
62
|
+
display: flex;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.markdown-textarea {
|
|
66
|
+
flex: 1;
|
|
67
|
+
width: 100%;
|
|
68
|
+
min-height: 400px;
|
|
69
|
+
padding: 24px;
|
|
70
|
+
border: none;
|
|
71
|
+
outline: none;
|
|
72
|
+
resize: none;
|
|
73
|
+
font-family: 'Fira Code', 'Consolas', 'Courier New', monospace;
|
|
74
|
+
font-size: 14px;
|
|
75
|
+
line-height: 1.7;
|
|
76
|
+
color: var(--foreground);
|
|
77
|
+
background: var(--muted);
|
|
78
|
+
tab-size: 4;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.markdown-textarea::placeholder {
|
|
82
|
+
color: var(--muted-foreground);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.markdown-textarea:focus {
|
|
86
|
+
background: var(--background);
|
|
87
|
+
}
|
|
88
|
+
</style>
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// editorExtensions.ts — Shared TipTap extension list.
|
|
2
|
+
//
|
|
3
|
+
// Both the live HiAiEditor and the markdown→JSON helper (used by
|
|
4
|
+
// MarkdownToggle) need the same set of node/mark extensions so the parsed
|
|
5
|
+
// ProseMirror JSON round-trips cleanly with the editor's schema. Keeping the
|
|
6
|
+
// list here avoids drift between the two consumers.
|
|
7
|
+
//
|
|
8
|
+
// The collaboration extensions are deliberately excluded — the parser runs
|
|
9
|
+
// in the browser on user-typed markdown and has no Yjs document to attach
|
|
10
|
+
// to. The HiAiEditor pushes those on top at runtime when a `collaboration`
|
|
11
|
+
// prop is supplied.
|
|
12
|
+
|
|
13
|
+
import CodeBlockLowlight from "@tiptap/extension-code-block-lowlight";
|
|
14
|
+
import Highlight from "@tiptap/extension-highlight";
|
|
15
|
+
import Image from "@tiptap/extension-image";
|
|
16
|
+
import Link from "@tiptap/extension-link";
|
|
17
|
+
import { TaskItem, TaskList } from "@tiptap/extension-list";
|
|
18
|
+
import { TableKit } from "@tiptap/extension-table";
|
|
19
|
+
import TextAlign from "@tiptap/extension-text-align";
|
|
20
|
+
import { Markdown } from "@tiptap/markdown";
|
|
21
|
+
import StarterKit from "@tiptap/starter-kit";
|
|
22
|
+
import { common, createLowlight } from "lowlight";
|
|
23
|
+
|
|
24
|
+
const lowlight = createLowlight(common);
|
|
25
|
+
|
|
26
|
+
export const editorExtensions = [
|
|
27
|
+
StarterKit.configure({
|
|
28
|
+
heading: { levels: [1, 2, 3] },
|
|
29
|
+
codeBlock: false,
|
|
30
|
+
link: false,
|
|
31
|
+
}),
|
|
32
|
+
Markdown.configure({}),
|
|
33
|
+
Link.configure({
|
|
34
|
+
openOnClick: false,
|
|
35
|
+
HTMLAttributes: { class: "doc-link" },
|
|
36
|
+
}),
|
|
37
|
+
Image.configure({
|
|
38
|
+
inline: false,
|
|
39
|
+
allowBase64: false,
|
|
40
|
+
HTMLAttributes: { class: "doc-image" },
|
|
41
|
+
}),
|
|
42
|
+
Highlight.configure({ multicolor: true }),
|
|
43
|
+
CodeBlockLowlight.configure({ lowlight }),
|
|
44
|
+
TextAlign.configure({ types: ["heading", "paragraph"] }),
|
|
45
|
+
// Tables: TableKit bundles Table + TableRow + TableHeader + TableCell.
|
|
46
|
+
// `resizable` lets users drag column widths; the toolbar inserts tables
|
|
47
|
+
// with a header row via `insertTable`.
|
|
48
|
+
TableKit.configure({ table: { resizable: true } }),
|
|
49
|
+
// Task lists: a checkbox list. `nested` allows task items to contain
|
|
50
|
+
// nested task lists.
|
|
51
|
+
TaskList,
|
|
52
|
+
TaskItem.configure({ nested: true }),
|
|
53
|
+
];
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// markdown.ts — Browser-side markdown ↔ TipTap JSON helpers.
|
|
2
|
+
//
|
|
3
|
+
// MarkdownToggle edits raw markdown. The server stores both the markdown
|
|
4
|
+
// and the equivalent ProseMirror JSON (`contentJson`); the JSON is what the
|
|
5
|
+
// wysiwyg editor uses when the user switches back. We can't just save the
|
|
6
|
+
// markdown string — the JSON field has to be kept in sync, otherwise the
|
|
7
|
+
// next visit to the wysiwyg mode would show stale content until the user
|
|
8
|
+
// touches the editor.
|
|
9
|
+
//
|
|
10
|
+
// `@tiptap/markdown` ships a `MarkdownManager` that knows how to parse
|
|
11
|
+
// markdown against the same set of TipTap extensions used by the editor.
|
|
12
|
+
// We instantiate one with the shared `editorExtensions` list and call
|
|
13
|
+
// `.parse()` for every keystroke. The instance is lazily created on first
|
|
14
|
+
// use to keep the module side-effect-free in SSR contexts (MarkdownToggle
|
|
15
|
+
// is only mounted in the browser, but Vite's build still evaluates this
|
|
16
|
+
// file's imports).
|
|
17
|
+
|
|
18
|
+
import type { JSONContent } from "@tiptap/core";
|
|
19
|
+
import { MarkdownManager } from "@tiptap/markdown";
|
|
20
|
+
import { editorExtensions } from "./editorExtensions";
|
|
21
|
+
|
|
22
|
+
let managerSingleton: MarkdownManager | null = null;
|
|
23
|
+
|
|
24
|
+
function getManager(): MarkdownManager {
|
|
25
|
+
if (managerSingleton) return managerSingleton;
|
|
26
|
+
managerSingleton = new MarkdownManager({ extensions: editorExtensions });
|
|
27
|
+
return managerSingleton;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Parse a markdown string into a ProseMirror document matching the
|
|
32
|
+
* HiAiEditor schema. Returns `{ type: "doc", content: [...] }`.
|
|
33
|
+
*
|
|
34
|
+
* Browser-only: relies on `window.DOMParser` inside `generateJSON`.
|
|
35
|
+
*/
|
|
36
|
+
export function markdownToJson(markdown: string): JSONContent {
|
|
37
|
+
return getManager().parse(markdown);
|
|
38
|
+
}
|