@pikku/cli 0.12.136 → 0.12.141

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 (297) hide show
  1. package/CHANGELOG.md +117 -0
  2. package/console-app/assets/{abnfDiagram-N423BO3Z-W1UI4BWy.js → abnfDiagram-N423BO3Z-CG60mMUd.js} +1 -1
  3. package/console-app/assets/architecture-TIHT7OUA-DSzfLiV3.js +1 -0
  4. package/console-app/assets/{architectureDiagram-T3A2C74G-Dgnhu9J8.js → architectureDiagram-T3A2C74G-Ch6qWsLf.js} +1 -1
  5. package/console-app/assets/{blockDiagram-VBNYF7ZC-Da-H9pFU.js → blockDiagram-VBNYF7ZC-yRgqjgqW.js} +1 -1
  6. package/console-app/assets/{c4Diagram-5PPSVZJV-CPQ006DM.js → c4Diagram-5PPSVZJV-NvawOgnU.js} +1 -1
  7. package/console-app/assets/channel-DYUdcfEK.js +1 -0
  8. package/console-app/assets/{chunk-2GRJ4B5K-B3QE8g_6.js → chunk-2GRJ4B5K-BJ9-Roz7.js} +1 -1
  9. package/console-app/assets/{chunk-4I5QYGJK-D04DssN0.js → chunk-4I5QYGJK-DZwmcj48.js} +1 -1
  10. package/console-app/assets/{chunk-5RXB4S5H-CXe_vAKZ.js → chunk-5RXB4S5H-BTBwIEIt.js} +1 -1
  11. package/console-app/assets/{chunk-6Q2QTUOP-DhpMC5UR.js → chunk-6Q2QTUOP-C55aqlA-.js} +1 -1
  12. package/console-app/assets/{chunk-7Z6QIM7H-CtoQQGfm.js → chunk-7Z6QIM7H-DRmYZ-SZ.js} +1 -1
  13. package/console-app/assets/{chunk-GF5L2VYU-BovriS0p.js → chunk-GF5L2VYU-InZeM4Hr.js} +1 -1
  14. package/console-app/assets/{chunk-I66GZJ75-Goasace2.js → chunk-I66GZJ75-BNvijc65.js} +1 -1
  15. package/console-app/assets/{chunk-JQJVKLGR-Dy3HStoh.js → chunk-JQJVKLGR-CIMXqmif.js} +1 -1
  16. package/console-app/assets/{chunk-KBJHAD2P-Cm5EwbeQ.js → chunk-KBJHAD2P-C9h3FBoE.js} +1 -1
  17. package/console-app/assets/{chunk-NSK5VX7P-DZ-VVQUA.js → chunk-NSK5VX7P-lz8xBTRo.js} +1 -1
  18. package/console-app/assets/{chunk-QR6OTTB3-W5GRG-wW.js → chunk-QR6OTTB3-CjOfjLMq.js} +1 -1
  19. package/console-app/assets/{chunk-RYQCIY6F-_xvZ8Hx8.js → chunk-RYQCIY6F-CV3667Qm.js} +1 -1
  20. package/console-app/assets/{chunk-UBXNYLIW-C0L1Tpxq.js → chunk-UBXNYLIW-CBN7usxw.js} +1 -1
  21. package/console-app/assets/{chunk-W5SLKNZC-DAyLbBQq.js → chunk-W5SLKNZC-5TkpffRm.js} +1 -1
  22. package/console-app/assets/{chunk-WRU74C26-BrL4inwu.js → chunk-WRU74C26-GBek0Nby.js} +1 -1
  23. package/console-app/assets/chunk-XXDRQBXY-B3U_w_pW.js +1 -0
  24. package/console-app/assets/classDiagram-JCYQIIEL-Mg8_8GSE.js +1 -0
  25. package/console-app/assets/classDiagram-v2-OCEON4UE-Mg8_8GSE.js +1 -0
  26. package/console-app/assets/{cose-bilkent-JH36ORCC-DxHzzMQL.js → cose-bilkent-JH36ORCC-BkGyb7Kn.js} +1 -1
  27. package/console-app/assets/{cynefin-VYW2F7L2-7ytt-CDO.js → cynefin-VYW2F7L2-qMmeyMja.js} +1 -1
  28. package/console-app/assets/{cynefinDiagram-MW4NZA55-Cq-zIV7s.js → cynefinDiagram-MW4NZA55-7MuIYiO4.js} +1 -1
  29. package/console-app/assets/{dagre-Dl-9JF5i.js → dagre-BbESpUs5.js} +1 -1
  30. package/console-app/assets/{dagre-VZM6K2ZE-DLlanPb9.js → dagre-VZM6K2ZE-I6YsMazW.js} +1 -1
  31. package/console-app/assets/{diagram-7IWD3JNH-NTCRs_uw.js → diagram-7IWD3JNH-CJPB2T6d.js} +1 -1
  32. package/console-app/assets/{diagram-B4RE2ZJO-Dwf7hoRU.js → diagram-B4RE2ZJO-CmFGMFPx.js} +1 -1
  33. package/console-app/assets/{diagram-LBJQPF4R-2h_a7jsr.js → diagram-LBJQPF4R-BMzRMe8g.js} +1 -1
  34. package/console-app/assets/{diagram-Q27KOJAE-DuOfl1WJ.js → diagram-Q27KOJAE-CeJb7xQ2.js} +1 -1
  35. package/console-app/assets/{diagram-UB23O5K3-Blp2hikL.js → diagram-UB23O5K3-BQkhJgYU.js} +1 -1
  36. package/console-app/assets/{ebnfDiagram-BXEA7PRR-BwdeYz2Z.js → ebnfDiagram-BXEA7PRR-C1F_8089.js} +1 -1
  37. package/console-app/assets/{erDiagram-JOGREHBK-DY_x1XSg.js → erDiagram-JOGREHBK-DRwpdW4v.js} +1 -1
  38. package/console-app/assets/eventmodeling-45OFAUF4-C5L7A6YY.js +1 -0
  39. package/console-app/assets/flowDiagram-UKHOOZJN-D6GmsM3x.js +1 -0
  40. package/console-app/assets/{ganttDiagram-PKOTCBZU-DxiIwMWB.js → ganttDiagram-PKOTCBZU-CfsGz3Lj.js} +1 -1
  41. package/console-app/assets/{gitGraph-TEB2WS4Q-C3DsIpZV.js → gitGraph-TEB2WS4Q-BBt9AGD3.js} +1 -1
  42. package/console-app/assets/{gitGraphDiagram-DS77QQ5N-C2pPy08m.js → gitGraphDiagram-DS77QQ5N-y5WPOR-G.js} +1 -1
  43. package/console-app/assets/{index-D6aBqNnO.js → index-BmvyL35Z.js} +150 -150
  44. package/console-app/assets/{info-DKCQHKI2-FJuVYZ8D.js → info-DKCQHKI2-mYDlDDyA.js} +1 -1
  45. package/console-app/assets/{infoDiagram-6WML65LV-Bih5T82B.js → infoDiagram-6WML65LV-uOP7AjEu.js} +1 -1
  46. package/console-app/assets/{ishikawaDiagram-WSZJBQD7-jOkuIgMl.js → ishikawaDiagram-WSZJBQD7-BUMKV94t.js} +1 -1
  47. package/console-app/assets/{journeyDiagram-NVQOT4AX-CZ9yVscx.js → journeyDiagram-NVQOT4AX-C8_km86P.js} +1 -1
  48. package/console-app/assets/{kanban-definition-27J2QSJJ-Dpmgfv5c.js → kanban-definition-27J2QSJJ-Ce5oUBPR.js} +1 -1
  49. package/console-app/assets/{line-DjmQl1gv.js → line-D-6c8Gxs.js} +1 -1
  50. package/console-app/assets/{linear-B8fAzric.js → linear-CyrGkJOO.js} +1 -1
  51. package/console-app/assets/{mermaid-parser.core-BxoecV24.js → mermaid-parser.core-CYuFKArA.js} +3 -3
  52. package/console-app/assets/{mermaid.core-D2Ux-Rs7.js → mermaid.core-CXQhu3yO.js} +4 -4
  53. package/console-app/assets/{mindmap-definition-FAOFIHXS-5xpWfvPY.js → mindmap-definition-FAOFIHXS-CTMHna5d.js} +1 -1
  54. package/console-app/assets/{packet-7NZHBO7P-Bq9JPqWg.js → packet-7NZHBO7P-Bu7Wxek6.js} +1 -1
  55. package/console-app/assets/{pegDiagram-VL7TDLO6-BKWLK1GI.js → pegDiagram-VL7TDLO6-CQOikBgW.js} +1 -1
  56. package/console-app/assets/{pie-RZYD4A2V-CsGG-f-c.js → pie-RZYD4A2V-Co7qIvyZ.js} +1 -1
  57. package/console-app/assets/{pieDiagram-7S7Q4E2Y-BRy6lUc2.js → pieDiagram-7S7Q4E2Y-Dh6jYgnj.js} +1 -1
  58. package/console-app/assets/{quadrantDiagram-CIZ2JOQS-OcYHZLLg.js → quadrantDiagram-CIZ2JOQS-Boongjy-.js} +1 -1
  59. package/console-app/assets/{radar-I7S5WNFK-8MO05jdC.js → radar-I7S5WNFK-CSJyAKYA.js} +1 -1
  60. package/console-app/assets/{railroad-3IZDKUUU-CLs1yR0q.js → railroad-3IZDKUUU-DklknXem.js} +1 -1
  61. package/console-app/assets/railroad-abnf-AHOZXSZD-D-2EAJOD.js +1 -0
  62. package/console-app/assets/railroad-ebnf-EBAXGLYW-C5XxxCx7.js +1 -0
  63. package/console-app/assets/railroad-peg-LSFZ7HO6-D8fXoMuX.js +1 -0
  64. package/console-app/assets/{railroadDiagram-AXF67PYL-DjpHDwhw.js → railroadDiagram-AXF67PYL-DEapZRM_.js} +1 -1
  65. package/console-app/assets/{requirementDiagram-LRYGKXZP-CyKaqOMR.js → requirementDiagram-LRYGKXZP-CqFLtnyL.js} +1 -1
  66. package/console-app/assets/{sankeyDiagram-W5VNT64P-0WoWlmdY.js → sankeyDiagram-W5VNT64P-CNu-G1MH.js} +1 -1
  67. package/console-app/assets/{sequenceDiagram-SI44F4Z6-kd31YoP4.js → sequenceDiagram-SI44F4Z6-CoEKUR3G.js} +1 -1
  68. package/console-app/assets/{src-CGPyCqg2.js → src-C1UIZ0TF.js} +1 -1
  69. package/console-app/assets/{stateDiagram-OKZ733FA-Cwy-Xwqp.js → stateDiagram-OKZ733FA-CJka40EH.js} +1 -1
  70. package/console-app/assets/stateDiagram-v2-UEYNNEHI-Bfuo66an.js +1 -0
  71. package/console-app/assets/{swimlanes-SLNWSIFB-Cq0Pq-Qq.js → swimlanes-SLNWSIFB-Dv3MGmvW.js} +1 -1
  72. package/console-app/assets/swimlanesDiagram-ULZ7WXOC-CyQmsXKP.js +8 -0
  73. package/console-app/assets/{timeline-definition-Z64GVDOM-CgFH2I_j.js → timeline-definition-Z64GVDOM-CO8etJHi.js} +1 -1
  74. package/console-app/assets/{treeView-QDETBFTQ-CmeHYUxi.js → treeView-QDETBFTQ-BjLcvY-V.js} +1 -1
  75. package/console-app/assets/{treemap-6X3UGDF4-B6JWxyQe.js → treemap-6X3UGDF4-xC9XqGfS.js} +1 -1
  76. package/console-app/assets/{vennDiagram-T6HMQDX7-DdGYpKcz.js → vennDiagram-T6HMQDX7-CJGsYvlQ.js} +1 -1
  77. package/console-app/assets/{wardley-OPB4EBWU-BVF8AOCQ.js → wardley-OPB4EBWU-DkMc876g.js} +1 -1
  78. package/console-app/assets/{wardleyDiagram-T6FBY63Y-BUFon1WP.js → wardleyDiagram-T6FBY63Y-CTe7zAVZ.js} +1 -1
  79. package/console-app/assets/{xychartDiagram-ELKLHX3M-Bu-WJdeF.js → xychartDiagram-ELKLHX3M-CABg-MLE.js} +1 -1
  80. package/console-app/index.html +1 -1
  81. package/dist/.pikku/addon/index.d.ts +1 -1
  82. package/dist/.pikku/addon/index.js +1 -1
  83. package/dist/.pikku/addon/pikku-addon-types.gen.d.ts +1 -1
  84. package/dist/.pikku/addon/pikku-addon-types.gen.js +1 -1
  85. package/dist/.pikku/agent/index.d.ts +1 -1
  86. package/dist/.pikku/agent/index.js +1 -1
  87. package/dist/.pikku/agent/pikku-agent-types.gen.d.ts +1 -1
  88. package/dist/.pikku/agent/pikku-model-aliases.gen.js +1 -1
  89. package/dist/.pikku/auth/index.d.ts +1 -1
  90. package/dist/.pikku/auth/index.js +1 -1
  91. package/dist/.pikku/auth/pikku-auth-types.gen.d.ts +1 -1
  92. package/dist/.pikku/auth/pikku-auth-types.gen.js +1 -1
  93. package/dist/.pikku/channel/index.d.ts +1 -1
  94. package/dist/.pikku/channel/index.js +1 -1
  95. package/dist/.pikku/channel/pikku-channel-types.gen.d.ts +1 -1
  96. package/dist/.pikku/channel/pikku-channel-types.gen.js +1 -1
  97. package/dist/.pikku/cli/index.d.ts +1 -1
  98. package/dist/.pikku/cli/index.js +1 -1
  99. package/dist/.pikku/cli/pikku-cli-channel.js +11 -1
  100. package/dist/.pikku/cli/pikku-cli-client.gen.d.ts +1 -1
  101. package/dist/.pikku/cli/pikku-cli-client.gen.js +1 -1
  102. package/dist/.pikku/cli/pikku-cli-contracts-meta.gen.d.ts +1 -1
  103. package/dist/.pikku/cli/pikku-cli-contracts-meta.gen.js +1 -1
  104. package/dist/.pikku/cli/pikku-cli-contracts-meta.gen.json +11 -0
  105. package/dist/.pikku/cli/pikku-cli-types.gen.d.ts +1 -1
  106. package/dist/.pikku/cli/pikku-cli-types.gen.js +1 -1
  107. package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.js +1 -1
  108. package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.json +24 -0
  109. package/dist/.pikku/cli/pikku-cli-wirings.gen.d.ts +1 -1
  110. package/dist/.pikku/cli/pikku-cli-wirings.gen.js +1 -1
  111. package/dist/.pikku/cli/pikku-cli.gen.d.ts +1 -1
  112. package/dist/.pikku/cli/pikku-cli.gen.js +1 -1
  113. package/dist/.pikku/error/index.d.ts +1 -1
  114. package/dist/.pikku/error/index.js +1 -1
  115. package/dist/.pikku/error/pikku-error-types.gen.d.ts +1 -1
  116. package/dist/.pikku/error/pikku-error-types.gen.js +1 -1
  117. package/dist/.pikku/function/index.d.ts +1 -1
  118. package/dist/.pikku/function/index.js +1 -1
  119. package/dist/.pikku/function/pikku-function-types.gen.d.ts +1 -1
  120. package/dist/.pikku/function/pikku-function-types.gen.js +1 -1
  121. package/dist/.pikku/function/pikku-functions-meta.gen.js +1 -1
  122. package/dist/.pikku/function/pikku-functions-meta.gen.json +75 -87
  123. package/dist/.pikku/function/pikku-functions.gen.js +3 -1
  124. package/dist/.pikku/gateway/index.d.ts +1 -1
  125. package/dist/.pikku/gateway/index.js +1 -1
  126. package/dist/.pikku/gateway/pikku-gateway-types.gen.d.ts +1 -1
  127. package/dist/.pikku/gateway/pikku-gateway-types.gen.js +1 -1
  128. package/dist/.pikku/http/index.d.ts +1 -1
  129. package/dist/.pikku/http/index.js +1 -1
  130. package/dist/.pikku/http/pikku-http-types.gen.d.ts +1 -1
  131. package/dist/.pikku/http/pikku-http-types.gen.js +1 -1
  132. package/dist/.pikku/mcp/index.d.ts +1 -1
  133. package/dist/.pikku/mcp/index.js +1 -1
  134. package/dist/.pikku/mcp/pikku-mcp-types.gen.d.ts +1 -1
  135. package/dist/.pikku/mcp/pikku-mcp-types.gen.js +1 -1
  136. package/dist/.pikku/middleware/index.d.ts +1 -1
  137. package/dist/.pikku/middleware/index.js +1 -1
  138. package/dist/.pikku/middleware/pikku-middleware-types.gen.d.ts +1 -1
  139. package/dist/.pikku/middleware/pikku-middleware-types.gen.js +1 -1
  140. package/dist/.pikku/pikku-bootstrap-scenarios.gen.d.ts +1 -1
  141. package/dist/.pikku/pikku-bootstrap-scenarios.gen.js +1 -1
  142. package/dist/.pikku/pikku-bootstrap.gen.d.ts +1 -1
  143. package/dist/.pikku/pikku-bootstrap.gen.js +1 -1
  144. package/dist/.pikku/pikku-services.gen.d.ts +1 -1
  145. package/dist/.pikku/queue/index.d.ts +1 -1
  146. package/dist/.pikku/queue/index.js +1 -1
  147. package/dist/.pikku/queue/pikku-queue-types.gen.d.ts +1 -1
  148. package/dist/.pikku/queue/pikku-queue-types.gen.js +1 -1
  149. package/dist/.pikku/queue/pikku-queue-workers-wirings-meta.gen.js +1 -1
  150. package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.d.ts +1 -1
  151. package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.js +1 -1
  152. package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.js +1 -1
  153. package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.json +3 -3
  154. package/dist/.pikku/scenarios/index.d.ts +1 -1
  155. package/dist/.pikku/scenarios/index.js +1 -1
  156. package/dist/.pikku/scenarios/pikku-personas.gen.js +1 -1
  157. package/dist/.pikku/scenarios/pikku-scenario-functions-meta.gen.js +1 -1
  158. package/dist/.pikku/scenarios/pikku-scenario-functions.gen.d.ts +1 -1
  159. package/dist/.pikku/scenarios/pikku-scenario-types.gen.d.ts +1 -1
  160. package/dist/.pikku/scenarios/pikku-scenario-wirings-meta.gen.js +1 -1
  161. package/dist/.pikku/scenarios/pikku-scenario-wirings.gen.d.ts +1 -1
  162. package/dist/.pikku/scenarios/schemas/register.gen.d.ts +1 -1
  163. package/dist/.pikku/scenarios/schemas/register.gen.js +1 -1
  164. package/dist/.pikku/scheduler/index.d.ts +1 -1
  165. package/dist/.pikku/scheduler/index.js +1 -1
  166. package/dist/.pikku/scheduler/pikku-scheduler-types.gen.d.ts +1 -1
  167. package/dist/.pikku/scheduler/pikku-scheduler-types.gen.js +1 -1
  168. package/dist/.pikku/schemas/register.gen.js +7 -5
  169. package/dist/.pikku/schemas/schemas/FabricLinkInput.schema.json +1 -1
  170. package/dist/.pikku/schemas/schemas/KnowledgeReconcileInput.schema.json +1 -0
  171. package/dist/.pikku/schemas/schemas/KnowledgeReconcileOutput.schema.json +1 -0
  172. package/dist/.pikku/scopes/index.d.ts +1 -1
  173. package/dist/.pikku/scopes/index.js +1 -1
  174. package/dist/.pikku/scopes/pikku-personas.gen.js +1 -1
  175. package/dist/.pikku/scopes/pikku-roles.gen.d.ts +1 -1
  176. package/dist/.pikku/scopes/pikku-scope-types.gen.d.ts +1 -1
  177. package/dist/.pikku/scopes/pikku-scope-types.gen.js +1 -1
  178. package/dist/.pikku/scopes/pikku-scopes.gen.d.ts +1 -1
  179. package/dist/.pikku/secrets/index.d.ts +1 -1
  180. package/dist/.pikku/secrets/index.js +1 -1
  181. package/dist/.pikku/secrets/pikku-secret-types.gen.d.ts +1 -1
  182. package/dist/.pikku/secrets/pikku-secret-types.gen.js +1 -1
  183. package/dist/.pikku/secrets/pikku-secrets.gen.d.ts +1 -1
  184. package/dist/.pikku/secrets/pikku-secrets.gen.js +1 -1
  185. package/dist/.pikku/services/pikku-meta-service.gen.d.ts +1 -1
  186. package/dist/.pikku/services/pikku-meta-service.gen.js +1 -1
  187. package/dist/.pikku/setup/index.d.ts +1 -1
  188. package/dist/.pikku/setup/index.js +1 -1
  189. package/dist/.pikku/setup/pikku-setup-types.gen.d.ts +1 -1
  190. package/dist/.pikku/setup/pikku-setup-types.gen.js +1 -1
  191. package/dist/.pikku/trigger/index.d.ts +1 -1
  192. package/dist/.pikku/trigger/index.js +1 -1
  193. package/dist/.pikku/trigger/pikku-trigger-types.gen.d.ts +1 -1
  194. package/dist/.pikku/trigger/pikku-trigger-types.gen.js +1 -1
  195. package/dist/.pikku/variables/index.d.ts +1 -1
  196. package/dist/.pikku/variables/index.js +1 -1
  197. package/dist/.pikku/variables/pikku-variable-types.gen.d.ts +1 -1
  198. package/dist/.pikku/variables/pikku-variable-types.gen.js +1 -1
  199. package/dist/.pikku/variables/pikku-variables.gen.d.ts +1 -1
  200. package/dist/.pikku/variables/pikku-variables.gen.js +1 -1
  201. package/dist/.pikku/workflow/index.d.ts +1 -1
  202. package/dist/.pikku/workflow/index.js +1 -1
  203. package/dist/.pikku/workflow/meta/allWorkflow.gen.json +8 -2
  204. package/dist/.pikku/workflow/pikku-workflow-types.gen.d.ts +1 -1
  205. package/dist/.pikku/workflow/pikku-workflow-types.gen.js +1 -1
  206. package/dist/.pikku/workflow/pikku-workflow-wirings-meta.gen.js +1 -1
  207. package/dist/.pikku/workflow/pikku-workflow-wirings.gen.js +1 -1
  208. package/dist/bin/pikku-bin.mjs +2 -2
  209. package/dist/src/cli.wiring.js +11 -1
  210. package/dist/src/deploy/build-pipeline.js +2 -0
  211. package/dist/src/deploy/bundler/bun-bundler.js +5 -2
  212. package/dist/src/deploy/bundler/bundler.interface.d.ts +9 -1
  213. package/dist/src/deploy/bundler/bundler.js +1 -0
  214. package/dist/src/deploy/bundler/node-bundler.js +12 -2
  215. package/dist/src/deploy/bundler/service-module-map.js +2 -2
  216. package/dist/src/fabric/fabric-commands.d.ts +18 -9
  217. package/dist/src/fabric/fabric-commands.js +11 -0
  218. package/dist/src/fabric/functions/deploy.function.d.ts +5 -5
  219. package/dist/src/fabric/functions/link.function.d.ts +12 -0
  220. package/dist/src/fabric/functions/link.function.js +95 -6
  221. package/dist/src/fabric/functions/llm-key.function.d.ts +4 -4
  222. package/dist/src/fabric/functions/smoke.function.d.ts +4 -4
  223. package/dist/src/fabric/lib/git.d.ts +27 -0
  224. package/dist/src/fabric/lib/git.js +70 -2
  225. package/dist/src/functions/commands/db-export.js +4 -9
  226. package/dist/src/functions/commands/enable.d.ts +1 -0
  227. package/dist/src/functions/commands/enable.js +3 -0
  228. package/dist/src/functions/commands/knowledge-reconcile.d.ts +45 -0
  229. package/dist/src/functions/commands/knowledge-reconcile.js +11 -0
  230. package/dist/src/functions/db/local-db.d.ts +12 -2
  231. package/dist/src/functions/db/local-db.js +71 -13
  232. package/dist/src/functions/knowledge/render.d.ts +12 -1
  233. package/dist/src/functions/knowledge/render.js +48 -0
  234. package/dist/src/functions/knowledge/schemas.d.ts +23 -0
  235. package/dist/src/functions/knowledge/schemas.js +3 -1
  236. package/dist/src/functions/wirings/agent/pikku-command-agent.js +11 -14
  237. package/dist/src/functions/wirings/channels/pikku-command-channels.js +10 -13
  238. package/dist/src/functions/wirings/cli/pikku-command-cli.js +10 -13
  239. package/dist/src/functions/wirings/console/pikku-command-nodes-meta.js +7 -15
  240. package/dist/src/functions/wirings/credentials/serialize-credentials-types.js +2 -8
  241. package/dist/src/functions/wirings/functions/pikku-command-functions.js +21 -18
  242. package/dist/src/functions/wirings/gateway/pikku-command-gateway.js +11 -10
  243. package/dist/src/functions/wirings/http/pikku-command-http-routes.js +10 -13
  244. package/dist/src/functions/wirings/mcp/pikku-command-mcp.js +11 -17
  245. package/dist/src/functions/wirings/personas/serialize-personas-types.js +2 -2
  246. package/dist/src/functions/wirings/queue/pikku-command-queue.js +11 -14
  247. package/dist/src/functions/wirings/remote-jobs/pikku-command-remote-jobs.d.ts +1 -0
  248. package/dist/src/functions/wirings/remote-jobs/pikku-command-remote-jobs.js +31 -0
  249. package/dist/src/functions/wirings/remote-jobs/serialize-remote-jobs.d.ts +16 -0
  250. package/dist/src/functions/wirings/remote-jobs/serialize-remote-jobs.js +78 -0
  251. package/dist/src/functions/wirings/roles/serialize-roles-types.js +2 -2
  252. package/dist/src/functions/wirings/scheduler/pikku-command-scheduler.js +11 -12
  253. package/dist/src/functions/wirings/scopes/serialize-scopes-client.js +2 -2
  254. package/dist/src/functions/wirings/scopes/serialize-scopes-types.js +5 -3
  255. package/dist/src/functions/wirings/secrets/serialize-secrets-types.js +4 -10
  256. package/dist/src/functions/wirings/triggers/pikku-command-trigger.js +11 -11
  257. package/dist/src/functions/wirings/variables/serialize-variables-types.js +2 -8
  258. package/dist/src/functions/wirings/workflow/pikku-command-workflow.js +7 -8
  259. package/dist/src/functions/workflows/all.workflow.js +8 -0
  260. package/dist/src/services.js +23 -0
  261. package/dist/src/utils/pikku-cli-config.js +4 -0
  262. package/dist/src/utils/remote-jobs-schemas-file.d.ts +6 -0
  263. package/dist/src/utils/remote-jobs-schemas-file.js +9 -0
  264. package/dist/src/utils/remove-legacy-scaffold-file.js +3 -0
  265. package/dist/src/utils/strip-verbose-meta.d.ts +9 -10
  266. package/dist/src/utils/strip-verbose-meta.js +15 -19
  267. package/dist/src/utils/ts-literal.d.ts +7 -0
  268. package/dist/src/utils/ts-literal.js +7 -0
  269. package/dist/src/utils/write-wiring-meta.d.ts +43 -0
  270. package/dist/src/utils/write-wiring-meta.js +45 -0
  271. package/dist/tsconfig.tsbuildinfo +1 -1
  272. package/package.json +10 -10
  273. package/surface.json +15 -15
  274. package/console-app/assets/architecture-TIHT7OUA-ChuyZvLt.js +0 -1
  275. package/console-app/assets/channel-Bk5Nkkn2.js +0 -1
  276. package/console-app/assets/chunk-XXDRQBXY-CCdCi2uV.js +0 -1
  277. package/console-app/assets/classDiagram-JCYQIIEL-Dgekxp3j.js +0 -1
  278. package/console-app/assets/classDiagram-v2-OCEON4UE-Dgekxp3j.js +0 -1
  279. package/console-app/assets/eventmodeling-45OFAUF4-2ImzjrgM.js +0 -1
  280. package/console-app/assets/flowDiagram-UKHOOZJN-DmrgHe66.js +0 -1
  281. package/console-app/assets/railroad-abnf-AHOZXSZD-CA9-7Fw1.js +0 -1
  282. package/console-app/assets/railroad-ebnf-EBAXGLYW-BhkwTTAW.js +0 -1
  283. package/console-app/assets/railroad-peg-LSFZ7HO6-BEaB8UlJ.js +0 -1
  284. package/console-app/assets/stateDiagram-v2-UEYNNEHI-DExEOOCw.js +0 -1
  285. package/console-app/assets/swimlanesDiagram-ULZ7WXOC-B0RUxlCH.js +0 -8
  286. package/dist/.pikku/schemas/schemas/PikkuQueueOutput.schema.json +0 -1
  287. package/dist/src/fabric/lib/not-implemented.d.ts +0 -5
  288. package/dist/src/fabric/lib/not-implemented.js +0 -8
  289. package/dist/src/functions/wirings/channels/pikku-channels.d.ts +0 -1
  290. package/dist/src/functions/wirings/channels/pikku-channels.js +0 -38
  291. package/dist/src/functions/wirings/http/pikku-http-routes.d.ts +0 -1
  292. package/dist/src/functions/wirings/http/pikku-http-routes.js +0 -30
  293. package/dist/src/functions/wirings/queue/pikku-queue.d.ts +0 -1
  294. package/dist/src/functions/wirings/queue/pikku-queue.js +0 -31
  295. package/dist/src/utils/pikku-files-and-methods.d.ts +0 -20
  296. package/dist/src/utils/pikku-files-and-methods.js +0 -25
  297. /package/dist/.pikku/schemas/schemas/{PikkuHTTPOutput.schema.json → PikkuRemoteJobsOutput.schema.json} +0 -0
@@ -3,7 +3,7 @@ import { serializeFileImports } from '../../../utils/file-imports-serializer.js'
3
3
  import { writeFileInDir } from '../../../utils/file-writer.js';
4
4
  import { logCommandInfoAndTime } from '../../../middleware/log-command-info-and-time.js';
5
5
  import { getFileImportRelativePath } from '../../../utils/file-import-path.js';
6
- import { stripVerboseFields, hasVerboseFields, } from '../../../utils/strip-verbose-meta.js';
6
+ import { writeWiringMeta } from '../../../utils/write-wiring-meta.js';
7
7
  export const pikkuCommandHTTP = pikkuSessionlessFunc({
8
8
  func: async ({ logger, config, getInspectorState }) => {
9
9
  const visitState = await getInspectorState();
@@ -22,12 +22,6 @@ export const pikkuCommandHTTP = pikkuSessionlessFunc({
22
22
  // bootstrap importing a file that was never generated and the per-unit
23
23
  // deploy bundle fails to resolve it.
24
24
  await writeFileInDir(logger, httpWiringsFile, serializeFileImports('wireHTTP', httpWiringsFile, http.files, packageMappings));
25
- const minimalMeta = stripVerboseFields(http.meta);
26
- await writeFileInDir(logger, httpWiringMetaJsonFile, JSON.stringify(minimalMeta, null, 2));
27
- if (hasVerboseFields(http.meta)) {
28
- const verbosePath = httpWiringMetaJsonFile.replace(/\.gen\.json$/, '-verbose.gen.json');
29
- await writeFileInDir(logger, verbosePath, JSON.stringify(http.meta, null, 2));
30
- }
31
25
  await writeFileInDir(logger, httpContractsMetaJsonFile, JSON.stringify(exportedContracts.http, null, 2));
32
26
  if (hasHTTPContracts) {
33
27
  const contractsJsonImportPath = getFileImportRelativePath(httpContractsMetaFile, httpContractsMetaJsonFile, packageMappings);
@@ -37,12 +31,15 @@ export const pikkuCommandHTTP = pikkuSessionlessFunc({
37
31
  : `import contractsMeta from '${contractsJsonImportPath}'`;
38
32
  await writeFileInDir(logger, httpContractsMetaFile, `${contractsImportStatement}\nexport default contractsMeta`);
39
33
  }
40
- const jsonImportPath = getFileImportRelativePath(httpWiringMetaFile, httpWiringMetaJsonFile, packageMappings);
41
- const supportsImportAttributes = schema?.supportsImportAttributes ?? false;
42
- const importStatement = supportsImportAttributes
43
- ? `import metaData from '${jsonImportPath}' with { type: 'json' }`
44
- : `import metaData from '${jsonImportPath}'`;
45
- await writeFileInDir(logger, httpWiringMetaFile, `import { pikkuState } from '@pikku/core/state'\nimport type { HTTPWiringsMeta } from '@pikku/core/http'\n${importStatement}\npikkuState(null, 'http', 'meta', metaData as HTTPWiringsMeta)`);
34
+ await writeWiringMeta({
35
+ logger,
36
+ meta: http.meta,
37
+ metaJsonFile: httpWiringMetaJsonFile,
38
+ metaFile: httpWiringMetaFile,
39
+ packageMappings,
40
+ supportsImportAttributes: schema?.supportsImportAttributes ?? false,
41
+ serializeMetaTS: ({ importStatement }) => `import { pikkuState } from '@pikku/core/state'\nimport type { HTTPWiringsMeta } from '@pikku/core/http'\n${importStatement}\npikkuState(null, 'http', 'meta', metaData as HTTPWiringsMeta)`,
42
+ });
46
43
  return true;
47
44
  },
48
45
  middleware: [
@@ -4,8 +4,7 @@ import { writeFileInDir } from '../../../utils/file-writer.js';
4
4
  import { logCommandInfoAndTime } from '../../../middleware/log-command-info-and-time.js';
5
5
  import { readFile } from 'fs/promises';
6
6
  import { join } from 'path';
7
- import { getFileImportRelativePath } from '../../../utils/file-import-path.js';
8
- import { stripVerboseFields, hasVerboseFields, } from '../../../utils/strip-verbose-meta.js';
7
+ import { writeWiringMeta } from '../../../utils/write-wiring-meta.js';
9
8
  // Helper function to generate arguments from schema
10
9
  const generateArgumentsFromSchema = async (inputSchema, schemaDirectory, typesMap, logger) => {
11
10
  if (!inputSchema)
@@ -74,20 +73,14 @@ export const pikkuMCP = pikkuSessionlessFunc({
74
73
  toolsMeta: mcpEndpoints.toolsMeta,
75
74
  promptsMeta: promptsMetaWithArguments,
76
75
  };
77
- // Write minimal JSON (runtime-only fields)
78
- const minimalMeta = stripVerboseFields(metaData);
79
- await writeFileInDir(logger, config.mcpWiringsMetaJsonFile, JSON.stringify(minimalMeta, null, 2));
80
- // Write verbose JSON only if it has additional fields
81
- if (hasVerboseFields(metaData)) {
82
- const verbosePath = config.mcpWiringsMetaJsonFile.replace(/\.gen\.json$/, '-verbose.gen.json');
83
- await writeFileInDir(logger, verbosePath, JSON.stringify(metaData, null, 2));
84
- }
85
- const jsonImportPath = getFileImportRelativePath(mcpWiringsMetaFile, config.mcpWiringsMetaJsonFile, packageMappings);
86
- const supportsImportAttributes = schema?.supportsImportAttributes ?? false;
87
- const importStatement = supportsImportAttributes
88
- ? `import metaData from '${jsonImportPath}' with { type: 'json' }`
89
- : `import metaData from '${jsonImportPath}'`;
90
- await writeFileInDir(logger, mcpWiringsMetaFile, `import { pikkuState } from '@pikku/core/state'
76
+ await writeWiringMeta({
77
+ logger,
78
+ meta: metaData,
79
+ metaJsonFile: config.mcpWiringsMetaJsonFile,
80
+ metaFile: mcpWiringsMetaFile,
81
+ packageMappings,
82
+ supportsImportAttributes: schema?.supportsImportAttributes ?? false,
83
+ serializeMetaTS: ({ importStatement }) => `import { pikkuState } from '@pikku/core/state'
91
84
  import type {
92
85
  MCPResourceMeta,
93
86
  MCPToolMeta,
@@ -96,7 +89,8 @@ import type {
96
89
  ${importStatement}
97
90
  pikkuState(null, 'mcp', 'resourcesMeta', metaData.resourcesMeta as MCPResourceMeta)
98
91
  pikkuState(null, 'mcp', 'toolsMeta', metaData.toolsMeta as MCPToolMeta)
99
- pikkuState(null, 'mcp', 'promptsMeta', metaData.promptsMeta as MCPPromptMeta)`);
92
+ pikkuState(null, 'mcp', 'promptsMeta', metaData.promptsMeta as MCPPromptMeta)`,
93
+ });
100
94
  return true;
101
95
  },
102
96
  middleware: [
@@ -1,4 +1,4 @@
1
- const quote = (value) => `'${value.replace(/'/g, "\\'")}'`;
1
+ import { tsLiteral } from '../../../utils/ts-literal.js';
2
2
  /**
3
3
  * Generates the `PersonaId` union and a `definePersonas` whose `roles` are
4
4
  * checked against the declared system roles.
@@ -12,7 +12,7 @@ export const serializePersonasTypes = ({ rolesImportPath, environmentNames, }) =
12
12
  const environmentUnion = environmentNames.length > 0
13
13
  ? `\n${[...environmentNames]
14
14
  .sort()
15
- .map((name) => ` | ${quote(name)}`)
15
+ .map((name) => ` | ${tsLiteral(name)}`)
16
16
  .join('\n')}`
17
17
  : ' never';
18
18
  return `/**
@@ -3,8 +3,7 @@ import { serializeFileImports } from '../../../utils/file-imports-serializer.js'
3
3
  import { writeFileInDir } from '../../../utils/file-writer.js';
4
4
  import { logCommandInfoAndTime } from '../../../middleware/log-command-info-and-time.js';
5
5
  import { serializeQueueMeta, serializeQueueMetaTS, } from './serialize-queue-meta.js';
6
- import { getFileImportRelativePath } from '../../../utils/file-import-path.js';
7
- import { stripVerboseFields, hasVerboseFields, } from '../../../utils/strip-verbose-meta.js';
6
+ import { writeWiringMeta } from '../../../utils/write-wiring-meta.js';
8
7
  export const pikkuCommandQueue = pikkuSessionlessFunc({
9
8
  func: async ({ logger, config, getInspectorState }) => {
10
9
  const visitState = await getInspectorState();
@@ -23,18 +22,16 @@ export const pikkuCommandQueue = pikkuSessionlessFunc({
23
22
  return undefined;
24
23
  }
25
24
  const fullMeta = serializeQueueMeta(queueWorkers.meta);
26
- // Write minimal JSON file (runtime-only fields)
27
- const minimalMeta = stripVerboseFields(fullMeta);
28
- await writeFileInDir(logger, queueWorkersWiringMetaJsonFile, JSON.stringify(minimalMeta, null, 2));
29
- // Write verbose JSON only if it has additional fields
30
- if (hasVerboseFields(fullMeta)) {
31
- const verbosePath = queueWorkersWiringMetaJsonFile.replace(/\.gen\.json$/, '-verbose.gen.json');
32
- await writeFileInDir(logger, verbosePath, JSON.stringify(fullMeta, null, 2));
33
- }
34
- // Calculate relative path from TS file to JSON file
35
- const jsonImportPath = getFileImportRelativePath(queueWorkersWiringMetaFile, queueWorkersWiringMetaJsonFile, packageMappings);
36
- // Write TypeScript file that imports JSON
37
- await writeFileInDir(logger, queueWorkersWiringMetaFile, serializeQueueMetaTS(jsonImportPath, schema?.supportsImportAttributes ?? false));
25
+ const supportsImportAttributes = schema?.supportsImportAttributes ?? false;
26
+ await writeWiringMeta({
27
+ logger,
28
+ meta: fullMeta,
29
+ metaJsonFile: queueWorkersWiringMetaJsonFile,
30
+ metaFile: queueWorkersWiringMetaFile,
31
+ packageMappings,
32
+ supportsImportAttributes,
33
+ serializeMetaTS: ({ jsonImportPath }) => serializeQueueMetaTS(jsonImportPath, supportsImportAttributes),
34
+ });
38
35
  await writeFileInDir(logger, queueWorkersWiringFile, serializeFileImports('addQueueWorkers', queueWorkersWiringFile, queueWorkers.files, packageMappings));
39
36
  return true;
40
37
  },
@@ -0,0 +1 @@
1
+ export declare const pikkuRemoteJobs: import("#pikku/function").PikkuFunctionConfig<void, boolean, "rpc" | "session", import("#pikku/function").PikkuFunctionSessionless<void, boolean, "rpc" | "session", import("#pikku/function").WiredServices, unknown> | import("#pikku/function").PikkuFunction<void, boolean, "rpc" | "session", import("#pikku/function").WiredServices>, undefined, undefined>;
@@ -0,0 +1,31 @@
1
+ import { pikkuSessionlessFunc } from '#pikku/function';
2
+ import { getLeafImportPath } from '../../../utils/leaf-import-path.js';
3
+ import { writeFileInDir } from '../../../utils/file-writer.js';
4
+ import { logCommandInfoAndTime } from '../../../middleware/log-command-info-and-time.js';
5
+ import { removeLegacyScaffoldFile } from '../../../utils/remove-legacy-scaffold-file.js';
6
+ import { remoteJobsSchemasFile } from '../../../utils/remote-jobs-schemas-file.js';
7
+ import { serializeRemoteJobs } from './serialize-remote-jobs.js';
8
+ import { isDeployCodegen } from '../../../utils/is-deploy-codegen.js';
9
+ export const pikkuRemoteJobs = pikkuSessionlessFunc({
10
+ func: async ({ logger, config, variables }) => {
11
+ if (await isDeployCodegen(variables)) {
12
+ return false;
13
+ }
14
+ const schemasFile = remoteJobsSchemasFile(config.remoteJobsFile);
15
+ if (config.remoteJobsFile && schemasFile) {
16
+ const leaf = (name) => getLeafImportPath(config.remoteJobsFile, name, config);
17
+ const { schemas, functions } = serializeRemoteJobs(leaf);
18
+ await writeFileInDir(logger, schemasFile, schemas);
19
+ await writeFileInDir(logger, config.remoteJobsFile, functions);
20
+ await removeLegacyScaffoldFile(config.remoteJobsFile);
21
+ return true;
22
+ }
23
+ return false;
24
+ },
25
+ middleware: [
26
+ logCommandInfoAndTime({
27
+ commandStart: 'Generating Remote Jobs',
28
+ commandEnd: 'Generated Remote Jobs',
29
+ }),
30
+ ],
31
+ });
@@ -0,0 +1,16 @@
1
+ export interface RemoteJobsGenOutput {
2
+ schemas: string;
3
+ functions: string;
4
+ }
5
+ /**
6
+ * Generate the remote-jobs inbox: the HTTP routes an external dispatcher posts
7
+ * to so a runtime that holds neither a queue consumer nor a clock still runs
8
+ * its queue workers and scheduled tasks.
9
+ *
10
+ * Ordinary `wireHTTP` routes rather than runtime-level handlers, so every
11
+ * runtime serves them from one implementation, and the secret check is
12
+ * middleware a deployment can sit its own scheme in front of. The routes are
13
+ * literals rather than the constants core exports, because the inspector reads
14
+ * them statically to build the HTTP map.
15
+ */
16
+ export declare const serializeRemoteJobs: (leaf: (name: string) => string) => RemoteJobsGenOutput;
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Generate the remote-jobs inbox: the HTTP routes an external dispatcher posts
3
+ * to so a runtime that holds neither a queue consumer nor a clock still runs
4
+ * its queue workers and scheduled tasks.
5
+ *
6
+ * Ordinary `wireHTTP` routes rather than runtime-level handlers, so every
7
+ * runtime serves them from one implementation, and the secret check is
8
+ * middleware a deployment can sit its own scheme in front of. The routes are
9
+ * literals rather than the constants core exports, because the inspector reads
10
+ * them statically to build the HTTP map.
11
+ */
12
+ export const serializeRemoteJobs = (leaf) => {
13
+ const schemas = `/**
14
+ * Auto-generated remote job inbox schemas
15
+ * Do not edit manually - regenerate with 'npx pikku'
16
+ */
17
+ import { z } from 'zod'
18
+
19
+ export const RemoteQueueJob = z.object({
20
+ queueName: z.string(),
21
+ data: z.unknown().optional(),
22
+ jobId: z.string().optional(),
23
+ traceId: z.string().optional(),
24
+ })
25
+
26
+ export const RemoteScheduledJob = z.object({
27
+ taskName: z.string(),
28
+ })
29
+ `;
30
+ const functions = `/**
31
+ * Auto-generated remote job inbox
32
+ * Do not edit manually - regenerate with 'npx pikku'
33
+ */
34
+ import { pikkuSessionlessFunc } from '${leaf('function')}'
35
+ import { wireHTTP } from '${leaf('http')}'
36
+ import {
37
+ pikkuRemoteQueueJobFunc,
38
+ pikkuRemoteScheduledJobFunc,
39
+ } from '@pikku/core/services'
40
+ import { remoteJobsSecret } from '@pikku/core/middleware'
41
+ import { RemoteQueueJob, RemoteScheduledJob } from './remote-jobs.schemas.gen.js'
42
+
43
+ const runRemoteQueueJob = pikkuSessionlessFunc({
44
+ auth: false,
45
+ input: RemoteQueueJob,
46
+ tags: ['pikku'],
47
+ description: 'Runs one queue worker for a job delivered by an external dispatcher.',
48
+ func: async ({ logger }, data) => pikkuRemoteQueueJobFunc({ logger }, data),
49
+ })
50
+
51
+ const runRemoteScheduledJob = pikkuSessionlessFunc({
52
+ auth: false,
53
+ input: RemoteScheduledJob,
54
+ tags: ['pikku'],
55
+ description: 'Runs one scheduled task for a tick delivered by an external scheduler.',
56
+ func: async ({ logger }, data) => pikkuRemoteScheduledJobFunc({ logger }, data),
57
+ })
58
+
59
+ wireHTTP({
60
+ method: 'post',
61
+ route: '/__pikku/queue-job',
62
+ auth: false,
63
+ tags: ['pikku'],
64
+ func: runRemoteQueueJob,
65
+ middleware: [remoteJobsSecret],
66
+ })
67
+
68
+ wireHTTP({
69
+ method: 'post',
70
+ route: '/__pikku/scheduler-job',
71
+ auth: false,
72
+ tags: ['pikku'],
73
+ func: runRemoteScheduledJob,
74
+ middleware: [remoteJobsSecret],
75
+ })
76
+ `;
77
+ return { schemas, functions };
78
+ };
@@ -1,4 +1,4 @@
1
- const quote = (value) => `'${value.replace(/'/g, "\\'")}'`;
1
+ import { tsLiteral } from '../../../utils/ts-literal.js';
2
2
  /**
3
3
  * Generates the `SystemRoleName` union and role metadata from
4
4
  * `defineSystemRole` declarations.
@@ -11,7 +11,7 @@ const quote = (value) => `'${value.replace(/'/g, "\\'")}'`;
11
11
  export const serializeRolesTypes = ({ definitions }) => {
12
12
  const names = [...new Set(definitions.map((d) => d.name))].sort();
13
13
  const union = names.length > 0
14
- ? `\n${names.map((name) => ` | ${quote(name)}`).join('\n')}`
14
+ ? `\n${names.map((name) => ` | ${tsLiteral(name)}`).join('\n')}`
15
15
  : ' never';
16
16
  return `/**
17
17
  * This file was generated by the @pikku/cli
@@ -3,8 +3,7 @@ import { serializeFileImports } from '../../../utils/file-imports-serializer.js'
3
3
  import { writeFileInDir } from '../../../utils/file-writer.js';
4
4
  import { logCommandInfoAndTime } from '../../../middleware/log-command-info-and-time.js';
5
5
  import { serializeSchedulerMeta, serializeSchedulerMetaTS, } from './serialize-scheduler-meta.js';
6
- import { getFileImportRelativePath } from '../../../utils/file-import-path.js';
7
- import { stripVerboseFields, hasVerboseFields, } from '../../../utils/strip-verbose-meta.js';
6
+ import { writeWiringMeta } from '../../../utils/write-wiring-meta.js';
8
7
  export const pikkuScheduler = pikkuSessionlessFunc({
9
8
  func: async ({ logger, config, getInspectorState }) => {
10
9
  const visitState = await getInspectorState();
@@ -15,16 +14,16 @@ export const pikkuScheduler = pikkuSessionlessFunc({
15
14
  return undefined;
16
15
  }
17
16
  const fullMeta = serializeSchedulerMeta(scheduledTasks.meta);
18
- // Write minimal JSON (runtime-only fields)
19
- const minimalMeta = stripVerboseFields(fullMeta);
20
- await writeFileInDir(logger, schedulersWiringMetaJsonFile, JSON.stringify(minimalMeta, null, 2));
21
- // Write verbose JSON only if it has additional fields
22
- if (hasVerboseFields(fullMeta)) {
23
- const verbosePath = schedulersWiringMetaJsonFile.replace(/\.gen\.json$/, '-verbose.gen.json');
24
- await writeFileInDir(logger, verbosePath, JSON.stringify(fullMeta, null, 2));
25
- }
26
- const jsonImportPath = getFileImportRelativePath(schedulersWiringMetaFile, schedulersWiringMetaJsonFile, packageMappings);
27
- await writeFileInDir(logger, schedulersWiringMetaFile, serializeSchedulerMetaTS(scheduledTasks.meta, jsonImportPath, schema?.supportsImportAttributes ?? false));
17
+ const supportsImportAttributes = schema?.supportsImportAttributes ?? false;
18
+ await writeWiringMeta({
19
+ logger,
20
+ meta: fullMeta,
21
+ metaJsonFile: schedulersWiringMetaJsonFile,
22
+ metaFile: schedulersWiringMetaFile,
23
+ packageMappings,
24
+ supportsImportAttributes,
25
+ serializeMetaTS: ({ jsonImportPath }) => serializeSchedulerMetaTS(scheduledTasks.meta, jsonImportPath, supportsImportAttributes),
26
+ });
28
27
  await writeFileInDir(logger, schedulersWiringFile, serializeFileImports('addScheduledTasks', schedulersWiringFile, scheduledTasks.files, packageMappings));
29
28
  return true;
30
29
  },
@@ -1,5 +1,5 @@
1
1
  import { flattenScopeDefinitions } from '@pikku/core/scope';
2
- const quote = (value) => `'${value.replace(/'/g, "\\'")}'`;
2
+ import { tsLiteral } from '../../../utils/ts-literal.js';
3
3
  /**
4
4
  * Generates the browser-side scope client: the `ScopeId` union and a
5
5
  * `hasScopes` that decides whether held grants satisfy a requirement.
@@ -20,7 +20,7 @@ export const serializeScopesClient = ({ definitions, }) => {
20
20
  ...ids.filter(hasChildren).map((id) => `${id}:*`),
21
21
  ].sort();
22
22
  const union = requirable.length > 0
23
- ? `\n${requirable.map((id) => ` | ${quote(id)}`).join('\n')}`
23
+ ? `\n${requirable.map((id) => ` | ${tsLiteral(id)}`).join('\n')}`
24
24
  : ' never';
25
25
  return `/**
26
26
  * This file was generated by the @pikku/cli
@@ -1,5 +1,5 @@
1
1
  import { flattenScopeDefinitions } from '@pikku/core/scope';
2
- const quote = (value) => `'${value.replace(/'/g, "\\'")}'`;
2
+ import { tsLiteral } from '../../../utils/ts-literal.js';
3
3
  /**
4
4
  * Generates the `ScopeId` union and scope metadata from `defineScope`
5
5
  * declarations.
@@ -19,13 +19,15 @@ export const serializeScopesTypes = ({ definitions, }) => {
19
19
  ...ids.filter(hasChildren).map((id) => `${id}:*`),
20
20
  ].sort();
21
21
  const union = requirable.length > 0
22
- ? `\n${requirable.map((id) => ` | ${quote(id)}`).join('\n')}`
22
+ ? `\n${requirable.map((id) => ` | ${tsLiteral(id)}`).join('\n')}`
23
23
  : ' never';
24
24
  const displayNames = [...flat]
25
25
  .sort((a, b) => a.id.localeCompare(b.id))
26
26
  .flatMap((scope) => {
27
27
  const displayName = definitions.find((d) => d.name === scope.id)?.displayName;
28
- return displayName ? [` ${quote(scope.id)}: ${quote(displayName)},`] : [];
28
+ return displayName
29
+ ? [` ${tsLiteral(scope.id)}: ${tsLiteral(displayName)},`]
30
+ : [];
29
31
  });
30
32
  return `/**
31
33
  * This file was generated by the @pikku/cli
@@ -1,12 +1,6 @@
1
1
  import { validateAndBuildSecretDefinitionsMeta } from '@pikku/core/secret';
2
2
  import { getFileImportRelativePath } from '../../../utils/file-import-path.js';
3
- /**
4
- * A display name is the human-facing label a developer wrote, so an apostrophe
5
- * in it is ordinary. `JSON.stringify` emits a valid, escaped TypeScript string
6
- * literal; interpolating the raw text into a quoted one terminates the string
7
- * and the generated file stops parsing.
8
- */
9
- const literal = (value) => JSON.stringify(value);
3
+ import { tsLiteral } from '../../../utils/ts-literal.js';
10
4
  export const serializeSecretsTypes = ({ definitions, schemaLookup, secretsFile, packageMappings, }) => {
11
5
  const secrets = validateAndBuildSecretDefinitionsMeta(definitions, schemaLookup);
12
6
  const credentialEntries = Object.entries(secrets);
@@ -20,8 +14,8 @@ export const serializeSecretsTypes = ({ definitions, schemaLookup, secretsFile,
20
14
  needsOAuth2Types = true;
21
15
  mapEntries.push(` '${meta.secretId}': OAuth2AppCredential`);
22
16
  mapEntries.push(` '${meta.oauth2.tokenSecretId}': OAuth2Token`);
23
- metaEntries.push(` '${meta.secretId}': { name: '${name}', displayName: ${literal(meta.displayName)}, oauth2: { tokenSecretId: '${meta.oauth2.tokenSecretId}' } }`);
24
- metaEntries.push(` '${meta.oauth2.tokenSecretId}': { name: '${name}_tokens', displayName: ${literal(`${meta.displayName} Tokens`)} }`);
17
+ metaEntries.push(` '${meta.secretId}': { name: '${name}', displayName: ${tsLiteral(meta.displayName)}, oauth2: { tokenSecretId: '${meta.oauth2.tokenSecretId}' } }`);
18
+ metaEntries.push(` '${meta.oauth2.tokenSecretId}': { name: '${name}_tokens', displayName: ${tsLiteral(`${meta.displayName} Tokens`)} }`);
25
19
  }
26
20
  else if (meta.schema && typeof meta.schema === 'string') {
27
21
  const schemaRef = schemaLookup.get(meta.schema);
@@ -32,7 +26,7 @@ export const serializeSecretsTypes = ({ definitions, schemaLookup, secretsFile,
32
26
  }
33
27
  schemaImports.get(schemaRef.sourceFile).add(schemaRef.variableName);
34
28
  mapEntries.push(` '${meta.secretId}'${meta.optional ? '?' : ''}: z.infer<typeof ${schemaRef.variableName}>`);
35
- metaEntries.push(` '${meta.secretId}': { name: '${name}', displayName: ${literal(meta.displayName)}${meta.optional ? ', optional: true' : ''} }`);
29
+ metaEntries.push(` '${meta.secretId}': { name: '${name}', displayName: ${tsLiteral(meta.displayName)}${meta.optional ? ', optional: true' : ''} }`);
36
30
  }
37
31
  }
38
32
  }
@@ -4,7 +4,7 @@ import { writeFileInDir } from '../../../utils/file-writer.js';
4
4
  import { logCommandInfoAndTime } from '../../../middleware/log-command-info-and-time.js';
5
5
  import { serializeTriggerMeta, serializeTriggerMetaTS, serializeTriggerSourceMeta, serializeTriggerSourceMetaTS, } from './serialize-trigger-meta.js';
6
6
  import { getFileImportRelativePath } from '../../../utils/file-import-path.js';
7
- import { stripVerboseFields, hasVerboseFields, } from '../../../utils/strip-verbose-meta.js';
7
+ import { writeWiringMeta } from '../../../utils/write-wiring-meta.js';
8
8
  export const pikkuTrigger = pikkuSessionlessFunc({
9
9
  func: async ({ logger, config, getInspectorState }) => {
10
10
  const visitState = await getInspectorState();
@@ -14,16 +14,16 @@ export const pikkuTrigger = pikkuSessionlessFunc({
14
14
  return undefined;
15
15
  }
16
16
  const fullMeta = serializeTriggerMeta(triggers.meta);
17
- // Write minimal JSON (runtime-only fields)
18
- const minimalMeta = stripVerboseFields(fullMeta);
19
- await writeFileInDir(logger, triggersWiringMetaJsonFile, JSON.stringify(minimalMeta, null, 2));
20
- // Write verbose JSON only if it has additional fields
21
- if (hasVerboseFields(fullMeta)) {
22
- const verbosePath = triggersWiringMetaJsonFile.replace(/\.gen\.json$/, '-verbose.gen.json');
23
- await writeFileInDir(logger, verbosePath, JSON.stringify(fullMeta, null, 2));
24
- }
25
- const jsonImportPath = getFileImportRelativePath(triggersWiringMetaFile, triggersWiringMetaJsonFile, packageMappings);
26
- await writeFileInDir(logger, triggersWiringMetaFile, serializeTriggerMetaTS(triggers.meta, jsonImportPath, schema?.supportsImportAttributes ?? false));
17
+ const supportsImportAttributes = schema?.supportsImportAttributes ?? false;
18
+ await writeWiringMeta({
19
+ logger,
20
+ meta: fullMeta,
21
+ metaJsonFile: triggersWiringMetaJsonFile,
22
+ metaFile: triggersWiringMetaFile,
23
+ packageMappings,
24
+ supportsImportAttributes,
25
+ serializeMetaTS: ({ jsonImportPath }) => serializeTriggerMetaTS(triggers.meta, jsonImportPath, supportsImportAttributes),
26
+ });
27
27
  await writeFileInDir(logger, triggersWiringFile, serializeFileImports('wireTrigger', triggersWiringFile, triggers.files, packageMappings));
28
28
  const sourceMetaJson = serializeTriggerSourceMeta(triggers.sourceMeta);
29
29
  await writeFileInDir(logger, triggerSourcesMetaJsonFile, JSON.stringify(sourceMetaJson, null, 2));
@@ -1,12 +1,6 @@
1
1
  import { validateAndBuildVariableDefinitionsMeta } from '@pikku/core/variable';
2
2
  import { getFileImportRelativePath } from '../../../utils/file-import-path.js';
3
- /**
4
- * A display name is the human-facing label a developer wrote, so an apostrophe
5
- * in it is ordinary. `JSON.stringify` emits a valid, escaped TypeScript string
6
- * literal; interpolating the raw text into a quoted one terminates the string
7
- * and the generated file stops parsing.
8
- */
9
- const literal = (value) => JSON.stringify(value);
3
+ import { tsLiteral } from '../../../utils/ts-literal.js';
10
4
  export const serializeVariablesTypes = ({ definitions, schemaLookup, variablesFile, packageMappings, }) => {
11
5
  const variables = validateAndBuildVariableDefinitionsMeta(definitions, schemaLookup);
12
6
  const variableEntries = Object.entries(variables);
@@ -28,7 +22,7 @@ export const serializeVariablesTypes = ({ definitions, schemaLookup, variablesFi
28
22
  // declaring the schema import each other: reading it while the modules
29
23
  // are still initializing throws `Cannot access '<schema>' before
30
24
  // initialization`, and deferring the read to first use avoids the cycle.
31
- metaEntries.push(` '${meta.variableId}': { name: '${name}', displayName: ${literal(meta.displayName)}, schema: () => ${schemaRef.variableName} }`);
25
+ metaEntries.push(` '${meta.variableId}': { name: '${name}', displayName: ${tsLiteral(meta.displayName)}, schema: () => ${schemaRef.variableName} }`);
32
26
  }
33
27
  }
34
28
  }
@@ -16,7 +16,7 @@ import { serializeScenarioRegistration } from '../scenarios/serialize-scenario-r
16
16
  import { buildFeaturesMeta } from '../scenarios/serialize-feature-meta.js';
17
17
  import { serializeScenarioWorkflowMeta } from '../scenarios/serialize-scenario-meta.js';
18
18
  import { getFileImportRelativePath } from '../../../utils/file-import-path.js';
19
- import { stripVerboseFields, hasVerboseFields, } from '../../../utils/strip-verbose-meta.js';
19
+ import { writeMetaSidecar } from '../../../utils/write-wiring-meta.js';
20
20
  import { join, dirname } from 'path';
21
21
  import { rm } from 'fs/promises';
22
22
  export const pikkuWorkflow = pikkuSessionlessFunc({
@@ -62,13 +62,12 @@ export const pikkuWorkflow = pikkuSessionlessFunc({
62
62
  const metaDir = scenarioNameSet.has(name)
63
63
  ? config.scenarioMetaDir
64
64
  : workflowMetaDir;
65
- const minimalMeta = stripVerboseFields(graphMeta);
66
- const minimalPath = join(metaDir, `${name}.gen.json`);
67
- await writeFileInDir(logger, minimalPath, JSON.stringify(minimalMeta, null, 2), { ignoreModifyComment: true });
68
- if (hasVerboseFields(graphMeta)) {
69
- const verbosePath = join(metaDir, `${name}-verbose.gen.json`);
70
- await writeFileInDir(logger, verbosePath, JSON.stringify(graphMeta, null, 2), { ignoreModifyComment: true });
71
- }
65
+ await writeMetaSidecar({
66
+ logger,
67
+ meta: graphMeta,
68
+ metaJsonFile: join(metaDir, `${name}.gen.json`),
69
+ ignoreModifyComment: true,
70
+ });
72
71
  }
73
72
  }
74
73
  // A project generated before scenarios moved out has their meta sitting in
@@ -5,6 +5,7 @@ import { assertSingleCoreVersion } from '../../utils/assert-single-core-version.
5
5
  import { warnOnSplitTypeIdentity } from '../validate/type-identity-checks.js';
6
6
  import { pruneLegacyScaffoldFiles, refreshScaffoldsImportingRemovedEntryPoints, removeRetiredScaffoldFiles, } from '../../utils/remove-legacy-scaffold-file.js';
7
7
  import { writeSurfaceUsage } from '../surface/write-surface-usage.js';
8
+ import { writeSchemaArtifact } from '../db/local-db.js';
8
9
  import { PikkuTypecheckFailedError, renderTscFull, renderTscSummary, runProjectTypecheck, } from '../../utils/tsc-check.js';
9
10
  const scaffoldFiles = (config) => {
10
11
  const files = [];
@@ -255,10 +256,12 @@ export const allWorkflow = pikkuWorkflowComplexFunc({
255
256
  ]);
256
257
  let remoteRPC = false;
257
258
  let webhook = false;
259
+ let remoteJobs = false;
258
260
  let workflowRoutes = false;
259
261
  if (!config.addon) {
260
262
  remoteRPC = await workflow.do('Remote RPC', 'pikkuRemoteRPC', null);
261
263
  webhook = await workflow.do('Webhook', 'pikkuWebhook', null);
264
+ remoteJobs = await workflow.do('Remote jobs', 'pikkuRemoteJobs', null);
262
265
  if (workflows) {
263
266
  workflowRoutes = await workflow.do('Workflow routes', 'pikkuWorkflowRoutes', null);
264
267
  }
@@ -279,6 +282,7 @@ export const allWorkflow = pikkuWorkflowComplexFunc({
279
282
  if (workflows ||
280
283
  remoteRPC ||
281
284
  webhook ||
285
+ remoteJobs ||
282
286
  workflowRoutes ||
283
287
  unresolvedSchemas) {
284
288
  await workflow.do('Re-inspect after workflows', async () => {
@@ -319,6 +323,10 @@ export const allWorkflow = pikkuWorkflowComplexFunc({
319
323
  workflow.do('Channels', 'pikkuCommandChannels', null),
320
324
  workflow.do('CLI', 'pikkuCLI', null),
321
325
  ]);
326
+ // Written on every build, empty when the addon has no tables: the
327
+ // consumer reads an absent file as a package that cannot say whether it
328
+ // ships a schema, which is a broken publish rather than a quiet no.
329
+ await writeSchemaArtifact(config.rootDir, config.outDir, config.db?.pgliteExtensions);
322
330
  }
323
331
  const hasFunctionRegistrations = await workflow.do('Functions', 'pikkuFunctions', null);
324
332
  allImports.push(config.functionsMetaFile);
@@ -177,6 +177,7 @@ export const createSingletonServices = async (config) => {
177
177
  let unfilteredStateIsSetupOnly = false;
178
178
  let inspectedTsGeneration;
179
179
  let inspectorInvalidated = false;
180
+ let inspectPass = 0;
180
181
  const releaseProgram = (state) => {
181
182
  if (state)
182
183
  state.program = undefined;
@@ -244,6 +245,7 @@ export const createSingletonServices = async (config) => {
244
245
  config.consoleFunctionsFile,
245
246
  config.remoteRpcWorkersFile,
246
247
  config.webhookWorkersFile,
248
+ config.remoteJobsFile,
247
249
  config.workflowRoutesFile,
248
250
  config.publicRpcFile,
249
251
  config.publicAgentFile,
@@ -276,6 +278,16 @@ export const createSingletonServices = async (config) => {
276
278
  ? ((await loadManifest(join(config.rootDir, 'versions.pikku.json'))) ??
277
279
  undefined)
278
280
  : undefined;
281
+ // The outgoing state's `typesLookup` holds live `ts.Type`s. A type reaches
282
+ // its checker and the checker reaches the whole program, so that one map
283
+ // pins a parsed program and an exercised checker for as long as the state
284
+ // exists — `releaseProgram` alone frees nothing. Every reader of the old
285
+ // state is done once a re-inspection is asked for, so drop the types here
286
+ // and the old program is collectable while the new one is built, instead
287
+ // of both being live at once.
288
+ if (unfilteredState && 'typesLookup' in unfilteredState) {
289
+ unfilteredState.typesLookup.clear();
290
+ }
279
291
  const oldProgram = unfilteredState?.program ?? undefined;
280
292
  const inspectStart = Date.now();
281
293
  unfilteredStateIsSetupOnly = setupOnly;
@@ -317,6 +329,17 @@ export const createSingletonServices = async (config) => {
317
329
  manifest,
318
330
  });
319
331
  logger.debug(`Inspector took ${Date.now() - inspectStart}ms`);
332
+ // One row per inspector pass under PIKKU_TIMING, next to the step table
333
+ // `pikku all` prints: the counts say what the pass did, the ms say what
334
+ // it cost here. The benchmark gates on the counts.
335
+ if (process.env.PIKKU_TIMING && unfilteredState.stats) {
336
+ const s = unfilteredState.stats;
337
+ inspectPass++;
338
+ logger.info(`[INSPECT] pass=${inspectPass} ${setupOnly ? 'setup' : 'full'} ` +
339
+ `files=${s.files} project=${s.projectFiles} reused=${s.filesReused} ` +
340
+ `types=${s.types} instantiations=${s.instantiations} symbols=${s.symbols} ` +
341
+ `cpu=${s.cpuMs}ms wall=${s.wallMs}ms heap=${s.heapUsedMb}MB`);
342
+ }
320
343
  inspectedTsGeneration = tsGenerationAtInspect;
321
344
  inspectorInvalidated = false;
322
345
  releaseProgram(unfilteredState);
@@ -390,6 +390,7 @@ const _getPikkuCLIConfig = async (logger, configFile = undefined, requiredFields
390
390
  workflow: 'workflowRoutesFile',
391
391
  events: 'eventsChannelFile',
392
392
  remoteRpc: 'remoteRpcWorkersFile',
393
+ remoteJobs: 'remoteJobsFile',
393
394
  };
394
395
  const scaffoldBlock = result.scaffold;
395
396
  for (const [feature, outputField] of Object.entries(SCAFFOLD_OUTPUT_FIELDS)) {
@@ -415,6 +416,9 @@ const _getPikkuCLIConfig = async (logger, configFile = undefined, requiredFields
415
416
  if (result.scaffold?.webhook && !result.webhookSchemasFile) {
416
417
  result.webhookSchemasFile = join(resolvedScaffoldDir, 'webhook', 'webhook.schemas.gen.ts');
417
418
  }
419
+ if (result.scaffold?.remoteJobs && !result.remoteJobsFile) {
420
+ result.remoteJobsFile = join(resolvedScaffoldDir, 'remote-jobs', 'remote-jobs.gen.ts');
421
+ }
418
422
  if (result.scaffold?.workflow && !result.workflowRoutesFile) {
419
423
  result.workflowRoutesFile = join(resolvedScaffoldDir, 'workflow', 'workflow-routes.gen.ts');
420
424
  }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * The schemas module always sits beside the routes that import it, so there is
3
+ * nothing to configure: a settable path could be moved out from under the
4
+ * generated `./remote-jobs.schemas.gen.js` import and nothing would write it.
5
+ */
6
+ export declare const remoteJobsSchemasFile: (remoteJobsFile: string | undefined) => string | undefined;