@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
@@ -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
  };
@@ -15,7 +15,7 @@ import type { PikkuFunctionConfig } from '${functionTypesImportPath}'
15
15
  * @template In - Input type for the queue job
16
16
  * @template Out - Output type for the queue job
17
17
  */
18
- type QueueWiring<In, Out> = CoreQueueWorker<PikkuFunctionConfig<In, Out>>
18
+ type QueueWiring<In, Out> = CoreQueueWorker<PikkuFunctionConfig<In, Out, 'session' | 'rpc'>>
19
19
 
20
20
  /**
21
21
  * Registers a queue worker with the Pikku framework.
@@ -1,12 +1,19 @@
1
1
  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
+ import { getFileImportRelativePath } from '../../../utils/file-import-path.js';
4
5
  export const pikkuRPC = pikkuSessionlessFunc({
5
6
  func: async ({ logger, config, getInspectorState }) => {
6
7
  const { rpc } = await getInspectorState();
7
- const { rpcInternalWiringMetaFile } = config;
8
+ const { rpcInternalWiringMetaFile, rpcInternalWiringMetaJsonFile, packageMappings, schema, } = config;
8
9
  if (rpc.internalFiles.size > 0) {
9
- await writeFileInDir(logger, rpcInternalWiringMetaFile, `import { pikkuState } from '@pikku/core'\npikkuState('rpc', 'meta', ${JSON.stringify(rpc.internalMeta, null, 2)})`);
10
+ await writeFileInDir(logger, rpcInternalWiringMetaJsonFile, JSON.stringify(rpc.internalMeta, null, 2));
11
+ const jsonImportPath = getFileImportRelativePath(rpcInternalWiringMetaFile, rpcInternalWiringMetaJsonFile, packageMappings);
12
+ const supportsImportAttributes = schema?.supportsImportAttributes ?? false;
13
+ const importStatement = supportsImportAttributes
14
+ ? `import metaData from '${jsonImportPath}' with { type: 'json' }`
15
+ : `import metaData from '${jsonImportPath}'`;
16
+ await writeFileInDir(logger, rpcInternalWiringMetaFile, `import { pikkuState } from '@pikku/core'\n${importStatement}\npikkuState('rpc', 'meta', metaData as Record<string, string>)`);
10
17
  return true;
11
18
  }
12
19
  return false;
@@ -13,16 +13,23 @@ import { pikkuSessionlessFunc, wireHTTP } from '${pathToPikkuTypes}'
13
13
  * This is used for public HTTP access to exposed server functions
14
14
  */
15
15
  export const rpcCaller = pikkuSessionlessFunc<
16
- { name: string, data?: any },
16
+ { rpcName: string, data?: any },
17
17
  any
18
18
  >({
19
- func: async ({ rpc }, { name, data }) => {
20
- return await (rpc.invokeExposed as any)(name, data)
19
+ func: async (services, { rpcName, data }, { rpc }) => {
20
+ return await (rpc.invokeExposed as any)(rpcName, data)
21
21
  },
22
22
  })
23
23
 
24
24
  wireHTTP({
25
- route: '/rpc',
25
+ route: "/rpc/:rpcName",
26
+ method: "options",
27
+ auth: false,
28
+ func: pikkuSessionlessFunc<{ rpcName: string }>(async () => void 0),
29
+ });
30
+
31
+ wireHTTP({
32
+ route: '/rpc/:rpcName',
26
33
  method: 'post',
27
34
  func: rpcCaller,
28
35
  })
@@ -16,7 +16,7 @@ export const pikkuRemoteInternalRPC = pikkuSessionlessFunc<
16
16
  { rpcName: string, data?: any },
17
17
  any
18
18
  >({
19
- func: async ({ rpc }, { rpcName, data }) => {
19
+ func: async (_services, { rpcName, data }, { rpc }) => {
20
20
  return await (rpc.invoke as any)(rpcName, data)
21
21
  },
22
22
  internal: true,
@@ -54,12 +54,12 @@ export class PikkuRPC {
54
54
  * This is a generic method that routes to the appropriate server function
55
55
  * based on the function name and passes the provided data.
56
56
  *
57
- * @param name - The name of the server function to invoke
57
+ * @param rpcName - The name of the server function to invoke
58
58
  * @param data - The data to pass to the server function
59
59
  * @returns A promise that resolves with the function's return value
60
60
  */
61
- invoke: RPCInvoke = async (name, data) => {
62
- return await this.pikkuFetch.post('/rpc' as any, { name, data }) as any
61
+ invoke: RPCInvoke = async (rpcName, data) => {
62
+ return await this.pikkuFetch.post(\`/rpc/\${rpcName}\` as any, { rpcName, data }) as any
63
63
  }
64
64
  }
65
65
 
@@ -2,13 +2,16 @@ 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 { serializeSchedulerMeta } from './serialize-scheduler-meta.js';
5
+ import { serializeSchedulerMeta, serializeSchedulerMetaTS, } from './serialize-scheduler-meta.js';
6
+ import { getFileImportRelativePath } from '../../../utils/file-import-path.js';
6
7
  export const pikkuScheduler = pikkuSessionlessFunc({
7
8
  func: async ({ logger, config, getInspectorState }) => {
8
9
  const visitState = await getInspectorState();
9
- const { schedulersWiringFile, schedulersWiringMetaFile, packageMappings } = config;
10
+ const { schedulersWiringFile, schedulersWiringMetaFile, schedulersWiringMetaJsonFile, packageMappings, schema, } = config;
10
11
  const { scheduledTasks } = visitState;
11
- await writeFileInDir(logger, schedulersWiringMetaFile, serializeSchedulerMeta(scheduledTasks.meta));
12
+ await writeFileInDir(logger, schedulersWiringMetaJsonFile, JSON.stringify(serializeSchedulerMeta(scheduledTasks.meta), null, 2));
13
+ const jsonImportPath = getFileImportRelativePath(schedulersWiringMetaFile, schedulersWiringMetaJsonFile, packageMappings);
14
+ await writeFileInDir(logger, schedulersWiringMetaFile, serializeSchedulerMetaTS(scheduledTasks.meta, jsonImportPath, schema?.supportsImportAttributes ?? false));
12
15
  await writeFileInDir(logger, schedulersWiringFile, serializeFileImports('addScheduledTasks', schedulersWiringFile, scheduledTasks.files, packageMappings));
13
16
  return true;
14
17
  },
@@ -1,2 +1,3 @@
1
1
  import { ScheduledTasksMeta } from '@pikku/core/scheduler';
2
- export declare const serializeSchedulerMeta: (scheduledTasksMeta: ScheduledTasksMeta) => string;
2
+ export declare const serializeSchedulerMeta: (scheduledTasksMeta: ScheduledTasksMeta) => ScheduledTasksMeta;
3
+ export declare const serializeSchedulerMetaTS: (scheduledTasksMeta: ScheduledTasksMeta, jsonImportPath: string, supportsImportAttributes: any) => string;
@@ -1,7 +1,17 @@
1
1
  export const serializeSchedulerMeta = (scheduledTasksMeta) => {
2
+ return scheduledTasksMeta;
3
+ };
4
+ export const serializeSchedulerMetaTS = (scheduledTasksMeta, 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('scheduler', 'meta', ${JSON.stringify(scheduledTasksMeta, null, 2)})`);
10
+ serializedOutput.push("import { ScheduledTasksMeta } from '@pikku/core/scheduler'");
11
+ serializedOutput.push(importStatement);
12
+ serializedOutput.push('');
13
+ serializedOutput.push("pikkuState('scheduler', 'meta', metaData as ScheduledTasksMeta)");
14
+ serializedOutput.push('');
5
15
  const scheduledTasksMetaValues = Object.values(scheduledTasksMeta);
6
16
  if (scheduledTasksMetaValues.length > 0) {
7
17
  serializedOutput.push(`export type ScheduledTaskNames = '${scheduledTasksMetaValues.map((s) => s.name).join("' | '")}'`);
@@ -13,7 +13,7 @@ import type { PikkuFunctionConfig, PikkuMiddleware } from '${functionTypesImport
13
13
  * Type definition for scheduled tasks that run at specified intervals.
14
14
  * These are sessionless functions that execute based on cron expressions.
15
15
  */
16
- type SchedulerWiring = CoreScheduledTask<PikkuFunctionConfig<void, void>, PikkuMiddleware>
16
+ type SchedulerWiring = CoreScheduledTask<PikkuFunctionConfig<void, void, 'session' | 'rpc'>, PikkuMiddleware>
17
17
 
18
18
  /**
19
19
  * Registers a scheduled task with the Pikku framework.
@@ -0,0 +1 @@
1
+ export declare const pikkuServiceMetadata: any;
@@ -0,0 +1,22 @@
1
+ import { pikkuSessionlessFunc } from '../../../../.pikku/pikku-types.gen.js';
2
+ import { logCommandInfoAndTime } from '../../../middleware/log-command-info-and-time.js';
3
+ import { writeAllServiceMetadata } from '@pikku/inspector';
4
+ export const pikkuServiceMetadata = pikkuSessionlessFunc({
5
+ func: async ({ logger, config, getInspectorState }) => {
6
+ const state = await getInspectorState();
7
+ // Only write service metadata if there are services to document
8
+ if (state.serviceMetadata && state.serviceMetadata.length > 0) {
9
+ writeAllServiceMetadata(state.serviceMetadata, config.outDir);
10
+ logger.debug(`• Wrote ${state.serviceMetadata.length} service metadata files`);
11
+ }
12
+ else {
13
+ logger.debug('• No service metadata to write');
14
+ }
15
+ },
16
+ middleware: [
17
+ logCommandInfoAndTime({
18
+ commandStart: 'Generating service metadata',
19
+ commandEnd: 'Generated service metadata',
20
+ }),
21
+ ],
22
+ });
@@ -6,6 +6,8 @@ export const pikkuWorkflowTypes = pikkuSessionlessFunc({
6
6
  func: async ({ logger, config }) => {
7
7
  const { workflowTypesFile, functionTypesFile, packageMappings } = config;
8
8
  const functionTypesImportPath = getFileImportRelativePath(workflowTypesFile, functionTypesFile, packageMappings);
9
- await writeFileInDir(logger, workflowTypesFile, serializeWorkflowTypes(functionTypesImportPath));
9
+ // Get RPC map import path
10
+ const rpcMapImportPath = getFileImportRelativePath(workflowTypesFile, config.rpcInternalMapDeclarationFile, packageMappings);
11
+ await writeFileInDir(logger, workflowTypesFile, serializeWorkflowTypes(functionTypesImportPath, rpcMapImportPath));
10
12
  },
11
13
  });
@@ -1,18 +1,18 @@
1
1
  import { pikkuSessionlessFunc } from '../../../../.pikku/pikku-types.gen.js';
2
2
  import { ErrorCode } from '@pikku/inspector';
3
- import { serializeFileImports } from '../../../utils/file-imports-serializer.js';
4
3
  import { writeFileInDir } from '../../../utils/file-writer.js';
5
4
  import { logCommandInfoAndTime } from '../../../middleware/log-command-info-and-time.js';
6
- import { serializeWorkflowMeta } from './serialize-workflow-meta.js';
5
+ import { serializeWorkflowMeta, serializeWorkflowMetaTS, } from './serialize-workflow-meta.js';
7
6
  import { serializeWorkflowTypes } from './serialize-workflow-types.js';
8
7
  import { serializeWorkflowMap } from './serialize-workflow-map.js';
9
8
  import { serializeWorkflowWorkers } from './serialize-workflow-workers.js';
9
+ import { serializeWorkflowWirings } from './serialize-workflow-wirings.js';
10
10
  import { getFileImportRelativePath } from '../../../utils/file-import-path.js';
11
11
  import { join } from 'path';
12
12
  export const pikkuWorkflow = pikkuSessionlessFunc({
13
13
  func: async ({ logger, config, getInspectorState }) => {
14
14
  const visitState = await getInspectorState();
15
- const { workflowsWiringFile, workflowsWiringMetaFile, workflowMapDeclarationFile, workflowTypesFile, functionTypesFile, typesDeclarationFile, packageMappings, } = config;
15
+ const { workflowsWiringFile, workflowsWiringMetaFile, workflowsWiringMetaJsonFile, workflowMapDeclarationFile, workflowTypesFile, functionTypesFile, typesDeclarationFile, packageMappings, schema, } = config;
16
16
  const { workflows, functions: functionState } = visitState;
17
17
  const { typesMap } = functionState;
18
18
  // Validate that workflowService service is configured if workflows are defined
@@ -24,13 +24,17 @@ export const pikkuWorkflow = pikkuSessionlessFunc({
24
24
  throw new Error('WorkflowState service not configured but workflows are defined');
25
25
  }
26
26
  }
27
- // Write workflow metadata
28
- await writeFileInDir(logger, workflowsWiringMetaFile, serializeWorkflowMeta(workflows.meta));
29
- // Write workflow wirings (imports)
30
- await writeFileInDir(logger, workflowsWiringFile, serializeFileImports('wireWorkflow', workflowsWiringFile, workflows.files, packageMappings));
27
+ await writeFileInDir(logger, workflowsWiringMetaJsonFile, JSON.stringify(serializeWorkflowMeta(workflows.meta), null, 2));
28
+ const jsonImportPath = getFileImportRelativePath(workflowsWiringMetaFile, workflowsWiringMetaJsonFile, packageMappings);
29
+ // Write workflow metadata TypeScript file that imports JSON
30
+ await writeFileInDir(logger, workflowsWiringMetaFile, serializeWorkflowMetaTS(workflows.meta, jsonImportPath, schema?.supportsImportAttributes ?? false));
31
+ // Write workflow wirings (imports and addWorkflow calls)
32
+ await writeFileInDir(logger, workflowsWiringFile, serializeWorkflowWirings(workflowsWiringFile, workflows.files, packageMappings));
31
33
  // Write workflow types
32
34
  const functionTypesImportPath = getFileImportRelativePath(workflowTypesFile, functionTypesFile, packageMappings);
33
- await writeFileInDir(logger, workflowTypesFile, serializeWorkflowTypes(functionTypesImportPath));
35
+ // Get RPC map import path
36
+ const rpcMapImportPath = getFileImportRelativePath(workflowTypesFile, config.rpcInternalMapDeclarationFile, packageMappings);
37
+ await writeFileInDir(logger, workflowTypesFile, serializeWorkflowTypes(functionTypesImportPath, rpcMapImportPath));
34
38
  // Write workflow map (type-safe client API)
35
39
  await writeFileInDir(logger, workflowMapDeclarationFile, serializeWorkflowMap(workflowMapDeclarationFile, packageMappings, typesMap, functionState.meta, workflows.meta));
36
40
  if (config.workflows) {
@@ -1,2 +1,3 @@
1
1
  import { WorkflowsMeta } from '@pikku/core/workflow';
2
- export declare const serializeWorkflowMeta: (workflowsMeta: WorkflowsMeta) => string;
2
+ export declare const serializeWorkflowMeta: (workflowsMeta: WorkflowsMeta) => WorkflowsMeta;
3
+ export declare const serializeWorkflowMetaTS: (workflowsMeta: WorkflowsMeta, jsonImportPath: string, supportsImportAttributes: boolean) => string;
@@ -1,7 +1,17 @@
1
1
  export const serializeWorkflowMeta = (workflowsMeta) => {
2
+ return workflowsMeta;
3
+ };
4
+ export const serializeWorkflowMetaTS = (workflowsMeta, 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('workflows', 'meta', ${JSON.stringify(workflowsMeta, null, 2)})`);
10
+ serializedOutput.push("import { WorkflowsMeta } from '@pikku/core/workflow'");
11
+ serializedOutput.push(importStatement);
12
+ serializedOutput.push('');
13
+ serializedOutput.push("pikkuState('workflows', 'meta', metaData as WorkflowsMeta)");
14
+ serializedOutput.push('');
5
15
  const workflowsMetaValues = Object.values(workflowsMeta);
6
16
  if (workflowsMetaValues.length > 0) {
7
17
  serializedOutput.push(`export type WorkflowNames = '${workflowsMetaValues.map((w) => w.workflowName).join("' | '")}'`);
@@ -1,4 +1,4 @@
1
1
  /**
2
2
  * Generates type definitions for workflow wirings
3
3
  */
4
- export declare const serializeWorkflowTypes: (functionTypesImportPath: string) => string;
4
+ export declare const serializeWorkflowTypes: (functionTypesImportPath: string, rpcMapImportPath: string) => string;