@pikku/core 0.12.107 → 0.12.112

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