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