kennel 0.2.3 → 0.2.6

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 (274) hide show
  1. package/README.md +23 -13
  2. package/dist/cli/dispatch.js +16 -3
  3. package/dist/cli/src/cli/dispatch.js +16 -3
  4. package/dist/cli/src/cli/usage.js +1 -1
  5. package/dist/cli/src/core/command.js +1 -0
  6. package/dist/cli/src/core/init.js +5 -5
  7. package/dist/cli/src/plugins/external.d.ts +28 -2
  8. package/dist/cli/src/plugins/external.js +77 -23
  9. package/dist/cli/src/site/server-plugins.d.ts +4 -9
  10. package/dist/cli/src/site/viewer.js +1 -0
  11. package/dist/cli/usage.js +1 -1
  12. package/dist/core/api-client.js +576 -10317
  13. package/dist/core/command.js +1 -0
  14. package/dist/core/core-folders.js +2313 -12088
  15. package/dist/core/init.js +5 -5
  16. package/dist/core/runtime.js +8237 -20713
  17. package/dist/package/preview.js +19617 -33352
  18. package/dist/plugins/external.d.ts +28 -2
  19. package/dist/plugins/external.js +77 -23
  20. package/dist/site/server-plugins.d.ts +4 -9
  21. package/dist/site/server-plugins.js +557 -10452
  22. package/dist/site/viewer.js +1 -0
  23. package/kernel/apps/web/package.json +2 -6
  24. package/kernel/apps/web/scripts/dev.mjs +53 -0
  25. package/kernel/apps/web/src/app.css +0 -3
  26. package/kernel/apps/web/src/external-plugins.ts +1 -1
  27. package/kernel/apps/web/src/folder-filter-icons.tsx +1 -1
  28. package/kernel/apps/web/src/folder-plugin-view.tsx +1 -1
  29. package/kernel/apps/web/src/main.tsx +0 -1
  30. package/kernel/apps/web/src/plugins.ts +1 -31
  31. package/kernel/apps/web/tsconfig.json +1 -2
  32. package/kernel/apps/web/vite.config.ts +32 -14
  33. package/kernel/packages/agents/package.json +1 -1
  34. package/kernel/packages/agents/src/agent-card.tsx +1 -1
  35. package/kernel/packages/agents/src/client.tsx +1 -1
  36. package/kernel/packages/agents/src/manifest.ts +1 -1
  37. package/kernel/packages/agents/src/server.ts +1 -1
  38. package/kernel/packages/agents/src/viewer.tsx +1 -1
  39. package/kernel/packages/api/package.json +1 -5
  40. package/kernel/packages/api/src/server/acp-live-plugin.ts +1 -1
  41. package/kernel/packages/api/src/server/api/create-agent-file.ts +2 -2
  42. package/kernel/packages/api/src/server/api/document-edit.ts +2 -2
  43. package/kernel/packages/api/src/server/api/open-path.ts +2 -2
  44. package/kernel/packages/api/src/server/folder-metadata-plugin.ts +17 -42
  45. package/kernel/packages/api/src/server/index.ts +0 -1
  46. package/kernel/packages/api/src/server/plugins.ts +52 -19
  47. package/kernel/packages/api/src/shared/viewer-route.ts +1 -1
  48. package/kernel/packages/api/test/core.test.ts +14 -26
  49. package/kernel/packages/markdown/README.md +1 -1
  50. package/kernel/packages/notes/package.json +1 -1
  51. package/kernel/packages/notes/src/client.tsx +1 -1
  52. package/kernel/packages/notes/src/manifest.ts +1 -1
  53. package/kernel/packages/notes/src/server.ts +1 -1
  54. package/kernel/packages/plugins/SKILL.md +39 -0
  55. package/kernel/{plugins/mail → packages/plugins}/package.json +53 -28
  56. package/kernel/packages/plugins/src/index.ts +52 -0
  57. package/kernel/packages/plugins/src/page.ts +17 -0
  58. package/kernel/{plugins/projects → packages/plugins}/tsconfig.json +5 -1
  59. package/kernel/packages/plugins/tsup.config.ts +25 -0
  60. package/kernel/packages/ui/src/components/content-issues.tsx +1 -1
  61. package/kernel/packages/ui/tsconfig.json +1 -1
  62. package/package.json +2 -3
  63. package/web/assets/{abnfDiagram-VRR7QNED-Bgfb1nEB.js → abnfDiagram-VRR7QNED-xd_g1uK3.js} +1 -1
  64. package/web/assets/app-CX20nNIa.js +2 -0
  65. package/web/assets/{app-options-D-RJiQ-X.js → app-options-CkPJE5ep.js} +1 -1
  66. package/web/assets/{app-view-header-BLvLq02T.js → app-view-header-CNk5KnA-.js} +1 -1
  67. package/web/assets/{arc-Dk_KI36B.js → arc-B0u5yBJA.js} +1 -1
  68. package/web/assets/{architectureDiagram-ZJ3FMSHR-NR_KhRCf.js → architectureDiagram-ZJ3FMSHR-DfxOAo8P.js} +1 -1
  69. package/web/assets/{ask-tray-TzeTcO6-.js → ask-tray-SscJecDY.js} +1 -1
  70. package/web/assets/{blockDiagram-677ZJIJ3-CkLkwx9C.js → blockDiagram-677ZJIJ3-Ci3Usxh6.js} +1 -1
  71. package/web/assets/{c4Diagram-LMCZKHZV-CFCUH8e_.js → c4Diagram-LMCZKHZV-BqgwIVgh.js} +1 -1
  72. package/web/assets/channel-X7WHyxxT.js +1 -0
  73. package/web/assets/{chunk-2Q5K7J3B-B_BPLWsW.js → chunk-2Q5K7J3B-CfX69l2U.js} +1 -1
  74. package/web/assets/{chunk-32BRIVSS-B1VB1hOy.js → chunk-32BRIVSS-CuFlzZkl.js} +1 -1
  75. package/web/assets/{chunk-5VM5RSS4-KFcYr8Co.js → chunk-5VM5RSS4-DidCMlJa.js} +1 -1
  76. package/web/assets/{chunk-EX3LRPZG-CpBX3kuK.js → chunk-EX3LRPZG-B5CDm1dS.js} +1 -1
  77. package/web/assets/{chunk-JWPE2WC7-BPSl40wG.js → chunk-JWPE2WC7-D5fGV_sH.js} +1 -1
  78. package/web/assets/{chunk-MOJQB5TN-D2RcYmoU.js → chunk-MOJQB5TN-ayhH5Q-H.js} +1 -1
  79. package/web/assets/{chunk-RYQCIY6F-m7Gyn-t3.js → chunk-RYQCIY6F-C4BfOOZn.js} +1 -1
  80. package/web/assets/{chunk-V7JOEXUC-TDvdopxS.js → chunk-V7JOEXUC-DpUEIM9V.js} +1 -1
  81. package/web/assets/{chunk-VR4S4FIN-DZTsG51a.js → chunk-VR4S4FIN-DoQuFFRh.js} +1 -1
  82. package/web/assets/{chunk-XXDRQBXY-Dp0--RE2.js → chunk-XXDRQBXY-CI9eiLwn.js} +1 -1
  83. package/web/assets/classDiagram-OUVF2IWQ-BjsLQ3dz.js +1 -0
  84. package/web/assets/classDiagram-v2-EOCWNBFH-BjsLQ3dz.js +1 -0
  85. package/web/assets/client-7OWw5kW2.js +6 -0
  86. package/web/assets/client-DYj_td4Q.js +17 -0
  87. package/web/assets/{client-j2kQmxsO.js → client-Dk-NBvJR.js} +4 -4
  88. package/web/assets/command-zkzH4hVz.js +38 -0
  89. package/web/assets/{copy-context-C0Uqsp-3.js → copy-context-D5oiWrYC.js} +1 -1
  90. package/web/assets/{cose-bilkent-JH36ORCC-CPu3PI8h.js → cose-bilkent-JH36ORCC-BHRk1mO3.js} +1 -1
  91. package/web/assets/{cynefin-VYW2F7L2-DWxftYAm.js → cynefin-VYW2F7L2-C1B09TRE.js} +1 -1
  92. package/web/assets/{cynefinDiagram-TSTJHNR4-DsmN2V-p.js → cynefinDiagram-TSTJHNR4-B27qXQbv.js} +1 -1
  93. package/web/assets/{dagre-VKFMJZFB-COEbApyY.js → dagre-VKFMJZFB-B1qEi32g.js} +1 -1
  94. package/web/assets/{diagram-FQU43EPY-0O9WGWKB.js → diagram-FQU43EPY-BMkkgADD.js} +1 -1
  95. package/web/assets/{diagram-G47NLZAW-CutEdMVh.js → diagram-G47NLZAW-Cb8_g1A5.js} +1 -1
  96. package/web/assets/{diagram-NH7WQ7WH-C9KZc3B2.js → diagram-NH7WQ7WH-B51wuc5m.js} +1 -1
  97. package/web/assets/{diagram-OA4YK3LP-D8kkPXbY.js → diagram-OA4YK3LP-xnsecbbI.js} +1 -1
  98. package/web/assets/{diagram-WEI45ONY-_YqiTaGP.js → diagram-WEI45ONY-DSZdyaAV.js} +1 -1
  99. package/web/assets/{document-Dgt5eZFj.js → document-Dc2dftTW.js} +3 -3
  100. package/web/assets/{ebnfDiagram-CCIWWBDH-JO-zQh6g.js → ebnfDiagram-CCIWWBDH-aTHmcUGy.js} +1 -1
  101. package/web/assets/{entities-C3wz7FCx.js → entities-CCUtpskY.js} +1 -1
  102. package/web/assets/{erDiagram-Q63AITRT-9UjQwJ4P.js → erDiagram-Q63AITRT-CUUPBcvo.js} +1 -1
  103. package/web/assets/{file-viewer-DZJ8nYnl.js → file-viewer-DJ3rsmef.js} +1 -1
  104. package/web/assets/{flowDiagram-23GEKE2U-Ca08tnYM.js → flowDiagram-23GEKE2U-aTQXx2Mh.js} +1 -1
  105. package/web/assets/{folder-image-BfGgxo7i.js → folder-image-Bnv43tzP.js} +1 -1
  106. package/web/assets/{folder-landing-qUKBCnG-.js → folder-landing-DCnzYXXY.js} +1 -1
  107. package/web/assets/{folder-list-BfFjv7rR.js → folder-list-DvVkVjiR.js} +1 -1
  108. package/web/assets/{folder-metadata-DCw8xzHk.js → folder-metadata-C9hMMzIH.js} +1 -1
  109. package/web/assets/{folder-mobile-bar-Ubz4babf.js → folder-mobile-bar-VoTL1GS0.js} +1 -1
  110. package/web/assets/folder-plugin-view-Cvd804ZU.js +6 -0
  111. package/web/assets/{ganttDiagram-NO4QXBWP-KnHzX5W3.js → ganttDiagram-NO4QXBWP-DiwdUp7u.js} +1 -1
  112. package/web/assets/{gitGraphDiagram-IHSO6WYX-Cm8woNtK.js → gitGraphDiagram-IHSO6WYX-BL2gG_IS.js} +1 -1
  113. package/web/assets/{index-CNyy98F8.js → index-CUTtMSyJ.js} +2 -2
  114. package/web/assets/index-CegvVQ1C.js +1 -0
  115. package/web/assets/index-Dwhf8F_U.css +1 -0
  116. package/web/assets/{infoDiagram-FWYZ7A6U-yyqmUtIb.js → infoDiagram-FWYZ7A6U-B3n0zZpt.js} +1 -1
  117. package/web/assets/{ishikawaDiagram-FXEZZL3T-BfvR_Zy4.js → ishikawaDiagram-FXEZZL3T-D7YytbEv.js} +1 -1
  118. package/web/assets/{journeyDiagram-5HDEW3XC-BKuw06HM.js → journeyDiagram-5HDEW3XC-BYwqEl3C.js} +1 -1
  119. package/web/assets/{kanban-definition-HUTT4EX6-n0010rmQ.js → kanban-definition-HUTT4EX6-BQHNJgXZ.js} +1 -1
  120. package/web/assets/{linear-C0d0lT8O.js → linear-BPiQCLNk.js} +1 -1
  121. package/web/assets/{mermaid.core-BDVbShyO.js → mermaid.core-CD-KvBjV.js} +4 -4
  122. package/web/assets/{metadata-KV0dpp4G.js → metadata-COJ7fZul.js} +1 -1
  123. package/web/assets/{mindmap-definition-LN4V7U3C--_0ks3GF.js → mindmap-definition-LN4V7U3C-C1L_gyoj.js} +1 -1
  124. package/web/assets/{pegDiagram-2B236MQR-CBoNIpKR.js → pegDiagram-2B236MQR-BDAfItqS.js} +1 -1
  125. package/web/assets/{pieDiagram-ENE6RG2P-MA5tkYh5.js → pieDiagram-ENE6RG2P-CkZYH3Vz.js} +1 -1
  126. package/web/assets/{popover-DBD7FF-W.js → popover-0oA2lLUV.js} +2 -2
  127. package/web/assets/{project-search-dialog-DM1IkSZu.js → project-search-dialog-B2oqMT6h.js} +1 -1
  128. package/web/assets/{quadrantDiagram-ABIIQ3AL-CWT1ryqF.js → quadrantDiagram-ABIIQ3AL-Dy8Al3YZ.js} +1 -1
  129. package/web/assets/{railroadDiagram-RFXS5EU6-ZiLB5FGi.js → railroadDiagram-RFXS5EU6-Dd9_yo7B.js} +1 -1
  130. package/web/assets/{requirementDiagram-TGXJPOKE-CQq9uneq.js → requirementDiagram-TGXJPOKE-DPhIUsbs.js} +1 -1
  131. package/web/assets/{sankeyDiagram-HTMAVEWB-qDG-0JqI.js → sankeyDiagram-HTMAVEWB-B2QkYtub.js} +1 -1
  132. package/web/assets/{search-DNrQA5fF.js → search-C1J0-xiB.js} +1 -1
  133. package/web/assets/select-CtXC_PLC.js +30 -0
  134. package/web/assets/{selection-popup-DmtTeRs2.js → selection-popup-qhlUFzGq.js} +1 -1
  135. package/web/assets/{sequenceDiagram-DBY2YBRQ-CiApurLO.js → sequenceDiagram-DBY2YBRQ-Bx7fcZDx.js} +1 -1
  136. package/web/assets/{sizeCapture-X5ZJPWSS-DZSR5QXm.js → sizeCapture-X5ZJPWSS-CIXIhl_A.js} +1 -1
  137. package/web/assets/{stateDiagram-2N3HPSRC-CjJJR9_z.js → stateDiagram-2N3HPSRC-DCrdAflB.js} +1 -1
  138. package/web/assets/stateDiagram-v2-6OUMAXLB-0KCFLYeQ.js +1 -0
  139. package/web/assets/{swimlanes-5IMT3BWC-CKmo1sg6.js → swimlanes-5IMT3BWC-DA2vc7iZ.js} +2 -2
  140. package/web/assets/swimlanesDiagram-G3AALYLV-CAw3AV84.js +8 -0
  141. package/web/assets/{timeline-definition-FHXFAJF6-D-NMwS3y.js → timeline-definition-FHXFAJF6-lKfJiV9V.js} +1 -1
  142. package/web/assets/{vennDiagram-L72KCM5P-CfL6LBWw.js → vennDiagram-L72KCM5P-DO1q2KzG.js} +1 -1
  143. package/web/assets/{view-context-gyDl_p2V.js → view-context-DXKM3-l1.js} +4 -4
  144. package/web/assets/{viewer-capabilities-Bpp8Uvcg.js → viewer-capabilities-Cig_xM9u.js} +1 -1
  145. package/web/assets/{wardleyDiagram-EHGQE667-DgldMxaj.js → wardleyDiagram-EHGQE667-Dal9LkuZ.js} +1 -1
  146. package/web/assets/{xychartDiagram-FW5EYKEG-CIoAIFX8.js → xychartDiagram-FW5EYKEG-B3dPLPII.js} +1 -1
  147. package/web/index.html +2 -2
  148. package/kernel/packages/api/test/partial-loading.test.ts +0 -43
  149. package/kernel/packages/folder-plugin/package.json +0 -50
  150. package/kernel/packages/folder-plugin/src/index.ts +0 -15
  151. package/kernel/packages/folder-plugin/tsconfig.json +0 -17
  152. package/kernel/plugins/calendar/SKILL.md +0 -173
  153. package/kernel/plugins/calendar/eslint.config.js +0 -10
  154. package/kernel/plugins/calendar/package.json +0 -73
  155. package/kernel/plugins/calendar/schema.json +0 -137
  156. package/kernel/plugins/calendar/src/calendar.tsx +0 -328
  157. package/kernel/plugins/calendar/src/client.tsx +0 -139
  158. package/kernel/plugins/calendar/src/context.ts +0 -48
  159. package/kernel/plugins/calendar/src/copy-button.tsx +0 -66
  160. package/kernel/plugins/calendar/src/event-dialog.tsx +0 -270
  161. package/kernel/plugins/calendar/src/index.ts +0 -4
  162. package/kernel/plugins/calendar/src/manifest.ts +0 -7
  163. package/kernel/plugins/calendar/src/parse.ts +0 -610
  164. package/kernel/plugins/calendar/src/server.ts +0 -160
  165. package/kernel/plugins/calendar/src/utils.ts +0 -80
  166. package/kernel/plugins/calendar/src/views.tsx +0 -418
  167. package/kernel/plugins/calendar/test/context.test.mjs +0 -60
  168. package/kernel/plugins/calendar/test/package.test.mjs +0 -43
  169. package/kernel/plugins/calendar/test/parse.test.mjs +0 -392
  170. package/kernel/plugins/calendar/test/server.test.mjs +0 -126
  171. package/kernel/plugins/calendar/tsconfig.json +0 -17
  172. package/kernel/plugins/mail/SKILL.md +0 -97
  173. package/kernel/plugins/mail/eslint.config.js +0 -10
  174. package/kernel/plugins/mail/src/api.ts +0 -359
  175. package/kernel/plugins/mail/src/bun-ffi.d.ts +0 -14
  176. package/kernel/plugins/mail/src/client.tsx +0 -14
  177. package/kernel/plugins/mail/src/flock.ts +0 -137
  178. package/kernel/plugins/mail/src/folders.ts +0 -37
  179. package/kernel/plugins/mail/src/history.ts +0 -485
  180. package/kernel/plugins/mail/src/index.ts +0 -3
  181. package/kernel/plugins/mail/src/mail-card.tsx +0 -123
  182. package/kernel/plugins/mail/src/mail-conversation.tsx +0 -153
  183. package/kernel/plugins/mail/src/mail-detail-page.tsx +0 -467
  184. package/kernel/plugins/mail/src/mail-hooks.ts +0 -252
  185. package/kernel/plugins/mail/src/mail-page.tsx +0 -109
  186. package/kernel/plugins/mail/src/mail-request.ts +0 -78
  187. package/kernel/plugins/mail/src/mail-send-box.tsx +0 -175
  188. package/kernel/plugins/mail/src/mailos.ts +0 -723
  189. package/kernel/plugins/mail/src/manifest.ts +0 -7
  190. package/kernel/plugins/mail/src/node.ts +0 -171
  191. package/kernel/plugins/mail/src/parse.ts +0 -139
  192. package/kernel/plugins/mail/src/server.ts +0 -125
  193. package/kernel/plugins/mail/src/types.ts +0 -10
  194. package/kernel/plugins/mail/src/viewer.tsx +0 -147
  195. package/kernel/plugins/mail/test/flock.test.mjs +0 -156
  196. package/kernel/plugins/mail/test/folders.test.mjs +0 -138
  197. package/kernel/plugins/mail/test/history.test.mjs +0 -460
  198. package/kernel/plugins/mail/test/mailos.test.mjs +0 -752
  199. package/kernel/plugins/mail/test/node.test.mjs +0 -207
  200. package/kernel/plugins/mail/test/package.test.mjs +0 -54
  201. package/kernel/plugins/mail/test/parse.test.mjs +0 -32
  202. package/kernel/plugins/mail/test/server.test.mjs +0 -116
  203. package/kernel/plugins/mail/test/viewer.test.mjs +0 -192
  204. package/kernel/plugins/mail/tsconfig.json +0 -17
  205. package/kernel/plugins/projects/SKILL.md +0 -73
  206. package/kernel/plugins/projects/eslint.config.js +0 -10
  207. package/kernel/plugins/projects/package.json +0 -70
  208. package/kernel/plugins/projects/src/client.tsx +0 -17
  209. package/kernel/plugins/projects/src/data/model.ts +0 -129
  210. package/kernel/plugins/projects/src/index.ts +0 -17
  211. package/kernel/plugins/projects/src/manifest.ts +0 -7
  212. package/kernel/plugins/projects/src/project-context.ts +0 -41
  213. package/kernel/plugins/projects/src/server.ts +0 -276
  214. package/kernel/plugins/projects/src/ui/project-card.tsx +0 -61
  215. package/kernel/plugins/projects/src/ui/projects-page.tsx +0 -102
  216. package/kernel/plugins/projects/test/package.test.mjs +0 -51
  217. package/kernel/plugins/tasks/SKILL.md +0 -341
  218. package/kernel/plugins/tasks/eslint.config.js +0 -10
  219. package/kernel/plugins/tasks/package.json +0 -74
  220. package/kernel/plugins/tasks/schema.json +0 -939
  221. package/kernel/plugins/tasks/src/api.ts +0 -212
  222. package/kernel/plugins/tasks/src/client.tsx +0 -23
  223. package/kernel/plugins/tasks/src/data/parse.ts +0 -544
  224. package/kernel/plugins/tasks/src/data/task-id.ts +0 -56
  225. package/kernel/plugins/tasks/src/data/todo-model.ts +0 -795
  226. package/kernel/plugins/tasks/src/index.ts +0 -34
  227. package/kernel/plugins/tasks/src/manifest.ts +0 -7
  228. package/kernel/plugins/tasks/src/pages/task-detail.tsx +0 -48
  229. package/kernel/plugins/tasks/src/pages/task-list.tsx +0 -88
  230. package/kernel/plugins/tasks/src/server.ts +0 -447
  231. package/kernel/plugins/tasks/src/styles.css +0 -9
  232. package/kernel/plugins/tasks/src/ui/compact-todo-list.tsx +0 -372
  233. package/kernel/plugins/tasks/src/ui/error-details.tsx +0 -78
  234. package/kernel/plugins/tasks/src/ui/task-page.tsx +0 -392
  235. package/kernel/plugins/tasks/src/ui/todo-agent-filter.tsx +0 -36
  236. package/kernel/plugins/tasks/src/ui/todo-filter-bar.tsx +0 -66
  237. package/kernel/plugins/tasks/src/ui/todo-item.tsx +0 -494
  238. package/kernel/plugins/tasks/src/ui/todo-status-filter.tsx +0 -60
  239. package/kernel/plugins/tasks/src/ui/todo-tag-filter.tsx +0 -48
  240. package/kernel/plugins/tasks/src/ui/todo-warnings.tsx +0 -106
  241. package/kernel/plugins/tasks/test/api.test.mjs +0 -99
  242. package/kernel/plugins/tasks/test/folder-sources.test.mjs +0 -46
  243. package/kernel/plugins/tasks/test/package.test.mjs +0 -54
  244. package/kernel/plugins/tasks/test/parse.test.mjs +0 -225
  245. package/kernel/plugins/tasks/test/server.test.mjs +0 -386
  246. package/kernel/plugins/tasks/tsconfig.json +0 -17
  247. package/web/assets/app-DoGr2Zi7.js +0 -2
  248. package/web/assets/channel-uMEjV8qc.js +0 -1
  249. package/web/assets/classDiagram-OUVF2IWQ-fbZocVor.js +0 -1
  250. package/web/assets/classDiagram-v2-EOCWNBFH-fbZocVor.js +0 -1
  251. package/web/assets/client-C6Nxdfif.js +0 -2
  252. package/web/assets/client-CXYfBko5.js +0 -17
  253. package/web/assets/client-CoKtOq-X.js +0 -7
  254. package/web/assets/client-DyRQz5RU.js +0 -53
  255. package/web/assets/client-OY6HUzuD.js +0 -98
  256. package/web/assets/client-YOYWZIFi.js +0 -34
  257. package/web/assets/command-BugZBGXE.js +0 -38
  258. package/web/assets/folder-plugin-view-DsWR1zmQ.js +0 -6
  259. package/web/assets/index-BaRnbYRw.js +0 -1
  260. package/web/assets/index-BexmLxIP.css +0 -1
  261. package/web/assets/index-DDirZMgx.js +0 -1
  262. package/web/assets/note-card-DBfX6gW1.js +0 -6
  263. package/web/assets/select-D8cqNgcp.js +0 -30
  264. package/web/assets/stateDiagram-v2-6OUMAXLB-BpeGSCu9.js +0 -1
  265. package/web/assets/swimlanesDiagram-G3AALYLV-D9RjLKb9.js +0 -8
  266. package/web/assets/use-folder-filter-LQyXns5Q.js +0 -1
  267. /package/kernel/packages/{folder-plugin → plugins}/eslint.config.js +0 -0
  268. /package/kernel/packages/{folder-plugin → plugins}/src/client.ts +0 -0
  269. /package/kernel/packages/{folder-plugin → plugins}/src/endpoint.ts +0 -0
  270. /package/kernel/packages/{folder-plugin → plugins}/src/server.ts +0 -0
  271. /package/kernel/packages/{folder-plugin → plugins}/src/subpath.ts +0 -0
  272. /package/kernel/packages/{folder-plugin → plugins}/src/types.ts +0 -0
  273. /package/kernel/packages/{folder-plugin → plugins}/src/validation.ts +0 -0
  274. /package/kernel/packages/{folder-plugin → plugins}/test/contract.test.mjs +0 -0
@@ -313,6 +313,7 @@ export async function viewer(input) {
313
313
  }
314
314
  process.env.KENNEL_KERNEL_KEY = kernel.key;
315
315
  process.env.KENNEL_EXTERNAL_SERVER_ENTRIES = JSON.stringify(kernel.serverEntries);
316
+ process.env.KENNEL_EXTERNAL_API_ENTRIES = JSON.stringify(kernel.apiEntries);
316
317
  const api = createKennelApi({
317
318
  root: options.root,
318
319
  host: options.host,
@@ -6,7 +6,7 @@
6
6
  "prettier": "@raggle-ai/prettier-config",
7
7
  "scripts": {
8
8
  "build": "node scripts/build.mjs",
9
- "dev": "vite dev",
9
+ "dev": "node scripts/dev.mjs",
10
10
  "typecheck": "tsc --noEmit",
11
11
  "format": "prettier . --check --cache --cache-location .cache/.prettiercache --ignore-path ../../.prettierignore",
12
12
  "format:fix": "prettier . --write --cache --cache-location .cache/.prettiercache --ignore-path ../../.prettierignore",
@@ -23,19 +23,15 @@
23
23
  "@lexical/react": "0.49.0",
24
24
  "@lexical/rich-text": "0.49.0",
25
25
  "@raggle-ai/agents": "workspace:*",
26
- "@raggle-ai/calendar": "workspace:*",
27
- "@raggle-ai/folder-plugin": "workspace:*",
26
+ "kennel-plugins": "workspace:*",
28
27
  "@raggle-ai/kennel-api": "workspace:*",
29
28
  "@raggle-ai/kennel-preview": "workspace:*",
30
29
  "@raggle-ai/local": "0.14.0",
31
- "@raggle-ai/mail": "workspace:*",
32
30
  "@raggle-ai/markdown": "workspace:*",
33
31
  "@raggle-ai/notes": "workspace:*",
34
- "@raggle-ai/projects": "workspace:*",
35
32
  "@raggle-ai/schemas": "workspace:*",
36
33
  "@raggle-ai/scout-ui": "0.1.3",
37
34
  "@raggle-ai/session-finding": "workspace:*",
38
- "@raggle-ai/tasks": "workspace:*",
39
35
  "@raggle-ai/ui": "workspace:*",
40
36
  "@tanstack/react-query": "catalog:tanstack",
41
37
  "@tanstack/react-router": "catalog:tanstack",
@@ -0,0 +1,53 @@
1
+ import { spawn } from "node:child_process"
2
+ import { mkdtemp, rm } from "node:fs/promises"
3
+ import { tmpdir } from "node:os"
4
+ import { dirname, join, resolve } from "node:path"
5
+ import { fileURLToPath } from "node:url"
6
+
7
+ import {
8
+ prepareExternalPluginModules,
9
+ readExternalPlugins,
10
+ } from "../../../cli/src/plugins/external.ts"
11
+
12
+ const workspace = resolve(import.meta.dirname, "../../..")
13
+ const temp = await mkdtemp(join(tmpdir(), "kennel-web-dev-"))
14
+ try {
15
+ const plugins = readExternalPlugins()
16
+ const modules = await prepareExternalPluginModules(temp, temp, plugins)
17
+ const args = process.argv.slice(2).filter((arg) => arg !== "--")
18
+ const child = spawn(
19
+ process.execPath,
20
+ [
21
+ resolve(
22
+ dirname(fileURLToPath(import.meta.resolve("vite/package.json"))),
23
+ "bin/vite.js",
24
+ ),
25
+ "dev",
26
+ ...args,
27
+ ],
28
+ {
29
+ cwd: resolve(workspace, "apps/web"),
30
+ stdio: "inherit",
31
+ env: {
32
+ ...process.env,
33
+ KENNEL_KERNEL_SOURCE_ROOT: workspace,
34
+ KENNEL_HOST_NODE_MODULES: resolve(workspace, "cli/node_modules"),
35
+ KENNEL_EXTERNAL_CLIENT_MODULE: modules.clientModule,
36
+ KENNEL_EXTERNAL_SERVER_ENTRIES: JSON.stringify(modules.serverEntries),
37
+ KENNEL_EXTERNAL_API_ENTRIES: JSON.stringify(modules.apiEntries),
38
+ KENNEL_EXTERNAL_SOURCE_ROOTS: JSON.stringify(
39
+ plugins.map((plugin) => dirname(plugin.entries.client)),
40
+ ),
41
+ },
42
+ },
43
+ )
44
+ for (const signal of ["SIGINT", "SIGTERM"]) {
45
+ process.on(signal, () => child.kill(signal))
46
+ }
47
+ process.exitCode = await new Promise((resolve, reject) => {
48
+ child.once("error", reject)
49
+ child.once("exit", (code) => resolve(code ?? 1))
50
+ })
51
+ } finally {
52
+ await rm(temp, { recursive: true, force: true })
53
+ }
@@ -1,9 +1,6 @@
1
1
  @import "tailwindcss";
2
2
  @source "../../../packages/agents/src";
3
3
  @source "../../../packages/ui/src";
4
- @source "../../../plugins/calendar/src";
5
- @source "../../../plugins/mail/src";
6
- @source "../../../plugins/tasks/src";
7
4
  @source "./";
8
5
 
9
6
  @theme {
@@ -1,3 +1,3 @@
1
- import type { FolderPluginClient } from "@raggle-ai/folder-plugin/client"
1
+ import type { FolderPluginClient } from "kennel-plugins/client"
2
2
 
3
3
  export const externalFolderPlugins: FolderPluginClient[] = []
@@ -2,7 +2,7 @@ import type { ReactNode } from "react"
2
2
  import { useQuery } from "@tanstack/react-query"
3
3
  import { api } from "~/api-client"
4
4
 
5
- import { folderPathId } from "@raggle-ai/folder-plugin/client"
5
+ import { folderPathId } from "kennel-plugins/client"
6
6
  import { FolderFilterIconProvider } from "@raggle-ai/ui/components/folder-filter-bar"
7
7
  import { FolderImage } from "@raggle-ai/ui/components/folder-image"
8
8
 
@@ -1,7 +1,7 @@
1
1
  import { useParams } from "@tanstack/react-router"
2
2
  import { api } from "~/api-client"
3
3
 
4
- import type { FolderPluginViewProps } from "@raggle-ai/folder-plugin/client"
4
+ import type { FolderPluginViewProps } from "kennel-plugins/client"
5
5
 
6
6
  import { FolderFilterMetadataProvider } from "./folder-filter-icons"
7
7
  import { getFolderPlugin } from "./plugins"
@@ -1,7 +1,6 @@
1
1
  import "@raggle-ai/markdown/styles.css"
2
2
  import "@raggle-ai/markdown/explorer.css"
3
3
  import "@raggle-ai/ui/folder-activity.css"
4
- import "@raggle-ai/tasks/todo-model/styles.css"
5
4
  import "./app.css"
6
5
 
7
6
  import { StrictMode } from "react"
@@ -1,29 +1,12 @@
1
1
  import { lazy } from "react"
2
2
  import { externalFolderPlugins } from "@/external-plugins"
3
3
 
4
- import type { FolderPluginClient } from "@raggle-ai/folder-plugin/client"
4
+ import type { FolderPluginClient } from "kennel-plugins/client"
5
5
  import { agentsManifest } from "@raggle-ai/agents/manifest"
6
- import { calendarManifest } from "@raggle-ai/calendar/manifest"
7
- import { mailManifest } from "@raggle-ai/mail/manifest"
8
- import { projectsManifest } from "@raggle-ai/projects/manifest"
9
- import { tasksManifest } from "@raggle-ai/tasks/manifest"
10
6
 
11
7
  // Keep navigation metadata cheap. Import only the selected plugin's UI;
12
8
  // never construct an import path from an untrusted URL segment.
13
9
  export const folderPlugins: FolderPluginClient[] = [
14
- {
15
- ...calendarManifest,
16
- component: lazy(async () => ({
17
- default: (await import("@raggle-ai/calendar/client")).calendarClient
18
- .component,
19
- })),
20
- },
21
- {
22
- ...mailManifest,
23
- component: lazy(async () => ({
24
- default: (await import("@raggle-ai/mail/client")).mailClient.component,
25
- })),
26
- },
27
10
  {
28
11
  ...agentsManifest,
29
12
  component: lazy(async () => ({
@@ -31,19 +14,6 @@ export const folderPlugins: FolderPluginClient[] = [
31
14
  .component,
32
15
  })),
33
16
  },
34
- {
35
- ...tasksManifest,
36
- component: lazy(async () => ({
37
- default: (await import("@raggle-ai/tasks/client")).tasksClient.component,
38
- })),
39
- },
40
- {
41
- ...projectsManifest,
42
- component: lazy(async () => ({
43
- default: (await import("@raggle-ai/projects/client")).projectsClient
44
- .component,
45
- })),
46
- },
47
17
  ...externalFolderPlugins,
48
18
  ]
49
19
 
@@ -6,8 +6,7 @@
6
6
  "src/**/*.ts",
7
7
  "src/**/*.tsx",
8
8
  "test/**/*.test.ts",
9
- "vite.config.ts",
10
- "../../plugins/mail/src/bun-ffi.d.ts"
9
+ "vite.config.ts"
11
10
  ],
12
11
  "compilerOptions": {
13
12
  "baseUrl": ".",
@@ -15,17 +15,32 @@ const workspace = resolve(
15
15
  process.env.KENNEL_KERNEL_SOURCE_ROOT || resolve(root, "../.."),
16
16
  )
17
17
  const require = createRequire(import.meta.url)
18
+ const hostNodeModules = process.env.KENNEL_HOST_NODE_MODULES
19
+ const packageNameOf = (name: string) => {
20
+ const [scopeOrName, packageName] = name.split("/")
21
+ return name.startsWith("@") && packageName
22
+ ? `${scopeOrName}/${packageName}`
23
+ : (scopeOrName ?? name)
24
+ }
25
+ const hostPackagePath = (name: string, entry = "package.json") =>
26
+ hostNodeModules
27
+ ? resolve(hostNodeModules, packageNameOf(name), entry)
28
+ : undefined
18
29
  const packageDir = (name: string): string | undefined => {
30
+ const hostPath = hostPackagePath(name)
31
+ if (hostPath && existsSync(hostPath)) return dirname(hostPath)
19
32
  try {
20
- const packageName = name.startsWith("@")
21
- ? name.split("/").slice(0, 2).join("/")
22
- : name.split("/")[0]
33
+ const packageName = packageNameOf(name)
23
34
  return dirname(require.resolve(`${packageName}/package.json`))
24
35
  } catch {
25
36
  return undefined
26
37
  }
27
38
  }
28
39
  const packageEntry = (name: string): string | undefined => {
40
+ const packageName = packageNameOf(name)
41
+ const entry = name.slice(packageName.length).replace(/^\//, "")
42
+ const hostPath = hostPackagePath(name, entry)
43
+ if (hostPath && existsSync(hostPath)) return hostPath
29
44
  try {
30
45
  return require.resolve(name)
31
46
  } catch {
@@ -59,22 +74,21 @@ const resolveBarkdown = (): string | undefined => {
59
74
  const barkdown = resolveBarkdown()
60
75
  const internalPackages: Array<[RegExp, string]> = [
61
76
  [/^@raggle-ai\/agents(\/.*)?$/, "packages/agents/src"],
62
- [/^@raggle-ai\/calendar(\/.*)?$/, "plugins/calendar/src"],
63
- [/^@raggle-ai\/folder-plugin(\/.*)?$/, "packages/folder-plugin/src"],
77
+ [/^kennel-plugins(\/.*)?$/, "packages/plugins/src"],
64
78
  [/^@raggle-ai\/kennel-api(\/.*)?$/, "packages/api/src"],
65
- [/^@raggle-ai\/mail(\/.*)?$/, "plugins/mail/src"],
66
79
  [/^@raggle-ai\/markdown(\/.*)?$/, "packages/markdown/src"],
67
80
  [/^@raggle-ai\/notes(\/.*)?$/, "packages/notes/src"],
68
- [/^@raggle-ai\/projects(\/.*)?$/, "plugins/projects/src"],
69
81
  [/^@raggle-ai\/schemas(\/.*)?$/, "packages/schemas/src"],
70
82
  [/^@raggle-ai\/session-finding(\/.*)?$/, "packages/session-finding/src"],
71
- [/^@raggle-ai\/tasks(\/.*)?$/, "plugins/tasks/src"],
72
83
  [/^@raggle-ai\/ui(\/.*)?$/, "packages/ui/src"],
73
84
  [/^kennel-client(\/.*)?$/, "packages/api-client/src"],
74
85
  ]
75
86
  const hostPackageNames = [
87
+ "@raggle-ai/barkdown",
76
88
  "@tanstack/react-query",
77
89
  "@tanstack/react-router",
90
+ "date-fns",
91
+ "effect",
78
92
  "lucide-react",
79
93
  "react",
80
94
  "react-dom",
@@ -95,6 +109,14 @@ const hostPackageAliases = hostPackageNames.flatMap((name) => {
95
109
  const hostPackageRoots = hostPackageNames
96
110
  .map(packageDir)
97
111
  .filter((path): path is string => Boolean(path))
112
+ const externalSourceRoots: string[] = JSON.parse(
113
+ process.env.KENNEL_EXTERNAL_SOURCE_ROOTS || "[]",
114
+ )
115
+ const externalClientModule = process.env.KENNEL_EXTERNAL_CLIENT_MODULE
116
+ const externalRoots = [
117
+ ...externalSourceRoots,
118
+ ...(externalClientModule ? [dirname(externalClientModule)] : []),
119
+ ]
98
120
  const aliases: AliasOptions = [
99
121
  ...(process.env.KENNEL_EXTERNAL_CLIENT_MODULE
100
122
  ? [
@@ -114,10 +136,6 @@ const aliases: AliasOptions = [
114
136
  find: /^@raggle-ai\/markdown\/explorer\.css$/,
115
137
  replacement: resolve(workspace, "packages/markdown/explorer.css"),
116
138
  },
117
- {
118
- find: /^@raggle-ai\/tasks\/todo-model\/styles\.css$/,
119
- replacement: resolve(workspace, "plugins/tasks/src/styles.css"),
120
- },
121
139
  {
122
140
  find: /^@raggle-ai\/ui\/folder-activity\.css$/,
123
141
  replacement: resolve(
@@ -230,8 +248,8 @@ export default defineConfig({
230
248
  ],
231
249
  fs: {
232
250
  allow: barkdown
233
- ? [workspace, barkdown, ...hostPackageRoots]
234
- : [workspace, ...hostPackageRoots],
251
+ ? [workspace, barkdown, ...hostPackageRoots, ...externalRoots]
252
+ : [workspace, ...hostPackageRoots, ...externalRoots],
235
253
  },
236
254
  // Warm the biggest cold-transform graphs (measured ~1–5 s each on first
237
255
  // request, stacking into the long first load / first HMR after a server
@@ -41,7 +41,7 @@
41
41
  "publish:public:dry-run": "npm --@raggle-ai:registry=https://registry.npmjs.org publish --dry-run --access public --registry=https://registry.npmjs.org"
42
42
  },
43
43
  "dependencies": {
44
- "@raggle-ai/folder-plugin": "workspace:*",
44
+ "kennel-plugins": "workspace:*",
45
45
  "@raggle-ai/markdown": "workspace:*",
46
46
  "@raggle-ai/ui": "workspace:*",
47
47
  "@tanstack/react-query": "catalog:tanstack",
@@ -2,7 +2,7 @@ import type { ReactNode } from "react"
2
2
  import { useMemo, useState } from "react"
3
3
  import { FilePlus2, LoaderCircle, Pencil } from "lucide-react"
4
4
 
5
- import type { FolderPluginHostActions } from "@raggle-ai/folder-plugin/client"
5
+ import type { FolderPluginHostActions } from "kennel-plugins/client"
6
6
  import { BarkdownMarkdown, markdownMetadata } from "@raggle-ai/markdown"
7
7
  import { FolderContextIcon } from "@raggle-ai/ui/components/folder-filter-bar"
8
8
  import {
@@ -1,4 +1,4 @@
1
- import type { FolderPluginViewProps } from "@raggle-ai/folder-plugin/client"
1
+ import type { FolderPluginViewProps } from "kennel-plugins/client"
2
2
 
3
3
  import { agentsManifest } from "./manifest.ts"
4
4
  import { AgentsPluginView } from "./viewer.tsx"
@@ -1,4 +1,4 @@
1
- import type { FolderPluginManifest } from "@raggle-ai/folder-plugin"
1
+ import type { FolderPluginManifest } from "kennel-plugins"
2
2
 
3
3
  /** Stable Agents plugin identity and navigation label. No side effects. */
4
4
  export const agentsManifest: FolderPluginManifest = {
@@ -2,7 +2,7 @@ import type {
2
2
  FolderPluginContext,
3
3
  FolderPluginData,
4
4
  FolderPluginDetection,
5
- } from "@raggle-ai/folder-plugin/server"
5
+ } from "kennel-plugins/server"
6
6
 
7
7
  import type { AgentsResolution, ClientFilter } from "./types.ts"
8
8
  import { agentsManifest } from "./manifest.ts"
@@ -2,7 +2,7 @@ import { useMemo, useRef, useState } from "react"
2
2
  import { useQuery } from "@tanstack/react-query"
3
3
  import { ChevronDown, Info, TriangleAlert } from "lucide-react"
4
4
 
5
- import type { FolderPluginViewProps } from "@raggle-ai/folder-plugin/client"
5
+ import type { FolderPluginViewProps } from "kennel-plugins/client"
6
6
  import {
7
7
  Collapsible,
8
8
  CollapsibleContent,
@@ -19,17 +19,13 @@
19
19
  "dependencies": {
20
20
  "@agentclientprotocol/sdk": "^1.3.0",
21
21
  "@raggle-ai/agents": "workspace:*",
22
- "@raggle-ai/calendar": "workspace:*",
23
- "@raggle-ai/folder-plugin": "workspace:*",
22
+ "kennel-plugins": "workspace:*",
24
23
  "@raggle-ai/kennel-kinds": "workspace:*",
25
24
  "@raggle-ai/local": "0.14.0",
26
- "@raggle-ai/mail": "workspace:*",
27
25
  "@raggle-ai/markdown": "workspace:*",
28
26
  "@raggle-ai/notes": "workspace:*",
29
- "@raggle-ai/projects": "workspace:*",
30
27
  "@raggle-ai/schemas": "workspace:*",
31
28
  "@raggle-ai/session-finding": "workspace:*",
32
- "@raggle-ai/tasks": "workspace:*",
33
29
  "@raggle-ai/ui": "workspace:*",
34
30
  "yaml": "^2.9.0",
35
31
  "zod": "catalog:"
@@ -10,7 +10,7 @@ import { Readable, Writable } from "node:stream";
10
10
  import type { IncomingMessage, ServerResponse } from "node:http";
11
11
  import type { ApiHost } from "./host";
12
12
 
13
- import { sameOrigin } from "@raggle-ai/folder-plugin/endpoint";
13
+ import { sameOrigin } from "kennel-plugins/endpoint";
14
14
  import localSessions from "@raggle-ai/local/sessions";
15
15
 
16
16
  import type { AcpTransport } from "./acp/transport";
@@ -1,8 +1,8 @@
1
1
  import { writeFile } from "node:fs/promises";
2
2
  import { resolve } from "node:path";
3
3
 
4
- import type { ApiRouteSpec } from "@raggle-ai/folder-plugin/endpoint";
5
- import { apiError, jsonResponse } from "@raggle-ai/folder-plugin/endpoint";
4
+ import type { ApiRouteSpec } from "kennel-plugins/endpoint";
5
+ import { apiError, jsonResponse } from "kennel-plugins/endpoint";
6
6
 
7
7
  export type CreateAgentFileContext = {
8
8
  /**
@@ -17,13 +17,13 @@ import {
17
17
  sep,
18
18
  } from "node:path";
19
19
 
20
- import type { ApiRouteSpec } from "@raggle-ai/folder-plugin/endpoint";
20
+ import type { ApiRouteSpec } from "kennel-plugins/endpoint";
21
21
  import { replaceSelection } from "../../shared/selection";
22
22
  import {
23
23
  apiError,
24
24
  jsonResponse,
25
25
  parseJsonBody,
26
- } from "@raggle-ai/folder-plugin/endpoint";
26
+ } from "kennel-plugins/endpoint";
27
27
 
28
28
  const pending = new Map<string, Promise<unknown>>();
29
29
 
@@ -1,7 +1,7 @@
1
1
  import { execFile } from "node:child_process";
2
2
 
3
- import type { ApiRouteSpec } from "@raggle-ai/folder-plugin/endpoint";
4
- import { apiError } from "@raggle-ai/folder-plugin/endpoint";
3
+ import type { ApiRouteSpec } from "kennel-plugins/endpoint";
4
+ import { apiError } from "kennel-plugins/endpoint";
5
5
 
6
6
  export type OpenPathContext = {
7
7
  /**
@@ -17,20 +17,17 @@ import type { ApiHost } from "./host";
17
17
  import { markdownMetadata } from "@raggle-ai/markdown";
18
18
  import { readFolder } from "@raggle-ai/markdown/node";
19
19
  import { execFile } from "node:child_process";
20
- import { sameOrigin } from "@raggle-ai/folder-plugin/endpoint";
20
+ import { sameOrigin } from "kennel-plugins/endpoint";
21
21
  import { parse as parseYaml } from "yaml";
22
22
 
23
- import type { FolderPluginServer } from "@raggle-ai/folder-plugin/server";
23
+ import type { FolderPluginServer } from "kennel-plugins/server";
24
24
  import type { LocalMarkdownFileSummary, LocalProject } from "@raggle-ai/local";
25
- import type { MailApiContext, MailPreviewer } from "@raggle-ai/mail/api";
26
25
  import type { FolderSkill } from "@raggle-ai/ui/lib/folder-activity";
27
- import { runApiRoute } from "@raggle-ai/folder-plugin/endpoint";
28
- import { FolderPluginFailure } from "@raggle-ai/folder-plugin/server";
26
+ import { runApiRoute } from "kennel-plugins/endpoint";
27
+ import { FolderPluginFailure } from "kennel-plugins/server";
29
28
  import { folderWorkspace } from "@raggle-ai/schemas/workspace";
30
29
  import { createSchemaCollectionServer } from "@raggle-ai/schemas/server";
31
30
  import local from "@raggle-ai/local";
32
- import { handleMailApiRoutes } from "@raggle-ai/mail/api";
33
- import { handleTasksApiRoutes } from "@raggle-ai/tasks/api";
34
31
  import {
35
32
  listFolderSessions,
36
33
  readSessionTranscript,
@@ -45,6 +42,7 @@ import { folderIcon, workspaceBreadcrumbIcons } from "./folder-icons.js";
45
42
  import { faviconService } from "@raggle-ai/schemas/favicon";
46
43
  import {
47
44
  configuredFolderServerRegistry,
45
+ externalApiHandlers,
48
46
  folderServerRegistryAsync,
49
47
  type FolderPluginRegistryConfig,
50
48
  } from "./plugins.js";
@@ -137,17 +135,6 @@ export type FolderMetadataPluginOptions = {
137
135
  restrictToRoot?: boolean;
138
136
  root: string;
139
137
  sessionFinding?: SessionFinding;
140
- mailPreviewer?: MailPreviewer;
141
- /**
142
- * Inject a MailOS service (tests only). Defaults to a real subprocess
143
- * service resolved from PATH.
144
- */
145
- mailos?: MailApiContext["mailos"];
146
- /**
147
- * Override MailOS mail directory. Intended for tests.
148
- * Defaults to ~/.email/drafts.
149
- */
150
- mailDir?: string;
151
138
  /** Override the home directory used for Agent global files. Intended for tests. */
152
139
  agentsHomeDir?: string;
153
140
  /** Override isolated linked-project discovery, for tests. */
@@ -774,7 +761,7 @@ function pluginConfigWarnings(
774
761
  const ids = unique([...config.plugins.disable, ...config.plugins.order]);
775
762
  return ids
776
763
  .filter((id) => !registry.has(id))
777
- .map((id) => `unknown plugin id "${id}" — not bundled in this build`);
764
+ .map((id) => `unknown plugin id "${id}" — not installed in this build`);
778
765
  }
779
766
 
780
767
  async function pluginAvailability(
@@ -824,9 +811,6 @@ export function createFolderApi({
824
811
  restrictToRoot = false,
825
812
  root,
826
813
  sessionFinding,
827
- mailPreviewer,
828
- mailDir,
829
- mailos,
830
814
  agentsHomeDir,
831
815
  linkedFolderLoader,
832
816
  remoteAccess = false,
@@ -839,10 +823,9 @@ export function createFolderApi({
839
823
  readSessionTranscript,
840
824
  };
841
825
  const basePlugins = folderServerRegistryAsync({
842
- mailDir,
843
- previewer: mailPreviewer,
844
826
  agentsHomeDir,
845
827
  });
828
+ const baseExternalApiHandlers = externalApiHandlers();
846
829
  const assetFiles = new Map<
847
830
  string,
848
831
  { mediaType: IconAsset["mediaType"]; path: string }
@@ -1447,24 +1430,16 @@ export function createFolderApi({
1447
1430
  }
1448
1431
  return;
1449
1432
  }
1450
- if (
1451
- await handleMailApiRoutes(request, response, {
1452
- authorizeFolder: (value) => folderPath(value, root, lockedRoot),
1453
- mailDir,
1454
- mailos,
1455
- mailPreviewer,
1456
- watch,
1457
- })
1458
- )
1459
- return;
1460
- if (
1461
- await handleTasksApiRoutes(request, response, {
1462
- authorizeFolder: (value) => folderPath(value, root, lockedRoot),
1463
- readOnly: remote,
1464
- watch,
1465
- })
1466
- )
1467
- return;
1433
+ for (const handler of await baseExternalApiHandlers) {
1434
+ if (
1435
+ await handler(request, response, {
1436
+ authorizeFolder: (value) => folderPath(value, root, lockedRoot),
1437
+ readOnly: remote,
1438
+ watch,
1439
+ })
1440
+ )
1441
+ return;
1442
+ }
1468
1443
  if (url.pathname === "/api/create-agent-file") {
1469
1444
  if (remote) {
1470
1445
  response.writeHead(403, {
@@ -50,7 +50,6 @@ export function createKennelApi(options: KennelApiOptions) {
50
50
  },
51
51
  };
52
52
  const folder = createFolderApi({
53
- mailDir: process.env.KENNEL_MAIL_DIR || undefined,
54
53
  ...options,
55
54
  remoteAccess: remote,
56
55
  });