@pikku/cli 0.11.1 → 0.11.2

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 (257) hide show
  1. package/.pikku/channel/pikku-channel-types.gen.ts +11 -12
  2. package/.pikku/channel/pikku-channels-map.gen.d.ts +8 -8
  3. package/.pikku/channel/pikku-channels-meta.gen.ts +1 -1
  4. package/.pikku/channel/pikku-channels.gen.ts +1 -1
  5. package/.pikku/cli/pikku-cli-channel.ts +2 -2
  6. package/.pikku/cli/pikku-cli-client.gen.ts +1 -3
  7. package/.pikku/cli/pikku-cli-types.gen.ts +3 -3
  8. package/.pikku/cli/pikku-cli-wirings-meta.gen.json +146 -0
  9. package/.pikku/cli/pikku-cli-wirings-meta.gen.ts +4 -157
  10. package/.pikku/cli/pikku-cli-wirings.gen.ts +3 -3
  11. package/.pikku/cli/pikku-cli.gen.ts +3 -3
  12. package/.pikku/function/pikku-function-types.gen.ts +49 -63
  13. package/.pikku/function/pikku-functions-meta.gen.json +988 -0
  14. package/.pikku/function/pikku-functions-meta.gen.ts +4 -970
  15. package/.pikku/function/pikku-functions-meta.min.gen.json +212 -0
  16. package/.pikku/function/pikku-functions-meta.min.gen.ts +4 -209
  17. package/.pikku/http/pikku-http-types.gen.ts +2 -2
  18. package/.pikku/http/pikku-http-wirings-map.gen.d.ts +8 -8
  19. package/.pikku/http/pikku-http-wirings-meta.gen.ts +1 -1
  20. package/.pikku/http/pikku-http-wirings.gen.ts +1 -1
  21. package/.pikku/mcp/pikku-mcp-types.gen.ts +13 -13
  22. package/.pikku/mcp/pikku-mcp-wirings-meta.gen.json +5 -0
  23. package/.pikku/mcp/pikku-mcp-wirings-meta.gen.ts +6 -4
  24. package/.pikku/mcp/pikku-mcp-wirings.gen.ts +1 -1
  25. package/.pikku/pikku-bootstrap.gen.ts +1 -4
  26. package/.pikku/pikku-services.gen.ts +4 -6
  27. package/.pikku/pikku-types.gen.ts +1 -1
  28. package/.pikku/pikku-websocket.gen.ts +1 -1
  29. package/.pikku/queue/pikku-queue-types.gen.ts +2 -2
  30. package/.pikku/queue/pikku-queue-workers-wirings-map.gen.d.ts +8 -8
  31. package/.pikku/queue/pikku-queue-workers-wirings-meta.gen.json +1 -0
  32. package/.pikku/queue/pikku-queue-workers-wirings-meta.gen.ts +5 -7
  33. package/.pikku/queue/pikku-queue-workers-wirings.gen.ts +1 -1
  34. package/.pikku/rpc/pikku-remote-rpc-workers.gen.ts +2 -2
  35. package/.pikku/rpc/pikku-rpc-wirings-map.gen.d.ts +8 -8
  36. package/.pikku/rpc/pikku-rpc-wirings-map.internal.gen.d.ts +34 -33
  37. package/.pikku/scheduler/pikku-scheduler-types.gen.ts +2 -2
  38. package/.pikku/scheduler/pikku-schedulers-wirings-meta.gen.json +1 -0
  39. package/.pikku/scheduler/pikku-schedulers-wirings-meta.gen.ts +5 -2
  40. package/.pikku/scheduler/pikku-schedulers-wirings.gen.ts +1 -1
  41. package/.pikku/schemas/register.gen.ts +25 -25
  42. package/.pikku/schemas/schemas/PikkuCLIConfig.schema.json +1 -1
  43. package/.pikku/services/config.gen.json +99 -0
  44. package/.pikku/services/getInspectorState.gen.json +10 -0
  45. package/.pikku/services/jwt.gen.json +13 -0
  46. package/.pikku/services/logger.gen.json +25 -0
  47. package/.pikku/services/queueService.gen.json +14 -0
  48. package/.pikku/services/schedulerService.gen.json +17 -0
  49. package/.pikku/services/schema.gen.json +14 -0
  50. package/.pikku/services/variables.gen.json +13 -0
  51. package/.pikku/services/workflowService.gen.json +31 -0
  52. package/.pikku/workflow/pikku-workflow-map.gen.d.ts +8 -8
  53. package/.pikku/workflow/pikku-workflow-types.gen.ts +36 -31
  54. package/.pikku/workflow/pikku-workflow-wirings-meta.gen.json +1 -0
  55. package/.pikku/workflow/pikku-workflow-wirings-meta.gen.ts +5 -2
  56. package/.pikku/workflow/pikku-workflow-wirings.gen.ts +6 -2
  57. package/CHANGELOG.md +21 -0
  58. package/bin/pikku.ts +6 -32
  59. package/build.sh +53 -31
  60. package/cli.schema.json +1 -1
  61. package/dist/.pikku/channel/pikku-channel-types.gen.d.ts +6 -7
  62. package/dist/.pikku/channel/pikku-channel-types.gen.js +1 -1
  63. package/dist/.pikku/channel/pikku-channels-meta.gen.js +1 -1
  64. package/dist/.pikku/channel/pikku-channels.gen.d.ts +1 -1
  65. package/dist/.pikku/channel/pikku-channels.gen.js +1 -1
  66. package/dist/.pikku/cli/pikku-cli-channel.js +2 -2
  67. package/dist/.pikku/cli/pikku-cli-client.gen.d.ts +1 -1
  68. package/dist/.pikku/cli/pikku-cli-client.gen.js +1 -3
  69. package/dist/.pikku/cli/pikku-cli-types.gen.d.ts +3 -3
  70. package/dist/.pikku/cli/pikku-cli-types.gen.js +1 -1
  71. package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.js +3 -157
  72. package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.json +146 -0
  73. package/dist/.pikku/cli/pikku-cli-wirings.gen.d.ts +2 -2
  74. package/dist/.pikku/cli/pikku-cli-wirings.gen.js +2 -2
  75. package/dist/.pikku/cli/pikku-cli.gen.d.ts +1 -1
  76. package/dist/.pikku/cli/pikku-cli.gen.js +3 -3
  77. package/dist/.pikku/function/pikku-function-types.gen.d.ts +29 -79
  78. package/dist/.pikku/function/pikku-function-types.gen.js +19 -15
  79. package/dist/.pikku/function/pikku-functions-meta.gen.js +3 -969
  80. package/dist/.pikku/function/pikku-functions-meta.gen.json +988 -0
  81. package/dist/.pikku/function/pikku-functions-meta.min.gen.js +3 -208
  82. package/dist/.pikku/function/pikku-functions-meta.min.gen.json +212 -0
  83. package/dist/.pikku/http/pikku-http-types.gen.d.ts +2 -2
  84. package/dist/.pikku/http/pikku-http-types.gen.js +1 -1
  85. package/dist/.pikku/http/pikku-http-wirings-meta.gen.js +1 -1
  86. package/dist/.pikku/http/pikku-http-wirings.gen.d.ts +1 -1
  87. package/dist/.pikku/http/pikku-http-wirings.gen.js +1 -1
  88. package/dist/.pikku/mcp/pikku-mcp-types.gen.d.ts +13 -13
  89. package/dist/.pikku/mcp/pikku-mcp-types.gen.js +1 -1
  90. package/dist/.pikku/mcp/pikku-mcp-wirings-meta.gen.js +5 -4
  91. package/dist/.pikku/mcp/pikku-mcp-wirings-meta.gen.json +5 -0
  92. package/dist/.pikku/mcp/pikku-mcp-wirings.gen.d.ts +1 -1
  93. package/dist/.pikku/mcp/pikku-mcp-wirings.gen.js +1 -1
  94. package/dist/.pikku/pikku-bootstrap.gen.d.ts +1 -4
  95. package/dist/.pikku/pikku-bootstrap.gen.js +1 -4
  96. package/dist/.pikku/pikku-services.gen.d.ts +3 -6
  97. package/dist/.pikku/pikku-services.gen.js +2 -5
  98. package/dist/.pikku/pikku-types.gen.d.ts +1 -1
  99. package/dist/.pikku/pikku-types.gen.js +1 -1
  100. package/dist/.pikku/pikku-websocket.gen.d.ts +1 -1
  101. package/dist/.pikku/pikku-websocket.gen.js +1 -1
  102. package/dist/.pikku/queue/pikku-queue-types.gen.d.ts +2 -2
  103. package/dist/.pikku/queue/pikku-queue-types.gen.js +1 -1
  104. package/dist/.pikku/queue/pikku-queue-workers-wirings-meta.gen.js +3 -7
  105. package/dist/.pikku/queue/pikku-queue-workers-wirings-meta.gen.json +1 -0
  106. package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.d.ts +1 -1
  107. package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.js +1 -1
  108. package/dist/.pikku/rpc/pikku-remote-rpc-workers.gen.d.ts +6 -9
  109. package/dist/.pikku/rpc/pikku-remote-rpc-workers.gen.js +2 -2
  110. package/dist/.pikku/scheduler/pikku-scheduler-types.gen.d.ts +2 -2
  111. package/dist/.pikku/scheduler/pikku-scheduler-types.gen.js +1 -1
  112. package/dist/.pikku/scheduler/pikku-schedulers-wirings-meta.gen.js +3 -2
  113. package/dist/.pikku/scheduler/pikku-schedulers-wirings-meta.gen.json +1 -0
  114. package/dist/.pikku/scheduler/pikku-schedulers-wirings.gen.d.ts +1 -1
  115. package/dist/.pikku/scheduler/pikku-schedulers-wirings.gen.js +1 -1
  116. package/dist/.pikku/schemas/register.gen.js +15 -15
  117. package/dist/.pikku/schemas/schemas/PikkuCLIConfig.schema.json +1 -1
  118. package/dist/.pikku/workflow/pikku-workflow-types.gen.d.ts +29 -25
  119. package/dist/.pikku/workflow/pikku-workflow-types.gen.js +22 -8
  120. package/dist/.pikku/workflow/pikku-workflow-wirings-meta.gen.js +3 -2
  121. package/dist/.pikku/workflow/pikku-workflow-wirings-meta.gen.json +1 -0
  122. package/dist/.pikku/workflow/pikku-workflow-wirings.gen.d.ts +6 -2
  123. package/dist/.pikku/workflow/pikku-workflow-wirings.gen.js +6 -3
  124. package/dist/bin/pikku.js +5 -26
  125. package/dist/src/cli.wiring.js +4 -4
  126. package/dist/src/functions/commands/all.js +82 -42
  127. package/dist/src/functions/commands/bootstrap.js +22 -10
  128. package/dist/src/functions/commands/watch.js +6 -3
  129. package/dist/src/functions/runtimes/nextjs/pikku-command-nextjs.js +12 -7
  130. package/dist/src/functions/runtimes/nextjs/serialize-nextjs-backend-wrapper.d.ts +1 -1
  131. package/dist/src/functions/runtimes/nextjs/serialize-nextjs-backend-wrapper.js +42 -4
  132. package/dist/src/functions/runtimes/nextjs/serialize-nextjs-http-wrapper.d.ts +1 -1
  133. package/dist/src/functions/runtimes/nextjs/serialize-nextjs-http-wrapper.js +40 -2
  134. package/dist/src/functions/wirings/channels/pikku-channels.js +9 -2
  135. package/dist/src/functions/wirings/channels/serialize-channel-types.js +10 -11
  136. package/dist/src/functions/wirings/cli/pikku-command-cli-entry.js +4 -4
  137. package/dist/src/functions/wirings/cli/pikku-command-cli-types.js +1 -1
  138. package/dist/src/functions/wirings/cli/pikku-command-cli.js +9 -3
  139. package/dist/src/functions/wirings/cli/serialize-channel-cli.js +1 -1
  140. package/dist/src/functions/wirings/cli/serialize-cli-types.js +2 -2
  141. package/dist/src/functions/wirings/cli/serialize-local-cli-bootstrap.d.ts +1 -1
  142. package/dist/src/functions/wirings/cli/serialize-local-cli-bootstrap.js +4 -4
  143. package/dist/src/functions/wirings/functions/pikku-command-function-types-split.js +4 -4
  144. package/dist/src/functions/wirings/functions/pikku-command-functions.js +15 -5
  145. package/dist/src/functions/wirings/functions/pikku-command-services.d.ts +1 -1
  146. package/dist/src/functions/wirings/functions/pikku-command-services.js +23 -23
  147. package/dist/src/functions/wirings/functions/schemas.js +1 -1
  148. package/dist/src/functions/wirings/functions/serialize-function-types.d.ts +1 -1
  149. package/dist/src/functions/wirings/functions/serialize-function-types.js +50 -64
  150. package/dist/src/functions/wirings/http/openapi-spec-generator.js +4 -4
  151. package/dist/src/functions/wirings/http/pikku-http-routes.js +9 -2
  152. package/dist/src/functions/wirings/http/serialize-http-types.js +1 -1
  153. package/dist/src/functions/wirings/mcp/pikku-command-mcp.js +18 -4
  154. package/dist/src/functions/wirings/mcp/serialize-mcp-types.js +12 -12
  155. package/dist/src/functions/wirings/middleware/pikku-command-middleware.js +26 -2
  156. package/dist/src/functions/wirings/middleware/serialize-middleware-groups-meta.d.ts +5 -2
  157. package/dist/src/functions/wirings/middleware/serialize-middleware-groups-meta.js +5 -13
  158. package/dist/src/functions/wirings/queue/pikku-command-queue.js +9 -3
  159. package/dist/src/functions/wirings/queue/pikku-queue.js +9 -3
  160. package/dist/src/functions/wirings/queue/serialize-queue-meta.d.ts +2 -1
  161. package/dist/src/functions/wirings/queue/serialize-queue-meta.js +10 -1
  162. package/dist/src/functions/wirings/queue/serialize-queue-types.js +1 -1
  163. package/dist/src/functions/wirings/rpc/pikku-command-rpc.js +9 -2
  164. package/dist/src/functions/wirings/rpc/serialize-public-rpc.js +11 -4
  165. package/dist/src/functions/wirings/rpc/serialize-remote-rpc.js +1 -1
  166. package/dist/src/functions/wirings/rpc/serialize-rpc-wrapper.js +3 -3
  167. package/dist/src/functions/wirings/scheduler/pikku-command-scheduler.js +6 -3
  168. package/dist/src/functions/wirings/scheduler/serialize-scheduler-meta.d.ts +2 -1
  169. package/dist/src/functions/wirings/scheduler/serialize-scheduler-meta.js +11 -1
  170. package/dist/src/functions/wirings/scheduler/serialize-scheduler-types.js +1 -1
  171. package/dist/src/functions/wirings/services/pikku-command-service-metadata.d.ts +1 -0
  172. package/dist/src/functions/wirings/services/pikku-command-service-metadata.js +22 -0
  173. package/dist/src/functions/wirings/workflow/pikku-command-workflow-types.js +3 -1
  174. package/dist/src/functions/wirings/workflow/pikku-command-workflow.js +12 -8
  175. package/dist/src/functions/wirings/workflow/serialize-workflow-meta.d.ts +2 -1
  176. package/dist/src/functions/wirings/workflow/serialize-workflow-meta.js +11 -1
  177. package/dist/src/functions/wirings/workflow/serialize-workflow-types.d.ts +1 -1
  178. package/dist/src/functions/wirings/workflow/serialize-workflow-types.js +36 -31
  179. package/dist/src/functions/wirings/workflow/serialize-workflow-wirings.d.ts +8 -0
  180. package/dist/src/functions/wirings/workflow/serialize-workflow-wirings.js +30 -0
  181. package/dist/src/functions/wirings/workflow/serialize-workflow-workers.js +2 -2
  182. package/dist/src/middleware/log-command-info-and-time.d.ts +2 -2
  183. package/dist/src/middleware/log-command-info-and-time.js +1 -4
  184. package/dist/src/services/cli-logger-forwarder.service.js +1 -1
  185. package/dist/src/services.d.ts +2 -7
  186. package/dist/src/services.js +14 -12
  187. package/dist/src/utils/check-required-types.d.ts +2 -2
  188. package/dist/src/utils/check-required-types.js +2 -3
  189. package/dist/src/utils/pikku-cli-config.js +35 -2
  190. package/dist/src/utils/pikku-files-and-methods.d.ts +2 -2
  191. package/dist/src/utils/pikku-files-and-methods.js +4 -4
  192. package/dist/src/utils/schema-generator.d.ts +1 -1
  193. package/dist/src/utils/schema-generator.js +1 -1
  194. package/dist/tsconfig.tsbuildinfo +1 -1
  195. package/package.json +7 -8
  196. package/src/cli.wiring.ts +4 -4
  197. package/src/functions/commands/all.ts +94 -45
  198. package/src/functions/commands/bootstrap.ts +25 -10
  199. package/src/functions/commands/watch.ts +6 -3
  200. package/src/functions/runtimes/nextjs/pikku-command-nextjs.ts +26 -5
  201. package/src/functions/runtimes/nextjs/serialize-nextjs-backend-wrapper.ts +43 -4
  202. package/src/functions/runtimes/nextjs/serialize-nextjs-http-wrapper.ts +40 -1
  203. package/src/functions/wirings/channels/pikku-channels.ts +27 -3
  204. package/src/functions/wirings/channels/serialize-channel-types.ts +10 -11
  205. package/src/functions/wirings/cli/pikku-command-cli-entry.ts +4 -4
  206. package/src/functions/wirings/cli/pikku-command-cli-types.ts +1 -1
  207. package/src/functions/wirings/cli/pikku-command-cli.ts +26 -3
  208. package/src/functions/wirings/cli/serialize-channel-cli.ts +1 -1
  209. package/src/functions/wirings/cli/serialize-cli-types.ts +2 -2
  210. package/src/functions/wirings/cli/serialize-local-cli-bootstrap.ts +5 -5
  211. package/src/functions/wirings/functions/pikku-command-function-types-split.ts +6 -6
  212. package/src/functions/wirings/functions/pikku-command-functions.ts +39 -4
  213. package/src/functions/wirings/functions/pikku-command-services.ts +25 -25
  214. package/src/functions/wirings/functions/schemas.ts +2 -2
  215. package/src/functions/wirings/functions/serialize-function-types.ts +51 -65
  216. package/src/functions/wirings/http/openapi-spec-generator.ts +14 -5
  217. package/src/functions/wirings/http/pikku-http-routes.ts +28 -2
  218. package/src/functions/wirings/http/serialize-http-types.ts +1 -1
  219. package/src/functions/wirings/mcp/pikku-command-mcp.ts +30 -4
  220. package/src/functions/wirings/mcp/serialize-mcp-types.ts +12 -12
  221. package/src/functions/wirings/middleware/pikku-command-middleware.ts +35 -2
  222. package/src/functions/wirings/middleware/serialize-middleware-groups-meta.ts +4 -19
  223. package/src/functions/wirings/permissions/pikku-command-permissions.ts +2 -2
  224. package/src/functions/wirings/queue/pikku-command-queue.ts +27 -2
  225. package/src/functions/wirings/queue/pikku-queue.ts +27 -2
  226. package/src/functions/wirings/queue/serialize-queue-meta.ts +15 -1
  227. package/src/functions/wirings/queue/serialize-queue-types.ts +1 -1
  228. package/src/functions/wirings/rpc/pikku-command-rpc.ts +25 -2
  229. package/src/functions/wirings/rpc/serialize-public-rpc.ts +11 -4
  230. package/src/functions/wirings/rpc/serialize-remote-rpc.ts +1 -1
  231. package/src/functions/wirings/rpc/serialize-rpc-wrapper.ts +3 -3
  232. package/src/functions/wirings/scheduler/pikku-command-scheduler.ts +30 -4
  233. package/src/functions/wirings/scheduler/serialize-scheduler-meta.ts +20 -1
  234. package/src/functions/wirings/scheduler/serialize-scheduler-types.ts +1 -1
  235. package/src/functions/wirings/services/pikku-command-service-metadata.ts +25 -0
  236. package/src/functions/wirings/workflow/pikku-command-workflow-types.ts +8 -1
  237. package/src/functions/wirings/workflow/pikku-command-workflow.ts +36 -8
  238. package/src/functions/wirings/workflow/serialize-workflow-meta.ts +18 -1
  239. package/src/functions/wirings/workflow/serialize-workflow-types.ts +39 -31
  240. package/src/functions/wirings/workflow/serialize-workflow-wirings.ts +47 -0
  241. package/src/functions/wirings/workflow/serialize-workflow-workers.ts +2 -2
  242. package/src/middleware/log-command-info-and-time.ts +3 -6
  243. package/src/services/cli-logger-forwarder.service.ts +1 -1
  244. package/src/services.ts +15 -15
  245. package/src/utils/check-required-types.ts +4 -7
  246. package/src/utils/pikku-cli-config.ts +69 -2
  247. package/src/utils/pikku-files-and-methods.ts +10 -13
  248. package/src/utils/schema-generator.ts +2 -2
  249. package/types/application-types.d.ts +1 -1
  250. package/types/config.d.ts +12 -1
  251. package/.pikku/function/pikku-functions.gen.ts +0 -84
  252. package/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.ts +0 -47
  253. package/dist/.pikku/function/pikku-functions.gen.d.ts +0 -1
  254. package/dist/.pikku/function/pikku-functions.gen.js +0 -83
  255. package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.d.ts +0 -1
  256. package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.js +0 -47
  257. package/dist/.pikku/schemas/schemas/PikkuRemoteInternalRPCInput.schema.json +0 -1
@@ -6,8 +6,8 @@ export const serializeFunctionTypes = (
6
6
  userSessionTypeName: string,
7
7
  singletonServicesTypeImport: string,
8
8
  singletonServicesTypeName: string,
9
- sessionServicesTypeImport: string,
10
- sessionServicesTypeName: string,
9
+ wireServicesTypeImport: string,
10
+ wireServicesTypeName: string,
11
11
  rpcMapTypeImport: string,
12
12
  requiredServicesTypeImport: string,
13
13
  configTypeImport: string
@@ -16,20 +16,18 @@ export const serializeFunctionTypes = (
16
16
  * Core function, middleware, and permission types for all wirings
17
17
  */
18
18
 
19
- import { CorePikkuFunctionConfig, CorePikkuPermission, CorePikkuMiddleware, CorePermissionGroup, addMiddleware as addMiddlewareCore, addPermission as addPermissionCore } from '@pikku/core'
19
+ import { CorePikkuFunctionConfig, CorePikkuPermission, CorePikkuMiddleware, CorePermissionGroup, addMiddleware as addMiddlewareCore, addPermission as addPermissionCore, PikkuWire, PickRequired } from '@pikku/core'
20
20
  import { CorePikkuFunction, CorePikkuFunctionSessionless } from '@pikku/core/function'
21
- import { PikkuChannel } from '@pikku/core/channel'
22
- import { PikkuMCP } from '@pikku/core/mcp'
23
21
 
24
22
  ${userSessionTypeImport}
25
23
  ${singletonServicesTypeImport}
26
- ${sessionServicesTypeImport}
24
+ ${wireServicesTypeImport}
27
25
  ${configTypeImport}
28
26
  ${rpcMapTypeImport}
29
27
  ${requiredServicesTypeImport}
30
28
 
31
29
  ${singletonServicesTypeName !== 'SingletonServices' ? `type SingletonServices = ${singletonServicesTypeName}` : ''}
32
- ${sessionServicesTypeName !== 'Services' ? `type Services = ${sessionServicesTypeName}` : ''}
30
+ ${wireServicesTypeName !== 'Services' ? `type Services = ${wireServicesTypeName}` : ''}
33
31
  ${userSessionTypeName !== 'Session' ? `type Session = ${userSessionTypeName}` : ''}
34
32
  ${configTypeImport.includes('Config type not found') ? 'type Config = any' : ''}
35
33
 
@@ -40,7 +38,7 @@ ${configTypeImport.includes('Config type not found') ? 'type Config = any' : ''}
40
38
  * @template In - The input type that the permission check will receive
41
39
  * @template RequiredServices - The services required for this permission check
42
40
  */
43
- export type PikkuPermission<In = unknown, RequiredServices extends Services = Services> = CorePikkuPermission<In, RequiredServices, Session>
41
+ export type PikkuPermission<In = unknown, RequiredServices extends Services = Services> = CorePikkuPermission<In, RequiredServices, PikkuWire<In, never, false, Session>>
44
42
 
45
43
  /**
46
44
  * Type-safe middleware definition that can access your application's services and session.
@@ -48,7 +46,7 @@ export type PikkuPermission<In = unknown, RequiredServices extends Services = Se
48
46
  *
49
47
  * @template RequiredServices - The services required for this middleware
50
48
  */
51
- export type PikkuMiddleware<RequiredServices extends SingletonServices = SingletonServices> = CorePikkuMiddleware<RequiredServices, Session>
49
+ export type PikkuMiddleware<RequiredServices extends SingletonServices = SingletonServices> = CorePikkuMiddleware<RequiredServices>
52
50
 
53
51
  /**
54
52
  * Configuration object for creating a permission with metadata
@@ -69,7 +67,8 @@ export type PikkuPermissionConfig<In = unknown, RequiredServices extends Service
69
67
  * @example
70
68
  * \`\`\`typescript
71
69
  * // Direct function syntax
72
- * const permission = pikkuPermission(({ logger }, data, session) => {
70
+ * const permission = pikkuPermission(async ({ logger }, data, { session }) => {
71
+ * const session = await session?.get()
73
72
  * return session?.role === 'admin'
74
73
  * })
75
74
  *
@@ -77,7 +76,8 @@ export type PikkuPermissionConfig<In = unknown, RequiredServices extends Service
77
76
  * const adminPermission = pikkuPermission({
78
77
  * name: 'Admin Permission',
79
78
  * description: 'Checks if user has admin role',
80
- * func: async ({ logger }, data, session) => {
79
+ * func: async ({ logger }, data, { session }) => {
80
+ * const session = await session?.get()
81
81
  * return session?.role === 'admin'
82
82
  * }
83
83
  * })
@@ -108,7 +108,7 @@ export type PikkuMiddlewareConfig<RequiredServices extends SingletonServices = S
108
108
  * @example
109
109
  * \`\`\`typescript
110
110
  * // Direct function syntax
111
- * const middleware = pikkuMiddleware(({ logger }, interactions, next) => {
111
+ * const middleware = pikkuMiddleware(({ logger }, wires, next) => {
112
112
  * logger.info('Middleware executed')
113
113
  * await next()
114
114
  * })
@@ -117,7 +117,7 @@ export type PikkuMiddlewareConfig<RequiredServices extends SingletonServices = S
117
117
  * const logMiddleware = pikkuMiddleware({
118
118
  * name: 'Request Logger',
119
119
  * description: 'Logs all incoming requests',
120
- * func: async ({ logger }, interactions, next) => {
120
+ * func: async ({ logger }, wires, next) => {
121
121
  * logger.info('Request started')
122
122
  * await next()
123
123
  * }
@@ -140,7 +140,7 @@ export const pikkuMiddleware = <RequiredServices extends SingletonServices = Sin
140
140
  * message,
141
141
  * level = 'info'
142
142
  * }) => {
143
- * return pikkuMiddleware(async ({ logger }, _interaction, next) => {
143
+ * return pikkuMiddleware(async ({ logger }, next) => {
144
144
  * logger[level](message)
145
145
  * await next()
146
146
  * })
@@ -162,8 +162,8 @@ export const pikkuMiddlewareFactory = <In = any>(
162
162
  * export const requireRole = pikkuPermissionFactory<{ role: string }>(({
163
163
  * role
164
164
  * }) => {
165
- * return pikkuPermission(async ({ logger }, data, session) => {
166
- * if (!session || session.role !== role) {
165
+ * return pikkuPermission(async ({ logger }, data, { initialSession }) => {
166
+ * if (!initialSession || initialSession.role !== role) {
167
167
  * logger.warn(\`Permission denied: required role '\${role}'\`)
168
168
  * return false
169
169
  * }
@@ -184,25 +184,19 @@ export const pikkuPermissionFactory = <In = any>(
184
184
  *
185
185
  * @template In - The input type
186
186
  * @template Out - The output type that the function returns
187
- * @template ChannelData - Channel data type (null = optional channel)
188
- * @template MCPData - MCP data type (null = optional MCP)
189
187
  * @template RequiredServices - Services required by this function
190
188
  */
191
189
  export type PikkuFunctionSessionless<
192
190
  In = unknown,
193
191
  Out = never,
194
- ChannelData = null, // null means optional channel
195
- MCPData = null, // null means optional MCP
196
- RequiredServices extends Services = Omit<Services, 'rpc' | 'channel' | 'mcp'> &
197
- { rpc: TypedPikkuRPC } & (
198
- [ChannelData] extends [null]
199
- ? { channel?: PikkuChannel<unknown, Out> } // Optional channel
200
- : { channel: PikkuChannel<ChannelData, Out> } // Required channel with any data type
201
- ) & ([MCPData] extends [null]
202
- ? { mcp?: PikkuMCP } // Optional MCP
203
- : { mcp: PikkuMCP } // Required MCP
204
- )
205
- > = CorePikkuFunctionSessionless<In, Out, ChannelData, RequiredServices, Session>
192
+ RequiredWires extends keyof PikkuWire = never,
193
+ RequiredServices extends Services = Services
194
+ > = CorePikkuFunctionSessionless<
195
+ In,
196
+ Out,
197
+ RequiredServices,
198
+ PickRequired<PikkuWire<In, Out, false, Session, TypedPikkuRPC, null, any>, RequiredWires>
199
+ >
206
200
 
207
201
  /**
208
202
  * A session-aware API function that requires user authentication.
@@ -210,25 +204,19 @@ export type PikkuFunctionSessionless<
210
204
  *
211
205
  * @template In - The input type
212
206
  * @template Out - The output type that the function returns
213
- * @template ChannelData - Channel data type (null = optional channel)
214
- * @template MCPData - MCP data type (null = optional MCP)
215
207
  * @template RequiredServices - Services required by this function
216
208
  */
217
209
  export type PikkuFunction<
218
210
  In = unknown,
219
211
  Out = never,
220
- ChannelData = null, // null means optional channel
221
- MCPData = null, // null means optional MCP
222
- RequiredServices extends Services = Omit<Services, 'rpc' | 'channel' | 'mcp'> &
223
- { rpc: TypedPikkuRPC } & (
224
- [ChannelData] extends [null]
225
- ? { channel?: PikkuChannel<unknown, Out> } // Optional channel
226
- : { channel: PikkuChannel<ChannelData, Out> } // Required channel with any data type
227
- ) & ([MCPData] extends [null]
228
- ? { mcp?: PikkuMCP } // Optional MCP
229
- : { mcp: PikkuMCP } // Required MCP
230
- )
231
- > = CorePikkuFunction<In, Out, ChannelData, RequiredServices, Session>
212
+ RequiredWires extends keyof PikkuWire = 'session',
213
+ RequiredServices extends Services = Services
214
+ > = CorePikkuFunction<
215
+ In,
216
+ Out,
217
+ RequiredServices,
218
+ PickRequired<PikkuWire<In, Out, true, Session, TypedPikkuRPC, null, any>, RequiredWires>
219
+ >
232
220
 
233
221
  /**
234
222
  * Configuration object for Pikku functions with optional middleware, permissions, tags, and documentation.
@@ -236,16 +224,13 @@ export type PikkuFunction<
236
224
  *
237
225
  * @template In - The input type
238
226
  * @template Out - The output type
239
- * @template ChannelData - Channel data type
240
- * @template MCPData - MCP data type
241
227
  * @template PikkuFunc - The function type (can be narrowed to PikkuFunction or PikkuFunctionSessionless)
242
228
  */
243
229
  export type PikkuFunctionConfig<
244
230
  In = unknown,
245
231
  Out = unknown,
246
- ChannelData = unknown,
247
- MCPData = unknown,
248
- PikkuFunc extends PikkuFunction<In, Out, ChannelData, MCPData> | PikkuFunctionSessionless<In, Out, ChannelData, MCPData> = PikkuFunction<In, Out, ChannelData, MCPData> | PikkuFunctionSessionless<In, Out, ChannelData, MCPData>
232
+ RequiredWires extends keyof PikkuWire = never,
233
+ PikkuFunc extends PikkuFunction<In, Out, RequiredWires> | PikkuFunctionSessionless<In, Out, RequiredWires> = PikkuFunction<In, Out, RequiredWires> | PikkuFunctionSessionless<In, Out, RequiredWires>
249
234
  > = CorePikkuFunctionConfig<PikkuFunc, PikkuPermission<In>, PikkuMiddleware>
250
235
 
251
236
  /**
@@ -260,7 +245,8 @@ export type PikkuFunctionConfig<
260
245
  * @example
261
246
  * \\\`\\\`\\\`typescript
262
247
  * const createUser = pikkuFunc<{name: string, email: string}, {id: number, message: string}>({
263
- * func: async ({db, logger}, input) => {
248
+ * func: async ({db, logger}, input, wire) => {
249
+ * const session = await wire.session.get()
264
250
  * logger.info('Creating user', input.name)
265
251
  * const user = await db.users.create(input)
266
252
  * return {id: user.id, message: \\\`User \\\${input.name} created successfully\\\`}
@@ -271,8 +257,8 @@ export type PikkuFunctionConfig<
271
257
  */
272
258
  export const pikkuFunc = <In, Out = unknown>(
273
259
  func:
274
- | PikkuFunction<In, Out>
275
- | CorePikkuFunctionConfig<PikkuFunction<In, Out>, PikkuPermission<In>, PikkuMiddleware>
260
+ | PikkuFunction<In, Out, 'session' | 'rpc'>
261
+ | PikkuFunctionConfig<In, Out, 'session' | 'rpc'>
276
262
  ) => {
277
263
  return typeof func === 'function' ? { func } : func
278
264
  }
@@ -289,7 +275,7 @@ export const pikkuFunc = <In, Out = unknown>(
289
275
  * @example
290
276
  * \\\`\\\`\\\`typescript
291
277
  * const healthCheck = pikkuSessionlessFunc<void, {status: string, timestamp: string}>({
292
- * func: async ({logger}) => {
278
+ * func: async ({logger}, input) => {
293
279
  * logger.info('Health check requested')
294
280
  * return {status: 'healthy', timestamp: new Date().toISOString()}
295
281
  * },
@@ -299,8 +285,8 @@ export const pikkuFunc = <In, Out = unknown>(
299
285
  */
300
286
  export const pikkuSessionlessFunc = <In, Out = unknown>(
301
287
  func:
302
- | PikkuFunctionSessionless<In, Out>
303
- | CorePikkuFunctionConfig<PikkuFunctionSessionless<In, Out>, PikkuPermission<In>, PikkuMiddleware>
288
+ | PikkuFunctionSessionless<In, Out, 'session' | 'rpc'>
289
+ | PikkuFunctionConfig<In, Out, 'session' | 'rpc'>
304
290
  ) => {
305
291
  return typeof func === 'function' ? { func } : func
306
292
  }
@@ -323,8 +309,8 @@ export const pikkuSessionlessFunc = <In, Out = unknown>(
323
309
  */
324
310
  export const pikkuVoidFunc = (
325
311
  func:
326
- | PikkuFunctionSessionless<void, void>
327
- | CorePikkuFunctionConfig<PikkuFunctionSessionless<void, void>, PikkuPermission<void>>
312
+ | PikkuFunctionSessionless<void, void, 'session' | 'rpc'>
313
+ | PikkuFunctionConfig<void, void, 'session' | 'rpc'>
328
314
  ) => {
329
315
  return typeof func === 'function' ? { func } : func
330
316
  }
@@ -373,27 +359,27 @@ export const pikkuServices = (
373
359
  ) => func
374
360
 
375
361
  /**
376
- * Creates a Pikku session services factory.
362
+ * Creates a Pikku wire services factory.
377
363
  * Use this to define services that are created per-request/session.
378
364
  *
379
- * @param func - Session services factory function
380
- * @returns The session services factory function
365
+ * @param func - Wire services factory function
366
+ * @returns The wire services factory function
381
367
  *
382
368
  * @example
383
369
  * \`\`\`typescript
384
- * export const createSessionServices = pikkuSessionServices(async (services, interaction, session) => {
370
+ * export const createWireServices = pikkuWireServices(async (services, wire) => {
371
+ * const session = await wire.session?.get()
385
372
  * return {
386
373
  * userCache: new UserCache(session?.userId)
387
374
  * }
388
375
  * })
389
376
  * \`\`\`
390
377
  */
391
- export const pikkuSessionServices = (
378
+ export const pikkuWireServices = (
392
379
  func: (
393
380
  services: SingletonServices,
394
- interaction: any,
395
- session: Session | undefined
396
- ) => Promise<RequiredSessionServices>
381
+ wire: any
382
+ ) => Promise<RequiredWireServices>
397
383
  ) => func
398
384
 
399
385
  /**
@@ -120,8 +120,17 @@ export async function generateOpenAPISpec(
120
120
 
121
121
  for (const routeMeta of Object.values(httpMeta)) {
122
122
  for (const meta of Object.values(routeMeta)) {
123
- const { route, method, inputTypes, pikkuFuncName, params, query, docs } =
124
- meta
123
+ const {
124
+ route,
125
+ method,
126
+ inputTypes,
127
+ pikkuFuncName,
128
+ params,
129
+ query,
130
+ errors,
131
+ description,
132
+ tags,
133
+ } = meta
125
134
  const functionMeta = functionsMeta[pikkuFuncName]
126
135
  if (!functionMeta) {
127
136
  logger.error(
@@ -139,7 +148,7 @@ export async function generateOpenAPISpec(
139
148
  }
140
149
 
141
150
  const responses = {}
142
- docs?.errors?.forEach((error) => {
151
+ errors?.forEach((error) => {
143
152
  const errorResponse = getErrorResponseForConstructorName(error)
144
153
  if (errorResponse) {
145
154
  responses[errorResponse.status] = {
@@ -150,9 +159,9 @@ export async function generateOpenAPISpec(
150
159
 
151
160
  const operation: any = {
152
161
  description:
153
- docs?.description ||
162
+ description ||
154
163
  `This endpoint handles the ${method.toUpperCase()} request for the route ${route}.`,
155
- tags: docs?.tags || [route.split('/')[1] || 'default'],
164
+ tags: tags || [route.split('/')[1] || 'default'],
156
165
  parameters: [],
157
166
  responses: {
158
167
  ...responses,
@@ -2,11 +2,18 @@ import { pikkuSessionlessFunc } from '../../../../.pikku/pikku-types.gen.js'
2
2
  import { serializeFileImports } from '../../../utils/file-imports-serializer.js'
3
3
  import { writeFileInDir } from '../../../utils/file-writer.js'
4
4
  import { logCommandInfoAndTime } from '../../../middleware/log-command-info-and-time.js'
5
+ import { getFileImportRelativePath } from '../../../utils/file-import-path.js'
5
6
 
6
7
  export const pikkuHTTP: any = pikkuSessionlessFunc<void, boolean>({
7
8
  func: async ({ logger, config, getInspectorState }) => {
8
9
  const visitState = await getInspectorState()
9
- const { httpWiringsFile, httpWiringMetaFile, packageMappings } = config
10
+ const {
11
+ httpWiringsFile,
12
+ httpWiringMetaFile,
13
+ httpWiringMetaJsonFile,
14
+ packageMappings,
15
+ schema,
16
+ } = config
10
17
  const { http } = visitState
11
18
 
12
19
  await writeFileInDir(
@@ -19,11 +26,30 @@ export const pikkuHTTP: any = pikkuSessionlessFunc<void, boolean>({
19
26
  packageMappings
20
27
  )
21
28
  )
29
+
30
+ await writeFileInDir(
31
+ logger,
32
+ httpWiringMetaJsonFile,
33
+ JSON.stringify(http.meta, null, 2)
34
+ )
35
+
36
+ const jsonImportPath = getFileImportRelativePath(
37
+ httpWiringMetaFile,
38
+ httpWiringMetaJsonFile,
39
+ packageMappings
40
+ )
41
+
42
+ const supportsImportAttributes = schema?.supportsImportAttributes ?? false
43
+ const importStatement = supportsImportAttributes
44
+ ? `import metaData from '${jsonImportPath}' with { type: 'json' }`
45
+ : `import metaData from '${jsonImportPath}'`
46
+
22
47
  await writeFileInDir(
23
48
  logger,
24
49
  httpWiringMetaFile,
25
- `import { pikkuState } from '@pikku/core'\npikkuState('http', 'meta', ${JSON.stringify(http.meta, null, 2)})`
50
+ `import { pikkuState, HTTPWiringsMeta } from '@pikku/core'\n${importStatement}\npikkuState('http', 'meta', metaData as HTTPWiringsMeta)`
26
51
  )
52
+
27
53
  return true
28
54
  },
29
55
  middleware: [
@@ -18,7 +18,7 @@ import type { CoreHTTPFunctionWiring } from '@pikku/core/http'
18
18
  * @template Out - Output type for the HTTP wiring
19
19
  * @template Route - String literal type for the HTTP path (e.g., "/users/:id")
20
20
  */
21
- type HTTPWiring<In, Out, Route extends string> = CoreHTTPFunctionWiring<In, Out, Route, PikkuFunction<In, Out>, PikkuFunctionSessionless<In, Out>, PikkuPermission<In>, PikkuMiddleware>
21
+ type HTTPWiring<In, Out, Route extends string> = CoreHTTPFunctionWiring<In, Out, Route, PikkuFunction<In, Out, 'rpc' | 'session'>, PikkuFunctionSessionless<In, Out, 'rpc' | 'session'>, PikkuPermission<In>, PikkuMiddleware>
22
22
 
23
23
  /**
24
24
  * Registers an HTTP wiring with the Pikku framework.
@@ -4,6 +4,7 @@ import { writeFileInDir } from '../../../utils/file-writer.js'
4
4
  import { logCommandInfoAndTime } from '../../../middleware/log-command-info-and-time.js'
5
5
  import { readFile } from 'fs/promises'
6
6
  import { join } from 'path'
7
+ import { getFileImportRelativePath } from '../../../utils/file-import-path.js'
7
8
 
8
9
  // Helper function to generate arguments from schema
9
10
  const generateArgumentsFromSchema = async (
@@ -66,6 +67,7 @@ export const pikkuMCP: any = pikkuSessionlessFunc<void, boolean | undefined>({
66
67
  mcpWiringsMetaFile,
67
68
  packageMappings,
68
69
  schemaDirectory,
70
+ schema,
69
71
  } = config
70
72
 
71
73
  await writeFileInDir(
@@ -81,7 +83,7 @@ export const pikkuMCP: any = pikkuSessionlessFunc<void, boolean | undefined>({
81
83
 
82
84
  // Populate arguments for prompts meta before serializing
83
85
  const promptsMetaWithArguments = { ...mcpEndpoints.promptsMeta }
84
- for (const promptMeta of Object.values(promptsMetaWithArguments)) {
86
+ for (const promptMeta of Object.values(promptsMetaWithArguments) as any[]) {
85
87
  const functionMeta = functions.meta[promptMeta.pikkuFuncName]
86
88
  if (functionMeta) {
87
89
  const inputType = functionMeta.inputs?.[0]
@@ -94,13 +96,37 @@ export const pikkuMCP: any = pikkuSessionlessFunc<void, boolean | undefined>({
94
96
  }
95
97
  }
96
98
 
99
+ const metaData = {
100
+ resourcesMeta: mcpEndpoints.resourcesMeta,
101
+ toolsMeta: mcpEndpoints.toolsMeta,
102
+ promptsMeta: promptsMetaWithArguments,
103
+ }
104
+ await writeFileInDir(
105
+ logger,
106
+ config.mcpWiringsMetaJsonFile,
107
+ JSON.stringify(metaData, null, 2)
108
+ )
109
+
110
+ const jsonImportPath = getFileImportRelativePath(
111
+ mcpWiringsMetaFile,
112
+ config.mcpWiringsMetaJsonFile,
113
+ packageMappings
114
+ )
115
+
116
+ const supportsImportAttributes = schema?.supportsImportAttributes ?? false
117
+ const importStatement = supportsImportAttributes
118
+ ? `import metaData from '${jsonImportPath}' with { type: 'json' }`
119
+ : `import metaData from '${jsonImportPath}'`
120
+
97
121
  await writeFileInDir(
98
122
  logger,
99
123
  mcpWiringsMetaFile,
100
124
  `import { pikkuState } from '@pikku/core'
101
- pikkuState('mcp', 'resourcesMeta', ${JSON.stringify(mcpEndpoints.resourcesMeta, null, 2)})
102
- pikkuState('mcp', 'toolsMeta', ${JSON.stringify(mcpEndpoints.toolsMeta, null, 2)})
103
- pikkuState('mcp', 'promptsMeta', ${JSON.stringify(promptsMetaWithArguments, null, 2)})`
125
+ import type { MCPResourceMeta, MCPToolMeta, MCPPromptMeta } from '@pikku/core/mcp'
126
+ ${importStatement}
127
+ pikkuState('mcp', 'resourcesMeta', metaData.resourcesMeta as MCPResourceMeta)
128
+ pikkuState('mcp', 'toolsMeta', metaData.toolsMeta as MCPToolMeta)
129
+ pikkuState('mcp', 'promptsMeta', metaData.promptsMeta as MCPPromptMeta)`
104
130
  )
105
131
 
106
132
  return true
@@ -27,21 +27,21 @@ import type { PikkuFunctionConfig, PikkuFunctionSessionless } from '${functionTy
27
27
  * @template In - Input type for the resource request
28
28
  * @template URI - URI template string type for compile-time parameter validation
29
29
  */
30
- type MCPResourceWiring<In, URI extends string> = CoreMCPResource<PikkuFunctionConfig<In, MCPResourceResponse>> & { uri: URI }
30
+ type MCPResourceWiring<In, URI extends string> = CoreMCPResource<PikkuFunctionConfig<In, MCPResourceResponse, 'rpc' | 'session' | 'mcp'>> & { uri: URI }
31
31
 
32
32
  /**
33
33
  * Type definition for MCP tools that AI models can invoke.
34
34
  *
35
35
  * @template In - Input type for the tool invocation
36
36
  */
37
- type MCPToolWiring<In> = CoreMCPTool<PikkuFunctionConfig<In, MCPToolResponse>>
37
+ type MCPToolWiring<In> = CoreMCPTool<PikkuFunctionConfig<In, MCPToolResponse, 'rpc' | 'session' | 'mcp'>>
38
38
 
39
39
  /**
40
40
  * Type definition for MCP prompts that provide templates to AI models.
41
41
  *
42
42
  * @template In - Input type for the prompt parameters
43
43
  */
44
- type MCPPromptWiring<In> = CoreMCPPrompt<PikkuFunctionConfig<In, MCPPromptResponse>>
44
+ type MCPPromptWiring<In> = CoreMCPPrompt<PikkuFunctionConfig<In, MCPPromptResponse, 'rpc' | 'session' | 'mcp'>>
45
45
 
46
46
  /**
47
47
  * Registers an MCP resource with the Pikku framework.
@@ -93,12 +93,12 @@ export const wireMCPPrompt = <In>(
93
93
  */
94
94
  export const pikkuMCPPromptFunc = <In>(
95
95
  func:
96
- | PikkuFunctionSessionless<In, MCPPromptResponse>
96
+ | PikkuFunctionSessionless<In, MCPPromptResponse, 'mcp'>
97
97
  | {
98
- func: PikkuFunctionSessionless<In, MCPPromptResponse>
98
+ func: PikkuFunctionSessionless<In, MCPPromptResponse, 'mcp'>
99
99
  name?: string
100
100
  }
101
- ): PikkuFunctionConfig<In, MCPPromptResponse> => {
101
+ ): PikkuFunctionConfig<In, MCPPromptResponse, 'mcp'> => {
102
102
  return typeof func === 'function' ? { func } : func
103
103
  }
104
104
 
@@ -112,12 +112,12 @@ export const pikkuMCPPromptFunc = <In>(
112
112
  */
113
113
  export const pikkuMCPToolFunc = <In>(
114
114
  func:
115
- | PikkuFunctionSessionless<In, MCPToolResponse, null, true>
115
+ | PikkuFunctionSessionless<In, MCPToolResponse, 'mcp'>
116
116
  | {
117
- func: PikkuFunctionSessionless<In, MCPToolResponse, null, true>
117
+ func: PikkuFunctionSessionless<In, MCPToolResponse, 'mcp'>
118
118
  name?: string
119
119
  }
120
- ): PikkuFunctionConfig<In, MCPToolResponse> => {
120
+ ): PikkuFunctionConfig<In, MCPToolResponse, 'mcp'> => {
121
121
  return typeof func === 'function' ? { func } : func
122
122
  }
123
123
 
@@ -131,12 +131,12 @@ export const pikkuMCPToolFunc = <In>(
131
131
  */
132
132
  export const pikkuMCPResourceFunc = <In>(
133
133
  func:
134
- | PikkuFunctionSessionless<In, MCPResourceResponse, null, true>
134
+ | PikkuFunctionSessionless<In, MCPResourceResponse, 'mcp'>
135
135
  | {
136
- func: PikkuFunctionSessionless<In, MCPResourceResponse, null, true>
136
+ func: PikkuFunctionSessionless<In, MCPResourceResponse, 'mcp'>
137
137
  name?: string
138
138
  }
139
- ): PikkuFunctionConfig<In, MCPResourceResponse> => {
139
+ ): PikkuFunctionConfig<In, MCPResourceResponse, 'mcp'> => {
140
140
  return typeof func === 'function' ? { func } : func
141
141
  }
142
142
  `
@@ -3,6 +3,7 @@ import { writeFileInDir } from '../../../utils/file-writer.js'
3
3
  import { logCommandInfoAndTime } from '../../../middleware/log-command-info-and-time.js'
4
4
  import { serializeMiddlewareImports } from './serialize-middleware-imports.js'
5
5
  import { serializeMiddlewareGroupsMeta } from './serialize-middleware-groups-meta.js'
6
+ import { getFileImportRelativePath } from '../../../utils/file-import-path.js'
6
7
 
7
8
  export const pikkuMiddleware: any = pikkuSessionlessFunc<
8
9
  void,
@@ -11,7 +12,7 @@ export const pikkuMiddleware: any = pikkuSessionlessFunc<
11
12
  func: async ({ logger, config, getInspectorState }) => {
12
13
  const state = await getInspectorState()
13
14
  const { middleware } = state
14
- const { middlewareFile, packageMappings } = config
15
+ const { middlewareFile, packageMappings, schema } = config
15
16
 
16
17
  let filesGenerated = false
17
18
 
@@ -20,12 +21,44 @@ export const pikkuMiddleware: any = pikkuSessionlessFunc<
20
21
  const hasTagGroups = state.middleware.tagMiddleware.size > 0
21
22
 
22
23
  if (hasHTTPGroups || hasTagGroups) {
24
+ const metaData = serializeMiddlewareGroupsMeta(state)
25
+
26
+ // Write JSON file
23
27
  await writeFileInDir(
24
28
  logger,
29
+ config.middlewareGroupsMetaJsonFile,
30
+ JSON.stringify(metaData, null, 2)
31
+ )
32
+
33
+ // Calculate relative path from TS file to JSON file
34
+ const jsonImportPath = getFileImportRelativePath(
25
35
  config.middlewareGroupsMetaFile,
26
- serializeMiddlewareGroupsMeta(state)
36
+ config.middlewareGroupsMetaJsonFile,
37
+ packageMappings
27
38
  )
28
39
 
40
+ // Write TypeScript file that imports JSON
41
+ const supportsImportAttributes = schema?.supportsImportAttributes ?? false
42
+ const importStatement = supportsImportAttributes
43
+ ? `import metaData from '${jsonImportPath}' with { type: 'json' }`
44
+ : `import metaData from '${jsonImportPath}'`
45
+
46
+ const tsContent = `import { pikkuState } from '@pikku/core'
47
+ ${importStatement}
48
+
49
+ // HTTP middleware groups metadata
50
+ if (metaData.httpGroups && Object.keys(metaData.httpGroups).length > 0) {
51
+ pikkuState('middleware', 'httpGroupMeta', metaData.httpGroups)
52
+ }
53
+
54
+ // Tag middleware groups metadata
55
+ if (metaData.tagGroups && Object.keys(metaData.tagGroups).length > 0) {
56
+ pikkuState('middleware', 'tagGroupMeta', metaData.tagGroups)
57
+ }
58
+ `
59
+
60
+ await writeFileInDir(logger, config.middlewareGroupsMetaFile, tsContent)
61
+
29
62
  // Always generate middleware imports file when groups exist (even if empty)
30
63
  await writeFileInDir(
31
64
  logger,
@@ -1,14 +1,12 @@
1
1
  import type { InspectorState } from '@pikku/inspector'
2
2
 
3
3
  /**
4
- * Generates the middleware groups metadata file that stores metadata about
4
+ * Generates the middleware groups metadata that stores metadata about
5
5
  * tag-based and HTTP middleware groups for visualization and inspection.
6
6
  *
7
7
  * This includes services, middleware count, factory status, etc.
8
8
  */
9
9
  export const serializeMiddlewareGroupsMeta = (state: InspectorState) => {
10
- const lines: string[] = [`import { pikkuState } from '@pikku/core'`, ``]
11
-
12
10
  // Serialize HTTP middleware groups metadata
13
11
  const httpGroups: Record<string, any> = {}
14
12
  for (const [pattern, meta] of state.http.routeMiddleware.entries()) {
@@ -22,14 +20,6 @@ export const serializeMiddlewareGroupsMeta = (state: InspectorState) => {
22
20
  }
23
21
  }
24
22
 
25
- if (Object.keys(httpGroups).length > 0) {
26
- lines.push(`// HTTP middleware groups metadata`)
27
- lines.push(
28
- `pikkuState('middleware', 'httpGroupMeta', ${JSON.stringify(httpGroups, null, 2)})`
29
- )
30
- lines.push(``)
31
- }
32
-
33
23
  // Serialize tag middleware groups metadata
34
24
  const tagGroups: Record<string, any> = {}
35
25
  for (const [tag, meta] of state.middleware.tagMiddleware.entries()) {
@@ -43,13 +33,8 @@ export const serializeMiddlewareGroupsMeta = (state: InspectorState) => {
43
33
  }
44
34
  }
45
35
 
46
- if (Object.keys(tagGroups).length > 0) {
47
- lines.push(`// Tag middleware groups metadata`)
48
- lines.push(
49
- `pikkuState('middleware', 'tagGroupMeta', ${JSON.stringify(tagGroups, null, 2)})`
50
- )
51
- lines.push(``)
36
+ return {
37
+ httpGroups,
38
+ tagGroups,
52
39
  }
53
-
54
- return lines.join('\n')
55
40
  }
@@ -17,10 +17,10 @@ export const pikkuPermissions: any = pikkuSessionlessFunc<
17
17
  // Check if there are any permission group factories
18
18
  const hasHTTPFactories = Array.from(
19
19
  state.http.routePermissions.values()
20
- ).some((meta) => meta.exportName && meta.isFactory)
20
+ ).some((meta: any) => meta.exportName && meta.isFactory)
21
21
  const hasTagFactories = Array.from(
22
22
  state.permissions.tagPermissions.values()
23
- ).some((meta) => meta.exportName && meta.isFactory)
23
+ ).some((meta: any) => meta.exportName && meta.isFactory)
24
24
  const hasFactories = hasHTTPFactories || hasTagFactories
25
25
 
26
26
  // Generate permissions imports file if there are factories