@moxxy/core 0.3.0

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 (332) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +125 -0
  3. package/dist/events/factory.d.ts +6 -0
  4. package/dist/events/factory.d.ts.map +1 -0
  5. package/dist/events/factory.js +14 -0
  6. package/dist/events/factory.js.map +1 -0
  7. package/dist/events/log.d.ts +92 -0
  8. package/dist/events/log.d.ts.map +1 -0
  9. package/dist/events/log.js +244 -0
  10. package/dist/events/log.js.map +1 -0
  11. package/dist/index.d.ts +40 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +41 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/logger.d.ts +16 -0
  16. package/dist/logger.d.ts.map +1 -0
  17. package/dist/logger.js +27 -0
  18. package/dist/logger.js.map +1 -0
  19. package/dist/permissions/engine.d.ts +94 -0
  20. package/dist/permissions/engine.d.ts.map +1 -0
  21. package/dist/permissions/engine.js +203 -0
  22. package/dist/permissions/engine.js.map +1 -0
  23. package/dist/permissions/resolvers.d.ts +8 -0
  24. package/dist/permissions/resolvers.d.ts.map +1 -0
  25. package/dist/permissions/resolvers.js +8 -0
  26. package/dist/permissions/resolvers.js.map +1 -0
  27. package/dist/plugins/discovery.d.ts +9 -0
  28. package/dist/plugins/discovery.d.ts.map +1 -0
  29. package/dist/plugins/discovery.js +112 -0
  30. package/dist/plugins/discovery.js.map +1 -0
  31. package/dist/plugins/host-options.d.ts +72 -0
  32. package/dist/plugins/host-options.d.ts.map +1 -0
  33. package/dist/plugins/host-options.js +2 -0
  34. package/dist/plugins/host-options.js.map +1 -0
  35. package/dist/plugins/host.d.ts +53 -0
  36. package/dist/plugins/host.d.ts.map +1 -0
  37. package/dist/plugins/host.js +269 -0
  38. package/dist/plugins/host.js.map +1 -0
  39. package/dist/plugins/lifecycle.d.ts +31 -0
  40. package/dist/plugins/lifecycle.d.ts.map +1 -0
  41. package/dist/plugins/lifecycle.js +100 -0
  42. package/dist/plugins/lifecycle.js.map +1 -0
  43. package/dist/plugins/loader.d.ts +7 -0
  44. package/dist/plugins/loader.d.ts.map +1 -0
  45. package/dist/plugins/loader.js +68 -0
  46. package/dist/plugins/loader.js.map +1 -0
  47. package/dist/plugins/package-requirements.d.ts +16 -0
  48. package/dist/plugins/package-requirements.d.ts.map +1 -0
  49. package/dist/plugins/package-requirements.js +52 -0
  50. package/dist/plugins/package-requirements.js.map +1 -0
  51. package/dist/plugins/registry-kinds.d.ts +58 -0
  52. package/dist/plugins/registry-kinds.d.ts.map +1 -0
  53. package/dist/plugins/registry-kinds.js +139 -0
  54. package/dist/plugins/registry-kinds.js.map +1 -0
  55. package/dist/plugins/toposort.d.ts +24 -0
  56. package/dist/plugins/toposort.d.ts.map +1 -0
  57. package/dist/plugins/toposort.js +67 -0
  58. package/dist/plugins/toposort.js.map +1 -0
  59. package/dist/preferences.d.ts +40 -0
  60. package/dist/preferences.d.ts.map +1 -0
  61. package/dist/preferences.js +58 -0
  62. package/dist/preferences.js.map +1 -0
  63. package/dist/registries/active-backend-registry.d.ts +65 -0
  64. package/dist/registries/active-backend-registry.d.ts.map +1 -0
  65. package/dist/registries/active-backend-registry.js +108 -0
  66. package/dist/registries/active-backend-registry.js.map +1 -0
  67. package/dist/registries/active-def-registry.d.ts +59 -0
  68. package/dist/registries/active-def-registry.d.ts.map +1 -0
  69. package/dist/registries/active-def-registry.js +63 -0
  70. package/dist/registries/active-def-registry.js.map +1 -0
  71. package/dist/registries/agents.d.ts +16 -0
  72. package/dist/registries/agents.d.ts.map +1 -0
  73. package/dist/registries/agents.js +17 -0
  74. package/dist/registries/agents.js.map +1 -0
  75. package/dist/registries/cache-strategies.d.ts +12 -0
  76. package/dist/registries/cache-strategies.d.ts.map +1 -0
  77. package/dist/registries/cache-strategies.js +13 -0
  78. package/dist/registries/cache-strategies.js.map +1 -0
  79. package/dist/registries/channels.d.ts +16 -0
  80. package/dist/registries/channels.d.ts.map +1 -0
  81. package/dist/registries/channels.js +35 -0
  82. package/dist/registries/channels.js.map +1 -0
  83. package/dist/registries/commands.d.ts +29 -0
  84. package/dist/registries/commands.d.ts.map +1 -0
  85. package/dist/registries/commands.js +72 -0
  86. package/dist/registries/commands.js.map +1 -0
  87. package/dist/registries/compactors.d.ts +12 -0
  88. package/dist/registries/compactors.d.ts.map +1 -0
  89. package/dist/registries/compactors.js +13 -0
  90. package/dist/registries/compactors.js.map +1 -0
  91. package/dist/registries/def-map-registry.d.ts +33 -0
  92. package/dist/registries/def-map-registry.d.ts.map +1 -0
  93. package/dist/registries/def-map-registry.js +36 -0
  94. package/dist/registries/def-map-registry.js.map +1 -0
  95. package/dist/registries/embedders.d.ts +16 -0
  96. package/dist/registries/embedders.d.ts.map +1 -0
  97. package/dist/registries/embedders.js +17 -0
  98. package/dist/registries/embedders.js.map +1 -0
  99. package/dist/registries/isolators.d.ts +21 -0
  100. package/dist/registries/isolators.d.ts.map +1 -0
  101. package/dist/registries/isolators.js +32 -0
  102. package/dist/registries/isolators.js.map +1 -0
  103. package/dist/registries/modes.d.ts +28 -0
  104. package/dist/registries/modes.d.ts.map +1 -0
  105. package/dist/registries/modes.js +81 -0
  106. package/dist/registries/modes.js.map +1 -0
  107. package/dist/registries/providers.d.ts +44 -0
  108. package/dist/registries/providers.d.ts.map +1 -0
  109. package/dist/registries/providers.js +95 -0
  110. package/dist/registries/providers.js.map +1 -0
  111. package/dist/registries/skills.d.ts +24 -0
  112. package/dist/registries/skills.d.ts.map +1 -0
  113. package/dist/registries/skills.js +81 -0
  114. package/dist/registries/skills.js.map +1 -0
  115. package/dist/registries/surfaces.d.ts +13 -0
  116. package/dist/registries/surfaces.d.ts.map +1 -0
  117. package/dist/registries/surfaces.js +14 -0
  118. package/dist/registries/surfaces.js.map +1 -0
  119. package/dist/registries/synthesizers.d.ts +26 -0
  120. package/dist/registries/synthesizers.d.ts.map +1 -0
  121. package/dist/registries/synthesizers.js +34 -0
  122. package/dist/registries/synthesizers.js.map +1 -0
  123. package/dist/registries/tools.d.ts +49 -0
  124. package/dist/registries/tools.d.ts.map +1 -0
  125. package/dist/registries/tools.js +98 -0
  126. package/dist/registries/tools.js.map +1 -0
  127. package/dist/registries/transcribers.d.ts +17 -0
  128. package/dist/registries/transcribers.d.ts.map +1 -0
  129. package/dist/registries/transcribers.js +18 -0
  130. package/dist/registries/transcribers.js.map +1 -0
  131. package/dist/registries/tunnel-providers.d.ts +12 -0
  132. package/dist/registries/tunnel-providers.d.ts.map +1 -0
  133. package/dist/registries/tunnel-providers.js +13 -0
  134. package/dist/registries/tunnel-providers.js.map +1 -0
  135. package/dist/registries/view-renderers.d.ts +13 -0
  136. package/dist/registries/view-renderers.d.ts.map +1 -0
  137. package/dist/registries/view-renderers.js +14 -0
  138. package/dist/registries/view-renderers.js.map +1 -0
  139. package/dist/registries/workflow-executors.d.ts +13 -0
  140. package/dist/registries/workflow-executors.d.ts.map +1 -0
  141. package/dist/registries/workflow-executors.js +14 -0
  142. package/dist/registries/workflow-executors.js.map +1 -0
  143. package/dist/requirements.d.ts +59 -0
  144. package/dist/requirements.d.ts.map +1 -0
  145. package/dist/requirements.js +149 -0
  146. package/dist/requirements.js.map +1 -0
  147. package/dist/run-turn.d.ts +6 -0
  148. package/dist/run-turn.d.ts.map +1 -0
  149. package/dist/run-turn.js +141 -0
  150. package/dist/run-turn.js.map +1 -0
  151. package/dist/session-runtime.d.ts +67 -0
  152. package/dist/session-runtime.d.ts.map +1 -0
  153. package/dist/session-runtime.js +2 -0
  154. package/dist/session-runtime.js.map +1 -0
  155. package/dist/session.d.ts +203 -0
  156. package/dist/session.d.ts.map +1 -0
  157. package/dist/session.js +399 -0
  158. package/dist/session.js.map +1 -0
  159. package/dist/sessions/persistence.d.ts +184 -0
  160. package/dist/sessions/persistence.d.ts.map +1 -0
  161. package/dist/sessions/persistence.js +442 -0
  162. package/dist/sessions/persistence.js.map +1 -0
  163. package/dist/setup-agent.d.ts +91 -0
  164. package/dist/setup-agent.d.ts.map +1 -0
  165. package/dist/setup-agent.js +138 -0
  166. package/dist/setup-agent.js.map +1 -0
  167. package/dist/skills/index.d.ts +4 -0
  168. package/dist/skills/index.d.ts.map +1 -0
  169. package/dist/skills/index.js +4 -0
  170. package/dist/skills/index.js.map +1 -0
  171. package/dist/skills/loader.d.ts +16 -0
  172. package/dist/skills/loader.d.ts.map +1 -0
  173. package/dist/skills/loader.js +99 -0
  174. package/dist/skills/loader.js.map +1 -0
  175. package/dist/skills/parse.d.ts +5 -0
  176. package/dist/skills/parse.d.ts.map +1 -0
  177. package/dist/skills/parse.js +8 -0
  178. package/dist/skills/parse.js.map +1 -0
  179. package/dist/skills/synthesize-draft.d.ts +8 -0
  180. package/dist/skills/synthesize-draft.d.ts.map +1 -0
  181. package/dist/skills/synthesize-draft.js +32 -0
  182. package/dist/skills/synthesize-draft.js.map +1 -0
  183. package/dist/skills/synthesize.d.ts +33 -0
  184. package/dist/skills/synthesize.d.ts.map +1 -0
  185. package/dist/skills/synthesize.js +241 -0
  186. package/dist/skills/synthesize.js.map +1 -0
  187. package/dist/subagents/events.d.ts +20 -0
  188. package/dist/subagents/events.d.ts.map +1 -0
  189. package/dist/subagents/events.js +146 -0
  190. package/dist/subagents/events.js.map +1 -0
  191. package/dist/subagents/registry.d.ts +40 -0
  192. package/dist/subagents/registry.d.ts.map +1 -0
  193. package/dist/subagents/registry.js +42 -0
  194. package/dist/subagents/registry.js.map +1 -0
  195. package/dist/subagents/run-child.d.ts +43 -0
  196. package/dist/subagents/run-child.d.ts.map +1 -0
  197. package/dist/subagents/run-child.js +276 -0
  198. package/dist/subagents/run-child.js.map +1 -0
  199. package/dist/subagents/spawn.d.ts +8 -0
  200. package/dist/subagents/spawn.d.ts.map +1 -0
  201. package/dist/subagents/spawn.js +8 -0
  202. package/dist/subagents/spawn.js.map +1 -0
  203. package/dist/subagents/tools.d.ts +4 -0
  204. package/dist/subagents/tools.d.ts.map +1 -0
  205. package/dist/subagents/tools.js +13 -0
  206. package/dist/subagents/tools.js.map +1 -0
  207. package/dist/subagents.d.ts +3 -0
  208. package/dist/subagents.d.ts.map +1 -0
  209. package/dist/subagents.js +3 -0
  210. package/dist/subagents.js.map +1 -0
  211. package/dist/surfaces/host.d.ts +53 -0
  212. package/dist/surfaces/host.d.ts.map +1 -0
  213. package/dist/surfaces/host.js +177 -0
  214. package/dist/surfaces/host.js.map +1 -0
  215. package/dist/tunnel/localhost.d.ts +7 -0
  216. package/dist/tunnel/localhost.d.ts.map +1 -0
  217. package/dist/tunnel/localhost.js +21 -0
  218. package/dist/tunnel/localhost.js.map +1 -0
  219. package/dist/usage-stats.d.ts +42 -0
  220. package/dist/usage-stats.d.ts.map +1 -0
  221. package/dist/usage-stats.js +83 -0
  222. package/dist/usage-stats.js.map +1 -0
  223. package/dist/view/default-renderer.d.ts +7 -0
  224. package/dist/view/default-renderer.d.ts.map +1 -0
  225. package/dist/view/default-renderer.js +14 -0
  226. package/dist/view/default-renderer.js.map +1 -0
  227. package/dist/view/parse.d.ts +7 -0
  228. package/dist/view/parse.d.ts.map +1 -0
  229. package/dist/view/parse.js +479 -0
  230. package/dist/view/parse.js.map +1 -0
  231. package/package.json +61 -0
  232. package/src/events/factory.ts +27 -0
  233. package/src/events/log.test.ts +470 -0
  234. package/src/events/log.ts +256 -0
  235. package/src/index.ts +102 -0
  236. package/src/logger.ts +46 -0
  237. package/src/permissions/engine.test.ts +206 -0
  238. package/src/permissions/engine.ts +247 -0
  239. package/src/permissions/resolvers.test.ts +40 -0
  240. package/src/permissions/resolvers.ts +17 -0
  241. package/src/plugins/discovery.test.ts +115 -0
  242. package/src/plugins/discovery.ts +124 -0
  243. package/src/plugins/host-options.ts +73 -0
  244. package/src/plugins/host-view-tunnel.test.ts +86 -0
  245. package/src/plugins/host.test.ts +434 -0
  246. package/src/plugins/host.ts +327 -0
  247. package/src/plugins/lifecycle.test.ts +187 -0
  248. package/src/plugins/lifecycle.ts +136 -0
  249. package/src/plugins/loader.ts +79 -0
  250. package/src/plugins/package-requirements.ts +50 -0
  251. package/src/plugins/registry-kinds.test.ts +162 -0
  252. package/src/plugins/registry-kinds.ts +210 -0
  253. package/src/plugins/toposort.test.ts +66 -0
  254. package/src/plugins/toposort.ts +69 -0
  255. package/src/preferences.test.ts +105 -0
  256. package/src/preferences.ts +84 -0
  257. package/src/registries/active-backend-registry.ts +142 -0
  258. package/src/registries/active-def-registry.test.ts +103 -0
  259. package/src/registries/active-def-registry.ts +97 -0
  260. package/src/registries/agents.ts +18 -0
  261. package/src/registries/cache-strategies.ts +14 -0
  262. package/src/registries/channels.ts +42 -0
  263. package/src/registries/commands.test.ts +71 -0
  264. package/src/registries/commands.ts +78 -0
  265. package/src/registries/compactors.ts +14 -0
  266. package/src/registries/def-map-registry.test.ts +67 -0
  267. package/src/registries/def-map-registry.ts +59 -0
  268. package/src/registries/embedders.test.ts +54 -0
  269. package/src/registries/embedders.ts +18 -0
  270. package/src/registries/isolators.test.ts +43 -0
  271. package/src/registries/isolators.ts +38 -0
  272. package/src/registries/modes.test.ts +66 -0
  273. package/src/registries/modes.ts +80 -0
  274. package/src/registries/providers.test.ts +50 -0
  275. package/src/registries/providers.ts +97 -0
  276. package/src/registries/semantics.test.ts +117 -0
  277. package/src/registries/skills.ts +87 -0
  278. package/src/registries/surfaces.ts +18 -0
  279. package/src/registries/synthesizers.test.ts +63 -0
  280. package/src/registries/synthesizers.ts +36 -0
  281. package/src/registries/tools.test.ts +142 -0
  282. package/src/registries/tools.ts +145 -0
  283. package/src/registries/transcribers.test.ts +70 -0
  284. package/src/registries/transcribers.ts +19 -0
  285. package/src/registries/tunnel-providers.test.ts +30 -0
  286. package/src/registries/tunnel-providers.ts +14 -0
  287. package/src/registries/view-renderers.test.ts +68 -0
  288. package/src/registries/view-renderers.ts +15 -0
  289. package/src/registries/workflow-executors.test.ts +53 -0
  290. package/src/registries/workflow-executors.ts +15 -0
  291. package/src/requirements.targetinfo.test.ts +70 -0
  292. package/src/requirements.test.ts +111 -0
  293. package/src/requirements.ts +262 -0
  294. package/src/run-turn.test.ts +178 -0
  295. package/src/run-turn.ts +156 -0
  296. package/src/session-runtime.ts +75 -0
  297. package/src/session.test.ts +216 -0
  298. package/src/session.ts +491 -0
  299. package/src/sessions/persistence.flush.test.ts +100 -0
  300. package/src/sessions/persistence.ready.test.ts +91 -0
  301. package/src/sessions/persistence.test.ts +274 -0
  302. package/src/sessions/persistence.ts +498 -0
  303. package/src/setup-agent.test.ts +72 -0
  304. package/src/setup-agent.ts +189 -0
  305. package/src/skills/index.ts +14 -0
  306. package/src/skills/loader.test.ts +102 -0
  307. package/src/skills/loader.ts +114 -0
  308. package/src/skills/parse.test.ts +59 -0
  309. package/src/skills/parse.ts +11 -0
  310. package/src/skills/synthesize-draft.test.ts +79 -0
  311. package/src/skills/synthesize-draft.ts +46 -0
  312. package/src/skills/synthesize.test.ts +170 -0
  313. package/src/skills/synthesize.ts +304 -0
  314. package/src/subagents/events.test.ts +56 -0
  315. package/src/subagents/events.ts +194 -0
  316. package/src/subagents/registry.ts +62 -0
  317. package/src/subagents/run-child.test.ts +185 -0
  318. package/src/subagents/run-child.ts +425 -0
  319. package/src/subagents/spawn.ts +12 -0
  320. package/src/subagents/tools.ts +19 -0
  321. package/src/subagents.ts +2 -0
  322. package/src/surfaces/host.test.ts +330 -0
  323. package/src/surfaces/host.ts +192 -0
  324. package/src/tunnel/localhost.test.ts +22 -0
  325. package/src/tunnel/localhost.ts +21 -0
  326. package/src/usage-stats.test.ts +77 -0
  327. package/src/usage-stats.ts +119 -0
  328. package/src/view/default-renderer.test.ts +29 -0
  329. package/src/view/default-renderer.ts +14 -0
  330. package/src/view/parse-extended.test.ts +255 -0
  331. package/src/view/parse.test.ts +232 -0
  332. package/src/view/parse.ts +520 -0
@@ -0,0 +1,53 @@
1
+ import type { MoxxyRequirement, Plugin, PluginHostHandle, RequirementCheck, RequirementIssue, ResolvedPluginManifest } from '@moxxy/sdk';
2
+ import type { PluginHostOptions, PluginLoader } from './host-options.js';
3
+ export type { PluginHostOptions, PluginLoader };
4
+ export interface RegisterStaticOptions {
5
+ /**
6
+ * Static requirements to enforce before registration. Mirrors the
7
+ * `moxxy.requirements` field a discovered plugin's package.json would
8
+ * carry; passed explicitly here because statically-imported builtins
9
+ * don't go through `discoverPlugins()`.
10
+ */
11
+ readonly requirements?: ReadonlyArray<MoxxyRequirement>;
12
+ }
13
+ export type PluginSkipSource = 'static' | 'discovered';
14
+ export type PluginSkipReason = 'unmet_requirements' | 'load_error';
15
+ export interface PluginSkipRecord {
16
+ readonly pluginName: string;
17
+ readonly source: PluginSkipSource;
18
+ readonly reason: PluginSkipReason;
19
+ readonly message: string;
20
+ readonly packageName?: string;
21
+ readonly issues?: ReadonlyArray<RequirementIssue>;
22
+ readonly hints: ReadonlyArray<string>;
23
+ }
24
+ export declare class PluginRequirementError extends Error {
25
+ readonly pluginName: string;
26
+ readonly check: RequirementCheck;
27
+ constructor(pluginName: string, check: RequirementCheck);
28
+ }
29
+ export declare class PluginHost implements PluginHostHandle {
30
+ private readonly opts;
31
+ private readonly loaded;
32
+ private readonly skipped;
33
+ constructor(opts: PluginHostOptions);
34
+ list(): ReadonlyArray<{
35
+ name: string;
36
+ version: string;
37
+ loaded: boolean;
38
+ kinds: ReadonlyArray<string>;
39
+ }>;
40
+ listSkipped(): ReadonlyArray<PluginSkipRecord>;
41
+ registerStatic(plugin: Plugin, opts?: RegisterStaticOptions): void;
42
+ registerDiscovered(plugin: Plugin, manifest: ResolvedPluginManifest): void;
43
+ discoverAndLoad(extraPaths?: ReadonlyArray<string>): Promise<ReadonlyArray<Plugin>>;
44
+ unload(name: string): Promise<void>;
45
+ reload(): Promise<void>;
46
+ private applyPlugin;
47
+ private assertRequirementsReady;
48
+ private refreshDispatcher;
49
+ private recordRequirementSkip;
50
+ private recordLoadError;
51
+ private clearSkip;
52
+ }
53
+ //# sourceMappingURL=host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/plugins/host.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,MAAM,EACN,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AASpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACzE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAC;AAEhD,MAAM,WAAW,qBAAqB;IACpC;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC;CACzD;AAED,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,YAAY,CAAC;AACvD,MAAM,MAAM,gBAAgB,GAAG,oBAAoB,GAAG,YAAY,CAAC;AAEnE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC;IAClD,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACvC;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAE7C,QAAQ,CAAC,UAAU,EAAE,MAAM;IAC3B,QAAQ,CAAC,KAAK,EAAE,gBAAgB;gBADvB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,gBAAgB;CAUnC;AAOD,qBAAa,UAAW,YAAW,gBAAgB;IAIrC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAC1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;gBAElC,IAAI,EAAE,iBAAiB;IAEpD,IAAI,IAAI,aAAa,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,OAAO,CAAC;QAChB,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;KAC9B,CAAC;IASF,WAAW,IAAI,aAAa,CAAC,gBAAgB,CAAC;IAI9C,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,qBAA0B,GAAG,IAAI;IAYtE,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,sBAAsB,GAAG,IAAI;IA2BpE,eAAe,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAuDnF,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBnC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB7B,OAAO,CAAC,WAAW;IAuBnB,OAAO,CAAC,uBAAuB;IAc/B,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,qBAAqB;IAkB7B,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,SAAS;CAGlB"}
@@ -0,0 +1,269 @@
1
+ import { discoverPlugins } from './discovery.js';
2
+ import { toposortPluginManifests, PluginCycleError } from './toposort.js';
3
+ import { REGISTRY_KINDS } from './registry-kinds.js';
4
+ export class PluginRequirementError extends Error {
5
+ pluginName;
6
+ check;
7
+ constructor(pluginName, check) {
8
+ super(check.issues
9
+ .filter((issue) => !issue.requirement.optional)
10
+ .map((issue) => issue.message)
11
+ .join('; '));
12
+ this.pluginName = pluginName;
13
+ this.check = check;
14
+ this.name = 'PluginRequirementError';
15
+ }
16
+ }
17
+ export class PluginHost {
18
+ opts;
19
+ loaded = new Map();
20
+ skipped = new Map();
21
+ constructor(opts) {
22
+ this.opts = opts;
23
+ }
24
+ list() {
25
+ return [...this.loaded.values()].map((r) => ({
26
+ name: r.plugin.name,
27
+ version: r.plugin.version,
28
+ loaded: true,
29
+ kinds: contributionKinds(r),
30
+ }));
31
+ }
32
+ listSkipped() {
33
+ return [...this.skipped.values()];
34
+ }
35
+ registerStatic(plugin, opts = {}) {
36
+ if (this.loaded.has(plugin.name)) {
37
+ throw new Error(`Plugin already registered: ${plugin.name}`);
38
+ }
39
+ this.assertRequirementsReady(plugin, opts.requirements, 'static');
40
+ const record = this.applyPlugin(plugin);
41
+ this.loaded.set(plugin.name, record);
42
+ this.clearSkip(plugin.name);
43
+ this.opts.requirements.registerPlugin(plugin.name, plugin.version);
44
+ this.refreshDispatcher();
45
+ }
46
+ registerDiscovered(plugin, manifest) {
47
+ // Key the loaded map by the PACKAGE name — not the plugin's declared
48
+ // `name` — so it lines up with `discoverAndLoad`'s dedupe check, `reload`'s
49
+ // `wanted` set, and `unload(packageName)` callers (self-update, config,
50
+ // plugins-admin). Keying by `plugin.name` silently broke all three whenever
51
+ // a plugin's declared name differed from its package name (re-load throws,
52
+ // reload unloads everything, unload no-ops).
53
+ if (this.loaded.has(manifest.packageName)) {
54
+ throw new Error(`Plugin already registered: ${manifest.packageName}`);
55
+ }
56
+ this.assertRequirementsReady(plugin, manifest.requirements, 'discovered', manifest);
57
+ const record = this.applyPlugin(plugin, manifest);
58
+ this.loaded.set(manifest.packageName, record);
59
+ this.clearSkip(plugin.name);
60
+ this.clearSkip(manifest.packageName);
61
+ // Register the requirement under the PACKAGE name, not the declared
62
+ // plugin.name. `kind:'plugin'` requirements are resolved by package name —
63
+ // toposort keys `byPackage` by `manifest.packageName`, so the readiness
64
+ // gate (`requirements.plugins.get(name)`) must agree. Keying by plugin.name
65
+ // here meant a dependent's `{kind:'plugin', name:<packageName>}` would pass
66
+ // toposort ordering but fail the readiness gate whenever a plugin's
67
+ // declared name differed from its package name (host.ts documents that they
68
+ // can differ).
69
+ this.opts.requirements.registerPlugin(manifest.packageName, plugin.version);
70
+ this.refreshDispatcher();
71
+ }
72
+ async discoverAndLoad(extraPaths) {
73
+ const manifests = await discoverPlugins({
74
+ cwd: this.opts.cwd,
75
+ logger: this.opts.logger,
76
+ extraPaths,
77
+ });
78
+ const loaded = [];
79
+ const loader = this.opts.loader;
80
+ if (!loader) {
81
+ this.opts.logger.warn('PluginHost.discoverAndLoad called without a loader; static plugins only. Provide a loader (e.g. jiti loader) to enable dynamic discovery.');
82
+ return loaded;
83
+ }
84
+ let ordered;
85
+ try {
86
+ ordered = toposortPluginManifests(manifests);
87
+ }
88
+ catch (err) {
89
+ if (err instanceof PluginCycleError) {
90
+ this.opts.logger.warn('PluginHost: requirement cycle, falling back to unsorted order', {
91
+ cycle: err.cycle,
92
+ });
93
+ ordered = manifests;
94
+ }
95
+ else {
96
+ throw err;
97
+ }
98
+ }
99
+ for (const manifest of ordered) {
100
+ if (this.loaded.has(manifest.packageName))
101
+ continue;
102
+ // Honor a runtime/config disable: never load a package the user turned off.
103
+ if (this.opts.isDisabled?.(manifest.packageName))
104
+ continue;
105
+ try {
106
+ const plugin = await loader.load(manifest);
107
+ this.registerDiscovered(plugin, manifest);
108
+ loaded.push(plugin);
109
+ }
110
+ catch (err) {
111
+ if (err instanceof PluginRequirementError) {
112
+ this.opts.logger.warn('PluginHost: skipped plugin due to unmet requirements', {
113
+ package: manifest.packageName,
114
+ plugin: err.pluginName,
115
+ err: err.message,
116
+ });
117
+ continue;
118
+ }
119
+ this.recordLoadError(manifest.packageName, 'discovered', manifest.packageName, err);
120
+ this.opts.logger.warn('PluginHost: failed to load plugin', {
121
+ package: manifest.packageName,
122
+ err: err instanceof Error ? err.message : String(err),
123
+ });
124
+ }
125
+ }
126
+ this.refreshDispatcher();
127
+ return loaded;
128
+ }
129
+ async unload(name) {
130
+ const record = this.loaded.get(name);
131
+ if (!record)
132
+ return;
133
+ // Iterate REGISTRY_KINDS in its declared order — the exact set + order the
134
+ // original hand-written unregister sequence used — so register/unregister
135
+ // stay in lockstep and a new kind is one table entry, not edits here.
136
+ for (const kind of REGISTRY_KINDS) {
137
+ for (const recordedName of record[kind.recordField])
138
+ kind.unregister(this.opts, recordedName);
139
+ }
140
+ this.loaded.delete(name);
141
+ // Unregister under the SAME key registration used: package name for
142
+ // discovered plugins (see registerDiscovered), declared name for statics.
143
+ this.opts.requirements.unregisterPlugin(record.manifest?.packageName ?? record.plugin.name);
144
+ this.refreshDispatcher();
145
+ }
146
+ async reload() {
147
+ this.opts.logger.info('PluginHost.reload(): rescanning plugins');
148
+ // Reuse the same discovery roots the initial load used (incl. the user
149
+ // plugin dirs) for BOTH the "wanted" scan and the re-load. Omitting them
150
+ // would mark user plugins as not-wanted (→ unloaded) and never re-add them.
151
+ const manifests = await discoverPlugins({
152
+ cwd: this.opts.cwd,
153
+ logger: this.opts.logger,
154
+ ...(this.opts.userPaths ? { extraPaths: this.opts.userPaths } : {}),
155
+ });
156
+ // A disabled package is excluded from `wanted`, so the loop below unloads it
157
+ // if currently loaded and discoverAndLoad won't bring it back.
158
+ const wanted = new Set(manifests
159
+ .filter((m) => !this.opts.isDisabled?.(m.packageName))
160
+ .map((m) => m.packageName));
161
+ for (const [name] of [...this.loaded]) {
162
+ // Statically-registered builtins have no manifest; never unload them on
163
+ // reload — they aren't discovered from disk so they'd never come back.
164
+ if (this.loaded.get(name)?.manifest && !wanted.has(name))
165
+ await this.unload(name);
166
+ }
167
+ await this.discoverAndLoad(this.opts.userPaths);
168
+ }
169
+ applyPlugin(plugin, manifest) {
170
+ // Snapshot the contributed names BEFORE registering (same as the original
171
+ // two-phase order), keyed by REGISTRY_KINDS field. Building the names from
172
+ // the same table the registration loop uses keeps the two in lockstep.
173
+ const names = {};
174
+ for (const kind of REGISTRY_KINDS) {
175
+ names[kind.recordField] = kind.defs(plugin).map((def) => kind.nameOf(def));
176
+ }
177
+ // Register in REGISTRY_KINDS order — the exact set + order the original
178
+ // hand-written register sequence used (incl. viewRenderers/tunnelProviders
179
+ // via `replace`).
180
+ for (const kind of REGISTRY_KINDS) {
181
+ for (const def of kind.defs(plugin))
182
+ kind.register(this.opts, def);
183
+ }
184
+ return {
185
+ plugin,
186
+ manifest,
187
+ ...names,
188
+ };
189
+ }
190
+ assertRequirementsReady(plugin, requirements, source = 'static', manifest) {
191
+ if (!requirements || requirements.length === 0)
192
+ return;
193
+ const check = this.opts.requirements.check(requirements);
194
+ if (!check.ready) {
195
+ this.recordRequirementSkip(plugin, source, manifest, check);
196
+ throw new PluginRequirementError(plugin.name, check);
197
+ }
198
+ }
199
+ refreshDispatcher() {
200
+ this.opts.dispatcher.setPlugins([...this.loaded.values()].map((r) => r.plugin));
201
+ }
202
+ recordRequirementSkip(plugin, source, manifest, check) {
203
+ const blocking = check.issues.filter((issue) => !issue.requirement.optional);
204
+ this.skipped.set(skipKey(plugin.name), {
205
+ pluginName: plugin.name,
206
+ source,
207
+ reason: 'unmet_requirements',
208
+ message: blocking.map((issue) => issue.message).join('; '),
209
+ ...(manifest ? { packageName: manifest.packageName } : {}),
210
+ issues: check.issues,
211
+ hints: blocking.flatMap((issue) => issue.hint ? [issue.hint] : []),
212
+ });
213
+ }
214
+ recordLoadError(pluginName, source, packageName, err) {
215
+ this.skipped.set(skipKey(pluginName), {
216
+ pluginName,
217
+ source,
218
+ reason: 'load_error',
219
+ message: err instanceof Error ? err.message : String(err),
220
+ ...(packageName ? { packageName } : {}),
221
+ hints: [],
222
+ });
223
+ }
224
+ clearSkip(pluginName) {
225
+ this.skipped.delete(skipKey(pluginName));
226
+ }
227
+ }
228
+ function skipKey(pluginName) {
229
+ return pluginName;
230
+ }
231
+ /** The contribution categories a loaded plugin actually registered, in a
232
+ * stable order — lets a UI group plugins by kind (tabs in the picker). */
233
+ function contributionKinds(r) {
234
+ const kinds = [];
235
+ if (r.providerNames.length)
236
+ kinds.push('provider');
237
+ if (r.modeNames.length)
238
+ kinds.push('mode');
239
+ if (r.channelNames.length)
240
+ kinds.push('channel');
241
+ if (r.surfaceNames.length)
242
+ kinds.push('surface');
243
+ if (r.embedderNames.length)
244
+ kinds.push('embedder');
245
+ if (r.transcriberNames.length)
246
+ kinds.push('transcriber');
247
+ if (r.synthesizerNames.length)
248
+ kinds.push('synthesizer');
249
+ if (r.isolatorNames.length)
250
+ kinds.push('isolator');
251
+ if (r.compactorNames.length)
252
+ kinds.push('compactor');
253
+ if (r.cacheStrategyNames.length)
254
+ kinds.push('cacheStrategy');
255
+ if (r.viewRendererNames.length)
256
+ kinds.push('viewRenderer');
257
+ if (r.tunnelProviderNames.length)
258
+ kinds.push('tunnelProvider');
259
+ if (r.workflowExecutorNames.length)
260
+ kinds.push('workflowExecutor');
261
+ if (r.agentNames.length)
262
+ kinds.push('agent');
263
+ if (r.commandNames.length)
264
+ kinds.push('command');
265
+ if (r.toolNames.length)
266
+ kinds.push('tool');
267
+ return kinds;
268
+ }
269
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/plugins/host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { AppContext, HookDispatcher, LifecycleHooks, MoxxyEvent, Plugin, ProviderRequest, ToolCallContext, ToolCallVerdict, ToolResultContext, ToolResultEvent, TurnContext } from '@moxxy/sdk';
2
+ import type { Logger } from '../logger.js';
3
+ export interface DispatcherOptions {
4
+ readonly hookTimeoutMs?: number;
5
+ readonly logger: Logger;
6
+ readonly onHookFailed?: (err: Error, plugin: string, hook: keyof LifecycleHooks) => void;
7
+ }
8
+ export declare class HookDispatcherImpl implements HookDispatcher {
9
+ private entries;
10
+ private readonly timeoutMs;
11
+ private readonly logger;
12
+ private readonly onHookFailed?;
13
+ constructor(opts: DispatcherOptions);
14
+ setPlugins(plugins: ReadonlyArray<Plugin>): void;
15
+ /**
16
+ * Whether any registered plugin declares an `onEvent` hook. Lets the
17
+ * per-event fan-out skip building an AppContext (which clones the whole
18
+ * `process.env`) when no plugin would consume it — the common case.
19
+ */
20
+ hasEventHooks(): boolean;
21
+ dispatchInit(ctx: AppContext): Promise<void>;
22
+ dispatchTurnStart(ctx: TurnContext): Promise<void>;
23
+ dispatchBeforeProviderCall(req: ProviderRequest, ctx: TurnContext): Promise<ProviderRequest>;
24
+ dispatchToolCall(ctx: ToolCallContext): Promise<ToolCallVerdict>;
25
+ dispatchToolResult(ctx: ToolResultContext): Promise<ToolResultEvent>;
26
+ dispatchEvent(event: MoxxyEvent, ctx: AppContext): Promise<void>;
27
+ dispatchTurnEnd(ctx: TurnContext): Promise<void>;
28
+ dispatchShutdown(ctx: AppContext): Promise<void>;
29
+ private safe;
30
+ }
31
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/plugins/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,cAAc,EACd,UAAU,EACV,MAAM,EACN,eAAe,EACf,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,WAAW,EACZ,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAAc,KAAK,IAAI,CAAC;CAC1F;AAOD,qBAAa,kBAAmB,YAAW,cAAc;IACvD,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAoC;gBAEtD,IAAI,EAAE,iBAAiB;IAMnC,UAAU,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI;IAIhD;;;;OAIG;IACH,aAAa,IAAI,OAAO;IAIlB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,0BAA0B,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAW5F,gBAAgB,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAWhE,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC;IAWpE,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAMhE,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,gBAAgB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;YAIxC,IAAI;CA6BnB"}
@@ -0,0 +1,100 @@
1
+ export class HookDispatcherImpl {
2
+ entries = [];
3
+ timeoutMs;
4
+ logger;
5
+ onHookFailed;
6
+ constructor(opts) {
7
+ this.timeoutMs = opts.hookTimeoutMs ?? 5_000;
8
+ this.logger = opts.logger;
9
+ this.onHookFailed = opts.onHookFailed;
10
+ }
11
+ setPlugins(plugins) {
12
+ this.entries = plugins.map((plugin) => ({ plugin, hooks: plugin.hooks ?? {} }));
13
+ }
14
+ /**
15
+ * Whether any registered plugin declares an `onEvent` hook. Lets the
16
+ * per-event fan-out skip building an AppContext (which clones the whole
17
+ * `process.env`) when no plugin would consume it — the common case.
18
+ */
19
+ hasEventHooks() {
20
+ return this.entries.some((e) => typeof e.hooks.onEvent === 'function');
21
+ }
22
+ async dispatchInit(ctx) {
23
+ for (const e of this.entries)
24
+ await this.safe(e, 'onInit', () => e.hooks.onInit?.(ctx));
25
+ }
26
+ async dispatchTurnStart(ctx) {
27
+ for (const e of this.entries)
28
+ await this.safe(e, 'onTurnStart', () => e.hooks.onTurnStart?.(ctx));
29
+ }
30
+ async dispatchBeforeProviderCall(req, ctx) {
31
+ let current = req;
32
+ for (const e of this.entries) {
33
+ const next = await this.safe(e, 'onBeforeProviderCall', () => e.hooks.onBeforeProviderCall?.(current, ctx));
34
+ if (next)
35
+ current = next;
36
+ }
37
+ return current;
38
+ }
39
+ async dispatchToolCall(ctx) {
40
+ let verdict = { action: 'allow' };
41
+ for (const e of this.entries) {
42
+ const next = await this.safe(e, 'onToolCall', () => e.hooks.onToolCall?.(ctx));
43
+ if (!next)
44
+ continue;
45
+ if (next.action === 'deny')
46
+ return next;
47
+ if (next.action === 'rewrite')
48
+ verdict = next;
49
+ }
50
+ return verdict;
51
+ }
52
+ async dispatchToolResult(ctx) {
53
+ let result = ctx.result;
54
+ for (const e of this.entries) {
55
+ const next = await this.safe(e, 'onToolResult', () => e.hooks.onToolResult?.({ ...ctx, result }));
56
+ if (next)
57
+ result = next;
58
+ }
59
+ return result;
60
+ }
61
+ async dispatchEvent(event, ctx) {
62
+ for (const e of this.entries) {
63
+ await this.safe(e, 'onEvent', () => e.hooks.onEvent?.(event, ctx));
64
+ }
65
+ }
66
+ async dispatchTurnEnd(ctx) {
67
+ for (const e of this.entries)
68
+ await this.safe(e, 'onTurnEnd', () => e.hooks.onTurnEnd?.(ctx));
69
+ }
70
+ async dispatchShutdown(ctx) {
71
+ for (const e of this.entries)
72
+ await this.safe(e, 'onShutdown', () => e.hooks.onShutdown?.(ctx));
73
+ }
74
+ async safe(entry, hook, fn) {
75
+ let timer;
76
+ try {
77
+ const p = Promise.resolve(fn());
78
+ const timeout = new Promise((_, reject) => {
79
+ timer = setTimeout(() => reject(new Error(`Hook ${hook} on ${entry.plugin.name} timed out`)), this.timeoutMs);
80
+ });
81
+ // Attach a no-op rejection handler to the timeout promise so if the
82
+ // fast path wins, the timer's eventual rejection is swallowed
83
+ // silently rather than surfacing as an unhandled rejection.
84
+ timeout.catch(() => undefined);
85
+ const winner = await Promise.race([p, timeout]);
86
+ return winner;
87
+ }
88
+ catch (err) {
89
+ const error = err instanceof Error ? err : new Error(String(err));
90
+ this.logger.warn('hook failed', { plugin: entry.plugin.name, hook, err: error.message });
91
+ this.onHookFailed?.(error, entry.plugin.name, hook);
92
+ return undefined;
93
+ }
94
+ finally {
95
+ if (timer !== undefined)
96
+ clearTimeout(timer);
97
+ }
98
+ }
99
+ }
100
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/plugins/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { PluginLoader } from './host.js';
2
+ export interface JitiLoaderOptions {
3
+ readonly cwd: string;
4
+ readonly cacheBust?: () => string;
5
+ }
6
+ export declare function createPluginLoader(opts: JitiLoaderOptions): PluginLoader;
7
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC;CACnC;AAiBD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,GAAG,YAAY,CAqCxE"}
@@ -0,0 +1,68 @@
1
+ import * as path from 'node:path';
2
+ import { pathToFileURL } from 'node:url';
3
+ let jitiInstance = null;
4
+ async function getJiti(cwd) {
5
+ if (jitiInstance)
6
+ return jitiInstance;
7
+ try {
8
+ const mod = await import('jiti');
9
+ const factory = mod.createJiti ?? mod.default;
10
+ if (!factory)
11
+ return null;
12
+ jitiInstance = factory(cwd, { interopDefault: true });
13
+ return jitiInstance;
14
+ }
15
+ catch {
16
+ return null;
17
+ }
18
+ }
19
+ export function createPluginLoader(opts) {
20
+ return {
21
+ async load(manifest) {
22
+ const entry = path.resolve(manifest.packagePath, manifest.entry);
23
+ const isTs = entry.endsWith('.ts') || entry.endsWith('.tsx');
24
+ let mod;
25
+ if (isTs) {
26
+ const jiti = await getJiti(opts.cwd);
27
+ if (!jiti) {
28
+ throw new Error(`Cannot load .ts plugin entry without jiti: ${entry}. Install 'jiti' as a dependency.`);
29
+ }
30
+ mod = jiti(entry);
31
+ }
32
+ else {
33
+ const bust = opts.cacheBust?.() ?? `${Date.now()}-${Math.random()}`;
34
+ const url = `${pathToFileURL(entry).href}?v=${bust}`;
35
+ mod = await import(url);
36
+ }
37
+ const plugin = extractPlugin(mod);
38
+ if (!plugin) {
39
+ throw new Error(`Plugin entry did not export a valid Plugin (default export with __moxxy === 'plugin'): ${entry}`);
40
+ }
41
+ // The runtime-reported version is the package.json version — the single
42
+ // source of truth. Plugin authors hardcode a placeholder `version` in
43
+ // definePlugin (commonly '0.0.0'), so stamp the manifest's packageVersion
44
+ // here; otherwise `moxxy plugins list` and PluginRegisteredEvent lie.
45
+ if (manifest.packageVersion && plugin.version !== manifest.packageVersion) {
46
+ return Object.freeze({ ...plugin, version: manifest.packageVersion });
47
+ }
48
+ return plugin;
49
+ },
50
+ };
51
+ }
52
+ function extractPlugin(mod) {
53
+ if (!mod || typeof mod !== 'object')
54
+ return null;
55
+ const candidates = [
56
+ mod.default,
57
+ mod.default?.default,
58
+ mod,
59
+ mod.plugin,
60
+ ];
61
+ for (const c of candidates) {
62
+ if (c && typeof c === 'object' && c.__moxxy === 'plugin') {
63
+ return c;
64
+ }
65
+ }
66
+ return null;
67
+ }
68
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type MoxxyRequirement } from '@moxxy/sdk';
2
+ /**
3
+ * Read `moxxy.requirements` from a package's `package.json`, resolved by
4
+ * name from the given working directory. Returns an empty array when:
5
+ * - the package can't be resolved (not installed in the cwd's resolution path)
6
+ * - the package has no `moxxy` block
7
+ * - the `moxxy` block exists but declares no requirements
8
+ * - the `moxxy` block fails schema validation
9
+ *
10
+ * Errors are deliberately swallowed because this is used during boot
11
+ * for every static builtin: a missing or malformed package.json on one
12
+ * builtin shouldn't crash the CLI. The plugin host's registration gate
13
+ * still rejects plugins whose declared requirements aren't satisfied.
14
+ */
15
+ export declare function readPackageMoxxyRequirements(packageName: string, fromDir: string): Promise<ReadonlyArray<MoxxyRequirement>>;
16
+ //# sourceMappingURL=package-requirements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-requirements.d.ts","sourceRoot":"","sources":["../../src/plugins/package-requirements.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEvE;;;;;;;;;;;;GAYG;AACH,wBAAsB,4BAA4B,CAChD,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAoB1C"}
@@ -0,0 +1,52 @@
1
+ import { createRequire } from 'node:module';
2
+ import { promises as fs } from 'node:fs';
3
+ import { moxxyPackageSchema } from '@moxxy/sdk';
4
+ /**
5
+ * Read `moxxy.requirements` from a package's `package.json`, resolved by
6
+ * name from the given working directory. Returns an empty array when:
7
+ * - the package can't be resolved (not installed in the cwd's resolution path)
8
+ * - the package has no `moxxy` block
9
+ * - the `moxxy` block exists but declares no requirements
10
+ * - the `moxxy` block fails schema validation
11
+ *
12
+ * Errors are deliberately swallowed because this is used during boot
13
+ * for every static builtin: a missing or malformed package.json on one
14
+ * builtin shouldn't crash the CLI. The plugin host's registration gate
15
+ * still rejects plugins whose declared requirements aren't satisfied.
16
+ */
17
+ export async function readPackageMoxxyRequirements(packageName, fromDir) {
18
+ const pkgJsonPath = resolvePackageJson(packageName, fromDir);
19
+ if (!pkgJsonPath)
20
+ return [];
21
+ let raw;
22
+ try {
23
+ raw = await fs.readFile(pkgJsonPath, 'utf8');
24
+ }
25
+ catch {
26
+ return [];
27
+ }
28
+ let parsedJson;
29
+ try {
30
+ parsedJson = JSON.parse(raw);
31
+ }
32
+ catch {
33
+ return [];
34
+ }
35
+ const moxxyBlock = parsedJson.moxxy;
36
+ if (!moxxyBlock)
37
+ return [];
38
+ const parsed = moxxyPackageSchema.safeParse(moxxyBlock);
39
+ if (!parsed.success)
40
+ return [];
41
+ return parsed.data.requirements ?? [];
42
+ }
43
+ function resolvePackageJson(packageName, fromDir) {
44
+ const require_ = createRequire(`${fromDir.replace(/\/+$/, '')}/`);
45
+ try {
46
+ return require_.resolve(`${packageName}/package.json`);
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ }
52
+ //# sourceMappingURL=package-requirements.js.map