@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.
- package/.claude/skills/c4s-brief-implementer/SKILL.md +120 -53
- package/CHANGELOG.md +13 -0
- package/dist/bin/c4s/commands/agent.d.ts +18 -0
- package/dist/bin/c4s/commands/agent.js +102 -0
- package/dist/bin/c4s/commands/agent.js.map +1 -0
- package/dist/bin/c4s/commands/ask.d.ts +9 -8
- package/dist/bin/c4s/commands/ask.js +23 -31
- package/dist/bin/c4s/commands/ask.js.map +1 -1
- package/dist/bin/c4s/commands/catalog.d.ts +1 -1
- package/dist/bin/c4s/commands/catalog.js +2 -2
- package/dist/bin/c4s/commands/catalog.js.map +1 -1
- package/dist/bin/c4s/commands/describe.d.ts +1 -1
- package/dist/bin/c4s/commands/describe.js +2 -2
- package/dist/bin/c4s/commands/describe.js.map +1 -1
- package/dist/bin/c4s/commands/detail.d.ts +1 -1
- package/dist/bin/c4s/commands/detail.js +2 -2
- package/dist/bin/c4s/commands/detail.js.map +1 -1
- package/dist/bin/c4s/commands/element-list.d.ts +1 -1
- package/dist/bin/c4s/commands/element-list.js +2 -2
- package/dist/bin/c4s/commands/element-list.js.map +1 -1
- package/dist/bin/c4s/commands/find-references.js +1 -1
- package/dist/bin/c4s/commands/find-references.js.map +1 -1
- package/dist/bin/c4s/commands/inline-mention.d.ts +1 -1
- package/dist/bin/c4s/commands/inline-mention.js +2 -2
- package/dist/bin/c4s/commands/inline-mention.js.map +1 -1
- package/dist/bin/c4s/commands/list-slugs.d.ts +1 -1
- package/dist/bin/c4s/commands/list-slugs.js +2 -2
- package/dist/bin/c4s/commands/list-slugs.js.map +1 -1
- package/dist/bin/c4s/commands/list-tags.d.ts +1 -1
- package/dist/bin/c4s/commands/list-tags.js +2 -2
- package/dist/bin/c4s/commands/list-tags.js.map +1 -1
- package/dist/bin/c4s/commands/plugins.d.ts +9 -0
- package/dist/bin/c4s/commands/plugins.js +81 -0
- package/dist/bin/c4s/commands/plugins.js.map +1 -0
- package/dist/bin/c4s/commands/resolve.d.ts +1 -1
- package/dist/bin/c4s/commands/resolve.js +2 -2
- package/dist/bin/c4s/commands/resolve.js.map +1 -1
- package/dist/bin/c4s/commands/single-element.d.ts +1 -1
- package/dist/bin/c4s/commands/single-element.js +2 -2
- package/dist/bin/c4s/commands/single-element.js.map +1 -1
- package/dist/bin/c4s/commands/tagged-list-mixed.d.ts +1 -1
- package/dist/bin/c4s/commands/tagged-list-mixed.js +2 -2
- package/dist/bin/c4s/commands/tagged-list-mixed.js.map +1 -1
- package/dist/bin/c4s/commands/tagged-list.d.ts +1 -1
- package/dist/bin/c4s/commands/tagged-list.js +2 -2
- package/dist/bin/c4s/commands/tagged-list.js.map +1 -1
- package/dist/bin/c4s/context.d.ts +3 -3
- package/dist/bin/c4s/context.js +7 -4
- package/dist/bin/c4s/context.js.map +1 -1
- package/dist/bin/c4s/errors.d.ts +1 -1
- package/dist/bin/c4s/errors.js.map +1 -1
- package/dist/bin/c4s-mcp.js +6 -2
- package/dist/bin/c4s-mcp.js.map +1 -1
- package/dist/bin/c4s.js +19 -4
- package/dist/bin/c4s.js.map +1 -1
- package/dist/bin/gitignore.js +7 -11
- package/dist/bin/gitignore.js.map +1 -1
- package/dist/client/assets/{arc-Coa9fbDO.js → arc-C9oTB3b1.js} +1 -1
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-VJZcRMEN.js → architectureDiagram-3BPJPVTR-Bno5ViqK.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-C7dU2lW1.js → blockDiagram-GPEHLZMM-CJYBoeWQ.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-CG_BBm_5.js → c4Diagram-AAUBKEIU-DaaqWE6s.js} +1 -1
- package/dist/client/assets/channel-Cei_E79M.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-BnS95YpK.js → chunk-2J33WTMH-P_I0OPMy.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-COr8w3X3.js → chunk-4BX2VUAB-CCySMlh5.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-CxrIbZhB.js → chunk-55IACEB6-CEUyqKGF.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-DRchPPRe.js → chunk-727SXJPM-CoTSYOVz.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-_SfN7mED.js → chunk-AQP2D5EJ-DB0nMxPr.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-p2tIiP1D.js → chunk-FMBD7UC4-PG3m6-_a.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-B1mbl2hP.js → chunk-ND2GUHAM-CBNk6IaV.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-DBUpeqvS.js → chunk-QZHKN3VN-CLFa0WvN.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-DUe_fAto.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DUe_fAto.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-BBsY5aKD.js → cose-bilkent-S5V4N54A-BDwDDxHN.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-b-vu4RC9.js → dagre-BM42HDAG-DR-1e8N5.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-j-DW9qSf.js → diagram-2AECGRRQ-C-tHgBWt.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-DHX_WYWQ.js → diagram-5GNKFQAL-uLmoKaJL.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-DxdQok_M.js → diagram-KO2AKTUF-8Fd-xuOy.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-BbTIX5c1.js → diagram-LMA3HP47-C1gniWsn.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-BQ9ODAlH.js → diagram-OG6HWLK6-BMWjZbeC.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-6lwAL1y9.js → erDiagram-TEJ5UH35-CIUO8hrR.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-ioSHb5-t.js → flowDiagram-I6XJVG4X-Ccw5YEf3.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-CXFQp9Nj.js → ganttDiagram-6RSMTGT7-BAvlf8cY.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-C1pVD_NQ.js → gitGraphDiagram-PVQCEYII-ChCkdYar.js} +1 -1
- package/dist/client/assets/{index-JaAxQJXh.js → index-BotCWOKC.js} +1 -1
- package/dist/client/assets/index-CtdzGyqj.js +805 -0
- package/dist/client/assets/{index-hz5T_W2e.js → index-DtpKHGD1.js} +1 -1
- package/dist/client/assets/{infoDiagram-5YYISTIA-C2Guev-g.js → infoDiagram-5YYISTIA-CZMGwNyB.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-D3v8VBb2.js → ishikawaDiagram-YF4QCWOH-CubjZGk6.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-DX1AW_Ap.js → journeyDiagram-JHISSGLW-DzwOyVzB.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-CzXThvq2.js → kanban-definition-UN3LZRKU-CXznoTY9.js} +1 -1
- package/dist/client/assets/{linear-CVw4gl5i.js → linear-EDwTFRrU.js} +1 -1
- package/dist/client/assets/{mermaid.core-C29eoXRj.js → mermaid.core-Lae2097R.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-DEEGVQVA.js → mindmap-definition-RKZ34NQL-DFjIW41g.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-Dme-VM6m.js → pieDiagram-4H26LBE5-CZDLR1jd.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-CURFNo24.js → quadrantDiagram-W4KKPZXB-CTGDzbqp.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-DxMZWXME.js → requirementDiagram-4Y6WPE33-CeH0NbMv.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-BW64D4_P.js → sankeyDiagram-5OEKKPKP-B6ZTjurV.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-BATRPm8Q.js → sequenceDiagram-3UESZ5HK-DcTRztVx.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-pgHVMnO3.js → stateDiagram-AJRCARHV-nUgRVZSA.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-D9pJuQbI.js +1 -0
- package/dist/client/assets/{timeline-definition-PNZ67QCA-qBxJZPWd.js → timeline-definition-PNZ67QCA-CXm5n4rV.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-BZJK9hqJ.js → vennDiagram-CIIHVFJN-EmNJBYNd.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-BobtgEXg.js → wardley-L42UT6IY-MLrlp8H-.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-DuWfX_-P.js → wardleyDiagram-YWT4CUSO-5QoES25n.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-DCw1iURo.js → xychartDiagram-2RQKCTM6-CbDEQbY0.js} +1 -1
- package/dist/client/index.html +1 -1
- package/dist/core/agent/run-agent.d.ts +61 -0
- package/dist/core/agent/run-agent.js +212 -0
- package/dist/core/agent/run-agent.js.map +1 -0
- package/dist/core/ask/run-ask.d.ts +1 -1
- package/dist/core/ask/run-ask.js +14 -5
- package/dist/core/ask/run-ask.js.map +1 -1
- package/dist/core/workspace/resolve.d.ts +2 -0
- package/dist/core/workspace/resolve.js +2 -1
- package/dist/core/workspace/resolve.js.map +1 -1
- package/dist/plugin-types/ambient.d.ts +30 -0
- package/dist/plugin-types/plugin-runtime.d.ts +172 -0
- package/dist/plugin-types/ui.d.ts +154 -0
- package/dist/server/config.d.ts +12 -0
- package/dist/server/config.js +26 -0
- package/dist/server/config.js.map +1 -1
- package/dist/server/core/plugin-host/__fixtures__/plugins.d.ts +14 -0
- package/dist/server/core/plugin-host/__fixtures__/plugins.js +56 -0
- package/dist/server/core/plugin-host/__fixtures__/plugins.js.map +1 -0
- package/dist/server/core/plugin-host/base-packages.d.ts +14 -0
- package/dist/server/core/plugin-host/base-packages.js +26 -0
- package/dist/server/core/plugin-host/base-packages.js.map +1 -0
- package/dist/server/core/plugin-host/cache-bust.d.ts +10 -0
- package/dist/server/core/plugin-host/cache-bust.js +21 -0
- package/dist/server/core/plugin-host/cache-bust.js.map +1 -0
- package/dist/server/core/plugin-host/cli-engine.d.ts +7 -2
- package/dist/server/core/plugin-host/cli-engine.js +11 -3
- package/dist/server/core/plugin-host/cli-engine.js.map +1 -1
- package/dist/server/core/plugin-host/cli-plugins.d.ts +23 -0
- package/dist/server/core/plugin-host/cli-plugins.js +49 -0
- package/dist/server/core/plugin-host/cli-plugins.js.map +1 -0
- package/dist/server/core/plugin-host/cross-cutting.d.ts +41 -4
- package/dist/server/core/plugin-host/cross-cutting.js +52 -4
- package/dist/server/core/plugin-host/cross-cutting.js.map +1 -1
- package/dist/server/core/plugin-host/frontend-assets.d.ts +100 -0
- package/dist/server/core/plugin-host/frontend-assets.js +262 -0
- package/dist/server/core/plugin-host/frontend-assets.js.map +1 -0
- package/dist/server/core/plugin-host/frontend-manifest.d.ts +33 -0
- package/dist/server/core/plugin-host/frontend-manifest.js +52 -0
- package/dist/server/core/plugin-host/frontend-manifest.js.map +1 -0
- package/dist/server/core/plugin-host/loader.d.ts +107 -0
- package/dist/server/core/plugin-host/loader.js +196 -0
- package/dist/server/core/plugin-host/loader.js.map +1 -0
- package/dist/server/core/plugin-host/manifest-adapter.d.ts +30 -0
- package/dist/server/core/plugin-host/manifest-adapter.js +119 -0
- package/dist/server/core/plugin-host/manifest-adapter.js.map +1 -0
- package/dist/server/core/plugin-host/overlay-loader.d.ts +60 -0
- package/dist/server/core/plugin-host/overlay-loader.js +243 -0
- package/dist/server/core/plugin-host/overlay-loader.js.map +1 -0
- package/dist/server/core/plugin-host/plugin-watcher.d.ts +41 -0
- package/dist/server/core/plugin-host/plugin-watcher.js +95 -0
- package/dist/server/core/plugin-host/plugin-watcher.js.map +1 -0
- package/dist/server/core/plugin-host/project-host.d.ts +8 -2
- package/dist/server/core/plugin-host/project-host.js +56 -6
- package/dist/server/core/plugin-host/project-host.js.map +1 -1
- package/dist/server/core/plugin-host/registry.d.ts +26 -2
- package/dist/server/core/plugin-host/registry.js +107 -2
- package/dist/server/core/plugin-host/registry.js.map +1 -1
- package/dist/server/core/plugin-host/runtime-shims.d.ts +26 -0
- package/dist/server/core/plugin-host/runtime-shims.js +96 -0
- package/dist/server/core/plugin-host/runtime-shims.js.map +1 -0
- package/dist/server/core/plugin-host/types.d.ts +105 -3
- package/dist/server/db/migrations/042_chat_thread_drop_context_type_check.sql +61 -0
- package/dist/server/external-skills/brief-implementer-template.d.ts +1 -1
- package/dist/server/external-skills/brief-implementer-template.js +5 -2
- package/dist/server/external-skills/brief-implementer-template.js.map +1 -1
- package/dist/server/external-skills/spec-reader-template.d.ts +1 -1
- package/dist/server/external-skills/spec-reader-template.js +14 -0
- package/dist/server/external-skills/spec-reader-template.js.map +1 -1
- package/dist/server/index.js +82 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/mcp/c4s-tools.d.ts +6 -1
- package/dist/server/mcp/c4s-tools.js +18 -13
- package/dist/server/mcp/c4s-tools.js.map +1 -1
- package/dist/server/plugin-runtime/index.d.ts +17 -0
- package/dist/server/plugin-runtime/index.js +16 -0
- package/dist/server/plugin-runtime/index.js.map +1 -0
- package/dist/server/plugin-runtime/ui.d.ts +15 -0
- package/dist/server/plugin-runtime/ui.js +15 -0
- package/dist/server/plugin-runtime/ui.js.map +1 -0
- package/dist/server/routes/agent-turn.d.ts +8 -1
- package/dist/server/routes/agent-turn.js +67 -39
- package/dist/server/routes/agent-turn.js.map +1 -1
- package/dist/server/routes/config.d.ts +8 -0
- package/dist/server/routes/config.js +41 -3
- package/dist/server/routes/config.js.map +1 -1
- package/dist/server/routes/plugins.d.ts +43 -0
- package/dist/server/routes/plugins.js +93 -0
- package/dist/server/routes/plugins.js.map +1 -0
- package/dist/server/routes/threads.js +21 -3
- package/dist/server/routes/threads.js.map +1 -1
- package/dist/server/serialization/registerAll.d.ts +4 -0
- package/dist/server/serialization/registerAll.js +4 -2
- package/dist/server/serialization/registerAll.js.map +1 -1
- package/dist/server/services/chat-context.d.ts +34 -0
- package/dist/server/services/chat-context.js +58 -15
- package/dist/server/services/chat-context.js.map +1 -1
- package/dist/server/services/chat.d.ts +6 -0
- package/dist/server/services/chat.js +18 -2
- package/dist/server/services/chat.js.map +1 -1
- package/dist/server/services/entity-writer.d.ts +2 -3
- package/dist/server/services/entity-writer.js.map +1 -1
- package/dist/server/services/skill-registry.d.ts +31 -2
- package/dist/server/services/skill-registry.js +73 -1
- package/dist/server/services/skill-registry.js.map +1 -1
- package/dist/server/workspace/context-cache.d.ts +9 -0
- package/dist/server/workspace/context-cache.js +14 -0
- package/dist/server/workspace/context-cache.js.map +1 -1
- package/dist/server/workspace/project-context.d.ts +3 -0
- package/dist/server/workspace/project-context.js +106 -4
- package/dist/server/workspace/project-context.js.map +1 -1
- package/dist/server/workspace/registry.d.ts +28 -1
- package/dist/server/workspace/registry.js +57 -1
- package/dist/server/workspace/registry.js.map +1 -1
- package/dist/server/workspace/types.d.ts +15 -0
- package/dist/shared/entities.d.ts +4 -1
- package/dist/shared/entities.js.map +1 -1
- package/dist/shared/plugin-host/frontend-manifest.d.ts +56 -0
- package/dist/shared/plugin-host/frontend-manifest.js +89 -0
- package/dist/shared/plugin-host/frontend-manifest.js.map +1 -0
- package/dist/shared/plugin-host/host-api.d.ts +60 -0
- package/dist/shared/plugin-host/host-api.js +67 -0
- package/dist/shared/plugin-host/host-api.js.map +1 -0
- package/dist/shared/plugin-host/manifest.d.ts +194 -0
- package/dist/shared/plugin-host/manifest.js +52 -0
- package/dist/shared/plugin-host/manifest.js.map +1 -0
- package/dist/shared/plugin-host/ui-kit-surface.d.ts +22 -0
- package/dist/shared/plugin-host/ui-kit-surface.js +25 -0
- package/dist/shared/plugin-host/ui-kit-surface.js.map +1 -0
- package/dist/shared/types.d.ts +5 -0
- package/package.json +18 -3
- package/dist/client/assets/channel-D5gzBvo7.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-CT-amIxa.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CT-amIxa.js +0 -1
- package/dist/client/assets/index-DyAnw7YN.js +0 -798
- 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":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EACL,eAAe,EACf,YAAY,EACZ,oBAAoB,GAErB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAUtF,MAAM,eAAe,GAAmB,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAazE,4DAA4D;AAC5D,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;AACnD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAW;IAClD,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,OAAoB,CAAC;IACzB,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QACnC,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1E,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,wBAAwB,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAY;IAC9C,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACxC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACtD,MAAM,GAAG,GAAG,GAA8B,CAAC;IAC3C,gFAAgF;IAChF,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACrB,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACxC,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAE,GAA+B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7F,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;QACrE,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,qFAAqF;AACrF,SAAS,YAAY,CAAC,MAAc;IAClC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACtD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAI1D,CAAC;YACF,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC;YACvE,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBACtC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,OAAO,GAAG,CAAC;YACrC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;IACH,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC;QAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACzC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;IACrC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAW,EACX,WAA2B,eAAe;IAE1C,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;IACjD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,MAAM,aAAa,GAA+B,EAAE,CAAC;IACrD,oEAAoE;IACpE,oEAAoE;IACpE,MAAM,gBAAgB,GAA4B,EAAE,CAAC;IACrD,MAAM,QAAQ,GAAgC,EAAE,CAAC;IACjD,MAAM,SAAS,GAAsB,EAAE,CAAC;IAExC,KAAK,MAAM,GAAG,IAAI,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACzD,MAAM,IAAI,GAAqB,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAE9G,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,kFAAkF,CAAC;YAClG,OAAO,CAAC,IAAI,CAAC,4CAA4C,GAAG,KAAK,MAAM,EAAE,CAAC,CAAC;YAC3E,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,yBAAyB,EAAE,MAAM,EAAE,CAAC,CAAC;YACrF,SAAS;QACX,CAAC;QAED,IAAI,GAAY,CAAC;QACjB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,MAAM,GAAI,GAAa,CAAC,OAAO,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,yCAAyC,GAAG,KAAK,MAAM,EAAE,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,CAAC,CAAC;YAClF,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,mEAAmE,CAAC;YACnF,OAAO,CAAC,IAAI,CAAC,4CAA4C,GAAG,KAAK,MAAM,EAAE,CAAC,CAAC;YAC3E,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,yBAAyB,EAAE,MAAM,EAAE,CAAC,CAAC;YACrF,SAAS;QACX,CAAC;QAED,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,IAAI,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC;gBACX,GAAG,IAAI;gBACP,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,YAAY,EAAE,QAAQ,CAAC,IAAI;gBAC3B,eAAe,EAAE,QAAQ,CAAC,OAAO;aAClC,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,yEAAyE;QACzE,4CAA4C;QAC5C,IAAI,OAAwB,CAAC;QAC7B,IAAI,MAAkC,CAAC;QACvC,IAAI,CAAC;YACH,OAAO,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YAC9E,MAAM,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,aAAa,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QACjF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,MAAM,GAAI,GAAa,CAAC,OAAO,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,4CAA4C,GAAG,KAAK,MAAM,EAAE,CAAC,CAAC;YAC3E,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,yBAAyB,EAAE,MAAM,EAAE,CAAC,CAAC;YACrF,SAAS;QACX,CAAC;QAED,uDAAuD;QACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1D,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,SAAS,QAAQ,CAAC,IAAI,8DAA8D,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;YACtI,OAAO,CAAC,IAAI,CAAC,yCAAyC,GAAG,KAAK,MAAM,EAAE,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,CAAC,CAAC;YAClF,SAAS;QACX,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACvB,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACnC,CAAC;QACD,aAAa,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;QAC9B,0EAA0E;QAC1E,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,gBAAgB,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,MAAM,EAAE,QAAQ,CAAC,WAAY,CAAC,QAAS;aACxC,CAAC,CAAC;QACL,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;QACzD,IAAI,OAAO,QAAQ,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;YAChD,MAAM,EAAE,GAAG,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChD,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CACV,4BAA4B,QAAQ,CAAC,IAAI,mEAAmE,CAC7G,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,IAAI,CAAC;YACX,GAAG,IAAI;YACP,YAAY,EAAE,QAAQ,CAAC,IAAI;YAC3B,eAAe,EAAE,QAAQ,CAAC,OAAO;YACjC,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;IAED,6EAA6E;IAC7E,kEAAkE;IAClE,wEAAwE;IACxE,4EAA4E;IAC5E,2DAA2D;IAC3D,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,QAAQ,EAAE,CAAC;YACb,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,uDAAwD,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAChG,CAAC;QACH,CAAC;QACD,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,YAAY,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC,CAAC;IAEF,8EAA8E;IAC9E,yEAAyE;IACzE,sEAAsE;IACtE,+DAA+D;IAC/D,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;IACjE,CAAC;IAED,MAAM,OAAO,GAAyB;QACpC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC7C,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE;QAC9C,YAAY,EAAE,GAAG,EAAE,CAAC,gBAAgB;QACpC,YAAY,EAAE,GAAG,EAAE,CAAC,QAAQ;KAC7B,CAAC;IAEF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;AACtD,CAAC"}
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
79
|
+
return this.getAvailable(type);
|
|
41
80
|
}
|
|
42
81
|
getAvailable(type) {
|
|
43
|
-
|
|
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.
|
|
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":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"project-host.js","sourceRoot":"","sources":["../../../../src/server/core/plugin-host/project-host.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwBH,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAE5F,MAAM,OAAO,qBAAqB;IAUb;IAEA;IAXX,WAAW,GAAuB,IAAI,CAAC,CAAC,oBAAoB;IAC5D,YAAY,GAAa,EAAE,CAAC;IAC5B,kBAAkB,GAAG,IAAI,GAAG,EAAmC,CAAC;IAChE,cAAc,GAAG,IAAI,GAAG,EAAmB,CAAC;IACpD,mEAAmE;IACnE,4DAA4D;IAC3C,cAAc,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEnE,YACmB,QAAwB,EACzC,eAA4C,EAC3B,OAA8B;QAF9B,aAAQ,GAAR,QAAQ,CAAgB;QAExB,YAAO,GAAP,OAAO,CAAuB;QAE/C,yEAAyE;QACzE,uEAAuE;QACvE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,eAAe,IAAI,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,uEAAuE;QACvE,wDAAwD;QACxD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;QACjC,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;YACnC,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;;gBACzC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;QAC1B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;IAC9B,CAAC;IAED,aAAa;QACX,kEAAkE;QAClE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;QAChD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE;YAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACrE,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,cAAc;YAAE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACjE,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;IACrF,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,YAAY;QACV,gEAAgE;QAChE,4EAA4E;QAC5E,yEAAyE;QACzE,yEAAyE;QACzE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiC,CAAC;QACxD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,EAAE,CAAC;YAClD,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC;YACzD,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,YAAY;QACV,yEAAyE;QACzE,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACtC,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,YAAY,CAAC,IAAY;QACvB,iDAAiD;QACjD,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IACnF,CAAC;IAED,QAAQ,CAAC,IAAY;QACnB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3C,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QAC1C,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,SAAS;QACP,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE;aAClC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aACrC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;IAC/D,CAAC;IAED,YAAY;QACV,MAAM,GAAG,GAAmB,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC;YAC9C,yEAAyE;YACzE,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,YAAY,CAAC,GAAiB;QAC5B,uEAAuE;QACvE,mEAAmE;QACnE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACpC,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,iBAAiB,CAAC,IAAY,EAAE,OAAgC;QAC9D,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,eAAe;QACb,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7E,IAAI;YACJ,MAAM,EAAE,OAAO,EAAE;SAClB,CAAC,CAAC,CAAC;IACN,CAAC;IAED,iBAAiB;QACf,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;IAClC,CAAC;IAED,YAAY,CAAC,IAAY,EAAE,IAAY;QACrC,qEAAqE;QACrE,mEAAmE;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAE/B,CAAC;QACd,OAAO,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IACtE,CAAC;IAED,qBAAqB,CAAC,IAAY,EAAE,OAAgB;QAClD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,gBAAgB,CAAC,IAAY;QAC3B,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAC/C,CAAC;IAED,4EAA4E;IAE5E,QAAQ,CAAC,IAAY,EAAE,MAAe,EAAE,GAAqB;QAC3D,OAAO,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,CAAC,IAAY,EAAE,IAAkB,EAAE,GAAmB;QAC3D,OAAO,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,CAAe,EAAE,CAAe,EAAE,IAAY;QAC/D,OAAO,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,mBAAmB,CAAC,EAAY;QAC9B,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC;YAC9C,IAAI,CAAC,GAAG;gBAAE,SAAS;YACnB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAoC,CAAC;gBACpE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,KAAK,IAAI,CAAC,CAAC;YACnC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CACV,sEAAsE,CAAC,CAAC,IAAI,KAAM,GAAa,CAAC,OAAO,EAAE,CAC1G,CAAC;gBACF,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -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(
|
|
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(
|
|
23
|
-
return new ProjectPluginHostImpl(this,
|
|
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
|
|
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":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,sBAAsB,EACtB,2BAA2B,EAC3B,8BAA8B,GAC/B,MAAM,kDAAkD,CAAC;AAG1D,0EAA0E;AAC1E,MAAM,CAAC,MAAM,SAAS,GAAwC;IAC5D,KAAK,EAAE,OAAO;IACd,mBAAmB,EAAE,mBAAmB;IACxC,uBAAuB,EAAE,uBAAuB;IAChD,WAAW,EAAE,WAAW;IACxB,kBAAkB,EAAE,kBAAkB;IACtC,cAAc,EAAE,aAAa;IAC7B,uBAAuB,EAAE,aAAa;IACtC,wBAAwB,EAAE,cAAc;IACxC,qBAAqB,EAAE,gBAAgB;IACvC,wBAAwB,EAAE,mBAAmB;CAC9C,CAAC;AAEF,MAAM,SAAS,GAAwC,MAAM,CAAC,WAAW,CACvE,sBAAsB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CACvB,CAAC;AAEzC;;;;GAIG;AACH,MAAM,sBAAsB,GAAsB,2BAA2B,CAAC;AAC9E,MAAM,yBAAyB,GAAsB,8BAA8B,CAAC;AAEpF,8EAA8E;AAC9E,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,sBAAsB,EAAE,CAAC;QAC1C,GAAG,CAAC,IAAI,CAAC,GAAG,wBAAwB,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;IAC3D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,KAAK,GAAG,4BAA4B,CAAC;AAE3C,SAAS,gBAAgB,CAAC,SAAiB,EAAE,KAAe;IAC1D,MAAM,QAAQ,GAAG,2BAA2B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC;IACzE,MAAM,KAAK,GAAG;QACZ,8CAA8C,SAAS,IAAI;QAC3D,eAAe,QAAQ,GAAG;QAC1B,4EAA4E,SAAS,iDAAiD;QACtI,wEAAwE;KACzE,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,YAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAC/E,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,UAAU,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE5C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5B,IAAI,KAAe,CAAC;IACpB,IAAI,SAAS,KAAK,qBAAqB,EAAE,CAAC;QACxC,KAAK,GAAG,CAAC,GAAG,sBAAsB,CAAC,CAAC;IACtC,CAAC;SAAM,IAAI,SAAS,KAAK,wBAAwB,EAAE,CAAC;QAClD,KAAK,GAAG,CAAC,GAAG,yBAAyB,CAAC,CAAC;IACzC,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAA4B,CAAC;YAChE,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CACV,0CAA0C,SAAS,uBAAwB,GAAa,CAAC,OAAO,EAAE,CACnG,CAAC;YACF,KAAK,GAAG,EAAE,CAAC;QACb,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAClD,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC;AAChB,CAAC"}
|