kennel 0.2.11 → 0.2.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/dist/cli/src/plugins/external.js +19 -7
  2. package/dist/cli/src/site/server-plugins.d.ts +1 -4
  3. package/dist/core/api-client.js +3 -11
  4. package/dist/core/runtime.js +84 -695
  5. package/dist/package/preview.js +99 -729
  6. package/dist/plugins/external.js +19 -7
  7. package/dist/site/server-plugins.d.ts +1 -4
  8. package/dist/site/server-plugins.js +28 -537
  9. package/kernel/apps/web/package.json +0 -1
  10. package/kernel/apps/web/src/app.css +0 -1
  11. package/kernel/apps/web/src/app.tsx +7 -24
  12. package/kernel/apps/web/src/folder-plugin-view.tsx +6 -3
  13. package/kernel/apps/web/src/plugins.ts +2 -14
  14. package/kernel/apps/web/vite.config.ts +22 -20
  15. package/kernel/packages/api/openapi.json +85 -224
  16. package/kernel/packages/api/package.json +0 -1
  17. package/kernel/packages/api/src/contracts/schemas.ts +1 -9
  18. package/kernel/packages/api/src/server/folder-metadata-plugin.ts +9 -151
  19. package/kernel/packages/api/src/server/plugins.ts +11 -26
  20. package/kernel/packages/api/src/shared/viewer-route.ts +3 -5
  21. package/kernel/packages/api-client/src/generated.d.ts +16 -53
  22. package/kernel/packages/markdown/README.md +2 -2
  23. package/kernel/packages/notes/package.json +1 -0
  24. package/kernel/packages/notes/src/client.tsx +0 -1
  25. package/kernel/packages/notes/src/manifest.ts +7 -0
  26. package/kernel/packages/notes/src/pages/notes-page.tsx +1 -1
  27. package/kernel/packages/notes/src/ui/folder-notes-list.tsx +52 -7
  28. package/kernel/packages/plugins/SKILL.md +3 -2
  29. package/kernel/packages/plugins/package.json +5 -1
  30. package/kernel/packages/plugins/src/hooks.ts +24 -0
  31. package/kernel/packages/plugins/src/index.ts +1 -7
  32. package/kernel/packages/plugins/src/page.ts +0 -7
  33. package/kernel/packages/plugins/src/types.ts +8 -0
  34. package/kernel/packages/plugins/tsconfig.json +1 -1
  35. package/kernel/packages/plugins/tsup.config.ts +1 -0
  36. package/kernel/packages/ui/src/components/folder-activity.tsx +16 -98
  37. package/kernel/packages/ui/src/components/folder-landing.tsx +4 -0
  38. package/kernel/packages/ui/src/components/markdown-copy-block.tsx +78 -0
  39. package/kernel/packages/ui/src/components/pagination.tsx +88 -2
  40. package/kernel/packages/ui/src/components/plugin-icon.tsx +19 -0
  41. package/kernel/packages/ui/src/lib/folder-activity.ts +4 -17
  42. package/kernel/packages/ui/src/lib/source-components.tsx +12 -6
  43. package/kernel/packages/ui/src/styles/folder-activity.css +1 -31
  44. package/package.json +2 -2
  45. package/web/assets/{abnfDiagram-VRR7QNED-CSaxgLw6.js → abnfDiagram-VRR7QNED-Dt7QEF5H.js} +1 -1
  46. package/web/assets/app-C1j063QX.js +2 -0
  47. package/web/assets/app-options-98-a6ivv.js +25 -0
  48. package/web/assets/{app-view-header-Cpx74SQs.js → app-view-header-BJ9CWTE1.js} +1 -1
  49. package/web/assets/{arc-DOrTJz--.js → arc-PFB0H7oD.js} +1 -1
  50. package/web/assets/{architectureDiagram-ZJ3FMSHR-EjOjwlGK.js → architectureDiagram-ZJ3FMSHR-BHLqEXlZ.js} +1 -1
  51. package/web/assets/{ask-tray-DLEoRbpV.js → ask-tray-C3gBesHJ.js} +1 -1
  52. package/web/assets/{blockDiagram-677ZJIJ3-Dg2LWLOW.js → blockDiagram-677ZJIJ3-UbnYoYDg.js} +1 -1
  53. package/web/assets/{button-C6arH7zt.js → button-CuuAtS1I.js} +1 -1
  54. package/web/assets/{c4Diagram-LMCZKHZV-CWHqGPk8.js → c4Diagram-LMCZKHZV-4OSx1V4W.js} +1 -1
  55. package/web/assets/channel-BuvY5cQN.js +1 -0
  56. package/web/assets/{chunk-2Q5K7J3B-Dzz0QWV_.js → chunk-2Q5K7J3B-CgxJ1aJb.js} +1 -1
  57. package/web/assets/{chunk-32BRIVSS-BocStooX.js → chunk-32BRIVSS-Bfwxg2LM.js} +1 -1
  58. package/web/assets/{chunk-5VM5RSS4-D8BF5Y5h.js → chunk-5VM5RSS4-BZN9a2hI.js} +1 -1
  59. package/web/assets/{chunk-EX3LRPZG-CWMl9KkL.js → chunk-EX3LRPZG-CrH6hhqq.js} +1 -1
  60. package/web/assets/{chunk-JWPE2WC7-BZEr7iFk.js → chunk-JWPE2WC7-Ddn7ZSp8.js} +1 -1
  61. package/web/assets/{chunk-MOJQB5TN-DbKnLJ33.js → chunk-MOJQB5TN-9lJ7f_hI.js} +1 -1
  62. package/web/assets/{chunk-RYQCIY6F-BF9KWoi2.js → chunk-RYQCIY6F-QrFo_00s.js} +1 -1
  63. package/web/assets/{chunk-V7JOEXUC-e88zamUH.js → chunk-V7JOEXUC-Dn0lQjVf.js} +1 -1
  64. package/web/assets/{chunk-VR4S4FIN-NDHM58HJ.js → chunk-VR4S4FIN-DXVPySkB.js} +1 -1
  65. package/web/assets/{chunk-XXDRQBXY-BtzSzNoD.js → chunk-XXDRQBXY-CBiFDOdZ.js} +1 -1
  66. package/web/assets/classDiagram-OUVF2IWQ-DCYNCJhe.js +1 -0
  67. package/web/assets/classDiagram-v2-EOCWNBFH-DCYNCJhe.js +1 -0
  68. package/web/assets/client-DBJY3XDL.js +43 -0
  69. package/web/assets/client-DKJs0w4y.js +6 -0
  70. package/web/assets/{command-BWtewOrt.js → command-onjTnuXT.js} +1 -1
  71. package/web/assets/{copy-context-YESgZ_hu.js → copy-context-CciRaLNN.js} +1 -1
  72. package/web/assets/{cose-bilkent-JH36ORCC-i7x8jZ9M.js → cose-bilkent-JH36ORCC-CGRic2um.js} +1 -1
  73. package/web/assets/{cynefin-VYW2F7L2-D8HPrHMt.js → cynefin-VYW2F7L2-Blk0Lu0l.js} +1 -1
  74. package/web/assets/{cynefinDiagram-TSTJHNR4-BtkeCNXb.js → cynefinDiagram-TSTJHNR4-DpnnHRDK.js} +1 -1
  75. package/web/assets/{dagre-VKFMJZFB-oIThwshO.js → dagre-VKFMJZFB-llzMokKp.js} +1 -1
  76. package/web/assets/{diagram-FQU43EPY-DTuhEo03.js → diagram-FQU43EPY-DC6xHovR.js} +1 -1
  77. package/web/assets/{diagram-G47NLZAW-BcQ_4_fE.js → diagram-G47NLZAW-B8GVS3EA.js} +1 -1
  78. package/web/assets/{diagram-NH7WQ7WH-BA4VC8Du.js → diagram-NH7WQ7WH-DWUaARfh.js} +1 -1
  79. package/web/assets/{diagram-OA4YK3LP-BOpyrmty.js → diagram-OA4YK3LP-9Uaes_Yi.js} +1 -1
  80. package/web/assets/{diagram-WEI45ONY-BzrSPDJ7.js → diagram-WEI45ONY-DPPTBWud.js} +1 -1
  81. package/web/assets/document-D23WzFsW.js +23 -0
  82. package/web/assets/{ebnfDiagram-CCIWWBDH-BNV_4xDp.js → ebnfDiagram-CCIWWBDH-BPrKneNw.js} +1 -1
  83. package/web/assets/{entities-D0qpC3B9.js → entities-DPg0B8vd.js} +1 -1
  84. package/web/assets/{erDiagram-Q63AITRT-NT1La9pi.js → erDiagram-Q63AITRT-CFqYBcnb.js} +1 -1
  85. package/web/assets/{file-viewer-C1N6vaip.js → file-viewer-Ck73SsLA.js} +1 -1
  86. package/web/assets/{flowDiagram-23GEKE2U-CIYWUYkz.js → flowDiagram-23GEKE2U-C7RpYqaT.js} +1 -1
  87. package/web/assets/folder-filter-bar-DzejUj87.js +4 -0
  88. package/web/assets/{folder-image-Bz0xznQT.js → folder-image-BjIicmQ6.js} +1 -1
  89. package/web/assets/folder-landing-CCIXZfkp.js +55 -0
  90. package/web/assets/folder-list-TuRwuTss.js +1 -0
  91. package/web/assets/folder-mobile-bar-Bqnfwi-z.js +1 -0
  92. package/web/assets/folder-plugin-view-CrinCX1o.js +2 -0
  93. package/web/assets/{ganttDiagram-NO4QXBWP-DeUfoXQA.js → ganttDiagram-NO4QXBWP-Cz2sxU8F.js} +1 -1
  94. package/web/assets/{gitGraphDiagram-IHSO6WYX-DMeTgUPh.js → gitGraphDiagram-IHSO6WYX-BSuz0yF-.js} +1 -1
  95. package/web/assets/{index-CCXE8zc9.js → index-BVyeNcuc.js} +1 -1
  96. package/web/assets/{index-CegvVQ1C.js → index-Cg-gtBkw.js} +1 -1
  97. package/web/assets/index-DLn_2LPp.js +2 -0
  98. package/web/assets/{index-DY0VGBht.js → index-DbVDdnzL.js} +1 -1
  99. package/web/assets/index-uY9jLiL5.css +1 -0
  100. package/web/assets/{infoDiagram-FWYZ7A6U-DI_P8Ghi.js → infoDiagram-FWYZ7A6U-CpeKgqoS.js} +1 -1
  101. package/web/assets/input-Bz_puamS.js +9 -0
  102. package/web/assets/{ishikawaDiagram-FXEZZL3T-B8bM-8CD.js → ishikawaDiagram-FXEZZL3T-5c2Tmknb.js} +1 -1
  103. package/web/assets/{journeyDiagram-5HDEW3XC-pviYejXU.js → journeyDiagram-5HDEW3XC-Cu-wRkR4.js} +1 -1
  104. package/web/assets/{kanban-definition-HUTT4EX6-DfvdDvpU.js → kanban-definition-HUTT4EX6-BunSqkPe.js} +1 -1
  105. package/web/assets/{linear-DNOuKTk_.js → linear-C8e8bGVv.js} +1 -1
  106. package/web/assets/{mermaid.core-CisVJ_Cs.js → mermaid.core-DLgjY1g2.js} +4 -4
  107. package/web/assets/{metadata-C7E_6HIN.js → metadata-DEfJKlnd.js} +1 -1
  108. package/web/assets/{mindmap-definition-LN4V7U3C-DzdcaduN.js → mindmap-definition-LN4V7U3C-W9ENYFOD.js} +1 -1
  109. package/web/assets/{pegDiagram-2B236MQR-D_7xhlXd.js → pegDiagram-2B236MQR-0vPlHCFp.js} +1 -1
  110. package/web/assets/{pieDiagram-ENE6RG2P-CisikHMW.js → pieDiagram-ENE6RG2P-CakaveRV.js} +1 -1
  111. package/web/assets/{popover-D7MTK-sz.js → popover-3AMcPJpt.js} +1 -1
  112. package/web/assets/{project-search-dialog-BsHc39D0.js → project-search-dialog-BSKA4peX.js} +1 -1
  113. package/web/assets/{quadrantDiagram-ABIIQ3AL-D6adg-7z.js → quadrantDiagram-ABIIQ3AL-jxHw_egj.js} +1 -1
  114. package/web/assets/{railroadDiagram-RFXS5EU6-CyPAHeJ-.js → railroadDiagram-RFXS5EU6-lIjDXPZt.js} +1 -1
  115. package/web/assets/{requirementDiagram-TGXJPOKE-CgpSiPTv.js → requirementDiagram-TGXJPOKE-C-JiT4bc.js} +1 -1
  116. package/web/assets/{sankeyDiagram-HTMAVEWB-BxvReW6S.js → sankeyDiagram-HTMAVEWB-SuLPAw9X.js} +1 -1
  117. package/web/assets/{search-DEgwpq-P.js → search-CKujW14f.js} +1 -1
  118. package/web/assets/{selection-popup-d94JnDPy.js → selection-popup-CtxT9SWn.js} +3 -3
  119. package/web/assets/{sequenceDiagram-DBY2YBRQ-uuplzETI.js → sequenceDiagram-DBY2YBRQ-o9UwTkZR.js} +1 -1
  120. package/web/assets/{sizeCapture-X5ZJPWSS-Bi3F7nOa.js → sizeCapture-X5ZJPWSS-ClbWGybF.js} +1 -1
  121. package/web/assets/{stateDiagram-2N3HPSRC-DqypF7lE.js → stateDiagram-2N3HPSRC-Ce4avoWx.js} +1 -1
  122. package/web/assets/stateDiagram-v2-6OUMAXLB-CsrPTZoJ.js +1 -0
  123. package/web/assets/{swimlanes-5IMT3BWC-CGD9YT1l.js → swimlanes-5IMT3BWC-DMZI4XZT.js} +2 -2
  124. package/web/assets/swimlanesDiagram-G3AALYLV-pShSVcTd.js +8 -0
  125. package/web/assets/{timeline-definition-FHXFAJF6-DCjNS9Ol.js → timeline-definition-FHXFAJF6-CPIpIgPN.js} +1 -1
  126. package/web/assets/{utils-DCaHk0Gm.js → utils-Cg80pk1W.js} +1 -1
  127. package/web/assets/{vennDiagram-L72KCM5P-BJ58yQgD.js → vennDiagram-L72KCM5P-_rha8uDZ.js} +1 -1
  128. package/web/assets/view-context-BDtIUHQy.js +229 -0
  129. package/web/assets/{viewer-capabilities-DCuJdf64.js → viewer-capabilities-YYZqMs56.js} +1 -1
  130. package/web/assets/{wardleyDiagram-EHGQE667-BiLuq9mr.js → wardleyDiagram-EHGQE667-D4EAOS35.js} +1 -1
  131. package/web/assets/{xychartDiagram-FW5EYKEG-DzAZpIRG.js → xychartDiagram-FW5EYKEG-DR8PwXpe.js} +1 -1
  132. package/web/index.html +2 -2
  133. package/kernel/packages/agents/eslint.config.js +0 -10
  134. package/kernel/packages/agents/package.json +0 -75
  135. package/kernel/packages/agents/src/agent-card.tsx +0 -334
  136. package/kernel/packages/agents/src/client.tsx +0 -13
  137. package/kernel/packages/agents/src/index.ts +0 -18
  138. package/kernel/packages/agents/src/manifest.ts +0 -7
  139. package/kernel/packages/agents/src/node.ts +0 -447
  140. package/kernel/packages/agents/src/profiles.ts +0 -137
  141. package/kernel/packages/agents/src/resolve.ts +0 -69
  142. package/kernel/packages/agents/src/server.ts +0 -60
  143. package/kernel/packages/agents/src/types.ts +0 -82
  144. package/kernel/packages/agents/src/viewer.tsx +0 -370
  145. package/kernel/packages/agents/test/profiles.test.mjs +0 -88
  146. package/kernel/packages/agents/test/resolve.test.mjs +0 -729
  147. package/kernel/packages/agents/tsconfig.json +0 -17
  148. package/kernel/packages/api/test/agents-loading.test.ts +0 -94
  149. package/kernel/packages/ui/src/components/folder-skill-list.tsx +0 -62
  150. package/web/assets/app-DoXXGPMx.js +0 -2
  151. package/web/assets/app-options-jTBHy0A7.js +0 -25
  152. package/web/assets/channel-54w4vQjC.js +0 -1
  153. package/web/assets/classDiagram-OUVF2IWQ-Bh9Ib2pw.js +0 -1
  154. package/web/assets/classDiagram-v2-EOCWNBFH-Bh9Ib2pw.js +0 -1
  155. package/web/assets/client-BgUDusrU.js +0 -5
  156. package/web/assets/client-COaHUqSC.js +0 -17
  157. package/web/assets/client-UC06V2VL.js +0 -22
  158. package/web/assets/document-BDtU3CbX.js +0 -19
  159. package/web/assets/folder-filter-bar-C_2Mobfq.js +0 -4
  160. package/web/assets/folder-landing-3gqbGaYS.js +0 -54
  161. package/web/assets/folder-list-DDI0TF2e.js +0 -1
  162. package/web/assets/folder-metadata-DjV3ZUra.js +0 -2
  163. package/web/assets/folder-mobile-bar-CF4CpJXL.js +0 -1
  164. package/web/assets/folder-plugin-view-C48J0HKe.js +0 -3
  165. package/web/assets/index-Bp9DidgD.js +0 -1
  166. package/web/assets/index-CXhBn-ar.js +0 -1
  167. package/web/assets/index-CtuOSBHa.js +0 -2
  168. package/web/assets/index-Dwhf8F_U.css +0 -1
  169. package/web/assets/select-DGaccqVB.js +0 -30
  170. package/web/assets/stateDiagram-v2-6OUMAXLB-EsEb0a5Q.js +0 -1
  171. package/web/assets/swimlanesDiagram-G3AALYLV-DKIYuN5l.js +0 -8
  172. package/web/assets/use-folder-filter-hA6fa7nm.js +0 -1
  173. package/web/assets/view-context-BrzQ7WBV.js +0 -229
@@ -28,7 +28,7 @@ import type {
28
28
  // Sessions functionality is commented out (can be re-enabled).
29
29
  // FolderSession,
30
30
  } from "@raggle-ai/ui/lib/folder-activity"
31
- import { useFolderNotes } from "@raggle-ai/notes/client"
31
+ import { useFolderNotes } from "@raggle-ai/notes/data/use-folder-notes"
32
32
  import { LinkProvider } from "@raggle-ai/ui/components/link"
33
33
  import { toast, Toaster } from "@raggle-ai/ui/components/sonner"
34
34
 
@@ -43,6 +43,7 @@ import {
43
43
  writeFolderQueryCache,
44
44
  } from "./folder-query-cache"
45
45
  import { localSource } from "./local-source"
46
+ import { getFolderPlugin } from "./plugins"
46
47
  import { queryClient } from "./query-client"
47
48
  import { useView, ViewProvider } from "./view-context"
48
49
  import {
@@ -154,10 +155,6 @@ const folderRoute = createRoute({
154
155
  // getParentRoute: () => folderRoute,
155
156
  // path: "sessions",
156
157
  // })
157
- const folderSkillsRoute = createRoute({
158
- getParentRoute: () => folderRoute,
159
- path: "skills",
160
- })
161
158
  const folderViewRoute = createRoute({
162
159
  getParentRoute: () => folderRoute,
163
160
  path: "views/$pluginId",
@@ -211,7 +208,6 @@ const routeTree = rootRoute.addChildren([
211
208
  folderNotesRoute,
212
209
  folderCollectionRoute,
213
210
  // folderSessionsRoute,
214
- folderSkillsRoute,
215
211
  folderViewRoute,
216
212
  folderViewDetailRoute,
217
213
  folderProjectsRoute,
@@ -297,7 +293,6 @@ const cacheTimes = {
297
293
  plugins: Number.POSITIVE_INFINITY,
298
294
  // Sessions functionality is commented out (can be re-enabled).
299
295
  // sessions: 5_000,
300
- skills: 15_000,
301
296
  }
302
297
 
303
298
  function folderQueryKey(folderId: string, part: MetadataPart) {
@@ -387,14 +382,6 @@ function FolderContent() {
387
382
  // staleTime: cacheTimes.sessions,
388
383
  // })
389
384
  const notes = useFolderNotes(href, loadMetadata && params.section === "notes")
390
- // Skills are loaded on demand, only when their section is open.
391
- const skills = useQuery({
392
- enabled: Boolean(loadMetadata && params.section === "skills"),
393
- gcTime: 5 * 60_000,
394
- queryFn: ({ signal }) => fetchMetadataPart(href, "skills", { signal }),
395
- queryKey: folderQueryKey(folderId, "skills"),
396
- staleTime: cacheTimes.skills,
397
- })
398
385
  const metadata = useMemo<FolderMetadata | undefined>(() => {
399
386
  if (!identity.data) return undefined
400
387
  return {
@@ -408,16 +395,8 @@ function FolderContent() {
408
395
  // Sessions functionality is commented out (can be re-enabled).
409
396
  // sessions: sessions.data?.sessions ?? { items: [] },
410
397
  sessions: { items: [] },
411
- skills: skills.data?.skills ?? { items: [] },
412
398
  }
413
- }, [
414
- discovery.data,
415
- identity.data,
416
- notes.files,
417
- plugins.data,
418
- skills.data,
419
- view.workspace,
420
- ])
399
+ }, [discovery.data, identity.data, notes.files, plugins.data, view.workspace])
421
400
  const metadataErrorReason =
422
401
  identity.error ??
423
402
  (params.section === "projects" ? discovery.error : undefined) ??
@@ -532,6 +511,7 @@ function FolderContent() {
532
511
  ) : null
533
512
 
534
513
  const collectionPage = Boolean(params.collectionId)
514
+ const activePlugin = getFolderPlugin(params.view?.pluginId)
535
515
  const landingProps = {
536
516
  data: metadata,
537
517
  collectionId: params.collectionId,
@@ -560,6 +540,9 @@ function FolderContent() {
560
540
  tab: routeFolderTab(params),
561
541
  tabHref,
562
542
  view: params.view,
543
+ viewNavigation: activePlugin
544
+ ? { icon: activePlugin.icon, label: activePlugin.label }
545
+ : undefined,
563
546
  }
564
547
 
565
548
  return (
@@ -2,6 +2,7 @@ import { useParams } from "@tanstack/react-router"
2
2
  import { api } from "~/api-client"
3
3
 
4
4
  import type { FolderPluginViewProps } from "kennel-plugins/client"
5
+ import { FolderPathProvider } from "kennel-plugins/hooks"
5
6
 
6
7
  import { FolderFilterMetadataProvider } from "./folder-filter-icons"
7
8
  import { getFolderPlugin } from "./plugins"
@@ -80,8 +81,10 @@ export function FolderPluginPage() {
80
81
  }
81
82
  const Component = plugin.component
82
83
  return (
83
- <FolderFilterMetadataProvider>
84
- <Component {...view} />
85
- </FolderFilterMetadataProvider>
84
+ <FolderPathProvider key={`${folderId}:${plugin.id}`} folder={folder}>
85
+ <FolderFilterMetadataProvider>
86
+ <Component {...view} />
87
+ </FolderFilterMetadataProvider>
88
+ </FolderPathProvider>
86
89
  )
87
90
  }
@@ -1,21 +1,9 @@
1
- import { lazy } from "react"
2
- import { externalFolderPlugins } from "@/external-plugins"
3
-
4
1
  import type { FolderPluginClient } from "kennel-plugins/client"
5
- import { agentsManifest } from "@raggle-ai/agents/manifest"
2
+ import { externalFolderPlugins } from "@/external-plugins"
6
3
 
7
4
  // Keep navigation metadata cheap. Import only the selected plugin's UI;
8
5
  // never construct an import path from an untrusted URL segment.
9
- export const folderPlugins: FolderPluginClient[] = [
10
- {
11
- ...agentsManifest,
12
- component: lazy(async () => ({
13
- default: (await import("@raggle-ai/agents/client")).agentsClient
14
- .component,
15
- })),
16
- },
17
- ...externalFolderPlugins,
18
- ]
6
+ export const folderPlugins: FolderPluginClient[] = [...externalFolderPlugins]
19
7
 
20
8
  const byId = new Map(folderPlugins.map((plugin) => [plugin.id, plugin]))
21
9
  export function getFolderPlugin(id: string | undefined) {
@@ -53,27 +53,16 @@ const packageEntry = (name: string): string | undefined => {
53
53
  // and disable ACP live sessions. Local loopback keeps the intentional
54
54
  // multi-folder hot-viewer workflows (linked notes, server reuse).
55
55
  const remoteAccess = process.env.KENNEL_VIEWER_REMOTE === "1"
56
- // BarkDown is declared only by packages/markdown, so its physical install
57
- // lives either hoisted at the workspace root or nested under the markdown
58
- // re-export package (Bun has used both layouts). Resolve it defensively so a
59
- // layout change or a missing copy degrades to normal node_modules resolution
60
- // instead of crashing config load — and so a stale hoisted copy can never
61
- // mask the version @raggle-ai/markdown actually depends on.
56
+ // Use the markdown package's dependency, never a stale root-level install.
62
57
  const resolveBarkdown = (): string | undefined => {
63
- for (const candidate of [
64
- resolve(workspace, "node_modules/@raggle-ai/barkdown"),
65
- resolve(
66
- workspace,
67
- "node_modules/@raggle-ai/markdown/node_modules/@raggle-ai/barkdown",
68
- ),
69
- ]) {
70
- if (existsSync(candidate)) return realpathSync(candidate)
71
- }
72
- return undefined
58
+ const candidate = resolve(
59
+ workspace,
60
+ "packages/markdown/node_modules/@raggle-ai/barkdown",
61
+ )
62
+ return existsSync(candidate) ? realpathSync(candidate) : undefined
73
63
  }
74
64
  const barkdown = resolveBarkdown()
75
65
  const internalPackages: Array<[RegExp, string]> = [
76
- [/^@raggle-ai\/agents(\/.*)?$/, "packages/agents/src"],
77
66
  [/^kennel-plugins(\/.*)?$/, "packages/plugins/src"],
78
67
  [/^@raggle-ai\/kennel-api(\/.*)?$/, "packages/api/src"],
79
68
  [/^@raggle-ai\/markdown(\/.*)?$/, "packages/markdown/src"],
@@ -84,9 +73,13 @@ const internalPackages: Array<[RegExp, string]> = [
84
73
  [/^kennel-client(\/.*)?$/, "packages/api-client/src"],
85
74
  ]
86
75
  const hostPackageNames = [
87
- "@raggle-ai/barkdown",
88
76
  "@tanstack/react-query",
89
77
  "@tanstack/react-router",
78
+ "class-variance-authority",
79
+ "clsx",
80
+ "radix-ui",
81
+ "sonner",
82
+ "tailwind-merge",
90
83
  "date-fns",
91
84
  "effect",
92
85
  "lucide-react",
@@ -224,6 +217,17 @@ export default defineConfig({
224
217
  }),
225
218
  // Only non-API BarkDown assets remain here; core owns /api/*.
226
219
  barkdownPlugin(root),
220
+ {
221
+ name: "kennel-plugin-style-sources",
222
+ enforce: "pre",
223
+ transform(code, id) {
224
+ if (id.split("?")[0] !== resolve(import.meta.dirname, "src/app.css")) return
225
+ const sources = externalSourceRoots
226
+ .map((folder) => `@source ${JSON.stringify(folder.replaceAll("\\", "/"))};`)
227
+ .join("\n")
228
+ return `${code}\n${sources}\n`
229
+ },
230
+ },
227
231
  tailwindcss(),
228
232
  react(),
229
233
  ],
@@ -261,8 +265,6 @@ export default defineConfig({
261
265
  "./src/main.tsx",
262
266
  "./src/App.tsx",
263
267
  "./src/markdown-page.tsx",
264
- "../../packages/agents/src/viewer.tsx",
265
- "../../packages/agents/src/node.ts",
266
268
  ],
267
269
  },
268
270
  host: "127.0.0.1",
@@ -164,7 +164,6 @@
164
164
  "workspace",
165
165
  "collections",
166
166
  "plugins",
167
- "skills",
168
167
  "sessions",
169
168
  "calendar",
170
169
  "schema"
@@ -322,6 +321,23 @@
322
321
  "error": {
323
322
  "type": "string"
324
323
  },
324
+ "icon": {
325
+ "type": "object",
326
+ "properties": {
327
+ "paths": {
328
+ "minItems": 1,
329
+ "type": "array",
330
+ "items": {
331
+ "type": "string",
332
+ "minLength": 1
333
+ }
334
+ }
335
+ },
336
+ "required": [
337
+ "paths"
338
+ ],
339
+ "additionalProperties": false
340
+ },
325
341
  "id": {
326
342
  "type": "string"
327
343
  },
@@ -433,48 +449,6 @@
433
449
  ],
434
450
  "additionalProperties": false
435
451
  },
436
- "skills": {
437
- "type": "object",
438
- "properties": {
439
- "items": {
440
- "type": "array",
441
- "items": {
442
- "type": "object",
443
- "properties": {
444
- "description": {
445
- "type": "string"
446
- },
447
- "name": {
448
- "type": "string"
449
- },
450
- "openHref": {
451
- "type": "string"
452
- },
453
- "relativePath": {
454
- "type": "string"
455
- },
456
- "source": {
457
- "type": "string",
458
- "enum": [
459
- "global",
460
- "local"
461
- ]
462
- }
463
- },
464
- "required": [
465
- "name",
466
- "relativePath",
467
- "source"
468
- ],
469
- "additionalProperties": false
470
- }
471
- }
472
- },
473
- "required": [
474
- "items"
475
- ],
476
- "additionalProperties": false
477
- },
478
452
  "workspace": {
479
453
  "type": "object",
480
454
  "properties": {
@@ -1402,6 +1376,23 @@
1402
1376
  "error": {
1403
1377
  "type": "string"
1404
1378
  },
1379
+ "icon": {
1380
+ "type": "object",
1381
+ "properties": {
1382
+ "paths": {
1383
+ "minItems": 1,
1384
+ "type": "array",
1385
+ "items": {
1386
+ "type": "string",
1387
+ "minLength": 1
1388
+ }
1389
+ }
1390
+ },
1391
+ "required": [
1392
+ "paths"
1393
+ ],
1394
+ "additionalProperties": false
1395
+ },
1405
1396
  "id": {
1406
1397
  "type": "string"
1407
1398
  },
@@ -1428,61 +1419,6 @@
1428
1419
  ],
1429
1420
  "additionalProperties": false
1430
1421
  },
1431
- {
1432
- "type": "object",
1433
- "properties": {
1434
- "folder": {
1435
- "type": "string"
1436
- },
1437
- "skills": {
1438
- "type": "object",
1439
- "properties": {
1440
- "items": {
1441
- "type": "array",
1442
- "items": {
1443
- "type": "object",
1444
- "properties": {
1445
- "description": {
1446
- "type": "string"
1447
- },
1448
- "name": {
1449
- "type": "string"
1450
- },
1451
- "openHref": {
1452
- "type": "string"
1453
- },
1454
- "relativePath": {
1455
- "type": "string"
1456
- },
1457
- "source": {
1458
- "type": "string",
1459
- "enum": [
1460
- "global",
1461
- "local"
1462
- ]
1463
- }
1464
- },
1465
- "required": [
1466
- "name",
1467
- "relativePath",
1468
- "source"
1469
- ],
1470
- "additionalProperties": false
1471
- }
1472
- }
1473
- },
1474
- "required": [
1475
- "items"
1476
- ],
1477
- "additionalProperties": false
1478
- }
1479
- },
1480
- "required": [
1481
- "folder",
1482
- "skills"
1483
- ],
1484
- "additionalProperties": false
1485
- },
1486
1422
  {
1487
1423
  "type": "object",
1488
1424
  "properties": {
@@ -1585,6 +1521,23 @@
1585
1521
  "error": {
1586
1522
  "type": "string"
1587
1523
  },
1524
+ "icon": {
1525
+ "type": "object",
1526
+ "properties": {
1527
+ "paths": {
1528
+ "minItems": 1,
1529
+ "type": "array",
1530
+ "items": {
1531
+ "type": "string",
1532
+ "minLength": 1
1533
+ }
1534
+ }
1535
+ },
1536
+ "required": [
1537
+ "paths"
1538
+ ],
1539
+ "additionalProperties": false
1540
+ },
1588
1541
  "id": {
1589
1542
  "type": "string"
1590
1543
  },
@@ -1696,48 +1649,6 @@
1696
1649
  ],
1697
1650
  "additionalProperties": false
1698
1651
  },
1699
- "skills": {
1700
- "type": "object",
1701
- "properties": {
1702
- "items": {
1703
- "type": "array",
1704
- "items": {
1705
- "type": "object",
1706
- "properties": {
1707
- "description": {
1708
- "type": "string"
1709
- },
1710
- "name": {
1711
- "type": "string"
1712
- },
1713
- "openHref": {
1714
- "type": "string"
1715
- },
1716
- "relativePath": {
1717
- "type": "string"
1718
- },
1719
- "source": {
1720
- "type": "string",
1721
- "enum": [
1722
- "global",
1723
- "local"
1724
- ]
1725
- }
1726
- },
1727
- "required": [
1728
- "name",
1729
- "relativePath",
1730
- "source"
1731
- ],
1732
- "additionalProperties": false
1733
- }
1734
- }
1735
- },
1736
- "required": [
1737
- "items"
1738
- ],
1739
- "additionalProperties": false
1740
- },
1741
1652
  "workspace": {
1742
1653
  "type": "object",
1743
1654
  "properties": {
@@ -1994,6 +1905,23 @@
1994
1905
  "error": {
1995
1906
  "type": "string"
1996
1907
  },
1908
+ "icon": {
1909
+ "type": "object",
1910
+ "properties": {
1911
+ "paths": {
1912
+ "minItems": 1,
1913
+ "type": "array",
1914
+ "items": {
1915
+ "type": "string",
1916
+ "minLength": 1
1917
+ }
1918
+ }
1919
+ },
1920
+ "required": [
1921
+ "paths"
1922
+ ],
1923
+ "additionalProperties": false
1924
+ },
1997
1925
  "id": {
1998
1926
  "type": "string"
1999
1927
  },
@@ -2105,48 +2033,6 @@
2105
2033
  ],
2106
2034
  "additionalProperties": false
2107
2035
  },
2108
- "skills": {
2109
- "type": "object",
2110
- "properties": {
2111
- "items": {
2112
- "type": "array",
2113
- "items": {
2114
- "type": "object",
2115
- "properties": {
2116
- "description": {
2117
- "type": "string"
2118
- },
2119
- "name": {
2120
- "type": "string"
2121
- },
2122
- "openHref": {
2123
- "type": "string"
2124
- },
2125
- "relativePath": {
2126
- "type": "string"
2127
- },
2128
- "source": {
2129
- "type": "string",
2130
- "enum": [
2131
- "global",
2132
- "local"
2133
- ]
2134
- }
2135
- },
2136
- "required": [
2137
- "name",
2138
- "relativePath",
2139
- "source"
2140
- ],
2141
- "additionalProperties": false
2142
- }
2143
- }
2144
- },
2145
- "required": [
2146
- "items"
2147
- ],
2148
- "additionalProperties": false
2149
- },
2150
2036
  "workspace": {
2151
2037
  "type": "object",
2152
2038
  "properties": {
@@ -2403,6 +2289,23 @@
2403
2289
  "error": {
2404
2290
  "type": "string"
2405
2291
  },
2292
+ "icon": {
2293
+ "type": "object",
2294
+ "properties": {
2295
+ "paths": {
2296
+ "minItems": 1,
2297
+ "type": "array",
2298
+ "items": {
2299
+ "type": "string",
2300
+ "minLength": 1
2301
+ }
2302
+ }
2303
+ },
2304
+ "required": [
2305
+ "paths"
2306
+ ],
2307
+ "additionalProperties": false
2308
+ },
2406
2309
  "id": {
2407
2310
  "type": "string"
2408
2311
  },
@@ -2514,48 +2417,6 @@
2514
2417
  ],
2515
2418
  "additionalProperties": false
2516
2419
  },
2517
- "skills": {
2518
- "type": "object",
2519
- "properties": {
2520
- "items": {
2521
- "type": "array",
2522
- "items": {
2523
- "type": "object",
2524
- "properties": {
2525
- "description": {
2526
- "type": "string"
2527
- },
2528
- "name": {
2529
- "type": "string"
2530
- },
2531
- "openHref": {
2532
- "type": "string"
2533
- },
2534
- "relativePath": {
2535
- "type": "string"
2536
- },
2537
- "source": {
2538
- "type": "string",
2539
- "enum": [
2540
- "global",
2541
- "local"
2542
- ]
2543
- }
2544
- },
2545
- "required": [
2546
- "name",
2547
- "relativePath",
2548
- "source"
2549
- ],
2550
- "additionalProperties": false
2551
- }
2552
- }
2553
- },
2554
- "required": [
2555
- "items"
2556
- ],
2557
- "additionalProperties": false
2558
- },
2559
2420
  "workspace": {
2560
2421
  "type": "object",
2561
2422
  "properties": {
@@ -18,7 +18,6 @@
18
18
  },
19
19
  "dependencies": {
20
20
  "@agentclientprotocol/sdk": "^1.3.0",
21
- "@raggle-ai/agents": "workspace:*",
22
21
  "kennel-plugins": "workspace:*",
23
22
  "@raggle-ai/kennel-kinds": "workspace:*",
24
23
  "@raggle-ai/local": "0.14.0",
@@ -28,13 +28,6 @@ const project = z.object({
28
28
  relativePath: z.string(),
29
29
  worktree: z.string(),
30
30
  });
31
- const skill = z.object({
32
- description: z.string().optional(),
33
- name: z.string(),
34
- openHref: z.string().optional(),
35
- relativePath: z.string(),
36
- source: z.enum(["global", "local"]),
37
- });
38
31
  const session = z.object({
39
32
  client: z.enum(["claude", "codex", "cursor", "opencode", "pi"]),
40
33
  href: z.string().optional(),
@@ -64,6 +57,7 @@ const workspace = z.object({
64
57
  const plugin = z.object({
65
58
  count: z.number().optional(),
66
59
  error: z.string().optional(),
60
+ icon: z.object({ paths: z.array(z.string().min(1)).min(1) }).optional(),
67
61
  id: z.string(),
68
62
  label: z.string(),
69
63
  });
@@ -81,7 +75,6 @@ export const folderMetadataSchema = z.object({
81
75
  plugins: plugins.optional(),
82
76
  projects: items(project),
83
77
  sessions: items(session),
84
- skills: items(skill).optional(),
85
78
  workspace: workspace.optional(),
86
79
  });
87
80
  const collection = coreCollectionSchema;
@@ -105,7 +98,6 @@ export const metadataSchemas = {
105
98
  configWarnings: z.array(z.string()).optional(),
106
99
  plugins: plugins.optional(),
107
100
  }),
108
- skills: z.object({ ...folder, skills: items(skill) }),
109
101
  // Legacy selectors currently return the complete metadata payload.
110
102
  sessions: folderMetadataSchema,
111
103
  calendar: folderMetadataSchema,