@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
@@ -50,7 +50,7 @@ import { pikkuMiddleware } from '${functionTypesPath}'
50
50
  ${imports}
51
51
 
52
52
  // Middleware to close the channel after CLI command completes
53
- const cliCloseOnComplete = pikkuMiddleware(async (services, { channel }, next) => {
53
+ const cliCloseOnComplete = pikkuMiddleware(async (_services, { channel }, next) => {
54
54
  const closeChannel = () => {
55
55
  setTimeout(async () => {
56
56
  try {
@@ -50,7 +50,7 @@ export const pikkuCLIRender = <Data, RequiredServices extends SingletonServices
50
50
  * CLI command configuration with project-specific types.
51
51
  * Uses CoreCLICommandConfig from @pikku/core with local middleware and render types.
52
52
  */
53
- type CLICommandConfig<Func extends PikkuFunctionConfig<In, Out>, In = any, Out = any, Params extends string = string> = CoreCLICommandConfig<Func, PikkuMiddleware, PikkuCLIRender<any>, Params>
53
+ type CLICommandConfig<Func extends PikkuFunctionConfig<In, Out, 'cli' | 'rpc' | 'session'>, In = any, Out = any, Params extends string = string> = CoreCLICommandConfig<Func, PikkuMiddleware, PikkuCLIRender<any>, Params>
54
54
 
55
55
  /**
56
56
  * Type definition for CLI applications with commands and global options.
@@ -84,7 +84,7 @@ export const wireCLI = <Commands extends Record<string, CoreCLICommandConfig<any
84
84
  * @returns CLI command configuration with inferred types
85
85
  */
86
86
  export const pikkuCLICommand = <
87
- FuncConfig extends PikkuFunctionConfig<any, any>,
87
+ FuncConfig extends PikkuFunctionConfig<any, any, 'cli' | 'rpc' | 'session'>,
88
88
  Params extends string
89
89
  >(
90
90
  config: CLICommandConfig<FuncConfig, any, any, Params>
@@ -8,7 +8,7 @@ export declare function serializeLocalCLIBootstrap(programName: string, _program
8
8
  }, singletonServicesFactory: {
9
9
  file: string;
10
10
  variable: string;
11
- }, sessionServicesFactory: {
11
+ }, wireServicesFactory: {
12
12
  file: string;
13
13
  variable: string;
14
14
  }): string;
@@ -2,18 +2,18 @@ import { getFileImportRelativePath } from '../../../utils/file-import-path.js';
2
2
  /**
3
3
  * Serializes the local (in-program) CLI bootstrap code
4
4
  */
5
- export function serializeLocalCLIBootstrap(programName, _programMeta, bootstrapFile, config, pikkuConfigFactory, singletonServicesFactory, sessionServicesFactory) {
5
+ export function serializeLocalCLIBootstrap(programName, _programMeta, bootstrapFile, config, pikkuConfigFactory, singletonServicesFactory, wireServicesFactory) {
6
6
  const capitalizedName = programName.charAt(0).toUpperCase() + programName.slice(1).replace(/-/g, '');
7
7
  // Get relative import paths
8
8
  const pikkuConfigPath = getFileImportRelativePath(bootstrapFile, pikkuConfigFactory.file, config.packageMappings);
9
9
  const singletonServicesPath = getFileImportRelativePath(bootstrapFile, singletonServicesFactory.file, config.packageMappings);
10
- const sessionServicesPath = getFileImportRelativePath(bootstrapFile, sessionServicesFactory.file, config.packageMappings);
10
+ const wireServicesPath = getFileImportRelativePath(bootstrapFile, wireServicesFactory.file, config.packageMappings);
11
11
  const cliBootstrapPath = getFileImportRelativePath(bootstrapFile, config.bootstrapFile, config.packageMappings);
12
12
  return `
13
13
  import { executeCLI, CLIError } from '@pikku/core/cli'
14
14
  import { ${pikkuConfigFactory.variable} as createConfig } from '${pikkuConfigPath}'
15
15
  import { ${singletonServicesFactory.variable} as createSingletonServices } from '${singletonServicesPath}'
16
- import { ${sessionServicesFactory.variable} as createSessionServices } from '${sessionServicesPath}'
16
+ import { ${wireServicesFactory.variable} as createWireServices } from '${wireServicesPath}'
17
17
  import '${cliBootstrapPath}'
18
18
 
19
19
  /**
@@ -27,7 +27,7 @@ export async function ${capitalizedName}CLI(args: string[]): Promise<void> {
27
27
  args: args || process.argv.slice(2),
28
28
  createConfig,
29
29
  createSingletonServices,
30
- createSessionServices,
30
+ createWireServices,
31
31
  })
32
32
  } catch (error) {
33
33
  if (error instanceof CLIError) {
@@ -11,17 +11,17 @@ export const pikkuFunctionTypesSplit = pikkuSessionlessFunc({
11
11
  // Check for required types
12
12
  checkRequiredTypes(visitState.filesAndMethodsErrors, {
13
13
  userSessionType: true,
14
- sessionServiceType: true,
14
+ wireServiceType: true,
15
15
  singletonServicesType: true,
16
16
  });
17
- const { userSessionType, sessionServicesType, singletonServicesType, pikkuConfigType, } = visitState.filesAndMethods;
18
- if (!userSessionType || !sessionServicesType || !singletonServicesType) {
17
+ const { userSessionType, wireServicesType, singletonServicesType, pikkuConfigType, } = visitState.filesAndMethods;
18
+ if (!userSessionType || !wireServicesType || !singletonServicesType) {
19
19
  throw new Error('Required types not found');
20
20
  }
21
21
  const configTypeImport = pikkuConfigType
22
22
  ? `import type { ${pikkuConfigType.type} } from '${getFileImportRelativePath(functionTypesFile, pikkuConfigType.typePath, packageMappings)}'`
23
23
  : '// Config type not found, will use fallback';
24
- const content = serializeFunctionTypes(`import type { ${userSessionType.type} } from '${getFileImportRelativePath(functionTypesFile, userSessionType.typePath, packageMappings)}'`, userSessionType.type, `import type { ${singletonServicesType.type} } from '${getFileImportRelativePath(functionTypesFile, singletonServicesType.typePath, packageMappings)}'`, singletonServicesType.type, `import type { ${sessionServicesType.type} } from '${getFileImportRelativePath(functionTypesFile, sessionServicesType.typePath, packageMappings)}'`, sessionServicesType.type, `import type { TypedPikkuRPC } from '${getFileImportRelativePath(functionTypesFile, rpcInternalMapDeclarationFile, packageMappings)}'`, `import type { RequiredSingletonServices, RequiredSessionServices } from '${getFileImportRelativePath(functionTypesFile, servicesFile, packageMappings)}'`, configTypeImport);
24
+ const content = serializeFunctionTypes(`import type { ${userSessionType.type} } from '${getFileImportRelativePath(functionTypesFile, userSessionType.typePath, packageMappings)}'`, userSessionType.type, `import type { ${singletonServicesType.type} } from '${getFileImportRelativePath(functionTypesFile, singletonServicesType.typePath, packageMappings)}'`, singletonServicesType.type, `import type { ${wireServicesType.type} } from '${getFileImportRelativePath(functionTypesFile, wireServicesType.typePath, packageMappings)}'`, wireServicesType.type, `import type { TypedPikkuRPC } from '${getFileImportRelativePath(functionTypesFile, rpcInternalMapDeclarationFile, packageMappings)}'`, `import type { RequiredSingletonServices, RequiredWireServices } from '${getFileImportRelativePath(functionTypesFile, servicesFile, packageMappings)}'`, configTypeImport);
25
25
  await writeFileInDir(logger, functionTypesFile, content);
26
26
  },
27
27
  middleware: [
@@ -2,15 +2,25 @@ import { pikkuSessionlessFunc } from '../../../../.pikku/pikku-types.gen.js';
2
2
  import { writeFileInDir } from '../../../utils/file-writer.js';
3
3
  import { logCommandInfoAndTime } from '../../../middleware/log-command-info-and-time.js';
4
4
  import { generateRuntimeMeta, serializeFunctionImports, } from './serialize-function-imports.js';
5
+ import { getFileImportRelativePath } from '../../../utils/file-import-path.js';
5
6
  export const pikkuFunctions = pikkuSessionlessFunc({
6
7
  func: async ({ logger, config, getInspectorState }) => {
7
8
  const { functions, rpc } = await getInspectorState();
8
- const { functionsMetaFile, functionsMetaMinFile, functionsFile, packageMappings, } = config;
9
- // Generate full metadata
10
- await writeFileInDir(logger, functionsMetaFile, `import { pikkuState } from '@pikku/core'\npikkuState('function', 'meta', ${JSON.stringify(functions.meta, null, 2)})`);
11
- // Generate minimal metadata (runtime)
9
+ const { functionsMetaFile, functionsMetaJsonFile, functionsMetaMinFile, functionsMetaMinJsonFile, functionsFile, packageMappings, schema, } = config;
10
+ await writeFileInDir(logger, functionsMetaJsonFile, JSON.stringify(functions.meta, null, 2));
11
+ const fullJsonImportPath = getFileImportRelativePath(functionsMetaFile, functionsMetaJsonFile, packageMappings);
12
+ const supportsImportAttributes = schema?.supportsImportAttributes ?? false;
13
+ const fullImportStatement = supportsImportAttributes
14
+ ? `import metaData from '${fullJsonImportPath}' with { type: 'json' }`
15
+ : `import metaData from '${fullJsonImportPath}'`;
16
+ await writeFileInDir(logger, functionsMetaFile, `import { pikkuState, FunctionsMeta } from '@pikku/core'\n${fullImportStatement}\npikkuState('function', 'meta', metaData as FunctionsMeta)`);
12
17
  const runtimeMeta = generateRuntimeMeta(functions.meta);
13
- await writeFileInDir(logger, functionsMetaMinFile, `import { pikkuState } from '@pikku/core'\npikkuState('function', 'meta', ${JSON.stringify(runtimeMeta, null, 2)})`);
18
+ await writeFileInDir(logger, functionsMetaMinJsonFile, JSON.stringify(runtimeMeta, null, 2));
19
+ const minJsonImportPath = getFileImportRelativePath(functionsMetaMinFile, functionsMetaMinJsonFile, packageMappings);
20
+ const minImportStatement = supportsImportAttributes
21
+ ? `import metaData from '${minJsonImportPath}' with { type: 'json' }`
22
+ : `import metaData from '${minJsonImportPath}'`;
23
+ await writeFileInDir(logger, functionsMetaMinFile, `import { pikkuState, FunctionsRuntimeMeta } from '@pikku/core'\n${minImportStatement}\npikkuState('function', 'meta', metaData as FunctionsRuntimeMeta)`);
14
24
  const hasRPCs = rpc.exposedFiles.size > 0 || rpc.internalFiles.size > 0;
15
25
  if (hasRPCs) {
16
26
  await writeFileInDir(logger, functionsFile, serializeFunctionImports(functionsFile, rpc.internalFiles, functions.meta, packageMappings));
@@ -1,2 +1,2 @@
1
- export declare const serializeServicesMap: (allSingletonServices: string[], allSessionServices: string[], requiredServices: Set<string>, forceRequiredServices: string[] | undefined, servicesImport: string, sessionServicesImport: string) => string;
1
+ export declare const serializeServicesMap: (allSingletonServices: string[], allWireServices: string[], requiredServices: Set<string>, forceRequiredServices: string[] | undefined, servicesImport: string, wireServicesImport: string) => string;
2
2
  export declare const pikkuServices: any;
@@ -3,7 +3,7 @@ import { getFileImportRelativePath } from '../../../utils/file-import-path.js';
3
3
  import { checkRequiredTypes } from '../../../utils/check-required-types.js';
4
4
  import { writeFileInDir } from '../../../utils/file-writer.js';
5
5
  import { logCommandInfoAndTime } from '../../../middleware/log-command-info-and-time.js';
6
- export const serializeServicesMap = (allSingletonServices, allSessionServices, requiredServices, forceRequiredServices = [], servicesImport, sessionServicesImport) => {
6
+ export const serializeServicesMap = (allSingletonServices, allWireServices, requiredServices, forceRequiredServices = [], servicesImport, wireServicesImport) => {
7
7
  // Use pre-aggregated services from inspector state
8
8
  // This includes services from:
9
9
  // - Wired functions (HTTP, channels, queues, schedulers, MCP, CLI, RPC)
@@ -11,7 +11,7 @@ export const serializeServicesMap = (allSingletonServices, allSessionServices, r
11
11
  // - Permissions used by wired functions
12
12
  // - Session factories
13
13
  const usedServices = new Set(requiredServices);
14
- // Internal services that are created internally by the framework (PikkuInteraction)
14
+ // Internal services that are created internally by the framework (PikkuWire)
15
15
  // These should not appear in the services maps
16
16
  const internalServices = new Set([
17
17
  'rpc',
@@ -37,24 +37,24 @@ export const serializeServicesMap = (allSingletonServices, allSessionServices, r
37
37
  allSingletonServices.forEach((service) => {
38
38
  singletonServicesMap[service] = usedServices.has(service);
39
39
  });
40
- // Create session services map: all session services with true/false based on usage
41
- // Exclude internal framework services (PikkuInteraction)
42
- const sessionServicesMap = {};
43
- allSessionServices.forEach((service) => {
40
+ // Create wire services map: all wire services with true/false based on usage
41
+ // Exclude internal framework services (PikkuWire)
42
+ const wireServicesMap = {};
43
+ allWireServices.forEach((service) => {
44
44
  if (!internalServices.has(service)) {
45
- sessionServicesMap[service] = usedServices.has(service);
45
+ wireServicesMap[service] = usedServices.has(service);
46
46
  }
47
47
  });
48
48
  // Get all required service names (those marked as true)
49
49
  const requiredSingletonServiceNames = Object.keys(singletonServicesMap)
50
50
  .filter((key) => singletonServicesMap[key])
51
51
  .sort();
52
- const requiredSessionServiceNames = Object.keys(sessionServicesMap)
53
- .filter((key) => sessionServicesMap[key])
52
+ const requiredWireServiceNames = Object.keys(wireServicesMap)
53
+ .filter((key) => wireServicesMap[key])
54
54
  .sort();
55
55
  const code = [
56
56
  servicesImport,
57
- sessionServicesImport,
57
+ wireServicesImport,
58
58
  '',
59
59
  '// Singleton services map: true if required, false if available but unused',
60
60
  'export const requiredSingletonServices = {',
@@ -63,11 +63,11 @@ export const serializeServicesMap = (allSingletonServices, allSessionServices, r
63
63
  .map((service) => ` '${service}': ${singletonServicesMap[service]},`),
64
64
  '} as const',
65
65
  '',
66
- '// Session services map: true if required, false if available but unused',
67
- 'export const requiredSessionServices = {',
68
- ...Object.keys(sessionServicesMap)
66
+ '// Wire services map: true if required, false if available but unused',
67
+ 'export const requiredWireServices = {',
68
+ ...Object.keys(wireServicesMap)
69
69
  .sort()
70
- .map((service) => ` '${service}': ${sessionServicesMap[service]},`),
70
+ .map((service) => ` '${service}': ${wireServicesMap[service]},`),
71
71
  '} as const',
72
72
  '',
73
73
  '// Type exports',
@@ -75,9 +75,9 @@ export const serializeServicesMap = (allSingletonServices, allSessionServices, r
75
75
  ? `export type RequiredSingletonServices = Pick<SingletonServices, ${requiredSingletonServiceNames.map((key) => `'${key}'`).join(' | ')}> & Partial<Omit<SingletonServices, ${requiredSingletonServiceNames.map((key) => `'${key}'`).join(' | ')}>>`
76
76
  : 'export type RequiredSingletonServices = Partial<SingletonServices>',
77
77
  '',
78
- requiredSessionServiceNames.length > 0
79
- ? `export type RequiredSessionServices = Pick<Services, ${requiredSessionServiceNames.map((key) => `'${key}'`).join(' | ')}> & Partial<Omit<Services, ${requiredSessionServiceNames.map((key) => `'${key}'`).join(' | ')}>>`
80
- : 'export type RequiredSessionServices = Partial<Services>',
78
+ requiredWireServiceNames.length > 0
79
+ ? `export type RequiredWireServices = Pick<Services, ${requiredWireServiceNames.map((key) => `'${key}'`).join(' | ')}> & Partial<Omit<Services, ${requiredWireServiceNames.map((key) => `'${key}'`).join(' | ')}>>`
80
+ : 'export type RequiredWireServices = Partial<Services>',
81
81
  '',
82
82
  ].join('\n');
83
83
  return code;
@@ -87,16 +87,16 @@ export const pikkuServices = pikkuSessionlessFunc({
87
87
  const visitState = await getInspectorState();
88
88
  // Check for required types
89
89
  checkRequiredTypes(visitState.filesAndMethodsErrors, {
90
- sessionServiceType: true,
90
+ wireServiceType: true,
91
91
  singletonServicesType: true,
92
92
  });
93
- const { sessionServicesType, singletonServicesType } = visitState.filesAndMethods;
94
- if (!sessionServicesType || !singletonServicesType) {
95
- throw new Error('Required types not found: sessionServicesType or singletonServicesType');
93
+ const { wireServicesType, singletonServicesType } = visitState.filesAndMethods;
94
+ if (!wireServicesType || !singletonServicesType) {
95
+ throw new Error('Required types not found: wireServicesType or singletonServicesType');
96
96
  }
97
97
  const servicesImport = `import type { ${singletonServicesType.type} } from '${getFileImportRelativePath(config.typesDeclarationFile, singletonServicesType.typePath, config.packageMappings)}'`;
98
- const sessionServicesImport = `import type { ${sessionServicesType.type} } from '${getFileImportRelativePath(config.typesDeclarationFile, sessionServicesType.typePath, config.packageMappings)}'`;
99
- const servicesCode = serializeServicesMap(visitState.serviceAggregation.allSingletonServices, visitState.serviceAggregation.allSessionServices, visitState.serviceAggregation.requiredServices, config.forceRequiredServices, servicesImport, sessionServicesImport);
98
+ const wireServicesImport = `import type { ${wireServicesType.type} } from '${getFileImportRelativePath(config.typesDeclarationFile, wireServicesType.typePath, config.packageMappings)}'`;
99
+ const servicesCode = serializeServicesMap(visitState.serviceAggregation.allSingletonServices, visitState.serviceAggregation.allWireServices, visitState.serviceAggregation.requiredServices, config.forceRequiredServices, servicesImport, wireServicesImport);
100
100
  await writeFileInDir(logger, config.servicesFile, servicesCode);
101
101
  },
102
102
  middleware: [
@@ -8,7 +8,7 @@ export const pikkuSchemas = pikkuSessionlessFunc({
8
8
  func: async ({ logger, config, getInspectorState }) => {
9
9
  const visitState = await getInspectorState();
10
10
  const schemas = await generateSchemas(logger, config.tsconfig, visitState.functions.typesMap, visitState.functions.meta, visitState.http.meta, config.schemasFromTypes, config.schema?.additionalProperties);
11
- await saveSchemas(logger, config.schemaDirectory, schemas, visitState.functions.typesMap, visitState.functions.meta, config.schemasFromTypes, config.schema?.supportsImportAttributes);
11
+ await saveSchemas(logger, config.schemaDirectory, schemas, visitState.functions.typesMap, visitState.functions.meta, config.schema?.supportsImportAttributes || true, config.schemasFromTypes);
12
12
  return true;
13
13
  },
14
14
  middleware: [
@@ -1,4 +1,4 @@
1
1
  /**
2
2
  * Generates core function, middleware, and permission type definitions
3
3
  */
4
- export declare const serializeFunctionTypes: (userSessionTypeImport: string, userSessionTypeName: string, singletonServicesTypeImport: string, singletonServicesTypeName: string, sessionServicesTypeImport: string, sessionServicesTypeName: string, rpcMapTypeImport: string, requiredServicesTypeImport: string, configTypeImport: string) => string;
4
+ export declare const serializeFunctionTypes: (userSessionTypeImport: string, userSessionTypeName: string, singletonServicesTypeImport: string, singletonServicesTypeName: string, wireServicesTypeImport: string, wireServicesTypeName: string, rpcMapTypeImport: string, requiredServicesTypeImport: string, configTypeImport: string) => string;
@@ -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.