wiki-viewer 1.14.1 → 1.14.2
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/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/api/agent/activity/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/events/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/files/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/fs/file/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/fs/ls/[[...path]]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/fs/move/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/fs/search/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/internal/span/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/settings/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/sidecar/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/assets/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/share/[token]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/share/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/reveal/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/set-root/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/workspaces/[id]/open/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/workspaces/[id]/refresh/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/workspaces/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/system/workspaces/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/upload/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/app/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/backlinks/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/content/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/download/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/file/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/folder/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/git-branches/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/git-checkout/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/git-diff/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/git-file-info/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/git-history/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/git-pull/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/move/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/new-file/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/outlinks/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/page/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/presence/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/search/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/slugs/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/upload/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wiki/watch/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/middleware-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/package.json +1 -1
- package/bin/postbuild.js +21 -0
- package/package.json +1 -1
- package/.next/standalone/.github/workflows/publish.yml +0 -37
- package/.next/standalone/.handoffs/archive/handoff-20260612-113332.md +0 -98
- package/.next/standalone/.handoffs/archive/handoff-20260612-141032.md +0 -73
- package/.next/standalone/.pi/ownership.json +0 -3
- package/.next/standalone/AGENTS.md +0 -114
- package/.next/standalone/DESIGN.md +0 -521
- package/.next/standalone/README.md +0 -821
- package/.next/standalone/TODO.md +0 -20
- package/.next/standalone/agents/bootstrap-prompt.md +0 -14
- package/.next/standalone/agents/wiki-viewer-skill/SKILL.md +0 -456
- package/.next/standalone/bin/postbuild.js +0 -78
- package/.next/standalone/bin/wiki-viewer.js +0 -922
- package/.next/standalone/certificates/localhost-key.pem +0 -28
- package/.next/standalone/certificates/localhost.pem +0 -24
- package/.next/standalone/docs/agent-collab-plan.md +0 -1615
- package/.next/standalone/docs/agent-collab-v2-plan.md +0 -771
- package/.next/standalone/docs/agent-fs-plan.md +0 -232
- package/.next/standalone/docs/editorial-skin-spec.md +0 -242
- package/.next/standalone/docs/file-vs-collab-authority.md +0 -124
- package/.next/standalone/docs/mobile-readiness-spec.md +0 -229
- package/.next/standalone/docs/workspacing-plan.md +0 -364
- package/.next/standalone/packages/wiki-viewer-mcp/README.md +0 -195
- package/.next/standalone/packages/wiki-viewer-mcp/bench-e2e.mjs +0 -166
- package/.next/standalone/packages/wiki-viewer-mcp/bench-latency.mjs +0 -87
- package/.next/standalone/packages/wiki-viewer-mcp/bench-payload.mjs +0 -45
- package/.next/standalone/packages/wiki-viewer-mcp/dist/http-client.js +0 -331
- package/.next/standalone/packages/wiki-viewer-mcp/dist/index.js +0 -531
- package/.next/standalone/packages/wiki-viewer-mcp/dist/register.js +0 -94
- package/.next/standalone/packages/wiki-viewer-mcp/dist/state-cache.js +0 -28
- package/.next/standalone/packages/wiki-viewer-mcp/package-lock.json +0 -1716
- package/.next/standalone/packages/wiki-viewer-mcp/package.json +0 -41
- package/.next/standalone/packages/wiki-viewer-mcp/src/http-client.ts +0 -459
- package/.next/standalone/packages/wiki-viewer-mcp/src/index.ts +0 -638
- package/.next/standalone/packages/wiki-viewer-mcp/src/register.ts +0 -144
- package/.next/standalone/packages/wiki-viewer-mcp/src/state-cache.ts +0 -55
- package/.next/standalone/packages/wiki-viewer-mcp/tsconfig.json +0 -19
- package/.next/standalone/pnpm-lock.yaml +0 -6697
- package/.next/standalone/pnpm-workspace.yaml +0 -8
- package/.next/standalone/postcss.config.mjs +0 -2
- package/.next/standalone/src/app/api/agent/activity/route.ts +0 -59
- package/.next/standalone/src/app/api/agent/admin/agents/[agentId]/revoke/route.ts +0 -40
- package/.next/standalone/src/app/api/agent/admin/agents/route.ts +0 -33
- package/.next/standalone/src/app/api/agent/admin/registrations/[regId]/approve/route.ts +0 -83
- package/.next/standalone/src/app/api/agent/admin/registrations/[regId]/deny/route.ts +0 -36
- package/.next/standalone/src/app/api/agent/admin/registrations/route.ts +0 -27
- package/.next/standalone/src/app/api/agent/events/[...path]/route.ts +0 -148
- package/.next/standalone/src/app/api/agent/files/[...path]/route.ts +0 -219
- package/.next/standalone/src/app/api/agent/fs/file/[...path]/route.ts +0 -446
- package/.next/standalone/src/app/api/agent/fs/ls/[[...path]]/route.ts +0 -152
- package/.next/standalone/src/app/api/agent/fs/move/route.ts +0 -130
- package/.next/standalone/src/app/api/agent/fs/search/route.ts +0 -272
- package/.next/standalone/src/app/api/agent/internal/span/route.ts +0 -121
- package/.next/standalone/src/app/api/agent/register/[regId]/route.ts +0 -50
- package/.next/standalone/src/app/api/agent/register/route.ts +0 -118
- package/.next/standalone/src/app/api/agent/settings/route.ts +0 -34
- package/.next/standalone/src/app/api/agent/settings/token/regenerate/route.ts +0 -20
- package/.next/standalone/src/app/api/agent/sidecar/[...path]/route.ts +0 -53
- package/.next/standalone/src/app/api/agents/install/route.ts +0 -143
- package/.next/standalone/src/app/api/agents/skill/route.ts +0 -20
- package/.next/standalone/src/app/api/agents/skill.tar.gz/route.ts +0 -87
- package/.next/standalone/src/app/api/app-proxy/[...path]/route.ts +0 -247
- package/.next/standalone/src/app/api/assets/[...path]/route.ts +0 -75
- package/.next/standalone/src/app/api/auth/[...all]/route.ts +0 -7
- package/.next/standalone/src/app/api/owner/init/route.ts +0 -14
- package/.next/standalone/src/app/api/share/[token]/route.ts +0 -269
- package/.next/standalone/src/app/api/share/route.ts +0 -127
- package/.next/standalone/src/app/api/system/admins/route.ts +0 -103
- package/.next/standalone/src/app/api/system/auth-config/route.ts +0 -22
- package/.next/standalone/src/app/api/system/auth-settings/route.ts +0 -86
- package/.next/standalone/src/app/api/system/browse/route.ts +0 -82
- package/.next/standalone/src/app/api/system/clear-root/route.ts +0 -16
- package/.next/standalone/src/app/api/system/config/route.ts +0 -14
- package/.next/standalone/src/app/api/system/pins/route.ts +0 -38
- package/.next/standalone/src/app/api/system/reveal/route.ts +0 -36
- package/.next/standalone/src/app/api/system/root-status/route.ts +0 -13
- package/.next/standalone/src/app/api/system/set-root/route.ts +0 -53
- package/.next/standalone/src/app/api/system/users/route.ts +0 -120
- package/.next/standalone/src/app/api/system/workspaces/[id]/open/route.ts +0 -34
- package/.next/standalone/src/app/api/system/workspaces/[id]/refresh/route.ts +0 -32
- package/.next/standalone/src/app/api/system/workspaces/[id]/route.ts +0 -78
- package/.next/standalone/src/app/api/system/workspaces/route.ts +0 -128
- package/.next/standalone/src/app/api/upload/[...path]/route.ts +0 -85
- package/.next/standalone/src/app/api/wiki/app/route.ts +0 -60
- package/.next/standalone/src/app/api/wiki/backlinks/route.ts +0 -29
- package/.next/standalone/src/app/api/wiki/content/route.ts +0 -159
- package/.next/standalone/src/app/api/wiki/download/route.ts +0 -100
- package/.next/standalone/src/app/api/wiki/file/route.ts +0 -57
- package/.next/standalone/src/app/api/wiki/folder/route.ts +0 -34
- package/.next/standalone/src/app/api/wiki/git-branches/route.ts +0 -32
- package/.next/standalone/src/app/api/wiki/git-checkout/route.ts +0 -45
- package/.next/standalone/src/app/api/wiki/git-diff/route.ts +0 -33
- package/.next/standalone/src/app/api/wiki/git-file-info/route.ts +0 -27
- package/.next/standalone/src/app/api/wiki/git-history/route.ts +0 -27
- package/.next/standalone/src/app/api/wiki/git-pull/route.ts +0 -48
- package/.next/standalone/src/app/api/wiki/move/route.ts +0 -61
- package/.next/standalone/src/app/api/wiki/new-file/route.ts +0 -56
- package/.next/standalone/src/app/api/wiki/outlinks/route.ts +0 -76
- package/.next/standalone/src/app/api/wiki/page/route.ts +0 -92
- package/.next/standalone/src/app/api/wiki/presence/route.ts +0 -56
- package/.next/standalone/src/app/api/wiki/route.ts +0 -116
- package/.next/standalone/src/app/api/wiki/search/route.ts +0 -44
- package/.next/standalone/src/app/api/wiki/slugs/route.ts +0 -54
- package/.next/standalone/src/app/api/wiki/upload/route.ts +0 -95
- package/.next/standalone/src/app/api/wiki/watch/route.ts +0 -67
- package/.next/standalone/src/app/globals.css +0 -1249
- package/.next/standalone/src/app/icon.svg +0 -11
- package/.next/standalone/src/app/layout.tsx +0 -78
- package/.next/standalone/src/app/manifest.ts +0 -30
- package/.next/standalone/src/app/page.tsx +0 -3260
- package/.next/standalone/src/app/s/[token]/page.tsx +0 -357
- package/.next/standalone/src/app/signin/page.tsx +0 -16
- package/.next/standalone/src/app/signin/signin-form.tsx +0 -238
- package/.next/standalone/src/components/ai-panel/activity-row.tsx +0 -284
- package/.next/standalone/src/components/ai-panel/ai-panel.tsx +0 -311
- package/.next/standalone/src/components/ai-panel/token-section.tsx +0 -313
- package/.next/standalone/src/components/auth-settings-sheet.tsx +0 -474
- package/.next/standalone/src/components/confirm-dialog.tsx +0 -56
- package/.next/standalone/src/components/dir-picker.tsx +0 -606
- package/.next/standalone/src/components/editor/backlinks-panel.tsx +0 -139
- package/.next/standalone/src/components/editor/bubble-menu.tsx +0 -346
- package/.next/standalone/src/components/editor/callout-extension.ts +0 -36
- package/.next/standalone/src/components/editor/comment-pip.tsx +0 -56
- package/.next/standalone/src/components/editor/comment-thread.tsx +0 -254
- package/.next/standalone/src/components/editor/csv-viewer.tsx +0 -379
- package/.next/standalone/src/components/editor/document-outline.tsx +0 -230
- package/.next/standalone/src/components/editor/editor-toolbar.tsx +0 -564
- package/.next/standalone/src/components/editor/editor.tsx +0 -1327
- package/.next/standalone/src/components/editor/extensions/drag-handle.ts +0 -325
- package/.next/standalone/src/components/editor/extensions/heading-anchors.ts +0 -55
- package/.next/standalone/src/components/editor/extensions/proof-span.ts +0 -60
- package/.next/standalone/src/components/editor/extensions/resizable-image.tsx +0 -159
- package/.next/standalone/src/components/editor/extensions.ts +0 -150
- package/.next/standalone/src/components/editor/file-fallback-viewer.tsx +0 -75
- package/.next/standalone/src/components/editor/folder-index.tsx +0 -236
- package/.next/standalone/src/components/editor/google-doc-viewer.tsx +0 -73
- package/.next/standalone/src/components/editor/image-viewer.tsx +0 -57
- package/.next/standalone/src/components/editor/large-file-gate.tsx +0 -108
- package/.next/standalone/src/components/editor/link-popover.tsx +0 -111
- package/.next/standalone/src/components/editor/media-popover.tsx +0 -212
- package/.next/standalone/src/components/editor/media-viewer.tsx +0 -70
- package/.next/standalone/src/components/editor/mermaid-viewer.tsx +0 -286
- package/.next/standalone/src/components/editor/node-app-viewer.tsx +0 -328
- package/.next/standalone/src/components/editor/notebook-viewer.tsx +0 -371
- package/.next/standalone/src/components/editor/office/docx-viewer.tsx +0 -93
- package/.next/standalone/src/components/editor/office/office-chrome.tsx +0 -83
- package/.next/standalone/src/components/editor/office/pptx-viewer.tsx +0 -104
- package/.next/standalone/src/components/editor/office/xlsx-viewer.tsx +0 -192
- package/.next/standalone/src/components/editor/pdf-viewer.tsx +0 -32
- package/.next/standalone/src/components/editor/proof-span-popover.tsx +0 -162
- package/.next/standalone/src/components/editor/slash-commands.tsx +0 -629
- package/.next/standalone/src/components/editor/source-viewer.tsx +0 -289
- package/.next/standalone/src/components/editor/suggest-edit-popover.tsx +0 -229
- package/.next/standalone/src/components/editor/suggestion-card.tsx +0 -206
- package/.next/standalone/src/components/editor/table-menu.tsx +0 -232
- package/.next/standalone/src/components/editor/view-mode-comment-button.tsx +0 -77
- package/.next/standalone/src/components/editor/website-viewer.tsx +0 -75
- package/.next/standalone/src/components/editor/wiki-link-create-dialog.tsx +0 -189
- package/.next/standalone/src/components/editor/wiki-link-decorator.ts +0 -79
- package/.next/standalone/src/components/editor/wiki-link-extension.ts +0 -120
- package/.next/standalone/src/components/editor/wiki-link-picker.tsx +0 -250
- package/.next/standalone/src/components/layout/viewer-toolbar.tsx +0 -54
- package/.next/standalone/src/components/search/search-command-dialog.tsx +0 -246
- package/.next/standalone/src/components/search/sidebar-search-box.tsx +0 -121
- package/.next/standalone/src/components/search/snippet-text.tsx +0 -48
- package/.next/standalone/src/components/share-dialog.tsx +0 -307
- package/.next/standalone/src/components/theme-provider.tsx +0 -16
- package/.next/standalone/src/components/theme-toggle.tsx +0 -24
- package/.next/standalone/src/components/ui/badge.tsx +0 -35
- package/.next/standalone/src/components/ui/button.tsx +0 -56
- package/.next/standalone/src/components/ui/card.tsx +0 -63
- package/.next/standalone/src/components/ui/collapsible.tsx +0 -9
- package/.next/standalone/src/components/ui/command.tsx +0 -151
- package/.next/standalone/src/components/ui/context-menu.tsx +0 -191
- package/.next/standalone/src/components/ui/dialog.tsx +0 -119
- package/.next/standalone/src/components/ui/dropdown-menu.tsx +0 -194
- package/.next/standalone/src/components/ui/input.tsx +0 -22
- package/.next/standalone/src/components/ui/label.tsx +0 -25
- package/.next/standalone/src/components/ui/popover.tsx +0 -33
- package/.next/standalone/src/components/ui/scroll-area.tsx +0 -47
- package/.next/standalone/src/components/ui/select.tsx +0 -156
- package/.next/standalone/src/components/ui/separator.tsx +0 -30
- package/.next/standalone/src/components/ui/sheet.tsx +0 -140
- package/.next/standalone/src/components/ui/skeleton.tsx +0 -15
- package/.next/standalone/src/components/ui/switch.tsx +0 -28
- package/.next/standalone/src/components/ui/tabs.tsx +0 -54
- package/.next/standalone/src/components/ui/textarea.tsx +0 -21
- package/.next/standalone/src/components/ui/tip.tsx +0 -23
- package/.next/standalone/src/components/ui/toggle-group.tsx +0 -41
- package/.next/standalone/src/components/ui/tooltip.tsx +0 -27
- package/.next/standalone/src/components/view-width-toggle.tsx +0 -70
- package/.next/standalone/src/components/wiki/frontmatter-header.tsx +0 -164
- package/.next/standalone/src/hooks/use-is-mobile.ts +0 -14
- package/.next/standalone/src/lib/app-runner.ts +0 -272
- package/.next/standalone/src/lib/auth/admin.ts +0 -120
- package/.next/standalone/src/lib/auth/allowlist.ts +0 -50
- package/.next/standalone/src/lib/auth/client.ts +0 -4
- package/.next/standalone/src/lib/auth/csrf.ts +0 -68
- package/.next/standalone/src/lib/auth/server.ts +0 -215
- package/.next/standalone/src/lib/cabinets/tree.ts +0 -75
- package/.next/standalone/src/lib/config.ts +0 -114
- package/.next/standalone/src/lib/embeds/detect.ts +0 -142
- package/.next/standalone/src/lib/git-secrets.ts +0 -65
- package/.next/standalone/src/lib/git.ts +0 -503
- package/.next/standalone/src/lib/google/detect.ts +0 -107
- package/.next/standalone/src/lib/markdown/parse-frontmatter.ts +0 -104
- package/.next/standalone/src/lib/markdown/remark-wikilinks.ts +0 -100
- package/.next/standalone/src/lib/markdown/sanitize-schema.ts +0 -106
- package/.next/standalone/src/lib/markdown/to-html.ts +0 -282
- package/.next/standalone/src/lib/markdown/to-markdown.ts +0 -252
- package/.next/standalone/src/lib/proof/activity-shared.ts +0 -31
- package/.next/standalone/src/lib/proof/activity.ts +0 -74
- package/.next/standalone/src/lib/proof/audit.ts +0 -88
- package/.next/standalone/src/lib/proof/auth.ts +0 -143
- package/.next/standalone/src/lib/proof/block-refs.ts +0 -133
- package/.next/standalone/src/lib/proof/blocks.ts +0 -73
- package/.next/standalone/src/lib/proof/client-auth.ts +0 -23
- package/.next/standalone/src/lib/proof/collab-state.ts +0 -81
- package/.next/standalone/src/lib/proof/event-bus.ts +0 -47
- package/.next/standalone/src/lib/proof/file-lock.ts +0 -43
- package/.next/standalone/src/lib/proof/glob.ts +0 -51
- package/.next/standalone/src/lib/proof/idempotency.ts +0 -37
- package/.next/standalone/src/lib/proof/lease.ts +0 -117
- package/.next/standalone/src/lib/proof/mutex.ts +0 -36
- package/.next/standalone/src/lib/proof/ops-applier.ts +0 -727
- package/.next/standalone/src/lib/proof/owner-auth.ts +0 -2
- package/.next/standalone/src/lib/proof/pending.ts +0 -97
- package/.next/standalone/src/lib/proof/proof-span.ts +0 -141
- package/.next/standalone/src/lib/proof/rate-limit.ts +0 -53
- package/.next/standalone/src/lib/proof/raw-fs.ts +0 -197
- package/.next/standalone/src/lib/proof/register-rate-limit.ts +0 -53
- package/.next/standalone/src/lib/proof/registry.ts +0 -195
- package/.next/standalone/src/lib/proof/sidecar.ts +0 -103
- package/.next/standalone/src/lib/proof/suggest-capture.ts +0 -69
- package/.next/standalone/src/lib/proof/types.ts +0 -182
- package/.next/standalone/src/lib/proof-config.ts +0 -14
- package/.next/standalone/src/lib/root-dir.ts +0 -35
- package/.next/standalone/src/lib/search/indexable-exts.ts +0 -25
- package/.next/standalone/src/lib/search/indexer.ts +0 -634
- package/.next/standalone/src/lib/search/sanitize.ts +0 -35
- package/.next/standalone/src/lib/search/search-db.ts +0 -57
- package/.next/standalone/src/lib/search/watcher-pool.ts +0 -79
- package/.next/standalone/src/lib/shared-docs/db.ts +0 -177
- package/.next/standalone/src/lib/toast.ts +0 -9
- package/.next/standalone/src/lib/utils.ts +0 -6
- package/.next/standalone/src/lib/wiki-helpers.ts +0 -36
- package/.next/standalone/src/lib/workspace-client.ts +0 -82
- package/.next/standalone/src/lib/workspace-context.ts +0 -173
- package/.next/standalone/src/lib/workspaces.ts +0 -400
- package/.next/standalone/src/middleware.ts +0 -44
- package/.next/standalone/src/stores/ai-panel-store.ts +0 -79
- package/.next/standalone/src/stores/editor-store.ts +0 -439
- package/.next/standalone/src/stores/pin-store.ts +0 -56
- package/.next/standalone/src/stores/proof-store.ts +0 -124
- package/.next/standalone/src/stores/recent-store.ts +0 -51
- package/.next/standalone/src/stores/search-store.ts +0 -104
- package/.next/standalone/src/stores/show-hidden-store.ts +0 -26
- package/.next/standalone/src/stores/sidebar-width-store.ts +0 -39
- package/.next/standalone/src/stores/skin-store.ts +0 -42
- package/.next/standalone/src/stores/tree-store.ts +0 -52
- package/.next/standalone/src/stores/view-width-store.ts +0 -101
- package/.next/standalone/src/stores/wiki-slugs-store.ts +0 -75
- package/.next/standalone/src/tests/proof/activity-aggregator.test.ts +0 -146
- package/.next/standalone/src/tests/proof/admin-create-user.test.ts +0 -43
- package/.next/standalone/src/tests/proof/agent-fs.test.ts +0 -973
- package/.next/standalone/src/tests/proof/agent-ownership.test.ts +0 -140
- package/.next/standalone/src/tests/proof/agent-workspace-scope.test.ts +0 -134
- package/.next/standalone/src/tests/proof/agents-install.test.ts +0 -110
- package/.next/standalone/src/tests/proof/bench-write.ts +0 -179
- package/.next/standalone/src/tests/proof/better-auth.test.ts +0 -68
- package/.next/standalone/src/tests/proof/block-refs.test.ts +0 -108
- package/.next/standalone/src/tests/proof/blocks.test.ts +0 -92
- package/.next/standalone/src/tests/proof/collab-state.test.ts +0 -501
- package/.next/standalone/src/tests/proof/comments-ops.test.ts +0 -177
- package/.next/standalone/src/tests/proof/editor-roundtrip.test.ts +0 -85
- package/.next/standalone/src/tests/proof/external-edit.test.ts +0 -58
- package/.next/standalone/src/tests/proof/file-lock.test.ts +0 -80
- package/.next/standalone/src/tests/proof/git-branches-checkout.test.ts +0 -136
- package/.next/standalone/src/tests/proof/git-read-features.test.ts +0 -473
- package/.next/standalone/src/tests/proof/git-secrets.test.ts +0 -138
- package/.next/standalone/src/tests/proof/git-sparse.test.ts +0 -257
- package/.next/standalone/src/tests/proof/git-workspace.test.ts +0 -135
- package/.next/standalone/src/tests/proof/git.test.ts +0 -243
- package/.next/standalone/src/tests/proof/glob.test.ts +0 -82
- package/.next/standalone/src/tests/proof/helpers/auth-session.ts +0 -27
- package/.next/standalone/src/tests/proof/markdown-to-html.test.ts +0 -46
- package/.next/standalone/src/tests/proof/ops-applier.test.ts +0 -368
- package/.next/standalone/src/tests/proof/owner-init.test.ts +0 -2
- package/.next/standalone/src/tests/proof/parse-frontmatter.test.ts +0 -60
- package/.next/standalone/src/tests/proof/preload.ts +0 -21
- package/.next/standalone/src/tests/proof/proof-span.test.ts +0 -98
- package/.next/standalone/src/tests/proof/rate-limit.test.ts +0 -54
- package/.next/standalone/src/tests/proof/readonly-enforcement.test.ts +0 -161
- package/.next/standalone/src/tests/proof/reconcile-sidecar.test.ts +0 -195
- package/.next/standalone/src/tests/proof/registration-flow.test.ts +0 -330
- package/.next/standalone/src/tests/proof/registry.test.ts +0 -169
- package/.next/standalone/src/tests/proof/routes.test.ts +0 -516
- package/.next/standalone/src/tests/proof/search-index.test.ts +0 -376
- package/.next/standalone/src/tests/proof/sidecar-lifecycle.test.ts +0 -177
- package/.next/standalone/src/tests/proof/sidecar-trim.test.ts +0 -58
- package/.next/standalone/src/tests/proof/suggestion-ops.test.ts +0 -280
- package/.next/standalone/src/tests/proof/wiki-content-put.test.ts +0 -140
- package/.next/standalone/src/tests/proof/wiki-routes-auth.test.ts +0 -208
- package/.next/standalone/src/tests/proof/workspace-isolation.test.ts +0 -87
- package/.next/standalone/src/tests/proof/workspaces-api.test.ts +0 -227
- package/.next/standalone/src/types/index.ts +0 -47
- package/.next/standalone/tailwind.config.ts +0 -191
- package/.next/standalone/tsconfig.json +0 -41
- package/.next/standalone/tsconfig.tsbuildinfo +0 -1
- /package/.next/standalone/.next/static/{WMOTgfV82apmdovxzgbMx → rRyvFORvJoc5OWbCR2A_P}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{WMOTgfV82apmdovxzgbMx → rRyvFORvJoc5OWbCR2A_P}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{WMOTgfV82apmdovxzgbMx → rRyvFORvJoc5OWbCR2A_P}/_ssgManifest.js +0 -0
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
import CodeBlockLowlight from "@tiptap/extension-code-block-lowlight";
|
|
2
|
-
import Link from "@tiptap/extension-link";
|
|
3
|
-
import Placeholder from "@tiptap/extension-placeholder";
|
|
4
|
-
import Subscript from "@tiptap/extension-subscript";
|
|
5
|
-
import Superscript from "@tiptap/extension-superscript";
|
|
6
|
-
import { Table } from "@tiptap/extension-table";
|
|
7
|
-
import { TableCell } from "@tiptap/extension-table-cell";
|
|
8
|
-
import { TableHeader } from "@tiptap/extension-table-header";
|
|
9
|
-
import { TableRow } from "@tiptap/extension-table-row";
|
|
10
|
-
import TaskItem from "@tiptap/extension-task-item";
|
|
11
|
-
import TaskList from "@tiptap/extension-task-list";
|
|
12
|
-
import TextAlign from "@tiptap/extension-text-align";
|
|
13
|
-
import StarterKit from "@tiptap/starter-kit";
|
|
14
|
-
import bash from "highlight.js/lib/languages/bash";
|
|
15
|
-
import css from "highlight.js/lib/languages/css";
|
|
16
|
-
import go from "highlight.js/lib/languages/go";
|
|
17
|
-
import javascript from "highlight.js/lib/languages/javascript";
|
|
18
|
-
import json from "highlight.js/lib/languages/json";
|
|
19
|
-
import markdown from "highlight.js/lib/languages/markdown";
|
|
20
|
-
import python from "highlight.js/lib/languages/python";
|
|
21
|
-
import rust from "highlight.js/lib/languages/rust";
|
|
22
|
-
import shell from "highlight.js/lib/languages/shell";
|
|
23
|
-
import sql from "highlight.js/lib/languages/sql";
|
|
24
|
-
import typescript from "highlight.js/lib/languages/typescript";
|
|
25
|
-
import xml from "highlight.js/lib/languages/xml";
|
|
26
|
-
import yaml from "highlight.js/lib/languages/yaml";
|
|
27
|
-
import { createLowlight } from "lowlight";
|
|
28
|
-
import { CalloutExtension } from "./callout-extension";
|
|
29
|
-
import { DragHandle } from "./extensions/drag-handle";
|
|
30
|
-
import { HeadingAnchors } from "./extensions/heading-anchors";
|
|
31
|
-
import { ProofSpan } from "./extensions/proof-span";
|
|
32
|
-
import { ResizableImage } from "./extensions/resizable-image";
|
|
33
|
-
import { WikiLink } from "./wiki-link-extension";
|
|
34
|
-
|
|
35
|
-
// Curated language set: covers ~95% of real-world snippets. The full `common`
|
|
36
|
-
// import bundles 35+ language parsers (~70 kB gzipped) that users
|
|
37
|
-
// rarely touch — swapping it for this 13-language list cuts the editor chunk
|
|
38
|
-
// meaningfully. Add languages as demand grows.
|
|
39
|
-
const lowlight = createLowlight({
|
|
40
|
-
bash,
|
|
41
|
-
css,
|
|
42
|
-
go,
|
|
43
|
-
javascript,
|
|
44
|
-
json,
|
|
45
|
-
markdown,
|
|
46
|
-
python,
|
|
47
|
-
rust,
|
|
48
|
-
shell,
|
|
49
|
-
sql,
|
|
50
|
-
typescript,
|
|
51
|
-
xml,
|
|
52
|
-
yaml,
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
export const editorExtensions = [
|
|
56
|
-
StarterKit.configure({
|
|
57
|
-
heading: { levels: [1, 2, 3, 4] },
|
|
58
|
-
codeBlock: false, // replaced by CodeBlockLowlight
|
|
59
|
-
// StarterKit v3 bundles Link + Underline — we register our own customized
|
|
60
|
-
// versions below, so disable the bundled copies to avoid duplicate-extension warnings.
|
|
61
|
-
link: false,
|
|
62
|
-
underline: false,
|
|
63
|
-
}),
|
|
64
|
-
CodeBlockLowlight.configure({
|
|
65
|
-
lowlight,
|
|
66
|
-
HTMLAttributes: {
|
|
67
|
-
class: "rounded-md bg-muted p-4 font-mono text-sm",
|
|
68
|
-
},
|
|
69
|
-
}),
|
|
70
|
-
Placeholder.configure({
|
|
71
|
-
placeholder: "Start writing, or press '/' for commands...",
|
|
72
|
-
}),
|
|
73
|
-
ResizableImage.configure({
|
|
74
|
-
HTMLAttributes: {
|
|
75
|
-
class: "rounded-lg max-w-full",
|
|
76
|
-
},
|
|
77
|
-
allowBase64: false,
|
|
78
|
-
}),
|
|
79
|
-
Table.configure({
|
|
80
|
-
resizable: true,
|
|
81
|
-
lastColumnResizable: false,
|
|
82
|
-
HTMLAttributes: {
|
|
83
|
-
class: "border-collapse w-full",
|
|
84
|
-
},
|
|
85
|
-
}),
|
|
86
|
-
TableRow,
|
|
87
|
-
TableCell,
|
|
88
|
-
TableHeader,
|
|
89
|
-
TaskList.configure({
|
|
90
|
-
HTMLAttributes: {
|
|
91
|
-
class: "task-list",
|
|
92
|
-
},
|
|
93
|
-
}),
|
|
94
|
-
TaskItem.configure({
|
|
95
|
-
nested: true,
|
|
96
|
-
}),
|
|
97
|
-
Link.configure({
|
|
98
|
-
openOnClick: false, // we handle clicks ourselves in the editor
|
|
99
|
-
HTMLAttributes: {
|
|
100
|
-
class: "text-primary underline cursor-pointer",
|
|
101
|
-
},
|
|
102
|
-
}).extend({
|
|
103
|
-
parseHTML() {
|
|
104
|
-
return [
|
|
105
|
-
{
|
|
106
|
-
tag: 'a[href]:not([data-wiki-link="true"])',
|
|
107
|
-
},
|
|
108
|
-
];
|
|
109
|
-
},
|
|
110
|
-
// Move the link shortcut off Mod-K — that key is owned by the global
|
|
111
|
-
// search palette everywhere in the app, including inside the editor.
|
|
112
|
-
addKeyboardShortcuts() {
|
|
113
|
-
return {
|
|
114
|
-
"Mod-e": () => {
|
|
115
|
-
const { state } = this.editor;
|
|
116
|
-
const { from, to } = state.selection;
|
|
117
|
-
if (from === to) return false;
|
|
118
|
-
const prevUrl = this.editor.getAttributes("link").href ?? "";
|
|
119
|
-
const url =
|
|
120
|
-
typeof window !== "undefined"
|
|
121
|
-
? window.prompt("Link URL", prevUrl)
|
|
122
|
-
: null;
|
|
123
|
-
if (url === null) return false;
|
|
124
|
-
if (url === "") {
|
|
125
|
-
return this.editor
|
|
126
|
-
.chain()
|
|
127
|
-
.focus()
|
|
128
|
-
.extendMarkRange("link")
|
|
129
|
-
.unsetLink()
|
|
130
|
-
.run();
|
|
131
|
-
}
|
|
132
|
-
return this.editor
|
|
133
|
-
.chain()
|
|
134
|
-
.focus()
|
|
135
|
-
.extendMarkRange("link")
|
|
136
|
-
.setLink({ href: url })
|
|
137
|
-
.run();
|
|
138
|
-
},
|
|
139
|
-
};
|
|
140
|
-
},
|
|
141
|
-
}),
|
|
142
|
-
CalloutExtension,
|
|
143
|
-
ProofSpan,
|
|
144
|
-
TextAlign.configure({ types: ["heading", "paragraph"] }),
|
|
145
|
-
Subscript,
|
|
146
|
-
Superscript,
|
|
147
|
-
DragHandle,
|
|
148
|
-
HeadingAnchors,
|
|
149
|
-
WikiLink,
|
|
150
|
-
];
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { Download, File, FolderOpen } from "lucide-react";
|
|
4
|
-
import { ViewerToolbar } from "@/components/layout/viewer-toolbar";
|
|
5
|
-
import { Button } from "@/components/ui/button";
|
|
6
|
-
import { withWs, wsFetch } from "@/lib/workspace-client";
|
|
7
|
-
|
|
8
|
-
interface FileFallbackViewerProps {
|
|
9
|
-
path: string;
|
|
10
|
-
title: string;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export function FileFallbackViewer({ path }: FileFallbackViewerProps) {
|
|
14
|
-
const assetUrl = withWs(`/api/assets/${path}`);
|
|
15
|
-
const filename = path.split("/").pop() || path;
|
|
16
|
-
const ext = filename.includes(".")
|
|
17
|
-
? filename.split(".").pop()?.toUpperCase()
|
|
18
|
-
: "";
|
|
19
|
-
|
|
20
|
-
const revealInFinder = async () => {
|
|
21
|
-
try {
|
|
22
|
-
await wsFetch("/api/system/reveal", {
|
|
23
|
-
method: "POST",
|
|
24
|
-
headers: { "Content-Type": "application/json" },
|
|
25
|
-
body: JSON.stringify({ path }),
|
|
26
|
-
});
|
|
27
|
-
} catch {
|
|
28
|
-
/* ignore */
|
|
29
|
-
}
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
return (
|
|
33
|
-
<div className="flex-1 flex flex-col overflow-hidden">
|
|
34
|
-
<ViewerToolbar path={path} badge={ext || undefined} />
|
|
35
|
-
<div className="flex-1 flex items-center justify-center">
|
|
36
|
-
<div className="flex flex-col items-center gap-4 text-center max-w-sm">
|
|
37
|
-
<div className="flex size-16 items-center justify-center rounded-2xl bg-muted">
|
|
38
|
-
<File className="size-8 text-muted-foreground/50" />
|
|
39
|
-
</div>
|
|
40
|
-
<div className="space-y-1">
|
|
41
|
-
<p className="text-sm font-medium">{filename}</p>
|
|
42
|
-
<p className="text-xs text-muted-foreground">
|
|
43
|
-
This file type can't be previewed in Cabinet.
|
|
44
|
-
</p>
|
|
45
|
-
</div>
|
|
46
|
-
<div className="flex items-center gap-2">
|
|
47
|
-
<Button
|
|
48
|
-
variant="outline"
|
|
49
|
-
size="sm"
|
|
50
|
-
className="gap-2"
|
|
51
|
-
onClick={revealInFinder}
|
|
52
|
-
>
|
|
53
|
-
<FolderOpen className="h-4 w-4" />
|
|
54
|
-
Open in Finder
|
|
55
|
-
</Button>
|
|
56
|
-
<Button
|
|
57
|
-
variant="outline"
|
|
58
|
-
size="sm"
|
|
59
|
-
className="gap-2"
|
|
60
|
-
onClick={() => {
|
|
61
|
-
const a = document.createElement("a");
|
|
62
|
-
a.href = assetUrl;
|
|
63
|
-
a.download = filename;
|
|
64
|
-
a.click();
|
|
65
|
-
}}
|
|
66
|
-
>
|
|
67
|
-
<Download className="h-4 w-4" />
|
|
68
|
-
Download
|
|
69
|
-
</Button>
|
|
70
|
-
</div>
|
|
71
|
-
</div>
|
|
72
|
-
</div>
|
|
73
|
-
</div>
|
|
74
|
-
);
|
|
75
|
-
}
|
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
AppWindow,
|
|
5
|
-
FileAudio,
|
|
6
|
-
FileCode2,
|
|
7
|
-
FileImage,
|
|
8
|
-
FileSpreadsheet,
|
|
9
|
-
FileText,
|
|
10
|
-
FileVideo,
|
|
11
|
-
Folder,
|
|
12
|
-
Globe,
|
|
13
|
-
LayoutGrid,
|
|
14
|
-
List as ListIcon,
|
|
15
|
-
} from "lucide-react";
|
|
16
|
-
import { useMemo, useState } from "react";
|
|
17
|
-
import { useEditorStore } from "@/stores/editor-store";
|
|
18
|
-
import { useTreeStore } from "@/stores/tree-store";
|
|
19
|
-
import type { TreeNode } from "@/types";
|
|
20
|
-
import { withWs } from "@/lib/workspace-client";
|
|
21
|
-
|
|
22
|
-
type ViewMode = "list" | "gallery";
|
|
23
|
-
|
|
24
|
-
const VIEW_MODE_KEY = "kb-folder-view-mode";
|
|
25
|
-
|
|
26
|
-
function loadModePref(path: string): ViewMode | null {
|
|
27
|
-
if (typeof window === "undefined") return null;
|
|
28
|
-
try {
|
|
29
|
-
const raw = localStorage.getItem(VIEW_MODE_KEY);
|
|
30
|
-
if (!raw) return null;
|
|
31
|
-
const parsed = JSON.parse(raw) as Record<string, ViewMode>;
|
|
32
|
-
return parsed[path] ?? null;
|
|
33
|
-
} catch {
|
|
34
|
-
return null;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function saveModePref(path: string, mode: ViewMode) {
|
|
39
|
-
if (typeof window === "undefined") return;
|
|
40
|
-
try {
|
|
41
|
-
const raw = localStorage.getItem(VIEW_MODE_KEY);
|
|
42
|
-
const parsed = raw ? (JSON.parse(raw) as Record<string, ViewMode>) : {};
|
|
43
|
-
parsed[path] = mode;
|
|
44
|
-
localStorage.setItem(VIEW_MODE_KEY, JSON.stringify(parsed));
|
|
45
|
-
} catch {
|
|
46
|
-
// ignore quota / parse errors
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function isImageChild(node: TreeNode): boolean {
|
|
51
|
-
return node.type === "image";
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// A folder is "image-heavy" when it has enough images to make a gallery feel
|
|
55
|
-
// useful AND images dominate the child set. Tuned for moodboards and
|
|
56
|
-
// screenshot dumps without surprising mixed folders.
|
|
57
|
-
function isImageHeavy(children: TreeNode[]): boolean {
|
|
58
|
-
if (children.length === 0) return false;
|
|
59
|
-
const images = children.filter(isImageChild).length;
|
|
60
|
-
return images >= 4 && images / children.length >= 0.6;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
function iconFor(node: TreeNode) {
|
|
64
|
-
switch (node.type) {
|
|
65
|
-
case "directory":
|
|
66
|
-
case "cabinet":
|
|
67
|
-
return Folder;
|
|
68
|
-
case "image":
|
|
69
|
-
return FileImage;
|
|
70
|
-
case "video":
|
|
71
|
-
return FileVideo;
|
|
72
|
-
case "audio":
|
|
73
|
-
return FileAudio;
|
|
74
|
-
case "code":
|
|
75
|
-
return FileCode2;
|
|
76
|
-
case "csv":
|
|
77
|
-
case "xlsx":
|
|
78
|
-
return FileSpreadsheet;
|
|
79
|
-
case "website":
|
|
80
|
-
return Globe;
|
|
81
|
-
case "app":
|
|
82
|
-
return AppWindow;
|
|
83
|
-
default:
|
|
84
|
-
return FileText;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function navigateTo(path: string) {
|
|
89
|
-
const { selectPage, expandPath } = useTreeStore.getState();
|
|
90
|
-
const parts = path.split("/");
|
|
91
|
-
for (let i = 1; i < parts.length; i++) {
|
|
92
|
-
expandPath(parts.slice(0, i).join("/"));
|
|
93
|
-
}
|
|
94
|
-
selectPage(path);
|
|
95
|
-
void useEditorStore.getState().loadPage(path);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
interface FolderIndexProps {
|
|
99
|
-
folderPath: string;
|
|
100
|
-
entries: TreeNode[];
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// The parent passes a `key={folderPath}` so this component remounts when the
|
|
104
|
-
// folder changes — that's why state can safely seed from the path on mount
|
|
105
|
-
// without a re-sync effect.
|
|
106
|
-
export function FolderIndex({ folderPath, entries }: FolderIndexProps) {
|
|
107
|
-
const imageHeavy = useMemo(() => isImageHeavy(entries), [entries]);
|
|
108
|
-
|
|
109
|
-
const [mode, setMode] = useState<ViewMode>(() => {
|
|
110
|
-
const saved = loadModePref(folderPath);
|
|
111
|
-
if (saved) return saved;
|
|
112
|
-
return imageHeavy ? "gallery" : "list";
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
const onSetMode = (next: ViewMode) => {
|
|
116
|
-
setMode(next);
|
|
117
|
-
saveModePref(folderPath, next);
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
// Sort: directories first, then by name. Stable so siblings stay grouped.
|
|
121
|
-
const sorted = useMemo(() => {
|
|
122
|
-
const copy = [...entries];
|
|
123
|
-
copy.sort((a, b) => {
|
|
124
|
-
const aDir = a.type === "directory" || a.type === "cabinet";
|
|
125
|
-
const bDir = b.type === "directory" || b.type === "cabinet";
|
|
126
|
-
if (aDir !== bDir) return aDir ? -1 : 1;
|
|
127
|
-
return a.name.localeCompare(b.name);
|
|
128
|
-
});
|
|
129
|
-
return copy;
|
|
130
|
-
}, [entries]);
|
|
131
|
-
|
|
132
|
-
return (
|
|
133
|
-
<div className="space-y-3">
|
|
134
|
-
<div className="flex items-center justify-between">
|
|
135
|
-
<p className="text-[11px] uppercase tracking-wider text-muted-foreground/70">
|
|
136
|
-
{sorted.length} {sorted.length === 1 ? "item" : "items"}
|
|
137
|
-
</p>
|
|
138
|
-
<div className="inline-flex items-center rounded-md border border-border p-0.5 text-[11px]">
|
|
139
|
-
<button
|
|
140
|
-
onClick={() => onSetMode("list")}
|
|
141
|
-
className={`flex items-center gap-1 px-2 py-1 rounded transition-colors ${
|
|
142
|
-
mode === "list"
|
|
143
|
-
? "bg-accent text-foreground"
|
|
144
|
-
: "text-muted-foreground hover:text-foreground"
|
|
145
|
-
}`}
|
|
146
|
-
aria-pressed={mode === "list"}
|
|
147
|
-
title="List view"
|
|
148
|
-
>
|
|
149
|
-
<ListIcon className="h-3 w-3" />
|
|
150
|
-
List
|
|
151
|
-
</button>
|
|
152
|
-
<button
|
|
153
|
-
onClick={() => onSetMode("gallery")}
|
|
154
|
-
className={`flex items-center gap-1 px-2 py-1 rounded transition-colors ${
|
|
155
|
-
mode === "gallery"
|
|
156
|
-
? "bg-accent text-foreground"
|
|
157
|
-
: "text-muted-foreground hover:text-foreground"
|
|
158
|
-
}`}
|
|
159
|
-
aria-pressed={mode === "gallery"}
|
|
160
|
-
title="Gallery view"
|
|
161
|
-
>
|
|
162
|
-
<LayoutGrid className="h-3 w-3" />
|
|
163
|
-
Gallery
|
|
164
|
-
</button>
|
|
165
|
-
</div>
|
|
166
|
-
</div>
|
|
167
|
-
|
|
168
|
-
{mode === "list" ? (
|
|
169
|
-
<ul className="divide-y divide-border rounded-md border border-border overflow-hidden">
|
|
170
|
-
{sorted.map((child) => {
|
|
171
|
-
const Icon = iconFor(child);
|
|
172
|
-
const title = child.frontmatter?.title || child.name;
|
|
173
|
-
return (
|
|
174
|
-
<li key={child.path}>
|
|
175
|
-
<button
|
|
176
|
-
onClick={() => navigateTo(child.path)}
|
|
177
|
-
className="w-full flex items-center gap-3 px-3 py-2 text-left text-sm hover:bg-accent/50 transition-colors"
|
|
178
|
-
>
|
|
179
|
-
<Icon className="h-4 w-4 shrink-0 text-muted-foreground" />
|
|
180
|
-
<span className="flex-1 truncate">{title}</span>
|
|
181
|
-
<span className="text-[11px] text-muted-foreground/60 capitalize">
|
|
182
|
-
{child.type}
|
|
183
|
-
</span>
|
|
184
|
-
</button>
|
|
185
|
-
</li>
|
|
186
|
-
);
|
|
187
|
-
})}
|
|
188
|
-
</ul>
|
|
189
|
-
) : (
|
|
190
|
-
<div className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-3">
|
|
191
|
-
{sorted.map((child) => {
|
|
192
|
-
const title = child.frontmatter?.title || child.name;
|
|
193
|
-
if (isImageChild(child)) {
|
|
194
|
-
return (
|
|
195
|
-
<button
|
|
196
|
-
key={child.path}
|
|
197
|
-
onClick={() => navigateTo(child.path)}
|
|
198
|
-
className="group flex flex-col gap-1.5 text-left"
|
|
199
|
-
title={title}
|
|
200
|
-
>
|
|
201
|
-
<div className="aspect-square w-full overflow-hidden rounded-md border border-border bg-muted">
|
|
202
|
-
<img
|
|
203
|
-
src={withWs(`/api/assets/${child.path}`)}
|
|
204
|
-
alt={title}
|
|
205
|
-
loading="lazy"
|
|
206
|
-
className="h-full w-full object-cover transition-transform group-hover:scale-[1.02]"
|
|
207
|
-
/>
|
|
208
|
-
</div>
|
|
209
|
-
<span className="truncate text-[12px] text-muted-foreground group-hover:text-foreground">
|
|
210
|
-
{title}
|
|
211
|
-
</span>
|
|
212
|
-
</button>
|
|
213
|
-
);
|
|
214
|
-
}
|
|
215
|
-
const Icon = iconFor(child);
|
|
216
|
-
return (
|
|
217
|
-
<button
|
|
218
|
-
key={child.path}
|
|
219
|
-
onClick={() => navigateTo(child.path)}
|
|
220
|
-
className="group flex flex-col gap-1.5 text-left"
|
|
221
|
-
title={title}
|
|
222
|
-
>
|
|
223
|
-
<div className="aspect-square w-full flex items-center justify-center rounded-md border border-border bg-muted/40 group-hover:bg-muted transition-colors">
|
|
224
|
-
<Icon className="h-8 w-8 text-muted-foreground/60" />
|
|
225
|
-
</div>
|
|
226
|
-
<span className="truncate text-[12px] text-muted-foreground group-hover:text-foreground">
|
|
227
|
-
{title}
|
|
228
|
-
</span>
|
|
229
|
-
</button>
|
|
230
|
-
);
|
|
231
|
-
})}
|
|
232
|
-
</div>
|
|
233
|
-
)}
|
|
234
|
-
</div>
|
|
235
|
-
);
|
|
236
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { Info } from "lucide-react";
|
|
4
|
-
import { useMemo } from "react";
|
|
5
|
-
import {
|
|
6
|
-
detectGoogle,
|
|
7
|
-
type GoogleKind,
|
|
8
|
-
googleKindLabel,
|
|
9
|
-
} from "@/lib/google/detect";
|
|
10
|
-
import type { GoogleFrontmatter } from "@/types";
|
|
11
|
-
import { OfficeChrome } from "./office/office-chrome";
|
|
12
|
-
|
|
13
|
-
interface Props {
|
|
14
|
-
path: string;
|
|
15
|
-
title: string;
|
|
16
|
-
google: GoogleFrontmatter;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export function GoogleDocViewer({ path, title, google }: Props) {
|
|
20
|
-
const resolved = useMemo(() => detectGoogle(google.url || ""), [google.url]);
|
|
21
|
-
const embedUrl = google.embedUrl ?? resolved?.embedUrl ?? "";
|
|
22
|
-
const openUrl = resolved?.openUrl ?? google.url ?? "";
|
|
23
|
-
const kind: GoogleKind =
|
|
24
|
-
(google.kind as GoogleKind) ?? resolved?.kind ?? "docs";
|
|
25
|
-
const label = googleKindLabel(kind).toUpperCase();
|
|
26
|
-
|
|
27
|
-
if (!embedUrl) {
|
|
28
|
-
return (
|
|
29
|
-
<div className="flex-1 flex flex-col overflow-hidden">
|
|
30
|
-
<OfficeChrome path={path} title={title} extLabel="GOOGLE" hideFinder />
|
|
31
|
-
<div className="flex-1 flex items-center justify-center p-6">
|
|
32
|
-
<div className="max-w-md text-center space-y-2">
|
|
33
|
-
<p className="text-sm font-medium">No Google URL set</p>
|
|
34
|
-
<p className="text-xs text-muted-foreground">
|
|
35
|
-
Add a <code>google.url</code> field to this page's
|
|
36
|
-
frontmatter pointing to a Google Sheets, Slides, Docs or Forms
|
|
37
|
-
link.
|
|
38
|
-
</p>
|
|
39
|
-
</div>
|
|
40
|
-
</div>
|
|
41
|
-
</div>
|
|
42
|
-
);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
return (
|
|
46
|
-
<div className="flex-1 flex flex-col overflow-hidden">
|
|
47
|
-
<OfficeChrome
|
|
48
|
-
path={path}
|
|
49
|
-
title={title}
|
|
50
|
-
extLabel={label}
|
|
51
|
-
hideFinder
|
|
52
|
-
external={
|
|
53
|
-
openUrl ? { label: "Open in Google", href: openUrl } : undefined
|
|
54
|
-
}
|
|
55
|
-
/>
|
|
56
|
-
<div className="px-4 py-1.5 border-b border-border bg-muted/30 text-[11px] text-muted-foreground flex items-center gap-1.5">
|
|
57
|
-
<Info className="h-3 w-3 shrink-0" />
|
|
58
|
-
Embed requires the doc's sharing to be{" "}
|
|
59
|
-
<strong className="text-foreground/80">Anyone with the link</strong> or{" "}
|
|
60
|
-
<strong className="text-foreground/80">Published to the web</strong>.
|
|
61
|
-
</div>
|
|
62
|
-
<div className="flex-1 relative bg-muted/30">
|
|
63
|
-
<iframe
|
|
64
|
-
key={embedUrl}
|
|
65
|
-
src={embedUrl}
|
|
66
|
-
className="absolute inset-0 w-full h-full border-0 bg-background"
|
|
67
|
-
allow="clipboard-write; fullscreen"
|
|
68
|
-
title={title}
|
|
69
|
-
/>
|
|
70
|
-
</div>
|
|
71
|
-
</div>
|
|
72
|
-
);
|
|
73
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { Download, ExternalLink } from "lucide-react";
|
|
4
|
-
import { ViewerToolbar } from "@/components/layout/viewer-toolbar";
|
|
5
|
-
import { Button } from "@/components/ui/button";
|
|
6
|
-
import { withWs } from "@/lib/workspace-client";
|
|
7
|
-
|
|
8
|
-
interface ImageViewerProps {
|
|
9
|
-
path: string;
|
|
10
|
-
title: string;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export function ImageViewer({ path, title }: ImageViewerProps) {
|
|
14
|
-
const src = withWs(`/api/assets/${path}`);
|
|
15
|
-
const filename = path.split("/").pop() || path;
|
|
16
|
-
const ext = filename.includes(".")
|
|
17
|
-
? filename.split(".").pop()?.toUpperCase()
|
|
18
|
-
: "IMG";
|
|
19
|
-
|
|
20
|
-
return (
|
|
21
|
-
<div className="flex-1 flex flex-col overflow-hidden">
|
|
22
|
-
<ViewerToolbar path={path} badge={ext}>
|
|
23
|
-
<Button
|
|
24
|
-
variant="ghost"
|
|
25
|
-
size="sm"
|
|
26
|
-
className="h-7 gap-1.5 text-xs"
|
|
27
|
-
onClick={() => {
|
|
28
|
-
const a = document.createElement("a");
|
|
29
|
-
a.href = src;
|
|
30
|
-
a.download = filename;
|
|
31
|
-
a.click();
|
|
32
|
-
}}
|
|
33
|
-
>
|
|
34
|
-
<Download className="h-3.5 w-3.5" />
|
|
35
|
-
Download
|
|
36
|
-
</Button>
|
|
37
|
-
<Button
|
|
38
|
-
variant="ghost"
|
|
39
|
-
size="sm"
|
|
40
|
-
className="h-7 gap-1.5 text-xs"
|
|
41
|
-
onClick={() => window.open(src, "_blank")}
|
|
42
|
-
>
|
|
43
|
-
<ExternalLink className="h-3.5 w-3.5" />
|
|
44
|
-
Open in new tab
|
|
45
|
-
</Button>
|
|
46
|
-
</ViewerToolbar>
|
|
47
|
-
<div className="flex-1 overflow-auto flex items-center justify-center bg-[#1a1a1a] p-8">
|
|
48
|
-
<img
|
|
49
|
-
src={src}
|
|
50
|
-
alt={title}
|
|
51
|
-
className="max-w-full max-h-full object-contain rounded-md shadow-lg"
|
|
52
|
-
style={{ imageRendering: "auto" }}
|
|
53
|
-
/>
|
|
54
|
-
</div>
|
|
55
|
-
</div>
|
|
56
|
-
);
|
|
57
|
-
}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { Download, ExternalLink, FileWarning, FolderOpen } from "lucide-react";
|
|
4
|
-
import { ViewerToolbar } from "@/components/layout/viewer-toolbar";
|
|
5
|
-
import { Button } from "@/components/ui/button";
|
|
6
|
-
import { withWs, wsFetch } from "@/lib/workspace-client";
|
|
7
|
-
|
|
8
|
-
interface LargeFileGateProps {
|
|
9
|
-
path: string;
|
|
10
|
-
size: number;
|
|
11
|
-
/** Mount the real viewer. */
|
|
12
|
-
onOpen: () => void;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function formatSize(bytes: number): string {
|
|
16
|
-
if (bytes >= 1024 * 1024 * 1024)
|
|
17
|
-
return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
|
|
18
|
-
if (bytes >= 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
19
|
-
if (bytes >= 1024) return `${Math.round(bytes / 1024)} KB`;
|
|
20
|
-
return `${bytes} B`;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Confirmation shown before mounting a viewer that loads and renders a whole
|
|
25
|
-
* large file. Sits above the viewer dispatch, so it guards every unsafe viewer
|
|
26
|
-
* in one place. The user can open it anyway, download it, or open the raw bytes.
|
|
27
|
-
*/
|
|
28
|
-
export function LargeFileGate({ path, size, onOpen }: LargeFileGateProps) {
|
|
29
|
-
const assetUrl = withWs(`/api/assets/${path}`);
|
|
30
|
-
const filename = path.split("/").pop() || path;
|
|
31
|
-
const ext = filename.includes(".")
|
|
32
|
-
? filename.split(".").pop()?.toUpperCase()
|
|
33
|
-
: "";
|
|
34
|
-
|
|
35
|
-
const revealInFinder = async () => {
|
|
36
|
-
try {
|
|
37
|
-
await wsFetch("/api/system/reveal", {
|
|
38
|
-
method: "POST",
|
|
39
|
-
headers: { "Content-Type": "application/json" },
|
|
40
|
-
body: JSON.stringify({ path }),
|
|
41
|
-
});
|
|
42
|
-
} catch {
|
|
43
|
-
/* ignore */
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
return (
|
|
48
|
-
<div className="flex-1 flex flex-col overflow-hidden">
|
|
49
|
-
<ViewerToolbar path={path} badge={ext || undefined} />
|
|
50
|
-
<div className="flex-1 flex items-center justify-center">
|
|
51
|
-
<div className="flex flex-col items-center gap-4 text-center max-w-sm">
|
|
52
|
-
<div className="flex size-16 items-center justify-center rounded-2xl bg-amber-500/10">
|
|
53
|
-
<FileWarning className="size-8 text-amber-500" />
|
|
54
|
-
</div>
|
|
55
|
-
<div className="space-y-1">
|
|
56
|
-
<p className="text-sm font-medium">{filename}</p>
|
|
57
|
-
<p className="text-xs text-muted-foreground">
|
|
58
|
-
This file is {formatSize(size)}. Opening it in the viewer may
|
|
59
|
-
freeze the tab while it loads and renders.
|
|
60
|
-
</p>
|
|
61
|
-
</div>
|
|
62
|
-
<div className="flex flex-wrap items-center justify-center gap-2">
|
|
63
|
-
<Button
|
|
64
|
-
variant="default"
|
|
65
|
-
size="sm"
|
|
66
|
-
className="gap-2"
|
|
67
|
-
onClick={onOpen}
|
|
68
|
-
>
|
|
69
|
-
Open anyway
|
|
70
|
-
</Button>
|
|
71
|
-
<Button
|
|
72
|
-
variant="outline"
|
|
73
|
-
size="sm"
|
|
74
|
-
className="gap-2"
|
|
75
|
-
onClick={() => window.open(assetUrl, "_blank")}
|
|
76
|
-
>
|
|
77
|
-
<ExternalLink className="h-4 w-4" />
|
|
78
|
-
Raw
|
|
79
|
-
</Button>
|
|
80
|
-
<Button
|
|
81
|
-
variant="outline"
|
|
82
|
-
size="sm"
|
|
83
|
-
className="gap-2"
|
|
84
|
-
onClick={() => {
|
|
85
|
-
const a = document.createElement("a");
|
|
86
|
-
a.href = assetUrl;
|
|
87
|
-
a.download = filename;
|
|
88
|
-
a.click();
|
|
89
|
-
}}
|
|
90
|
-
>
|
|
91
|
-
<Download className="h-4 w-4" />
|
|
92
|
-
Download
|
|
93
|
-
</Button>
|
|
94
|
-
<Button
|
|
95
|
-
variant="outline"
|
|
96
|
-
size="sm"
|
|
97
|
-
className="gap-2"
|
|
98
|
-
onClick={revealInFinder}
|
|
99
|
-
>
|
|
100
|
-
<FolderOpen className="h-4 w-4" />
|
|
101
|
-
Open in Finder
|
|
102
|
-
</Button>
|
|
103
|
-
</div>
|
|
104
|
-
</div>
|
|
105
|
-
</div>
|
|
106
|
-
</div>
|
|
107
|
-
);
|
|
108
|
-
}
|