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,79 @@
|
|
|
1
|
+
import type { ReactElement } from "react"
|
|
2
|
+
import { useState } from "react"
|
|
3
|
+
|
|
4
|
+
import { useAiInput } from "../data/ai-input.ts"
|
|
5
|
+
import {
|
|
6
|
+
folderDocumentHref,
|
|
7
|
+
folderPathId,
|
|
8
|
+
folderSectionHref,
|
|
9
|
+
parseViewerRoute,
|
|
10
|
+
} from "../data/routing.ts"
|
|
11
|
+
import { useFolderNotes } from "../data/use-folder-notes.ts"
|
|
12
|
+
import {
|
|
13
|
+
AiComposerAction,
|
|
14
|
+
AiComposerControls,
|
|
15
|
+
} from "../ui/ai-composer-controls.tsx"
|
|
16
|
+
import { FolderNotesList } from "../ui/folder-notes-list.tsx"
|
|
17
|
+
|
|
18
|
+
/** Folder Notes page: local and linked Markdown notes plus the AI composer. */
|
|
19
|
+
export function NotesPage(): ReactElement {
|
|
20
|
+
const [composerOpen, setComposerOpen] = useState(false)
|
|
21
|
+
const href = window.location.href
|
|
22
|
+
const folder = parseViewerRoute(href).folder
|
|
23
|
+
const aiInput = useAiInput(folder)
|
|
24
|
+
const folderId = folder ? folderPathId(folder) : "none"
|
|
25
|
+
// Metadata events are handled once by the shared shell.
|
|
26
|
+
const { local: query, linked, files, retryLinked } = useFolderNotes(href)
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
<>
|
|
30
|
+
<FolderNotesList
|
|
31
|
+
key={folderId}
|
|
32
|
+
action={
|
|
33
|
+
aiInput ? (
|
|
34
|
+
<AiComposerAction
|
|
35
|
+
onOpenChange={setComposerOpen}
|
|
36
|
+
open={composerOpen}
|
|
37
|
+
/>
|
|
38
|
+
) : undefined
|
|
39
|
+
}
|
|
40
|
+
documentHref={(file) => {
|
|
41
|
+
const target = file.folder ?? folder
|
|
42
|
+
return target
|
|
43
|
+
? folderDocumentHref(target, file.relativePath)
|
|
44
|
+
: file.relativePath
|
|
45
|
+
}}
|
|
46
|
+
error={query.error ? String(query.error) : ""}
|
|
47
|
+
files={files}
|
|
48
|
+
folder={folder}
|
|
49
|
+
folderHref={(source) => folderSectionHref(source, "notes")}
|
|
50
|
+
loading={query.isLoading}
|
|
51
|
+
/>
|
|
52
|
+
{query.error ? (
|
|
53
|
+
<button className="px-4" onClick={() => void query.refetch()}>
|
|
54
|
+
Retry local notes
|
|
55
|
+
</button>
|
|
56
|
+
) : null}
|
|
57
|
+
{linked.isLoading ? (
|
|
58
|
+
<p role="status" className="text-muted-foreground px-4 text-sm">
|
|
59
|
+
Loading linked notes…
|
|
60
|
+
</p>
|
|
61
|
+
) : null}
|
|
62
|
+
{linked.error ? (
|
|
63
|
+
<p role="alert" className="px-4 text-sm">
|
|
64
|
+
Linked notes could not load.{" "}
|
|
65
|
+
<button type="button" onClick={retryLinked}>
|
|
66
|
+
Retry
|
|
67
|
+
</button>
|
|
68
|
+
</p>
|
|
69
|
+
) : null}
|
|
70
|
+
{aiInput ? (
|
|
71
|
+
<AiComposerControls
|
|
72
|
+
adapter={aiInput}
|
|
73
|
+
onOpenChange={setComposerOpen}
|
|
74
|
+
open={composerOpen}
|
|
75
|
+
/>
|
|
76
|
+
) : null}
|
|
77
|
+
</>
|
|
78
|
+
)
|
|
79
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { ComponentProps, ReactNode } from "react"
|
|
2
|
+
|
|
3
|
+
import { FileRenderer } from "@raggle-ai/ui/components/file-renderer"
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Shared page shell for an individual note. The host supplies document loading,
|
|
7
|
+
* actions, and integrations; Notes composes the shared renderer and page states.
|
|
8
|
+
*/
|
|
9
|
+
export function SingleNotePage({
|
|
10
|
+
renderer,
|
|
11
|
+
embedded = false,
|
|
12
|
+
error,
|
|
13
|
+
header,
|
|
14
|
+
live = false,
|
|
15
|
+
loading = false,
|
|
16
|
+
panel = false,
|
|
17
|
+
sessionHeader,
|
|
18
|
+
tray,
|
|
19
|
+
}: {
|
|
20
|
+
renderer?: ComponentProps<typeof FileRenderer>
|
|
21
|
+
embedded?: boolean
|
|
22
|
+
error?: string
|
|
23
|
+
header: ReactNode
|
|
24
|
+
live?: boolean
|
|
25
|
+
loading?: boolean
|
|
26
|
+
panel?: boolean
|
|
27
|
+
sessionHeader?: ReactNode
|
|
28
|
+
tray?: ReactNode
|
|
29
|
+
}) {
|
|
30
|
+
return (
|
|
31
|
+
<section
|
|
32
|
+
className="markdown-page"
|
|
33
|
+
data-embedded={embedded || panel ? "true" : undefined}
|
|
34
|
+
data-panel={panel ? "true" : undefined}
|
|
35
|
+
>
|
|
36
|
+
{header}
|
|
37
|
+
{sessionHeader}
|
|
38
|
+
{live ? (
|
|
39
|
+
<div className="pop-live" role="status">
|
|
40
|
+
<span aria-hidden="true">●</span> Live — refreshing on save
|
|
41
|
+
</div>
|
|
42
|
+
) : null}
|
|
43
|
+
{error ? (
|
|
44
|
+
<p role="alert" className="p-6">
|
|
45
|
+
{error}
|
|
46
|
+
</p>
|
|
47
|
+
) : renderer ? (
|
|
48
|
+
<FileRenderer {...renderer} />
|
|
49
|
+
) : loading ? (
|
|
50
|
+
<p role="status" className="p-6">
|
|
51
|
+
Loading file…
|
|
52
|
+
</p>
|
|
53
|
+
) : null}
|
|
54
|
+
{tray}
|
|
55
|
+
</section>
|
|
56
|
+
)
|
|
57
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { readdir, stat } from "node:fs/promises"
|
|
2
|
+
import { basename, extname, relative, resolve, sep } from "node:path"
|
|
3
|
+
|
|
4
|
+
import type {
|
|
5
|
+
FolderPluginContext,
|
|
6
|
+
FolderPluginData,
|
|
7
|
+
FolderPluginDetection,
|
|
8
|
+
FolderPluginServer,
|
|
9
|
+
} from "@raggle-ai/folder-plugin/server"
|
|
10
|
+
|
|
11
|
+
import { notesManifest } from "./manifest.ts"
|
|
12
|
+
|
|
13
|
+
const markdownExtensions = new Set([".md", ".markdown"])
|
|
14
|
+
|
|
15
|
+
async function listMarkdownFiles(folder: string) {
|
|
16
|
+
const files: Array<{
|
|
17
|
+
activityAt: number
|
|
18
|
+
folder?: string
|
|
19
|
+
name: string
|
|
20
|
+
relativePath: string
|
|
21
|
+
}> = []
|
|
22
|
+
const visit = async (current: string) => {
|
|
23
|
+
const entries = await readdir(current, { withFileTypes: true }).catch(
|
|
24
|
+
() => [],
|
|
25
|
+
)
|
|
26
|
+
for (const entry of entries) {
|
|
27
|
+
if (entry.name === "node_modules" || entry.name.startsWith(".")) continue
|
|
28
|
+
const path = resolve(current, entry.name)
|
|
29
|
+
if (entry.isDirectory()) {
|
|
30
|
+
await visit(path)
|
|
31
|
+
continue
|
|
32
|
+
}
|
|
33
|
+
if (!entry.isFile() || !markdownExtensions.has(extname(entry.name))) {
|
|
34
|
+
continue
|
|
35
|
+
}
|
|
36
|
+
const details = await stat(path).catch(() => undefined)
|
|
37
|
+
files.push({
|
|
38
|
+
activityAt: details?.mtimeMs ?? 0,
|
|
39
|
+
name: basename(entry.name, extname(entry.name)),
|
|
40
|
+
relativePath: relative(folder, path).split(sep).join("/"),
|
|
41
|
+
})
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
await visit(folder)
|
|
45
|
+
return files.sort((left, right) => right.activityAt - left.activityAt)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async function loadNotes(folder: string, linkedFolders: string[] = []) {
|
|
49
|
+
const localFiles = await listMarkdownFiles(folder)
|
|
50
|
+
const linked = await Promise.all(
|
|
51
|
+
linkedFolders.map(async (linkedFolder) => ({
|
|
52
|
+
files: await listMarkdownFiles(linkedFolder),
|
|
53
|
+
folder: linkedFolder,
|
|
54
|
+
})),
|
|
55
|
+
)
|
|
56
|
+
return {
|
|
57
|
+
files: {
|
|
58
|
+
items: [
|
|
59
|
+
...localFiles,
|
|
60
|
+
...linked.flatMap((group) =>
|
|
61
|
+
group.files.map((file) => ({ ...file, folder: group.folder })),
|
|
62
|
+
),
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
folder,
|
|
66
|
+
status: "available",
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function createNotesPlugin(): FolderPluginServer {
|
|
71
|
+
return {
|
|
72
|
+
...notesManifest,
|
|
73
|
+
async detect({
|
|
74
|
+
folder,
|
|
75
|
+
}: FolderPluginContext): Promise<FolderPluginDetection> {
|
|
76
|
+
const files = await listMarkdownFiles(folder)
|
|
77
|
+
return files.length > 0
|
|
78
|
+
? { count: files.length, status: "available" }
|
|
79
|
+
: { status: "available" }
|
|
80
|
+
},
|
|
81
|
+
async handle({
|
|
82
|
+
folder,
|
|
83
|
+
linkedFolders,
|
|
84
|
+
}: FolderPluginContext): Promise<FolderPluginData> {
|
|
85
|
+
return { data: await loadNotes(folder, linkedFolders), kind: "available" }
|
|
86
|
+
},
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Plus } from "lucide-react"
|
|
2
|
+
|
|
3
|
+
import { Button } from "@raggle-ai/ui/components/button"
|
|
4
|
+
|
|
5
|
+
import type { AiInputAdapter } from "../data/ai-input.ts"
|
|
6
|
+
|
|
7
|
+
type AiComposerControlsProps = {
|
|
8
|
+
adapter: AiInputAdapter
|
|
9
|
+
open: boolean
|
|
10
|
+
onOpenChange: (open: boolean) => void
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function toggleComposer(open: boolean, onOpenChange: (open: boolean) => void) {
|
|
14
|
+
return () => onOpenChange(!open)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Desktop action supplied to the shared folder notes list. */
|
|
18
|
+
export function AiComposerAction({
|
|
19
|
+
open,
|
|
20
|
+
onOpenChange,
|
|
21
|
+
}: Omit<AiComposerControlsProps, "adapter">) {
|
|
22
|
+
const label = open ? "Hide bark input" : "Open bark input"
|
|
23
|
+
return (
|
|
24
|
+
<Button
|
|
25
|
+
aria-controls="bark-composer"
|
|
26
|
+
aria-expanded={open}
|
|
27
|
+
aria-label={label}
|
|
28
|
+
onClick={toggleComposer(open, onOpenChange)}
|
|
29
|
+
title={label}
|
|
30
|
+
type="button"
|
|
31
|
+
variant="outline"
|
|
32
|
+
>
|
|
33
|
+
<Plus aria-hidden="true" className="size-4" />
|
|
34
|
+
</Button>
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Mobile toggle and host for the configured folder AI composer. */
|
|
39
|
+
export function AiComposerControls({
|
|
40
|
+
adapter,
|
|
41
|
+
open,
|
|
42
|
+
onOpenChange,
|
|
43
|
+
}: AiComposerControlsProps) {
|
|
44
|
+
const label = open ? "Hide bark input" : "Open bark input"
|
|
45
|
+
return (
|
|
46
|
+
<>
|
|
47
|
+
<Button
|
|
48
|
+
aria-controls="bark-composer"
|
|
49
|
+
aria-expanded={open}
|
|
50
|
+
aria-label={label}
|
|
51
|
+
className="mobile-bark-toggle"
|
|
52
|
+
onClick={toggleComposer(open, onOpenChange)}
|
|
53
|
+
title={label}
|
|
54
|
+
type="button"
|
|
55
|
+
variant="outline"
|
|
56
|
+
>
|
|
57
|
+
<Plus aria-hidden="true" />
|
|
58
|
+
</Button>
|
|
59
|
+
{open ? (
|
|
60
|
+
<section
|
|
61
|
+
aria-label="AI composer"
|
|
62
|
+
className="ai-input-host"
|
|
63
|
+
id="bark-composer"
|
|
64
|
+
>
|
|
65
|
+
<adapter.Composer />
|
|
66
|
+
</section>
|
|
67
|
+
) : null}
|
|
68
|
+
</>
|
|
69
|
+
)
|
|
70
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import type { ReactNode } from "react"
|
|
2
|
+
import { useState } from "react"
|
|
3
|
+
import { Link2 } from "lucide-react"
|
|
4
|
+
|
|
5
|
+
import type { FolderFile } from "@raggle-ai/ui/lib/folder-activity"
|
|
6
|
+
import { Button } from "@raggle-ai/ui/components/button"
|
|
7
|
+
import { NoteCard } from "@raggle-ai/ui/components/note-card"
|
|
8
|
+
|
|
9
|
+
function folderName(folder: string) {
|
|
10
|
+
return (
|
|
11
|
+
folder
|
|
12
|
+
.replace(/[\\/]+$/, "")
|
|
13
|
+
.split(/[\\/]/)
|
|
14
|
+
.at(-1) ?? folder
|
|
15
|
+
)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Note rows for the main Notes tab, backed by the shared NoteCard so linked
|
|
20
|
+
* notes render the same way everywhere.
|
|
21
|
+
*/
|
|
22
|
+
export function FolderNotesList({
|
|
23
|
+
action,
|
|
24
|
+
documentHref,
|
|
25
|
+
error,
|
|
26
|
+
files = [],
|
|
27
|
+
folder,
|
|
28
|
+
folderHref,
|
|
29
|
+
loading,
|
|
30
|
+
}: {
|
|
31
|
+
action?: ReactNode
|
|
32
|
+
documentHref: (file: FolderFile) => string
|
|
33
|
+
error: string
|
|
34
|
+
files?: FolderFile[]
|
|
35
|
+
folder?: string
|
|
36
|
+
folderHref: (folder: string) => string
|
|
37
|
+
loading: boolean
|
|
38
|
+
}) {
|
|
39
|
+
const [filter, setFilter] = useState("all")
|
|
40
|
+
const sources = [
|
|
41
|
+
...new Set(files.flatMap((file) => (file.folder ? [file.folder] : []))),
|
|
42
|
+
]
|
|
43
|
+
const filters = [
|
|
44
|
+
{ id: "all", label: "All", count: files.length },
|
|
45
|
+
{
|
|
46
|
+
id: "local",
|
|
47
|
+
label: "This folder",
|
|
48
|
+
count: files.filter((file) => !file.folder).length,
|
|
49
|
+
},
|
|
50
|
+
...sources.map((source) => ({
|
|
51
|
+
id: source,
|
|
52
|
+
label: folderName(source),
|
|
53
|
+
count: files.filter((file) => file.folder === source).length,
|
|
54
|
+
})),
|
|
55
|
+
]
|
|
56
|
+
const selected = filters.some((item) => item.id === filter) ? filter : "all"
|
|
57
|
+
const visible = files
|
|
58
|
+
.filter(
|
|
59
|
+
(file) =>
|
|
60
|
+
selected === "all" ||
|
|
61
|
+
(selected === "local" ? !file.folder : file.folder === selected),
|
|
62
|
+
)
|
|
63
|
+
.sort(
|
|
64
|
+
(left, right) =>
|
|
65
|
+
right.activityAt - left.activityAt ||
|
|
66
|
+
`${left.folder ?? ""}/${left.relativePath}`.localeCompare(
|
|
67
|
+
`${right.folder ?? ""}/${right.relativePath}`,
|
|
68
|
+
),
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
return (
|
|
72
|
+
<div className="mx-auto grid w-full max-w-3xl gap-4 px-4 py-5">
|
|
73
|
+
<div className="flex flex-wrap items-center justify-between gap-3">
|
|
74
|
+
<h1 className="m-0 text-2xl font-semibold text-[#233025]">Notes</h1>
|
|
75
|
+
{action}
|
|
76
|
+
</div>
|
|
77
|
+
{sources.length ? (
|
|
78
|
+
<div
|
|
79
|
+
role="group"
|
|
80
|
+
aria-label="Filter notes by source"
|
|
81
|
+
className="flex flex-wrap gap-2"
|
|
82
|
+
>
|
|
83
|
+
{filters.map((item) => (
|
|
84
|
+
<Button
|
|
85
|
+
key={item.id}
|
|
86
|
+
type="button"
|
|
87
|
+
size="sm"
|
|
88
|
+
variant={selected === item.id ? "secondary" : "outline"}
|
|
89
|
+
className="h-auto min-h-8 max-w-full rounded-full
|
|
90
|
+
whitespace-normal"
|
|
91
|
+
aria-pressed={selected === item.id}
|
|
92
|
+
onClick={() => setFilter(item.id)}
|
|
93
|
+
title={
|
|
94
|
+
item.id === "local"
|
|
95
|
+
? folder
|
|
96
|
+
: sources.includes(item.id)
|
|
97
|
+
? item.id
|
|
98
|
+
: undefined
|
|
99
|
+
}
|
|
100
|
+
>
|
|
101
|
+
{sources.includes(item.id) ? <Link2 aria-hidden="true" /> : null}
|
|
102
|
+
<span className="break-all">{item.label}</span>
|
|
103
|
+
<span className="text-muted-foreground">{item.count}</span>
|
|
104
|
+
</Button>
|
|
105
|
+
))}
|
|
106
|
+
</div>
|
|
107
|
+
) : null}
|
|
108
|
+
{loading ? <p className="m-0 text-sm text-[#6c7a6d]">Loading…</p> : null}
|
|
109
|
+
{error ? <p className="m-0 text-sm text-[#9c3a3a]">{error}</p> : null}
|
|
110
|
+
{!loading && !error && !visible.length ? (
|
|
111
|
+
<p className="m-0 text-sm text-[#6c7a6d]">
|
|
112
|
+
{files.length ? "No notes match this filter." : "No notes found."}
|
|
113
|
+
</p>
|
|
114
|
+
) : null}
|
|
115
|
+
{visible.length ? (
|
|
116
|
+
<ol className="m-0 grid list-none gap-2 p-0">
|
|
117
|
+
{visible.map((file) => (
|
|
118
|
+
<li key={`${file.folder ?? ""}:${file.relativePath}`}>
|
|
119
|
+
<NoteCard
|
|
120
|
+
activityAt={file.activityAt}
|
|
121
|
+
context={
|
|
122
|
+
file.folder
|
|
123
|
+
? `${file.folder.replace(/[\\/]+$/, "")}/${file.relativePath}`
|
|
124
|
+
: folder
|
|
125
|
+
? `${folder.replace(/[\\/]+$/, "")}/${file.relativePath}`
|
|
126
|
+
: file.relativePath
|
|
127
|
+
}
|
|
128
|
+
folderHref={file.folder ? folderHref(file.folder) : undefined}
|
|
129
|
+
href={documentHref(file)}
|
|
130
|
+
linkedFolder={file.folder}
|
|
131
|
+
path={file.relativePath}
|
|
132
|
+
title={file.name}
|
|
133
|
+
/>
|
|
134
|
+
</li>
|
|
135
|
+
))}
|
|
136
|
+
</ol>
|
|
137
|
+
) : null}
|
|
138
|
+
</div>
|
|
139
|
+
)
|
|
140
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json.schemastore.org/tsconfig",
|
|
3
|
+
"extends": "@raggle-ai/tsconfig/base.json",
|
|
4
|
+
"compilerOptions": {
|
|
5
|
+
"target": "ES2022",
|
|
6
|
+
"lib": ["dom", "dom.iterable", "esnext"],
|
|
7
|
+
"jsx": "preserve",
|
|
8
|
+
"baseUrl": ".",
|
|
9
|
+
"allowImportingTsExtensions": true,
|
|
10
|
+
"paths": {
|
|
11
|
+
"~/*": ["${configDir}/../../packages/*/src"]
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"include": ["src"],
|
|
15
|
+
"exclude": ["node_modules", "dist", "eslint.config.mjs"]
|
|
16
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Record icon safety
|
|
2
|
+
|
|
3
|
+
## Sources
|
|
4
|
+
|
|
5
|
+
Schema records use a local PNG/JPEG from an explicit `icon` field first.
|
|
6
|
+
Otherwise, they use an explicit `website` field or a labelled `Website:` line
|
|
7
|
+
in the Markdown body. Evidence URLs and remote `icon` URLs are not used.
|
|
8
|
+
|
|
9
|
+
A local image must resolve inside the record's own directory and the collection
|
|
10
|
+
root. The server checks this again when it reads the image. Input is limited to
|
|
11
|
+
512 KiB and one megapixel. PNG/JPEG files are decoded with Sharp and converted
|
|
12
|
+
to small PNG images without source metadata. Invalid images are not displayed.
|
|
13
|
+
|
|
14
|
+
## Network approval
|
|
15
|
+
|
|
16
|
+
Cached icons remain available when network access is disabled. New downloads
|
|
17
|
+
are disabled by default. To approve downloads, set both variables on the viewer:
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
KENNEL_EXTERNAL_ICONS=1
|
|
21
|
+
KENNEL_FAVICON_ALLOWED_HOSTS=www.networkrail.co.uk,www.tpximpact.com
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
The list uses exact host names, separated by commas. It does not accept wildcards.
|
|
25
|
+
Approving `example.org` does not approve `www.example.org` or other subdomains.
|
|
26
|
+
Only approve public domains whose disclosure to Google's favicon service is
|
|
27
|
+
acceptable. DNS and external requests are not made for unapproved cache misses.
|
|
28
|
+
|
|
29
|
+
Set `KENNEL_EXTERNAL_ICONS=0`, or remove the approval list, to stop new downloads.
|
|
30
|
+
This does not remove cached icons.
|
|
31
|
+
|
|
32
|
+
## Disk cache
|
|
33
|
+
|
|
34
|
+
Default location: `~/.cache/kennel/favicons`, or
|
|
35
|
+
`$XDG_CACHE_HOME/kennel/favicons`. `KENNEL_FAVICON_CACHE_DIR` overrides it.
|
|
36
|
+
|
|
37
|
+
Files use `sha256(host).png` names. Cache reads are size-limited and images are
|
|
38
|
+
validated again. Valid images remain available without a network refresh.
|
|
39
|
+
To replace an old icon, remove its cache file and approve its host before the
|
|
40
|
+
next request. Failed approved downloads have a five-minute negative cache.
|
|
41
|
+
|
|
42
|
+
Writes use a temporary file in the same directory, then an atomic rename.
|
|
43
|
+
New directories have mode `0700`; new cache files have mode `0600`.
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: kennel-schemas
|
|
3
|
+
description: View, create, and update Kennel schema-backed collections (folder `schema.json` or `_schema.json` files with `x-kennel` hints) and their records — meetings, people, clients, projects, prospects, partners, research, or tasks. Use when the user asks to view, list, read, summarize, open, or link the custom items of a schema folder; or to give a folder a typed schema, frontmatter/YAML fields, icon and UI hints, filters, list or tab views, schema-backed Markdown records, or a reusable content pattern. Complements the kennel-cli skill (validation) and the raggle-schema-manager skill (raggle.json wiring).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Kennel Schemas
|
|
7
|
+
|
|
8
|
+
This package (`@raggle-ai/schemas`) owns everything a custom schema promises:
|
|
9
|
+
the `x-kennel` contract, schema loading, the record indexer, the server seam,
|
|
10
|
+
and the viewer UI. This skill is the agent-facing guidance: how to view a
|
|
11
|
+
collection's records and how to create or update the schema that defines them.
|
|
12
|
+
|
|
13
|
+
The schema is the contract; records must follow it. The schema also becomes
|
|
14
|
+
Raggle's display contract — as part of the same change, wire it into the
|
|
15
|
+
relative `raggle.json` (see the raggle-schema-manager skill) or the collection
|
|
16
|
+
stays invisible to search and views. For the collection/index behavior and
|
|
17
|
+
`x-kennel` fields, see `docs/core-folders.md` in the Kennel repo.
|
|
18
|
+
|
|
19
|
+
## Viewing a collection
|
|
20
|
+
|
|
21
|
+
1. **Identify the collection folder.** Use the folder the user names, or the
|
|
22
|
+
folder containing the item they point at.
|
|
23
|
+
2. **Find the owning schema.** Walk up from the folder for `schema.json`
|
|
24
|
+
(`_schema.json` when the folder already uses that convention;
|
|
25
|
+
`schema.json` wins when both exist) and search downward with
|
|
26
|
+
`find <folder> \( -name "schema.json" -o -name "_schema.json" \)`
|
|
27
|
+
(skip `node_modules`). Stop descending at nested schema folders — they own
|
|
28
|
+
their own items. A schema that is only a `$ref` points at a published
|
|
29
|
+
HTTPS schema; read the fetched target, and if the view later fails to
|
|
30
|
+
load, check that `$ref` first.
|
|
31
|
+
3. **Read the schema for item anatomy.** Pull out `x-kennel.documents`
|
|
32
|
+
(which files are records and their parser), `title`, `properties`, and the
|
|
33
|
+
`x-kennel.ui` hints (`primaryField`, `secondaryField`, `filters`,
|
|
34
|
+
`numericFilters`, `sort`)
|
|
35
|
+
plus `x-kennel.icon`. State what one record is, how it is stored, and
|
|
36
|
+
which fields the viewer shows.
|
|
37
|
+
4. **Enumerate the records.** For
|
|
38
|
+
`{ "glob": "*.md", "parser": "markdown-frontmatter" }` every Markdown file
|
|
39
|
+
with frontmatter is a record; for YAML globs every matching `.yml` file is
|
|
40
|
+
a record. Setup files (`AGENTS.md`, `README.md`, `SKILL.md`) are records
|
|
41
|
+
only when a pattern names them explicitly (folder records whose
|
|
42
|
+
frontmatter lives inside the file). Skip hidden folders and
|
|
43
|
+
`node_modules`.
|
|
44
|
+
5. **Read each record's fields.** Parse frontmatter (Markdown) or the
|
|
45
|
+
YAML/JSON body. Title precedence: `title` field → first `# heading` →
|
|
46
|
+
filename. Badge candidates: `status`, `kind`, `type`, `relationship`,
|
|
47
|
+
then `date`, `updated`, `lastContact`. Detail candidates: `summary`,
|
|
48
|
+
`people`, `owner`, `nextAction`, `role`, `organisation`, `source`.
|
|
49
|
+
6. **Present or open the records.** Render a list (title + badge + one-line
|
|
50
|
+
detail, grouped by folder when records span subfolders), and/or open the
|
|
51
|
+
collection in the viewer and return the link. Do not invent values;
|
|
52
|
+
unknown fields are "Not recorded".
|
|
53
|
+
7. **Verify before reporting.** Run `kennel schema <folder>`,
|
|
54
|
+
`kennel doctor <folder>`, and `kennel validate <folder>` (the kennel-cli
|
|
55
|
+
skill; a separate compact-validator bundle). Report real discrepancies —
|
|
56
|
+
records missing declared fields, dangling file references — alongside the
|
|
57
|
+
view. When viewing through the viewer, confirm the collection page loads.
|
|
58
|
+
|
|
59
|
+
## Viewing in the Kennel viewer
|
|
60
|
+
|
|
61
|
+
| Target | Command | What the user sees |
|
|
62
|
+
| ---------------------------------------- | -------------------------------------------------------------- | ----------------------------------------------- |
|
|
63
|
+
| Whole collection (folder) | `knl view <folder>` (reuses 127.0.0.1:5180) | Folder viewer; the schema tab lists the records |
|
|
64
|
+
| Single record file | `knl pop <record>.md` (reuses 127.0.0.1:5180) | One document pop-up |
|
|
65
|
+
| Phone-accessible link (explicit request) | `kennel serve <folder> --lan` / `kennel pop <record>.md --lan` | Private LAN link (same network required) |
|
|
66
|
+
|
|
67
|
+
`kennel`, `kennel pop`, `kennel view`, and `kennel serve` above are the
|
|
68
|
+
platform viewer CLI. The validation commands — `kennel schema`,
|
|
69
|
+
`kennel doctor`, `kennel validate` — share the `kennel` name but come from
|
|
70
|
+
the separate `kennel-cli` bundle; do not read one's output with the other's
|
|
71
|
+
expectations. Localhost previews always reuse the single always-running hot
|
|
72
|
+
viewer on `http://127.0.0.1:5180` — never add `--port` for localhost; for
|
|
73
|
+
launch mechanics follow the kennel-preview skill.
|
|
74
|
+
|
|
75
|
+
## Creating or updating a schema
|
|
76
|
+
|
|
77
|
+
Workflow:
|
|
78
|
+
|
|
79
|
+
1. Identify the exact folder that owns the collection.
|
|
80
|
+
2. Read existing `schema.json`, `_schema.json`, `kennel.json`, `raggle.json`,
|
|
81
|
+
and nearby records before editing.
|
|
82
|
+
3. Ask for missing product intent only when it cannot be inferred:
|
|
83
|
+
collection purpose, required record fields, icon or visual identity,
|
|
84
|
+
filters/groups/tabs and numeric ranges the UI must support, and the record
|
|
85
|
+
format (Markdown frontmatter, YAML, or JSON).
|
|
86
|
+
4. For normal collections, ask whether to start from a published Raggle
|
|
87
|
+
schema. If the user gives a URL, fetch it and use it as the starting
|
|
88
|
+
point; otherwise use published schemas only as examples.
|
|
89
|
+
5. Create or update the nearest `schema.json`. Use `_schema.json` only when
|
|
90
|
+
the folder already uses that convention.
|
|
91
|
+
6. Update existing records, or create the smallest sample record, so the
|
|
92
|
+
folder validates against the schema.
|
|
93
|
+
7. Run Kennel validation when available.
|
|
94
|
+
8. **Wire it into the relative `raggle.json`** — the nearest one, walking up
|
|
95
|
+
from the collection folder. Add one `schemas` entry
|
|
96
|
+
`{ "path": "<collection folder>", "schema": "<schema file>" }`, both paths
|
|
97
|
+
relative to that `raggle.json`. Do not duplicate the entry in both the
|
|
98
|
+
repo root and a nested config. Without this entry the schema is dead
|
|
99
|
+
weight.
|
|
100
|
+
|
|
101
|
+
Schema shape — JSON Schema draft 2020-12:
|
|
102
|
+
|
|
103
|
+
```json
|
|
104
|
+
{
|
|
105
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
106
|
+
"$id": "meetings/schema.json",
|
|
107
|
+
"title": "Meetings",
|
|
108
|
+
"type": "object",
|
|
109
|
+
"x-kennel": {
|
|
110
|
+
"documents": [{ "glob": "*.md", "parser": "markdown-frontmatter" }],
|
|
111
|
+
"icon": "calendar-days",
|
|
112
|
+
"ui": {
|
|
113
|
+
"primaryField": "title",
|
|
114
|
+
"secondaryField": "date",
|
|
115
|
+
"filters": ["status", "type"],
|
|
116
|
+
"sort": [{ "field": "date", "direction": "desc" }]
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
"required": ["title", "slug", "status"],
|
|
120
|
+
"properties": {
|
|
121
|
+
"title": { "type": "string", "minLength": 1 },
|
|
122
|
+
"slug": { "$ref": "#/$defs/slug" },
|
|
123
|
+
"status": { "type": "string" }
|
|
124
|
+
},
|
|
125
|
+
"additionalProperties": true,
|
|
126
|
+
"$defs": {
|
|
127
|
+
"slug": {
|
|
128
|
+
"type": "string",
|
|
129
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Treat `x-kennel.documents` as required for content discovery; `x-kennel.icon`
|
|
136
|
+
and `x-kennel.ui` are optional hints. Icon names use Lucide kebab case
|
|
137
|
+
(matching the UI icon set). Standard setup files (`AGENTS.md`, `README.md`,
|
|
138
|
+
`SKILL.md`) are ignored unless a document pattern names them, so a
|
|
139
|
+
folder-record collection like `*/AGENTS.md` keeps its records.
|
|
140
|
+
|
|
141
|
+
Field design:
|
|
142
|
+
|
|
143
|
+
- Put fields used for filters, tabs, sorting, badges, and search in
|
|
144
|
+
frontmatter or YAML.
|
|
145
|
+
- Use enums for stable statuses, types, and stages; arrays for tags,
|
|
146
|
+
participants, evidence, next actions.
|
|
147
|
+
- Use file-reference fields when the record points at other records
|
|
148
|
+
(`people/*.md`, `meetings/*.md`).
|
|
149
|
+
- Use `format: "date"`, `format: "date-time"`, `format: "uri"`, and
|
|
150
|
+
`format: "email"` where useful.
|
|
151
|
+
- Keep `additionalProperties: true` when existing records carry flexible
|
|
152
|
+
metadata.
|
|
153
|
+
- Do not make a field required unless records can be filled consistently.
|
|
154
|
+
|
|
155
|
+
Record setup — for Markdown records keep schema data in YAML frontmatter and
|
|
156
|
+
prose in the body:
|
|
157
|
+
|
|
158
|
+
```markdown
|
|
159
|
+
---
|
|
160
|
+
title: Example Meeting
|
|
161
|
+
slug: example-meeting
|
|
162
|
+
status: planned
|
|
163
|
+
date: 2026-08-10
|
|
164
|
+
participants: []
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
# Example Meeting
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
When creating examples, use known facts only: `null`, empty arrays, or clear
|
|
171
|
+
placeholders where the schema allows them. Note the null caveat: a property
|
|
172
|
+
typed `"number"` alone rejects an explicit `null`; pair `"type":
|
|
173
|
+
["number", "null"]` on optional numeric fields.
|
|
174
|
+
|
|
175
|
+
## Boundaries
|
|
176
|
+
|
|
177
|
+
- Schema edits belong to this skill; record edits follow the repo's normal
|
|
178
|
+
content conventions. Re-view after either.
|
|
179
|
+
- After importing or copying a published schema: adjust fields to the folder
|
|
180
|
+
purpose, keep required fields realistic, align icons and UI hints, remove
|
|
181
|
+
fields nobody will maintain, and validate current records against the
|
|
182
|
+
result.
|
|
183
|
+
- If `kennel` is not available, verify the JSON parses and that required
|
|
184
|
+
fields match at least one record, and state that full validation did not
|
|
185
|
+
run.
|