wiki-viewer 1.0.0 → 1.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/.next/standalone/README.md +328 -99
- package/.next/standalone/agents/bootstrap-prompt.md +1 -0
- package/.next/standalone/agents/wiki-viewer-skill/SKILL.md +236 -0
- package/.next/standalone/bin/wiki-viewer.js +57 -4
- package/.next/standalone/docs/agent-collab-plan.md +1615 -0
- package/.next/standalone/docs/agent-collab-v2-plan.md +771 -0
- package/.next/standalone/package.json +19 -2
- package/.next/standalone/pnpm-lock.yaml +1368 -325
- package/.next/standalone/pnpm-workspace.yaml +7 -1
- package/.next/standalone/src/app/api/agent/activity/route.ts +58 -0
- package/.next/standalone/src/app/api/agent/admin/agents/[agentId]/revoke/route.ts +40 -0
- package/.next/standalone/src/app/api/agent/admin/agents/route.ts +33 -0
- package/.next/standalone/src/app/api/agent/admin/registrations/[regId]/approve/route.ts +83 -0
- package/.next/standalone/src/app/api/agent/admin/registrations/[regId]/deny/route.ts +36 -0
- package/.next/standalone/src/app/api/agent/admin/registrations/route.ts +27 -0
- package/.next/standalone/src/app/api/agent/events/[...path]/route.ts +136 -0
- package/.next/standalone/src/app/api/agent/files/[...path]/route.ts +202 -0
- package/.next/standalone/src/app/api/agent/internal/span/route.ts +117 -0
- package/.next/standalone/src/app/api/agent/register/[regId]/route.ts +50 -0
- package/.next/standalone/src/app/api/agent/register/route.ts +110 -0
- package/.next/standalone/src/app/api/agent/settings/route.ts +30 -0
- package/.next/standalone/src/app/api/agent/settings/token/regenerate/route.ts +20 -0
- package/.next/standalone/src/app/api/agent/sidecar/[...path]/route.ts +49 -0
- package/.next/standalone/src/app/api/agents/install/route.ts +83 -0
- package/.next/standalone/src/app/api/agents/skill/route.ts +20 -0
- package/.next/standalone/src/app/api/agents/skill.tar.gz/route.ts +87 -0
- package/.next/standalone/src/app/api/auth/[...all]/route.ts +7 -0
- package/.next/standalone/src/app/api/owner/init/route.ts +14 -0
- package/.next/standalone/src/app/api/system/auth-settings/route.ts +85 -0
- package/.next/standalone/src/app/api/system/browse/route.ts +4 -0
- package/.next/standalone/src/app/api/system/clear-root/route.ts +8 -1
- package/.next/standalone/src/app/api/system/config/route.ts +5 -1
- package/.next/standalone/src/app/api/system/pins/route.ts +7 -0
- package/.next/standalone/src/app/api/system/reveal/route.ts +7 -0
- package/.next/standalone/src/app/api/system/root-status/route.ts +5 -1
- package/.next/standalone/src/app/api/system/set-root/route.ts +7 -0
- package/.next/standalone/src/app/api/wiki/app/route.ts +15 -0
- package/.next/standalone/src/app/api/wiki/content/route.ts +110 -11
- package/.next/standalone/src/app/api/wiki/folder/route.ts +7 -0
- package/.next/standalone/src/app/api/wiki/move/route.ts +7 -0
- package/.next/standalone/src/app/api/wiki/new-file/route.ts +55 -0
- package/.next/standalone/src/app/api/wiki/page/route.ts +7 -0
- package/.next/standalone/src/app/api/wiki/route.ts +10 -0
- package/.next/standalone/src/app/api/wiki/slugs/route.ts +5 -1
- package/.next/standalone/src/app/api/wiki/upload/route.ts +7 -0
- package/.next/standalone/src/app/api/wiki/watch/route.ts +6 -1
- package/.next/standalone/src/app/globals.css +70 -0
- package/.next/standalone/src/app/page.tsx +461 -217
- package/.next/standalone/src/app/signin/page.tsx +217 -0
- package/.next/standalone/src/components/ai-panel/activity-row.tsx +64 -0
- package/.next/standalone/src/components/ai-panel/ai-panel.tsx +322 -0
- package/.next/standalone/src/components/ai-panel/token-section.tsx +312 -0
- package/.next/standalone/src/components/auth-settings-sheet.tsx +209 -0
- package/.next/standalone/src/components/editor/bubble-menu.tsx +41 -2
- package/.next/standalone/src/components/editor/comment-pip.tsx +56 -0
- package/.next/standalone/src/components/editor/comment-thread.tsx +252 -0
- package/.next/standalone/src/components/editor/editor.tsx +513 -10
- package/.next/standalone/src/components/editor/extensions/proof-span.ts +60 -0
- package/.next/standalone/src/components/editor/extensions.ts +2 -0
- package/.next/standalone/src/components/editor/proof-span-popover.tsx +161 -0
- package/.next/standalone/src/components/editor/suggest-edit-popover.tsx +228 -0
- package/.next/standalone/src/components/editor/suggestion-card.tsx +201 -0
- package/.next/standalone/src/components/view-width-toggle.tsx +47 -0
- package/.next/standalone/src/components/wiki/markdown-preview.tsx +120 -0
- package/.next/standalone/src/lib/auth/allowlist.ts +50 -0
- package/.next/standalone/src/lib/auth/client.ts +4 -0
- package/.next/standalone/src/lib/auth/csrf.ts +68 -0
- package/.next/standalone/src/lib/auth/server.ts +164 -0
- package/.next/standalone/src/lib/config.ts +4 -0
- package/.next/standalone/src/lib/markdown/parse-frontmatter.ts +20 -0
- package/.next/standalone/src/lib/markdown/sanitize-schema.ts +106 -0
- package/.next/standalone/src/lib/markdown/to-html.ts +46 -8
- package/.next/standalone/src/lib/markdown/to-markdown.ts +14 -0
- package/.next/standalone/src/lib/proof/activity-shared.ts +31 -0
- package/.next/standalone/src/lib/proof/activity.ts +74 -0
- package/.next/standalone/src/lib/proof/auth.ts +132 -0
- package/.next/standalone/src/lib/proof/block-refs.ts +133 -0
- package/.next/standalone/src/lib/proof/blocks.ts +73 -0
- package/.next/standalone/src/lib/proof/client-auth.ts +23 -0
- package/.next/standalone/src/lib/proof/event-bus.ts +47 -0
- package/.next/standalone/src/lib/proof/file-lock.ts +38 -0
- package/.next/standalone/src/lib/proof/glob.ts +51 -0
- package/.next/standalone/src/lib/proof/idempotency.ts +32 -0
- package/.next/standalone/src/lib/proof/mutex.ts +32 -0
- package/.next/standalone/src/lib/proof/ops-applier.ts +678 -0
- package/.next/standalone/src/lib/proof/owner-auth.ts +2 -0
- package/.next/standalone/src/lib/proof/pending.ts +97 -0
- package/.next/standalone/src/lib/proof/proof-span.ts +141 -0
- package/.next/standalone/src/lib/proof/rate-limit.ts +53 -0
- package/.next/standalone/src/lib/proof/register-rate-limit.ts +53 -0
- package/.next/standalone/src/lib/proof/registry.ts +190 -0
- package/.next/standalone/src/lib/proof/sidecar.ts +66 -0
- package/.next/standalone/src/lib/proof/suggest-capture.ts +69 -0
- package/.next/standalone/src/lib/proof/types.ts +170 -0
- package/.next/standalone/src/lib/proof-config.ts +14 -0
- package/.next/standalone/src/middleware.ts +38 -0
- package/.next/standalone/src/stores/ai-panel-store.ts +58 -3
- package/.next/standalone/src/stores/editor-store.ts +115 -9
- package/.next/standalone/src/stores/proof-store.ts +123 -0
- package/.next/standalone/src/stores/view-width-store.ts +62 -0
- package/.next/standalone/src/tests/proof/activity-aggregator.test.ts +146 -0
- package/.next/standalone/src/tests/proof/agent-ownership.test.ts +140 -0
- package/.next/standalone/src/tests/proof/agents-install.test.ts +57 -0
- package/.next/standalone/src/tests/proof/better-auth.test.ts +68 -0
- package/.next/standalone/src/tests/proof/block-refs.test.ts +108 -0
- package/.next/standalone/src/tests/proof/blocks.test.ts +92 -0
- package/.next/standalone/src/tests/proof/comments-ops.test.ts +177 -0
- package/.next/standalone/src/tests/proof/editor-roundtrip.test.ts +85 -0
- package/.next/standalone/src/tests/proof/external-edit.test.ts +58 -0
- package/.next/standalone/src/tests/proof/file-lock.test.ts +80 -0
- package/.next/standalone/src/tests/proof/glob.test.ts +82 -0
- package/.next/standalone/src/tests/proof/helpers/auth-session.ts +27 -0
- package/.next/standalone/src/tests/proof/markdown-to-html.test.ts +46 -0
- package/.next/standalone/src/tests/proof/ops-applier.test.ts +368 -0
- package/.next/standalone/src/tests/proof/owner-init.test.ts +2 -0
- package/.next/standalone/src/tests/proof/parse-frontmatter.test.ts +60 -0
- package/.next/standalone/src/tests/proof/proof-span.test.ts +98 -0
- package/.next/standalone/src/tests/proof/rate-limit.test.ts +54 -0
- package/.next/standalone/src/tests/proof/registration-flow.test.ts +330 -0
- package/.next/standalone/src/tests/proof/registry.test.ts +169 -0
- package/.next/standalone/src/tests/proof/routes.test.ts +516 -0
- package/.next/standalone/src/tests/proof/sidecar-trim.test.ts +58 -0
- package/.next/standalone/src/tests/proof/suggestion-ops.test.ts +280 -0
- package/.next/standalone/src/tests/proof/wiki-content-put.test.ts +140 -0
- package/.next/standalone/src/tests/proof/wiki-routes-auth.test.ts +208 -0
- package/README.md +328 -99
- package/bin/wiki-viewer.js +57 -4
- package/package.json +19 -2
package/bin/wiki-viewer.js
CHANGED
|
@@ -45,10 +45,11 @@ const rootDir = args.find((a) => !a.startsWith("-"));
|
|
|
45
45
|
let port = process.env.PORT ?? "3000";
|
|
46
46
|
let host = process.env.HOSTNAME ?? "localhost";
|
|
47
47
|
let useHttps = false;
|
|
48
|
+
let userSpecifiedPort = false;
|
|
48
49
|
|
|
49
50
|
for (let i = 0; i < args.length; i++) {
|
|
50
51
|
const a = args[i];
|
|
51
|
-
if (a === "-p" || a === "--port") port = args[++i] ?? port;
|
|
52
|
+
if (a === "-p" || a === "--port") { port = args[++i] ?? port; userSpecifiedPort = true; }
|
|
52
53
|
else if (a === "-H" || a === "--host") host = args[++i] ?? host;
|
|
53
54
|
else if (a === "--https") useHttps = true;
|
|
54
55
|
}
|
|
@@ -85,6 +86,23 @@ function ensureCerts() {
|
|
|
85
86
|
return { key: readFileSync(keyPath), cert: readFileSync(certPath) };
|
|
86
87
|
}
|
|
87
88
|
|
|
89
|
+
// ── port availability helpers ──────────────────────────────────────────────
|
|
90
|
+
|
|
91
|
+
function isPortAvailable(p, h) {
|
|
92
|
+
return new Promise((resolve) => {
|
|
93
|
+
const s = createNetServer();
|
|
94
|
+
s.once("error", () => resolve(false));
|
|
95
|
+
s.once("listening", () => s.close(() => resolve(true)));
|
|
96
|
+
s.listen(Number(p), h);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
async function findNextAvailablePort(startPort, h) {
|
|
101
|
+
let p = Number(startPort);
|
|
102
|
+
while (!(await isPortAvailable(p, h))) p++;
|
|
103
|
+
return String(p);
|
|
104
|
+
}
|
|
105
|
+
|
|
88
106
|
// ── free port helper ───────────────────────────────────────────────────────
|
|
89
107
|
|
|
90
108
|
function freePort() {
|
|
@@ -97,15 +115,36 @@ function freePort() {
|
|
|
97
115
|
});
|
|
98
116
|
}
|
|
99
117
|
|
|
118
|
+
// ── network address helper ─────────────────────────────────────────────────
|
|
119
|
+
|
|
120
|
+
function getNetworkAddress() {
|
|
121
|
+
for (const ifaces of Object.values(os.networkInterfaces())) {
|
|
122
|
+
for (const iface of ifaces ?? []) {
|
|
123
|
+
if (iface.family === "IPv4" && !iface.internal) return iface.address;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
|
|
100
129
|
// ── start ──────────────────────────────────────────────────────────────────
|
|
101
130
|
|
|
102
131
|
async function start() {
|
|
103
132
|
if (resolvedRoot) {
|
|
104
|
-
console.log(
|
|
133
|
+
console.log(`📁 ${resolvedRoot}`);
|
|
105
134
|
} else {
|
|
106
135
|
console.log("📂 No directory specified — open the browser to choose one");
|
|
107
136
|
}
|
|
108
137
|
|
|
138
|
+
// Auto-select next free port when user didn't specify one
|
|
139
|
+
if (!userSpecifiedPort) {
|
|
140
|
+
const available = await isPortAvailable(Number(port), host);
|
|
141
|
+
if (!available) {
|
|
142
|
+
const original = port;
|
|
143
|
+
port = await findNextAvailablePort(Number(port) + 1, host);
|
|
144
|
+
console.log(`⚠️ Port ${original} in use → using ${port} (pass -p <port> to override)`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
109
148
|
// When HTTPS is requested, run the standalone server on a random internal
|
|
110
149
|
// HTTP port and stand up an HTTPS reverse-proxy on the user-facing port.
|
|
111
150
|
const internalPort = useHttps ? String(await freePort()) : port;
|
|
@@ -147,11 +186,25 @@ async function start() {
|
|
|
147
186
|
// Wait a moment for the standalone server to bind before starting proxy
|
|
148
187
|
setTimeout(() => {
|
|
149
188
|
proxy.listen(Number(port), host, () => {
|
|
150
|
-
|
|
189
|
+
const scheme = "https";
|
|
190
|
+
const displayHost = host === "0.0.0.0" ? "localhost" : host;
|
|
191
|
+
console.log(`\n ➜ Local: ${scheme}://${displayHost}:${port}`);
|
|
192
|
+
const netAddr = getNetworkAddress();
|
|
193
|
+
if (netAddr && host !== "localhost" && host !== "127.0.0.1") {
|
|
194
|
+
console.log(` ➜ Network: ${scheme}://${netAddr}:${port}`);
|
|
195
|
+
}
|
|
196
|
+
console.log(`\n Listening on ${host}:${port} (--host / -H, --port / -p to rebind)\n`);
|
|
151
197
|
});
|
|
152
198
|
}, 1_000);
|
|
153
199
|
} else {
|
|
154
|
-
|
|
200
|
+
const scheme = "http";
|
|
201
|
+
const displayHost = host === "0.0.0.0" ? "localhost" : host;
|
|
202
|
+
console.log(`\n ➜ Local: ${scheme}://${displayHost}:${port}`);
|
|
203
|
+
const netAddr = getNetworkAddress();
|
|
204
|
+
if (netAddr && host !== "localhost" && host !== "127.0.0.1") {
|
|
205
|
+
console.log(` ➜ Network: ${scheme}://${netAddr}:${port}`);
|
|
206
|
+
}
|
|
207
|
+
console.log(`\n Listening on ${host}:${port} (--host / -H, --port / -p to rebind)\n`);
|
|
155
208
|
}
|
|
156
209
|
}
|
|
157
210
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wiki-viewer",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Local file viewer and wiki — view markdown, HTML, PDFs, notebooks, office docs, and more from any directory",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
"build": "next build",
|
|
18
18
|
"start": "next start",
|
|
19
19
|
"wiki": "node bin/wiki-viewer.js",
|
|
20
|
-
"prepublishOnly": "npm run build && cp -r .next/static .next/standalone/.next/static && cp -r public .next/standalone/public"
|
|
20
|
+
"prepublishOnly": "npm run build && cp -r .next/static .next/standalone/.next/static && cp -r public .next/standalone/public",
|
|
21
|
+
"test": "tsx --test src/tests/proof/*.test.ts"
|
|
21
22
|
},
|
|
22
23
|
"engines": {
|
|
23
24
|
"node": ">=18.0.0"
|
|
@@ -35,7 +36,14 @@
|
|
|
35
36
|
"url": "https://github.com/anh-chu/wiki-viewer.git"
|
|
36
37
|
},
|
|
37
38
|
"dependencies": {
|
|
39
|
+
"better-auth": "^1.6.12",
|
|
40
|
+
"better-sqlite3": "^12.10.0",
|
|
38
41
|
"chokidar": "^5.0.0",
|
|
42
|
+
"kysely": "0.28.5",
|
|
43
|
+
"proper-lockfile": "^4.1.2",
|
|
44
|
+
"rehype-parse": "^9.0.1",
|
|
45
|
+
"rehype-raw": "^7.0.0",
|
|
46
|
+
"rehype-sanitize": "^6.0.0",
|
|
39
47
|
"undici": "^8.3.0"
|
|
40
48
|
},
|
|
41
49
|
"devDependencies": {
|
|
@@ -75,9 +83,11 @@
|
|
|
75
83
|
"@tiptap/react": "^3.22.5",
|
|
76
84
|
"@tiptap/starter-kit": "^3.22.5",
|
|
77
85
|
"@tiptap/suggestion": "^3.22.5",
|
|
86
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
78
87
|
"@types/mdast": "^4.0.4",
|
|
79
88
|
"@types/node": "^22.15.0",
|
|
80
89
|
"@types/papaparse": "^5.5.2",
|
|
90
|
+
"@types/proper-lockfile": "^4.1.4",
|
|
81
91
|
"@types/react": "19.2.14",
|
|
82
92
|
"@types/react-dom": "19.2.3",
|
|
83
93
|
"@types/turndown": "^5.0.6",
|
|
@@ -107,14 +117,21 @@
|
|
|
107
117
|
"remark-gfm": "^4.0.1",
|
|
108
118
|
"remark-parse": "^11.0.0",
|
|
109
119
|
"remark-rehype": "^11.1.2",
|
|
120
|
+
"remark-stringify": "^11.0.0",
|
|
110
121
|
"sonner": "^2.0.7",
|
|
111
122
|
"tailwind-merge": "^3.3.0",
|
|
112
123
|
"tailwindcss": "^3.4.17",
|
|
124
|
+
"tsx": "^4.22.3",
|
|
113
125
|
"turndown": "^7.2.4",
|
|
114
126
|
"turndown-plugin-gfm": "^1.0.2",
|
|
115
127
|
"typescript": "^5.8.0",
|
|
116
128
|
"unified": "^11.0.5",
|
|
117
129
|
"xlsx": "^0.18.5",
|
|
118
130
|
"zustand": "^5.0.12"
|
|
131
|
+
},
|
|
132
|
+
"pnpm": {
|
|
133
|
+
"overrides": {
|
|
134
|
+
"kysely": "0.28.5"
|
|
135
|
+
}
|
|
119
136
|
}
|
|
120
137
|
}
|