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.
Files changed (128) hide show
  1. package/.next/standalone/README.md +328 -99
  2. package/.next/standalone/agents/bootstrap-prompt.md +1 -0
  3. package/.next/standalone/agents/wiki-viewer-skill/SKILL.md +236 -0
  4. package/.next/standalone/bin/wiki-viewer.js +57 -4
  5. package/.next/standalone/docs/agent-collab-plan.md +1615 -0
  6. package/.next/standalone/docs/agent-collab-v2-plan.md +771 -0
  7. package/.next/standalone/package.json +19 -2
  8. package/.next/standalone/pnpm-lock.yaml +1368 -325
  9. package/.next/standalone/pnpm-workspace.yaml +7 -1
  10. package/.next/standalone/src/app/api/agent/activity/route.ts +58 -0
  11. package/.next/standalone/src/app/api/agent/admin/agents/[agentId]/revoke/route.ts +40 -0
  12. package/.next/standalone/src/app/api/agent/admin/agents/route.ts +33 -0
  13. package/.next/standalone/src/app/api/agent/admin/registrations/[regId]/approve/route.ts +83 -0
  14. package/.next/standalone/src/app/api/agent/admin/registrations/[regId]/deny/route.ts +36 -0
  15. package/.next/standalone/src/app/api/agent/admin/registrations/route.ts +27 -0
  16. package/.next/standalone/src/app/api/agent/events/[...path]/route.ts +136 -0
  17. package/.next/standalone/src/app/api/agent/files/[...path]/route.ts +202 -0
  18. package/.next/standalone/src/app/api/agent/internal/span/route.ts +117 -0
  19. package/.next/standalone/src/app/api/agent/register/[regId]/route.ts +50 -0
  20. package/.next/standalone/src/app/api/agent/register/route.ts +110 -0
  21. package/.next/standalone/src/app/api/agent/settings/route.ts +30 -0
  22. package/.next/standalone/src/app/api/agent/settings/token/regenerate/route.ts +20 -0
  23. package/.next/standalone/src/app/api/agent/sidecar/[...path]/route.ts +49 -0
  24. package/.next/standalone/src/app/api/agents/install/route.ts +83 -0
  25. package/.next/standalone/src/app/api/agents/skill/route.ts +20 -0
  26. package/.next/standalone/src/app/api/agents/skill.tar.gz/route.ts +87 -0
  27. package/.next/standalone/src/app/api/auth/[...all]/route.ts +7 -0
  28. package/.next/standalone/src/app/api/owner/init/route.ts +14 -0
  29. package/.next/standalone/src/app/api/system/auth-settings/route.ts +85 -0
  30. package/.next/standalone/src/app/api/system/browse/route.ts +4 -0
  31. package/.next/standalone/src/app/api/system/clear-root/route.ts +8 -1
  32. package/.next/standalone/src/app/api/system/config/route.ts +5 -1
  33. package/.next/standalone/src/app/api/system/pins/route.ts +7 -0
  34. package/.next/standalone/src/app/api/system/reveal/route.ts +7 -0
  35. package/.next/standalone/src/app/api/system/root-status/route.ts +5 -1
  36. package/.next/standalone/src/app/api/system/set-root/route.ts +7 -0
  37. package/.next/standalone/src/app/api/wiki/app/route.ts +15 -0
  38. package/.next/standalone/src/app/api/wiki/content/route.ts +110 -11
  39. package/.next/standalone/src/app/api/wiki/folder/route.ts +7 -0
  40. package/.next/standalone/src/app/api/wiki/move/route.ts +7 -0
  41. package/.next/standalone/src/app/api/wiki/new-file/route.ts +55 -0
  42. package/.next/standalone/src/app/api/wiki/page/route.ts +7 -0
  43. package/.next/standalone/src/app/api/wiki/route.ts +10 -0
  44. package/.next/standalone/src/app/api/wiki/slugs/route.ts +5 -1
  45. package/.next/standalone/src/app/api/wiki/upload/route.ts +7 -0
  46. package/.next/standalone/src/app/api/wiki/watch/route.ts +6 -1
  47. package/.next/standalone/src/app/globals.css +70 -0
  48. package/.next/standalone/src/app/page.tsx +461 -217
  49. package/.next/standalone/src/app/signin/page.tsx +217 -0
  50. package/.next/standalone/src/components/ai-panel/activity-row.tsx +64 -0
  51. package/.next/standalone/src/components/ai-panel/ai-panel.tsx +322 -0
  52. package/.next/standalone/src/components/ai-panel/token-section.tsx +312 -0
  53. package/.next/standalone/src/components/auth-settings-sheet.tsx +209 -0
  54. package/.next/standalone/src/components/editor/bubble-menu.tsx +41 -2
  55. package/.next/standalone/src/components/editor/comment-pip.tsx +56 -0
  56. package/.next/standalone/src/components/editor/comment-thread.tsx +252 -0
  57. package/.next/standalone/src/components/editor/editor.tsx +513 -10
  58. package/.next/standalone/src/components/editor/extensions/proof-span.ts +60 -0
  59. package/.next/standalone/src/components/editor/extensions.ts +2 -0
  60. package/.next/standalone/src/components/editor/proof-span-popover.tsx +161 -0
  61. package/.next/standalone/src/components/editor/suggest-edit-popover.tsx +228 -0
  62. package/.next/standalone/src/components/editor/suggestion-card.tsx +201 -0
  63. package/.next/standalone/src/components/view-width-toggle.tsx +47 -0
  64. package/.next/standalone/src/components/wiki/markdown-preview.tsx +120 -0
  65. package/.next/standalone/src/lib/auth/allowlist.ts +50 -0
  66. package/.next/standalone/src/lib/auth/client.ts +4 -0
  67. package/.next/standalone/src/lib/auth/csrf.ts +68 -0
  68. package/.next/standalone/src/lib/auth/server.ts +164 -0
  69. package/.next/standalone/src/lib/config.ts +4 -0
  70. package/.next/standalone/src/lib/markdown/parse-frontmatter.ts +20 -0
  71. package/.next/standalone/src/lib/markdown/sanitize-schema.ts +106 -0
  72. package/.next/standalone/src/lib/markdown/to-html.ts +46 -8
  73. package/.next/standalone/src/lib/markdown/to-markdown.ts +14 -0
  74. package/.next/standalone/src/lib/proof/activity-shared.ts +31 -0
  75. package/.next/standalone/src/lib/proof/activity.ts +74 -0
  76. package/.next/standalone/src/lib/proof/auth.ts +132 -0
  77. package/.next/standalone/src/lib/proof/block-refs.ts +133 -0
  78. package/.next/standalone/src/lib/proof/blocks.ts +73 -0
  79. package/.next/standalone/src/lib/proof/client-auth.ts +23 -0
  80. package/.next/standalone/src/lib/proof/event-bus.ts +47 -0
  81. package/.next/standalone/src/lib/proof/file-lock.ts +38 -0
  82. package/.next/standalone/src/lib/proof/glob.ts +51 -0
  83. package/.next/standalone/src/lib/proof/idempotency.ts +32 -0
  84. package/.next/standalone/src/lib/proof/mutex.ts +32 -0
  85. package/.next/standalone/src/lib/proof/ops-applier.ts +678 -0
  86. package/.next/standalone/src/lib/proof/owner-auth.ts +2 -0
  87. package/.next/standalone/src/lib/proof/pending.ts +97 -0
  88. package/.next/standalone/src/lib/proof/proof-span.ts +141 -0
  89. package/.next/standalone/src/lib/proof/rate-limit.ts +53 -0
  90. package/.next/standalone/src/lib/proof/register-rate-limit.ts +53 -0
  91. package/.next/standalone/src/lib/proof/registry.ts +190 -0
  92. package/.next/standalone/src/lib/proof/sidecar.ts +66 -0
  93. package/.next/standalone/src/lib/proof/suggest-capture.ts +69 -0
  94. package/.next/standalone/src/lib/proof/types.ts +170 -0
  95. package/.next/standalone/src/lib/proof-config.ts +14 -0
  96. package/.next/standalone/src/middleware.ts +38 -0
  97. package/.next/standalone/src/stores/ai-panel-store.ts +58 -3
  98. package/.next/standalone/src/stores/editor-store.ts +115 -9
  99. package/.next/standalone/src/stores/proof-store.ts +123 -0
  100. package/.next/standalone/src/stores/view-width-store.ts +62 -0
  101. package/.next/standalone/src/tests/proof/activity-aggregator.test.ts +146 -0
  102. package/.next/standalone/src/tests/proof/agent-ownership.test.ts +140 -0
  103. package/.next/standalone/src/tests/proof/agents-install.test.ts +57 -0
  104. package/.next/standalone/src/tests/proof/better-auth.test.ts +68 -0
  105. package/.next/standalone/src/tests/proof/block-refs.test.ts +108 -0
  106. package/.next/standalone/src/tests/proof/blocks.test.ts +92 -0
  107. package/.next/standalone/src/tests/proof/comments-ops.test.ts +177 -0
  108. package/.next/standalone/src/tests/proof/editor-roundtrip.test.ts +85 -0
  109. package/.next/standalone/src/tests/proof/external-edit.test.ts +58 -0
  110. package/.next/standalone/src/tests/proof/file-lock.test.ts +80 -0
  111. package/.next/standalone/src/tests/proof/glob.test.ts +82 -0
  112. package/.next/standalone/src/tests/proof/helpers/auth-session.ts +27 -0
  113. package/.next/standalone/src/tests/proof/markdown-to-html.test.ts +46 -0
  114. package/.next/standalone/src/tests/proof/ops-applier.test.ts +368 -0
  115. package/.next/standalone/src/tests/proof/owner-init.test.ts +2 -0
  116. package/.next/standalone/src/tests/proof/parse-frontmatter.test.ts +60 -0
  117. package/.next/standalone/src/tests/proof/proof-span.test.ts +98 -0
  118. package/.next/standalone/src/tests/proof/rate-limit.test.ts +54 -0
  119. package/.next/standalone/src/tests/proof/registration-flow.test.ts +330 -0
  120. package/.next/standalone/src/tests/proof/registry.test.ts +169 -0
  121. package/.next/standalone/src/tests/proof/routes.test.ts +516 -0
  122. package/.next/standalone/src/tests/proof/sidecar-trim.test.ts +58 -0
  123. package/.next/standalone/src/tests/proof/suggestion-ops.test.ts +280 -0
  124. package/.next/standalone/src/tests/proof/wiki-content-put.test.ts +140 -0
  125. package/.next/standalone/src/tests/proof/wiki-routes-auth.test.ts +208 -0
  126. package/README.md +328 -99
  127. package/bin/wiki-viewer.js +57 -4
  128. package/package.json +19 -2
@@ -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(`📂 ${resolvedRoot}`);
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
- console.log(`🌐 https://${host}:${port}`);
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
- console.log(`🌐 http://${host}:${port}`);
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.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
  }