@pikku/core 0.12.106 → 0.12.111

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 (589) hide show
  1. package/CHANGELOG.md +358 -0
  2. package/dist/analytics/analytics.d.ts +6 -0
  3. package/dist/analytics/analytics.js +58 -0
  4. package/dist/analytics/analytics.types.d.ts +156 -0
  5. package/dist/analytics/analytics.types.js +1 -0
  6. package/dist/analytics/anonymous-analytics-identity.d.ts +23 -0
  7. package/dist/analytics/anonymous-analytics-identity.js +27 -0
  8. package/dist/analytics/compose-analytics-identity.d.ts +14 -0
  9. package/dist/analytics/compose-analytics-identity.js +33 -0
  10. package/dist/analytics/cookie-analytics-identity.d.ts +24 -0
  11. package/dist/analytics/cookie-analytics-identity.js +37 -0
  12. package/dist/analytics/define-analytics-events.d.ts +22 -0
  13. package/dist/analytics/define-analytics-events.js +9 -0
  14. package/dist/analytics/fan-out-analytics.d.ts +15 -0
  15. package/dist/analytics/fan-out-analytics.js +36 -0
  16. package/dist/analytics/index.d.ts +13 -0
  17. package/dist/analytics/index.js +8 -0
  18. package/dist/analytics/logger-analytics-service.d.ts +14 -0
  19. package/dist/analytics/logger-analytics-service.js +23 -0
  20. package/dist/analytics/mint-cookie.d.ts +44 -0
  21. package/dist/analytics/mint-cookie.js +55 -0
  22. package/dist/errors/errors.d.ts +7 -0
  23. package/dist/errors/errors.js +17 -0
  24. package/dist/function/function-meta.types.d.ts +2 -0
  25. package/dist/function/function-runner.js +29 -0
  26. package/dist/function/functions.types.d.ts +22 -3
  27. package/dist/middleware/auth-apikey.d.ts +1 -1
  28. package/dist/pikku-state.d.ts +1 -1
  29. package/dist/scopes.d.ts +11 -0
  30. package/dist/scopes.js +17 -0
  31. package/dist/services/credential-wire-service.d.ts +1 -1
  32. package/dist/services/feature-flag-service.d.ts +100 -0
  33. package/dist/services/feature-flag-service.js +1 -0
  34. package/dist/services/index.d.ts +1 -0
  35. package/dist/services/meta-service.d.ts +16 -0
  36. package/dist/services/meta-service.js +19 -0
  37. package/dist/services/webhook-service.d.ts +7 -2
  38. package/dist/services/webhook-service.js +11 -6
  39. package/dist/testing/service-tests/agent-run-service-tests.d.ts +2 -2
  40. package/dist/testing/service-tests/agent-storage-service-tests.d.ts +1 -1
  41. package/dist/testing/service-tests/channel-store-tests.d.ts +1 -1
  42. package/dist/testing/service-tests/credential-service-tests.d.ts +1 -1
  43. package/dist/testing/service-tests/deployment-service-tests.d.ts +1 -1
  44. package/dist/testing/service-tests/event-hub-store-tests.d.ts +1 -1
  45. package/dist/testing/service-tests/secret-service-tests.d.ts +1 -1
  46. package/dist/testing/service-tests/session-store-tests.d.ts +1 -1
  47. package/dist/testing/service-tests/workflow-run-service-tests.d.ts +1 -1
  48. package/dist/testing/service-tests/workflow-service-tests.d.ts +1 -1
  49. package/dist/types/core.types.d.ts +23 -0
  50. package/dist/wirings/agent/agent-rpc.d.ts +1 -1
  51. package/dist/wirings/agent/agent-turn.d.ts +1 -1
  52. package/dist/wirings/agent-scorer/agent-scorer-live.d.ts +1 -1
  53. package/dist/wirings/channel/channel-common.d.ts +1 -1
  54. package/dist/wirings/channel/channel-rpc-validators.d.ts +2 -2
  55. package/dist/wirings/channel/channel-runner.d.ts +1 -1
  56. package/dist/wirings/channel/local/local-channel-runner.d.ts +1 -1
  57. package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +1 -1
  58. package/dist/wirings/cli/channel/cli-approval.d.ts +2 -2
  59. package/dist/wirings/flag/assert-feature-available.d.ts +15 -0
  60. package/dist/wirings/flag/assert-feature-available.js +23 -0
  61. package/dist/wirings/flag/cached-flag-source.d.ts +73 -0
  62. package/dist/wirings/flag/cached-flag-source.js +96 -0
  63. package/dist/wirings/flag/define-feature-flags.d.ts +33 -0
  64. package/dist/wirings/flag/define-feature-flags.js +32 -0
  65. package/dist/wirings/flag/flag.types.d.ts +97 -0
  66. package/dist/wirings/flag/flag.types.js +1 -0
  67. package/dist/wirings/flag/index.d.ts +7 -0
  68. package/dist/wirings/flag/index.js +5 -0
  69. package/dist/wirings/flag/resolve-flag.d.ts +52 -0
  70. package/dist/wirings/flag/resolve-flag.js +90 -0
  71. package/dist/wirings/flag/validate-flag-definitions.d.ts +26 -0
  72. package/dist/wirings/flag/validate-flag-definitions.js +103 -0
  73. package/dist/wirings/rpc/rpc-runner.js +3 -0
  74. package/dist/wirings/virtual-user/virtual-user-scaffold.d.ts +8 -8
  75. package/dist/wirings/virtual-user/virtual-user-schedule.d.ts +1 -1
  76. package/dist/wirings/workflow/workflow-queue-routing.d.ts +1 -1
  77. package/package.json +11 -5
  78. package/run-tests.sh +17 -9
  79. package/src/public-surface.json +26 -0
  80. package/src/agent-naming.test.ts +0 -68
  81. package/src/api-report.test.ts +0 -138
  82. package/src/app-alias-surface.test.ts +0 -179
  83. package/src/app-leaf-surface.test.ts +0 -222
  84. package/src/bootstrap-compat/root.ts +0 -20
  85. package/src/classification/column-form.test.ts +0 -97
  86. package/src/classification/column-form.ts +0 -55
  87. package/src/classification/data-classification.ts +0 -73
  88. package/src/classification/index.ts +0 -40
  89. package/src/classification/key-ids.ts +0 -2
  90. package/src/classification/secret-value.test.ts +0 -204
  91. package/src/classification/secret-value.ts +0 -106
  92. package/src/crypto-utils.test.ts +0 -668
  93. package/src/crypto-utils.ts +0 -460
  94. package/src/dev/hot-reload.test.ts +0 -587
  95. package/src/dev/hot-reload.ts +0 -225
  96. package/src/dev/module-runner.test.ts +0 -235
  97. package/src/dev/module-runner.ts +0 -138
  98. package/src/dev/reload-meta.test.ts +0 -183
  99. package/src/dev/reload-meta.ts +0 -144
  100. package/src/ecosystem-tier-removed.test.ts +0 -72
  101. package/src/env.ts +0 -1
  102. package/src/errors/error-handler.ts +0 -77
  103. package/src/errors/error.test.ts +0 -229
  104. package/src/errors/errors.ts +0 -393
  105. package/src/errors/index.ts +0 -11
  106. package/src/errors/serialized-error.ts +0 -12
  107. package/src/factory-functions.test.ts +0 -111
  108. package/src/function/abort-scope.test.ts +0 -97
  109. package/src/function/abort-scope.ts +0 -80
  110. package/src/function/function-meta.types.ts +0 -151
  111. package/src/function/function-runner.test.ts +0 -1619
  112. package/src/function/function-runner.ts +0 -499
  113. package/src/function/functions.types.ts +0 -319
  114. package/src/function/index.ts +0 -40
  115. package/src/function/list.types.test.ts +0 -100
  116. package/src/function/list.types.ts +0 -69
  117. package/src/function/pikku-request.test.ts +0 -35
  118. package/src/function/pikku-request.ts +0 -17
  119. package/src/gopass-secrets-removed.test.ts +0 -51
  120. package/src/handle-error.test.ts +0 -532
  121. package/src/handle-error.ts +0 -64
  122. package/src/middleware/auth-apikey.test.ts +0 -362
  123. package/src/middleware/auth-apikey.ts +0 -39
  124. package/src/middleware/auth-bearer.test.ts +0 -566
  125. package/src/middleware/auth-bearer.ts +0 -83
  126. package/src/middleware/auth-cookie.test.ts +0 -572
  127. package/src/middleware/auth-cookie.ts +0 -107
  128. package/src/middleware/cors.test.ts +0 -579
  129. package/src/middleware/cors.ts +0 -103
  130. package/src/middleware/index.ts +0 -30
  131. package/src/middleware/middleware-factories.ts +0 -76
  132. package/src/middleware/middleware.types.ts +0 -61
  133. package/src/middleware/remote-auth.test.ts +0 -547
  134. package/src/middleware/remote-auth.ts +0 -95
  135. package/src/middleware/remote-jobs-secret.ts +0 -35
  136. package/src/middleware/require-origin.test.ts +0 -115
  137. package/src/middleware/require-origin.ts +0 -79
  138. package/src/middleware/telemetry.ts +0 -83
  139. package/src/middleware-runner.test.ts +0 -578
  140. package/src/middleware-runner.ts +0 -232
  141. package/src/no-any-casts.test.ts +0 -57
  142. package/src/no-root-barrel.test.ts +0 -122
  143. package/src/permissions.test.ts +0 -256
  144. package/src/permissions.ts +0 -217
  145. package/src/pikku-state.test.ts +0 -198
  146. package/src/pikku-state.ts +0 -206
  147. package/src/production-barrels-stay-lean.test.ts +0 -110
  148. package/src/public-surface.test.ts +0 -133
  149. package/src/remote.test.ts +0 -173
  150. package/src/remote.ts +0 -56
  151. package/src/removed-legacy-exports.test.ts +0 -66
  152. package/src/run-tests-script.test.ts +0 -67
  153. package/src/schema.test.ts +0 -430
  154. package/src/schema.ts +0 -204
  155. package/src/scopes.test.ts +0 -203
  156. package/src/scopes.ts +0 -67
  157. package/src/services/agent-run-state-service.ts +0 -37
  158. package/src/services/agent-runner-service.ts +0 -238
  159. package/src/services/agent-storage-service.ts +0 -39
  160. package/src/services/ai-embedding-service.ts +0 -9
  161. package/src/services/audit-service.test.ts +0 -44
  162. package/src/services/audit-service.ts +0 -280
  163. package/src/services/content-service.ts +0 -65
  164. package/src/services/credential-service.ts +0 -20
  165. package/src/services/credential-wire-service.test.ts +0 -235
  166. package/src/services/credential-wire-service.ts +0 -120
  167. package/src/services/deployment-service.ts +0 -32
  168. package/src/services/email-service.test.ts +0 -100
  169. package/src/services/email-service.ts +0 -60
  170. package/src/services/email-template.test.ts +0 -311
  171. package/src/services/email-template.ts +0 -254
  172. package/src/services/file-scenario-run-store.test.ts +0 -349
  173. package/src/services/file-scenario-run-store.ts +0 -282
  174. package/src/services/gateway-service.ts +0 -5
  175. package/src/services/http-personas-converse.test.ts +0 -274
  176. package/src/services/http-personas.test.ts +0 -379
  177. package/src/services/http-personas.ts +0 -508
  178. package/src/services/in-memory-agent-run-state-service.ts +0 -87
  179. package/src/services/in-memory-queue-service.test.ts +0 -162
  180. package/src/services/in-memory-queue-service.ts +0 -78
  181. package/src/services/in-memory-session-store.test.ts +0 -58
  182. package/src/services/in-memory-session-store.ts +0 -20
  183. package/src/services/in-memory-trigger-service.ts +0 -47
  184. package/src/services/in-memory-workflow-service.test.ts +0 -430
  185. package/src/services/in-memory-workflow-service.ts +0 -595
  186. package/src/services/index.ts +0 -192
  187. package/src/services/istanbul-coverage-service.test.ts +0 -66
  188. package/src/services/istanbul-coverage-service.ts +0 -59
  189. package/src/services/jwt-service.ts +0 -15
  190. package/src/services/local-content-request-handler.test.ts +0 -240
  191. package/src/services/local-content-request-handler.ts +0 -295
  192. package/src/services/local-content.test.ts +0 -186
  193. package/src/services/local-content.ts +0 -242
  194. package/src/services/local-credential-service.ts +0 -63
  195. package/src/services/local-email-service.test.ts +0 -182
  196. package/src/services/local-email-service.ts +0 -43
  197. package/src/services/local-gateway-service.ts +0 -51
  198. package/src/services/local-secrets.test.ts +0 -95
  199. package/src/services/local-secrets.ts +0 -71
  200. package/src/services/local-variables.test.ts +0 -61
  201. package/src/services/local-variables.ts +0 -45
  202. package/src/services/logger-console.test.ts +0 -117
  203. package/src/services/logger-console.ts +0 -174
  204. package/src/services/logger.ts +0 -48
  205. package/src/services/meta-service.test.ts +0 -75
  206. package/src/services/meta-service.ts +0 -767
  207. package/src/services/persona-actor-secret.test.ts +0 -68
  208. package/src/services/persona-actor-secret.ts +0 -70
  209. package/src/services/persona-sign-in.test.ts +0 -219
  210. package/src/services/persona-sign-in.ts +0 -238
  211. package/src/services/personas-service.ts +0 -191
  212. package/src/services/pikku-user-id.test.ts +0 -62
  213. package/src/services/pikku-user-id.ts +0 -13
  214. package/src/services/queue-webhook-service.test.ts +0 -409
  215. package/src/services/queue-webhook-service.ts +0 -150
  216. package/src/services/remote-jobs.test.ts +0 -106
  217. package/src/services/remote-jobs.ts +0 -92
  218. package/src/services/scheduler-service.ts +0 -37
  219. package/src/services/schema-service.ts +0 -10
  220. package/src/services/scope-service.ts +0 -91
  221. package/src/services/scoped-credential-service.test.ts +0 -86
  222. package/src/services/scoped-credential-service.ts +0 -63
  223. package/src/services/scoped-secret-service.test.ts +0 -93
  224. package/src/services/scoped-secret-service.ts +0 -40
  225. package/src/services/secret-host-binding.test.ts +0 -138
  226. package/src/services/secret-host-binding.ts +0 -51
  227. package/src/services/secret-service.ts +0 -25
  228. package/src/services/secretless.test.ts +0 -54
  229. package/src/services/secretless.ts +0 -29
  230. package/src/services/session-store.ts +0 -9
  231. package/src/services/stub-tracker.test.ts +0 -104
  232. package/src/services/stub-tracker.ts +0 -175
  233. package/src/services/system-role-guard.test.ts +0 -96
  234. package/src/services/system-role-guard.ts +0 -71
  235. package/src/services/temporary-file-service.ts +0 -76
  236. package/src/services/trigger-service.ts +0 -5
  237. package/src/services/typed-credential-service.ts +0 -83
  238. package/src/services/typed-secret-service.test.ts +0 -204
  239. package/src/services/typed-secret-service.ts +0 -132
  240. package/src/services/typed-variables-service.test.ts +0 -166
  241. package/src/services/typed-variables-service.ts +0 -166
  242. package/src/services/user-session-service.test.ts +0 -147
  243. package/src/services/user-session-service.ts +0 -85
  244. package/src/services/v8-coverage-service.test.ts +0 -69
  245. package/src/services/v8-coverage-service.ts +0 -163
  246. package/src/services/variables-service.ts +0 -13
  247. package/src/services/webhook-service.ts +0 -147
  248. package/src/services/workflow-service.ts +0 -120
  249. package/src/side-effects-are-declared.test.ts +0 -84
  250. package/src/source-files-stay-composable.test.ts +0 -41
  251. package/src/template-alias-surface.test.ts +0 -240
  252. package/src/test-utils.ts +0 -38
  253. package/src/testing/index.ts +0 -3
  254. package/src/testing/service-tests/agent-run-service-tests.ts +0 -98
  255. package/src/testing/service-tests/agent-storage-service-tests.ts +0 -379
  256. package/src/testing/service-tests/channel-store-tests.ts +0 -98
  257. package/src/testing/service-tests/credential-service-tests.ts +0 -143
  258. package/src/testing/service-tests/deployment-service-tests.ts +0 -33
  259. package/src/testing/service-tests/event-hub-store-tests.ts +0 -48
  260. package/src/testing/service-tests/secret-service-tests.ts +0 -105
  261. package/src/testing/service-tests/session-store-tests.ts +0 -62
  262. package/src/testing/service-tests/workflow-run-service-tests.ts +0 -59
  263. package/src/testing/service-tests/workflow-service-tests.ts +0 -308
  264. package/src/testing/service-tests.ts +0 -95
  265. package/src/time-utils.test.ts +0 -56
  266. package/src/time-utils.ts +0 -89
  267. package/src/types/core.types.ts +0 -446
  268. package/src/types/index.ts +0 -25
  269. package/src/types/state.types.ts +0 -226
  270. package/src/types/typed-credentials.test.ts +0 -72
  271. package/src/utils/hash.test.ts +0 -68
  272. package/src/utils/hash.ts +0 -26
  273. package/src/utils/hmac.ts +0 -21
  274. package/src/utils/node-host-resolver.ts +0 -20
  275. package/src/utils/safe-fetch.test.ts +0 -515
  276. package/src/utils/safe-fetch.ts +0 -347
  277. package/src/utils.test.ts +0 -359
  278. package/src/utils.ts +0 -165
  279. package/src/version.test.ts +0 -80
  280. package/src/version.ts +0 -25
  281. package/src/wirings/actor-flow/actor-flow.types.ts +0 -40
  282. package/src/wirings/actor-flow/index.ts +0 -10
  283. package/src/wirings/actor-flow/run-conversation.test.ts +0 -187
  284. package/src/wirings/actor-flow/run-conversation.ts +0 -280
  285. package/src/wirings/addon/addon-auth-tags.test.ts +0 -219
  286. package/src/wirings/addon/addon-runner.ts +0 -236
  287. package/src/wirings/addon/addon-scopes.test.ts +0 -225
  288. package/src/wirings/addon/addon-secrets.test.ts +0 -391
  289. package/src/wirings/addon/index.ts +0 -12
  290. package/src/wirings/addon/remote-addon-auth.ts +0 -65
  291. package/src/wirings/addon/wire-addon.test.ts +0 -102
  292. package/src/wirings/addon/wire-addon.ts +0 -202
  293. package/src/wirings/addon/wire-remote-addon.ts +0 -41
  294. package/src/wirings/agent/agent-agui.test.ts +0 -1213
  295. package/src/wirings/agent/agent-agui.ts +0 -405
  296. package/src/wirings/agent/agent-authorization.test.ts +0 -208
  297. package/src/wirings/agent/agent-finalize.test.ts +0 -187
  298. package/src/wirings/agent/agent-finalize.ts +0 -197
  299. package/src/wirings/agent/agent-helpers.test.ts +0 -215
  300. package/src/wirings/agent/agent-helpers.ts +0 -96
  301. package/src/wirings/agent/agent-interrupt.test.ts +0 -833
  302. package/src/wirings/agent/agent-interrupt.ts +0 -400
  303. package/src/wirings/agent/agent-memory.test.ts +0 -397
  304. package/src/wirings/agent/agent-memory.ts +0 -496
  305. package/src/wirings/agent/agent-middleware.types.test.ts +0 -41
  306. package/src/wirings/agent/agent-model-config.test.ts +0 -103
  307. package/src/wirings/agent/agent-model-config.ts +0 -59
  308. package/src/wirings/agent/agent-prepare.test.ts +0 -977
  309. package/src/wirings/agent/agent-prepare.ts +0 -1083
  310. package/src/wirings/agent/agent-registry.test.ts +0 -455
  311. package/src/wirings/agent/agent-registry.ts +0 -99
  312. package/src/wirings/agent/agent-resume-authorization.test.ts +0 -206
  313. package/src/wirings/agent/agent-rpc.ts +0 -116
  314. package/src/wirings/agent/agent-runner.test.ts +0 -1229
  315. package/src/wirings/agent/agent-runner.ts +0 -858
  316. package/src/wirings/agent/agent-stream-delegate.test.ts +0 -381
  317. package/src/wirings/agent/agent-stream-output-hooks.test.ts +0 -353
  318. package/src/wirings/agent/agent-stream.test.ts +0 -1800
  319. package/src/wirings/agent/agent-stream.ts +0 -1639
  320. package/src/wirings/agent/agent-thread-ownership.test.ts +0 -297
  321. package/src/wirings/agent/agent-turn.test.ts +0 -65
  322. package/src/wirings/agent/agent-turn.ts +0 -122
  323. package/src/wirings/agent/agent-utils.ts +0 -20
  324. package/src/wirings/agent/agent.types.ts +0 -676
  325. package/src/wirings/agent/index.ts +0 -58
  326. package/src/wirings/agent/voice-input.test.ts +0 -220
  327. package/src/wirings/agent/voice-input.ts +0 -180
  328. package/src/wirings/agent/voice-output.test.ts +0 -510
  329. package/src/wirings/agent/voice-output.ts +0 -311
  330. package/src/wirings/agent-scorer/agent-scorer-grade.test.ts +0 -106
  331. package/src/wirings/agent-scorer/agent-scorer-grade.ts +0 -55
  332. package/src/wirings/agent-scorer/agent-scorer-judge.test.ts +0 -285
  333. package/src/wirings/agent-scorer/agent-scorer-judge.ts +0 -180
  334. package/src/wirings/agent-scorer/agent-scorer-live.test.ts +0 -174
  335. package/src/wirings/agent-scorer/agent-scorer-live.ts +0 -56
  336. package/src/wirings/agent-scorer/agent-scorer-registry.ts +0 -66
  337. package/src/wirings/agent-scorer/agent-scorer-sampling.test.ts +0 -34
  338. package/src/wirings/agent-scorer/agent-scorer-sampling.ts +0 -36
  339. package/src/wirings/agent-scorer/agent-scorer-snapshots.test.ts +0 -49
  340. package/src/wirings/agent-scorer/agent-scorer-snapshots.ts +0 -46
  341. package/src/wirings/agent-scorer/agent-scorer-worker.test.ts +0 -122
  342. package/src/wirings/agent-scorer/agent-scorer-worker.ts +0 -71
  343. package/src/wirings/agent-scorer/agent-scorer.ts +0 -102
  344. package/src/wirings/agent-scorer/agent-scorer.types.ts +0 -128
  345. package/src/wirings/agent-scorer/index.ts +0 -23
  346. package/src/wirings/channel/channel-common.ts +0 -102
  347. package/src/wirings/channel/channel-handler-shapes.test.ts +0 -72
  348. package/src/wirings/channel/channel-handler.test.ts +0 -322
  349. package/src/wirings/channel/channel-handler.ts +0 -259
  350. package/src/wirings/channel/channel-host-rpc.test.ts +0 -150
  351. package/src/wirings/channel/channel-host-rpc.ts +0 -69
  352. package/src/wirings/channel/channel-middleware-runner.test.ts +0 -188
  353. package/src/wirings/channel/channel-middleware-runner.ts +0 -126
  354. package/src/wirings/channel/channel-rpc-registry.ts +0 -116
  355. package/src/wirings/channel/channel-rpc-responder.ts +0 -117
  356. package/src/wirings/channel/channel-rpc-service.ts +0 -132
  357. package/src/wirings/channel/channel-rpc-validators.ts +0 -65
  358. package/src/wirings/channel/channel-rpc.test.ts +0 -841
  359. package/src/wirings/channel/channel-rpc.ts +0 -5
  360. package/src/wirings/channel/channel-rpc.types.ts +0 -160
  361. package/src/wirings/channel/channel-runner.ts +0 -164
  362. package/src/wirings/channel/channel-store.ts +0 -35
  363. package/src/wirings/channel/channel.types.ts +0 -193
  364. package/src/wirings/channel/define-channel-routes.ts +0 -5
  365. package/src/wirings/channel/eventhub-service.ts +0 -16
  366. package/src/wirings/channel/eventhub-store.ts +0 -13
  367. package/src/wirings/channel/index.ts +0 -40
  368. package/src/wirings/channel/local/index.ts +0 -3
  369. package/src/wirings/channel/local/local-channel-handler.ts +0 -98
  370. package/src/wirings/channel/local/local-channel-runner.test.ts +0 -339
  371. package/src/wirings/channel/local/local-channel-runner.ts +0 -271
  372. package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -77
  373. package/src/wirings/channel/local/local-eventhub-service.ts +0 -69
  374. package/src/wirings/channel/log-channels.ts +0 -16
  375. package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +0 -135
  376. package/src/wirings/channel/pikku-abstract-channel-handler.ts +0 -60
  377. package/src/wirings/channel/serverless/index.ts +0 -6
  378. package/src/wirings/channel/serverless/serverless-channel-runner.ts +0 -328
  379. package/src/wirings/cli/channel/cli-approval.test.ts +0 -177
  380. package/src/wirings/cli/channel/cli-approval.ts +0 -135
  381. package/src/wirings/cli/channel/cli-channel-runner.ts +0 -118
  382. package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +0 -192
  383. package/src/wirings/cli/channel/cli-raw-channel-runner.ts +0 -148
  384. package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +0 -480
  385. package/src/wirings/cli/channel/cli-raw-client-runner.ts +0 -188
  386. package/src/wirings/cli/channel/index.ts +0 -6
  387. package/src/wirings/cli/cli-runner.test.ts +0 -969
  388. package/src/wirings/cli/cli-runner.ts +0 -538
  389. package/src/wirings/cli/cli.types.ts +0 -388
  390. package/src/wirings/cli/command-parser.test.ts +0 -1120
  391. package/src/wirings/cli/command-parser.ts +0 -713
  392. package/src/wirings/cli/define-cli-commands.ts +0 -13
  393. package/src/wirings/cli/format-cli-error.test.ts +0 -91
  394. package/src/wirings/cli/format-cli-error.ts +0 -96
  395. package/src/wirings/cli/index.ts +0 -19
  396. package/src/wirings/credential/credential.types.ts +0 -37
  397. package/src/wirings/credential/define-credential.ts +0 -49
  398. package/src/wirings/credential/index.ts +0 -7
  399. package/src/wirings/credential/validate-credential-definitions.ts +0 -63
  400. package/src/wirings/gateway/gateway-authorization.test.ts +0 -575
  401. package/src/wirings/gateway/gateway-channel-meta.test.ts +0 -44
  402. package/src/wirings/gateway/gateway-runner.test.ts +0 -581
  403. package/src/wirings/gateway/gateway-runner.ts +0 -411
  404. package/src/wirings/gateway/gateway.types.ts +0 -137
  405. package/src/wirings/gateway/index.ts +0 -15
  406. package/src/wirings/http/http-routes.test.ts +0 -318
  407. package/src/wirings/http/http-routes.ts +0 -111
  408. package/src/wirings/http/http-runner-addon-ref.test.ts +0 -238
  409. package/src/wirings/http/http-runner.test.ts +0 -503
  410. package/src/wirings/http/http-runner.ts +0 -462
  411. package/src/wirings/http/http.types.ts +0 -307
  412. package/src/wirings/http/index.ts +0 -27
  413. package/src/wirings/http/log-http-routes.ts +0 -18
  414. package/src/wirings/http/pikku-fetch-http-request.test.ts +0 -318
  415. package/src/wirings/http/pikku-fetch-http-request.ts +0 -260
  416. package/src/wirings/http/pikku-fetch-http-response.test.ts +0 -123
  417. package/src/wirings/http/pikku-fetch-http-response.ts +0 -149
  418. package/src/wirings/http/routers/http-router.ts +0 -13
  419. package/src/wirings/http/routers/path-to-regex.test.ts +0 -306
  420. package/src/wirings/http/routers/path-to-regex.ts +0 -115
  421. package/src/wirings/http/web-request.test.ts +0 -382
  422. package/src/wirings/http/web-request.ts +0 -162
  423. package/src/wirings/mcp/index.ts +0 -26
  424. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -388
  425. package/src/wirings/mcp/mcp-endpoint-registry.ts +0 -159
  426. package/src/wirings/mcp/mcp-runner.test.ts +0 -588
  427. package/src/wirings/mcp/mcp-runner.ts +0 -330
  428. package/src/wirings/mcp/mcp.types.ts +0 -199
  429. package/src/wirings/node/index.ts +0 -2
  430. package/src/wirings/node/node.types.ts +0 -23
  431. package/src/wirings/oauth2/index.ts +0 -1
  432. package/src/wirings/oauth2/oauth2.types.ts +0 -12
  433. package/src/wirings/persona/define-personas.ts +0 -33
  434. package/src/wirings/persona/index.ts +0 -75
  435. package/src/wirings/persona/persona-app-scopes.test.ts +0 -47
  436. package/src/wirings/persona/persona-app-scopes.ts +0 -74
  437. package/src/wirings/persona/persona-email.ts +0 -87
  438. package/src/wirings/persona/persona-environments.test.ts +0 -194
  439. package/src/wirings/persona/persona-environments.ts +0 -138
  440. package/src/wirings/persona/persona-mailbox.ts +0 -156
  441. package/src/wirings/persona/persona.test.ts +0 -230
  442. package/src/wirings/persona/persona.types.ts +0 -156
  443. package/src/wirings/persona/validate-personas.ts +0 -137
  444. package/src/wirings/queue/index.ts +0 -29
  445. package/src/wirings/queue/queue-identity.test.ts +0 -454
  446. package/src/wirings/queue/queue-identity.ts +0 -176
  447. package/src/wirings/queue/queue-runner.test.ts +0 -705
  448. package/src/wirings/queue/queue-runner.ts +0 -181
  449. package/src/wirings/queue/queue.types.ts +0 -161
  450. package/src/wirings/queue/register-queue-helper.ts +0 -46
  451. package/src/wirings/queue/signed-queue-service.ts +0 -60
  452. package/src/wirings/queue/validate-worker-config.test.ts +0 -108
  453. package/src/wirings/queue/validate-worker-config.ts +0 -90
  454. package/src/wirings/role/define-system-role.ts +0 -33
  455. package/src/wirings/role/index.ts +0 -13
  456. package/src/wirings/role/role.test.ts +0 -104
  457. package/src/wirings/role/role.types.ts +0 -47
  458. package/src/wirings/role/validate-role-definitions.ts +0 -93
  459. package/src/wirings/rpc/index.ts +0 -8
  460. package/src/wirings/rpc/rpc-runner.test.ts +0 -1130
  461. package/src/wirings/rpc/rpc-runner.ts +0 -566
  462. package/src/wirings/rpc/rpc-types.ts +0 -87
  463. package/src/wirings/scheduler/index.ts +0 -11
  464. package/src/wirings/scheduler/log-schedulers.ts +0 -16
  465. package/src/wirings/scheduler/scheduler-runner.test.ts +0 -835
  466. package/src/wirings/scheduler/scheduler-runner.ts +0 -138
  467. package/src/wirings/scheduler/scheduler.types.ts +0 -42
  468. package/src/wirings/scope/define-scope.ts +0 -33
  469. package/src/wirings/scope/index.ts +0 -15
  470. package/src/wirings/scope/scope.test.ts +0 -159
  471. package/src/wirings/scope/scope.types.ts +0 -42
  472. package/src/wirings/scope/validate-scope-definitions.ts +0 -107
  473. package/src/wirings/secret/index.ts +0 -9
  474. package/src/wirings/secret/secret.types.ts +0 -70
  475. package/src/wirings/secret/validate-secret-definitions.test.ts +0 -232
  476. package/src/wirings/secret/validate-secret-definitions.ts +0 -88
  477. package/src/wirings/trigger/index.ts +0 -9
  478. package/src/wirings/trigger/pikku-trigger-service.ts +0 -107
  479. package/src/wirings/trigger/trigger-runner.test.ts +0 -78
  480. package/src/wirings/trigger/trigger-runner.ts +0 -113
  481. package/src/wirings/trigger/trigger.types.ts +0 -100
  482. package/src/wirings/variable/index.ts +0 -8
  483. package/src/wirings/variable/validate-variable-definitions.test.ts +0 -115
  484. package/src/wirings/variable/validate-variable-definitions.ts +0 -71
  485. package/src/wirings/variable/variable.types.ts +0 -40
  486. package/src/wirings/virtual-user/index.ts +0 -107
  487. package/src/wirings/virtual-user/prepare-virtual-user-run.test.ts +0 -115
  488. package/src/wirings/virtual-user/prepare-virtual-user-run.ts +0 -95
  489. package/src/wirings/virtual-user/run-virtual-user.test.ts +0 -774
  490. package/src/wirings/virtual-user/run-virtual-user.ts +0 -684
  491. package/src/wirings/virtual-user/virtual-user-agents.test.ts +0 -72
  492. package/src/wirings/virtual-user/virtual-user-agents.ts +0 -62
  493. package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +0 -215
  494. package/src/wirings/virtual-user/virtual-user-catalogue.ts +0 -184
  495. package/src/wirings/virtual-user/virtual-user-derive.test.ts +0 -426
  496. package/src/wirings/virtual-user/virtual-user-derive.ts +0 -161
  497. package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +0 -68
  498. package/src/wirings/virtual-user/virtual-user-dispositions.ts +0 -210
  499. package/src/wirings/virtual-user/virtual-user-intents.test.ts +0 -218
  500. package/src/wirings/virtual-user/virtual-user-intents.ts +0 -185
  501. package/src/wirings/virtual-user/virtual-user-rng.test.ts +0 -72
  502. package/src/wirings/virtual-user/virtual-user-rng.ts +0 -50
  503. package/src/wirings/virtual-user/virtual-user-run-store.ts +0 -131
  504. package/src/wirings/virtual-user/virtual-user-scaffold.test.ts +0 -854
  505. package/src/wirings/virtual-user/virtual-user-scaffold.ts +0 -664
  506. package/src/wirings/virtual-user/virtual-user-schedule-store.ts +0 -93
  507. package/src/wirings/virtual-user/virtual-user-schedule.test.ts +0 -280
  508. package/src/wirings/virtual-user/virtual-user-schedule.ts +0 -156
  509. package/src/wirings/virtual-user/virtual-user-target.ts +0 -47
  510. package/src/wirings/virtual-user/virtual-user.types.ts +0 -215
  511. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +0 -709
  512. package/src/wirings/workflow/dsl/workflow-runner.ts +0 -25
  513. package/src/wirings/workflow/feature.test.ts +0 -131
  514. package/src/wirings/workflow/feature.ts +0 -59
  515. package/src/wirings/workflow/graph/graph-foreach-queued.test.ts +0 -569
  516. package/src/wirings/workflow/graph/graph-foreach.test.ts +0 -626
  517. package/src/wirings/workflow/graph/graph-node.ts +0 -115
  518. package/src/wirings/workflow/graph/graph-runner.test.ts +0 -1049
  519. package/src/wirings/workflow/graph/graph-runner.ts +0 -1376
  520. package/src/wirings/workflow/graph/graph-validation.test.ts +0 -27
  521. package/src/wirings/workflow/graph/graph-validation.ts +0 -41
  522. package/src/wirings/workflow/graph/template.test.ts +0 -49
  523. package/src/wirings/workflow/graph/template.ts +0 -42
  524. package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -39
  525. package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -75
  526. package/src/wirings/workflow/index.ts +0 -107
  527. package/src/wirings/workflow/pikku-scenario-service.ts +0 -1013
  528. package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -963
  529. package/src/wirings/workflow/pikku-workflow-service.ts +0 -1993
  530. package/src/wirings/workflow/run-timeline.test.ts +0 -199
  531. package/src/wirings/workflow/run-timeline.ts +0 -185
  532. package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -107
  533. package/src/wirings/workflow/scenario-cookie-jar.ts +0 -57
  534. package/src/wirings/workflow/scenario-expectations.test.ts +0 -238
  535. package/src/wirings/workflow/scenario-hooks.test.ts +0 -259
  536. package/src/wirings/workflow/scenario-poll.test.ts +0 -64
  537. package/src/wirings/workflow/scenario-poll.ts +0 -27
  538. package/src/wirings/workflow/scenario-prose.test.ts +0 -275
  539. package/src/wirings/workflow/scenario-prose.ts +0 -86
  540. package/src/wirings/workflow/scenario-run.types.ts +0 -193
  541. package/src/wirings/workflow/scenario-service.test.ts +0 -147
  542. package/src/wirings/workflow/scenario-step-guards.ts +0 -23
  543. package/src/wirings/workflow/scenario-step.test.ts +0 -800
  544. package/src/wirings/workflow/scenario-step.types.ts +0 -262
  545. package/src/wirings/workflow/scenario-surface.test.ts +0 -146
  546. package/src/wirings/workflow/scenario-surface.ts +0 -71
  547. package/src/wirings/workflow/scenario.types.ts +0 -63
  548. package/src/wirings/workflow/workflow-approval-audit.ts +0 -47
  549. package/src/wirings/workflow/workflow-approval-policy.test.ts +0 -594
  550. package/src/wirings/workflow/workflow-approval-policy.ts +0 -68
  551. package/src/wirings/workflow/workflow-approval.ts +0 -290
  552. package/src/wirings/workflow/workflow-child-run-session.test.ts +0 -168
  553. package/src/wirings/workflow/workflow-constants.ts +0 -66
  554. package/src/wirings/workflow/workflow-dispatch-durability.test.ts +0 -116
  555. package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -55
  556. package/src/wirings/workflow/workflow-dispatch-relay.test.ts +0 -128
  557. package/src/wirings/workflow/workflow-errors.ts +0 -132
  558. package/src/wirings/workflow/workflow-inline-authority.test.ts +0 -175
  559. package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -51
  560. package/src/wirings/workflow/workflow-invocation-id.ts +0 -28
  561. package/src/wirings/workflow/workflow-meta-resolver.ts +0 -45
  562. package/src/wirings/workflow/workflow-mirror.test.ts +0 -171
  563. package/src/wirings/workflow/workflow-missing-meta.test.ts +0 -92
  564. package/src/wirings/workflow/workflow-on-error.test.ts +0 -145
  565. package/src/wirings/workflow/workflow-queue-routing.ts +0 -129
  566. package/src/wirings/workflow/workflow-queue-wiring.ts +0 -149
  567. package/src/wirings/workflow/workflow-queue-workers.test.ts +0 -131
  568. package/src/wirings/workflow/workflow-queue-workers.ts +0 -66
  569. package/src/wirings/workflow/workflow-recovery.ts +0 -192
  570. package/src/wirings/workflow/workflow-replay-snapshot.test.ts +0 -140
  571. package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -113
  572. package/src/wirings/workflow/workflow-run-authority.test.ts +0 -212
  573. package/src/wirings/workflow/workflow-run-context.test.ts +0 -172
  574. package/src/wirings/workflow/workflow-run-engine.types.ts +0 -92
  575. package/src/wirings/workflow/workflow-run-ownership.ts +0 -37
  576. package/src/wirings/workflow/workflow-run-polling.test.ts +0 -127
  577. package/src/wirings/workflow/workflow-stalled-recovery.test.ts +0 -152
  578. package/src/wirings/workflow/workflow-status-stream.test.ts +0 -354
  579. package/src/wirings/workflow/workflow-status-stream.ts +0 -144
  580. package/src/wirings/workflow/workflow-step-claim.ts +0 -46
  581. package/src/wirings/workflow/workflow-step-ordinal.test.ts +0 -94
  582. package/src/wirings/workflow/workflow-step-session.test.ts +0 -87
  583. package/src/wirings/workflow/workflow-suspend.ts +0 -61
  584. package/src/wirings/workflow/workflow-terminal-run-guard.test.ts +0 -105
  585. package/src/wirings/workflow/workflow.types.ts +0 -268
  586. package/src/wirings-stay-decoupled.test.ts +0 -130
  587. package/tsconfig.json +0 -14
  588. package/tsconfig.tsbuildinfo +0 -1
  589. package/tsconfig.type-tests.json +0 -15
@@ -1,275 +0,0 @@
1
- import { describe, test } from 'node:test'
2
- import assert from 'node:assert/strict'
3
-
4
- import { composeStepProse, renderStepTemplate } from './scenario-prose.js'
5
-
6
- describe('renderStepTemplate', () => {
7
- test('substitutes the step input into its placeholders', () => {
8
- assert.equal(
9
- renderStepTemplate('sees {packageName}', {
10
- packageName: '@pikku/addon-stripe',
11
- }),
12
- 'sees @pikku/addon-stripe'
13
- )
14
- })
15
-
16
- test('renders numbers and booleans as words rather than JSON', () => {
17
- assert.equal(
18
- renderStepTemplate('sees at least {atLeast} addons, listed {listed}', {
19
- atLeast: 10,
20
- listed: true,
21
- }),
22
- 'sees at least 10 addons, listed true'
23
- )
24
- })
25
-
26
- test('an absent optional value leaves no gap in the sentence', () => {
27
- assert.equal(
28
- renderStepTemplate('sees {packageName} {state}', {
29
- packageName: '@pikku/addon-stripe',
30
- }),
31
- 'sees @pikku/addon-stripe'
32
- )
33
- })
34
-
35
- test('a placeholder repeated in the template is substituted each time', () => {
36
- assert.equal(
37
- renderStepTemplate('searches {query} and sees {query}', {
38
- query: 'stripe',
39
- }),
40
- 'searches stripe and sees stripe'
41
- )
42
- })
43
-
44
- test('a non-primitive value is serialised compactly', () => {
45
- assert.equal(
46
- renderStepTemplate('sends {payload}', { payload: { a: 1 } }),
47
- 'sends {"a":1}'
48
- )
49
- })
50
-
51
- test('no recorded input leaves the template legible rather than half-rendered', () => {
52
- assert.equal(renderStepTemplate('sees {packageName}', undefined), 'sees')
53
- })
54
- })
55
-
56
- describe('composeStepProse', () => {
57
- test('renders a template against the step input in place of the description', () => {
58
- assert.equal(
59
- composeStepProse({
60
- phase: 'then',
61
- description: 'sees an addon in the gallery',
62
- template: 'sees {packageName}',
63
- input: { packageName: '@pikku/addon-todos' },
64
- actor: 'admin',
65
- }),
66
- 'Then admin sees @pikku/addon-todos'
67
- )
68
- })
69
-
70
- test('falls back to the description when the step declares no template', () => {
71
- assert.equal(
72
- composeStepProse({
73
- phase: 'then',
74
- description: 'sees an addon in the gallery',
75
- input: { packageName: '@pikku/addon-todos' },
76
- actor: 'admin',
77
- }),
78
- 'Then admin sees an addon in the gallery'
79
- )
80
- })
81
- })
82
-
83
- describe('composeStepProse with an actor role', () => {
84
- test('the role renders as an apposition after the actor', () => {
85
- assert.equal(
86
- composeStepProse({
87
- phase: 'given',
88
- description: 'signs in',
89
- actor: 'yasser',
90
- actorRole: 'founder',
91
- }),
92
- 'Given yasser (the founder) signs in'
93
- )
94
- })
95
-
96
- test('no role renders exactly as it did before', () => {
97
- assert.equal(
98
- composeStepProse({
99
- phase: 'given',
100
- description: 'signs in',
101
- actor: 'yasser',
102
- }),
103
- 'Given yasser signs in'
104
- )
105
- })
106
-
107
- test('a role without an actor has nothing to qualify, so it is dropped', () => {
108
- assert.equal(
109
- composeStepProse({
110
- phase: 'then',
111
- description: 'the receipt totals 4.50',
112
- actorRole: 'founder',
113
- }),
114
- 'Then the receipt totals 4.50'
115
- )
116
- })
117
-
118
- test('the role sits inside the padded sentence, not the keyword column', () => {
119
- assert.equal(
120
- composeStepProse({
121
- phase: 'when',
122
- description: 'opens /app',
123
- actor: 'nadia',
124
- actorRole: 'head of ops',
125
- keywordWidth: 5,
126
- }),
127
- 'When nadia (the head of ops) opens /app'
128
- )
129
- })
130
- })
131
-
132
- describe('composeStepProse continuations', () => {
133
- test('a repeated phase reads as And', () => {
134
- assert.equal(
135
- composeStepProse({
136
- phase: 'given',
137
- description: 'is invited',
138
- actor: 'nadia',
139
- continuesPhase: true,
140
- }),
141
- 'And nadia is invited'
142
- )
143
- })
144
-
145
- test('the same actor continuing drops the repeated subject', () => {
146
- assert.equal(
147
- composeStepProse({
148
- phase: 'when',
149
- description: 'sees the audit log',
150
- actor: 'yasser',
151
- continuesPhase: true,
152
- continuesActor: true,
153
- }),
154
- 'And sees the audit log'
155
- )
156
- })
157
-
158
- test('a new actor keeps their name even under And', () => {
159
- assert.equal(
160
- composeStepProse({
161
- phase: 'given',
162
- description: 'is invited',
163
- actor: 'nadia',
164
- continuesPhase: true,
165
- continuesActor: false,
166
- }),
167
- 'And nadia is invited'
168
- )
169
- })
170
-
171
- test('the same actor across a phase change keeps the subject', () => {
172
- assert.equal(
173
- composeStepProse({
174
- phase: 'when',
175
- description: 'opens the dashboard',
176
- actor: 'yasser',
177
- continuesActor: true,
178
- }),
179
- 'When yasser opens the dashboard'
180
- )
181
- })
182
-
183
- test('an introduction is never dropped by a continuation', () => {
184
- assert.equal(
185
- composeStepProse({
186
- phase: 'given',
187
- description: 'is invited',
188
- actor: 'nadia',
189
- actorRole: 'reviewer',
190
- continuesPhase: true,
191
- }),
192
- 'And nadia (the reviewer) is invited'
193
- )
194
- })
195
- })
196
-
197
- describe('composeStepProse basics', () => {
198
- test('renders the gherkin keyword, the actor and the description', () => {
199
- assert.equal(
200
- composeStepProse({
201
- phase: 'given',
202
- description: 'buys an apple',
203
- actor: 'shopper',
204
- }),
205
- 'Given shopper buys an apple'
206
- )
207
- assert.equal(
208
- composeStepProse({
209
- phase: 'then',
210
- description: 'sees a receipt',
211
- actor: 'shopper',
212
- }),
213
- 'Then shopper sees a receipt'
214
- )
215
- })
216
-
217
- test('a persona named after a person reads as that person', () => {
218
- assert.equal(
219
- composeStepProse({
220
- phase: 'when',
221
- description: 'opens /app',
222
- actor: 'nadia',
223
- }),
224
- 'When nadia opens /app'
225
- )
226
- })
227
-
228
- test('an actorless step reads as a plain sentence', () => {
229
- assert.equal(
230
- composeStepProse({
231
- phase: 'given',
232
- description: 'the app data is reset',
233
- }),
234
- 'Given the app data is reset'
235
- )
236
- })
237
-
238
- test('every phase renders its keyword', () => {
239
- assert.equal(
240
- composeStepProse({
241
- phase: 'when',
242
- description: 'refreshes the dashboard',
243
- actor: 'admin',
244
- }),
245
- 'When admin refreshes the dashboard'
246
- )
247
- })
248
-
249
- test('a keyword width lines the sentences up under each other', () => {
250
- const rendered = (
251
- [
252
- { phase: 'given', description: 'buys an apple' },
253
- { phase: 'when', description: 'checks out' },
254
- { phase: 'then', description: 'sees a receipt' },
255
- ] as const
256
- ).map((step) =>
257
- composeStepProse({ ...step, actor: 'shopper', keywordWidth: 5 })
258
- )
259
-
260
- assert.deepEqual(rendered, [
261
- 'Given shopper buys an apple',
262
- 'When shopper checks out',
263
- 'Then shopper sees a receipt',
264
- ])
265
- const columns = new Set(rendered.map((line) => line.indexOf('shopper')))
266
- assert.equal(columns.size, 1, 'every sentence starts in the same column')
267
- })
268
-
269
- test('prose degrades to just the description when nothing else is known', () => {
270
- assert.equal(
271
- composeStepProse({ phase: 'when', description: 'does the thing' }),
272
- 'When does the thing'
273
- )
274
- })
275
- })
@@ -1,86 +0,0 @@
1
- import type { ScenarioStepPhase } from './scenario-step.types.js'
2
-
3
- export const renderStepTemplate = (
4
- template: string,
5
- input: unknown
6
- ): string => {
7
- const values =
8
- input && typeof input === 'object' ? (input as Record<string, unknown>) : {}
9
- return template
10
- .replace(/\{(\w+)\}/g, (_match, key: string) => formatValue(values[key]))
11
- .replace(/\s+/g, ' ')
12
- .trim()
13
- }
14
-
15
- const formatValue = (value: unknown): string => {
16
- if (value === undefined || value === null) {
17
- return ''
18
- }
19
- if (typeof value === 'object') {
20
- return JSON.stringify(value)
21
- }
22
- return String(value)
23
- }
24
-
25
- export const composeStepProse = ({
26
- phase,
27
- description,
28
- template,
29
- input,
30
- actor,
31
- actorRole,
32
- continuesPhase,
33
- continuesActor,
34
- keywordWidth,
35
- }: {
36
- phase: ScenarioStepPhase
37
- description: string
38
- template?: string
39
- input?: unknown
40
- actor?: string
41
- /**
42
- * What this actor is, rendered as an apposition after their key — "yasser
43
- * (the founder)". Only pass it where the actor has not been named yet: an
44
- * ordinary run repeats one actor for a dozen steps, and repeating the role
45
- * with them turns the one piece of context into the noise around it.
46
- */
47
- actorRole?: string
48
- /**
49
- * This step repeats the phase of the one before it, so it reads as `And`
50
- * rather than saying `Given` three times — the same thing Gherkin does.
51
- */
52
- continuesPhase?: boolean
53
- /**
54
- * The step before this one had the same actor. Combined with `continuesPhase`
55
- * the subject is dropped, because English drops a repeated subject in a
56
- * compound predicate: "yasser opens the dashboard / and sees the audit log".
57
- *
58
- * It takes both. Dropping the subject across a phase change gives "When opens
59
- * the dashboard", and a pronoun instead of a name would give "they sees",
60
- * since step templates are authored in the third person singular.
61
- */
62
- continuesActor?: boolean
63
- keywordWidth?: number
64
- }): string => {
65
- const keyword = capitalise(continuesPhase ? 'and' : phase)
66
- // The actor key is the subject verbatim, with no article in front of it.
67
- // "the ${actor}" only reads as English when the key happens to be a role
68
- // noun — it turns a persona named after a person into "the nadia", which
69
- // is the reporter quietly imposing a naming convention on the author.
70
- const subject =
71
- continuesPhase && continuesActor ? '' : composeSubject(actor, actorRole)
72
- const rendered = template ? renderStepTemplate(template, input) : description
73
- const sentence = [subject, rendered].filter(Boolean).join(' ')
74
- if (keywordWidth === undefined) {
75
- return [keyword, sentence].filter(Boolean).join(' ')
76
- }
77
- return `${keyword.padEnd(keywordWidth)} ${sentence}`
78
- }
79
-
80
- const composeSubject = (actor?: string, actorRole?: string): string => {
81
- if (!actor) return ''
82
- return actorRole ? `${actor} (the ${actorRole})` : actor
83
- }
84
-
85
- const capitalise = (value: string) =>
86
- value.charAt(0).toUpperCase() + value.slice(1)
@@ -1,193 +0,0 @@
1
- /**
2
- * What one `pikku scenario run` leaves behind.
3
- *
4
- * A run is history: the scenarios it selected, the sentences they were made of,
5
- * and the images and footage they produced. The sentences are snapshotted into
6
- * the record rather than looked up later, because a scenario is code and the
7
- * code moves — a run from last week describes a suite that no longer exists,
8
- * and re-deriving its ladder from today's source would quietly rewrite it.
9
- *
10
- * Everything here is plain serialisable data. That is what lets one record be
11
- * a JSON file on disk in OSS and a row in Postgres on a hosted project, read
12
- * back by the same console screen either way.
13
- */
14
- import type { ScenarioBrowserFailure } from './scenario-step.types.js'
15
-
16
- /** What a run filed, in the order it filed it. */
17
- export type ScenarioArtifactKind = 'screenshot' | 'failure' | 'video'
18
-
19
- /**
20
- * One image or recording a scenario produced.
21
- *
22
- * `path` is relative to the run's artifact root and always uses forward
23
- * slashes: it is a content key, not a filesystem path. Locally it resolves
24
- * under the run's directory; on a hosted project it is the object key in a
25
- * bucket, and the same record works unchanged.
26
- */
27
- export interface ScenarioArtifact {
28
- /** The scenario label this belongs to, as the report names it. */
29
- scenario: string
30
- kind: ScenarioArtifactKind
31
- path: string
32
- /** Whose window it was — a two-actor scenario produces two of everything. */
33
- actor?: string
34
- /** The caption the scenario author took a screenshot under. */
35
- name?: string
36
- }
37
-
38
- /** One step of a run, already joined to the prose that declared it. */
39
- export interface ScenarioStepRow {
40
- sentence: string
41
- /**
42
- * The same sentence with the actor's role in it — "yasser (the founder)
43
- * signs in". Set only on the step that first names each actor, and only
44
- * when a persona declares a job title or a role, so a reader who wants the
45
- * context picks this and one who wants the bare run picks `sentence`.
46
- */
47
- sentenceWithRole?: string
48
- status: string
49
- durationMs?: number
50
- error?: string
51
- }
52
-
53
- /** Everything known about why one scenario failed. */
54
- export interface ScenarioFailureDetail {
55
- /** The rendered sentence of the failing step; absent if no step failed. */
56
- sentence?: string
57
- message: string
58
- stack?: string
59
- /**
60
- * True when the failure was a deliberate one (a PikkuError). Its message is
61
- * the whole story, so the stack is noise.
62
- */
63
- expected?: boolean
64
- browser?: ScenarioBrowserFailure[]
65
- }
66
-
67
- export interface ScenarioResult {
68
- name: string
69
- status: 'passed' | 'failed'
70
- durationMs: number
71
- output?: unknown
72
- error?: string
73
- steps?: ScenarioStepRow[]
74
- failure?: ScenarioFailureDetail
75
- /** The scenario registration this ran, which the label alone does not give. */
76
- scenarioName?: string
77
- /** The feature that grouped it, when one did. */
78
- feature?: string
79
- tags?: string[]
80
- /** Images and footage this scenario produced, filed under the run. */
81
- artifacts?: ScenarioArtifact[]
82
- }
83
-
84
- /** One scenario that was not run, and why. */
85
- export interface ScenarioSkip {
86
- name: string
87
- reason: string
88
- }
89
-
90
- export interface ScenarioRunReport {
91
- environment: string
92
- results: ScenarioResult[]
93
- /**
94
- * Scenarios not run at all, each carrying why. A skip is only useful if the
95
- * reader can tell a browser scenario held back by `--no-browser` from one the
96
- * project itself quarantined, so the reason travels with the name rather than
97
- * being assumed by the formatter.
98
- */
99
- skipped: ScenarioSkip[]
100
- /** Feature-level hook failures, which belong to no single scenario. */
101
- hookFailures: string[]
102
- }
103
-
104
- export type ScenarioRunStatus = 'running' | 'passed' | 'failed'
105
-
106
- /**
107
- * A whole run, as it is stored and read back.
108
- *
109
- * `status` is `running` from the moment the run is created until it finishes,
110
- * so a console watching a run in progress can tell "still going" from "nothing
111
- * came back" — and a run killed halfway stays `running` forever, which is the
112
- * honest record of what happened to it.
113
- */
114
- export interface ScenarioRunRecord extends ScenarioRunReport {
115
- runId: string
116
- status: ScenarioRunStatus
117
- /** The surface the run targeted: `default`, `browser`, … */
118
- surface: string
119
- startedAt: string
120
- finishedAt?: string
121
- }
122
-
123
- /** Enough of a run to list it without loading its steps and stacks. */
124
- export interface ScenarioRunSummary {
125
- runId: string
126
- environment: string
127
- surface: string
128
- status: ScenarioRunStatus
129
- startedAt: string
130
- finishedAt?: string
131
- durationMs?: number
132
- passed: number
133
- failed: number
134
- skipped: number
135
- /** Whether anything is there to watch, so a list can say so without a second read. */
136
- artifacts: number
137
- }
138
-
139
- /**
140
- * Where runs are kept.
141
- *
142
- * Deliberately not the workflow service: a scenario run is a workflow run under
143
- * the hood, but its history has a different lifetime, a different audience, and
144
- * a different home — a JSON file beside the project locally, a project-scoped
145
- * table and an object store when hosted.
146
- *
147
- * Written progressively rather than at the end, so a suite that dies on its
148
- * fortieth scenario still leaves the thirty-nine behind.
149
- */
150
- export interface ScenarioRunStore {
151
- /** Open a run. Called before the first scenario, with `status: 'running'`. */
152
- start(record: ScenarioRunRecord): Promise<void>
153
- /** Append one finished scenario to an open run. */
154
- recordScenario(runId: string, result: ScenarioResult): Promise<void>
155
- /**
156
- * File the run's artifacts against the scenarios that produced them.
157
- *
158
- * Separate from `recordScenario` because a scenario's video does not exist
159
- * when the scenario ends — it is finalised by the next scenario's reset, and
160
- * renamed again when the run closes. Artifacts are matched to a result by the
161
- * label the report knows it under.
162
- */
163
- attachArtifacts(runId: string, artifacts: ScenarioArtifact[]): Promise<void>
164
- /** Close a run, settling everything only known once every scenario has run. */
165
- finish(
166
- runId: string,
167
- outcome: Pick<
168
- ScenarioRunRecord,
169
- 'status' | 'finishedAt' | 'skipped' | 'hookFailures'
170
- >
171
- ): Promise<void>
172
- /**
173
- * The bytes of one artifact, by the `path` its record carries.
174
- *
175
- * Reading goes through the store because only the store knows where a run's
176
- * files actually are — a directory beside the project, or an object store
177
- * behind a bucket. Absent when the run or the path is unknown, which is also
178
- * the answer for a path that tries to leave the run.
179
- *
180
- * The bytes are backed by their own `ArrayBuffer` so they can be handed
181
- * straight to a `Response` — a view onto a pooled or shared buffer is not a
182
- * valid body.
183
- */
184
- readArtifact(
185
- runId: string,
186
- path: string
187
- ): Promise<{ body: Uint8Array<ArrayBuffer>; contentType: string } | undefined>
188
- /** Most recent first. */
189
- list(options?: { limit?: number }): Promise<ScenarioRunSummary[]>
190
- get(runId: string): Promise<ScenarioRunRecord | undefined>
191
- /** Forget a run and everything it filed. */
192
- remove(runId: string): Promise<void>
193
- }
@@ -1,147 +0,0 @@
1
- import { describe, test, beforeEach } from 'node:test'
2
- import assert from 'node:assert/strict'
3
-
4
- import { InMemoryWorkflowService } from '../../services/in-memory-workflow-service.js'
5
- import {
6
- PikkuScenarioService,
7
- createScenarioRunner,
8
- } from './pikku-scenario-service.js'
9
- import { pikkuState, resetPikkuState } from '../../pikku-state.js'
10
-
11
- const noopLogger = { error() {}, info() {}, warn() {}, debug() {} }
12
-
13
- const SCENARIO_MEMBERS = [
14
- 'scenarioStep',
15
- 'runScenarioHook',
16
- 'resolvePersonas',
17
- 'setScenarioBrowserProvider',
18
- 'getScenarioBrowserProvider',
19
- 'setScenarioEnvironment',
20
- 'getScenarioEnvironment',
21
- ]
22
-
23
- const SCENARIO_WIRE_MEMBERS = [
24
- 'given',
25
- 'when',
26
- 'then',
27
- 'expectEventually',
28
- 'expectError',
29
- 'expectService',
30
- 'runScheduledTask',
31
- ]
32
-
33
- const setup = async (ws: InMemoryWorkflowService) => {
34
- pikkuState(null, 'package', 'singletonServices', {
35
- logger: noopLogger,
36
- } as any)
37
- const runId = await ws.createRun('surfaceTest', {}, true, 'hash', {
38
- type: 'test',
39
- } as any)
40
- ws.registerInlineRun(runId)
41
- return runId
42
- }
43
-
44
- describe('the production workflow service carries no scenario surface', () => {
45
- beforeEach(() => resetPikkuState())
46
-
47
- test('no scenario method is declared on the workflow service prototype chain', () => {
48
- const ws = new InMemoryWorkflowService()
49
- for (const member of SCENARIO_MEMBERS) {
50
- assert.equal(
51
- typeof (ws as any)[member],
52
- 'undefined',
53
- `'${member}' ships in every production bundle while it is a member of PikkuWorkflowService`
54
- )
55
- }
56
- })
57
-
58
- test('the workflow wire exposes only workflow members', async () => {
59
- const ws = new InMemoryWorkflowService()
60
- const runId = await setup(ws)
61
- const wire = ws.createWorkflowWire('surfaceTest', runId, {}) as any
62
-
63
- for (const member of SCENARIO_WIRE_MEMBERS) {
64
- assert.equal(
65
- typeof wire[member],
66
- 'undefined',
67
- `wire.${member} is a scenario affordance and must not be built for a production workflow run`
68
- )
69
- }
70
- for (const member of ['do', 'sleep', 'suspend', 'approval', 'getRun']) {
71
- assert.equal(
72
- typeof wire[member],
73
- 'function',
74
- `wire.${member} is a workflow member and must survive`
75
- )
76
- }
77
- })
78
-
79
- test('a service with no extension installed runs a plain workflow untouched', async () => {
80
- const ws = new InMemoryWorkflowService()
81
- assert.equal(ws.getRunExtension(), undefined)
82
- const runId = await setup(ws)
83
- const wire = ws.createWorkflowWire('surfaceTest', runId, {}) as any
84
- assert.equal(typeof wire.do, 'function')
85
- })
86
-
87
- test('the actor client is not reachable from the workflow service module graph', async () => {
88
- const { readFileSync } = await import('node:fs')
89
- const source = readFileSync(
90
- new URL('./pikku-workflow-service.ts', import.meta.url),
91
- 'utf8'
92
- )
93
- assert.ok(
94
- !source.includes('http-personas'),
95
- 'PikkuWorkflowService must not reference the HTTP actor client — it pulls the AI persona loop into every bundle'
96
- )
97
- })
98
- })
99
-
100
- describe('PikkuScenarioService carries the scenario surface', () => {
101
- beforeEach(() => resetPikkuState())
102
-
103
- test('every scenario method is declared on the scenario service', () => {
104
- const { scenarioService } = createScenarioRunner()
105
- for (const member of SCENARIO_MEMBERS) {
106
- assert.equal(
107
- typeof (scenarioService as any)[member],
108
- 'function',
109
- `PikkuScenarioService is missing '${member}'`
110
- )
111
- }
112
- })
113
-
114
- test('the wire it decorates carries both the workflow and the scenario members', async () => {
115
- const { workflowService: ws } = createScenarioRunner()
116
- const runId = await setup(ws)
117
- const wire = ws.createWorkflowWire('surfaceTest', runId, {}) as any
118
-
119
- for (const member of [
120
- ...SCENARIO_WIRE_MEMBERS,
121
- 'do',
122
- 'sleep',
123
- 'approval',
124
- ]) {
125
- assert.equal(
126
- typeof wire[member],
127
- 'function',
128
- `PikkuScenarioService's wire is missing ${member}`
129
- )
130
- }
131
- })
132
-
133
- test('it is not a workflow service, so it cannot be registered as one by mistake', () => {
134
- const { scenarioService } = createScenarioRunner()
135
- assert.ok(!(scenarioService instanceof InMemoryWorkflowService))
136
- assert.equal(
137
- typeof (scenarioService as any).startWorkflow,
138
- 'undefined',
139
- 'the scenario capability is layered onto a run, it does not own one'
140
- )
141
- })
142
-
143
- test('the runner installs it as the workflow service extension', () => {
144
- const { workflowService, scenarioService } = createScenarioRunner()
145
- assert.equal(workflowService.getRunExtension(), scenarioService)
146
- })
147
- })