kennel 0.2.0 → 0.2.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/README.md +18 -5
- package/dist/cli/dispatch.js +9 -0
- package/dist/cli/src/automations/notifications.d.ts +40 -0
- package/dist/cli/src/automations/notifications.js +220 -0
- package/dist/cli/src/cli/dispatch.d.ts +1 -0
- package/dist/cli/src/cli/dispatch.js +125 -0
- package/dist/cli/src/cli/usage.d.ts +1 -0
- package/dist/cli/src/cli/usage.js +25 -0
- package/dist/cli/src/core/api-client.d.ts +13 -0
- package/dist/cli/src/core/api-client.js +1 -0
- package/dist/cli/src/core/command.d.ts +1 -0
- package/dist/cli/src/core/command.js +69 -0
- package/dist/cli/src/core/core-folders.d.ts +1 -0
- package/dist/cli/src/core/core-folders.js +42 -0
- package/dist/cli/src/core/init.d.ts +1 -0
- package/dist/cli/src/core/init.js +141 -0
- package/dist/cli/src/core/runtime.d.ts +14 -0
- package/dist/cli/src/core/runtime.js +1 -0
- package/dist/cli/src/deploy/cloudflare.d.ts +6 -0
- package/dist/cli/src/deploy/cloudflare.js +100 -0
- package/dist/cli/src/deploy/environment.d.ts +2 -0
- package/dist/cli/src/deploy/environment.js +47 -0
- package/dist/cli/src/deploy/smoke-tests.d.ts +4 -0
- package/dist/cli/src/deploy/smoke-tests.js +92 -0
- package/dist/cli/src/deploy/trigger-dev.d.ts +2 -0
- package/dist/cli/src/deploy/trigger-dev.js +255 -0
- package/dist/cli/src/deploy/vercel.d.ts +3 -0
- package/dist/cli/src/deploy/vercel.js +67 -0
- package/dist/cli/src/main.d.ts +1 -0
- package/dist/cli/src/main.js +9 -0
- package/dist/cli/src/mcp/agent-tools.d.ts +8 -0
- package/dist/cli/src/mcp/agent-tools.js +247 -0
- package/dist/cli/src/mcp/config.d.ts +25 -0
- package/dist/cli/src/mcp/config.js +185 -0
- package/dist/cli/src/mcp/function-source.d.ts +7 -0
- package/dist/cli/src/mcp/function-source.js +42 -0
- package/dist/cli/src/mcp/generate.d.ts +1 -0
- package/dist/cli/src/mcp/generate.js +47 -0
- package/dist/cli/src/mcp/install-page.d.ts +12 -0
- package/dist/cli/src/mcp/install-page.js +5 -0
- package/dist/cli/src/notifications/email-worker.d.ts +8 -0
- package/dist/cli/src/notifications/email-worker.js +137 -0
- package/dist/cli/src/package/mcp-data.d.ts +1 -0
- package/dist/cli/src/package/mcp-data.js +1 -0
- package/dist/cli/src/package/mcp-email-worker.d.ts +1 -0
- package/dist/cli/src/package/mcp-email-worker.js +1 -0
- package/dist/cli/src/package/mcp-http.d.ts +1 -0
- package/dist/cli/src/package/mcp-http.js +1 -0
- package/dist/cli/src/package/mcp-stdio.d.ts +1 -0
- package/dist/cli/src/package/mcp-stdio.js +1 -0
- package/dist/cli/src/package/mcp.d.ts +1 -0
- package/dist/cli/src/package/mcp.js +1 -0
- package/dist/cli/src/package/preview.d.ts +9 -0
- package/dist/cli/src/package/preview.js +1 -0
- package/dist/cli/src/plugins/external.d.ts +36 -0
- package/dist/cli/src/plugins/external.js +503 -0
- package/dist/cli/src/publish/cloudflare-init.d.ts +12 -0
- package/dist/cli/src/publish/cloudflare-init.js +101 -0
- package/dist/cli/src/publish/config.d.ts +28 -0
- package/dist/cli/src/publish/config.js +178 -0
- package/dist/cli/src/publish/options.d.ts +13 -0
- package/dist/cli/src/publish/options.js +78 -0
- package/dist/cli/src/publish/vercel-init.d.ts +9 -0
- package/dist/cli/src/publish/vercel-init.js +52 -0
- package/dist/cli/src/shared/json.d.ts +4 -0
- package/dist/cli/src/shared/json.js +56 -0
- package/dist/cli/src/shared/object.d.ts +2 -0
- package/dist/cli/src/shared/object.js +3 -0
- package/dist/cli/src/shared/package-manager.d.ts +11 -0
- package/dist/cli/src/shared/package-manager.js +39 -0
- package/dist/cli/src/shared/path.d.ts +4 -0
- package/dist/cli/src/shared/path.js +40 -0
- package/dist/cli/src/shared/process.d.ts +7 -0
- package/dist/cli/src/shared/process.js +12 -0
- package/dist/cli/src/shared/project-config.d.ts +2 -0
- package/dist/cli/src/shared/project-config.js +26 -0
- package/dist/cli/src/site/dev.d.ts +10 -0
- package/dist/cli/src/site/dev.js +126 -0
- package/dist/cli/src/site/extension.d.ts +8 -0
- package/dist/cli/src/site/extension.js +113 -0
- package/dist/cli/src/site/folder-icons.d.ts +46 -0
- package/dist/cli/src/site/folder-icons.js +86 -0
- package/dist/cli/src/site/hot-viewer.d.ts +2 -0
- package/dist/cli/src/site/hot-viewer.js +231 -0
- package/dist/cli/src/site/kinds.d.ts +1 -0
- package/dist/cli/src/site/kinds.js +1 -0
- package/dist/cli/src/site/mail.d.ts +1 -0
- package/dist/cli/src/site/mail.js +10 -0
- package/dist/cli/src/site/renderers.d.ts +61 -0
- package/dist/cli/src/site/renderers.js +219 -0
- package/dist/cli/src/site/server-plugins.d.ts +54 -0
- package/dist/cli/src/site/server-plugins.js +1 -0
- package/dist/cli/src/site/viewer.d.ts +36 -0
- package/dist/cli/src/site/viewer.js +352 -0
- package/dist/cli/src/site/vitepress.d.ts +1 -0
- package/dist/cli/src/site/vitepress.js +1 -0
- package/dist/cli/usage.js +1 -0
- package/dist/core/api-client.js +75 -44
- package/dist/core/command.js +6 -3
- package/dist/core/core-folders.js +38280 -33
- package/dist/core/init.js +59 -4
- package/dist/core/runtime.js +57163 -41853
- package/dist/package/preview.js +40589 -17894
- package/dist/plugins/external.d.ts +36 -0
- package/dist/plugins/external.js +503 -0
- package/dist/site/server-plugins.js +394 -59
- package/dist/site/viewer.js +18 -5
- package/kernel/apps/web/.env.example +11 -0
- package/kernel/apps/web/components.json +20 -0
- package/kernel/apps/web/eslint.config.mjs +60 -0
- package/kernel/apps/web/index.html +17 -0
- package/kernel/apps/web/package.json +79 -0
- package/kernel/apps/web/public/favicon.svg +6 -0
- package/kernel/apps/web/public/providers/claude.svg +1 -0
- package/kernel/apps/web/public/providers/codex.svg +1 -0
- package/kernel/apps/web/public/providers/cursor.svg +1 -0
- package/kernel/apps/web/public/providers/opencode.svg +1 -0
- package/kernel/apps/web/public/providers/pi.svg +1 -0
- package/kernel/apps/web/server/acp/index.ts +1 -0
- package/kernel/apps/web/server/acp/live-agent-connection.ts +1 -0
- package/kernel/apps/web/server/acp/process-manager.ts +1 -0
- package/kernel/apps/web/server/acp/registry.ts +1 -0
- package/kernel/apps/web/server/acp/sdk.ts +1 -0
- package/kernel/apps/web/server/acp/transport.ts +1 -0
- package/kernel/apps/web/server/acp/types.ts +1 -0
- package/kernel/apps/web/server/acp-live-plugin.ts +30 -0
- package/kernel/apps/web/server/api/document-edit.ts +1 -0
- package/kernel/apps/web/server/api/open-path.ts +1 -0
- package/kernel/apps/web/server/core-plugin.ts +49 -0
- package/kernel/apps/web/server/folder-favicon.ts +1 -0
- package/kernel/apps/web/server/folder-icons.ts +1 -0
- package/kernel/apps/web/server/folder-metadata-plugin.ts +31 -0
- package/kernel/apps/web/server/plugins.ts +1 -0
- package/kernel/apps/web/server/preview-kinds.ts +1 -0
- package/kernel/apps/web/src/ai-input.tsx +62 -0
- package/kernel/apps/web/src/annotations.tsx +430 -0
- package/kernel/apps/web/src/api/client.ts +3 -0
- package/kernel/apps/web/src/api/errors.ts +1 -0
- package/kernel/apps/web/src/api/events.ts +42 -0
- package/kernel/apps/web/src/app.css +332 -0
- package/kernel/apps/web/src/app.tsx +667 -0
- package/kernel/apps/web/src/ask-draft.ts +164 -0
- package/kernel/apps/web/src/ask-tray.tsx +256 -0
- package/kernel/apps/web/src/comment-editor.tsx +93 -0
- package/kernel/apps/web/src/comment-form.tsx +162 -0
- package/kernel/apps/web/src/copy-path.ts +18 -0
- package/kernel/apps/web/src/deferred-ask-tray.tsx +20 -0
- package/kernel/apps/web/src/document-url.ts +46 -0
- package/kernel/apps/web/src/documents-url.ts +23 -0
- package/kernel/apps/web/src/dropped-folder.ts +64 -0
- package/kernel/apps/web/src/external-plugins.ts +3 -0
- package/kernel/apps/web/src/file-viewer.tsx +171 -0
- package/kernel/apps/web/src/folder-filter-icons.tsx +39 -0
- package/kernel/apps/web/src/folder-metadata.ts +76 -0
- package/kernel/apps/web/src/folder-plugin-view.tsx +87 -0
- package/kernel/apps/web/src/folder-query-cache.ts +66 -0
- package/kernel/apps/web/src/host-adapters.ts +209 -0
- package/kernel/apps/web/src/host-bridge.ts +214 -0
- package/kernel/apps/web/src/lib/entity-folder.ts +2 -0
- package/kernel/apps/web/src/linked-session-header.tsx +43 -0
- package/kernel/apps/web/src/live-session-controls.tsx +326 -0
- package/kernel/apps/web/src/local-source.ts +32 -0
- package/kernel/apps/web/src/main.tsx +24 -0
- package/kernel/apps/web/src/markdown-page.tsx +444 -0
- package/kernel/apps/web/src/notes-page.tsx +103 -0
- package/kernel/apps/web/src/plugins.ts +53 -0
- package/kernel/apps/web/src/project-search-dialog.tsx +257 -0
- package/kernel/apps/web/src/project-search.ts +18 -0
- package/kernel/apps/web/src/query-client.ts +4 -0
- package/kernel/apps/web/src/rehype-source-lines.ts +22 -0
- package/kernel/apps/web/src/routes/document.tsx +1 -0
- package/kernel/apps/web/src/routes/entities.tsx +277 -0
- package/kernel/apps/web/src/routes/search.tsx +60 -0
- package/kernel/apps/web/src/selection-context.ts +68 -0
- package/kernel/apps/web/src/selection-input.tsx +58 -0
- package/kernel/apps/web/src/selection-popup.tsx +155 -0
- package/kernel/apps/web/src/session-transcript-page.tsx +152 -0
- package/kernel/apps/web/src/use-annotations.ts +162 -0
- package/kernel/apps/web/src/use-ask-ai.ts +26 -0
- package/kernel/apps/web/src/use-ask-draft.ts +27 -0
- package/kernel/apps/web/src/use-document.ts +37 -0
- package/kernel/apps/web/src/use-folder-notes.ts +49 -0
- package/kernel/apps/web/src/use-linked-session.ts +33 -0
- package/kernel/apps/web/src/view-context.tsx +69 -0
- package/kernel/apps/web/src/view-header.tsx +66 -0
- package/kernel/apps/web/src/viewer-capabilities.ts +33 -0
- package/kernel/apps/web/src/viewer-route.ts +1 -0
- package/kernel/apps/web/src/viewport-height.ts +33 -0
- package/kernel/apps/web/tsconfig.json +24 -0
- package/kernel/apps/web/vite.config.ts +252 -0
- package/kernel/packages/agents/eslint.config.js +10 -0
- package/kernel/packages/agents/package.json +75 -0
- package/kernel/packages/agents/src/agent-card.tsx +334 -0
- package/kernel/packages/agents/src/client.tsx +13 -0
- package/kernel/packages/agents/src/index.ts +18 -0
- package/kernel/packages/agents/src/manifest.ts +7 -0
- package/kernel/packages/agents/src/node.ts +447 -0
- package/kernel/packages/agents/src/profiles.ts +137 -0
- package/kernel/packages/agents/src/resolve.ts +69 -0
- package/kernel/packages/agents/src/server.ts +60 -0
- package/kernel/packages/agents/src/types.ts +82 -0
- package/kernel/packages/agents/src/viewer.tsx +370 -0
- package/kernel/packages/agents/test/profiles.test.mjs +88 -0
- package/kernel/packages/agents/test/resolve.test.mjs +729 -0
- package/kernel/packages/agents/tsconfig.json +17 -0
- package/kernel/packages/api/README.md +73 -0
- package/kernel/packages/api/openapi.json +3368 -0
- package/kernel/packages/api/package.json +41 -0
- package/kernel/packages/api/src/client/errors.ts +1 -0
- package/kernel/packages/api/src/client/index.ts +2 -0
- package/kernel/packages/api/src/contracts/schemas.ts +277 -0
- package/kernel/packages/api/src/contracts.ts +20 -0
- package/kernel/packages/api/src/index.ts +34 -0
- package/kernel/packages/api/src/server/acp/index.ts +35 -0
- package/kernel/packages/api/src/server/acp/live-agent-connection.ts +44 -0
- package/kernel/packages/api/src/server/acp/process-manager.ts +291 -0
- package/kernel/packages/api/src/server/acp/registry.ts +140 -0
- package/kernel/packages/api/src/server/acp/sdk.ts +15 -0
- package/kernel/packages/api/src/server/acp/transport.ts +115 -0
- package/kernel/packages/api/src/server/acp/types.ts +89 -0
- package/kernel/packages/api/src/server/acp-live-plugin.ts +423 -0
- package/kernel/packages/api/src/server/api/create-agent-file.ts +46 -0
- package/kernel/packages/api/src/server/api/document-edit.ts +125 -0
- package/kernel/packages/api/src/server/api/open-path.ts +40 -0
- package/kernel/packages/api/src/server/contracts.ts +85 -0
- package/kernel/packages/api/src/server/entity-folder.ts +353 -0
- package/kernel/packages/api/src/server/folder-favicon.ts +17 -0
- package/kernel/packages/api/src/server/folder-icons.ts +113 -0
- package/kernel/packages/api/src/server/folder-metadata-plugin.ts +1758 -0
- package/kernel/packages/api/src/server/host.ts +21 -0
- package/kernel/packages/api/src/server/index.ts +197 -0
- package/kernel/packages/api/src/server/linked-folder-discovery.ts +158 -0
- package/kernel/packages/api/src/server/plugins.ts +205 -0
- package/kernel/packages/api/src/server/project-discovery.ts +69 -0
- package/kernel/packages/api/src/server/watcher.ts +46 -0
- package/kernel/packages/api/src/shared/selection.ts +16 -0
- package/kernel/packages/api/src/shared/viewer-route.ts +200 -0
- package/kernel/packages/api/test/agents-loading.test.ts +94 -0
- package/kernel/packages/api/test/core.test.ts +364 -0
- package/kernel/packages/api/test/entity-folder.test.ts +131 -0
- package/kernel/packages/api/test/linked-folder-discovery.test.ts +78 -0
- package/kernel/packages/api/test/media-endpoint.test.ts +83 -0
- package/kernel/packages/api/test/partial-loading.test.ts +43 -0
- package/kernel/packages/api/test/project-discovery.test.ts +44 -0
- package/kernel/packages/api/tsconfig.json +11 -0
- package/kernel/packages/api-client/README.md +72 -0
- package/kernel/packages/api-client/package.json +26 -0
- package/kernel/packages/api-client/scripts/generate.ts +68 -0
- package/kernel/packages/api-client/src/errors.ts +59 -0
- package/kernel/packages/api-client/src/generated.d.ts +1248 -0
- package/kernel/packages/api-client/src/index.ts +206 -0
- package/kernel/packages/api-client/src/responses.ts +19 -0
- package/kernel/packages/api-client/test/client.test.ts +143 -0
- package/kernel/packages/api-client/tsconfig.json +12 -0
- package/kernel/packages/folder-plugin/eslint.config.js +10 -0
- package/kernel/packages/folder-plugin/package.json +50 -0
- package/kernel/packages/folder-plugin/src/client.ts +73 -0
- package/kernel/packages/folder-plugin/src/endpoint.ts +273 -0
- package/kernel/packages/folder-plugin/src/index.ts +15 -0
- package/kernel/packages/folder-plugin/src/server.ts +78 -0
- package/kernel/packages/folder-plugin/src/subpath.ts +34 -0
- package/kernel/packages/folder-plugin/src/types.ts +86 -0
- package/kernel/packages/folder-plugin/src/validation.ts +56 -0
- package/kernel/packages/folder-plugin/test/contract.test.mjs +133 -0
- package/kernel/packages/folder-plugin/tsconfig.json +17 -0
- package/kernel/packages/kinds/package.json +24 -0
- package/kernel/packages/kinds/src/kinds.ts +172 -0
- package/kernel/packages/markdown/README.md +40 -0
- package/kernel/packages/markdown/explorer.css +1 -0
- package/kernel/packages/markdown/package.json +30 -0
- package/kernel/packages/markdown/src/documents.ts +1 -0
- package/kernel/packages/markdown/src/explorer.ts +1 -0
- package/kernel/packages/markdown/src/index.ts +2 -0
- package/kernel/packages/markdown/src/metadata.ts +63 -0
- package/kernel/packages/markdown/src/node.ts +1 -0
- package/kernel/packages/markdown/styles.css +1 -0
- package/kernel/packages/notes/SKILL.md +19 -0
- package/kernel/packages/notes/eslint.config.js +10 -0
- package/kernel/packages/notes/package.json +72 -0
- package/kernel/packages/notes/src/client.tsx +12 -0
- package/kernel/packages/notes/src/data/ai-input.ts +58 -0
- package/kernel/packages/notes/src/data/api.ts +40 -0
- package/kernel/packages/notes/src/data/parse.ts +15 -0
- package/kernel/packages/notes/src/data/routing.ts +33 -0
- package/kernel/packages/notes/src/data/use-folder-notes.ts +49 -0
- package/kernel/packages/notes/src/index.ts +2 -0
- package/kernel/packages/notes/src/manifest.ts +6 -0
- package/kernel/packages/notes/src/pages/notes-page.tsx +79 -0
- package/kernel/packages/notes/src/pages/single-note-page.tsx +57 -0
- package/kernel/packages/notes/src/server.ts +88 -0
- package/kernel/packages/notes/src/ui/ai-composer-controls.tsx +70 -0
- package/kernel/packages/notes/src/ui/folder-notes-list.tsx +140 -0
- package/kernel/packages/notes/tsconfig.json +16 -0
- package/kernel/packages/schemas/ICON-POLICY.md +43 -0
- package/kernel/packages/schemas/SKILL.md +185 -0
- package/kernel/packages/schemas/eslint.config.js +10 -0
- package/kernel/packages/schemas/package.json +81 -0
- package/kernel/packages/schemas/src/client.tsx +137 -0
- package/kernel/packages/schemas/src/data/config-file.ts +37 -0
- package/kernel/packages/schemas/src/data/contract.ts +174 -0
- package/kernel/packages/schemas/src/data/favicon.ts +218 -0
- package/kernel/packages/schemas/src/data/fields.ts +96 -0
- package/kernel/packages/schemas/src/data/icon-image.ts +53 -0
- package/kernel/packages/schemas/src/data/icon.ts +97 -0
- package/kernel/packages/schemas/src/data/load.ts +161 -0
- package/kernel/packages/schemas/src/data/params.ts +103 -0
- package/kernel/packages/schemas/src/data/query.ts +33 -0
- package/kernel/packages/schemas/src/data/sort.ts +50 -0
- package/kernel/packages/schemas/src/data/workspace.ts +101 -0
- package/kernel/packages/schemas/src/index.ts +22 -0
- package/kernel/packages/schemas/src/manifest.ts +4 -0
- package/kernel/packages/schemas/src/node.ts +384 -0
- package/kernel/packages/schemas/src/pages/collection.tsx +252 -0
- package/kernel/packages/schemas/src/server.ts +208 -0
- package/kernel/packages/schemas/src/ui/schema-entity-list.tsx +124 -0
- package/kernel/packages/schemas/src/ui/schema-filters.tsx +186 -0
- package/kernel/packages/schemas/src/ui/schema-search.tsx +35 -0
- package/kernel/packages/schemas/src/ui/use-query-param-filter-setting.tsx +15 -0
- package/kernel/packages/schemas/test/contract.test.mjs +26 -0
- package/kernel/packages/schemas/test/fields.test.mjs +187 -0
- package/kernel/packages/schemas/test/load.test.mjs +12 -0
- package/kernel/packages/schemas/test/node.test.mjs +412 -0
- package/kernel/packages/schemas/test/query.test.mjs +134 -0
- package/kernel/packages/schemas/test/workspace.test.mjs +86 -0
- package/kernel/packages/schemas/tsconfig.json +17 -0
- package/kernel/packages/session-finding/package.json +33 -0
- package/kernel/packages/session-finding/src/index.ts +120 -0
- package/kernel/packages/session-finding/test/list-sessions.test.mjs +139 -0
- package/kernel/packages/session-finding/tsconfig.json +12 -0
- package/kernel/packages/ui/LICENSE +21 -0
- package/kernel/packages/ui/components.json +20 -0
- package/kernel/packages/ui/eslint.config.js +8 -0
- package/kernel/packages/ui/package.json +106 -0
- package/kernel/packages/ui/src/chat/file-link.ts +178 -0
- package/kernel/packages/ui/src/chat/index.ts +18 -0
- package/kernel/packages/ui/src/chat/transcript.tsx +348 -0
- package/kernel/packages/ui/src/chat/turns.ts +76 -0
- package/kernel/packages/ui/src/chat/types.ts +23 -0
- package/kernel/packages/ui/src/chat/use-overflowing.ts +56 -0
- package/kernel/packages/ui/src/components/accordion.tsx +74 -0
- package/kernel/packages/ui/src/components/alert-dialog.tsx +164 -0
- package/kernel/packages/ui/src/components/alert.tsx +68 -0
- package/kernel/packages/ui/src/components/app-breadcrumbs.tsx +170 -0
- package/kernel/packages/ui/src/components/app-header.tsx +125 -0
- package/kernel/packages/ui/src/components/app-options.tsx +87 -0
- package/kernel/packages/ui/src/components/app-view-header.tsx +34 -0
- package/kernel/packages/ui/src/components/aspect-ratio.tsx +11 -0
- package/kernel/packages/ui/src/components/avatar.tsx +53 -0
- package/kernel/packages/ui/src/components/badge.tsx +47 -0
- package/kernel/packages/ui/src/components/base-dialog.tsx +3 -0
- package/kernel/packages/ui/src/components/base-tabs.tsx +63 -0
- package/kernel/packages/ui/src/components/breadcrumb.tsx +110 -0
- package/kernel/packages/ui/src/components/button-group.tsx +86 -0
- package/kernel/packages/ui/src/components/button.tsx +65 -0
- package/kernel/packages/ui/src/components/calendar.tsx +240 -0
- package/kernel/packages/ui/src/components/card.tsx +95 -0
- package/kernel/packages/ui/src/components/carousel.tsx +240 -0
- package/kernel/packages/ui/src/components/chart.tsx +375 -0
- package/kernel/packages/ui/src/components/checkbox.tsx +39 -0
- package/kernel/packages/ui/src/components/collapsible.tsx +33 -0
- package/kernel/packages/ui/src/components/collection-icon.tsx +28 -0
- package/kernel/packages/ui/src/components/command.tsx +205 -0
- package/kernel/packages/ui/src/components/content-issues.tsx +63 -0
- package/kernel/packages/ui/src/components/context-menu.tsx +298 -0
- package/kernel/packages/ui/src/components/copy-context.tsx +134 -0
- package/kernel/packages/ui/src/components/dialog.tsx +157 -0
- package/kernel/packages/ui/src/components/drawer.tsx +162 -0
- package/kernel/packages/ui/src/components/dropdown-menu.tsx +303 -0
- package/kernel/packages/ui/src/components/empty.tsx +108 -0
- package/kernel/packages/ui/src/components/field.tsx +260 -0
- package/kernel/packages/ui/src/components/file-preview.tsx +152 -0
- package/kernel/packages/ui/src/components/file-renderer.tsx +466 -0
- package/kernel/packages/ui/src/components/filter-chip-panel.tsx +157 -0
- package/kernel/packages/ui/src/components/filter-select.tsx +127 -0
- package/kernel/packages/ui/src/components/folder-activity.tsx +646 -0
- package/kernel/packages/ui/src/components/folder-file-list.tsx +58 -0
- package/kernel/packages/ui/src/components/folder-filter-bar.tsx +191 -0
- package/kernel/packages/ui/src/components/folder-image.tsx +18 -0
- package/kernel/packages/ui/src/components/folder-landing.tsx +70 -0
- package/kernel/packages/ui/src/components/folder-list.tsx +140 -0
- package/kernel/packages/ui/src/components/folder-metadata.tsx +107 -0
- package/kernel/packages/ui/src/components/folder-mobile-bar.tsx +60 -0
- package/kernel/packages/ui/src/components/folder-project-list.tsx +133 -0
- package/kernel/packages/ui/src/components/folder-session-list.tsx +113 -0
- package/kernel/packages/ui/src/components/folder-session-page.tsx +126 -0
- package/kernel/packages/ui/src/components/folder-sidebar.tsx +52 -0
- package/kernel/packages/ui/src/components/folder-skill-list.tsx +62 -0
- package/kernel/packages/ui/src/components/folder-tabs.tsx +156 -0
- package/kernel/packages/ui/src/components/form.tsx +167 -0
- package/kernel/packages/ui/src/components/hover-card.tsx +52 -0
- package/kernel/packages/ui/src/components/icons.tsx +34 -0
- package/kernel/packages/ui/src/components/input-group.tsx +184 -0
- package/kernel/packages/ui/src/components/input-otp.tsx +90 -0
- package/kernel/packages/ui/src/components/input.tsx +29 -0
- package/kernel/packages/ui/src/components/item.tsx +195 -0
- package/kernel/packages/ui/src/components/kbd.tsx +32 -0
- package/kernel/packages/ui/src/components/label.tsx +27 -0
- package/kernel/packages/ui/src/components/link.tsx +45 -0
- package/kernel/packages/ui/src/components/live-tool-call.tsx +193 -0
- package/kernel/packages/ui/src/components/menubar.tsx +323 -0
- package/kernel/packages/ui/src/components/navigation-menu.tsx +210 -0
- package/kernel/packages/ui/src/components/note-card.tsx +149 -0
- package/kernel/packages/ui/src/components/pagination.tsx +128 -0
- package/kernel/packages/ui/src/components/popover.tsx +56 -0
- package/kernel/packages/ui/src/components/progress.tsx +31 -0
- package/kernel/packages/ui/src/components/radio-group.tsx +54 -0
- package/kernel/packages/ui/src/components/scroll-area.tsx +61 -0
- package/kernel/packages/ui/src/components/select.tsx +219 -0
- package/kernel/packages/ui/src/components/separator.tsx +30 -0
- package/kernel/packages/ui/src/components/session-icon.tsx +124 -0
- package/kernel/packages/ui/src/components/sheet.tsx +157 -0
- package/kernel/packages/ui/src/components/sidebar.tsx +789 -0
- package/kernel/packages/ui/src/components/skeleton.tsx +13 -0
- package/kernel/packages/ui/src/components/slider.tsx +73 -0
- package/kernel/packages/ui/src/components/sonner.tsx +41 -0
- package/kernel/packages/ui/src/components/spinner.tsx +16 -0
- package/kernel/packages/ui/src/components/switch.tsx +40 -0
- package/kernel/packages/ui/src/components/table.tsx +120 -0
- package/kernel/packages/ui/src/components/tabs.tsx +78 -0
- package/kernel/packages/ui/src/components/textarea.tsx +25 -0
- package/kernel/packages/ui/src/components/toggle-group.tsx +87 -0
- package/kernel/packages/ui/src/components/toggle.tsx +48 -0
- package/kernel/packages/ui/src/components/tooltip.tsx +71 -0
- package/kernel/packages/ui/src/components/viewer-options.tsx +166 -0
- package/kernel/packages/ui/src/hooks/use-folder-filter.ts +103 -0
- package/kernel/packages/ui/src/hooks/use-mobile.ts +19 -0
- package/kernel/packages/ui/src/index.ts +13 -0
- package/kernel/packages/ui/src/lib/document-extensions.ts +83 -0
- package/kernel/packages/ui/src/lib/folder-activity.ts +143 -0
- package/kernel/packages/ui/src/lib/folder-filter.ts +284 -0
- package/kernel/packages/ui/src/lib/live-tool-call.tsx +109 -0
- package/kernel/packages/ui/src/lib/media-urls.ts +176 -0
- package/kernel/packages/ui/src/lib/obsidian-links.ts +120 -0
- package/kernel/packages/ui/src/lib/source-components.tsx +65 -0
- package/kernel/packages/ui/src/lib/utils.tsx +7 -0
- package/kernel/packages/ui/src/pages/entity-detail-page.tsx +82 -0
- package/kernel/packages/ui/src/pages/entity-list-page.tsx +50 -0
- package/kernel/packages/ui/src/pages/entity-page.tsx +69 -0
- package/kernel/packages/ui/src/styles/folder-activity.css +2151 -0
- package/kernel/packages/ui/test/copy-context.test.mjs +48 -0
- package/kernel/packages/ui/test/folder-filter.test.mjs +484 -0
- package/kernel/packages/ui/tsconfig.json +15 -0
- package/kernel/plugins/calendar/SKILL.md +173 -0
- package/kernel/plugins/calendar/eslint.config.js +10 -0
- package/kernel/plugins/calendar/package.json +73 -0
- package/kernel/plugins/calendar/schema.json +137 -0
- package/kernel/plugins/calendar/src/calendar.tsx +328 -0
- package/kernel/plugins/calendar/src/client.tsx +139 -0
- package/kernel/plugins/calendar/src/context.ts +48 -0
- package/kernel/plugins/calendar/src/copy-button.tsx +66 -0
- package/kernel/plugins/calendar/src/event-dialog.tsx +270 -0
- package/kernel/plugins/calendar/src/index.ts +4 -0
- package/kernel/plugins/calendar/src/manifest.ts +7 -0
- package/kernel/plugins/calendar/src/parse.ts +610 -0
- package/kernel/plugins/calendar/src/server.ts +160 -0
- package/kernel/plugins/calendar/src/utils.ts +80 -0
- package/kernel/plugins/calendar/src/views.tsx +418 -0
- package/kernel/plugins/calendar/test/context.test.mjs +60 -0
- package/kernel/plugins/calendar/test/package.test.mjs +43 -0
- package/kernel/plugins/calendar/test/parse.test.mjs +392 -0
- package/kernel/plugins/calendar/test/server.test.mjs +126 -0
- package/kernel/plugins/calendar/tsconfig.json +17 -0
- package/kernel/plugins/mail/SKILL.md +97 -0
- package/kernel/plugins/mail/eslint.config.js +10 -0
- package/kernel/plugins/mail/package.json +79 -0
- package/kernel/plugins/mail/src/api.ts +359 -0
- package/kernel/plugins/mail/src/bun-ffi.d.ts +14 -0
- package/kernel/plugins/mail/src/client.tsx +14 -0
- package/kernel/plugins/mail/src/flock.ts +137 -0
- package/kernel/plugins/mail/src/folders.ts +37 -0
- package/kernel/plugins/mail/src/history.ts +485 -0
- package/kernel/plugins/mail/src/index.ts +3 -0
- package/kernel/plugins/mail/src/mail-card.tsx +123 -0
- package/kernel/plugins/mail/src/mail-conversation.tsx +153 -0
- package/kernel/plugins/mail/src/mail-detail-page.tsx +467 -0
- package/kernel/plugins/mail/src/mail-hooks.ts +252 -0
- package/kernel/plugins/mail/src/mail-page.tsx +109 -0
- package/kernel/plugins/mail/src/mail-request.ts +78 -0
- package/kernel/plugins/mail/src/mail-send-box.tsx +175 -0
- package/kernel/plugins/mail/src/mailos.ts +723 -0
- package/kernel/plugins/mail/src/manifest.ts +7 -0
- package/kernel/plugins/mail/src/node.ts +171 -0
- package/kernel/plugins/mail/src/parse.ts +139 -0
- package/kernel/plugins/mail/src/server.ts +125 -0
- package/kernel/plugins/mail/src/types.ts +10 -0
- package/kernel/plugins/mail/src/viewer.tsx +147 -0
- package/kernel/plugins/mail/test/flock.test.mjs +156 -0
- package/kernel/plugins/mail/test/folders.test.mjs +138 -0
- package/kernel/plugins/mail/test/history.test.mjs +460 -0
- package/kernel/plugins/mail/test/mailos.test.mjs +752 -0
- package/kernel/plugins/mail/test/node.test.mjs +207 -0
- package/kernel/plugins/mail/test/package.test.mjs +54 -0
- package/kernel/plugins/mail/test/parse.test.mjs +32 -0
- package/kernel/plugins/mail/test/server.test.mjs +116 -0
- package/kernel/plugins/mail/test/viewer.test.mjs +192 -0
- package/kernel/plugins/mail/tsconfig.json +17 -0
- package/kernel/plugins/projects/SKILL.md +73 -0
- package/kernel/plugins/projects/eslint.config.js +10 -0
- package/kernel/plugins/projects/package.json +70 -0
- package/kernel/plugins/projects/src/client.tsx +17 -0
- package/kernel/plugins/projects/src/data/model.ts +129 -0
- package/kernel/plugins/projects/src/index.ts +17 -0
- package/kernel/plugins/projects/src/manifest.ts +7 -0
- package/kernel/plugins/projects/src/project-context.ts +41 -0
- package/kernel/plugins/projects/src/server.ts +276 -0
- package/kernel/plugins/projects/src/ui/project-card.tsx +61 -0
- package/kernel/plugins/projects/src/ui/projects-page.tsx +102 -0
- package/kernel/plugins/projects/test/package.test.mjs +51 -0
- package/kernel/plugins/projects/tsconfig.json +17 -0
- package/kernel/plugins/tasks/SKILL.md +341 -0
- package/kernel/plugins/tasks/eslint.config.js +10 -0
- package/kernel/plugins/tasks/package.json +74 -0
- package/kernel/plugins/tasks/schema.json +939 -0
- package/kernel/plugins/tasks/src/api.ts +212 -0
- package/kernel/plugins/tasks/src/client.tsx +23 -0
- package/kernel/plugins/tasks/src/data/parse.ts +544 -0
- package/kernel/plugins/tasks/src/data/task-id.ts +56 -0
- package/kernel/plugins/tasks/src/data/todo-model.ts +795 -0
- package/kernel/plugins/tasks/src/index.ts +34 -0
- package/kernel/plugins/tasks/src/manifest.ts +7 -0
- package/kernel/plugins/tasks/src/pages/task-detail.tsx +48 -0
- package/kernel/plugins/tasks/src/pages/task-list.tsx +88 -0
- package/kernel/plugins/tasks/src/server.ts +447 -0
- package/kernel/plugins/tasks/src/styles.css +9 -0
- package/kernel/plugins/tasks/src/ui/compact-todo-list.tsx +372 -0
- package/kernel/plugins/tasks/src/ui/error-details.tsx +78 -0
- package/kernel/plugins/tasks/src/ui/task-page.tsx +392 -0
- package/kernel/plugins/tasks/src/ui/todo-agent-filter.tsx +36 -0
- package/kernel/plugins/tasks/src/ui/todo-filter-bar.tsx +66 -0
- package/kernel/plugins/tasks/src/ui/todo-item.tsx +494 -0
- package/kernel/plugins/tasks/src/ui/todo-status-filter.tsx +60 -0
- package/kernel/plugins/tasks/src/ui/todo-tag-filter.tsx +48 -0
- package/kernel/plugins/tasks/src/ui/todo-warnings.tsx +106 -0
- package/kernel/plugins/tasks/test/api.test.mjs +99 -0
- package/kernel/plugins/tasks/test/folder-sources.test.mjs +46 -0
- package/kernel/plugins/tasks/test/package.test.mjs +54 -0
- package/kernel/plugins/tasks/test/parse.test.mjs +225 -0
- package/kernel/plugins/tasks/test/server.test.mjs +386 -0
- package/kernel/plugins/tasks/tsconfig.json +17 -0
- package/node_modules/@agentclientprotocol/sdk/LICENSE +191 -0
- package/node_modules/@agentclientprotocol/sdk/README.md +70 -0
- package/node_modules/@agentclientprotocol/sdk/dist/acp.d.ts +1835 -0
- package/node_modules/@agentclientprotocol/sdk/dist/acp.js +1885 -0
- package/node_modules/@agentclientprotocol/sdk/dist/acp.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/acp.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/acp.test.js +5036 -0
- package/node_modules/@agentclientprotocol/sdk/dist/acp.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/connection.d.ts +82 -0
- package/node_modules/@agentclientprotocol/sdk/dist/connection.js +428 -0
- package/node_modules/@agentclientprotocol/sdk/dist/connection.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/connection.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/connection.test.js +470 -0
- package/node_modules/@agentclientprotocol/sdk/dist/connection.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/cookie-store.d.ts +26 -0
- package/node_modules/@agentclientprotocol/sdk/dist/cookie-store.js +96 -0
- package/node_modules/@agentclientprotocol/sdk/dist/cookie-store.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/cookie-store.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/cookie-store.test.js +77 -0
- package/node_modules/@agentclientprotocol/sdk/dist/cookie-store.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/agent.d.ts +2 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/agent.js +232 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/agent.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/client.d.ts +2 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/client.js +132 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/client.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/dual-version-agent.d.ts +9 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/dual-version-agent.js +221 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/dual-version-agent.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/http-client.d.ts +2 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/http-client.js +86 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/http-client.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/http-server.d.ts +2 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/http-server.js +112 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/http-server.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/ws-client.d.ts +2 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/ws-client.js +88 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/ws-client.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/http-stream.d.ts +33 -0
- package/node_modules/@agentclientprotocol/sdk/dist/http-stream.js +435 -0
- package/node_modules/@agentclientprotocol/sdk/dist/http-stream.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/http-stream.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/http-stream.test.js +1380 -0
- package/node_modules/@agentclientprotocol/sdk/dist/http-stream.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/jsonrpc.d.ts +603 -0
- package/node_modules/@agentclientprotocol/sdk/dist/jsonrpc.js +1064 -0
- package/node_modules/@agentclientprotocol/sdk/dist/jsonrpc.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/jsonrpc.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/jsonrpc.test.js +851 -0
- package/node_modules/@agentclientprotocol/sdk/dist/jsonrpc.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/line-buffer.d.ts +22 -0
- package/node_modules/@agentclientprotocol/sdk/dist/line-buffer.js +64 -0
- package/node_modules/@agentclientprotocol/sdk/dist/line-buffer.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/line-buffer.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/line-buffer.test.js +45 -0
- package/node_modules/@agentclientprotocol/sdk/dist/line-buffer.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/node-adapter.d.ts +17 -0
- package/node_modules/@agentclientprotocol/sdk/dist/node-adapter.js +426 -0
- package/node_modules/@agentclientprotocol/sdk/dist/node-adapter.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/node-adapter.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/node-adapter.test.js +499 -0
- package/node_modules/@agentclientprotocol/sdk/dist/node-adapter.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/protocol-router.d.ts +37 -0
- package/node_modules/@agentclientprotocol/sdk/dist/protocol-router.js +474 -0
- package/node_modules/@agentclientprotocol/sdk/dist/protocol-router.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/protocol-router.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/protocol-router.test.js +535 -0
- package/node_modules/@agentclientprotocol/sdk/dist/protocol-router.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/protocol.d.ts +11 -0
- package/node_modules/@agentclientprotocol/sdk/dist/protocol.js +57 -0
- package/node_modules/@agentclientprotocol/sdk/dist/protocol.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/protocol.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/protocol.test.js +73 -0
- package/node_modules/@agentclientprotocol/sdk/dist/protocol.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema/guards.gen.d.ts +199 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema/guards.gen.js +211 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema/guards.gen.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema/index.d.ts +51 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema/index.js +52 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema/index.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema/types.gen.d.ts +6118 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema/types.gen.js +3 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema/types.gen.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema/zod.gen.d.ts +14160 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema/zod.gen.js +3066 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema/zod.gen.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema-deserialize.d.ts +30 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema-deserialize.js +98 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema-deserialize.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema-deserialize.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema-deserialize.test.js +93 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema-deserialize.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-permission.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-permission.test.js +261 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-permission.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-session-sse.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-session-sse.test.js +490 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-session-sse.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-sse.d.ts +2 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-sse.js +104 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-sse.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-sse.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-sse.test.js +52 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-sse.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-websocket-upgrade.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-websocket-upgrade.test.js +946 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-websocket-upgrade.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server.d.ts +81 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server.js +380 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server.test.js +1082 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/sse.d.ts +4 -0
- package/node_modules/@agentclientprotocol/sdk/dist/sse.js +91 -0
- package/node_modules/@agentclientprotocol/sdk/dist/sse.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/sse.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/sse.test.js +126 -0
- package/node_modules/@agentclientprotocol/sdk/dist/sse.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/stream.d.ts +35 -0
- package/node_modules/@agentclientprotocol/sdk/dist/stream.js +106 -0
- package/node_modules/@agentclientprotocol/sdk/dist/stream.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/stream.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/stream.test.js +206 -0
- package/node_modules/@agentclientprotocol/sdk/dist/stream.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/test-support/streams.d.ts +8 -0
- package/node_modules/@agentclientprotocol/sdk/dist/test-support/streams.js +51 -0
- package/node_modules/@agentclientprotocol/sdk/dist/test-support/streams.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/test-support/test-agent.d.ts +24 -0
- package/node_modules/@agentclientprotocol/sdk/dist/test-support/test-agent.js +163 -0
- package/node_modules/@agentclientprotocol/sdk/dist/test-support/test-agent.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/test-support/test-http-server.d.ts +9 -0
- package/node_modules/@agentclientprotocol/sdk/dist/test-support/test-http-server.js +74 -0
- package/node_modules/@agentclientprotocol/sdk/dist/test-support/test-http-server.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/acp.d.ts +806 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/acp.js +1183 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/acp.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/acp.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/acp.test.js +512 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/acp.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/schema/guards.gen.d.ts +954 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/schema/guards.gen.js +1035 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/schema/guards.gen.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/schema/index.d.ts +42 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/schema/index.js +43 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/schema/index.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/schema/types.gen.d.ts +6146 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/schema/types.gen.js +3 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/schema/types.gen.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/schema/zod.gen.d.ts +30552 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/schema/zod.gen.js +3204 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/schema/zod.gen.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-server.d.ts +14 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-server.js +358 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-server.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-stream.d.ts +54 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-stream.js +246 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-stream.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-stream.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-stream.test.js +833 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-stream.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-utils.d.ts +13 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-utils.js +78 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-utils.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-utils.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-utils.test.js +42 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-utils.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/package.json +105 -0
- package/node_modules/@agentclientprotocol/sdk/schema/schema.json +8819 -0
- package/node_modules/@agentclientprotocol/sdk/schema/v2/schema.unstable.json +10098 -0
- package/package.json +52 -6
- package/web/assets/{abnfDiagram-VRR7QNED-Nfq-O04D.js → abnfDiagram-VRR7QNED-Bgfb1nEB.js} +1 -1
- package/web/assets/app-DoGr2Zi7.js +2 -0
- package/web/assets/app-options-D-RJiQ-X.js +25 -0
- package/web/assets/app-view-header-BLvLq02T.js +1 -0
- package/web/assets/arc-Dk_KI36B.js +1 -0
- package/web/assets/{architectureDiagram-ZJ3FMSHR-qhRwPNcQ.js → architectureDiagram-ZJ3FMSHR-NR_KhRCf.js} +1 -1
- package/web/assets/ask-tray-TzeTcO6-.js +14 -0
- package/web/assets/{blockDiagram-677ZJIJ3-C56P3bGu.js → blockDiagram-677ZJIJ3-CkLkwx9C.js} +1 -1
- package/web/assets/button-C6arH7zt.js +1 -0
- package/web/assets/{c4Diagram-LMCZKHZV-Ey1M72zD.js → c4Diagram-LMCZKHZV-CFCUH8e_.js} +1 -1
- package/web/assets/channel-uMEjV8qc.js +1 -0
- package/web/assets/{chunk-2Q5K7J3B-a6isk9VU.js → chunk-2Q5K7J3B-B_BPLWsW.js} +1 -1
- package/web/assets/{chunk-32BRIVSS-uy4kdSLL.js → chunk-32BRIVSS-B1VB1hOy.js} +1 -1
- package/web/assets/{chunk-5VM5RSS4-oj2sBFd7.js → chunk-5VM5RSS4-KFcYr8Co.js} +1 -1
- package/web/assets/{chunk-EX3LRPZG-Bzl1ukAi.js → chunk-EX3LRPZG-CpBX3kuK.js} +3 -3
- package/web/assets/{chunk-JWPE2WC7-sUph7I_t.js → chunk-JWPE2WC7-BPSl40wG.js} +1 -1
- package/web/assets/{chunk-MOJQB5TN-C0ERSuVK.js → chunk-MOJQB5TN-D2RcYmoU.js} +1 -1
- package/web/assets/{chunk-RYQCIY6F-Dyw1Hfwp.js → chunk-RYQCIY6F-m7Gyn-t3.js} +1 -1
- package/web/assets/{chunk-V7JOEXUC-DnSz22rb.js → chunk-V7JOEXUC-TDvdopxS.js} +1 -1
- package/web/assets/{chunk-VR4S4FIN-Bp2SNel7.js → chunk-VR4S4FIN-DZTsG51a.js} +1 -1
- package/web/assets/{chunk-XXDRQBXY-Dqtar746.js → chunk-XXDRQBXY-Dp0--RE2.js} +1 -1
- package/web/assets/classDiagram-OUVF2IWQ-fbZocVor.js +1 -0
- package/web/assets/classDiagram-v2-EOCWNBFH-fbZocVor.js +1 -0
- package/web/assets/client-C6Nxdfif.js +2 -0
- package/web/assets/client-CXYfBko5.js +17 -0
- package/web/assets/client-CoKtOq-X.js +7 -0
- package/web/assets/client-DyRQz5RU.js +53 -0
- package/web/assets/client-OY6HUzuD.js +98 -0
- package/web/assets/client-YOYWZIFi.js +34 -0
- package/web/assets/client-j2kQmxsO.js +22 -0
- package/web/assets/command-BugZBGXE.js +38 -0
- package/web/assets/copy-context-C0Uqsp-3.js +1 -0
- package/web/assets/{cose-bilkent-JH36ORCC-Dx1VqMjj.js → cose-bilkent-JH36ORCC-CPu3PI8h.js} +1 -1
- package/web/assets/{cynefin-VYW2F7L2-SjhCWmIV.js → cynefin-VYW2F7L2-DWxftYAm.js} +1 -1
- package/web/assets/{cynefinDiagram-TSTJHNR4-Dvqz2594.js → cynefinDiagram-TSTJHNR4-DsmN2V-p.js} +1 -1
- package/web/assets/{dagre-VKFMJZFB-Ju2m2qXt.js → dagre-VKFMJZFB-COEbApyY.js} +1 -1
- package/web/assets/{diagram-FQU43EPY-DsHKTt0k.js → diagram-FQU43EPY-0O9WGWKB.js} +1 -1
- package/web/assets/{diagram-G47NLZAW-DWHAcLkJ.js → diagram-G47NLZAW-CutEdMVh.js} +1 -1
- package/web/assets/{diagram-NH7WQ7WH-uUMz46ZD.js → diagram-NH7WQ7WH-C9KZc3B2.js} +1 -1
- package/web/assets/{diagram-OA4YK3LP-BRjVzjdp.js → diagram-OA4YK3LP-D8kkPXbY.js} +1 -1
- package/web/assets/{diagram-WEI45ONY-Cb-FhBpQ.js → diagram-WEI45ONY-_YqiTaGP.js} +1 -1
- package/web/assets/document-Dgt5eZFj.js +19 -0
- package/web/assets/{ebnfDiagram-CCIWWBDH-IhhxX3IB.js → ebnfDiagram-CCIWWBDH-JO-zQh6g.js} +1 -1
- package/web/assets/{entities-DUnx74kH.js → entities-C3wz7FCx.js} +12 -12
- package/web/assets/{erDiagram-Q63AITRT-D1frgeWf.js → erDiagram-Q63AITRT-9UjQwJ4P.js} +1 -1
- package/web/assets/file-viewer-DZJ8nYnl.js +1 -0
- package/web/assets/{flowDiagram-23GEKE2U-BiPPM-FY.js → flowDiagram-23GEKE2U-Ca08tnYM.js} +5 -5
- package/web/assets/folder-image-BfGgxo7i.js +1 -0
- package/web/assets/folder-landing-qUKBCnG-.js +54 -0
- package/web/assets/folder-list-BfFjv7rR.js +1 -0
- package/web/assets/folder-metadata-DCw8xzHk.js +2 -0
- package/web/assets/folder-mobile-bar-Ubz4babf.js +1 -0
- package/web/assets/folder-plugin-view-DsWR1zmQ.js +6 -0
- package/web/assets/{ganttDiagram-NO4QXBWP-CmEOlHD7.js → ganttDiagram-NO4QXBWP-KnHzX5W3.js} +1 -1
- package/web/assets/{gitGraphDiagram-IHSO6WYX-tTjcpZpU.js → gitGraphDiagram-IHSO6WYX-Cm8woNtK.js} +1 -1
- package/web/assets/index-BaRnbYRw.js +1 -0
- package/web/assets/index-BexmLxIP.css +1 -0
- package/web/assets/index-Bp9DidgD.js +1 -0
- package/web/assets/{index-eL1k96k8.js → index-CCXE8zc9.js} +1 -1
- package/web/assets/index-CNyy98F8.js +2 -0
- package/web/assets/{index-DmrKjrlM.js → index-CXhBn-ar.js} +1 -1
- package/web/assets/index-DDirZMgx.js +1 -0
- package/web/assets/{infoDiagram-FWYZ7A6U-Ok2sdbc1.js → infoDiagram-FWYZ7A6U-yyqmUtIb.js} +1 -1
- package/web/assets/{ishikawaDiagram-FXEZZL3T-kPnM5psX.js → ishikawaDiagram-FXEZZL3T-BfvR_Zy4.js} +4 -4
- package/web/assets/{journeyDiagram-5HDEW3XC-BkoT0-45.js → journeyDiagram-5HDEW3XC-BKuw06HM.js} +1 -1
- package/web/assets/{kanban-definition-HUTT4EX6-xnm_eFoU.js → kanban-definition-HUTT4EX6-n0010rmQ.js} +8 -8
- package/web/assets/{linear-CLZpgLH-.js → linear-C0d0lT8O.js} +1 -1
- package/web/assets/linked-session-header-BkEweU0Z.js +3 -0
- package/web/assets/{markdown-njUwQKsR.js → markdown-Bw9RgUGR.js} +9 -9
- package/web/assets/{mermaid.core-Bvxj3RoN.js → mermaid.core-BDVbShyO.js} +6 -6
- package/web/assets/metadata-KV0dpp4G.js +1 -0
- package/web/assets/{mindmap-definition-LN4V7U3C-42Uoox79.js → mindmap-definition-LN4V7U3C--_0ks3GF.js} +1 -1
- package/web/assets/note-card-DBfX6gW1.js +6 -0
- package/web/assets/{pegDiagram-2B236MQR-B-GZCw3w.js → pegDiagram-2B236MQR-CBoNIpKR.js} +1 -1
- package/web/assets/{pieDiagram-ENE6RG2P-DRmmssIB.js → pieDiagram-ENE6RG2P-MA5tkYh5.js} +3 -3
- package/web/assets/popover-DBD7FF-W.js +9 -0
- package/web/assets/{project-search-dialog-B730oZ1S.js → project-search-dialog-DM1IkSZu.js} +6 -6
- package/web/assets/{quadrantDiagram-ABIIQ3AL-BfhVQ7V9.js → quadrantDiagram-ABIIQ3AL-CWT1ryqF.js} +1 -1
- package/web/assets/{railroadDiagram-RFXS5EU6-DxKx7XRp.js → railroadDiagram-RFXS5EU6-ZiLB5FGi.js} +1 -1
- package/web/assets/{react-DZzLHL-l.js → react-B9jn2M18.js} +2 -2
- package/web/assets/{requirementDiagram-TGXJPOKE-NUzj9fw1.js → requirementDiagram-TGXJPOKE-CQq9uneq.js} +1 -1
- package/web/assets/{sankeyDiagram-HTMAVEWB-Cy9OMnl-.js → sankeyDiagram-HTMAVEWB-qDG-0JqI.js} +1 -1
- package/web/assets/search-DNrQA5fF.js +2 -0
- package/web/assets/select-D8cqNgcp.js +30 -0
- package/web/assets/selection-popup-DmtTeRs2.js +7 -0
- package/web/assets/{sequenceDiagram-DBY2YBRQ-CBNE9mzn.js → sequenceDiagram-DBY2YBRQ-CiApurLO.js} +1 -1
- package/web/assets/{sizeCapture-X5ZJPWSS-S4HhfX0n.js → sizeCapture-X5ZJPWSS-DZSR5QXm.js} +1 -1
- package/web/assets/stateDiagram-2N3HPSRC-CjJJR9_z.js +1 -0
- package/web/assets/stateDiagram-v2-6OUMAXLB-BpeGSCu9.js +1 -0
- package/web/assets/{swimlanes-5IMT3BWC-DJ2aLWal.js → swimlanes-5IMT3BWC-CKmo1sg6.js} +2 -2
- package/web/assets/swimlanesDiagram-G3AALYLV-D9RjLKb9.js +8 -0
- package/web/assets/tanstack-YzX_Mi37.js +3 -0
- package/web/assets/{timeline-definition-FHXFAJF6-vFDUVPCX.js → timeline-definition-FHXFAJF6-D-NMwS3y.js} +1 -1
- package/web/assets/{use-folder-filter-BbTUlXgG.js → use-folder-filter-LQyXns5Q.js} +1 -1
- package/web/assets/{utils-CwHGE3BB.js → utils-DCaHk0Gm.js} +1 -1
- package/web/assets/{vennDiagram-L72KCM5P-AsnhK2zW.js → vennDiagram-L72KCM5P-CfL6LBWw.js} +1 -1
- package/web/assets/view-context-gyDl_p2V.js +229 -0
- package/web/assets/viewer-capabilities-Bpp8Uvcg.js +1 -0
- package/web/assets/{wardleyDiagram-EHGQE667-Cj1wFbNV.js → wardleyDiagram-EHGQE667-DgldMxaj.js} +1 -1
- package/web/assets/{xychartDiagram-FW5EYKEG-Bbvnutsm.js → xychartDiagram-FW5EYKEG-CIoAIFX8.js} +1 -1
- package/web/favicon.svg +6 -0
- package/web/index.html +5 -4
- package/web/assets/app-CPSmsokP.js +0 -2
- package/web/assets/app-options-XEWvevsz.js +0 -25
- package/web/assets/app-view-header-BKZ90ToF.js +0 -1
- package/web/assets/arc-DbpbZvCt.js +0 -1
- package/web/assets/arrow-left-CFeHb-Z1.js +0 -1
- package/web/assets/ask-tray-D2YHtbPj.js +0 -14
- package/web/assets/button-BJ7z-ZA7.js +0 -1
- package/web/assets/calendar-days-DWh2XMO2.js +0 -1
- package/web/assets/channel-dSRp_qTo.js +0 -1
- package/web/assets/chevron-down-C5oRtqbX.js +0 -1
- package/web/assets/chevron-right-CsPtvh8C.js +0 -1
- package/web/assets/chevron-up-DjpU6Pyv.js +0 -1
- package/web/assets/classDiagram-OUVF2IWQ-B7B2zLzM.js +0 -1
- package/web/assets/classDiagram-v2-EOCWNBFH-B7B2zLzM.js +0 -1
- package/web/assets/client-CAudjYV9.js +0 -34
- package/web/assets/client-Dn9-_Gm_.js +0 -14
- package/web/assets/client-Dxrf2tyq.js +0 -102
- package/web/assets/client-aFI2M4pE.js +0 -53
- package/web/assets/collection-icon-TbOVyORG.js +0 -1
- package/web/assets/collection-page-Du6FKkuU.js +0 -10
- package/web/assets/command-C_g5E1Wx.js +0 -38
- package/web/assets/copy-Ikmr6Iq2.js +0 -1
- package/web/assets/copy-context-Cl1TE2PJ.js +0 -1
- package/web/assets/document-DcjNSJCk.js +0 -2
- package/web/assets/external-link-BXmSXqqF.js +0 -1
- package/web/assets/file-renderer-BRZTrYx8.js +0 -19
- package/web/assets/file-text-CiiSsCDq.js +0 -1
- package/web/assets/file-viewer-C1wAeVDK.js +0 -1
- package/web/assets/folder-image-AXBrHUcU.js +0 -1
- package/web/assets/folder-landing-BhRg7hwn.js +0 -54
- package/web/assets/folder-list-rIdszVde.js +0 -1
- package/web/assets/folder-metadata-puTC5QqJ.js +0 -2
- package/web/assets/folder-mobile-bar-DjjRQo3T.js +0 -1
- package/web/assets/folder-plugin-view-BU_kzR8j.js +0 -6
- package/web/assets/index-DS2Wmd9I.css +0 -1
- package/web/assets/index-DgqzSeIR.js +0 -1
- package/web/assets/index-DnlTDqaa.js +0 -1
- package/web/assets/index-DztTMDFz.js +0 -2
- package/web/assets/index-kY75qc96.js +0 -1
- package/web/assets/index-p38i_yyY.js +0 -1
- package/web/assets/link-2-BWKA6t--.js +0 -1
- package/web/assets/link-DC_1Z6Yy.js +0 -11
- package/web/assets/linked-session-header-DJYWZ_-q.js +0 -3
- package/web/assets/mail-2rCdIFul.js +0 -1
- package/web/assets/markdown-title-dncAYYiP.js +0 -131
- package/web/assets/notes-page-DIW6rgJp.js +0 -10
- package/web/assets/pencil-8cobiSSq.js +0 -1
- package/web/assets/plus-BHV2wJr7.js +0 -1
- package/web/assets/popover-Cmmgj-MJ.js +0 -9
- package/web/assets/search-CvlYUkN6.js +0 -2
- package/web/assets/select-1SvaKQsS.js +0 -30
- package/web/assets/selection-popup-ntjycEVh.js +0 -7
- package/web/assets/sparkles-CBhGREdc.js +0 -1
- package/web/assets/stateDiagram-2N3HPSRC-BEw1Mheu.js +0 -1
- package/web/assets/stateDiagram-v2-6OUMAXLB-BHtjl1iD.js +0 -1
- package/web/assets/swimlanesDiagram-G3AALYLV-Z362aroZ.js +0 -8
- package/web/assets/tanstack-CD46mJkU.js +0 -1
- package/web/assets/view-context-D-fh9AbH.js +0 -81
- package/web/assets/viewer-capabilities-CROIaoqh.js +0 -1
- package/web/assets/x-BUeE--I4.js +0 -1
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generalized folder filtering for lists of items that carry an owning
|
|
3
|
+
* folder path.
|
|
4
|
+
*
|
|
5
|
+
* Pure string/array logic — no React, no DOM, no `node:` builtins — so the
|
|
6
|
+
* exact same helpers power web chips, folder-plugin views, and CLI
|
|
7
|
+
* filtering. The model mirrors the mail plugin's draft selector but is
|
|
8
|
+
* accessor-driven: you hand over your items, a function that reads each
|
|
9
|
+
* item's owning folder, and the viewed root folder; you get back the
|
|
10
|
+
* distinct folder choices (root first, then descendants by relative path,
|
|
11
|
+
* each with a count) and a predicate that decides which items a selection
|
|
12
|
+
* keeps.
|
|
13
|
+
*
|
|
14
|
+
* CLI example (no React):
|
|
15
|
+
*
|
|
16
|
+
* ```ts
|
|
17
|
+
* import {
|
|
18
|
+
* folderFilterChoices,
|
|
19
|
+
* folderFilterMatches,
|
|
20
|
+
* } from "@raggle-ai/ui/lib/folder-filter"
|
|
21
|
+
*
|
|
22
|
+
* const choices = folderFilterChoices(items, root, (item) => item.folder)
|
|
23
|
+
* const visible = items.filter((item) =>
|
|
24
|
+
* folderFilterMatches(item.folder, flags.folder, "subtree"),
|
|
25
|
+
* )
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/** How a selected folder applies to an item's owning folder. */
|
|
30
|
+
export type FolderFilterMode = "exact" | "subtree"
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* One clickable chip: a distinct owning folder in the item list. `folder`
|
|
34
|
+
* is the full owning path and the exact filter key (duplicate leaf names
|
|
35
|
+
* stay distinct); `label` is the short display text (basename for the
|
|
36
|
+
* root, relative path for descendants).
|
|
37
|
+
*/
|
|
38
|
+
export type FolderFilterChoice = {
|
|
39
|
+
/** Exact owning folder path — the filter key. */
|
|
40
|
+
folder: string
|
|
41
|
+
/** Number of items owned by this folder. */
|
|
42
|
+
count: number
|
|
43
|
+
/** Short display label: basename for the root, relative path for descendants. */
|
|
44
|
+
label: string
|
|
45
|
+
/** Path relative to the viewed root; "" for the root itself. */
|
|
46
|
+
relativePath: string
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* A selection for folder filtering: a single owning folder, several
|
|
51
|
+
* (multi-select — an item passes when any of them matches), or null/
|
|
52
|
+
* empty for "all items". Single-string callers keep working unchanged.
|
|
53
|
+
*/
|
|
54
|
+
export type FolderSelection = string | readonly string[] | null
|
|
55
|
+
|
|
56
|
+
function normalized(value: string) {
|
|
57
|
+
return value.replaceAll("\\", "/").replace(/\/+$/, "")
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Relative path of `folder` below `rootFolder`, "" for the root itself, or
|
|
62
|
+
* null when `folder` is not the root or a real descendant. Pure string
|
|
63
|
+
* traversal so it stays browser-safe (no `node:path`): sibling prefixes,
|
|
64
|
+
* ".." escapes, and outside ancestors resolve to null.
|
|
65
|
+
*/
|
|
66
|
+
export function folderFilterRelativePath(
|
|
67
|
+
folder: string,
|
|
68
|
+
rootFolder: string,
|
|
69
|
+
): string | null {
|
|
70
|
+
const root = normalized(rootFolder)
|
|
71
|
+
const candidate = normalized(folder)
|
|
72
|
+
if (!root || !candidate) return null
|
|
73
|
+
if (candidate === root) return ""
|
|
74
|
+
if (!candidate.startsWith(`${root}/`)) return null
|
|
75
|
+
const relative = candidate.slice(root.length + 1)
|
|
76
|
+
if (!relative) return null
|
|
77
|
+
if (
|
|
78
|
+
relative.split("/").some((segment) => segment === ".." || segment === ".")
|
|
79
|
+
)
|
|
80
|
+
return null
|
|
81
|
+
return relative
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function rootLabel(rootFolder: string) {
|
|
85
|
+
return (
|
|
86
|
+
normalized(rootFolder)
|
|
87
|
+
.split("/")
|
|
88
|
+
.filter((segment) => Boolean(segment))
|
|
89
|
+
.at(-1) ?? "This folder"
|
|
90
|
+
)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function baseName(value: string) {
|
|
94
|
+
return (
|
|
95
|
+
normalized(value)
|
|
96
|
+
.split("/")
|
|
97
|
+
.filter((segment) => Boolean(segment))
|
|
98
|
+
.at(-1) ?? value
|
|
99
|
+
)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Display text for a folder relative to the viewed root: basename for
|
|
104
|
+
* root-owned items, relative path for descendants. Null when the folder is
|
|
105
|
+
* absent or does not live under the viewed root.
|
|
106
|
+
*/
|
|
107
|
+
export function folderFilterLabel(
|
|
108
|
+
folder: string | null,
|
|
109
|
+
rootFolder: string,
|
|
110
|
+
): string | null {
|
|
111
|
+
if (!folder) return null
|
|
112
|
+
const relative = folderFilterRelativePath(folder, rootFolder)
|
|
113
|
+
if (relative === null) return null
|
|
114
|
+
return relative || rootLabel(rootFolder)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export type FolderFilterChoicesOptions = {
|
|
118
|
+
/**
|
|
119
|
+
* Include folders that are not the root or a descendant (e.g. ancestor
|
|
120
|
+
* "parent" folders, repository or global directories). Their chips use the
|
|
121
|
+
* leaf basename as the label so they stay compact. Defaults to false —
|
|
122
|
+
* mail-style exact scoping keeps outside folders out of the chips.
|
|
123
|
+
*/
|
|
124
|
+
allowOutside?: boolean
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Distinct owning-folder choices with per-folder counts for filtering an
|
|
129
|
+
* item list. Keyed by the full folder path so duplicate leaf names stay
|
|
130
|
+
* distinct; ordered with the root folder first, then descendants
|
|
131
|
+
* alphabetically by relative path. Items without a folder are skipped.
|
|
132
|
+
*
|
|
133
|
+
* By default folders outside the viewed root are skipped; pass `{
|
|
134
|
+
* allowOutside: true }` to also surface ancestor/parent and unrelated
|
|
135
|
+
* folders as chips (leaf name labels).
|
|
136
|
+
*/
|
|
137
|
+
export function folderFilterChoices<T>(
|
|
138
|
+
items: readonly T[],
|
|
139
|
+
rootFolder: string,
|
|
140
|
+
getFolder: (item: T) => string | null,
|
|
141
|
+
options?: FolderFilterChoicesOptions,
|
|
142
|
+
): FolderFilterChoice[] {
|
|
143
|
+
const counts = new Map<string, number>()
|
|
144
|
+
for (const item of items) {
|
|
145
|
+
const folder = getFolder(item)
|
|
146
|
+
if (!folder) continue
|
|
147
|
+
const contained = folderFilterRelativePath(folder, rootFolder)
|
|
148
|
+
if (contained === null && !options?.allowOutside) continue
|
|
149
|
+
counts.set(folder, (counts.get(folder) ?? 0) + 1)
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const choices: FolderFilterChoice[] = []
|
|
153
|
+
for (const [folder, count] of counts) {
|
|
154
|
+
const contained = folderFilterRelativePath(folder, rootFolder)
|
|
155
|
+
const relativePath =
|
|
156
|
+
contained ?? (options?.allowOutside ? baseName(folder) : "")
|
|
157
|
+
choices.push({
|
|
158
|
+
count,
|
|
159
|
+
folder,
|
|
160
|
+
label: relativePath || rootLabel(rootFolder),
|
|
161
|
+
relativePath,
|
|
162
|
+
})
|
|
163
|
+
}
|
|
164
|
+
return choices.sort((a, b) => {
|
|
165
|
+
if (a.relativePath === "") return -1
|
|
166
|
+
if (b.relativePath === "") return 1
|
|
167
|
+
return a.relativePath.localeCompare(b.relativePath)
|
|
168
|
+
})
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function matchTarget(
|
|
172
|
+
folder: string | null,
|
|
173
|
+
target: string,
|
|
174
|
+
mode: FolderFilterMode,
|
|
175
|
+
): boolean {
|
|
176
|
+
if (!folder) return false
|
|
177
|
+
const candidate = normalized(folder)
|
|
178
|
+
const goal = normalized(target)
|
|
179
|
+
if (mode === "subtree")
|
|
180
|
+
return candidate === goal || candidate.startsWith(`${goal}/`)
|
|
181
|
+
return candidate === goal
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Does an item's owning folder survive the current selection?
|
|
186
|
+
*
|
|
187
|
+
* - `selected` null or [] → every item passes ("all").
|
|
188
|
+
* - `selected` a single folder with `mode: "exact"` → only items owned by
|
|
189
|
+
* that folder exactly.
|
|
190
|
+
* - `selected` a single folder with `mode: "subtree"` → items in that
|
|
191
|
+
* folder or any descendant, so picking a parent folder keeps everything
|
|
192
|
+
* beneath it.
|
|
193
|
+
* - `selected` an array → items matching *any* entry (each with `mode`),
|
|
194
|
+
* so a multi-select keeps the union of the chosen folders.
|
|
195
|
+
*
|
|
196
|
+
* Paths are normalized on both sides so trailing slashes never break a
|
|
197
|
+
* match.
|
|
198
|
+
*/
|
|
199
|
+
export function folderFilterMatches(
|
|
200
|
+
folder: string | null,
|
|
201
|
+
selected: FolderSelection,
|
|
202
|
+
mode: FolderFilterMode = "exact",
|
|
203
|
+
): boolean {
|
|
204
|
+
if (selected === null || selected === "") return true
|
|
205
|
+
if (Array.isArray(selected)) {
|
|
206
|
+
if (selected.length === 0) return true
|
|
207
|
+
return selected.some((entry) => folderFilterMatches(folder, entry, mode))
|
|
208
|
+
}
|
|
209
|
+
// `Array.isArray` does not narrow `readonly string[]` out of the union,
|
|
210
|
+
// but the array branch already returned — remaining value is a string.
|
|
211
|
+
return matchTarget(folder, selected as string, mode)
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
export type FolderFilterApply<T> = {
|
|
215
|
+
/** Owning folder of each item, or null when the item has none. */
|
|
216
|
+
getFolder: (item: T) => string | null
|
|
217
|
+
/** Items to filter. */
|
|
218
|
+
items: readonly T[]
|
|
219
|
+
/** Folder everything is shown relative to (the viewed root). */
|
|
220
|
+
rootFolder: string
|
|
221
|
+
/** "exact" matches the selected folder only; "subtree" also matches its descendants. */
|
|
222
|
+
mode?: FolderFilterMode
|
|
223
|
+
/** Include ancestor/outside folders as chips (see `folderFilterChoices`). */
|
|
224
|
+
allowOutside?: boolean
|
|
225
|
+
/**
|
|
226
|
+
* Raw selection (owning folder path(s)) or null for "all items". Entries
|
|
227
|
+
* that no longer match any item — e.g. after a refetch removed their last
|
|
228
|
+
* draft — are dropped from `effectiveSelected` rather than showing a
|
|
229
|
+
* dead-end list.
|
|
230
|
+
*/
|
|
231
|
+
selected: FolderSelection
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export type FolderFilterResult<T> = {
|
|
235
|
+
/** Distinct owning-folder choices with counts, root first. */
|
|
236
|
+
choices: FolderFilterChoice[]
|
|
237
|
+
/**
|
|
238
|
+
* Selection entries that still match items. Empty means "all items" —
|
|
239
|
+
* either nothing was selected or every selected folder lost its items.
|
|
240
|
+
*/
|
|
241
|
+
effectiveSelected: readonly string[]
|
|
242
|
+
/** Number of items before filtering — shown on the "All" chip. */
|
|
243
|
+
total: number
|
|
244
|
+
/** Items after applying the effective selection. */
|
|
245
|
+
visibleItems: T[]
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* One-shot derivation for a folder-filtered list: build the choices,
|
|
250
|
+
* reconcile the selection against the current items, and filter. This is
|
|
251
|
+
* the pure core the `useFolderFilter` hook wraps — call it directly from
|
|
252
|
+
* CLI or non-React code.
|
|
253
|
+
*/
|
|
254
|
+
export function applyFolderFilter<T>(
|
|
255
|
+
input: FolderFilterApply<T>,
|
|
256
|
+
): FolderFilterResult<T> {
|
|
257
|
+
const {
|
|
258
|
+
allowOutside,
|
|
259
|
+
getFolder,
|
|
260
|
+
items,
|
|
261
|
+
mode = "exact",
|
|
262
|
+
rootFolder,
|
|
263
|
+
selected,
|
|
264
|
+
} = input
|
|
265
|
+
const choices = folderFilterChoices(items, rootFolder, getFolder, {
|
|
266
|
+
allowOutside,
|
|
267
|
+
})
|
|
268
|
+
|
|
269
|
+
const rawEntries =
|
|
270
|
+
selected === null ? [] : Array.isArray(selected) ? selected : [selected]
|
|
271
|
+
// Drop selections whose folders no longer own any item (stale refetch).
|
|
272
|
+
const effectiveSelected = rawEntries.filter((entry) =>
|
|
273
|
+
items.some((item) => folderFilterMatches(getFolder(item), entry, mode)),
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
const visibleItems =
|
|
277
|
+
effectiveSelected.length === 0
|
|
278
|
+
? [...items]
|
|
279
|
+
: items.filter((item) =>
|
|
280
|
+
folderFilterMatches(getFolder(item), effectiveSelected, mode),
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
return { choices, effectiveSelected, total: items.length, visibleItems }
|
|
284
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure state machine for a single live ACP tool call.
|
|
3
|
+
*
|
|
4
|
+
* Consumes `tool-call-start`/`tool-call-end` events from the
|
|
5
|
+
* {@link import("../../../../apps/web/server/acp/live-agent-connection.ts") | LiveAgentConnection}
|
|
6
|
+
* protocol. Every transition returns a new state object.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export type ToolCallStatus = "pending" | "running" | "completed" | "failed"
|
|
10
|
+
|
|
11
|
+
export type ToolCallState = Readonly<{
|
|
12
|
+
callId: string
|
|
13
|
+
name: string
|
|
14
|
+
input: unknown
|
|
15
|
+
output?: string
|
|
16
|
+
error?: string
|
|
17
|
+
status: ToolCallStatus
|
|
18
|
+
requiresPermission: boolean
|
|
19
|
+
}>
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Create the initial state from a `tool-call-start` event.
|
|
23
|
+
*
|
|
24
|
+
* When `requiresPermission` is true the call starts in `"pending"` so
|
|
25
|
+
* the caller can present approve/reject controls.
|
|
26
|
+
*/
|
|
27
|
+
export function createToolCall(
|
|
28
|
+
callId: string,
|
|
29
|
+
name: string,
|
|
30
|
+
input: unknown,
|
|
31
|
+
requiresPermission = false,
|
|
32
|
+
): ToolCallState {
|
|
33
|
+
return {
|
|
34
|
+
callId,
|
|
35
|
+
name,
|
|
36
|
+
input,
|
|
37
|
+
status: requiresPermission ? "pending" : "running",
|
|
38
|
+
requiresPermission,
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** Move a pending tool call to running. No-op for other statuses. */
|
|
43
|
+
export function approveToolCall(state: ToolCallState): ToolCallState {
|
|
44
|
+
if (state.status !== "pending") return state
|
|
45
|
+
return { ...state, status: "running" }
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Reject a pending tool call. Moves to failed with a rejection error. */
|
|
49
|
+
export function rejectToolCall(
|
|
50
|
+
state: ToolCallState,
|
|
51
|
+
reason?: string,
|
|
52
|
+
): ToolCallState {
|
|
53
|
+
if (state.status !== "pending") return state
|
|
54
|
+
return {
|
|
55
|
+
...state,
|
|
56
|
+
status: "failed",
|
|
57
|
+
error: reason ?? "Tool call rejected by user",
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Complete a running tool call with its output. No-op for other statuses. */
|
|
62
|
+
export function completeToolCall(
|
|
63
|
+
state: ToolCallState,
|
|
64
|
+
output: string,
|
|
65
|
+
): ToolCallState {
|
|
66
|
+
if (state.status !== "running") return state
|
|
67
|
+
return { ...state, status: "completed", output }
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Fail a running tool call with an error message. No-op for other statuses. */
|
|
71
|
+
export function failToolCall(
|
|
72
|
+
state: ToolCallState,
|
|
73
|
+
error: string,
|
|
74
|
+
): ToolCallState {
|
|
75
|
+
if (state.status !== "running") return state
|
|
76
|
+
return { ...state, status: "failed", error }
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Derive a `ToolCallState` from a raw `tool-call-end` event. */
|
|
80
|
+
export function applyToolCallEnd(
|
|
81
|
+
state: ToolCallState,
|
|
82
|
+
output?: string,
|
|
83
|
+
error?: string,
|
|
84
|
+
): ToolCallState {
|
|
85
|
+
if (state.status !== "running") return state
|
|
86
|
+
if (error) return failToolCall(state, error)
|
|
87
|
+
return completeToolCall(state, output ?? "")
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Descriptive label for each status. */
|
|
91
|
+
export function statusLabel(status: ToolCallStatus): string {
|
|
92
|
+
switch (status) {
|
|
93
|
+
case "pending":
|
|
94
|
+
return "Pending approval"
|
|
95
|
+
case "running":
|
|
96
|
+
return "Running"
|
|
97
|
+
case "completed":
|
|
98
|
+
return "Completed"
|
|
99
|
+
case "failed":
|
|
100
|
+
return "Failed"
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** Tighten `input` to a human-friendly one-line summary. */
|
|
105
|
+
export function summarizeInput(input: unknown): string {
|
|
106
|
+
if (input === null || input === undefined) return ""
|
|
107
|
+
if (typeof input === "string") return input
|
|
108
|
+
return JSON.stringify(input)
|
|
109
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render-time rewrite of local media references inside Markdown documents.
|
|
3
|
+
*
|
|
4
|
+
* Notes produced by agents and tools (e.g. BarkDown's `/@fs/` Vite convention)
|
|
5
|
+
* and notes with plain doc-relative media paths both point at files on disk
|
|
6
|
+
* that the viewer's static handler must not — and does not — serve. Instead
|
|
7
|
+
* they are rewritten to the gated `/api/media` endpoint, which only serves
|
|
8
|
+
* media-typed files contained inside the viewed folder.
|
|
9
|
+
*
|
|
10
|
+
* This runs on the render value only, never on `document.content`: the edit
|
|
11
|
+
* route verifies the client's copy against disk, so rewritten text must not
|
|
12
|
+
* be persisted anywhere.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
const mediaExtension =
|
|
16
|
+
/\.(?:aac|avif|bmp|flac|gif|ico|jpeg|jpg|m4a|m4v|mov|mp3|mp4|oga|ogg|ogv|opus|png|svg|wav|webm|webp)$/i
|
|
17
|
+
|
|
18
|
+
/** Web-ish references that never point at folder files. */
|
|
19
|
+
const nonLocalReference = /^(?:[a-z][a-z0-9+.-]*:|\/\/|[#~])/i
|
|
20
|
+
|
|
21
|
+
export type MediaUrlResolver = (url: string) => string | undefined
|
|
22
|
+
|
|
23
|
+
/** Builds the gated media endpoint URL for a folder-relative file. */
|
|
24
|
+
export function mediaHref(root: string, file: string): string {
|
|
25
|
+
const url = new URL("/api/media", "http://localhost")
|
|
26
|
+
url.searchParams.set("path", root)
|
|
27
|
+
url.searchParams.set("file", file)
|
|
28
|
+
return `${url.pathname}${url.search}`
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Directory part of a document path, including the trailing separator. */
|
|
32
|
+
function documentDirectory(path: string) {
|
|
33
|
+
const separator = path.lastIndexOf("/")
|
|
34
|
+
return separator < 0 ? "" : path.slice(0, separator + 1)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function splitSegments(path: string) {
|
|
38
|
+
return path.split(/[\\/]+/).filter((segment) => segment && segment !== ".")
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** True when `candidate` resolves inside `root` (or equals it). */
|
|
42
|
+
function insideRoot(root: string, candidate: string[]) {
|
|
43
|
+
const rootSegments = splitSegments(root)
|
|
44
|
+
if (candidate.length < rootSegments.length) return false
|
|
45
|
+
return rootSegments.every(
|
|
46
|
+
(segment, index) =>
|
|
47
|
+
segment.toLowerCase() === candidate[index]?.toLowerCase(),
|
|
48
|
+
)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function joinRelative(root: string, candidate: string[]) {
|
|
52
|
+
return candidate.slice(splitSegments(root).length).join("/")
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Folder-relative form of an absolute path, or undefined when the path
|
|
57
|
+
* escapes the folder. Case-insensitive prefix match keeps Windows drive
|
|
58
|
+
* letters from breaking containment.
|
|
59
|
+
*/
|
|
60
|
+
export function containedRelative(
|
|
61
|
+
root: string,
|
|
62
|
+
target: string,
|
|
63
|
+
): string | undefined {
|
|
64
|
+
if (!target) return undefined
|
|
65
|
+
const segments = splitSegments(target)
|
|
66
|
+
if (!insideRoot(root, segments)) return undefined
|
|
67
|
+
const relative = joinRelative(root, segments)
|
|
68
|
+
return relative || undefined
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Folder-relative form of a document-relative reference resolved against the
|
|
73
|
+
* document's directory, or undefined when it escapes the folder.
|
|
74
|
+
*/
|
|
75
|
+
export function documentRelativeMedia(
|
|
76
|
+
root: string,
|
|
77
|
+
documentPath: string,
|
|
78
|
+
reference: string,
|
|
79
|
+
): string | undefined {
|
|
80
|
+
// documentPath is folder-relative, so the resolved candidate is rooted at
|
|
81
|
+
// the folder root: <root>/<doc-dir>/<reference>.
|
|
82
|
+
const base = `${root.replace(/[\\/]+$/, "")}/${documentDirectory(documentPath)}`
|
|
83
|
+
const segments = splitSegments(`${base}${reference}`)
|
|
84
|
+
const resolved: string[] = []
|
|
85
|
+
for (const segment of segments) {
|
|
86
|
+
if (segment === "..") {
|
|
87
|
+
if (!resolved.length) return undefined
|
|
88
|
+
resolved.pop()
|
|
89
|
+
continue
|
|
90
|
+
}
|
|
91
|
+
resolved.push(segment)
|
|
92
|
+
}
|
|
93
|
+
if (!insideRoot(root, resolved)) return undefined
|
|
94
|
+
return joinRelative(root, resolved) || undefined
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function fileFromFsUrl(url: string) {
|
|
98
|
+
if (!url.startsWith("/@fs/")) return undefined
|
|
99
|
+
try {
|
|
100
|
+
return decodeURIComponent(url.slice("/@fs".length))
|
|
101
|
+
} catch {
|
|
102
|
+
return undefined
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Resolver bound to one document: rewrites `/@fs/<absolute>` and
|
|
108
|
+
* doc-relative media references to `/api/media`, leaving everything else
|
|
109
|
+
* (web URLs, data URIs, anchors, escaping paths) untouched.
|
|
110
|
+
*/
|
|
111
|
+
export function mediaUrlResolver(
|
|
112
|
+
root: string,
|
|
113
|
+
documentPath: string,
|
|
114
|
+
): MediaUrlResolver {
|
|
115
|
+
return (raw) => {
|
|
116
|
+
const url = raw.trim().replaceAll("\\", "/")
|
|
117
|
+
if (!url) return undefined
|
|
118
|
+
const fsPath = fileFromFsUrl(url)
|
|
119
|
+
if (fsPath !== undefined) {
|
|
120
|
+
const relative = containedRelative(root, fsPath)
|
|
121
|
+
if (!relative || !mediaExtension.test(relative)) return undefined
|
|
122
|
+
return mediaHref(root, relative)
|
|
123
|
+
}
|
|
124
|
+
if (nonLocalReference.test(url)) return undefined
|
|
125
|
+
const bare = url.split(/[?#]/)[0] ?? ""
|
|
126
|
+
if (!mediaExtension.test(bare)) return undefined
|
|
127
|
+
const relative = documentRelativeMedia(root, documentPath, url)
|
|
128
|
+
return relative ? mediaHref(root, relative) : undefined
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** Rewrites the media URLs on one line, leaving non-media text alone. */
|
|
133
|
+
function rewriteLine(line: string, resolve: MediaUrlResolver) {
|
|
134
|
+
// HTML attributes on raw <video>/<img>/<audio>/<source> blocks.
|
|
135
|
+
let rewritten = line.replaceAll(
|
|
136
|
+
/(\s(?:src|poster)\s*=\s*)("([^"]*)"|'([^']*)')/gi,
|
|
137
|
+
(match, head: string, _quoted: string, double: string, single: string) => {
|
|
138
|
+
const target = resolve(double ?? single ?? "")
|
|
139
|
+
return target ? `${head}"${target}"` : match
|
|
140
|
+
},
|
|
141
|
+
)
|
|
142
|
+
// Markdown inline destinations: images and links with media targets.
|
|
143
|
+
rewritten = rewritten.replaceAll(
|
|
144
|
+
/\]\(([^()\s]+)(?:\s+"[^"]*")?\)/g,
|
|
145
|
+
(match, destination: string) => {
|
|
146
|
+
const target = resolve(destination)
|
|
147
|
+
return target ? `](${target})` : match
|
|
148
|
+
},
|
|
149
|
+
)
|
|
150
|
+
return rewritten
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Rewrites local media references across a Markdown document, skipping
|
|
155
|
+
* fenced code blocks so displayed samples stay verbatim.
|
|
156
|
+
*/
|
|
157
|
+
export function rewriteDocumentMedia(
|
|
158
|
+
value: string,
|
|
159
|
+
root: string,
|
|
160
|
+
documentPath: string,
|
|
161
|
+
): string {
|
|
162
|
+
if (!root || !documentPath) return value
|
|
163
|
+
const resolve = mediaUrlResolver(root, documentPath)
|
|
164
|
+
let fenced = false
|
|
165
|
+
return value
|
|
166
|
+
.split("\n")
|
|
167
|
+
.map((line) => {
|
|
168
|
+
if (/^\s*```/.test(line)) {
|
|
169
|
+
fenced = !fenced
|
|
170
|
+
return line
|
|
171
|
+
}
|
|
172
|
+
if (fenced) return line
|
|
173
|
+
return rewriteLine(line, resolve)
|
|
174
|
+
})
|
|
175
|
+
.join("\n")
|
|
176
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
const markdownExtension = /\.(?:md|markdown|mdown|mdx)$/i
|
|
2
|
+
const unsafeReference = /^(?:\/|[a-z][a-z0-9+.-]*:)/i
|
|
3
|
+
|
|
4
|
+
export type ObsidianLink = {
|
|
5
|
+
heading?: string
|
|
6
|
+
reference?: string
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function documentDirectory(path: string) {
|
|
10
|
+
const separator = path.lastIndexOf("/")
|
|
11
|
+
return separator < 0 ? "" : path.slice(0, separator + 1)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function markdownLabel(value: string) {
|
|
15
|
+
return value.replaceAll(/([\\\[\]])/g, "\\$1")
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function normalizedReference(reference: string) {
|
|
19
|
+
const value = reference.trim().replaceAll("\\", "/")
|
|
20
|
+
if (!value || unsafeReference.test(value)) return undefined
|
|
21
|
+
return markdownExtension.test(value) ? value : `${value}.md`
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function headingId(heading: string) {
|
|
25
|
+
return heading
|
|
26
|
+
.toLowerCase()
|
|
27
|
+
.replaceAll(/[^\w\s-]/g, "")
|
|
28
|
+
.trim()
|
|
29
|
+
.replaceAll(/\s+/g, "-")
|
|
30
|
+
.replaceAll(/-+/g, "-")
|
|
31
|
+
.replaceAll(/^-|-$/g, "")
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function parseObsidianLink(value: string): ObsidianLink | undefined {
|
|
35
|
+
const target = value.split("|", 2)[0] ?? ""
|
|
36
|
+
const [reference = "", heading] = target.trim().split("#", 2)
|
|
37
|
+
if (!reference && !heading) return undefined
|
|
38
|
+
return {
|
|
39
|
+
...(heading?.trim() ? { heading: heading.trim() } : {}),
|
|
40
|
+
...(reference.trim() ? { reference: reference.trim() } : {}),
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Converts Obsidian wikilinks into regular markdown links with an internal
|
|
46
|
+
* marker. The renderer resolves the marker against the open document.
|
|
47
|
+
*/
|
|
48
|
+
export function obsidianMarkdown(value: string) {
|
|
49
|
+
let fenced = false
|
|
50
|
+
return value
|
|
51
|
+
.split("\n")
|
|
52
|
+
.map((line) => {
|
|
53
|
+
if (/^\s*```/.test(line)) {
|
|
54
|
+
fenced = !fenced
|
|
55
|
+
return line
|
|
56
|
+
}
|
|
57
|
+
if (fenced) return line
|
|
58
|
+
|
|
59
|
+
return line.replaceAll(/(?<![!\\])\[\[([^\]\n]+)\]\]/g, (match, raw) => {
|
|
60
|
+
const link = parseObsidianLink(raw)
|
|
61
|
+
if (!link) return match
|
|
62
|
+
const label = raw.includes("|")
|
|
63
|
+
? raw.slice(raw.indexOf("|") + 1).trim()
|
|
64
|
+
: link.heading
|
|
65
|
+
? link.reference
|
|
66
|
+
? `${link.reference}#${link.heading}`
|
|
67
|
+
: link.heading
|
|
68
|
+
: (link.reference ?? raw)
|
|
69
|
+
return `[${markdownLabel(label)}](/_obsidian-link/${encodeURIComponent(raw)})`
|
|
70
|
+
})
|
|
71
|
+
})
|
|
72
|
+
.join("\n")
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function routePath(
|
|
76
|
+
reference: string,
|
|
77
|
+
currentDocument: string,
|
|
78
|
+
wikiLink: boolean,
|
|
79
|
+
) {
|
|
80
|
+
const normalized = normalizedReference(reference)
|
|
81
|
+
if (!normalized) return undefined
|
|
82
|
+
const rootRelative =
|
|
83
|
+
wikiLink && !/^\.\.?\//.test(normalized) && normalized.includes("/")
|
|
84
|
+
const path = rootRelative
|
|
85
|
+
? normalized
|
|
86
|
+
: `${documentDirectory(currentDocument)}${normalized}`
|
|
87
|
+
const segments: string[] = []
|
|
88
|
+
for (const segment of path.split("/")) {
|
|
89
|
+
if (!segment || segment === ".") continue
|
|
90
|
+
if (segment === "..") {
|
|
91
|
+
if (!segments.length) return undefined
|
|
92
|
+
segments.pop()
|
|
93
|
+
} else {
|
|
94
|
+
segments.push(segment)
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return segments.join("/")
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export function resolveObsidianLink(
|
|
101
|
+
raw: string,
|
|
102
|
+
currentDocument: string,
|
|
103
|
+
): ObsidianLink | undefined {
|
|
104
|
+
const link = parseObsidianLink(raw)
|
|
105
|
+
if (!link) return undefined
|
|
106
|
+
if (!link.reference) return link
|
|
107
|
+
const reference = routePath(link.reference, currentDocument, true)
|
|
108
|
+
return reference ? { ...link, reference } : undefined
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export function resolveMarkdownLink(href: string, currentDocument: string) {
|
|
112
|
+
const match = /^([^?#]+\.(?:md|markdown|mdown|mdx))(?:#(.*))?$/i.exec(href)
|
|
113
|
+
if (!match) return undefined
|
|
114
|
+
const reference = routePath(match[1]!, currentDocument, false)
|
|
115
|
+
if (!reference) return undefined
|
|
116
|
+
return {
|
|
117
|
+
...(match[2] ? { heading: match[2] } : {}),
|
|
118
|
+
reference,
|
|
119
|
+
}
|
|
120
|
+
}
|