@pikku/core 0.12.107 → 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 (588) hide show
  1. package/CHANGELOG.md +344 -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/virtual-user/virtual-user-scaffold.d.ts +8 -8
  74. package/dist/wirings/virtual-user/virtual-user-schedule.d.ts +1 -1
  75. package/dist/wirings/workflow/workflow-queue-routing.d.ts +1 -1
  76. package/package.json +11 -5
  77. package/run-tests.sh +17 -9
  78. package/src/public-surface.json +26 -0
  79. package/src/agent-naming.test.ts +0 -68
  80. package/src/api-report.test.ts +0 -138
  81. package/src/app-alias-surface.test.ts +0 -179
  82. package/src/app-leaf-surface.test.ts +0 -222
  83. package/src/bootstrap-compat/root.ts +0 -20
  84. package/src/classification/column-form.test.ts +0 -97
  85. package/src/classification/column-form.ts +0 -55
  86. package/src/classification/data-classification.ts +0 -73
  87. package/src/classification/index.ts +0 -40
  88. package/src/classification/key-ids.ts +0 -2
  89. package/src/classification/secret-value.test.ts +0 -204
  90. package/src/classification/secret-value.ts +0 -106
  91. package/src/crypto-utils.test.ts +0 -668
  92. package/src/crypto-utils.ts +0 -460
  93. package/src/dev/hot-reload.test.ts +0 -587
  94. package/src/dev/hot-reload.ts +0 -225
  95. package/src/dev/module-runner.test.ts +0 -235
  96. package/src/dev/module-runner.ts +0 -138
  97. package/src/dev/reload-meta.test.ts +0 -183
  98. package/src/dev/reload-meta.ts +0 -144
  99. package/src/ecosystem-tier-removed.test.ts +0 -72
  100. package/src/env.ts +0 -1
  101. package/src/errors/error-handler.ts +0 -77
  102. package/src/errors/error.test.ts +0 -229
  103. package/src/errors/errors.ts +0 -393
  104. package/src/errors/index.ts +0 -11
  105. package/src/errors/serialized-error.ts +0 -12
  106. package/src/factory-functions.test.ts +0 -111
  107. package/src/function/abort-scope.test.ts +0 -97
  108. package/src/function/abort-scope.ts +0 -80
  109. package/src/function/function-meta.types.ts +0 -151
  110. package/src/function/function-runner.test.ts +0 -1619
  111. package/src/function/function-runner.ts +0 -499
  112. package/src/function/functions.types.ts +0 -319
  113. package/src/function/index.ts +0 -40
  114. package/src/function/list.types.test.ts +0 -100
  115. package/src/function/list.types.ts +0 -69
  116. package/src/function/pikku-request.test.ts +0 -35
  117. package/src/function/pikku-request.ts +0 -17
  118. package/src/gopass-secrets-removed.test.ts +0 -51
  119. package/src/handle-error.test.ts +0 -532
  120. package/src/handle-error.ts +0 -64
  121. package/src/middleware/auth-apikey.test.ts +0 -362
  122. package/src/middleware/auth-apikey.ts +0 -39
  123. package/src/middleware/auth-bearer.test.ts +0 -566
  124. package/src/middleware/auth-bearer.ts +0 -83
  125. package/src/middleware/auth-cookie.test.ts +0 -572
  126. package/src/middleware/auth-cookie.ts +0 -107
  127. package/src/middleware/cors.test.ts +0 -579
  128. package/src/middleware/cors.ts +0 -103
  129. package/src/middleware/index.ts +0 -30
  130. package/src/middleware/middleware-factories.ts +0 -76
  131. package/src/middleware/middleware.types.ts +0 -61
  132. package/src/middleware/remote-auth.test.ts +0 -547
  133. package/src/middleware/remote-auth.ts +0 -95
  134. package/src/middleware/remote-jobs-secret.ts +0 -35
  135. package/src/middleware/require-origin.test.ts +0 -115
  136. package/src/middleware/require-origin.ts +0 -79
  137. package/src/middleware/telemetry.ts +0 -83
  138. package/src/middleware-runner.test.ts +0 -578
  139. package/src/middleware-runner.ts +0 -232
  140. package/src/no-any-casts.test.ts +0 -57
  141. package/src/no-root-barrel.test.ts +0 -122
  142. package/src/permissions.test.ts +0 -256
  143. package/src/permissions.ts +0 -217
  144. package/src/pikku-state.test.ts +0 -198
  145. package/src/pikku-state.ts +0 -206
  146. package/src/production-barrels-stay-lean.test.ts +0 -110
  147. package/src/public-surface.test.ts +0 -133
  148. package/src/remote.test.ts +0 -173
  149. package/src/remote.ts +0 -56
  150. package/src/removed-legacy-exports.test.ts +0 -66
  151. package/src/run-tests-script.test.ts +0 -67
  152. package/src/schema.test.ts +0 -430
  153. package/src/schema.ts +0 -204
  154. package/src/scopes.test.ts +0 -203
  155. package/src/scopes.ts +0 -67
  156. package/src/services/agent-run-state-service.ts +0 -37
  157. package/src/services/agent-runner-service.ts +0 -238
  158. package/src/services/agent-storage-service.ts +0 -39
  159. package/src/services/ai-embedding-service.ts +0 -9
  160. package/src/services/audit-service.test.ts +0 -44
  161. package/src/services/audit-service.ts +0 -280
  162. package/src/services/content-service.ts +0 -65
  163. package/src/services/credential-service.ts +0 -20
  164. package/src/services/credential-wire-service.test.ts +0 -235
  165. package/src/services/credential-wire-service.ts +0 -120
  166. package/src/services/deployment-service.ts +0 -32
  167. package/src/services/email-service.test.ts +0 -100
  168. package/src/services/email-service.ts +0 -60
  169. package/src/services/email-template.test.ts +0 -311
  170. package/src/services/email-template.ts +0 -254
  171. package/src/services/file-scenario-run-store.test.ts +0 -349
  172. package/src/services/file-scenario-run-store.ts +0 -282
  173. package/src/services/gateway-service.ts +0 -5
  174. package/src/services/http-personas-converse.test.ts +0 -274
  175. package/src/services/http-personas.test.ts +0 -379
  176. package/src/services/http-personas.ts +0 -508
  177. package/src/services/in-memory-agent-run-state-service.ts +0 -87
  178. package/src/services/in-memory-queue-service.test.ts +0 -162
  179. package/src/services/in-memory-queue-service.ts +0 -78
  180. package/src/services/in-memory-session-store.test.ts +0 -58
  181. package/src/services/in-memory-session-store.ts +0 -20
  182. package/src/services/in-memory-trigger-service.ts +0 -47
  183. package/src/services/in-memory-workflow-service.test.ts +0 -430
  184. package/src/services/in-memory-workflow-service.ts +0 -595
  185. package/src/services/index.ts +0 -192
  186. package/src/services/istanbul-coverage-service.test.ts +0 -66
  187. package/src/services/istanbul-coverage-service.ts +0 -59
  188. package/src/services/jwt-service.ts +0 -15
  189. package/src/services/local-content-request-handler.test.ts +0 -240
  190. package/src/services/local-content-request-handler.ts +0 -295
  191. package/src/services/local-content.test.ts +0 -186
  192. package/src/services/local-content.ts +0 -242
  193. package/src/services/local-credential-service.ts +0 -63
  194. package/src/services/local-email-service.test.ts +0 -182
  195. package/src/services/local-email-service.ts +0 -43
  196. package/src/services/local-gateway-service.ts +0 -51
  197. package/src/services/local-secrets.test.ts +0 -95
  198. package/src/services/local-secrets.ts +0 -71
  199. package/src/services/local-variables.test.ts +0 -61
  200. package/src/services/local-variables.ts +0 -45
  201. package/src/services/logger-console.test.ts +0 -117
  202. package/src/services/logger-console.ts +0 -174
  203. package/src/services/logger.ts +0 -48
  204. package/src/services/meta-service.test.ts +0 -75
  205. package/src/services/meta-service.ts +0 -767
  206. package/src/services/persona-actor-secret.test.ts +0 -68
  207. package/src/services/persona-actor-secret.ts +0 -70
  208. package/src/services/persona-sign-in.test.ts +0 -219
  209. package/src/services/persona-sign-in.ts +0 -238
  210. package/src/services/personas-service.ts +0 -191
  211. package/src/services/pikku-user-id.test.ts +0 -62
  212. package/src/services/pikku-user-id.ts +0 -13
  213. package/src/services/queue-webhook-service.test.ts +0 -409
  214. package/src/services/queue-webhook-service.ts +0 -150
  215. package/src/services/remote-jobs.test.ts +0 -106
  216. package/src/services/remote-jobs.ts +0 -92
  217. package/src/services/scheduler-service.ts +0 -37
  218. package/src/services/schema-service.ts +0 -10
  219. package/src/services/scope-service.ts +0 -91
  220. package/src/services/scoped-credential-service.test.ts +0 -86
  221. package/src/services/scoped-credential-service.ts +0 -63
  222. package/src/services/scoped-secret-service.test.ts +0 -93
  223. package/src/services/scoped-secret-service.ts +0 -40
  224. package/src/services/secret-host-binding.test.ts +0 -138
  225. package/src/services/secret-host-binding.ts +0 -51
  226. package/src/services/secret-service.ts +0 -25
  227. package/src/services/secretless.test.ts +0 -54
  228. package/src/services/secretless.ts +0 -29
  229. package/src/services/session-store.ts +0 -9
  230. package/src/services/stub-tracker.test.ts +0 -104
  231. package/src/services/stub-tracker.ts +0 -175
  232. package/src/services/system-role-guard.test.ts +0 -96
  233. package/src/services/system-role-guard.ts +0 -71
  234. package/src/services/temporary-file-service.ts +0 -76
  235. package/src/services/trigger-service.ts +0 -5
  236. package/src/services/typed-credential-service.ts +0 -83
  237. package/src/services/typed-secret-service.test.ts +0 -204
  238. package/src/services/typed-secret-service.ts +0 -132
  239. package/src/services/typed-variables-service.test.ts +0 -166
  240. package/src/services/typed-variables-service.ts +0 -166
  241. package/src/services/user-session-service.test.ts +0 -147
  242. package/src/services/user-session-service.ts +0 -85
  243. package/src/services/v8-coverage-service.test.ts +0 -69
  244. package/src/services/v8-coverage-service.ts +0 -163
  245. package/src/services/variables-service.ts +0 -13
  246. package/src/services/webhook-service.ts +0 -147
  247. package/src/services/workflow-service.ts +0 -120
  248. package/src/side-effects-are-declared.test.ts +0 -84
  249. package/src/source-files-stay-composable.test.ts +0 -41
  250. package/src/template-alias-surface.test.ts +0 -240
  251. package/src/test-utils.ts +0 -38
  252. package/src/testing/index.ts +0 -3
  253. package/src/testing/service-tests/agent-run-service-tests.ts +0 -98
  254. package/src/testing/service-tests/agent-storage-service-tests.ts +0 -379
  255. package/src/testing/service-tests/channel-store-tests.ts +0 -98
  256. package/src/testing/service-tests/credential-service-tests.ts +0 -143
  257. package/src/testing/service-tests/deployment-service-tests.ts +0 -33
  258. package/src/testing/service-tests/event-hub-store-tests.ts +0 -48
  259. package/src/testing/service-tests/secret-service-tests.ts +0 -105
  260. package/src/testing/service-tests/session-store-tests.ts +0 -62
  261. package/src/testing/service-tests/workflow-run-service-tests.ts +0 -59
  262. package/src/testing/service-tests/workflow-service-tests.ts +0 -308
  263. package/src/testing/service-tests.ts +0 -95
  264. package/src/time-utils.test.ts +0 -56
  265. package/src/time-utils.ts +0 -89
  266. package/src/types/core.types.ts +0 -446
  267. package/src/types/index.ts +0 -25
  268. package/src/types/state.types.ts +0 -226
  269. package/src/types/typed-credentials.test.ts +0 -72
  270. package/src/utils/hash.test.ts +0 -68
  271. package/src/utils/hash.ts +0 -26
  272. package/src/utils/hmac.ts +0 -21
  273. package/src/utils/node-host-resolver.ts +0 -20
  274. package/src/utils/safe-fetch.test.ts +0 -515
  275. package/src/utils/safe-fetch.ts +0 -347
  276. package/src/utils.test.ts +0 -359
  277. package/src/utils.ts +0 -165
  278. package/src/version.test.ts +0 -80
  279. package/src/version.ts +0 -25
  280. package/src/wirings/actor-flow/actor-flow.types.ts +0 -40
  281. package/src/wirings/actor-flow/index.ts +0 -10
  282. package/src/wirings/actor-flow/run-conversation.test.ts +0 -187
  283. package/src/wirings/actor-flow/run-conversation.ts +0 -280
  284. package/src/wirings/addon/addon-auth-tags.test.ts +0 -219
  285. package/src/wirings/addon/addon-runner.ts +0 -236
  286. package/src/wirings/addon/addon-scopes.test.ts +0 -225
  287. package/src/wirings/addon/addon-secrets.test.ts +0 -391
  288. package/src/wirings/addon/index.ts +0 -12
  289. package/src/wirings/addon/remote-addon-auth.ts +0 -65
  290. package/src/wirings/addon/wire-addon.test.ts +0 -102
  291. package/src/wirings/addon/wire-addon.ts +0 -202
  292. package/src/wirings/addon/wire-remote-addon.ts +0 -41
  293. package/src/wirings/agent/agent-agui.test.ts +0 -1213
  294. package/src/wirings/agent/agent-agui.ts +0 -405
  295. package/src/wirings/agent/agent-authorization.test.ts +0 -208
  296. package/src/wirings/agent/agent-finalize.test.ts +0 -187
  297. package/src/wirings/agent/agent-finalize.ts +0 -197
  298. package/src/wirings/agent/agent-helpers.test.ts +0 -215
  299. package/src/wirings/agent/agent-helpers.ts +0 -96
  300. package/src/wirings/agent/agent-interrupt.test.ts +0 -833
  301. package/src/wirings/agent/agent-interrupt.ts +0 -400
  302. package/src/wirings/agent/agent-memory.test.ts +0 -397
  303. package/src/wirings/agent/agent-memory.ts +0 -496
  304. package/src/wirings/agent/agent-middleware.types.test.ts +0 -41
  305. package/src/wirings/agent/agent-model-config.test.ts +0 -103
  306. package/src/wirings/agent/agent-model-config.ts +0 -59
  307. package/src/wirings/agent/agent-prepare.test.ts +0 -977
  308. package/src/wirings/agent/agent-prepare.ts +0 -1083
  309. package/src/wirings/agent/agent-registry.test.ts +0 -455
  310. package/src/wirings/agent/agent-registry.ts +0 -99
  311. package/src/wirings/agent/agent-resume-authorization.test.ts +0 -206
  312. package/src/wirings/agent/agent-rpc.ts +0 -116
  313. package/src/wirings/agent/agent-runner.test.ts +0 -1229
  314. package/src/wirings/agent/agent-runner.ts +0 -858
  315. package/src/wirings/agent/agent-stream-delegate.test.ts +0 -381
  316. package/src/wirings/agent/agent-stream-output-hooks.test.ts +0 -353
  317. package/src/wirings/agent/agent-stream.test.ts +0 -1800
  318. package/src/wirings/agent/agent-stream.ts +0 -1639
  319. package/src/wirings/agent/agent-thread-ownership.test.ts +0 -297
  320. package/src/wirings/agent/agent-turn.test.ts +0 -65
  321. package/src/wirings/agent/agent-turn.ts +0 -122
  322. package/src/wirings/agent/agent-utils.ts +0 -20
  323. package/src/wirings/agent/agent.types.ts +0 -676
  324. package/src/wirings/agent/index.ts +0 -58
  325. package/src/wirings/agent/voice-input.test.ts +0 -220
  326. package/src/wirings/agent/voice-input.ts +0 -180
  327. package/src/wirings/agent/voice-output.test.ts +0 -510
  328. package/src/wirings/agent/voice-output.ts +0 -311
  329. package/src/wirings/agent-scorer/agent-scorer-grade.test.ts +0 -106
  330. package/src/wirings/agent-scorer/agent-scorer-grade.ts +0 -55
  331. package/src/wirings/agent-scorer/agent-scorer-judge.test.ts +0 -285
  332. package/src/wirings/agent-scorer/agent-scorer-judge.ts +0 -180
  333. package/src/wirings/agent-scorer/agent-scorer-live.test.ts +0 -174
  334. package/src/wirings/agent-scorer/agent-scorer-live.ts +0 -56
  335. package/src/wirings/agent-scorer/agent-scorer-registry.ts +0 -66
  336. package/src/wirings/agent-scorer/agent-scorer-sampling.test.ts +0 -34
  337. package/src/wirings/agent-scorer/agent-scorer-sampling.ts +0 -36
  338. package/src/wirings/agent-scorer/agent-scorer-snapshots.test.ts +0 -49
  339. package/src/wirings/agent-scorer/agent-scorer-snapshots.ts +0 -46
  340. package/src/wirings/agent-scorer/agent-scorer-worker.test.ts +0 -122
  341. package/src/wirings/agent-scorer/agent-scorer-worker.ts +0 -71
  342. package/src/wirings/agent-scorer/agent-scorer.ts +0 -102
  343. package/src/wirings/agent-scorer/agent-scorer.types.ts +0 -128
  344. package/src/wirings/agent-scorer/index.ts +0 -23
  345. package/src/wirings/channel/channel-common.ts +0 -102
  346. package/src/wirings/channel/channel-handler-shapes.test.ts +0 -72
  347. package/src/wirings/channel/channel-handler.test.ts +0 -322
  348. package/src/wirings/channel/channel-handler.ts +0 -259
  349. package/src/wirings/channel/channel-host-rpc.test.ts +0 -150
  350. package/src/wirings/channel/channel-host-rpc.ts +0 -69
  351. package/src/wirings/channel/channel-middleware-runner.test.ts +0 -188
  352. package/src/wirings/channel/channel-middleware-runner.ts +0 -126
  353. package/src/wirings/channel/channel-rpc-registry.ts +0 -116
  354. package/src/wirings/channel/channel-rpc-responder.ts +0 -117
  355. package/src/wirings/channel/channel-rpc-service.ts +0 -132
  356. package/src/wirings/channel/channel-rpc-validators.ts +0 -65
  357. package/src/wirings/channel/channel-rpc.test.ts +0 -841
  358. package/src/wirings/channel/channel-rpc.ts +0 -5
  359. package/src/wirings/channel/channel-rpc.types.ts +0 -160
  360. package/src/wirings/channel/channel-runner.ts +0 -164
  361. package/src/wirings/channel/channel-store.ts +0 -35
  362. package/src/wirings/channel/channel.types.ts +0 -193
  363. package/src/wirings/channel/define-channel-routes.ts +0 -5
  364. package/src/wirings/channel/eventhub-service.ts +0 -16
  365. package/src/wirings/channel/eventhub-store.ts +0 -13
  366. package/src/wirings/channel/index.ts +0 -40
  367. package/src/wirings/channel/local/index.ts +0 -3
  368. package/src/wirings/channel/local/local-channel-handler.ts +0 -98
  369. package/src/wirings/channel/local/local-channel-runner.test.ts +0 -339
  370. package/src/wirings/channel/local/local-channel-runner.ts +0 -271
  371. package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -77
  372. package/src/wirings/channel/local/local-eventhub-service.ts +0 -69
  373. package/src/wirings/channel/log-channels.ts +0 -16
  374. package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +0 -135
  375. package/src/wirings/channel/pikku-abstract-channel-handler.ts +0 -60
  376. package/src/wirings/channel/serverless/index.ts +0 -6
  377. package/src/wirings/channel/serverless/serverless-channel-runner.ts +0 -328
  378. package/src/wirings/cli/channel/cli-approval.test.ts +0 -177
  379. package/src/wirings/cli/channel/cli-approval.ts +0 -135
  380. package/src/wirings/cli/channel/cli-channel-runner.ts +0 -118
  381. package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +0 -192
  382. package/src/wirings/cli/channel/cli-raw-channel-runner.ts +0 -148
  383. package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +0 -480
  384. package/src/wirings/cli/channel/cli-raw-client-runner.ts +0 -188
  385. package/src/wirings/cli/channel/index.ts +0 -6
  386. package/src/wirings/cli/cli-runner.test.ts +0 -969
  387. package/src/wirings/cli/cli-runner.ts +0 -538
  388. package/src/wirings/cli/cli.types.ts +0 -388
  389. package/src/wirings/cli/command-parser.test.ts +0 -1120
  390. package/src/wirings/cli/command-parser.ts +0 -713
  391. package/src/wirings/cli/define-cli-commands.ts +0 -13
  392. package/src/wirings/cli/format-cli-error.test.ts +0 -91
  393. package/src/wirings/cli/format-cli-error.ts +0 -96
  394. package/src/wirings/cli/index.ts +0 -19
  395. package/src/wirings/credential/credential.types.ts +0 -37
  396. package/src/wirings/credential/define-credential.ts +0 -49
  397. package/src/wirings/credential/index.ts +0 -7
  398. package/src/wirings/credential/validate-credential-definitions.ts +0 -63
  399. package/src/wirings/gateway/gateway-authorization.test.ts +0 -575
  400. package/src/wirings/gateway/gateway-channel-meta.test.ts +0 -44
  401. package/src/wirings/gateway/gateway-runner.test.ts +0 -581
  402. package/src/wirings/gateway/gateway-runner.ts +0 -411
  403. package/src/wirings/gateway/gateway.types.ts +0 -137
  404. package/src/wirings/gateway/index.ts +0 -15
  405. package/src/wirings/http/http-routes.test.ts +0 -318
  406. package/src/wirings/http/http-routes.ts +0 -111
  407. package/src/wirings/http/http-runner-addon-ref.test.ts +0 -238
  408. package/src/wirings/http/http-runner.test.ts +0 -503
  409. package/src/wirings/http/http-runner.ts +0 -462
  410. package/src/wirings/http/http.types.ts +0 -307
  411. package/src/wirings/http/index.ts +0 -27
  412. package/src/wirings/http/log-http-routes.ts +0 -18
  413. package/src/wirings/http/pikku-fetch-http-request.test.ts +0 -318
  414. package/src/wirings/http/pikku-fetch-http-request.ts +0 -260
  415. package/src/wirings/http/pikku-fetch-http-response.test.ts +0 -123
  416. package/src/wirings/http/pikku-fetch-http-response.ts +0 -149
  417. package/src/wirings/http/routers/http-router.ts +0 -13
  418. package/src/wirings/http/routers/path-to-regex.test.ts +0 -306
  419. package/src/wirings/http/routers/path-to-regex.ts +0 -115
  420. package/src/wirings/http/web-request.test.ts +0 -382
  421. package/src/wirings/http/web-request.ts +0 -162
  422. package/src/wirings/mcp/index.ts +0 -26
  423. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -388
  424. package/src/wirings/mcp/mcp-endpoint-registry.ts +0 -159
  425. package/src/wirings/mcp/mcp-runner.test.ts +0 -588
  426. package/src/wirings/mcp/mcp-runner.ts +0 -330
  427. package/src/wirings/mcp/mcp.types.ts +0 -199
  428. package/src/wirings/node/index.ts +0 -2
  429. package/src/wirings/node/node.types.ts +0 -23
  430. package/src/wirings/oauth2/index.ts +0 -1
  431. package/src/wirings/oauth2/oauth2.types.ts +0 -12
  432. package/src/wirings/persona/define-personas.ts +0 -33
  433. package/src/wirings/persona/index.ts +0 -75
  434. package/src/wirings/persona/persona-app-scopes.test.ts +0 -47
  435. package/src/wirings/persona/persona-app-scopes.ts +0 -74
  436. package/src/wirings/persona/persona-email.ts +0 -87
  437. package/src/wirings/persona/persona-environments.test.ts +0 -194
  438. package/src/wirings/persona/persona-environments.ts +0 -138
  439. package/src/wirings/persona/persona-mailbox.ts +0 -156
  440. package/src/wirings/persona/persona.test.ts +0 -230
  441. package/src/wirings/persona/persona.types.ts +0 -156
  442. package/src/wirings/persona/validate-personas.ts +0 -137
  443. package/src/wirings/queue/index.ts +0 -29
  444. package/src/wirings/queue/queue-identity.test.ts +0 -454
  445. package/src/wirings/queue/queue-identity.ts +0 -176
  446. package/src/wirings/queue/queue-runner.test.ts +0 -705
  447. package/src/wirings/queue/queue-runner.ts +0 -181
  448. package/src/wirings/queue/queue.types.ts +0 -161
  449. package/src/wirings/queue/register-queue-helper.ts +0 -46
  450. package/src/wirings/queue/signed-queue-service.ts +0 -60
  451. package/src/wirings/queue/validate-worker-config.test.ts +0 -108
  452. package/src/wirings/queue/validate-worker-config.ts +0 -90
  453. package/src/wirings/role/define-system-role.ts +0 -33
  454. package/src/wirings/role/index.ts +0 -13
  455. package/src/wirings/role/role.test.ts +0 -104
  456. package/src/wirings/role/role.types.ts +0 -47
  457. package/src/wirings/role/validate-role-definitions.ts +0 -93
  458. package/src/wirings/rpc/index.ts +0 -8
  459. package/src/wirings/rpc/rpc-runner.test.ts +0 -1130
  460. package/src/wirings/rpc/rpc-runner.ts +0 -569
  461. package/src/wirings/rpc/rpc-types.ts +0 -87
  462. package/src/wirings/scheduler/index.ts +0 -11
  463. package/src/wirings/scheduler/log-schedulers.ts +0 -16
  464. package/src/wirings/scheduler/scheduler-runner.test.ts +0 -835
  465. package/src/wirings/scheduler/scheduler-runner.ts +0 -138
  466. package/src/wirings/scheduler/scheduler.types.ts +0 -42
  467. package/src/wirings/scope/define-scope.ts +0 -33
  468. package/src/wirings/scope/index.ts +0 -15
  469. package/src/wirings/scope/scope.test.ts +0 -159
  470. package/src/wirings/scope/scope.types.ts +0 -42
  471. package/src/wirings/scope/validate-scope-definitions.ts +0 -107
  472. package/src/wirings/secret/index.ts +0 -9
  473. package/src/wirings/secret/secret.types.ts +0 -70
  474. package/src/wirings/secret/validate-secret-definitions.test.ts +0 -232
  475. package/src/wirings/secret/validate-secret-definitions.ts +0 -88
  476. package/src/wirings/trigger/index.ts +0 -9
  477. package/src/wirings/trigger/pikku-trigger-service.ts +0 -107
  478. package/src/wirings/trigger/trigger-runner.test.ts +0 -78
  479. package/src/wirings/trigger/trigger-runner.ts +0 -113
  480. package/src/wirings/trigger/trigger.types.ts +0 -100
  481. package/src/wirings/variable/index.ts +0 -8
  482. package/src/wirings/variable/validate-variable-definitions.test.ts +0 -115
  483. package/src/wirings/variable/validate-variable-definitions.ts +0 -71
  484. package/src/wirings/variable/variable.types.ts +0 -40
  485. package/src/wirings/virtual-user/index.ts +0 -107
  486. package/src/wirings/virtual-user/prepare-virtual-user-run.test.ts +0 -115
  487. package/src/wirings/virtual-user/prepare-virtual-user-run.ts +0 -95
  488. package/src/wirings/virtual-user/run-virtual-user.test.ts +0 -774
  489. package/src/wirings/virtual-user/run-virtual-user.ts +0 -684
  490. package/src/wirings/virtual-user/virtual-user-agents.test.ts +0 -72
  491. package/src/wirings/virtual-user/virtual-user-agents.ts +0 -62
  492. package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +0 -215
  493. package/src/wirings/virtual-user/virtual-user-catalogue.ts +0 -184
  494. package/src/wirings/virtual-user/virtual-user-derive.test.ts +0 -426
  495. package/src/wirings/virtual-user/virtual-user-derive.ts +0 -161
  496. package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +0 -68
  497. package/src/wirings/virtual-user/virtual-user-dispositions.ts +0 -210
  498. package/src/wirings/virtual-user/virtual-user-intents.test.ts +0 -218
  499. package/src/wirings/virtual-user/virtual-user-intents.ts +0 -185
  500. package/src/wirings/virtual-user/virtual-user-rng.test.ts +0 -72
  501. package/src/wirings/virtual-user/virtual-user-rng.ts +0 -50
  502. package/src/wirings/virtual-user/virtual-user-run-store.ts +0 -131
  503. package/src/wirings/virtual-user/virtual-user-scaffold.test.ts +0 -854
  504. package/src/wirings/virtual-user/virtual-user-scaffold.ts +0 -664
  505. package/src/wirings/virtual-user/virtual-user-schedule-store.ts +0 -93
  506. package/src/wirings/virtual-user/virtual-user-schedule.test.ts +0 -280
  507. package/src/wirings/virtual-user/virtual-user-schedule.ts +0 -156
  508. package/src/wirings/virtual-user/virtual-user-target.ts +0 -47
  509. package/src/wirings/virtual-user/virtual-user.types.ts +0 -215
  510. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +0 -709
  511. package/src/wirings/workflow/dsl/workflow-runner.ts +0 -25
  512. package/src/wirings/workflow/feature.test.ts +0 -131
  513. package/src/wirings/workflow/feature.ts +0 -59
  514. package/src/wirings/workflow/graph/graph-foreach-queued.test.ts +0 -569
  515. package/src/wirings/workflow/graph/graph-foreach.test.ts +0 -626
  516. package/src/wirings/workflow/graph/graph-node.ts +0 -115
  517. package/src/wirings/workflow/graph/graph-runner.test.ts +0 -1049
  518. package/src/wirings/workflow/graph/graph-runner.ts +0 -1376
  519. package/src/wirings/workflow/graph/graph-validation.test.ts +0 -27
  520. package/src/wirings/workflow/graph/graph-validation.ts +0 -41
  521. package/src/wirings/workflow/graph/template.test.ts +0 -49
  522. package/src/wirings/workflow/graph/template.ts +0 -42
  523. package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -39
  524. package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -75
  525. package/src/wirings/workflow/index.ts +0 -107
  526. package/src/wirings/workflow/pikku-scenario-service.ts +0 -1013
  527. package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -963
  528. package/src/wirings/workflow/pikku-workflow-service.ts +0 -1993
  529. package/src/wirings/workflow/run-timeline.test.ts +0 -199
  530. package/src/wirings/workflow/run-timeline.ts +0 -185
  531. package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -107
  532. package/src/wirings/workflow/scenario-cookie-jar.ts +0 -57
  533. package/src/wirings/workflow/scenario-expectations.test.ts +0 -238
  534. package/src/wirings/workflow/scenario-hooks.test.ts +0 -259
  535. package/src/wirings/workflow/scenario-poll.test.ts +0 -64
  536. package/src/wirings/workflow/scenario-poll.ts +0 -27
  537. package/src/wirings/workflow/scenario-prose.test.ts +0 -275
  538. package/src/wirings/workflow/scenario-prose.ts +0 -86
  539. package/src/wirings/workflow/scenario-run.types.ts +0 -193
  540. package/src/wirings/workflow/scenario-service.test.ts +0 -147
  541. package/src/wirings/workflow/scenario-step-guards.ts +0 -23
  542. package/src/wirings/workflow/scenario-step.test.ts +0 -800
  543. package/src/wirings/workflow/scenario-step.types.ts +0 -262
  544. package/src/wirings/workflow/scenario-surface.test.ts +0 -146
  545. package/src/wirings/workflow/scenario-surface.ts +0 -71
  546. package/src/wirings/workflow/scenario.types.ts +0 -63
  547. package/src/wirings/workflow/workflow-approval-audit.ts +0 -47
  548. package/src/wirings/workflow/workflow-approval-policy.test.ts +0 -594
  549. package/src/wirings/workflow/workflow-approval-policy.ts +0 -68
  550. package/src/wirings/workflow/workflow-approval.ts +0 -290
  551. package/src/wirings/workflow/workflow-child-run-session.test.ts +0 -168
  552. package/src/wirings/workflow/workflow-constants.ts +0 -66
  553. package/src/wirings/workflow/workflow-dispatch-durability.test.ts +0 -116
  554. package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -55
  555. package/src/wirings/workflow/workflow-dispatch-relay.test.ts +0 -128
  556. package/src/wirings/workflow/workflow-errors.ts +0 -132
  557. package/src/wirings/workflow/workflow-inline-authority.test.ts +0 -175
  558. package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -51
  559. package/src/wirings/workflow/workflow-invocation-id.ts +0 -28
  560. package/src/wirings/workflow/workflow-meta-resolver.ts +0 -45
  561. package/src/wirings/workflow/workflow-mirror.test.ts +0 -171
  562. package/src/wirings/workflow/workflow-missing-meta.test.ts +0 -92
  563. package/src/wirings/workflow/workflow-on-error.test.ts +0 -145
  564. package/src/wirings/workflow/workflow-queue-routing.ts +0 -129
  565. package/src/wirings/workflow/workflow-queue-wiring.ts +0 -149
  566. package/src/wirings/workflow/workflow-queue-workers.test.ts +0 -131
  567. package/src/wirings/workflow/workflow-queue-workers.ts +0 -66
  568. package/src/wirings/workflow/workflow-recovery.ts +0 -192
  569. package/src/wirings/workflow/workflow-replay-snapshot.test.ts +0 -140
  570. package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -113
  571. package/src/wirings/workflow/workflow-run-authority.test.ts +0 -212
  572. package/src/wirings/workflow/workflow-run-context.test.ts +0 -172
  573. package/src/wirings/workflow/workflow-run-engine.types.ts +0 -92
  574. package/src/wirings/workflow/workflow-run-ownership.ts +0 -37
  575. package/src/wirings/workflow/workflow-run-polling.test.ts +0 -127
  576. package/src/wirings/workflow/workflow-stalled-recovery.test.ts +0 -152
  577. package/src/wirings/workflow/workflow-status-stream.test.ts +0 -354
  578. package/src/wirings/workflow/workflow-status-stream.ts +0 -144
  579. package/src/wirings/workflow/workflow-step-claim.ts +0 -46
  580. package/src/wirings/workflow/workflow-step-ordinal.test.ts +0 -94
  581. package/src/wirings/workflow/workflow-step-session.test.ts +0 -87
  582. package/src/wirings/workflow/workflow-suspend.ts +0 -61
  583. package/src/wirings/workflow/workflow-terminal-run-guard.test.ts +0 -105
  584. package/src/wirings/workflow/workflow.types.ts +0 -268
  585. package/src/wirings-stay-decoupled.test.ts +0 -130
  586. package/tsconfig.json +0 -14
  587. package/tsconfig.tsbuildinfo +0 -1
  588. 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
- })