@pikku/cli 0.12.20 → 0.12.22

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 (455) hide show
  1. package/cli.schema.json +1 -1
  2. package/console-app/assets/index-C52h1B_L.css +1 -0
  3. package/console-app/assets/index-CAk106ji.js +232 -0
  4. package/console-app/index.html +3 -6
  5. package/dist/.pikku/agent/pikku-agent-types.gen.d.ts +1 -1
  6. package/dist/.pikku/channel/pikku-channel-types.gen.d.ts +3 -3
  7. package/dist/.pikku/channel/pikku-channel-types.gen.js +1 -1
  8. package/dist/.pikku/cli/pikku-cli-channel.d.ts +6 -6
  9. package/dist/.pikku/cli/pikku-cli-channel.js +280 -1
  10. package/dist/.pikku/cli/pikku-cli-types.gen.d.ts +1 -1
  11. package/dist/.pikku/cli/pikku-cli-types.gen.js +1 -1
  12. package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.js +1 -1
  13. package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.json +792 -8
  14. package/dist/.pikku/cli/pikku-cli-wirings.gen.d.ts +1 -1
  15. package/dist/.pikku/cli/pikku-cli-wirings.gen.js +1 -1
  16. package/dist/.pikku/cli/pikku-cli.gen.d.ts +1 -1
  17. package/dist/.pikku/cli/pikku-cli.gen.js +1 -1
  18. package/dist/.pikku/console/pikku-node-types.gen.d.ts +1 -1
  19. package/dist/.pikku/function/pikku-function-types.gen.d.ts +44 -70
  20. package/dist/.pikku/function/pikku-function-types.gen.js +33 -40
  21. package/dist/.pikku/function/pikku-functions-meta.gen.js +1 -1
  22. package/dist/.pikku/function/pikku-functions-meta.gen.json +1439 -316
  23. package/dist/.pikku/function/pikku-functions.gen.js +21 -9
  24. package/dist/.pikku/http/pikku-http-types.gen.d.ts +1 -1
  25. package/dist/.pikku/http/pikku-http-types.gen.js +1 -1
  26. package/dist/.pikku/http/pikku-http-wirings-meta.gen.js +1 -1
  27. package/dist/.pikku/http/pikku-http-wirings.gen.d.ts +1 -1
  28. package/dist/.pikku/http/pikku-http-wirings.gen.js +1 -1
  29. package/dist/.pikku/mcp/pikku-mcp-types.gen.d.ts +1 -1
  30. package/dist/.pikku/mcp/pikku-mcp-types.gen.js +1 -1
  31. package/dist/.pikku/pikku-bootstrap.gen.d.ts +3 -1
  32. package/dist/.pikku/pikku-bootstrap.gen.js +3 -1
  33. package/dist/.pikku/pikku-meta-service.gen.d.ts +1 -1
  34. package/dist/.pikku/pikku-meta-service.gen.js +1 -1
  35. package/dist/.pikku/pikku-services.gen.d.ts +2 -1
  36. package/dist/.pikku/pikku-services.gen.js +1 -0
  37. package/dist/.pikku/pikku-types.gen.d.ts +1 -1
  38. package/dist/.pikku/pikku-types.gen.js +1 -1
  39. package/dist/.pikku/queue/pikku-queue-types.gen.d.ts +1 -1
  40. package/dist/.pikku/queue/pikku-queue-types.gen.js +1 -1
  41. package/dist/.pikku/queue/pikku-queue-workers-wirings-meta.gen.d.ts +1 -0
  42. package/dist/.pikku/queue/pikku-queue-workers-wirings-meta.gen.js +6 -0
  43. package/dist/.pikku/queue/pikku-queue-workers-wirings-meta.gen.json +250 -0
  44. package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.d.ts +4 -0
  45. package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.js +5 -0
  46. package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.js +1 -1
  47. package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.json +66 -10
  48. package/dist/.pikku/scheduler/pikku-scheduler-types.gen.d.ts +1 -1
  49. package/dist/.pikku/scheduler/pikku-scheduler-types.gen.js +1 -1
  50. package/dist/.pikku/schemas/register.gen.js +157 -11
  51. package/dist/.pikku/schemas/schemas/BinaryInput.schema.json +1 -0
  52. package/dist/.pikku/schemas/schemas/DbMigrateInput.schema.json +1 -0
  53. package/dist/.pikku/schemas/schemas/DbResetInput.schema.json +1 -0
  54. package/dist/.pikku/schemas/schemas/DbSeedInput.schema.json +1 -0
  55. package/dist/.pikku/schemas/schemas/FabricDbSchemaInput.schema.json +1 -0
  56. package/dist/.pikku/schemas/schemas/FabricDbSchemaOutput.schema.json +1 -0
  57. package/dist/.pikku/schemas/schemas/FabricDeployApplyInput.schema.json +1 -0
  58. package/dist/.pikku/schemas/schemas/FabricDeployApplyOutput.schema.json +1 -0
  59. package/dist/.pikku/schemas/schemas/FabricDeployListInput.schema.json +1 -0
  60. package/dist/.pikku/schemas/schemas/FabricDeployListOutput.schema.json +1 -0
  61. package/dist/.pikku/schemas/schemas/FabricDeployPlanInput.schema.json +1 -0
  62. package/dist/.pikku/schemas/schemas/FabricDeployPlanOutput.schema.json +1 -0
  63. package/dist/.pikku/schemas/schemas/FabricDeployUnitsInput.schema.json +1 -0
  64. package/dist/.pikku/schemas/schemas/FabricDeployUnitsOutput.schema.json +1 -0
  65. package/dist/.pikku/schemas/schemas/FabricDomainsAddInput.schema.json +1 -0
  66. package/dist/.pikku/schemas/schemas/FabricDomainsAddOutput.schema.json +1 -0
  67. package/dist/.pikku/schemas/schemas/FabricDomainsListInput.schema.json +1 -0
  68. package/dist/.pikku/schemas/schemas/FabricDomainsListOutput.schema.json +1 -0
  69. package/dist/.pikku/schemas/schemas/FabricDomainsRemoveInput.schema.json +1 -0
  70. package/dist/.pikku/schemas/schemas/FabricDomainsRemoveOutput.schema.json +1 -0
  71. package/dist/.pikku/schemas/schemas/FabricErrorsInput.schema.json +1 -0
  72. package/dist/.pikku/schemas/schemas/FabricErrorsOutput.schema.json +1 -0
  73. package/dist/.pikku/schemas/schemas/FabricInitInput.schema.json +1 -0
  74. package/dist/.pikku/schemas/schemas/FabricInitOutput.schema.json +1 -0
  75. package/dist/.pikku/schemas/schemas/FabricLLMKeyInput.schema.json +1 -0
  76. package/dist/.pikku/schemas/schemas/FabricLLMKeyOutput.schema.json +1 -0
  77. package/dist/.pikku/schemas/schemas/FabricLinkInput.schema.json +1 -0
  78. package/dist/.pikku/schemas/schemas/FabricLinkOutput.schema.json +1 -0
  79. package/dist/.pikku/schemas/schemas/FabricLoginInput.schema.json +1 -0
  80. package/dist/.pikku/schemas/schemas/FabricLoginOutput.schema.json +1 -0
  81. package/dist/.pikku/schemas/schemas/FabricLogsInput.schema.json +1 -0
  82. package/dist/.pikku/schemas/schemas/FabricLogsOutput.schema.json +1 -0
  83. package/dist/.pikku/schemas/schemas/FabricMetricsInput.schema.json +1 -0
  84. package/dist/.pikku/schemas/schemas/FabricMetricsOutput.schema.json +1 -0
  85. package/dist/.pikku/schemas/schemas/FabricRollbackInput.schema.json +1 -0
  86. package/dist/.pikku/schemas/schemas/FabricRollbackOutput.schema.json +1 -0
  87. package/dist/.pikku/schemas/schemas/FabricSecretsListInput.schema.json +1 -0
  88. package/dist/.pikku/schemas/schemas/FabricSecretsListOutput.schema.json +1 -0
  89. package/dist/.pikku/schemas/schemas/FabricSecretsSetInput.schema.json +1 -0
  90. package/dist/.pikku/schemas/schemas/FabricSecretsSetOutput.schema.json +1 -0
  91. package/dist/.pikku/schemas/schemas/FabricStatusInput.schema.json +1 -0
  92. package/dist/.pikku/schemas/schemas/FabricStatusOutput.schema.json +1 -0
  93. package/dist/.pikku/schemas/schemas/FabricTraceInput.schema.json +1 -0
  94. package/dist/.pikku/schemas/schemas/FabricTraceOutput.schema.json +1 -0
  95. package/dist/.pikku/schemas/schemas/FabricValidateInput.schema.json +1 -0
  96. package/dist/.pikku/schemas/schemas/FabricValidateOutput.schema.json +1 -0
  97. package/dist/.pikku/schemas/schemas/PikkuCLIConfig.schema.json +1 -1
  98. package/dist/.pikku/schemas/schemas/PikkuCommandChannelsOutput.schema.json +1 -0
  99. package/dist/.pikku/schemas/schemas/PikkuCommandHTTPOutput.schema.json +1 -0
  100. package/dist/.pikku/schemas/schemas/PikkuCommandQueueOutput.schema.json +1 -0
  101. package/dist/.pikku/schemas/schemas/PikkuEventsScaffoldOutput.schema.json +1 -0
  102. package/dist/.pikku/schemas/schemas/PikkuMetaClientsInput.schema.json +1 -0
  103. package/dist/.pikku/schemas/schemas/PikkuMetaContextInput.schema.json +1 -0
  104. package/dist/.pikku/schemas/schemas/PikkuMetaFunctionsGetInput.schema.json +1 -0
  105. package/dist/.pikku/schemas/schemas/PikkuMetaFunctionsListInput.schema.json +1 -0
  106. package/dist/.pikku/schemas/schemas/PikkuMetaMiddlewareGetInput.schema.json +1 -0
  107. package/dist/.pikku/schemas/schemas/PikkuMetaMiddlewareListInput.schema.json +1 -0
  108. package/dist/.pikku/schemas/schemas/PikkuMetaPermissionsGetInput.schema.json +1 -0
  109. package/dist/.pikku/schemas/schemas/PikkuMetaPermissionsListInput.schema.json +1 -0
  110. package/dist/.pikku/schemas/schemas/PikkuMetaSchemasGetInput.schema.json +1 -0
  111. package/dist/.pikku/schemas/schemas/PikkuMetaSchemasListInput.schema.json +1 -0
  112. package/dist/.pikku/schemas/schemas/PikkuMetaWiresChannelInput.schema.json +1 -0
  113. package/dist/.pikku/schemas/schemas/PikkuMetaWiresHttpInput.schema.json +1 -0
  114. package/dist/.pikku/schemas/schemas/PikkuMetaWiresListInput.schema.json +1 -0
  115. package/dist/.pikku/schemas/schemas/PikkuMetaWiresQueueInput.schema.json +1 -0
  116. package/dist/.pikku/schemas/schemas/PikkuMetaWiresSchedulerInput.schema.json +1 -0
  117. package/dist/.pikku/schemas/schemas/PikkuMetaWiresTriggerInput.schema.json +1 -0
  118. package/dist/.pikku/schemas/schemas/PikkuMetaWiresTypeInput.schema.json +1 -0
  119. package/dist/.pikku/schemas/schemas/PikkuMetaWorkflowsGetInput.schema.json +1 -0
  120. package/dist/.pikku/schemas/schemas/PikkuMetaWorkflowsListInput.schema.json +1 -0
  121. package/dist/.pikku/schemas/schemas/PikkuSkillsInstallInput.schema.json +1 -0
  122. package/dist/.pikku/schemas/schemas/PikkuSkillsListInput.schema.json +1 -0
  123. package/dist/.pikku/schemas/schemas/PikkuTestsCoverageInput.schema.json +1 -0
  124. package/dist/.pikku/schemas/schemas/PikkuTestsInitInput.schema.json +1 -0
  125. package/dist/.pikku/schemas/schemas/WorkflowRunStatus.schema.json +1 -1
  126. package/dist/.pikku/secrets/pikku-secret-types.gen.d.ts +1 -1
  127. package/dist/.pikku/secrets/pikku-secret-types.gen.js +1 -1
  128. package/dist/.pikku/secrets/pikku-secrets.gen.d.ts +1 -1
  129. package/dist/.pikku/secrets/pikku-secrets.gen.js +1 -1
  130. package/dist/.pikku/trigger/pikku-trigger-types.gen.d.ts +1 -1
  131. package/dist/.pikku/trigger/pikku-trigger-types.gen.js +1 -1
  132. package/dist/.pikku/variables/pikku-variable-types.gen.d.ts +1 -1
  133. package/dist/.pikku/variables/pikku-variable-types.gen.js +1 -1
  134. package/dist/.pikku/variables/pikku-variables.gen.d.ts +1 -1
  135. package/dist/.pikku/variables/pikku-variables.gen.js +1 -1
  136. package/dist/.pikku/workflow/meta/allWorkflow.gen.json +237 -629
  137. package/dist/.pikku/workflow/pikku-workflow-types.gen.d.ts +1 -1
  138. package/dist/.pikku/workflow/pikku-workflow-types.gen.js +1 -1
  139. package/dist/.pikku/workflow/pikku-workflow-wirings-meta.gen.js +1 -1
  140. package/dist/.pikku/workflow/pikku-workflow-wirings.gen.js +1 -1
  141. package/dist/bin/pikku-bin.mjs +23 -0
  142. package/dist/bin/pikku.js +28 -1
  143. package/dist/src/cli.wiring.js +286 -10
  144. package/dist/src/deploy/analyzer/analyzer.d.ts +16 -1
  145. package/dist/src/deploy/analyzer/analyzer.js +83 -43
  146. package/dist/src/deploy/analyzer/manifest.d.ts +10 -0
  147. package/dist/src/deploy/build-pipeline.d.ts +2 -0
  148. package/dist/src/deploy/build-pipeline.js +123 -19
  149. package/dist/src/deploy/bundler/bundler.d.ts +3 -1
  150. package/dist/src/deploy/bundler/bundler.js +40 -9
  151. package/dist/src/deploy/bundler/dep-extractor.d.ts +5 -2
  152. package/dist/src/deploy/bundler/dep-extractor.js +103 -23
  153. package/dist/src/deploy/bundler/types.d.ts +5 -1
  154. package/dist/src/deploy/codegen/per-unit-codegen.d.ts +11 -1
  155. package/dist/src/deploy/codegen/per-unit-codegen.js +49 -6
  156. package/dist/src/deploy/plan/planner.js +25 -3
  157. package/dist/src/deploy/plan/provider.d.ts +2 -0
  158. package/dist/src/deploy/provider-adapter.d.ts +34 -0
  159. package/dist/src/deploy/server-entry.d.ts +16 -0
  160. package/dist/src/deploy/server-entry.js +81 -0
  161. package/dist/src/fabric/fabric-commands.d.ts +522 -0
  162. package/dist/src/fabric/fabric-commands.js +299 -0
  163. package/dist/src/fabric/functions/db-schema.function.d.ts +35 -0
  164. package/dist/src/fabric/functions/db-schema.function.js +37 -0
  165. package/dist/src/fabric/functions/deploy-list.function.d.ts +41 -0
  166. package/dist/src/fabric/functions/deploy-list.function.js +43 -0
  167. package/dist/src/fabric/functions/deploy-units.function.d.ts +35 -0
  168. package/dist/src/fabric/functions/deploy-units.function.js +41 -0
  169. package/dist/src/fabric/functions/deploy.function.d.ts +105 -0
  170. package/dist/src/fabric/functions/deploy.function.js +122 -0
  171. package/dist/src/fabric/functions/domains-add.function.d.ts +35 -0
  172. package/dist/src/fabric/functions/domains-add.function.js +46 -0
  173. package/dist/src/fabric/functions/domains-list.function.d.ts +20 -0
  174. package/dist/src/fabric/functions/domains-list.function.js +50 -0
  175. package/dist/src/fabric/functions/domains-remove.function.d.ts +24 -0
  176. package/dist/src/fabric/functions/domains-remove.function.js +44 -0
  177. package/dist/src/fabric/functions/errors.function.d.ts +44 -0
  178. package/dist/src/fabric/functions/errors.function.js +50 -0
  179. package/dist/src/fabric/functions/init.function.d.ts +51 -0
  180. package/dist/src/fabric/functions/init.function.js +54 -0
  181. package/dist/src/fabric/functions/link.function.d.ts +28 -0
  182. package/dist/src/fabric/functions/link.function.js +77 -0
  183. package/dist/src/fabric/functions/llm-key.function.d.ts +46 -0
  184. package/dist/src/fabric/functions/llm-key.function.js +76 -0
  185. package/dist/src/fabric/functions/login.function.d.ts +42 -0
  186. package/dist/src/fabric/functions/login.function.js +68 -0
  187. package/dist/src/fabric/functions/logs.function.d.ts +40 -0
  188. package/dist/src/fabric/functions/logs.function.js +84 -0
  189. package/dist/src/fabric/functions/metrics.function.d.ts +32 -0
  190. package/dist/src/fabric/functions/metrics.function.js +49 -0
  191. package/dist/src/fabric/functions/rollback.function.d.ts +76 -0
  192. package/dist/src/fabric/functions/rollback.function.js +69 -0
  193. package/dist/src/fabric/functions/secrets-list.function.d.ts +24 -0
  194. package/dist/src/fabric/functions/secrets-list.function.js +37 -0
  195. package/dist/src/fabric/functions/secrets-set.function.d.ts +32 -0
  196. package/dist/src/fabric/functions/secrets-set.function.js +36 -0
  197. package/dist/src/fabric/functions/status.function.d.ts +34 -0
  198. package/dist/src/fabric/functions/status.function.js +43 -0
  199. package/dist/src/fabric/functions/trace.function.d.ts +28 -0
  200. package/dist/src/fabric/functions/trace.function.js +45 -0
  201. package/dist/src/fabric/functions/validate.function.d.ts +50 -0
  202. package/dist/src/fabric/functions/validate.function.js +363 -0
  203. package/dist/src/fabric/lib/config.d.ts +64 -0
  204. package/dist/src/fabric/lib/config.js +62 -0
  205. package/dist/src/fabric/lib/console-url.d.ts +5 -0
  206. package/dist/src/fabric/lib/console-url.js +13 -0
  207. package/dist/src/fabric/lib/git.d.ts +53 -0
  208. package/dist/src/fabric/lib/git.js +151 -0
  209. package/dist/src/fabric/lib/http.d.ts +4 -0
  210. package/dist/src/fabric/lib/http.js +12 -0
  211. package/dist/src/fabric/lib/not-implemented.d.ts +5 -0
  212. package/dist/src/fabric/lib/not-implemented.js +8 -0
  213. package/dist/src/fabric/lib/output.d.ts +23 -0
  214. package/dist/src/fabric/lib/output.js +39 -0
  215. package/dist/src/fabric/lib/prompt.d.ts +12 -0
  216. package/dist/src/fabric/lib/prompt.js +32 -0
  217. package/dist/src/fabric/lib/stage.d.ts +7 -0
  218. package/dist/src/fabric/lib/stage.js +14 -0
  219. package/dist/src/fabric/sdk/pikku-fetch.gen.d.ts +14 -0
  220. package/dist/src/fabric/sdk/pikku-fetch.gen.js +30 -0
  221. package/dist/src/fabric/sdk/pikku-rpc.gen.d.ts +105 -0
  222. package/dist/src/fabric/sdk/pikku-rpc.gen.js +126 -0
  223. package/dist/src/functions/commands/all.d.ts +1 -1
  224. package/dist/src/functions/commands/binary.d.ts +7 -0
  225. package/dist/src/functions/commands/binary.js +40 -0
  226. package/dist/src/functions/commands/bootstrap.d.ts +1 -1
  227. package/dist/src/functions/commands/bootstrap.js +7 -4
  228. package/dist/src/functions/commands/console.d.ts +3 -3
  229. package/dist/src/functions/commands/db-migrate.d.ts +1 -0
  230. package/dist/src/functions/commands/db-migrate.js +35 -0
  231. package/dist/src/functions/commands/db-reset.d.ts +1 -0
  232. package/dist/src/functions/commands/db-reset.js +36 -0
  233. package/dist/src/functions/commands/db-seed.d.ts +1 -0
  234. package/dist/src/functions/commands/db-seed.js +27 -0
  235. package/dist/src/functions/commands/db-shared.d.ts +32 -0
  236. package/dist/src/functions/commands/db-shared.js +26 -0
  237. package/dist/src/functions/commands/deploy-apply.d.ts +3 -3
  238. package/dist/src/functions/commands/deploy-apply.js +6 -4
  239. package/dist/src/functions/commands/deploy-info.d.ts +1 -1
  240. package/dist/src/functions/commands/deploy-plan.d.ts +3 -3
  241. package/dist/src/functions/commands/deploy-plan.js +7 -1
  242. package/dist/src/functions/commands/dev.d.ts +3 -3
  243. package/dist/src/functions/commands/dev.js +142 -86
  244. package/dist/src/functions/commands/enable.d.ts +5 -4
  245. package/dist/src/functions/commands/enable.js +4 -0
  246. package/dist/src/functions/commands/info.d.ts +4 -4
  247. package/dist/src/functions/commands/load-user-project.d.ts +11 -0
  248. package/dist/src/functions/commands/load-user-project.js +40 -0
  249. package/dist/src/functions/commands/meta.d.ts +82 -0
  250. package/dist/src/functions/commands/meta.js +454 -0
  251. package/dist/src/functions/commands/new-addon.d.ts +3 -3
  252. package/dist/src/functions/commands/new-function.d.ts +3 -3
  253. package/dist/src/functions/commands/new-middleware.d.ts +3 -3
  254. package/dist/src/functions/commands/new-permission.d.ts +3 -3
  255. package/dist/src/functions/commands/new-wiring.d.ts +3 -3
  256. package/dist/src/functions/commands/pikku-command-bootstrap.d.ts +1 -1
  257. package/dist/src/functions/commands/pikku-command-bootstrap.js +15 -1
  258. package/dist/src/functions/commands/pikku-command-summary.d.ts +1 -1
  259. package/dist/src/functions/commands/pikku-command-summary.js +7 -1
  260. package/dist/src/functions/commands/skills.d.ts +26 -0
  261. package/dist/src/functions/commands/skills.js +184 -0
  262. package/dist/src/functions/commands/tests-coverage.d.ts +7 -0
  263. package/dist/src/functions/commands/tests-coverage.js +231 -0
  264. package/dist/src/functions/commands/tests-init.d.ts +7 -0
  265. package/dist/src/functions/commands/tests-init.js +225 -0
  266. package/dist/src/functions/commands/versions-check.d.ts +1 -1
  267. package/dist/src/functions/commands/versions-init.d.ts +3 -3
  268. package/dist/src/functions/commands/versions-update.d.ts +1 -1
  269. package/dist/src/functions/commands/versions-update.js +4 -2
  270. package/dist/src/functions/commands/watch.d.ts +3 -3
  271. package/dist/src/functions/commands/watch.js +1 -1
  272. package/dist/src/functions/db/local-db.d.ts +48 -0
  273. package/dist/src/functions/db/local-db.js +106 -0
  274. package/dist/src/functions/db/seed.d.ts +11 -0
  275. package/dist/src/functions/db/seed.js +22 -0
  276. package/dist/src/functions/db/sql-migrator.d.ts +26 -0
  277. package/dist/src/functions/db/sql-migrator.js +104 -0
  278. package/dist/src/functions/db/sqlite-codegen.d.ts +45 -0
  279. package/dist/src/functions/db/sqlite-codegen.js +294 -0
  280. package/dist/src/functions/db/zod-codegen.d.ts +10 -0
  281. package/dist/src/functions/db/zod-codegen.js +109 -0
  282. package/dist/src/functions/runtimes/fetch/index.d.ts +1 -1
  283. package/dist/src/functions/runtimes/nextjs/pikku-command-nextjs.d.ts +1 -1
  284. package/dist/src/functions/runtimes/nextjs/pikku-command-nextjs.js +21 -2
  285. package/dist/src/functions/runtimes/nextjs/serialize-nextjs-backend-worker-rpc-wrapper.d.ts +1 -0
  286. package/dist/src/functions/runtimes/nextjs/serialize-nextjs-backend-worker-rpc-wrapper.js +163 -0
  287. package/dist/src/functions/runtimes/nextjs/serialize-nextjs-http-wrapper.d.ts +1 -1
  288. package/dist/src/functions/runtimes/nextjs/serialize-nextjs-http-wrapper.js +5 -2
  289. package/dist/src/functions/runtimes/tanstack-start/pikku-command-tanstack-start.d.ts +1 -0
  290. package/dist/src/functions/runtimes/tanstack-start/pikku-command-tanstack-start.js +32 -0
  291. package/dist/src/functions/runtimes/tanstack-start/serialize-tanstack-start-shim.d.ts +11 -0
  292. package/dist/src/functions/runtimes/tanstack-start/serialize-tanstack-start-shim.js +36 -0
  293. package/dist/src/functions/runtimes/websocket/pikku-command-websocket-typed.d.ts +1 -1
  294. package/dist/src/functions/wirings/ai-agent/pikku-command-ai-agent-types.d.ts +1 -1
  295. package/dist/src/functions/wirings/ai-agent/pikku-command-ai-agent.d.ts +1 -1
  296. package/dist/src/functions/wirings/ai-agent/pikku-command-ai-agent.js +1 -10
  297. package/dist/src/functions/wirings/ai-agent/pikku-command-public-agent.d.ts +1 -1
  298. package/dist/src/functions/wirings/ai-agent/serialize-public-agent.js +76 -1
  299. package/dist/src/functions/wirings/channels/pikku-channels.d.ts +1 -1
  300. package/dist/src/functions/wirings/channels/pikku-command-channel-types.d.ts +1 -1
  301. package/dist/src/functions/wirings/channels/pikku-command-channels-map.d.ts +1 -1
  302. package/dist/src/functions/wirings/channels/pikku-command-channels.d.ts +1 -1
  303. package/dist/src/functions/wirings/channels/pikku-command-channels.js +1 -1
  304. package/dist/src/functions/wirings/cli/pikku-command-cli-entry.d.ts +1 -1
  305. package/dist/src/functions/wirings/cli/pikku-command-cli-entry.js +5 -2
  306. package/dist/src/functions/wirings/cli/pikku-command-cli-types.d.ts +5 -1
  307. package/dist/src/functions/wirings/cli/pikku-command-cli-types.js +8 -2
  308. package/dist/src/functions/wirings/cli/pikku-command-cli.d.ts +1 -1
  309. package/dist/src/functions/wirings/cli/serialize-channel-cli-client.js +27 -9
  310. package/dist/src/functions/wirings/cli/serialize-channel-cli.d.ts +5 -1
  311. package/dist/src/functions/wirings/cli/serialize-channel-cli.js +13 -3
  312. package/dist/src/functions/wirings/console/pikku-command-console-functions.d.ts +1 -1
  313. package/dist/src/functions/wirings/console/pikku-command-console-functions.js +5 -1
  314. package/dist/src/functions/wirings/console/pikku-command-node-types.d.ts +1 -1
  315. package/dist/src/functions/wirings/console/pikku-command-nodes-meta.d.ts +1 -1
  316. package/dist/src/functions/wirings/console/serialize-console-functions.js +5 -0
  317. package/dist/src/functions/wirings/credentials/pikku-command-credentials.d.ts +1 -1
  318. package/dist/src/functions/wirings/functions/pikku-command-addon-types.d.ts +5 -1
  319. package/dist/src/functions/wirings/functions/pikku-command-addon-types.js +7 -2
  320. package/dist/src/functions/wirings/functions/pikku-command-function-types-split.d.ts +1 -1
  321. package/dist/src/functions/wirings/functions/pikku-command-function-types-split.js +1 -1
  322. package/dist/src/functions/wirings/functions/pikku-command-function-types.d.ts +1 -1
  323. package/dist/src/functions/wirings/functions/pikku-command-functions.d.ts +1 -1
  324. package/dist/src/functions/wirings/functions/pikku-command-services.d.ts +1 -1
  325. package/dist/src/functions/wirings/functions/schemas.d.ts +1 -1
  326. package/dist/src/functions/wirings/functions/serialize-function-types.js +105 -80
  327. package/dist/src/functions/wirings/gateway/pikku-command-gateway.d.ts +1 -1
  328. package/dist/src/functions/wirings/http/pikku-command-http-map.d.ts +1 -1
  329. package/dist/src/functions/wirings/http/pikku-command-http-routes.d.ts +1 -1
  330. package/dist/src/functions/wirings/http/pikku-command-http-routes.js +1 -1
  331. package/dist/src/functions/wirings/http/pikku-command-http-types.d.ts +1 -1
  332. package/dist/src/functions/wirings/http/pikku-command-openapi.d.ts +1 -1
  333. package/dist/src/functions/wirings/http/pikku-http-routes.d.ts +1 -1
  334. package/dist/src/functions/wirings/mcp/pikku-command-mcp-json.d.ts +1 -1
  335. package/dist/src/functions/wirings/mcp/pikku-command-mcp-types.d.ts +1 -1
  336. package/dist/src/functions/wirings/mcp/pikku-command-mcp.d.ts +1 -1
  337. package/dist/src/functions/wirings/middleware/pikku-command-middleware.d.ts +1 -1
  338. package/dist/src/functions/wirings/package/pikku-command-package-types.d.ts +2 -2
  339. package/dist/src/functions/wirings/package/pikku-command-package.d.ts +1 -1
  340. package/dist/src/functions/wirings/permissions/pikku-command-permissions.d.ts +1 -1
  341. package/dist/src/functions/wirings/queue/pikku-command-queue-map.d.ts +1 -1
  342. package/dist/src/functions/wirings/queue/pikku-command-queue-map.js +1 -1
  343. package/dist/src/functions/wirings/queue/pikku-command-queue-service.d.ts +1 -1
  344. package/dist/src/functions/wirings/queue/pikku-command-queue-types.d.ts +1 -1
  345. package/dist/src/functions/wirings/queue/pikku-command-queue.d.ts +1 -1
  346. package/dist/src/functions/wirings/queue/pikku-command-queue.js +1 -1
  347. package/dist/src/functions/wirings/queue/pikku-queue-map.d.ts +1 -1
  348. package/dist/src/functions/wirings/queue/pikku-queue.d.ts +1 -1
  349. package/dist/src/functions/wirings/realtime/pikku-command-events-scaffold.d.ts +1 -0
  350. package/dist/src/functions/wirings/realtime/pikku-command-events-scaffold.js +26 -0
  351. package/dist/src/functions/wirings/realtime/pikku-command-realtime.d.ts +1 -0
  352. package/dist/src/functions/wirings/realtime/pikku-command-realtime.js +35 -0
  353. package/dist/src/functions/wirings/realtime/serialize-events-scaffold.d.ts +23 -0
  354. package/dist/src/functions/wirings/realtime/serialize-events-scaffold.js +98 -0
  355. package/dist/src/functions/wirings/realtime/serialize-realtime-client.d.ts +22 -0
  356. package/dist/src/functions/wirings/realtime/serialize-realtime-client.js +337 -0
  357. package/dist/src/functions/wirings/rpc/pikku-command-public-rpc.d.ts +1 -1
  358. package/dist/src/functions/wirings/rpc/pikku-command-public-rpc.js +5 -1
  359. package/dist/src/functions/wirings/rpc/pikku-command-react-query.d.ts +1 -1
  360. package/dist/src/functions/wirings/rpc/pikku-command-remote-rpc.d.ts +1 -1
  361. package/dist/src/functions/wirings/rpc/pikku-command-remote-rpc.js +5 -1
  362. package/dist/src/functions/wirings/rpc/pikku-command-rpc-client.d.ts +1 -1
  363. package/dist/src/functions/wirings/rpc/pikku-command-rpc-client.js +3 -1
  364. package/dist/src/functions/wirings/rpc/pikku-command-rpc-map.d.ts +2 -2
  365. package/dist/src/functions/wirings/rpc/pikku-command-rpc.d.ts +2 -1
  366. package/dist/src/functions/wirings/rpc/pikku-command-rpc.js +13 -7
  367. package/dist/src/functions/wirings/rpc/serialize-public-rpc.js +1 -0
  368. package/dist/src/functions/wirings/rpc/serialize-react-query-hooks.js +1 -1
  369. package/dist/src/functions/wirings/rpc/serialize-remote-rpc.js +7 -1
  370. package/dist/src/functions/wirings/rpc/serialize-typed-rpc-map.js +16 -2
  371. package/dist/src/functions/wirings/scheduler/pikku-command-scheduler-types.d.ts +1 -1
  372. package/dist/src/functions/wirings/scheduler/pikku-command-scheduler.d.ts +1 -1
  373. package/dist/src/functions/wirings/secrets/pikku-command-secrets.d.ts +1 -1
  374. package/dist/src/functions/wirings/triggers/pikku-command-trigger-types.d.ts +1 -1
  375. package/dist/src/functions/wirings/triggers/pikku-command-trigger-types.js +1 -1
  376. package/dist/src/functions/wirings/triggers/pikku-command-trigger.d.ts +1 -1
  377. package/dist/src/functions/wirings/variables/pikku-command-variables.d.ts +1 -1
  378. package/dist/src/functions/wirings/workflow/pikku-command-workflow-routes.d.ts +1 -1
  379. package/dist/src/functions/wirings/workflow/pikku-command-workflow-routes.js +1 -1
  380. package/dist/src/functions/wirings/workflow/pikku-command-workflow.d.ts +5 -1
  381. package/dist/src/functions/wirings/workflow/pikku-command-workflow.js +18 -4
  382. package/dist/src/functions/wirings/workflow/serialize-workflow-bootstrap-map.d.ts +3 -0
  383. package/dist/src/functions/wirings/workflow/serialize-workflow-bootstrap-map.js +40 -0
  384. package/dist/src/functions/wirings/workflow/serialize-workflow-routes.js +56 -2
  385. package/dist/src/functions/workflows/all.workflow.js +45 -12
  386. package/dist/src/scaffold/rpc-remote.gen.d.ts +3 -3
  387. package/dist/src/scaffold/rpc-remote.gen.js +7 -2
  388. package/dist/src/scaffold/workflow-routes.gen.d.ts +18 -18
  389. package/dist/src/scaffold/workflow-routes.gen.js +33 -1
  390. package/dist/src/services/cli-logger.service.d.ts +22 -3
  391. package/dist/src/services/cli-logger.service.js +107 -41
  392. package/dist/src/services.js +32 -67
  393. package/dist/src/utils/generate-bootstrap-file.js +3 -0
  394. package/dist/src/utils/parse-cli-filters.d.ts +18 -0
  395. package/dist/src/utils/parse-cli-filters.js +99 -0
  396. package/dist/src/utils/pikku-cli-config.js +29 -9
  397. package/dist/tsconfig.tsbuildinfo +1 -1
  398. package/package.json +9 -4
  399. package/skills/pikku-addon/SKILL.md +330 -0
  400. package/skills/pikku-ai-agent/SKILL.md +227 -0
  401. package/skills/pikku-ai-vercel/SKILL.md +78 -0
  402. package/skills/pikku-ai-voice/SKILL.md +85 -0
  403. package/skills/pikku-auth-js/SKILL.md +106 -0
  404. package/skills/pikku-aws/SKILL.md +107 -0
  405. package/skills/pikku-backblaze/SKILL.md +70 -0
  406. package/skills/pikku-cli/SKILL.md +281 -0
  407. package/skills/pikku-concepts/SKILL.md +281 -0
  408. package/skills/pikku-concepts/references/concept-mapping.md +528 -0
  409. package/skills/pikku-config/SKILL.md +208 -0
  410. package/skills/pikku-cron/SKILL.md +211 -0
  411. package/skills/pikku-deploy-azure/SKILL.md +69 -0
  412. package/skills/pikku-deploy-cloudflare/SKILL.md +80 -0
  413. package/skills/pikku-deploy-express/SKILL.md +83 -0
  414. package/skills/pikku-deploy-fastify/SKILL.md +70 -0
  415. package/skills/pikku-deploy-lambda/SKILL.md +107 -0
  416. package/skills/pikku-deploy-nextjs/SKILL.md +76 -0
  417. package/skills/pikku-deploy-uws/SKILL.md +85 -0
  418. package/skills/pikku-fabric/SKILL.md +245 -0
  419. package/skills/pikku-feature/SKILL.md +258 -0
  420. package/skills/pikku-gateway-slack/SKILL.md +112 -0
  421. package/skills/pikku-http/SKILL.md +317 -0
  422. package/skills/pikku-i18n/SKILL.md +208 -0
  423. package/skills/pikku-info/SKILL.md +95 -0
  424. package/skills/pikku-jose/SKILL.md +102 -0
  425. package/skills/pikku-kysely/SKILL.md +145 -0
  426. package/skills/pikku-mcp/SKILL.md +237 -0
  427. package/skills/pikku-mongodb/SKILL.md +102 -0
  428. package/skills/pikku-n8n-addon-map/SKILL.md +178 -0
  429. package/skills/pikku-n8n-code-translate/SKILL.md +166 -0
  430. package/skills/pikku-pino/SKILL.md +77 -0
  431. package/skills/pikku-queue/SKILL.md +237 -0
  432. package/skills/pikku-react/SKILL.md +183 -0
  433. package/skills/pikku-react-query/SKILL.md +205 -0
  434. package/skills/pikku-realtime/SKILL.md +285 -0
  435. package/skills/pikku-redis/SKILL.md +87 -0
  436. package/skills/pikku-rpc/SKILL.md +168 -0
  437. package/skills/pikku-rtl/SKILL.md +205 -0
  438. package/skills/pikku-schedule/SKILL.md +54 -0
  439. package/skills/pikku-schema-ajv/SKILL.md +60 -0
  440. package/skills/pikku-schema-cfworker/SKILL.md +60 -0
  441. package/skills/pikku-security/SKILL.md +243 -0
  442. package/skills/pikku-services/SKILL.md +247 -0
  443. package/skills/pikku-template-clone/SKILL.md +39 -0
  444. package/skills/pikku-testing/SKILL.md +428 -0
  445. package/skills/pikku-trigger/SKILL.md +177 -0
  446. package/skills/pikku-versioning/SKILL.md +169 -0
  447. package/skills/pikku-websocket/SKILL.md +239 -0
  448. package/skills/pikku-workflow/SKILL.md +283 -0
  449. package/skills/pikku-workflows-client/SKILL.md +150 -0
  450. package/skills/pikku-ws/SKILL.md +45 -0
  451. package/console-app/assets/index-BpY2pSuA.css +0 -10
  452. package/console-app/assets/index-DXLy-_D4.js +0 -717
  453. package/dist/.pikku/cli/pikku-cli-client.gen.d.ts +0 -10
  454. package/dist/.pikku/cli/pikku-cli-client.gen.js +0 -44
  455. /package/dist/.pikku/schemas/schemas/{PikkuChannelsOutput.schema.json → PikkuCLIEntryOutput.schema.json} +0 -0
@@ -5,13 +5,17 @@ import { logCommandInfoAndTime } from '../../../middleware/log-command-info-and-
5
5
  import { serializeWorkflowTypes } from './serialize-workflow-types.js';
6
6
  import { serializeWorkflowRegistration } from './serialize-workflow-registration.js';
7
7
  import { serializeWorkflowMap } from './serialize-workflow-map.js';
8
+ import { serializeWorkflowBootstrapMap } from './serialize-workflow-bootstrap-map.js';
8
9
  import { serializeWorkflowMeta } from './serialize-workflow-meta.js';
9
10
  import { getFileImportRelativePath } from '../../../utils/file-import-path.js';
10
11
  import { stripVerboseFields, hasVerboseFields, } from '../../../utils/strip-verbose-meta.js';
11
12
  import { join } from 'path';
12
13
  export const pikkuWorkflow = pikkuSessionlessFunc({
13
- func: async ({ logger, config, getInspectorState }) => {
14
- const visitState = await getInspectorState();
14
+ func: async ({ logger, config, getInspectorState }, input) => {
15
+ const bootstrap = input?.bootstrap === true;
16
+ const visitState = bootstrap
17
+ ? await getInspectorState(false, true, false)
18
+ : await getInspectorState();
15
19
  const { workflowsWiringFile, workflowsWiringMetaFile, workflowMetaDir, workflowMapDeclarationFile, workflowTypesFile, functionTypesFile, packageMappings, schema, } = config;
16
20
  const { workflows, functions: functionState } = visitState;
17
21
  const { typesMap } = functionState;
@@ -24,7 +28,15 @@ export const pikkuWorkflow = pikkuSessionlessFunc({
24
28
  const hasRelevantWorkflows = allWorkflowNames.length > 0;
25
29
  const hasWorkflows = hasRelevantWorkflows;
26
30
  if (hasWorkflows) {
27
- const hasWorkflowState = visitState.serviceAggregation.allSingletonServices.includes('workflowService');
31
+ const singletonServices = visitState.serviceAggregation.allSingletonServices.length > 0
32
+ ? visitState.serviceAggregation.allSingletonServices
33
+ : visitState.typesLookup?.get('SingletonServices')?.[0]
34
+ ? visitState.typesLookup
35
+ .get('SingletonServices')[0]
36
+ .getProperties()
37
+ .map((symbol) => symbol.getName())
38
+ : [];
39
+ const hasWorkflowState = singletonServices.includes('workflowService');
28
40
  if (!hasWorkflowState) {
29
41
  logger.critical(ErrorCode.WORKFLOW_ORCHESTRATOR_NOT_CONFIGURED, 'Workflows detected but workflowService service not configured. Please add workflowService to your singleton services');
30
42
  throw new Error('WorkflowState service not configured but workflows are defined');
@@ -50,7 +62,9 @@ export const pikkuWorkflow = pikkuSessionlessFunc({
50
62
  const rpcMapImportPath = getFileImportRelativePath(workflowTypesFile, config.rpcInternalMapDeclarationFile, packageMappings);
51
63
  const workflowMapImportPath = getFileImportRelativePath(workflowTypesFile, workflowMapDeclarationFile, packageMappings);
52
64
  await writeFileInDir(logger, workflowTypesFile, serializeWorkflowTypes(functionTypesImportPath, rpcMapImportPath, workflowMapImportPath));
53
- await writeFileInDir(logger, workflowMapDeclarationFile, serializeWorkflowMap(logger, workflowMapDeclarationFile, packageMappings, typesMap, functionState.meta, workflows.meta, workflows.graphMeta, visitState.rpc?.wireAddonDeclarations));
65
+ await writeFileInDir(logger, workflowMapDeclarationFile, bootstrap
66
+ ? serializeWorkflowBootstrapMap(workflows.meta, workflows.graphMeta)
67
+ : serializeWorkflowMap(logger, workflowMapDeclarationFile, packageMappings, typesMap, functionState.meta, workflows.meta, workflows.graphMeta, visitState.rpc?.wireAddonDeclarations));
54
68
  return hasWorkflows;
55
69
  },
56
70
  middleware: [
@@ -0,0 +1,3 @@
1
+ import type { WorkflowsMeta } from '@pikku/core/workflow';
2
+ import type { SerializedWorkflowGraphs } from '@pikku/inspector/workflow-graph';
3
+ export declare const serializeWorkflowBootstrapMap: (workflowsMeta: WorkflowsMeta, graphMeta: SerializedWorkflowGraphs) => string;
@@ -0,0 +1,40 @@
1
+ export const serializeWorkflowBootstrapMap = (workflowsMeta, graphMeta) => {
2
+ const workflowEntries = Object.keys(workflowsMeta)
3
+ .sort()
4
+ .map((workflowName) => ` readonly '${workflowName}': WorkflowHandler<unknown, unknown>,`)
5
+ .join('\n');
6
+ const graphEntries = Object.entries(graphMeta)
7
+ .sort(([a], [b]) => a.localeCompare(b))
8
+ .map(([graphName, graph]) => {
9
+ const nodeEntries = Object.keys(graph.nodes)
10
+ .sort()
11
+ .map((nodeId) => ` readonly '${nodeId}': GraphNodeHandler<unknown>,`)
12
+ .join('\n');
13
+ return ` readonly '${graphName}': {\n${nodeEntries}\n },`;
14
+ })
15
+ .join('\n');
16
+ return `/**
17
+ * Bootstrap-safe workflow type map.
18
+ * Full input/output types are populated by the later \`pikku all\` pass.
19
+ */
20
+
21
+ interface WorkflowHandler<I, O> {
22
+ input: I;
23
+ output: O;
24
+ }
25
+
26
+ interface GraphNodeHandler<I> {
27
+ input: I;
28
+ }
29
+
30
+ export type WorkflowMap = {
31
+ ${workflowEntries}
32
+ };
33
+
34
+ export type GraphsMap = {
35
+ ${graphEntries}
36
+ };
37
+
38
+ export type FlattenedWorkflowMap = WorkflowMap
39
+ `;
40
+ };
@@ -23,8 +23,13 @@ export const workflowStarter = pikkuSessionlessFunc<
23
23
  { workflowName: string; data?: unknown },
24
24
  { runId: string }
25
25
  >({
26
+ tags: ['pikku'],
26
27
  auth: ${authFlag},
27
- func: async (_services, { workflowName, data }, { rpc }) => {
28
+ // workflowService is destructured (even though we delegate via rpc) so the
29
+ // analyzer assigns workflow-state capability to this unit — without it,
30
+ // rpc.startWorkflow() runs against a container missing workflowService.
31
+ func: async ({ workflowService }, { workflowName, data }, { rpc }) => {
32
+ assertWorkflowService(workflowService)
28
33
  return await rpc.startWorkflow(workflowName as any, (data ?? {}) as any)
29
34
  },
30
35
  })
@@ -33,6 +38,7 @@ export const workflowRunner = pikkuSessionlessFunc<
33
38
  { workflowName: string; data?: unknown },
34
39
  unknown
35
40
  >({
41
+ tags: ['pikku'],
36
42
  auth: ${authFlag},
37
43
  func: async ({ workflowService }, { workflowName, data }, { rpc }) => {
38
44
  assertWorkflowService(workflowService)
@@ -44,6 +50,7 @@ export const workflowStatusChecker = pikkuSessionlessFunc<
44
50
  { workflowName: string; runId: string },
45
51
  WorkflowRunStatus
46
52
  >({
53
+ tags: ['pikku'],
47
54
  auth: ${authFlag},
48
55
  func: async ({ workflowService }, { runId }) => {
49
56
  assertWorkflowService(workflowService)
@@ -61,6 +68,7 @@ export const workflowStatusStream = pikkuSessionlessFunc<
61
68
  { workflowName: string; runId: string },
62
69
  unknown
63
70
  >({
71
+ tags: ['pikku'],
64
72
  auth: ${authFlag},
65
73
  func: async ({ workflowRunService }, { runId }, { channel }) => {
66
74
  assertWorkflowRunService(workflowRunService)
@@ -68,6 +76,7 @@ export const workflowStatusStream = pikkuSessionlessFunc<
68
76
 
69
77
  const terminalStatuses = new Set(['completed', 'failed', 'cancelled'])
70
78
  let lastHash = ''
79
+ let initSent = false
71
80
 
72
81
  const poll = async () => {
73
82
  const run = await workflowRunService.getRun(runId)
@@ -78,6 +87,26 @@ export const workflowStatusStream = pikkuSessionlessFunc<
78
87
 
79
88
  const steps = await workflowRunService.getRunSteps(runId)
80
89
 
90
+ if (!initSent && run.deterministic) {
91
+ const statusByStep = new Map(
92
+ steps.map((s: { stepName: string; status: string }) => [
93
+ s.stepName,
94
+ s.status,
95
+ ])
96
+ )
97
+ channel.send({
98
+ type: 'init',
99
+ deterministic: true,
100
+ steps: (run.plannedSteps ?? []).map(
101
+ (s: { stepName: string }) => ({
102
+ stepName: s.stepName,
103
+ status: statusByStep.get(s.stepName) ?? 'pending',
104
+ })
105
+ ),
106
+ })
107
+ initSent = true
108
+ }
109
+
81
110
  const hash = JSON.stringify({
82
111
  s: run.status,
83
112
  steps: steps.map((s: { stepName: string; status: string }) => [s.stepName, s.status]),
@@ -126,6 +155,7 @@ export const workflowStatusStreamFull = pikkuSessionlessFunc<
126
155
  { workflowName: string; runId: string },
127
156
  unknown
128
157
  >({
158
+ tags: ['pikku'],
129
159
  auth: ${authFlag},
130
160
  func: async ({ workflowRunService }, { runId }, { channel }) => {
131
161
  assertWorkflowRunService(workflowRunService)
@@ -133,6 +163,7 @@ export const workflowStatusStreamFull = pikkuSessionlessFunc<
133
163
 
134
164
  const terminalStatuses = new Set(['completed', 'failed', 'cancelled'])
135
165
  let lastHash = ''
166
+ let initSent = false
136
167
 
137
168
  const poll = async () => {
138
169
  const run = await workflowRunService.getRun(runId)
@@ -143,6 +174,26 @@ export const workflowStatusStreamFull = pikkuSessionlessFunc<
143
174
 
144
175
  const steps = await workflowRunService.getRunSteps(runId)
145
176
 
177
+ if (!initSent && run.deterministic) {
178
+ const statusByStep = new Map(
179
+ steps.map((s: { stepName: string; status: string }) => [
180
+ s.stepName,
181
+ s.status,
182
+ ])
183
+ )
184
+ channel.send({
185
+ type: 'init',
186
+ deterministic: true,
187
+ steps: (run.plannedSteps ?? []).map(
188
+ (s: { stepName: string }) => ({
189
+ stepName: s.stepName,
190
+ status: statusByStep.get(s.stepName) ?? 'pending',
191
+ })
192
+ ),
193
+ })
194
+ initSent = true
195
+ }
196
+
146
197
  const hash = JSON.stringify({
147
198
  s: run.status,
148
199
  o: run.output,
@@ -192,7 +243,10 @@ export const graphStarter = pikkuSessionlessFunc<
192
243
  { runId: string }
193
244
  >({
194
245
  auth: ${authFlag},
195
- func: async (_services, { workflowName, nodeId, data }, { rpc }) => {
246
+ // See workflowStarter destructure workflowService so the analyzer
247
+ // assigns workflow-state capability to this unit.
248
+ func: async ({ workflowService }, { workflowName, nodeId, data }, { rpc }) => {
249
+ assertWorkflowService(workflowService)
196
250
  return await rpc.startWorkflow(workflowName as any, (data ?? {}) as any, { startNode: nodeId })
197
251
  },
198
252
  })
@@ -14,6 +14,11 @@ const scaffoldFiles = (config) => {
14
14
  file: config.publicAgentFile,
15
15
  generator: 'pikkuPublicAgent',
16
16
  });
17
+ if (config.scaffold?.events && config.eventsChannelFile)
18
+ files.push({
19
+ file: config.eventsChannelFile,
20
+ generator: 'pikkuEventsScaffold',
21
+ });
17
22
  return files;
18
23
  };
19
24
  export const allWorkflow = pikkuWorkflowComplexFunc({
@@ -23,20 +28,30 @@ export const allWorkflow = pikkuWorkflowComplexFunc({
23
28
  let typesDeclarationFileExists = true;
24
29
  if (!existsSync(config.outDir)) {
25
30
  logger.debug(`• .pikku directory not found, running bootstrap first...`);
26
- await workflow.do('Bootstrap inspect', async () => getInspectorState(false, false, true));
31
+ await workflow.do('Bootstrap inspect', async () => getInspectorState(false, true, true));
32
+ await workflow.do('Bootstrap function types split', 'pikkuFunctionTypesSplit', null);
27
33
  await workflow.do('Bootstrap function types', 'pikkuFunctionTypes', null);
34
+ await workflow.do('Bootstrap addon types', 'pikkuAddonTypes', {
35
+ bootstrap: true,
36
+ });
28
37
  await Promise.all([
29
- workflow.do('Bootstrap function types split', 'pikkuFunctionTypesSplit', null),
30
38
  workflow.do('Bootstrap HTTP types', 'pikkuHTTPTypes', null),
31
39
  workflow.do('Bootstrap channel types', 'pikkuChannelTypes', null),
32
40
  workflow.do('Bootstrap scheduler types', 'pikkuSchedulerTypes', null),
33
41
  workflow.do('Bootstrap queue types', 'pikkuQueueTypes', null),
34
- workflow.do('Bootstrap workflow', 'pikkuWorkflow', null),
42
+ workflow.do('Bootstrap workflow', 'pikkuWorkflow', {
43
+ bootstrap: true,
44
+ }),
45
+ workflow.do('Bootstrap Trigger types', 'pikkuTriggerTypes', null),
35
46
  workflow.do('Bootstrap MCP types', 'pikkuMCPTypes', null),
36
47
  workflow.do('Bootstrap AI agent types', 'pikkuAIAgentTypes', null),
37
- workflow.do('Bootstrap CLI types', 'pikkuCLITypes', null),
38
48
  ]);
39
- await workflow.do('Bootstrap re-inspect', async () => getInspectorState(true));
49
+ await workflow.do('Bootstrap Node types', 'pikkuNodeTypes', null);
50
+ await workflow.do('Bootstrap Secret definition types', 'pikkuSecretDefinitionTypes', null);
51
+ await workflow.do('Bootstrap CLI types', 'pikkuCLITypes', {
52
+ bootstrap: true,
53
+ });
54
+ await workflow.do('Bootstrap re-inspect', async () => getInspectorState(true, true));
40
55
  }
41
56
  if (!existsSync(config.typesDeclarationFile)) {
42
57
  typesDeclarationFileExists = false;
@@ -59,9 +74,13 @@ export const allWorkflow = pikkuWorkflowComplexFunc({
59
74
  workflow.do('AI agent types', 'pikkuAIAgentTypes', null),
60
75
  ];
61
76
  if (!config.addon) {
62
- typeGenerators.push(workflow.do('HTTP types', 'pikkuHTTPTypes', null), workflow.do('Channel types', 'pikkuChannelTypes', null), workflow.do('Scheduler types', 'pikkuSchedulerTypes', null), workflow.do('Queue types', 'pikkuQueueTypes', null), workflow.do('MCP types', 'pikkuMCPTypes', null), workflow.do('CLI types', 'pikkuCLITypes', null));
77
+ typeGenerators.push(workflow.do('HTTP types', 'pikkuHTTPTypes', null), workflow.do('Channel types', 'pikkuChannelTypes', null), workflow.do('Scheduler types', 'pikkuSchedulerTypes', null), workflow.do('Queue types', 'pikkuQueueTypes', null), workflow.do('MCP types', 'pikkuMCPTypes', null));
63
78
  }
64
79
  await Promise.all(typeGenerators);
80
+ await workflow.do('Node types', 'pikkuNodeTypes', null);
81
+ if (!config.addon) {
82
+ await workflow.do('CLI types', 'pikkuCLITypes', null);
83
+ }
65
84
  const [middleware, permissions] = await Promise.all([
66
85
  workflow.do('Middleware', 'pikkuMiddleware', null),
67
86
  workflow.do('Permissions', 'pikkuPermissions', null),
@@ -91,7 +110,7 @@ export const allWorkflow = pikkuWorkflowComplexFunc({
91
110
  await Promise.all([
92
111
  workflow.do('Public RPC', 'pikkuPublicRPC', null),
93
112
  workflow.do('Console functions', 'pikkuConsoleFunctions', null),
94
- workflow.do('Node types', 'pikkuNodeTypes', null),
113
+ workflow.do('Events scaffold', 'pikkuEventsScaffold', null),
95
114
  workflow.do('Secret definition types', 'pikkuSecretDefinitionTypes', null),
96
115
  workflow.do('Secrets', 'pikkuSecrets', null),
97
116
  workflow.do('Credentials', 'pikkuCredentials', null),
@@ -128,7 +147,7 @@ export const allWorkflow = pikkuWorkflowComplexFunc({
128
147
  }
129
148
  if (!config.addon) {
130
149
  const [http, scheduler, triggers] = await Promise.all([
131
- workflow.do('HTTP', 'pikkuHTTP', null),
150
+ workflow.do('HTTP', 'pikkuCommandHTTP', null),
132
151
  workflow.do('Scheduler', 'pikkuScheduler', null),
133
152
  workflow.do('Trigger', 'pikkuTrigger', null),
134
153
  ]);
@@ -138,6 +157,8 @@ export const allWorkflow = pikkuWorkflowComplexFunc({
138
157
  workflow.do('Fetch', 'pikkuFetch', null),
139
158
  workflow.do('RPC client', 'pikkuRPCClient', null),
140
159
  workflow.do('React query', 'pikkuReactQuery', null),
160
+ workflow.do('TanStack Start', 'pikkuTanStackStart', null),
161
+ workflow.do('Realtime client', 'pikkuRealtime', null),
141
162
  ]);
142
163
  allImports.push(config.httpWiringMetaFile, config.httpWiringsFile);
143
164
  }
@@ -158,15 +179,15 @@ export const allWorkflow = pikkuWorkflowComplexFunc({
158
179
  }
159
180
  if (!config.addon) {
160
181
  const [queues, channels, gateways, mcp, cli] = await Promise.all([
161
- workflow.do('Queue', 'pikkuQueue', null),
162
- workflow.do('Channels', 'pikkuChannels', null),
182
+ workflow.do('Queue', 'pikkuCommandQueue', null),
183
+ workflow.do('Channels', 'pikkuCommandChannels', null),
163
184
  workflow.do('Gateway', 'pikkuGateway', null),
164
185
  workflow.do('MCP', 'pikkuMCP', null),
165
186
  workflow.do('CLI', 'pikkuCLI', null),
166
187
  ]);
167
188
  if (queues) {
168
189
  await Promise.all([
169
- workflow.do('Queue map', 'pikkuQueueMap', null),
190
+ workflow.do('Queue map', 'pikkuCommandQueueMap', null),
170
191
  workflow.do('Queue service', 'pikkuQueueService', null),
171
192
  ]);
172
193
  allImports.push(config.queueWorkersWiringMetaFile, config.queueWorkersWiringFile);
@@ -186,8 +207,20 @@ export const allWorkflow = pikkuWorkflowComplexFunc({
186
207
  allImports.push(config.mcpWiringsMetaFile, config.mcpWiringsFile);
187
208
  }
188
209
  if (cli) {
189
- await workflow.do('CLI entry', 'pikkuCLIEntry', null);
210
+ const cliChannelGenerated = await workflow.do('CLI entry', 'pikkuCLIEntry', null);
190
211
  allImports.push(config.cliWiringMetaFile, config.cliWiringsFile);
212
+ if (cliChannelGenerated) {
213
+ await workflow.do('Re-inspect after CLI channel', async () => getInspectorState(true));
214
+ const cliChannels = await workflow.do('Channels after CLI', 'pikkuCommandChannels', null);
215
+ await workflow.do('Functions after CLI', 'pikkuFunctions', null);
216
+ await workflow.do('Schemas after CLI', 'pikkuSchemas', null);
217
+ if (cliChannels) {
218
+ await workflow.do('Channels map after CLI', 'pikkuChannelsMap', null);
219
+ if (!channels) {
220
+ allImports.push(config.channelsWiringMetaFile, config.channelsWiringFile);
221
+ }
222
+ }
223
+ }
191
224
  }
192
225
  }
193
226
  await workflow.do('Nodes meta', 'pikkuNodesMeta', null);
@@ -1,10 +1,10 @@
1
1
  export declare const remoteRPCHandler: import("../../.pikku/pikku-types.gen.js").PikkuFunctionConfig<{
2
2
  rpcName: string;
3
3
  data?: unknown;
4
- }, unknown, "session" | "rpc", import("../../.pikku/pikku-types.gen.js").PikkuFunctionSessionless<{
4
+ }, unknown, "rpc" | "session", import("../../.pikku/pikku-types.gen.js").PikkuFunctionSessionless<{
5
5
  rpcName: string;
6
6
  data?: unknown;
7
- }, unknown, "session" | "rpc", import("../../types/application-types.js").Services> | import("../../.pikku/pikku-types.gen.js").PikkuFunction<{
7
+ }, unknown, "rpc" | "session", import("../../types/application-types.js").Services> | import("../../.pikku/pikku-types.gen.js").PikkuFunction<{
8
8
  rpcName: string;
9
9
  data?: unknown;
10
- }, unknown, "session" | "rpc", import("../../types/application-types.js").Services>, undefined, undefined>;
10
+ }, unknown, "rpc" | "session", import("../../types/application-types.js").Services>, undefined, undefined>;
@@ -1,18 +1,23 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.20
2
+ * This file was generated by @pikku/cli@0.12.22
3
3
  */
4
4
  /**
5
5
  * Auto-generated remote internal RPC queue worker and HTTP endpoint
6
6
  * Do not edit manually - regenerate with 'npx pikku'
7
7
  */
8
- import { pikkuSessionlessFunc, wireHTTP } from '../../.pikku/pikku-types.gen.js';
8
+ import { pikkuSessionlessFunc, wireHTTP, wireQueueWorker } from '../../.pikku/pikku-types.gen.js';
9
9
  import { pikkuRemoteAuthMiddleware } from '@pikku/core/middleware';
10
10
  export const remoteRPCHandler = pikkuSessionlessFunc({
11
+ tags: ['pikku'],
11
12
  func: async (_services, { rpcName, data }, { rpc }) => {
12
13
  return await rpc.invoke(rpcName, data);
13
14
  },
14
15
  remote: true,
15
16
  });
17
+ wireQueueWorker({
18
+ name: 'pikku-remote-internal-rpc',
19
+ func: remoteRPCHandler,
20
+ });
16
21
  wireHTTP({
17
22
  route: '/remote/rpc/:rpcName',
18
23
  method: 'post',
@@ -4,37 +4,37 @@ export declare const workflowStarter: import("../../.pikku/pikku-types.gen.js").
4
4
  data?: unknown;
5
5
  }, {
6
6
  runId: string;
7
- }, "session" | "rpc", import("../../.pikku/pikku-types.gen.js").PikkuFunctionSessionless<{
7
+ }, "rpc" | "session", import("../../.pikku/pikku-types.gen.js").PikkuFunctionSessionless<{
8
8
  workflowName: string;
9
9
  data?: unknown;
10
10
  }, {
11
11
  runId: string;
12
- }, "session" | "rpc", import("../../types/application-types.js").Services> | import("../../.pikku/pikku-types.gen.js").PikkuFunction<{
12
+ }, "rpc" | "session", import("../../types/application-types.js").Services> | import("../../.pikku/pikku-types.gen.js").PikkuFunction<{
13
13
  workflowName: string;
14
14
  data?: unknown;
15
15
  }, {
16
16
  runId: string;
17
- }, "session" | "rpc", import("../../types/application-types.js").Services>, undefined, undefined>;
17
+ }, "rpc" | "session", import("../../types/application-types.js").Services>, undefined, undefined>;
18
18
  export declare const workflowRunner: import("../../.pikku/pikku-types.gen.js").PikkuFunctionConfig<{
19
19
  workflowName: string;
20
20
  data?: unknown;
21
- }, unknown, "session" | "rpc", import("../../.pikku/pikku-types.gen.js").PikkuFunctionSessionless<{
21
+ }, unknown, "rpc" | "session", import("../../.pikku/pikku-types.gen.js").PikkuFunctionSessionless<{
22
22
  workflowName: string;
23
23
  data?: unknown;
24
- }, unknown, "session" | "rpc", import("../../types/application-types.js").Services> | import("../../.pikku/pikku-types.gen.js").PikkuFunction<{
24
+ }, unknown, "rpc" | "session", import("../../types/application-types.js").Services> | import("../../.pikku/pikku-types.gen.js").PikkuFunction<{
25
25
  workflowName: string;
26
26
  data?: unknown;
27
- }, unknown, "session" | "rpc", import("../../types/application-types.js").Services>, undefined, undefined>;
27
+ }, unknown, "rpc" | "session", import("../../types/application-types.js").Services>, undefined, undefined>;
28
28
  export declare const workflowStatusChecker: import("../../.pikku/pikku-types.gen.js").PikkuFunctionConfig<{
29
29
  workflowName: string;
30
30
  runId: string;
31
- }, WorkflowRunStatus, "session" | "rpc", import("../../.pikku/pikku-types.gen.js").PikkuFunctionSessionless<{
31
+ }, WorkflowRunStatus, "rpc" | "session", import("../../.pikku/pikku-types.gen.js").PikkuFunctionSessionless<{
32
32
  workflowName: string;
33
33
  runId: string;
34
- }, WorkflowRunStatus, "session" | "rpc", import("../../types/application-types.js").Services> | import("../../.pikku/pikku-types.gen.js").PikkuFunction<{
34
+ }, WorkflowRunStatus, "rpc" | "session", import("../../types/application-types.js").Services> | import("../../.pikku/pikku-types.gen.js").PikkuFunction<{
35
35
  workflowName: string;
36
36
  runId: string;
37
- }, WorkflowRunStatus, "session" | "rpc", import("../../types/application-types.js").Services>, undefined, undefined>;
37
+ }, WorkflowRunStatus, "rpc" | "session", import("../../types/application-types.js").Services>, undefined, undefined>;
38
38
  /**
39
39
  * Minimal workflow status stream — sends step names and statuses only.
40
40
  * Use this for user-facing frontends where internal details should not be exposed.
@@ -42,13 +42,13 @@ export declare const workflowStatusChecker: import("../../.pikku/pikku-types.gen
42
42
  export declare const workflowStatusStream: import("../../.pikku/pikku-types.gen.js").PikkuFunctionConfig<{
43
43
  workflowName: string;
44
44
  runId: string;
45
- }, unknown, "session" | "rpc", import("../../.pikku/pikku-types.gen.js").PikkuFunctionSessionless<{
45
+ }, unknown, "rpc" | "session", import("../../.pikku/pikku-types.gen.js").PikkuFunctionSessionless<{
46
46
  workflowName: string;
47
47
  runId: string;
48
- }, unknown, "session" | "rpc", import("../../types/application-types.js").Services> | import("../../.pikku/pikku-types.gen.js").PikkuFunction<{
48
+ }, unknown, "rpc" | "session", import("../../types/application-types.js").Services> | import("../../.pikku/pikku-types.gen.js").PikkuFunction<{
49
49
  workflowName: string;
50
50
  runId: string;
51
- }, unknown, "session" | "rpc", import("../../types/application-types.js").Services>, undefined, undefined>;
51
+ }, unknown, "rpc" | "session", import("../../types/application-types.js").Services>, undefined, undefined>;
52
52
  /**
53
53
  * Full workflow status stream — includes output, error, and child run IDs.
54
54
  * Use this for admin consoles and internal tooling.
@@ -56,29 +56,29 @@ export declare const workflowStatusStream: import("../../.pikku/pikku-types.gen.
56
56
  export declare const workflowStatusStreamFull: import("../../.pikku/pikku-types.gen.js").PikkuFunctionConfig<{
57
57
  workflowName: string;
58
58
  runId: string;
59
- }, unknown, "session" | "rpc", import("../../.pikku/pikku-types.gen.js").PikkuFunctionSessionless<{
59
+ }, unknown, "rpc" | "session", import("../../.pikku/pikku-types.gen.js").PikkuFunctionSessionless<{
60
60
  workflowName: string;
61
61
  runId: string;
62
- }, unknown, "session" | "rpc", import("../../types/application-types.js").Services> | import("../../.pikku/pikku-types.gen.js").PikkuFunction<{
62
+ }, unknown, "rpc" | "session", import("../../types/application-types.js").Services> | import("../../.pikku/pikku-types.gen.js").PikkuFunction<{
63
63
  workflowName: string;
64
64
  runId: string;
65
- }, unknown, "session" | "rpc", import("../../types/application-types.js").Services>, undefined, undefined>;
65
+ }, unknown, "rpc" | "session", import("../../types/application-types.js").Services>, undefined, undefined>;
66
66
  export declare const graphStarter: import("../../.pikku/pikku-types.gen.js").PikkuFunctionConfig<{
67
67
  workflowName: string;
68
68
  nodeId: string;
69
69
  data?: unknown;
70
70
  }, {
71
71
  runId: string;
72
- }, "session" | "rpc", import("../../.pikku/pikku-types.gen.js").PikkuFunctionSessionless<{
72
+ }, "rpc" | "session", import("../../.pikku/pikku-types.gen.js").PikkuFunctionSessionless<{
73
73
  workflowName: string;
74
74
  nodeId: string;
75
75
  data?: unknown;
76
76
  }, {
77
77
  runId: string;
78
- }, "session" | "rpc", import("../../types/application-types.js").Services> | import("../../.pikku/pikku-types.gen.js").PikkuFunction<{
78
+ }, "rpc" | "session", import("../../types/application-types.js").Services> | import("../../.pikku/pikku-types.gen.js").PikkuFunction<{
79
79
  workflowName: string;
80
80
  nodeId: string;
81
81
  data?: unknown;
82
82
  }, {
83
83
  runId: string;
84
- }, "session" | "rpc", import("../../types/application-types.js").Services>, undefined, undefined>;
84
+ }, "rpc" | "session", import("../../types/application-types.js").Services>, undefined, undefined>;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.20
2
+ * This file was generated by @pikku/cli@0.12.21
3
3
  */
4
4
  /**
5
5
  * Workflow HTTP catch-all routes
@@ -50,6 +50,7 @@ export const workflowStatusStream = pikkuSessionlessFunc({
50
50
  return;
51
51
  const terminalStatuses = new Set(['completed', 'failed', 'cancelled']);
52
52
  let lastHash = '';
53
+ let initSent = false;
53
54
  const poll = async () => {
54
55
  const run = await workflowRunService.getRun(runId);
55
56
  if (!run) {
@@ -57,6 +58,21 @@ export const workflowStatusStream = pikkuSessionlessFunc({
57
58
  return false;
58
59
  }
59
60
  const steps = await workflowRunService.getRunSteps(runId);
61
+ if (!initSent && run.deterministic) {
62
+ const statusByStep = new Map(steps.map((s) => [
63
+ s.stepName,
64
+ s.status,
65
+ ]));
66
+ channel.send({
67
+ type: 'init',
68
+ deterministic: true,
69
+ steps: (run.plannedSteps ?? []).map((s) => ({
70
+ stepName: s.stepName,
71
+ status: statusByStep.get(s.stepName) ?? 'pending',
72
+ })),
73
+ });
74
+ initSent = true;
75
+ }
60
76
  const hash = JSON.stringify({
61
77
  s: run.status,
62
78
  steps: steps.map((s) => [s.stepName, s.status]),
@@ -105,6 +121,7 @@ export const workflowStatusStreamFull = pikkuSessionlessFunc({
105
121
  return;
106
122
  const terminalStatuses = new Set(['completed', 'failed', 'cancelled']);
107
123
  let lastHash = '';
124
+ let initSent = false;
108
125
  const poll = async () => {
109
126
  const run = await workflowRunService.getRun(runId);
110
127
  if (!run) {
@@ -112,6 +129,21 @@ export const workflowStatusStreamFull = pikkuSessionlessFunc({
112
129
  return false;
113
130
  }
114
131
  const steps = await workflowRunService.getRunSteps(runId);
132
+ if (!initSent && run.deterministic) {
133
+ const statusByStep = new Map(steps.map((s) => [
134
+ s.stepName,
135
+ s.status,
136
+ ]));
137
+ channel.send({
138
+ type: 'init',
139
+ deterministic: true,
140
+ steps: (run.plannedSteps ?? []).map((s) => ({
141
+ stepName: s.stepName,
142
+ status: statusByStep.get(s.stepName) ?? 'pending',
143
+ })),
144
+ });
145
+ initSent = true;
146
+ }
115
147
  const hash = JSON.stringify({
116
148
  s: run.status,
117
149
  o: run.output,
@@ -1,29 +1,48 @@
1
1
  import type { Logger } from '@pikku/core/services';
2
2
  import { LogLevel } from '@pikku/core/services';
3
3
  import type { ErrorCode } from '@pikku/inspector';
4
+ export type CLIOutputMode = 'text' | 'json';
4
5
  export declare class CLILogger implements Logger {
5
6
  private silent;
6
7
  private level;
7
8
  private criticalErrors;
9
+ private outputMode;
10
+ private jsonFlushHookRegistered;
8
11
  constructor({ logLogo, silent, }: {
9
12
  logLogo: boolean;
10
13
  silent?: boolean;
11
14
  });
12
15
  setLevel(level: LogLevel): void;
13
16
  setSilent(silent: boolean): void;
17
+ setOutputMode(mode: CLIOutputMode): void;
18
+ getOutputMode(): CLIOutputMode;
14
19
  isSilent(): boolean;
20
+ private normalizeMessage;
21
+ private writeJSONLine;
22
+ private ensureJSONFlushHook;
23
+ flushJSONBuffer(): void;
24
+ private emit;
15
25
  info(message: string | {
16
26
  message: string;
17
27
  type?: string;
28
+ data?: Record<string, unknown>;
29
+ }): void;
30
+ error(message: string | Error | {
31
+ message: string;
32
+ type?: string;
33
+ data?: Record<string, unknown>;
34
+ }): void;
35
+ warn(message: string | {
36
+ message: string;
37
+ type?: string;
38
+ data?: Record<string, unknown>;
18
39
  }): void;
19
- error(message: string): void;
20
- warn(message: string): void;
21
40
  debug(message: string | {
22
41
  message: string;
23
42
  type?: string;
43
+ data?: Record<string, unknown>;
24
44
  }): void;
25
45
  critical(code: ErrorCode, message: string): void;
26
46
  hasCriticalErrors(): boolean;
27
47
  logLogo(): void;
28
- private primary;
29
48
  }