@inharness-ai/claude4spec 1.0.21 → 1.0.22

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 (241) hide show
  1. package/.claude/skills/c4s-brief-implementer/SKILL.md +120 -53
  2. package/CHANGELOG.md +13 -0
  3. package/dist/bin/c4s/commands/agent.d.ts +18 -0
  4. package/dist/bin/c4s/commands/agent.js +102 -0
  5. package/dist/bin/c4s/commands/agent.js.map +1 -0
  6. package/dist/bin/c4s/commands/ask.d.ts +9 -8
  7. package/dist/bin/c4s/commands/ask.js +23 -31
  8. package/dist/bin/c4s/commands/ask.js.map +1 -1
  9. package/dist/bin/c4s/commands/catalog.d.ts +1 -1
  10. package/dist/bin/c4s/commands/catalog.js +2 -2
  11. package/dist/bin/c4s/commands/catalog.js.map +1 -1
  12. package/dist/bin/c4s/commands/describe.d.ts +1 -1
  13. package/dist/bin/c4s/commands/describe.js +2 -2
  14. package/dist/bin/c4s/commands/describe.js.map +1 -1
  15. package/dist/bin/c4s/commands/detail.d.ts +1 -1
  16. package/dist/bin/c4s/commands/detail.js +2 -2
  17. package/dist/bin/c4s/commands/detail.js.map +1 -1
  18. package/dist/bin/c4s/commands/element-list.d.ts +1 -1
  19. package/dist/bin/c4s/commands/element-list.js +2 -2
  20. package/dist/bin/c4s/commands/element-list.js.map +1 -1
  21. package/dist/bin/c4s/commands/find-references.js +1 -1
  22. package/dist/bin/c4s/commands/find-references.js.map +1 -1
  23. package/dist/bin/c4s/commands/inline-mention.d.ts +1 -1
  24. package/dist/bin/c4s/commands/inline-mention.js +2 -2
  25. package/dist/bin/c4s/commands/inline-mention.js.map +1 -1
  26. package/dist/bin/c4s/commands/list-slugs.d.ts +1 -1
  27. package/dist/bin/c4s/commands/list-slugs.js +2 -2
  28. package/dist/bin/c4s/commands/list-slugs.js.map +1 -1
  29. package/dist/bin/c4s/commands/list-tags.d.ts +1 -1
  30. package/dist/bin/c4s/commands/list-tags.js +2 -2
  31. package/dist/bin/c4s/commands/list-tags.js.map +1 -1
  32. package/dist/bin/c4s/commands/plugins.d.ts +9 -0
  33. package/dist/bin/c4s/commands/plugins.js +81 -0
  34. package/dist/bin/c4s/commands/plugins.js.map +1 -0
  35. package/dist/bin/c4s/commands/resolve.d.ts +1 -1
  36. package/dist/bin/c4s/commands/resolve.js +2 -2
  37. package/dist/bin/c4s/commands/resolve.js.map +1 -1
  38. package/dist/bin/c4s/commands/single-element.d.ts +1 -1
  39. package/dist/bin/c4s/commands/single-element.js +2 -2
  40. package/dist/bin/c4s/commands/single-element.js.map +1 -1
  41. package/dist/bin/c4s/commands/tagged-list-mixed.d.ts +1 -1
  42. package/dist/bin/c4s/commands/tagged-list-mixed.js +2 -2
  43. package/dist/bin/c4s/commands/tagged-list-mixed.js.map +1 -1
  44. package/dist/bin/c4s/commands/tagged-list.d.ts +1 -1
  45. package/dist/bin/c4s/commands/tagged-list.js +2 -2
  46. package/dist/bin/c4s/commands/tagged-list.js.map +1 -1
  47. package/dist/bin/c4s/context.d.ts +3 -3
  48. package/dist/bin/c4s/context.js +7 -4
  49. package/dist/bin/c4s/context.js.map +1 -1
  50. package/dist/bin/c4s/errors.d.ts +1 -1
  51. package/dist/bin/c4s/errors.js.map +1 -1
  52. package/dist/bin/c4s-mcp.js +6 -2
  53. package/dist/bin/c4s-mcp.js.map +1 -1
  54. package/dist/bin/c4s.js +19 -4
  55. package/dist/bin/c4s.js.map +1 -1
  56. package/dist/bin/gitignore.js +7 -11
  57. package/dist/bin/gitignore.js.map +1 -1
  58. package/dist/client/assets/{arc-Coa9fbDO.js → arc-C9oTB3b1.js} +1 -1
  59. package/dist/client/assets/{architectureDiagram-3BPJPVTR-VJZcRMEN.js → architectureDiagram-3BPJPVTR-Bno5ViqK.js} +1 -1
  60. package/dist/client/assets/{blockDiagram-GPEHLZMM-C7dU2lW1.js → blockDiagram-GPEHLZMM-CJYBoeWQ.js} +1 -1
  61. package/dist/client/assets/{c4Diagram-AAUBKEIU-CG_BBm_5.js → c4Diagram-AAUBKEIU-DaaqWE6s.js} +1 -1
  62. package/dist/client/assets/channel-Cei_E79M.js +1 -0
  63. package/dist/client/assets/{chunk-2J33WTMH-BnS95YpK.js → chunk-2J33WTMH-P_I0OPMy.js} +1 -1
  64. package/dist/client/assets/{chunk-4BX2VUAB-COr8w3X3.js → chunk-4BX2VUAB-CCySMlh5.js} +1 -1
  65. package/dist/client/assets/{chunk-55IACEB6-CxrIbZhB.js → chunk-55IACEB6-CEUyqKGF.js} +1 -1
  66. package/dist/client/assets/{chunk-727SXJPM-DRchPPRe.js → chunk-727SXJPM-CoTSYOVz.js} +1 -1
  67. package/dist/client/assets/{chunk-AQP2D5EJ-_SfN7mED.js → chunk-AQP2D5EJ-DB0nMxPr.js} +1 -1
  68. package/dist/client/assets/{chunk-FMBD7UC4-p2tIiP1D.js → chunk-FMBD7UC4-PG3m6-_a.js} +1 -1
  69. package/dist/client/assets/{chunk-ND2GUHAM-B1mbl2hP.js → chunk-ND2GUHAM-CBNk6IaV.js} +1 -1
  70. package/dist/client/assets/{chunk-QZHKN3VN-DBUpeqvS.js → chunk-QZHKN3VN-CLFa0WvN.js} +1 -1
  71. package/dist/client/assets/classDiagram-4FO5ZUOK-DUe_fAto.js +1 -0
  72. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DUe_fAto.js +1 -0
  73. package/dist/client/assets/{cose-bilkent-S5V4N54A-BBsY5aKD.js → cose-bilkent-S5V4N54A-BDwDDxHN.js} +1 -1
  74. package/dist/client/assets/{dagre-BM42HDAG-b-vu4RC9.js → dagre-BM42HDAG-DR-1e8N5.js} +1 -1
  75. package/dist/client/assets/{diagram-2AECGRRQ-j-DW9qSf.js → diagram-2AECGRRQ-C-tHgBWt.js} +1 -1
  76. package/dist/client/assets/{diagram-5GNKFQAL-DHX_WYWQ.js → diagram-5GNKFQAL-uLmoKaJL.js} +1 -1
  77. package/dist/client/assets/{diagram-KO2AKTUF-DxdQok_M.js → diagram-KO2AKTUF-8Fd-xuOy.js} +1 -1
  78. package/dist/client/assets/{diagram-LMA3HP47-BbTIX5c1.js → diagram-LMA3HP47-C1gniWsn.js} +1 -1
  79. package/dist/client/assets/{diagram-OG6HWLK6-BQ9ODAlH.js → diagram-OG6HWLK6-BMWjZbeC.js} +1 -1
  80. package/dist/client/assets/{erDiagram-TEJ5UH35-6lwAL1y9.js → erDiagram-TEJ5UH35-CIUO8hrR.js} +1 -1
  81. package/dist/client/assets/{flowDiagram-I6XJVG4X-ioSHb5-t.js → flowDiagram-I6XJVG4X-Ccw5YEf3.js} +1 -1
  82. package/dist/client/assets/{ganttDiagram-6RSMTGT7-CXFQp9Nj.js → ganttDiagram-6RSMTGT7-BAvlf8cY.js} +1 -1
  83. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-C1pVD_NQ.js → gitGraphDiagram-PVQCEYII-ChCkdYar.js} +1 -1
  84. package/dist/client/assets/{index-JaAxQJXh.js → index-BotCWOKC.js} +1 -1
  85. package/dist/client/assets/index-CtdzGyqj.js +805 -0
  86. package/dist/client/assets/{index-hz5T_W2e.js → index-DtpKHGD1.js} +1 -1
  87. package/dist/client/assets/{infoDiagram-5YYISTIA-C2Guev-g.js → infoDiagram-5YYISTIA-CZMGwNyB.js} +1 -1
  88. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-D3v8VBb2.js → ishikawaDiagram-YF4QCWOH-CubjZGk6.js} +1 -1
  89. package/dist/client/assets/{journeyDiagram-JHISSGLW-DX1AW_Ap.js → journeyDiagram-JHISSGLW-DzwOyVzB.js} +1 -1
  90. package/dist/client/assets/{kanban-definition-UN3LZRKU-CzXThvq2.js → kanban-definition-UN3LZRKU-CXznoTY9.js} +1 -1
  91. package/dist/client/assets/{linear-CVw4gl5i.js → linear-EDwTFRrU.js} +1 -1
  92. package/dist/client/assets/{mermaid.core-C29eoXRj.js → mermaid.core-Lae2097R.js} +4 -4
  93. package/dist/client/assets/{mindmap-definition-RKZ34NQL-DEEGVQVA.js → mindmap-definition-RKZ34NQL-DFjIW41g.js} +1 -1
  94. package/dist/client/assets/{pieDiagram-4H26LBE5-Dme-VM6m.js → pieDiagram-4H26LBE5-CZDLR1jd.js} +1 -1
  95. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-CURFNo24.js → quadrantDiagram-W4KKPZXB-CTGDzbqp.js} +1 -1
  96. package/dist/client/assets/{requirementDiagram-4Y6WPE33-DxMZWXME.js → requirementDiagram-4Y6WPE33-CeH0NbMv.js} +1 -1
  97. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-BW64D4_P.js → sankeyDiagram-5OEKKPKP-B6ZTjurV.js} +1 -1
  98. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-BATRPm8Q.js → sequenceDiagram-3UESZ5HK-DcTRztVx.js} +1 -1
  99. package/dist/client/assets/{stateDiagram-AJRCARHV-pgHVMnO3.js → stateDiagram-AJRCARHV-nUgRVZSA.js} +1 -1
  100. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-D9pJuQbI.js +1 -0
  101. package/dist/client/assets/{timeline-definition-PNZ67QCA-qBxJZPWd.js → timeline-definition-PNZ67QCA-CXm5n4rV.js} +1 -1
  102. package/dist/client/assets/{vennDiagram-CIIHVFJN-BZJK9hqJ.js → vennDiagram-CIIHVFJN-EmNJBYNd.js} +1 -1
  103. package/dist/client/assets/{wardley-L42UT6IY-BobtgEXg.js → wardley-L42UT6IY-MLrlp8H-.js} +1 -1
  104. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-DuWfX_-P.js → wardleyDiagram-YWT4CUSO-5QoES25n.js} +1 -1
  105. package/dist/client/assets/{xychartDiagram-2RQKCTM6-DCw1iURo.js → xychartDiagram-2RQKCTM6-CbDEQbY0.js} +1 -1
  106. package/dist/client/index.html +1 -1
  107. package/dist/core/agent/run-agent.d.ts +61 -0
  108. package/dist/core/agent/run-agent.js +212 -0
  109. package/dist/core/agent/run-agent.js.map +1 -0
  110. package/dist/core/ask/run-ask.d.ts +1 -1
  111. package/dist/core/ask/run-ask.js +14 -5
  112. package/dist/core/ask/run-ask.js.map +1 -1
  113. package/dist/core/workspace/resolve.d.ts +2 -0
  114. package/dist/core/workspace/resolve.js +2 -1
  115. package/dist/core/workspace/resolve.js.map +1 -1
  116. package/dist/plugin-types/ambient.d.ts +30 -0
  117. package/dist/plugin-types/plugin-runtime.d.ts +172 -0
  118. package/dist/plugin-types/ui.d.ts +154 -0
  119. package/dist/server/config.d.ts +12 -0
  120. package/dist/server/config.js +26 -0
  121. package/dist/server/config.js.map +1 -1
  122. package/dist/server/core/plugin-host/__fixtures__/plugins.d.ts +14 -0
  123. package/dist/server/core/plugin-host/__fixtures__/plugins.js +56 -0
  124. package/dist/server/core/plugin-host/__fixtures__/plugins.js.map +1 -0
  125. package/dist/server/core/plugin-host/base-packages.d.ts +14 -0
  126. package/dist/server/core/plugin-host/base-packages.js +26 -0
  127. package/dist/server/core/plugin-host/base-packages.js.map +1 -0
  128. package/dist/server/core/plugin-host/cache-bust.d.ts +10 -0
  129. package/dist/server/core/plugin-host/cache-bust.js +21 -0
  130. package/dist/server/core/plugin-host/cache-bust.js.map +1 -0
  131. package/dist/server/core/plugin-host/cli-engine.d.ts +7 -2
  132. package/dist/server/core/plugin-host/cli-engine.js +11 -3
  133. package/dist/server/core/plugin-host/cli-engine.js.map +1 -1
  134. package/dist/server/core/plugin-host/cli-plugins.d.ts +23 -0
  135. package/dist/server/core/plugin-host/cli-plugins.js +49 -0
  136. package/dist/server/core/plugin-host/cli-plugins.js.map +1 -0
  137. package/dist/server/core/plugin-host/cross-cutting.d.ts +41 -4
  138. package/dist/server/core/plugin-host/cross-cutting.js +52 -4
  139. package/dist/server/core/plugin-host/cross-cutting.js.map +1 -1
  140. package/dist/server/core/plugin-host/frontend-assets.d.ts +100 -0
  141. package/dist/server/core/plugin-host/frontend-assets.js +262 -0
  142. package/dist/server/core/plugin-host/frontend-assets.js.map +1 -0
  143. package/dist/server/core/plugin-host/frontend-manifest.d.ts +33 -0
  144. package/dist/server/core/plugin-host/frontend-manifest.js +52 -0
  145. package/dist/server/core/plugin-host/frontend-manifest.js.map +1 -0
  146. package/dist/server/core/plugin-host/loader.d.ts +107 -0
  147. package/dist/server/core/plugin-host/loader.js +196 -0
  148. package/dist/server/core/plugin-host/loader.js.map +1 -0
  149. package/dist/server/core/plugin-host/manifest-adapter.d.ts +30 -0
  150. package/dist/server/core/plugin-host/manifest-adapter.js +119 -0
  151. package/dist/server/core/plugin-host/manifest-adapter.js.map +1 -0
  152. package/dist/server/core/plugin-host/overlay-loader.d.ts +60 -0
  153. package/dist/server/core/plugin-host/overlay-loader.js +243 -0
  154. package/dist/server/core/plugin-host/overlay-loader.js.map +1 -0
  155. package/dist/server/core/plugin-host/plugin-watcher.d.ts +41 -0
  156. package/dist/server/core/plugin-host/plugin-watcher.js +95 -0
  157. package/dist/server/core/plugin-host/plugin-watcher.js.map +1 -0
  158. package/dist/server/core/plugin-host/project-host.d.ts +8 -2
  159. package/dist/server/core/plugin-host/project-host.js +56 -6
  160. package/dist/server/core/plugin-host/project-host.js.map +1 -1
  161. package/dist/server/core/plugin-host/registry.d.ts +26 -2
  162. package/dist/server/core/plugin-host/registry.js +107 -2
  163. package/dist/server/core/plugin-host/registry.js.map +1 -1
  164. package/dist/server/core/plugin-host/runtime-shims.d.ts +26 -0
  165. package/dist/server/core/plugin-host/runtime-shims.js +96 -0
  166. package/dist/server/core/plugin-host/runtime-shims.js.map +1 -0
  167. package/dist/server/core/plugin-host/types.d.ts +105 -3
  168. package/dist/server/db/migrations/042_chat_thread_drop_context_type_check.sql +61 -0
  169. package/dist/server/external-skills/brief-implementer-template.d.ts +1 -1
  170. package/dist/server/external-skills/brief-implementer-template.js +5 -2
  171. package/dist/server/external-skills/brief-implementer-template.js.map +1 -1
  172. package/dist/server/external-skills/spec-reader-template.d.ts +1 -1
  173. package/dist/server/external-skills/spec-reader-template.js +14 -0
  174. package/dist/server/external-skills/spec-reader-template.js.map +1 -1
  175. package/dist/server/index.js +82 -1
  176. package/dist/server/index.js.map +1 -1
  177. package/dist/server/mcp/c4s-tools.d.ts +6 -1
  178. package/dist/server/mcp/c4s-tools.js +18 -13
  179. package/dist/server/mcp/c4s-tools.js.map +1 -1
  180. package/dist/server/plugin-runtime/index.d.ts +17 -0
  181. package/dist/server/plugin-runtime/index.js +16 -0
  182. package/dist/server/plugin-runtime/index.js.map +1 -0
  183. package/dist/server/plugin-runtime/ui.d.ts +15 -0
  184. package/dist/server/plugin-runtime/ui.js +15 -0
  185. package/dist/server/plugin-runtime/ui.js.map +1 -0
  186. package/dist/server/routes/agent-turn.d.ts +8 -1
  187. package/dist/server/routes/agent-turn.js +67 -39
  188. package/dist/server/routes/agent-turn.js.map +1 -1
  189. package/dist/server/routes/config.d.ts +8 -0
  190. package/dist/server/routes/config.js +41 -3
  191. package/dist/server/routes/config.js.map +1 -1
  192. package/dist/server/routes/plugins.d.ts +43 -0
  193. package/dist/server/routes/plugins.js +93 -0
  194. package/dist/server/routes/plugins.js.map +1 -0
  195. package/dist/server/routes/threads.js +21 -3
  196. package/dist/server/routes/threads.js.map +1 -1
  197. package/dist/server/serialization/registerAll.d.ts +4 -0
  198. package/dist/server/serialization/registerAll.js +4 -2
  199. package/dist/server/serialization/registerAll.js.map +1 -1
  200. package/dist/server/services/chat-context.d.ts +34 -0
  201. package/dist/server/services/chat-context.js +58 -15
  202. package/dist/server/services/chat-context.js.map +1 -1
  203. package/dist/server/services/chat.d.ts +6 -0
  204. package/dist/server/services/chat.js +18 -2
  205. package/dist/server/services/chat.js.map +1 -1
  206. package/dist/server/services/entity-writer.d.ts +2 -3
  207. package/dist/server/services/entity-writer.js.map +1 -1
  208. package/dist/server/services/skill-registry.d.ts +31 -2
  209. package/dist/server/services/skill-registry.js +73 -1
  210. package/dist/server/services/skill-registry.js.map +1 -1
  211. package/dist/server/workspace/context-cache.d.ts +9 -0
  212. package/dist/server/workspace/context-cache.js +14 -0
  213. package/dist/server/workspace/context-cache.js.map +1 -1
  214. package/dist/server/workspace/project-context.d.ts +3 -0
  215. package/dist/server/workspace/project-context.js +106 -4
  216. package/dist/server/workspace/project-context.js.map +1 -1
  217. package/dist/server/workspace/registry.d.ts +28 -1
  218. package/dist/server/workspace/registry.js +57 -1
  219. package/dist/server/workspace/registry.js.map +1 -1
  220. package/dist/server/workspace/types.d.ts +15 -0
  221. package/dist/shared/entities.d.ts +4 -1
  222. package/dist/shared/entities.js.map +1 -1
  223. package/dist/shared/plugin-host/frontend-manifest.d.ts +56 -0
  224. package/dist/shared/plugin-host/frontend-manifest.js +89 -0
  225. package/dist/shared/plugin-host/frontend-manifest.js.map +1 -0
  226. package/dist/shared/plugin-host/host-api.d.ts +60 -0
  227. package/dist/shared/plugin-host/host-api.js +67 -0
  228. package/dist/shared/plugin-host/host-api.js.map +1 -0
  229. package/dist/shared/plugin-host/manifest.d.ts +194 -0
  230. package/dist/shared/plugin-host/manifest.js +52 -0
  231. package/dist/shared/plugin-host/manifest.js.map +1 -0
  232. package/dist/shared/plugin-host/ui-kit-surface.d.ts +22 -0
  233. package/dist/shared/plugin-host/ui-kit-surface.js +25 -0
  234. package/dist/shared/plugin-host/ui-kit-surface.js.map +1 -0
  235. package/dist/shared/types.d.ts +5 -0
  236. package/package.json +18 -3
  237. package/dist/client/assets/channel-D5gzBvo7.js +0 -1
  238. package/dist/client/assets/classDiagram-4FO5ZUOK-CT-amIxa.js +0 -1
  239. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CT-amIxa.js +0 -1
  240. package/dist/client/assets/index-DyAnw7YN.js +0 -798
  241. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-szm_LIuD.js +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay-loader.js","sourceRoot":"","sources":["../../../../src/server/core/plugin-host/overlay-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * M33 — plugin-pool hot-reload watcher.
3
+ *
4
+ * The main `PagesWatcher` is rooted OUTSIDE `.claude4spec/`, so plugin sources
5
+ * are watched by this dedicated watcher instead. It is the *mechanism only* —
6
+ * the reload pipeline (cache-bust import → onUnregister old → register new →
7
+ * invalidate ProjectContext → broadcast) is supplied by the caller via
8
+ * `onReload`. There is deliberately no projection store (no `byPath` map, no
9
+ * SQLite): the live `PluginRegistry` (base) + `ProjectPluginOverlay` (overlay)
10
+ * ARE the index (divergence from M29 — only the watcher is reused).
11
+ *
12
+ * Two callers wire it differently:
13
+ * - overlay: one watcher per `ProjectContext` over `<cwd>/.claude4spec/plugins/`,
14
+ * mounted only behind the `trustProjectPlugins` gate; closed on dispose.
15
+ * - base: one process-global watcher over the resolved workspace package dirs.
16
+ */
17
+ export type PluginWatcherCallback = (changedPaths: string[]) => void;
18
+ export declare class PluginWatcher {
19
+ private readonly roots;
20
+ private readonly onReload;
21
+ private readonly debounceMs;
22
+ private watcher;
23
+ private timer;
24
+ private pending;
25
+ private suppressUntil;
26
+ /**
27
+ * @param roots absolute directories to watch (empty ⇒ `start()` is a no-op).
28
+ * @param onReload invoked (debounced) with the de-duplicated changed paths.
29
+ */
30
+ constructor(roots: string[], onReload: PluginWatcherCallback, debounceMs?: number);
31
+ start(): void;
32
+ /**
33
+ * Call BEFORE a reload-initiated write into a watched dir so the resulting
34
+ * chokidar event does not re-trigger the pipeline (reload → write → reload).
35
+ * Keyed by absolute path.
36
+ */
37
+ suppress(absPath: string): void;
38
+ private queue;
39
+ private flush;
40
+ close(): Promise<void>;
41
+ }
@@ -0,0 +1,95 @@
1
+ /**
2
+ * M33 — plugin-pool hot-reload watcher.
3
+ *
4
+ * The main `PagesWatcher` is rooted OUTSIDE `.claude4spec/`, so plugin sources
5
+ * are watched by this dedicated watcher instead. It is the *mechanism only* —
6
+ * the reload pipeline (cache-bust import → onUnregister old → register new →
7
+ * invalidate ProjectContext → broadcast) is supplied by the caller via
8
+ * `onReload`. There is deliberately no projection store (no `byPath` map, no
9
+ * SQLite): the live `PluginRegistry` (base) + `ProjectPluginOverlay` (overlay)
10
+ * ARE the index (divergence from M29 — only the watcher is reused).
11
+ *
12
+ * Two callers wire it differently:
13
+ * - overlay: one watcher per `ProjectContext` over `<cwd>/.claude4spec/plugins/`,
14
+ * mounted only behind the `trustProjectPlugins` gate; closed on dispose.
15
+ * - base: one process-global watcher over the resolved workspace package dirs.
16
+ */
17
+ import chokidar from 'chokidar';
18
+ import path from 'node:path';
19
+ const DEFAULT_DEBOUNCE_MS = 300;
20
+ const SUPPRESS_WINDOW_MS = 600;
21
+ export class PluginWatcher {
22
+ roots;
23
+ onReload;
24
+ debounceMs;
25
+ watcher = null;
26
+ timer = null;
27
+ pending = new Set();
28
+ suppressUntil = new Map();
29
+ /**
30
+ * @param roots absolute directories to watch (empty ⇒ `start()` is a no-op).
31
+ * @param onReload invoked (debounced) with the de-duplicated changed paths.
32
+ */
33
+ constructor(roots, onReload, debounceMs = DEFAULT_DEBOUNCE_MS) {
34
+ this.roots = roots;
35
+ this.onReload = onReload;
36
+ this.debounceMs = debounceMs;
37
+ }
38
+ start() {
39
+ if (this.roots.length === 0 || this.watcher)
40
+ return;
41
+ this.watcher = chokidar.watch(this.roots, {
42
+ ignoreInitial: true,
43
+ awaitWriteFinish: { stabilityThreshold: 80, pollInterval: 20 },
44
+ });
45
+ const onEvent = (p) => this.queue(p);
46
+ this.watcher.on('add', onEvent);
47
+ this.watcher.on('change', onEvent);
48
+ this.watcher.on('unlink', onEvent);
49
+ this.watcher.on('addDir', onEvent);
50
+ this.watcher.on('unlinkDir', onEvent);
51
+ }
52
+ /**
53
+ * Call BEFORE a reload-initiated write into a watched dir so the resulting
54
+ * chokidar event does not re-trigger the pipeline (reload → write → reload).
55
+ * Keyed by absolute path.
56
+ */
57
+ suppress(absPath) {
58
+ this.suppressUntil.set(path.resolve(absPath), Date.now() + SUPPRESS_WINDOW_MS);
59
+ }
60
+ queue(absPath) {
61
+ const resolved = path.resolve(absPath);
62
+ const until = this.suppressUntil.get(resolved);
63
+ if (until && Date.now() < until) {
64
+ this.suppressUntil.delete(resolved);
65
+ return;
66
+ }
67
+ this.pending.add(resolved);
68
+ if (this.timer)
69
+ clearTimeout(this.timer);
70
+ this.timer = setTimeout(() => this.flush(), this.debounceMs);
71
+ }
72
+ flush() {
73
+ this.timer = null;
74
+ if (this.pending.size === 0)
75
+ return;
76
+ const paths = [...this.pending];
77
+ this.pending.clear();
78
+ try {
79
+ this.onReload(paths);
80
+ }
81
+ catch (err) {
82
+ console.warn('[plugin-watcher] onReload threw:', err.message);
83
+ }
84
+ }
85
+ async close() {
86
+ if (this.timer) {
87
+ clearTimeout(this.timer);
88
+ this.timer = null;
89
+ }
90
+ this.pending.clear();
91
+ await this.watcher?.close();
92
+ this.watcher = null;
93
+ }
94
+ }
95
+ //# sourceMappingURL=plugin-watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-watcher.js","sourceRoot":"","sources":["../../../../src/server/core/plugin-host/plugin-watcher.ts"],"names":[],"mappings":"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"}
@@ -5,22 +5,28 @@
5
5
  */
6
6
  import type { Database } from 'better-sqlite3';
7
7
  import type { McpServerInstance } from '@inharness-ai/agent-adapters';
8
- import type { BackendModule, MountContext, PluginRegistry, ProjectPluginHost } from './types.js';
8
+ import type { BackendModule, MountContext, PluginRegistry, ProjectPluginHost, ProjectPluginOverlay, ShadowedType } from './types.js';
9
9
  import type { PluginActivationState } from '../../../shared/plugin-host/types.js';
10
+ import type { PluginCommandContribution, PluginSettingsSection } from '../../../shared/plugin-host/manifest.js';
10
11
  import type { EntityDiff, RestoreContext, RestoreResult, SerializeContext, SnapshotData } from '../../serialization/types.js';
11
12
  export declare class ProjectPluginHostImpl implements ProjectPluginHost {
12
13
  private readonly registry;
14
+ private readonly overlay?;
13
15
  private activeTypes;
14
16
  private unknownTypes;
15
17
  private mcpServerFactories;
16
18
  private entityServices;
17
- constructor(registry: PluginRegistry, activeWhitelist: string[] | null | undefined);
19
+ private readonly overlayModules;
20
+ constructor(registry: PluginRegistry, activeWhitelist: string[] | null | undefined, overlay?: ProjectPluginOverlay | undefined);
18
21
  listAvailable(): BackendModule[];
19
22
  listEntities(): BackendModule[];
23
+ listSettings(): PluginSettingsSection[];
24
+ listCommands(): PluginCommandContribution[];
20
25
  getEntity(type: string): BackendModule | null;
21
26
  getAvailable(type: string): BackendModule | null;
22
27
  isActive(type: string): boolean;
23
28
  partition(): PluginActivationState;
29
+ shadowReport(): ShadowedType[];
24
30
  mountBackend(ctx: MountContext): void;
25
31
  registerMcpServer(name: string, factory: () => McpServerInstance): void;
26
32
  buildMcpServers(): Array<{
@@ -6,21 +6,33 @@
6
6
  import { diffEntity, restoreEntity, snapshotEntity } from '../../serialization/snapshot.js';
7
7
  export class ProjectPluginHostImpl {
8
8
  registry;
9
+ overlay;
9
10
  activeTypes = null; // null = all active
10
11
  unknownTypes = [];
11
12
  mcpServerFactories = new Map();
12
13
  entityServices = new Map();
13
- constructor(registry, activeWhitelist) {
14
+ // Project-local modules of THIS context, keyed by type. Empty when
15
+ // `overlay === undefined` (parity with the base-only case).
16
+ overlayModules = new Map();
17
+ constructor(registry, activeWhitelist, overlay) {
14
18
  this.registry = registry;
19
+ this.overlay = overlay;
20
+ // Effective pool = base ∪ overlay. Overlay wins on cross-layer collision
21
+ // (shadow) — `getAvailable`/`listAvailable` consult the overlay first.
22
+ for (const m of overlay?.listLocal() ?? []) {
23
+ this.overlayModules.set(m.type, m);
24
+ }
15
25
  if (activeWhitelist == null) {
16
26
  this.activeTypes = null;
17
27
  this.unknownTypes = [];
18
28
  return;
19
29
  }
30
+ // The whitelist is applied to the merged pool, not the base alone — an
31
+ // overlay type is activatable exactly like a base type.
20
32
  const active = new Set();
21
33
  const unknown = [];
22
34
  for (const type of activeWhitelist) {
23
- if (this.registry.getAvailable(type))
35
+ if (this.getAvailable(type))
24
36
  active.add(type);
25
37
  else
26
38
  unknown.push(type);
@@ -29,21 +41,49 @@ export class ProjectPluginHostImpl {
29
41
  this.unknownTypes = unknown;
30
42
  }
31
43
  listAvailable() {
32
- return this.registry.listAvailable();
44
+ // Merge base + overlay; overlay shadows a same-typed base module.
45
+ const merged = new Map();
46
+ for (const m of this.registry.listAvailable())
47
+ merged.set(m.type, m);
48
+ for (const [type, m] of this.overlayModules)
49
+ merged.set(type, m);
50
+ return Array.from(merged.values()).sort((a, b) => a.displayOrder - b.displayOrder);
33
51
  }
34
52
  listEntities() {
35
53
  return this.listAvailable().filter((m) => this.isActive(m.type));
36
54
  }
55
+ listSettings() {
56
+ // Axis B (pool + trust), NOT axis A: deliberately unfiltered by
57
+ // `config.entities`. Base records are always loaded+trusted; the overlay is
58
+ // only constructed on the trusted path, so its sections are trusted too.
59
+ // Overlay shadows base on a name collision (parity with type shadowing).
60
+ const byName = new Map();
61
+ for (const r of this.registry.listPluginRecords()) {
62
+ if (r.settings.length > 0) {
63
+ byName.set(r.name, { name: r.name, version: r.version, fields: r.settings });
64
+ }
65
+ }
66
+ for (const section of this.overlay?.listSettings() ?? []) {
67
+ byName.set(section.name, section);
68
+ }
69
+ return Array.from(byName.values());
70
+ }
71
+ listCommands() {
72
+ // Same two-axis rationale as listSettings(): pool + trust, not entities.
73
+ const base = this.registry.listPluginRecords().flatMap((r) => r.commands);
74
+ return [...base, ...(this.overlay?.listCommands() ?? [])];
75
+ }
37
76
  getEntity(type) {
38
77
  if (!this.isActive(type))
39
78
  return null;
40
- return this.registry.getAvailable(type);
79
+ return this.getAvailable(type);
41
80
  }
42
81
  getAvailable(type) {
43
- return this.registry.getAvailable(type);
82
+ // Overlay shadows base on cross-layer collision.
83
+ return this.overlayModules.get(type) ?? this.registry.getAvailable(type) ?? null;
44
84
  }
45
85
  isActive(type) {
46
- if (!this.registry.getAvailable(type))
86
+ if (!this.getAvailable(type))
47
87
  return false;
48
88
  if (this.activeTypes == null)
49
89
  return true;
@@ -56,6 +96,16 @@ export class ProjectPluginHostImpl {
56
96
  .map((m) => m.type);
57
97
  return { active, inactive, unknown: [...this.unknownTypes] };
58
98
  }
99
+ shadowReport() {
100
+ const out = [];
101
+ for (const type of this.overlayModules.keys()) {
102
+ // Cross-layer collision: the overlay type also exists in the base layer.
103
+ if (this.registry.getAvailable(type)) {
104
+ out.push({ type, overlayOrigin: this.overlay?.origin(type) ?? '' });
105
+ }
106
+ }
107
+ return out;
108
+ }
59
109
  mountBackend(ctx) {
60
110
  // A throwing plugin mount propagates — M31 turns it into a per-project
61
111
  // build failure (500 PROJECT_BUILD_FAILED), never a process crash.
@@ -1 +1 @@
1
- {"version":3,"file":"project-host.js","sourceRoot":"","sources":["../../../../src/server/core/plugin-host/project-host.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project-host.js","sourceRoot":"","sources":["../../../../src/server/core/plugin-host/project-host.ts"],"names":[],"mappings":"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"}
@@ -3,12 +3,36 @@
3
3
  * singleton — the registry is immutable after `registerAllPlugins(registry)`
4
4
  * runs at process start, and `consolidate(config.entities)` is a pure factory
5
5
  * producing one ProjectPluginHost per project context.
6
+ *
7
+ * M33: the base layer is no longer process-immutable — the hot-reload
8
+ * pipeline mutates it via `registerPlugin` / `unregisterPlugin` and then
9
+ * invalidates dependent `ProjectContext`s (axis B). The registry additionally
10
+ * retains a per-plugin {@link RegisteredPluginRecord} so the host can surface
11
+ * non-entity capabilities (settings/commands) and the reload pipeline can call
12
+ * the old version's `onUnregister` before re-registering.
6
13
  */
7
- import type { BackendModule, PluginRegistry, ProjectPluginHost } from './types.js';
14
+ import type { BackendModule, PluginRegistry, ProjectPluginHost, ProjectPluginOverlay, RegisteredPluginRecord } from './types.js';
15
+ import type { PluginManifest, WritingStyleContribution } from '../../../shared/plugin-host/manifest.js';
8
16
  export declare class PluginRegistryImpl implements PluginRegistry {
9
17
  private modules;
18
+ private plugins;
10
19
  registerEntityModule(module: BackendModule): void;
20
+ /**
21
+ * Validate a manifest's shape and lower every contribution WITHOUT mutating
22
+ * the registry. Throws `PluginManifestError` on any structural problem (the
23
+ * loader/reload pipeline catches it). The hot-reload pipeline calls this
24
+ * BEFORE tearing the old version down, so a structurally-broken new version
25
+ * never leaves the pool missing a type ("old stays").
26
+ */
27
+ private validateAndLower;
28
+ validatePlugin(manifest: PluginManifest): void;
29
+ registerPlugin(manifest: PluginManifest): void;
30
+ unregisterPlugin(name: string): void;
31
+ listPluginRecords(): RegisteredPluginRecord[];
32
+ listWritingStyles(): WritingStyleContribution[];
11
33
  listAvailable(): BackendModule[];
12
34
  getAvailable(type: string): BackendModule | null;
13
- consolidate(activeWhitelist: string[] | null | undefined): ProjectPluginHost;
35
+ consolidate(config: {
36
+ entities?: string[];
37
+ } | null | undefined, overlay?: ProjectPluginOverlay): ProjectPluginHost;
14
38
  }
@@ -3,24 +3,129 @@
3
3
  * singleton — the registry is immutable after `registerAllPlugins(registry)`
4
4
  * runs at process start, and `consolidate(config.entities)` is a pure factory
5
5
  * producing one ProjectPluginHost per project context.
6
+ *
7
+ * M33: the base layer is no longer process-immutable — the hot-reload
8
+ * pipeline mutates it via `registerPlugin` / `unregisterPlugin` and then
9
+ * invalidates dependent `ProjectContext`s (axis B). The registry additionally
10
+ * retains a per-plugin {@link RegisteredPluginRecord} so the host can surface
11
+ * non-entity capabilities (settings/commands) and the reload pipeline can call
12
+ * the old version's `onUnregister` before re-registering.
6
13
  */
7
14
  import { ProjectPluginHostImpl } from './project-host.js';
15
+ import { PluginManifestError, lowerEntityContribution, validateWritingStyle, } from './manifest-adapter.js';
8
16
  export class PluginRegistryImpl {
9
17
  modules = new Map();
18
+ // M33: base-layer plugins by name, in registration order. The source
19
+ // of truth for `listWritingStyles` / `listPluginRecords` so a hot-reload that
20
+ // calls `unregisterPlugin` cleanly drops the old version's styles too.
21
+ plugins = new Map();
10
22
  registerEntityModule(module) {
11
23
  if (!module.type) {
12
24
  throw new Error('plugin-registry: module.type is required');
13
25
  }
14
26
  this.modules.set(module.type, module);
15
27
  }
28
+ /**
29
+ * Validate a manifest's shape and lower every contribution WITHOUT mutating
30
+ * the registry. Throws `PluginManifestError` on any structural problem (the
31
+ * loader/reload pipeline catches it). The hot-reload pipeline calls this
32
+ * BEFORE tearing the old version down, so a structurally-broken new version
33
+ * never leaves the pool missing a type ("old stays").
34
+ */
35
+ validateAndLower(manifest) {
36
+ if (!manifest || typeof manifest !== 'object') {
37
+ throw new PluginManifestError('plugin manifest must be an object');
38
+ }
39
+ if (typeof manifest.name !== 'string' || typeof manifest.version !== 'string') {
40
+ throw new PluginManifestError('plugin manifest requires string name + version');
41
+ }
42
+ if (manifest.contributes == null || typeof manifest.contributes !== 'object') {
43
+ throw new PluginManifestError(`plugin "${manifest.name}" — contributes must be an object`);
44
+ }
45
+ // Two-pass for atomicity: lower (validate) every contribution first, so a
46
+ // throw on a later entity/style never leaves earlier ones registered.
47
+ const entityModules = (manifest.contributes.entities ?? []).map(lowerEntityContribution);
48
+ const styles = (manifest.contributes.writingStyles ?? []).map(validateWritingStyle);
49
+ // `onUnregister` is a required slot from the HOST_API 1.0.0 baseline. A
50
+ // runtime manifest missing it is not crashed over — warn (parity with L8
51
+ // slot validation) and substitute a no-op so the reload pipeline still works.
52
+ let onUnregister;
53
+ if (typeof manifest.onUnregister === 'function') {
54
+ onUnregister = () => manifest.onUnregister();
55
+ }
56
+ else {
57
+ console.warn(`[plugin-registry] plugin "${manifest.name}" — required slot onUnregister is missing; using a no-op teardown`);
58
+ onUnregister = () => { };
59
+ }
60
+ const settings = manifest.contributes.settings ?? [];
61
+ const commands = manifest.contributes.commands ?? [];
62
+ return {
63
+ record: {
64
+ name: manifest.name,
65
+ version: manifest.version,
66
+ contributedTypes: entityModules.map((m) => m.type),
67
+ settings,
68
+ commands,
69
+ styles,
70
+ entityModules,
71
+ onUnregister,
72
+ },
73
+ };
74
+ }
75
+ validatePlugin(manifest) {
76
+ this.validateAndLower(manifest);
77
+ }
78
+ registerPlugin(manifest) {
79
+ const { record } = this.validateAndLower(manifest);
80
+ for (const module of record.entityModules) {
81
+ this.registerEntityModule(module);
82
+ }
83
+ // Re-registration (hot-reload) overwrites the prior record; Map keeps the
84
+ // first-seen insertion order, which is what we want for stable section order.
85
+ this.plugins.set(record.name, record);
86
+ }
87
+ unregisterPlugin(name) {
88
+ const record = this.plugins.get(name);
89
+ if (!record)
90
+ return;
91
+ try {
92
+ record.onUnregister();
93
+ }
94
+ catch (err) {
95
+ // Idempotent + non-throwing by contract — a throw is a warning, never a block.
96
+ console.warn(`[plugin-registry] onUnregister of "${name}" threw: ${err.message}`);
97
+ }
98
+ for (const module of record.entityModules) {
99
+ // Only drop the module if it is STILL the one this plugin contributed — a
100
+ // later same-typed registration (another base plugin contributing the same
101
+ // type) would have overwritten the slot, and must not be clobbered here.
102
+ if (this.modules.get(module.type) === module) {
103
+ this.modules.delete(module.type);
104
+ }
105
+ }
106
+ this.plugins.delete(name);
107
+ }
108
+ listPluginRecords() {
109
+ return Array.from(this.plugins.values()).map((r) => ({
110
+ name: r.name,
111
+ version: r.version,
112
+ contributedTypes: [...r.contributedTypes],
113
+ settings: r.settings,
114
+ commands: r.commands,
115
+ onUnregister: r.onUnregister,
116
+ }));
117
+ }
118
+ listWritingStyles() {
119
+ return Array.from(this.plugins.values()).flatMap((r) => r.styles);
120
+ }
16
121
  listAvailable() {
17
122
  return Array.from(this.modules.values()).sort((a, b) => a.displayOrder - b.displayOrder);
18
123
  }
19
124
  getAvailable(type) {
20
125
  return this.modules.get(type) ?? null;
21
126
  }
22
- consolidate(activeWhitelist) {
23
- return new ProjectPluginHostImpl(this, activeWhitelist);
127
+ consolidate(config, overlay) {
128
+ return new ProjectPluginHostImpl(this, config?.entities, overlay);
24
129
  }
25
130
  }
26
131
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/server/core/plugin-host/registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,MAAM,OAAO,kBAAkB;IACrB,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEnD,oBAAoB,CAAC,MAAqB;QACxC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,aAAa;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAC3C,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAC1C,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,IAAY;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IACxC,CAAC;IAED,WAAW,CAAC,eAA4C;QACtD,OAAO,IAAI,qBAAqB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAC1D,CAAC;CACF"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/server/core/plugin-host/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * M33 "Option B" shared-singleton shims.
3
+ *
4
+ * The host publishes its OWN already-imported module namespaces onto
5
+ * `window.__c4s_shared` (see client `shared-runtime.ts`). The import map points
6
+ * each bare peer specifier at one of these tiny server-served ESM modules, which
7
+ * re-export from that global. A plugin's `import "react"` therefore resolves to
8
+ * the host's live React reconciler — not a second copy.
9
+ *
10
+ * The named-export list per peer is enumerated from the actually-installed
11
+ * package at runtime (cached), so the shim never drifts from the host's exports
12
+ * — avoiding a brittle hand-maintained list. `@c4s/plugin-runtime` is our own
13
+ * fixed surface (and a browser module the server can't import), so it is listed
14
+ * explicitly.
15
+ */
16
+ import type { SharedPeerSpecifier } from '../../../shared/plugin-host/frontend-manifest.js';
17
+ /** Bare specifier → URL slug used in `/api/plugins/runtime/<slug>.js`. */
18
+ export declare const PEER_SLUG: Record<SharedPeerSpecifier, string>;
19
+ /** Build the import map injected into the page. Bare specifier → shim URL. */
20
+ export declare function buildImportMap(): Record<string, string>;
21
+ /**
22
+ * Render (and cache) the ESM shim for one runtime slug. Returns `null` for an
23
+ * unknown slug. Never throws — a peer whose package can't be introspected
24
+ * server-side falls back to a default-only shim.
25
+ */
26
+ export declare function getRuntimeShim(slug: string): Promise<string | null>;
@@ -0,0 +1,96 @@
1
+ /**
2
+ * M33 "Option B" shared-singleton shims.
3
+ *
4
+ * The host publishes its OWN already-imported module namespaces onto
5
+ * `window.__c4s_shared` (see client `shared-runtime.ts`). The import map points
6
+ * each bare peer specifier at one of these tiny server-served ESM modules, which
7
+ * re-export from that global. A plugin's `import "react"` therefore resolves to
8
+ * the host's live React reconciler — not a second copy.
9
+ *
10
+ * The named-export list per peer is enumerated from the actually-installed
11
+ * package at runtime (cached), so the shim never drifts from the host's exports
12
+ * — avoiding a brittle hand-maintained list. `@c4s/plugin-runtime` is our own
13
+ * fixed surface (and a browser module the server can't import), so it is listed
14
+ * explicitly.
15
+ */
16
+ import { SHARED_PEER_SPECIFIERS, PLUGIN_RUNTIME_EXPORT_NAMES, PLUGIN_RUNTIME_UI_EXPORT_NAMES, } from '../../../shared/plugin-host/frontend-manifest.js';
17
+ /** Bare specifier → URL slug used in `/api/plugins/runtime/<slug>.js`. */
18
+ export const PEER_SLUG = {
19
+ react: 'react',
20
+ 'react/jsx-runtime': 'react-jsx-runtime',
21
+ 'react/jsx-dev-runtime': 'react-jsx-dev-runtime',
22
+ 'react-dom': 'react-dom',
23
+ 'react-dom/client': 'react-dom-client',
24
+ '@tiptap/core': 'tiptap-core',
25
+ '@tanstack/react-query': 'react-query',
26
+ '@tanstack/react-router': 'react-router',
27
+ '@c4s/plugin-runtime': 'plugin-runtime',
28
+ '@c4s/plugin-runtime/ui': 'plugin-runtime-ui',
29
+ };
30
+ const SLUG_PEER = Object.fromEntries(SHARED_PEER_SPECIFIERS.map((spec) => [PEER_SLUG[spec], spec]));
31
+ /**
32
+ * The named exports of our own client surfaces — browser modules the server
33
+ * can't introspect. Single source of truth lives in shared; parity tests
34
+ * (plugin-runtime.test.ts, plugin-runtime-ui.test.ts) guard them against drift.
35
+ */
36
+ const PLUGIN_RUNTIME_EXPORTS = PLUGIN_RUNTIME_EXPORT_NAMES;
37
+ const PLUGIN_RUNTIME_UI_EXPORTS = PLUGIN_RUNTIME_UI_EXPORT_NAMES;
38
+ /** Build the import map injected into the page. Bare specifier → shim URL. */
39
+ export function buildImportMap() {
40
+ const map = {};
41
+ for (const spec of SHARED_PEER_SPECIFIERS) {
42
+ map[spec] = `/api/plugins/runtime/${PEER_SLUG[spec]}.js`;
43
+ }
44
+ return map;
45
+ }
46
+ const ID_RE = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
47
+ function renderShimSource(specifier, names) {
48
+ const accessor = `globalThis.__c4s_shared[${JSON.stringify(specifier)}]`;
49
+ const lines = [
50
+ `// Auto-generated host singleton shim for "${specifier}".`,
51
+ `const __m = ${accessor};`,
52
+ `if (!__m) throw new Error('c4s plugin-runtime: missing shared singleton "${specifier}" — host did not publish window.__c4s_shared');`,
53
+ `export default (__m && __m.default !== undefined ? __m.default : __m);`,
54
+ ];
55
+ for (const name of names) {
56
+ if (name === 'default' || name === '__esModule' || !ID_RE.test(name))
57
+ continue;
58
+ lines.push(`export const ${name} = __m[${JSON.stringify(name)}];`);
59
+ }
60
+ return lines.join('\n') + '\n';
61
+ }
62
+ const shimCache = new Map();
63
+ /**
64
+ * Render (and cache) the ESM shim for one runtime slug. Returns `null` for an
65
+ * unknown slug. Never throws — a peer whose package can't be introspected
66
+ * server-side falls back to a default-only shim.
67
+ */
68
+ export async function getRuntimeShim(slug) {
69
+ const cached = shimCache.get(slug);
70
+ if (cached)
71
+ return cached;
72
+ const specifier = SLUG_PEER[slug];
73
+ if (!specifier)
74
+ return null;
75
+ let names;
76
+ if (specifier === '@c4s/plugin-runtime') {
77
+ names = [...PLUGIN_RUNTIME_EXPORTS];
78
+ }
79
+ else if (specifier === '@c4s/plugin-runtime/ui') {
80
+ names = [...PLUGIN_RUNTIME_UI_EXPORTS];
81
+ }
82
+ else {
83
+ try {
84
+ const ns = (await import(specifier));
85
+ names = Object.keys(ns);
86
+ }
87
+ catch (err) {
88
+ console.warn(`[plugin-runtime] could not introspect "${specifier}" for shim exports: ${err.message}`);
89
+ names = [];
90
+ }
91
+ }
92
+ const source = renderShimSource(specifier, names);
93
+ shimCache.set(slug, source);
94
+ return source;
95
+ }
96
+ //# sourceMappingURL=runtime-shims.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-shims.js","sourceRoot":"","sources":["../../../../src/server/core/plugin-host/runtime-shims.ts"],"names":[],"mappings":"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"}