@pikku/cli 0.12.82 → 0.12.85

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 (346) hide show
  1. package/cli.schema.json +1 -1
  2. package/console-app/assets/{index-ChcXIEhS.js → index-CEv-kj3J.js} +154 -147
  3. package/console-app/assets/index-CSzCJzBb.css +1 -0
  4. package/console-app/index.html +2 -2
  5. package/dist/.pikku/agent/pikku-agent-types.gen.d.ts +4 -2
  6. package/dist/.pikku/auth/auth.types.d.ts +4 -0
  7. package/dist/.pikku/auth/auth.types.js +5 -0
  8. package/dist/.pikku/channel/pikku-channel-types.gen.d.ts +1 -1
  9. package/dist/.pikku/channel/pikku-channel-types.gen.js +1 -1
  10. package/dist/.pikku/cli/pikku-cli-channel.d.ts +4 -4
  11. package/dist/.pikku/cli/pikku-cli-channel.js +21 -1
  12. package/dist/.pikku/cli/pikku-cli-client.gen.d.ts +1 -1
  13. package/dist/.pikku/cli/pikku-cli-client.gen.js +1 -1
  14. package/dist/.pikku/cli/pikku-cli-contracts-meta.gen.d.ts +1 -1
  15. package/dist/.pikku/cli/pikku-cli-contracts-meta.gen.js +1 -1
  16. package/dist/.pikku/cli/pikku-cli-types.gen.d.ts +1 -1
  17. package/dist/.pikku/cli/pikku-cli-types.gen.js +1 -1
  18. package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.js +1 -1
  19. package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.json +60 -3
  20. package/dist/.pikku/cli/pikku-cli-wirings.gen.d.ts +1 -1
  21. package/dist/.pikku/cli/pikku-cli-wirings.gen.js +1 -1
  22. package/dist/.pikku/cli/pikku-cli.gen.d.ts +1 -1
  23. package/dist/.pikku/cli/pikku-cli.gen.js +1 -1
  24. package/dist/.pikku/console/pikku-node-types.gen.d.ts +1 -1
  25. package/dist/.pikku/function/pikku-function-types.gen.d.ts +29 -25
  26. package/dist/.pikku/function/pikku-function-types.gen.js +3 -12
  27. package/dist/.pikku/function/pikku-functions-meta.gen.js +1 -1
  28. package/dist/.pikku/function/pikku-functions-meta.gen.json +195 -32
  29. package/dist/.pikku/function/pikku-functions.gen.js +15 -3
  30. package/dist/.pikku/http/pikku-http-types.gen.d.ts +2 -24
  31. package/dist/.pikku/http/pikku-http-types.gen.js +2 -24
  32. package/dist/.pikku/mcp/pikku-mcp-types.gen.d.ts +1 -1
  33. package/dist/.pikku/mcp/pikku-mcp-types.gen.js +1 -1
  34. package/dist/.pikku/pikku-bootstrap.gen.d.ts +1 -5
  35. package/dist/.pikku/pikku-bootstrap.gen.js +1 -5
  36. package/dist/.pikku/pikku-meta-service.gen.d.ts +1 -1
  37. package/dist/.pikku/pikku-meta-service.gen.js +1 -1
  38. package/dist/.pikku/pikku-services.gen.d.ts +4 -1
  39. package/dist/.pikku/pikku-services.gen.js +3 -0
  40. package/dist/.pikku/pikku-types.gen.d.ts +2 -1
  41. package/dist/.pikku/pikku-types.gen.js +3 -1
  42. package/dist/.pikku/queue/pikku-queue-types.gen.d.ts +1 -1
  43. package/dist/.pikku/queue/pikku-queue-types.gen.js +1 -1
  44. package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.js +1 -1
  45. package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.json +10 -2
  46. package/dist/.pikku/scheduler/pikku-scheduler-types.gen.d.ts +1 -1
  47. package/dist/.pikku/scheduler/pikku-scheduler-types.gen.js +1 -1
  48. package/dist/.pikku/schemas/register.gen.js +13 -7
  49. package/dist/.pikku/schemas/schemas/PikkuCLIConfig.schema.json +1 -1
  50. package/dist/.pikku/schemas/schemas/PikkuGraphWiringsOutput.schema.json +1 -0
  51. package/dist/.pikku/schemas/schemas/PikkuImportN8nInput.schema.json +1 -0
  52. package/dist/.pikku/schemas/schemas/PikkuScopesInput.schema.json +1 -0
  53. package/dist/.pikku/schemas/schemas/PikkuWebhookOutput.schema.json +1 -0
  54. package/dist/.pikku/schemas/schemas/ScopesAuditInput.schema.json +1 -0
  55. package/dist/.pikku/schemas/schemas/ScopesPruneInput.schema.json +1 -0
  56. package/dist/.pikku/scopes/pikku-scope-types.gen.d.ts +5 -0
  57. package/dist/.pikku/scopes/pikku-scope-types.gen.js +4 -0
  58. package/dist/.pikku/scopes/pikku-scopes-meta.gen.json +1 -0
  59. package/dist/.pikku/scopes/pikku-scopes.gen.d.ts +35 -0
  60. package/dist/.pikku/scopes/pikku-scopes.gen.js +27 -0
  61. package/dist/.pikku/secrets/pikku-secret-types.gen.d.ts +1 -1
  62. package/dist/.pikku/secrets/pikku-secret-types.gen.js +1 -1
  63. package/dist/.pikku/secrets/pikku-secrets-meta.gen.json +1 -0
  64. package/dist/.pikku/secrets/pikku-secrets.gen.d.ts +11 -1
  65. package/dist/.pikku/secrets/pikku-secrets.gen.js +11 -1
  66. package/dist/.pikku/trigger/pikku-trigger-types.gen.d.ts +1 -1
  67. package/dist/.pikku/trigger/pikku-trigger-types.gen.js +1 -1
  68. package/dist/.pikku/variables/pikku-variable-types.gen.d.ts +1 -1
  69. package/dist/.pikku/variables/pikku-variable-types.gen.js +1 -1
  70. package/dist/.pikku/variables/pikku-variables-meta.gen.json +1 -0
  71. package/dist/.pikku/variables/pikku-variables.gen.d.ts +11 -1
  72. package/dist/.pikku/variables/pikku-variables.gen.js +13 -3
  73. package/dist/.pikku/workflow/meta/allWorkflow.gen.json +49 -7
  74. package/dist/.pikku/workflow/pikku-workflow-types.gen.d.ts +11 -2
  75. package/dist/.pikku/workflow/pikku-workflow-types.gen.js +1 -1
  76. package/dist/.pikku/workflow/pikku-workflow-wirings-meta.gen.js +1 -1
  77. package/dist/.pikku/workflow/pikku-workflow-wirings.gen.js +1 -1
  78. package/dist/bin/pikku-bin.mjs +2 -2
  79. package/dist/src/cli.wiring.js +47 -4
  80. package/dist/src/deploy/analyzer/analyzer.js +6 -0
  81. package/dist/src/fabric/fabric-commands.d.ts +53 -53
  82. package/dist/src/fabric/functions/add.function.d.ts +2 -2
  83. package/dist/src/fabric/functions/addon-verify.function.d.ts +2 -2
  84. package/dist/src/fabric/functions/db-schema.function.d.ts +2 -2
  85. package/dist/src/fabric/functions/deploy-list.function.d.ts +2 -2
  86. package/dist/src/fabric/functions/deploy-units.function.d.ts +2 -2
  87. package/dist/src/fabric/functions/deploy.function.d.ts +4 -4
  88. package/dist/src/fabric/functions/domains-add.function.d.ts +2 -2
  89. package/dist/src/fabric/functions/domains-list.function.d.ts +2 -2
  90. package/dist/src/fabric/functions/domains-remove.function.d.ts +2 -2
  91. package/dist/src/fabric/functions/errors.function.d.ts +2 -2
  92. package/dist/src/fabric/functions/init.function.d.ts +2 -2
  93. package/dist/src/fabric/functions/link.function.d.ts +2 -2
  94. package/dist/src/fabric/functions/llm-key.function.d.ts +6 -6
  95. package/dist/src/fabric/functions/login.function.d.ts +2 -2
  96. package/dist/src/fabric/functions/logs.function.d.ts +2 -2
  97. package/dist/src/fabric/functions/metrics.function.d.ts +2 -2
  98. package/dist/src/fabric/functions/publish.function.d.ts +2 -2
  99. package/dist/src/fabric/functions/rollback.function.d.ts +2 -2
  100. package/dist/src/fabric/functions/secrets-list.function.d.ts +2 -2
  101. package/dist/src/fabric/functions/secrets-set.function.d.ts +2 -2
  102. package/dist/src/fabric/functions/smoke.function.d.ts +2 -2
  103. package/dist/src/fabric/functions/status.function.d.ts +2 -2
  104. package/dist/src/fabric/functions/trace.function.d.ts +2 -2
  105. package/dist/src/fabric/functions/validate.function.d.ts +2 -2
  106. package/dist/src/functions/commands/all.d.ts +1 -1
  107. package/dist/src/functions/commands/audit.d.ts +1 -1
  108. package/dist/src/functions/commands/binary.d.ts +2 -2
  109. package/dist/src/functions/commands/bootstrap.d.ts +1 -1
  110. package/dist/src/functions/commands/bootstrap.js +3 -0
  111. package/dist/src/functions/commands/db-audit.d.ts +1 -1
  112. package/dist/src/functions/commands/db-generate.d.ts +1 -1
  113. package/dist/src/functions/commands/db-migrate.d.ts +1 -1
  114. package/dist/src/functions/commands/db-reset.d.ts +1 -1
  115. package/dist/src/functions/commands/db-seed.d.ts +1 -1
  116. package/dist/src/functions/commands/deploy-apply.d.ts +2 -2
  117. package/dist/src/functions/commands/deploy-info.d.ts +1 -1
  118. package/dist/src/functions/commands/deploy-plan.d.ts +2 -2
  119. package/dist/src/functions/commands/dev.d.ts +2 -2
  120. package/dist/src/functions/commands/dev.js +14 -3
  121. package/dist/src/functions/commands/emails-init.d.ts +1 -1
  122. package/dist/src/functions/commands/enable.d.ts +8 -7
  123. package/dist/src/functions/commands/enable.js +10 -5
  124. package/dist/src/functions/commands/import-n8n.d.ts +10 -0
  125. package/dist/src/functions/commands/import-n8n.js +130 -0
  126. package/dist/src/functions/commands/info.d.ts +4 -4
  127. package/dist/src/functions/commands/info.js +0 -13
  128. package/dist/src/functions/commands/login.d.ts +5 -5
  129. package/dist/src/functions/commands/meta.d.ts +25 -25
  130. package/dist/src/functions/commands/new-addon.d.ts +13 -2
  131. package/dist/src/functions/commands/new-addon.js +71 -39
  132. package/dist/src/functions/commands/new-function.d.ts +2 -2
  133. package/dist/src/functions/commands/new-middleware.d.ts +2 -2
  134. package/dist/src/functions/commands/new-permission.d.ts +2 -2
  135. package/dist/src/functions/commands/new-wiring.d.ts +2 -2
  136. package/dist/src/functions/commands/pikku-command-bootstrap.d.ts +1 -1
  137. package/dist/src/functions/commands/pikku-command-bootstrap.js +6 -0
  138. package/dist/src/functions/commands/pikku-command-summary.d.ts +1 -1
  139. package/dist/src/functions/commands/scenario.d.ts +3 -3
  140. package/dist/src/functions/commands/scopes-audit.d.ts +1 -0
  141. package/dist/src/functions/commands/scopes-audit.js +37 -0
  142. package/dist/src/functions/commands/scopes-prune.d.ts +14 -0
  143. package/dist/src/functions/commands/scopes-prune.js +50 -0
  144. package/dist/src/functions/commands/scopes-shared.d.ts +39 -0
  145. package/dist/src/functions/commands/scopes-shared.js +83 -0
  146. package/dist/src/functions/commands/serve.d.ts +2 -2
  147. package/dist/src/functions/commands/serve.js +4 -2
  148. package/dist/src/functions/commands/skills.d.ts +4 -4
  149. package/dist/src/functions/commands/skills.js +18 -10
  150. package/dist/src/functions/commands/versions-check.d.ts +1 -1
  151. package/dist/src/functions/commands/versions-init.d.ts +2 -2
  152. package/dist/src/functions/commands/versions-update.d.ts +1 -1
  153. package/dist/src/functions/commands/watch.d.ts +2 -2
  154. package/dist/src/functions/commands/workspace-validate.d.ts +2 -2
  155. package/dist/src/functions/runtimes/fetch/index.d.ts +1 -1
  156. package/dist/src/functions/runtimes/nextjs/pikku-command-nextjs.d.ts +1 -1
  157. package/dist/src/functions/runtimes/tanstack-start/pikku-command-tanstack-start.d.ts +1 -1
  158. package/dist/src/functions/runtimes/websocket/pikku-command-websocket-typed.d.ts +1 -1
  159. package/dist/src/functions/wirings/ai-agent/pikku-command-ai-agent-types.d.ts +1 -1
  160. package/dist/src/functions/wirings/ai-agent/pikku-command-ai-agent-types.js +3 -2
  161. package/dist/src/functions/wirings/ai-agent/pikku-command-ai-agent.d.ts +1 -1
  162. package/dist/src/functions/wirings/ai-agent/pikku-command-public-agent.d.ts +1 -1
  163. package/dist/src/functions/wirings/ai-agent/serialize-ai-agent-types.d.ts +1 -1
  164. package/dist/src/functions/wirings/ai-agent/serialize-ai-agent-types.js +4 -2
  165. package/dist/src/functions/wirings/ai-agent/serialize-public-agent.js +55 -16
  166. package/dist/src/functions/wirings/auth/pikku-command-auth.d.ts +2 -2
  167. package/dist/src/functions/wirings/channels/pikku-channels.d.ts +1 -1
  168. package/dist/src/functions/wirings/channels/pikku-command-channel-types.d.ts +1 -1
  169. package/dist/src/functions/wirings/channels/pikku-command-channels-map.d.ts +1 -1
  170. package/dist/src/functions/wirings/channels/pikku-command-channels.d.ts +1 -1
  171. package/dist/src/functions/wirings/cli/pikku-command-cli-entry.d.ts +1 -1
  172. package/dist/src/functions/wirings/cli/pikku-command-cli-types.d.ts +1 -1
  173. package/dist/src/functions/wirings/cli/pikku-command-cli.d.ts +1 -1
  174. package/dist/src/functions/wirings/console/pikku-command-console-functions.d.ts +1 -1
  175. package/dist/src/functions/wirings/console/pikku-command-node-types.d.ts +1 -1
  176. package/dist/src/functions/wirings/console/pikku-command-nodes-meta.d.ts +1 -1
  177. package/dist/src/functions/wirings/console/serialize-console-functions.js +6 -0
  178. package/dist/src/functions/wirings/credentials/pikku-command-credentials.d.ts +1 -1
  179. package/dist/src/functions/wirings/credentials/serialize-credentials-types.js +22 -0
  180. package/dist/src/functions/wirings/emails/pikku-command-emails.d.ts +1 -1
  181. package/dist/src/functions/wirings/functions/pikku-command-addon-types.d.ts +1 -1
  182. package/dist/src/functions/wirings/functions/pikku-command-function-types-split.d.ts +2 -2
  183. package/dist/src/functions/wirings/functions/pikku-command-function-types-split.js +1 -1
  184. package/dist/src/functions/wirings/functions/pikku-command-function-types.d.ts +2 -2
  185. package/dist/src/functions/wirings/functions/pikku-command-function-types.js +2 -2
  186. package/dist/src/functions/wirings/functions/pikku-command-functions.d.ts +1 -1
  187. package/dist/src/functions/wirings/functions/pikku-command-services.d.ts +2 -2
  188. package/dist/src/functions/wirings/functions/pikku-command-services.js +9 -2
  189. package/dist/src/functions/wirings/functions/schemas.d.ts +1 -1
  190. package/dist/src/functions/wirings/functions/serialize-function-types.d.ts +1 -1
  191. package/dist/src/functions/wirings/functions/serialize-function-types.js +37 -28
  192. package/dist/src/functions/wirings/functions/serialize-pikku-types-hub.d.ts +1 -1
  193. package/dist/src/functions/wirings/functions/serialize-pikku-types-hub.js +6 -2
  194. package/dist/src/functions/wirings/gateway/pikku-command-gateway.d.ts +1 -1
  195. package/dist/src/functions/wirings/graph/pikku-command-graph-wirings.d.ts +1 -0
  196. package/dist/src/functions/wirings/graph/pikku-command-graph-wirings.js +21 -0
  197. package/dist/src/functions/wirings/graph/serialize-graph-wirings.d.ts +5 -0
  198. package/dist/src/functions/wirings/graph/serialize-graph-wirings.js +14 -0
  199. package/dist/src/functions/wirings/http/pikku-command-http-map.d.ts +1 -1
  200. package/dist/src/functions/wirings/http/pikku-command-http-routes.d.ts +1 -1
  201. package/dist/src/functions/wirings/http/pikku-command-http-types.d.ts +1 -1
  202. package/dist/src/functions/wirings/http/pikku-command-openapi.d.ts +1 -1
  203. package/dist/src/functions/wirings/http/pikku-http-routes.d.ts +1 -1
  204. package/dist/src/functions/wirings/http/serialize-http-types.js +2 -30
  205. package/dist/src/functions/wirings/mcp/pikku-command-mcp-json.d.ts +1 -1
  206. package/dist/src/functions/wirings/mcp/pikku-command-mcp-types.d.ts +1 -1
  207. package/dist/src/functions/wirings/mcp/pikku-command-mcp.d.ts +1 -1
  208. package/dist/src/functions/wirings/middleware/pikku-command-middleware.d.ts +1 -1
  209. package/dist/src/functions/wirings/package/pikku-command-package-types.d.ts +3 -2
  210. package/dist/src/functions/wirings/package/pikku-command-package-types.js +14 -1
  211. package/dist/src/functions/wirings/package/pikku-command-package.d.ts +1 -1
  212. package/dist/src/functions/wirings/package/serialize-package-types.d.ts +1 -0
  213. package/dist/src/functions/wirings/package/serialize-package-types.js +5 -0
  214. package/dist/src/functions/wirings/permissions/pikku-command-permissions.d.ts +1 -1
  215. package/dist/src/functions/wirings/permissions/pikku-command-permissions.js +1 -3
  216. package/dist/src/functions/wirings/permissions/serialize-permissions-imports.d.ts +6 -1
  217. package/dist/src/functions/wirings/permissions/serialize-permissions-imports.js +7 -64
  218. package/dist/src/functions/wirings/queue/pikku-command-queue-map.d.ts +1 -1
  219. package/dist/src/functions/wirings/queue/pikku-command-queue-service.d.ts +1 -1
  220. package/dist/src/functions/wirings/queue/pikku-command-queue-types.d.ts +1 -1
  221. package/dist/src/functions/wirings/queue/pikku-command-queue.d.ts +1 -1
  222. package/dist/src/functions/wirings/queue/pikku-queue-map.d.ts +1 -1
  223. package/dist/src/functions/wirings/queue/pikku-queue.d.ts +1 -1
  224. package/dist/src/functions/wirings/realtime/pikku-command-events-scaffold.d.ts +1 -1
  225. package/dist/src/functions/wirings/realtime/pikku-command-realtime.d.ts +1 -1
  226. package/dist/src/functions/wirings/rpc/pikku-command-public-rpc.d.ts +1 -1
  227. package/dist/src/functions/wirings/rpc/pikku-command-react-query.d.ts +1 -1
  228. package/dist/src/functions/wirings/rpc/pikku-command-remote-rpc.d.ts +1 -1
  229. package/dist/src/functions/wirings/rpc/pikku-command-rpc-client.d.ts +1 -1
  230. package/dist/src/functions/wirings/rpc/pikku-command-rpc-map.d.ts +7 -2
  231. package/dist/src/functions/wirings/rpc/pikku-command-rpc-map.js +20 -0
  232. package/dist/src/functions/wirings/rpc/pikku-command-rpc.d.ts +1 -1
  233. package/dist/src/functions/wirings/rpc/serialize-typed-rpc-map.d.ts +1 -0
  234. package/dist/src/functions/wirings/rpc/serialize-typed-rpc-map.js +8 -3
  235. package/dist/src/functions/wirings/scenarios/pikku-command-scenario-functions.d.ts +1 -1
  236. package/dist/src/functions/wirings/scheduler/pikku-command-scheduler-types.d.ts +1 -1
  237. package/dist/src/functions/wirings/scheduler/pikku-command-scheduler.d.ts +1 -1
  238. package/dist/src/functions/wirings/scopes/pikku-command-scopes.d.ts +7 -0
  239. package/dist/src/functions/wirings/scopes/pikku-command-scopes.js +34 -0
  240. package/dist/src/functions/wirings/scopes/serialize-scopes-types.d.ts +15 -0
  241. package/dist/src/functions/wirings/scopes/serialize-scopes-types.js +86 -0
  242. package/dist/src/functions/wirings/secrets/pikku-command-secrets.d.ts +1 -1
  243. package/dist/src/functions/wirings/secrets/serialize-secrets-types.js +13 -0
  244. package/dist/src/functions/wirings/triggers/pikku-command-trigger-types.d.ts +2 -2
  245. package/dist/src/functions/wirings/triggers/pikku-command-trigger.d.ts +1 -1
  246. package/dist/src/functions/wirings/variables/pikku-command-variables.d.ts +1 -1
  247. package/dist/src/functions/wirings/variables/serialize-variables-types.js +15 -2
  248. package/dist/src/functions/wirings/webhook/pikku-command-webhook.d.ts +1 -0
  249. package/dist/src/functions/wirings/webhook/pikku-command-webhook.js +25 -0
  250. package/dist/src/functions/wirings/webhook/serialize-webhook.d.ts +14 -0
  251. package/dist/src/functions/wirings/webhook/serialize-webhook.js +34 -0
  252. package/dist/src/functions/wirings/workflow/pikku-command-workflow-routes.d.ts +1 -1
  253. package/dist/src/functions/wirings/workflow/pikku-command-workflow.d.ts +1 -1
  254. package/dist/src/functions/wirings/workflow/pikku-command-workflow.js +2 -1
  255. package/dist/src/functions/wirings/workflow/serialize-workflow-routes.js +29 -0
  256. package/dist/src/functions/wirings/workflow/serialize-workflow-types.d.ts +1 -1
  257. package/dist/src/functions/wirings/workflow/serialize-workflow-types.js +11 -2
  258. package/dist/src/functions/workflows/all.workflow.js +23 -3
  259. package/dist/src/services.d.ts +1 -0
  260. package/dist/src/services.js +1 -0
  261. package/dist/src/utils/pikku-cli-config.js +20 -0
  262. package/dist/tsconfig.tsbuildinfo +1 -1
  263. package/package.json +9 -8
  264. package/skills/pikku-addon/SKILL.md +7 -3
  265. package/skills/pikku-ai-agent/SKILL.md +9 -6
  266. package/skills/pikku-ai-vercel/SKILL.md +6 -3
  267. package/skills/pikku-ai-voice/SKILL.md +6 -3
  268. package/skills/pikku-audit/SKILL.md +10 -3
  269. package/skills/pikku-aws/SKILL.md +9 -5
  270. package/skills/pikku-backblaze/SKILL.md +4 -3
  271. package/skills/pikku-better-auth/SKILL.md +10 -5
  272. package/skills/pikku-cli/SKILL.md +6 -3
  273. package/skills/pikku-concepts/SKILL.md +9 -4
  274. package/skills/pikku-concepts/references/concept-mapping.md +12 -10
  275. package/skills/pikku-config/SKILL.md +9 -5
  276. package/skills/pikku-cron/SKILL.md +6 -3
  277. package/skills/pikku-deploy-azure/SKILL.md +5 -3
  278. package/skills/pikku-deploy-cloudflare/SKILL.md +5 -3
  279. package/skills/pikku-deploy-express/SKILL.md +6 -3
  280. package/skills/pikku-deploy-fastify/SKILL.md +6 -3
  281. package/skills/pikku-deploy-lambda/SKILL.md +6 -3
  282. package/skills/pikku-deploy-nextjs/SKILL.md +5 -3
  283. package/skills/pikku-deploy-uws/SKILL.md +7 -4
  284. package/skills/pikku-deps/SKILL.md +13 -6
  285. package/skills/pikku-emails/SKILL.md +10 -5
  286. package/skills/pikku-feature/SKILL.md +1 -1
  287. package/skills/pikku-gateway-slack/SKILL.md +6 -3
  288. package/skills/pikku-http/SKILL.md +15 -21
  289. package/skills/pikku-http/references/http-options.md +0 -2
  290. package/skills/pikku-info/SKILL.md +9 -4
  291. package/skills/pikku-jose/SKILL.md +6 -3
  292. package/skills/pikku-kysely/SKILL.md +13 -5
  293. package/skills/pikku-machine-auth/SKILL.md +9 -3
  294. package/skills/pikku-mcp/SKILL.md +7 -3
  295. package/skills/pikku-middleware/SKILL.md +11 -6
  296. package/skills/pikku-mongodb/SKILL.md +8 -5
  297. package/skills/pikku-n8n-import/SKILL.md +109 -0
  298. package/skills/pikku-n8n-import/SPEC.md +84 -0
  299. package/skills/pikku-n8n-import/references/addon-mapping.md +121 -0
  300. package/skills/pikku-n8n-import/references/code-translation.md +121 -0
  301. package/skills/pikku-n8n-import/references/loops-and-control.md +87 -0
  302. package/skills/pikku-permissions/SKILL.md +26 -15
  303. package/skills/pikku-pino/SKILL.md +5 -3
  304. package/skills/pikku-product-second-opinion/README.md +43 -0
  305. package/skills/pikku-product-second-opinion/SKILL.md +158 -0
  306. package/skills/pikku-product-second-opinion/example/sample-report.md +90 -0
  307. package/skills/pikku-product-second-opinion/references/report-template.md +73 -0
  308. package/skills/pikku-queue/SKILL.md +7 -4
  309. package/skills/pikku-redis/SKILL.md +9 -6
  310. package/skills/pikku-rpc/SKILL.md +7 -4
  311. package/skills/pikku-rtl/SKILL.md +1 -1
  312. package/skills/pikku-scenario/SKILL.md +215 -0
  313. package/skills/pikku-schedule/SKILL.md +6 -3
  314. package/skills/pikku-schema-ajv/SKILL.md +5 -3
  315. package/skills/pikku-schema-cfworker/SKILL.md +6 -3
  316. package/skills/pikku-security/SKILL.md +8 -4
  317. package/skills/pikku-services/SKILL.md +42 -4
  318. package/skills/pikku-software-archaeology/README.md +70 -0
  319. package/skills/pikku-software-archaeology/SKILL.md +186 -0
  320. package/skills/pikku-software-archaeology/references/blueprint.schema.json +625 -0
  321. package/skills/pikku-software-archaeology/references/pikku-mapping.md +49 -0
  322. package/skills/pikku-software-archaeology/scripts/validate.mjs +173 -0
  323. package/skills/pikku-template-clone/SKILL.md +1 -1
  324. package/skills/pikku-trigger/SKILL.md +7 -3
  325. package/skills/pikku-versioning/SKILL.md +7 -3
  326. package/skills/pikku-websocket/SKILL.md +8 -4
  327. package/skills/pikku-workflow/SKILL.md +7 -3
  328. package/skills/pikku-ws/SKILL.md +5 -3
  329. package/console-app/assets/index-DwyRdRuZ.css +0 -1
  330. package/dist/.pikku/http/pikku-http-wirings-meta.gen.d.ts +0 -1
  331. package/dist/.pikku/http/pikku-http-wirings-meta.gen.js +0 -6
  332. package/dist/.pikku/http/pikku-http-wirings-meta.gen.json +0 -26
  333. package/dist/.pikku/http/pikku-http-wirings.gen.d.ts +0 -4
  334. package/dist/.pikku/http/pikku-http-wirings.gen.js +0 -5
  335. package/dist/.pikku/queue/pikku-queue-workers-wirings-meta.gen.d.ts +0 -1
  336. package/dist/.pikku/queue/pikku-queue-workers-wirings-meta.gen.js +0 -6
  337. package/dist/.pikku/queue/pikku-queue-workers-wirings-meta.gen.json +0 -10
  338. package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.d.ts +0 -4
  339. package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.js +0 -5
  340. package/dist/.pikku/schemas/schemas/RemoteRPCHandlerInput.schema.json +0 -1
  341. package/dist/src/scaffold/rpc-remote.gen.d.ts +0 -10
  342. package/dist/src/scaffold/rpc-remote.gen.js +0 -27
  343. package/skills/pikku-n8n-addon-map/SKILL.md +0 -178
  344. package/skills/pikku-n8n-code-translate/SKILL.md +0 -166
  345. package/skills/pikku-testing/SKILL.md +0 -328
  346. package/skills/pikku-testing/references/cucumber-bdd-testing.md +0 -176
@@ -0,0 +1,130 @@
1
+ import { existsSync } from 'fs';
2
+ import { basename, isAbsolute, join, resolve } from 'path';
3
+ import { mkdir, readdir, readFile, stat, writeFile } from 'fs/promises';
4
+ import { pikkuSessionlessFunc } from '#pikku';
5
+ import { parseN8n, generateWorkflowFromN8n } from '@pikku/n8n-import';
6
+ async function writeFiles(baseDir, files) {
7
+ const written = [];
8
+ for (const [relativePath, content] of Object.entries(files)) {
9
+ const fullPath = join(baseDir, relativePath);
10
+ await mkdir(join(fullPath, '..'), { recursive: true });
11
+ await writeFile(fullPath, content, 'utf-8');
12
+ written.push(fullPath);
13
+ }
14
+ return written;
15
+ }
16
+ // A single n8n export file may hold one workflow object, a bare array of
17
+ // workflows (n8n `export:workflow --all`), or a `{ workflows: [...] }` wrapper.
18
+ // Flatten whichever shape into one job per workflow.
19
+ function collectJobs(raw, nameHint, jobs) {
20
+ const list = Array.isArray(raw)
21
+ ? raw
22
+ : raw && Array.isArray(raw.workflows)
23
+ ? raw.workflows
24
+ : null;
25
+ if (list) {
26
+ list.forEach((wf, i) => {
27
+ const own = wf?.name?.trim();
28
+ jobs.push({ raw: wf, nameHint: own || `${nameHint}-${i + 1}` });
29
+ });
30
+ }
31
+ else {
32
+ jobs.push({ raw, nameHint });
33
+ }
34
+ }
35
+ async function importOne({ raw, nameHint }, baseDir, logger) {
36
+ let parsed;
37
+ try {
38
+ parsed = parseN8n(raw, nameHint);
39
+ }
40
+ catch (err) {
41
+ logger.error(`Failed to parse "${nameHint}": ${err.message}`);
42
+ return false;
43
+ }
44
+ const { files, manifest, credentialInstances, diagnostics } = generateWorkflowFromN8n(parsed);
45
+ // A single-file import can only resolve self-references; any cross-workflow
46
+ // sub-workflow reference is un-importable here. Report and skip rather than
47
+ // write a partial, un-runnable scaffold.
48
+ if (diagnostics.some((d) => d.type === 'error')) {
49
+ logger.error(`Cannot import "${parsed.name}":`);
50
+ for (const d of diagnostics) {
51
+ logger.error(` [${d.reason}] ${d.message}`);
52
+ }
53
+ return false;
54
+ }
55
+ const written = await writeFiles(baseDir, files);
56
+ logger.info(`Imported "${parsed.name}" (${parsed.shape}) → ${written.length} file(s) in ${baseDir}`);
57
+ if (manifest.length > 0) {
58
+ logger.info(` ${manifest.length} integration node(s) recorded in ${parsed.slug}.integrations.json`);
59
+ }
60
+ if (credentialInstances.length > 0) {
61
+ logger.info(` ${credentialInstances.length} addon instance(s) wired in ${parsed.slug}.addons.gen.ts: ${credentialInstances
62
+ .map((i) => i.instanceName)
63
+ .join(', ')}`);
64
+ }
65
+ const stubCount = written.filter((f) => f.includes('/functions/')).length;
66
+ if (stubCount > 0) {
67
+ logger.info(` ${stubCount} stub function(s) to implement — run the pikku-n8n-import skill to fill them in`);
68
+ }
69
+ return true;
70
+ }
71
+ export const pikkuImportN8n = pikkuSessionlessFunc({
72
+ func: async ({ logger, config }, { file, out }) => {
73
+ const inputPath = isAbsolute(file) ? file : resolve(process.cwd(), file);
74
+ if (!existsSync(inputPath)) {
75
+ logger.error(`n8n workflow file not found: ${inputPath}`);
76
+ process.exit(1);
77
+ }
78
+ const baseDir = out
79
+ ? isAbsolute(out)
80
+ ? out
81
+ : resolve(process.cwd(), out)
82
+ : config.scaffold?.functionDir || process.cwd();
83
+ const jobs = [];
84
+ if ((await stat(inputPath)).isDirectory()) {
85
+ const entries = (await readdir(inputPath))
86
+ .filter((f) => f.toLowerCase().endsWith('.json'))
87
+ .sort();
88
+ if (entries.length === 0) {
89
+ logger.error(`No .json workflow files found in ${inputPath}`);
90
+ process.exit(1);
91
+ }
92
+ for (const entry of entries) {
93
+ try {
94
+ const raw = JSON.parse(await readFile(join(inputPath, entry), 'utf-8'));
95
+ collectJobs(raw, entry.replace(/\.json$/i, ''), jobs);
96
+ }
97
+ catch (err) {
98
+ logger.error(`Failed to read ${entry}: ${err.message}`);
99
+ }
100
+ }
101
+ }
102
+ else {
103
+ let raw;
104
+ try {
105
+ raw = JSON.parse(await readFile(inputPath, 'utf-8'));
106
+ }
107
+ catch (err) {
108
+ logger.error(`Failed to parse n8n workflow: ${err.message}`);
109
+ process.exit(1);
110
+ }
111
+ collectJobs(raw, basename(inputPath).replace(/\.json$/i, ''), jobs);
112
+ }
113
+ if (jobs.length === 0) {
114
+ logger.error('No workflows found to import');
115
+ process.exit(1);
116
+ }
117
+ let failed = 0;
118
+ for (const job of jobs) {
119
+ if (!(await importOne(job, baseDir, logger)))
120
+ failed++;
121
+ }
122
+ if (jobs.length > 1) {
123
+ const ok = jobs.length - failed;
124
+ logger.info(`Imported ${ok}/${jobs.length} workflow(s) into ${baseDir}${failed > 0 ? ` — ${failed} failed` : ''}`);
125
+ }
126
+ if (failed > 0) {
127
+ process.exit(1);
128
+ }
129
+ },
130
+ });
@@ -2,8 +2,8 @@ type InfoInput = {
2
2
  limit?: string;
3
3
  verbose?: boolean;
4
4
  };
5
- export declare const pikkuInfoFunctions: import("#pikku").PikkuFunctionConfig<InfoInput, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<InfoInput, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<InfoInput, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
6
- export declare const pikkuInfoTags: import("#pikku").PikkuFunctionConfig<InfoInput, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<InfoInput, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<InfoInput, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
7
- export declare const pikkuInfoMiddleware: import("#pikku").PikkuFunctionConfig<InfoInput, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<InfoInput, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<InfoInput, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
8
- export declare const pikkuInfoPermissions: import("#pikku").PikkuFunctionConfig<InfoInput, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<InfoInput, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<InfoInput, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
5
+ export declare const pikkuInfoFunctions: import("#pikku").PikkuFunctionConfig<InfoInput, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<InfoInput, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<InfoInput, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
6
+ export declare const pikkuInfoTags: import("#pikku").PikkuFunctionConfig<InfoInput, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<InfoInput, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<InfoInput, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
7
+ export declare const pikkuInfoMiddleware: import("#pikku").PikkuFunctionConfig<InfoInput, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<InfoInput, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<InfoInput, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
8
+ export declare const pikkuInfoPermissions: import("#pikku").PikkuFunctionConfig<InfoInput, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<InfoInput, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<InfoInput, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
9
9
  export {};
@@ -159,19 +159,6 @@ export const pikkuInfoTags = pikkuSessionlessFunc({
159
159
  tagMap.get(tag).middlewareNames.push(...(group.instanceIds ?? []));
160
160
  }
161
161
  }
162
- const tagPermissions = state.permissions?.tagPermissions;
163
- if (tagPermissions) {
164
- for (const [tag, group] of tagPermissions) {
165
- if (!tagMap.has(tag)) {
166
- tagMap.set(tag, {
167
- funcIds: [],
168
- middlewareNames: [],
169
- permissionNames: [],
170
- });
171
- }
172
- tagMap.get(tag).permissionNames.push(...(group.instanceIds ?? []));
173
- }
174
- }
175
162
  const tags = [...tagMap.entries()].sort((a, b) => a[0].localeCompare(b[0]));
176
163
  if (tags.length === 0) {
177
164
  console.log('No tags found.');
@@ -11,7 +11,7 @@ interface LoginOptions {
11
11
  * `~/.pikku/session.json`; generated CLI/websocket clients pick it up
12
12
  * automatically.
13
13
  */
14
- export declare const login: import("#pikku").PikkuFunctionConfig<LoginOptions, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<LoginOptions, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<LoginOptions, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
14
+ export declare const login: import("#pikku").PikkuFunctionConfig<LoginOptions, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<LoginOptions, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<LoginOptions, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
15
15
  /**
16
16
  * `pikku logout` — remove a stored session (the given `--url`, or the current
17
17
  * default).
@@ -20,9 +20,9 @@ export declare const logout: import("#pikku").PikkuFunctionConfig<{
20
20
  url?: string;
21
21
  }, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{
22
22
  url?: string;
23
- }, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{
23
+ }, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{
24
24
  url?: string;
25
- }, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
25
+ }, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
26
26
  /**
27
27
  * `pikku whoami` — show the current (or `--url`) stored session and whether it
28
28
  * has expired.
@@ -31,7 +31,7 @@ export declare const whoami: import("#pikku").PikkuFunctionConfig<{
31
31
  url?: string;
32
32
  }, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{
33
33
  url?: string;
34
- }, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{
34
+ }, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{
35
35
  url?: string;
36
- }, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
36
+ }, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
37
37
  export {};
@@ -1,56 +1,56 @@
1
- export declare const pikkuMetaFunctionsList: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
1
+ export declare const pikkuMetaFunctionsList: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
2
2
  export declare const pikkuMetaFunctionsGet: import("#pikku").PikkuFunctionConfig<{
3
3
  functionId: string;
4
4
  }, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{
5
5
  functionId: string;
6
- }, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{
6
+ }, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{
7
7
  functionId: string;
8
- }, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
9
- export declare const pikkuMetaSchemasList: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
8
+ }, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
9
+ export declare const pikkuMetaSchemasList: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
10
10
  export declare const pikkuMetaSchemasGet: import("#pikku").PikkuFunctionConfig<{
11
11
  schemaName: string;
12
12
  }, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{
13
13
  schemaName: string;
14
- }, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{
14
+ }, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{
15
15
  schemaName: string;
16
- }, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
17
- export declare const pikkuMetaWorkflowsList: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
16
+ }, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
17
+ export declare const pikkuMetaWorkflowsList: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
18
18
  export declare const pikkuMetaWorkflowsGet: import("#pikku").PikkuFunctionConfig<{
19
19
  workflowId: string;
20
20
  }, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{
21
21
  workflowId: string;
22
- }, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{
22
+ }, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{
23
23
  workflowId: string;
24
- }, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
25
- export declare const pikkuMetaMiddlewareList: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
24
+ }, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
25
+ export declare const pikkuMetaMiddlewareList: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
26
26
  export declare const pikkuMetaMiddlewareGet: import("#pikku").PikkuFunctionConfig<{
27
27
  middlewareId: string;
28
28
  }, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{
29
29
  middlewareId: string;
30
- }, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{
30
+ }, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{
31
31
  middlewareId: string;
32
- }, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
33
- export declare const pikkuMetaPermissionsList: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
32
+ }, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
33
+ export declare const pikkuMetaPermissionsList: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
34
34
  export declare const pikkuMetaPermissionsGet: import("#pikku").PikkuFunctionConfig<{
35
35
  permissionId: string;
36
36
  }, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{
37
37
  permissionId: string;
38
- }, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{
38
+ }, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{
39
39
  permissionId: string;
40
- }, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
41
- export declare const pikkuMetaWiresList: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
40
+ }, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
41
+ export declare const pikkuMetaWiresList: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
42
42
  export declare const pikkuMetaWiresType: import("#pikku").PikkuFunctionConfig<{
43
43
  type: string;
44
44
  }, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{
45
45
  type: string;
46
- }, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{
46
+ }, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{
47
47
  type: string;
48
- }, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
49
- export declare const pikkuMetaWiresHttp: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
50
- export declare const pikkuMetaWiresScheduler: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
51
- export declare const pikkuMetaWiresQueue: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
52
- export declare const pikkuMetaWiresChannel: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
53
- export declare const pikkuMetaWiresTrigger: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
48
+ }, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
49
+ export declare const pikkuMetaWiresHttp: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
50
+ export declare const pikkuMetaWiresScheduler: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
51
+ export declare const pikkuMetaWiresQueue: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
52
+ export declare const pikkuMetaWiresChannel: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
53
+ export declare const pikkuMetaWiresTrigger: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
54
54
  /**
55
55
  * Bulk context endpoint.
56
56
  *
@@ -63,7 +63,7 @@ export declare const pikkuMetaWiresTrigger: import("#pikku").PikkuFunctionConfig
63
63
  * Targeted `pikku meta * get` calls are still the right tool when the planner
64
64
  * wants schema details (input/output JSON schemas) for a specific entry.
65
65
  */
66
- export declare const pikkuMetaContext: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
66
+ export declare const pikkuMetaContext: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
67
67
  /**
68
68
  * Frontend-targeted metadata.
69
69
  *
@@ -79,4 +79,4 @@ export declare const pikkuMetaContext: import("#pikku").PikkuFunctionConfig<{},
79
79
  * non-exposed functions, http wires) is a backend concern and stays in
80
80
  * `pikku meta context`.
81
81
  */
82
- export declare const pikkuMetaClients: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
82
+ export declare const pikkuMetaClients: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
@@ -1,3 +1,14 @@
1
+ /**
2
+ * Pick the protocol the generated test app uses to depend on its parent addon.
3
+ *
4
+ * Inside a workspace this must be `workspace:*`. The `file:` protocol copies
5
+ * the whole parent directory rather than honouring its `files` field, so the
6
+ * copy includes the parent's own test/node_modules — which already holds a
7
+ * copy. Every install then adds another layer until the path exceeds the OS
8
+ * limit. Outside a workspace `workspace:*` cannot resolve, so `file:` remains
9
+ * the only option there.
10
+ */
11
+ export declare function resolveAddonDepProtocol(baseDir: string): string;
1
12
  export declare const pikkuNewAddon: import("#pikku").PikkuFunctionConfig<{
2
13
  name: string;
3
14
  displayName?: string;
@@ -28,7 +39,7 @@ export declare const pikkuNewAddon: import("#pikku").PikkuFunctionConfig<{
28
39
  authConfig?: string;
29
40
  mcp?: boolean;
30
41
  camelCase?: boolean;
31
- }, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{
42
+ }, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{
32
43
  name: string;
33
44
  displayName?: string;
34
45
  description?: string;
@@ -43,4 +54,4 @@ export declare const pikkuNewAddon: import("#pikku").PikkuFunctionConfig<{
43
54
  authConfig?: string;
44
55
  mcp?: boolean;
45
56
  camelCase?: boolean;
46
- }, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
57
+ }, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
@@ -1,9 +1,42 @@
1
- import { existsSync } from 'fs';
2
- import { join } from 'path';
1
+ import { existsSync, readFileSync } from 'fs';
2
+ import { dirname, join } from 'path';
3
3
  import { mkdir, writeFile } from 'fs/promises';
4
4
  import { createEmptyManifest, saveManifest, } from '../../utils/contract-versions.js';
5
5
  import { pikkuSessionlessFunc } from '#pikku';
6
6
  import { parseOpenAPISpec, computeContractHash, generateAddonFromOpenAPI, loadAuthConfig, } from '@pikku/openapi-parser';
7
+ /**
8
+ * Pick the protocol the generated test app uses to depend on its parent addon.
9
+ *
10
+ * Inside a workspace this must be `workspace:*`. The `file:` protocol copies
11
+ * the whole parent directory rather than honouring its `files` field, so the
12
+ * copy includes the parent's own test/node_modules — which already holds a
13
+ * copy. Every install then adds another layer until the path exceeds the OS
14
+ * limit. Outside a workspace `workspace:*` cannot resolve, so `file:` remains
15
+ * the only option there.
16
+ */
17
+ export function resolveAddonDepProtocol(baseDir) {
18
+ let dir = baseDir;
19
+ while (true) {
20
+ const manifest = join(dir, 'package.json');
21
+ if (existsSync(manifest)) {
22
+ try {
23
+ const { workspaces } = JSON.parse(readFileSync(manifest, 'utf8'));
24
+ if (Array.isArray(workspaces) || Array.isArray(workspaces?.packages)) {
25
+ return 'workspace:*';
26
+ }
27
+ }
28
+ catch {
29
+ // A malformed manifest tells us nothing about the workspace layout;
30
+ // keep walking up rather than failing the scaffold.
31
+ }
32
+ }
33
+ const parent = dirname(dir);
34
+ if (parent === dir) {
35
+ return 'file:..';
36
+ }
37
+ dir = parent;
38
+ }
39
+ }
7
40
  function toCamelCase(str) {
8
41
  return str.replace(/-([a-z0-9])/g, (_, c) => c.toUpperCase());
9
42
  }
@@ -227,18 +260,28 @@ export const createWireServices = pikkuAddonWireServices(
227
260
  `;
228
261
  }
229
262
  else if (flags.oauth || flags.credential === 'oauth2') {
263
+ // The OAuth2 access token is owned and refreshed by the platform credential
264
+ // service (better-auth). Resolve a ready token per-request via the wire and
265
+ // hand it to the service — the addon does not do its own token exchange.
230
266
  files['src/services.ts'] =
231
- `import { ${pascalName}Service } from './${name}-api.service.js'
232
- import { pikkuAddonServices } from '#pikku'
267
+ `import { UnauthorizedError } from '@pikku/core/errors'
268
+ import { ${pascalName}Service } from './${name}-api.service.js'
269
+ import { pikkuAddonWireServices } from '#pikku'
233
270
 
234
- export const createSingletonServices = pikkuAddonServices(async (
235
- config,
236
- { secrets, variables }
237
- ) => {
238
- const ${camelName} = new ${pascalName}Service(secrets, variables)
271
+ export const createWireServices = pikkuAddonWireServices(
272
+ async ({ variables }, wire) => {
273
+ if (!wire.getCredential) {
274
+ throw new Error('Credential resolution is not available in this runtime')
275
+ }
276
+ const cred = await wire.getCredential<{ accessToken: string }>('${camelName}')
277
+ if (!cred?.accessToken) {
278
+ throw new UnauthorizedError('No ${displayName} connection — connect ${displayName} first')
279
+ }
280
+ const ${camelName} = new ${pascalName}Service(cred, variables)
239
281
 
240
- return { ${camelName} }
241
- })
282
+ return { ${camelName} }
283
+ }
284
+ )
242
285
  `;
243
286
  }
244
287
  else if (flags.secret) {
@@ -329,41 +372,30 @@ export class ${pascalName}Service {
329
372
  `;
330
373
  }
331
374
  else if (flags.oauth) {
375
+ // The access token is resolved (and refreshed) by the platform credential
376
+ // service and injected via createWireServices — this service just uses it.
332
377
  files[`src/${name}-api.service.ts`] =
333
- `import { OAuth2Client } from '@pikku/core/oauth2'
334
- import type { TypedSecretService } from '#pikku/secrets/pikku-secrets.gen.js'
378
+ `import type { TypedVariablesService } from '#pikku/variables/pikku-variables.gen.js'
335
379
 
336
380
  const BASE_URL = 'https://api.example.com/v1'
337
381
 
338
- export const ${screamingName}_OAUTH2_CONFIG = {
339
- tokenSecretId: '${screamingName}_TOKENS',
340
- authorizationUrl: 'https://example.com/oauth2/authorize',
341
- tokenUrl: 'https://example.com/oauth2/token',
342
- scopes: ['read', 'write'],
343
- }
344
-
345
382
  export interface RequestOptions {
346
383
  body?: unknown
347
384
  qs?: Record<string, string | number | boolean | undefined>
348
385
  }
349
386
 
350
387
  export class ${pascalName}Service {
351
- private oauth: OAuth2Client
352
-
353
- constructor(secrets: TypedSecretService) {
354
- this.oauth = new OAuth2Client(
355
- ${screamingName}_OAUTH2_CONFIG,
356
- '${screamingName}_APP_CREDENTIALS',
357
- secrets
358
- )
359
- }
388
+ constructor(
389
+ private creds: { accessToken: string },
390
+ _variables?: TypedVariablesService
391
+ ) {}
360
392
 
361
393
  async request<T>(
362
394
  method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH',
363
395
  endpoint: string,
364
396
  options?: RequestOptions
365
397
  ): Promise<T> {
366
- const url = new URL(\`\${BASE_URL}\${endpoint}\`)
398
+ const url = new URL(endpoint, BASE_URL)
367
399
 
368
400
  if (options?.qs) {
369
401
  for (const [key, value] of Object.entries(options.qs)) {
@@ -373,10 +405,11 @@ export class ${pascalName}Service {
373
405
  }
374
406
  }
375
407
 
376
- const response = await this.oauth.request(url.toString(), {
408
+ const response = await fetch(url.toString(), {
377
409
  method,
378
410
  headers: {
379
411
  'Content-Type': 'application/json',
412
+ 'Authorization': \`Bearer \${this.creds.accessToken}\`,
380
413
  },
381
414
  body: options?.body ? JSON.stringify(options.body) : undefined,
382
415
  })
@@ -386,11 +419,7 @@ export class ${pascalName}Service {
386
419
  throw new Error(\`${displayName} API error (\${response.status}): \${errorText}\`)
387
420
  }
388
421
 
389
- const text = await response.text()
390
- if (!text) {
391
- return {} as T
392
- }
393
- return JSON.parse(text) as T
422
+ return response.json() as Promise<T>
394
423
  }
395
424
  }
396
425
  `;
@@ -630,7 +659,7 @@ wireVariable({
630
659
  return files;
631
660
  }
632
661
  function getTestFiles(vars) {
633
- const { name, camelName, pascalName, screamingName } = vars;
662
+ const { name, camelName, pascalName, screamingName, addonDepProtocol } = vars;
634
663
  const files = {};
635
664
  // test/package.json
636
665
  files['package.json'] = JSON.stringify({
@@ -647,7 +676,7 @@ function getTestFiles(vars) {
647
676
  },
648
677
  dependencies: {
649
678
  '@pikku/core': '*',
650
- [`@pikku/addon-${name}`]: 'file:..',
679
+ [`@pikku/addon-${name}`]: addonDepProtocol,
651
680
  },
652
681
  devDependencies: {
653
682
  '@pikku/cli': '*',
@@ -811,7 +840,9 @@ export const pikkuNewAddon = pikkuSessionlessFunc({
811
840
  const resolvedDescription = description || `${resolvedDisplayName} integration for Pikku`;
812
841
  // Resolve target directory
813
842
  const baseDir = dir || config.scaffold?.addonDir || process.cwd();
814
- const addonDir = join(baseDir, name);
843
+ // Folder mirrors the package name (@pikku/addon-<name>) so a packages/
844
+ // listing reads as packages/addon-<name>, distinct from app workspaces.
845
+ const addonDir = join(baseDir, `addon-${name}`);
815
846
  if (existsSync(addonDir)) {
816
847
  logger.error(`Directory already exists: ${addonDir}`);
817
848
  process.exit(1);
@@ -824,6 +855,7 @@ export const pikkuNewAddon = pikkuSessionlessFunc({
824
855
  displayName: resolvedDisplayName,
825
856
  description: resolvedDescription,
826
857
  category,
858
+ addonDepProtocol: resolveAddonDepProtocol(baseDir),
827
859
  };
828
860
  // Load the auth config (custom auth header / delegated login overrides)
829
861
  let loadedAuthConfig;
@@ -4,7 +4,7 @@ export declare const pikkuNewFunction: import("#pikku").PikkuFunctionConfig<{
4
4
  }, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{
5
5
  name: string;
6
6
  type?: string;
7
- }, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{
7
+ }, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{
8
8
  name: string;
9
9
  type?: string;
10
- }, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
10
+ }, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
@@ -4,7 +4,7 @@ export declare const pikkuNewMiddleware: import("#pikku").PikkuFunctionConfig<{
4
4
  }, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{
5
5
  name: string;
6
6
  type?: string;
7
- }, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{
7
+ }, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{
8
8
  name: string;
9
9
  type?: string;
10
- }, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
10
+ }, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
@@ -4,7 +4,7 @@ export declare const pikkuNewPermission: import("#pikku").PikkuFunctionConfig<{
4
4
  }, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{
5
5
  name: string;
6
6
  type?: string;
7
- }, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{
7
+ }, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{
8
8
  name: string;
9
9
  type?: string;
10
- }, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
10
+ }, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
@@ -4,7 +4,7 @@ export declare const pikkuNewWiring: import("#pikku").PikkuFunctionConfig<{
4
4
  }, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{
5
5
  name: string;
6
6
  type?: string;
7
- }, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{
7
+ }, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{
8
8
  name: string;
9
9
  type?: string;
10
- }, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
10
+ }, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
@@ -1,4 +1,4 @@
1
1
  export type BootstrapInput = {
2
2
  allImports: string[];
3
3
  };
4
- export declare const pikkuBootstrap: import("#pikku").PikkuFunctionConfig<BootstrapInput, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<BootstrapInput, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<BootstrapInput, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
4
+ export declare const pikkuBootstrap: import("#pikku").PikkuFunctionConfig<BootstrapInput, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<BootstrapInput, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<BootstrapInput, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
@@ -9,6 +9,12 @@ export const pikkuBootstrap = pikkuSessionlessFunc({
9
9
  const addonBootstraps = [];
10
10
  for (const [, decl] of stateBeforeBootstrap.rpc?.wireAddonDeclarations ??
11
11
  []) {
12
+ // Remote addons (wireRemoteAddon) run on the host — never import their
13
+ // runtime bootstrap here; that would register their functions locally
14
+ // and drag in the runtime deps remote consumption exists to avoid. The
15
+ // consumer's own wireRemoteAddon() call registers the remote binding.
16
+ if (decl.remote)
17
+ continue;
12
18
  addonBootstraps.push(`${decl.package}/.pikku/pikku-bootstrap.gen.js`);
13
19
  logger.debug(`• Addon bootstrap: ${decl.package}`);
14
20
  }
@@ -1 +1 @@
1
- export declare const pikkuSummary: import("#pikku").PikkuFunctionConfig<void, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<void, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<void, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
1
+ export declare const pikkuSummary: import("#pikku").PikkuFunctionConfig<void, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<void, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<void, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
@@ -1,4 +1,4 @@
1
- export declare const scenarioList: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
1
+ export declare const scenarioList: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
2
2
  export declare const scenarioRun: import("#pikku").PikkuFunctionConfig<{
3
3
  environment: string;
4
4
  flows?: string;
@@ -9,9 +9,9 @@ export declare const scenarioRun: import("#pikku").PikkuFunctionConfig<{
9
9
  flows?: string;
10
10
  tags?: string;
11
11
  coverage?: boolean;
12
- }, void, "rpc" | "session", import("#pikku").Services> | import("#pikku").PikkuFunction<{
12
+ }, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{
13
13
  environment: string;
14
14
  flows?: string;
15
15
  tags?: string;
16
16
  coverage?: boolean;
17
- }, void, "rpc" | "session", import("#pikku").Services>, undefined, undefined>;
17
+ }, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;
@@ -0,0 +1 @@
1
+ export declare const scopesAudit: import("#pikku").PikkuFunctionConfig<{}, void, "rpc" | "session", import("#pikku").PikkuFunctionSessionless<{}, void, "rpc" | "session", import("#pikku").WiredServices> | import("#pikku").PikkuFunction<{}, void, "rpc" | "session", import("#pikku").WiredServices>, undefined, undefined>;