@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,854 +0,0 @@
1
- import { test, describe } from 'node:test'
2
- import assert from 'node:assert/strict'
3
- import {
4
- executeVirtualUserRun,
5
- logVirtualUserTick,
6
- requireVirtualUserRunStore,
7
- runnablePersona,
8
- serializeVirtualUserRun,
9
- serializeVirtualUserSchedule,
10
- serializeVirtualUserSteps,
11
- signInPathFor,
12
- startVirtualUserRun,
13
- virtualUserScheduleRunInput,
14
- writeVirtualUserSchedule,
15
- type ScaffoldPersonas,
16
- } from './virtual-user-scaffold.js'
17
- import type {
18
- VirtualUserRunRecord,
19
- VirtualUserRunStore,
20
- } from './virtual-user-run-store.js'
21
- import type {
22
- VirtualUserScheduleRecord,
23
- VirtualUserScheduleStore,
24
- } from './virtual-user-schedule-store.js'
25
-
26
- /**
27
- * These are the bodies of the scaffolded RPCs, so what is asserted here used to
28
- * be asserted by matching the generated source with a regular expression. The
29
- * properties are the same ones; the difference is that they are now checked by
30
- * running the code rather than by reading it.
31
- */
32
-
33
- const personas = {
34
- susan: {
35
- id: 'susan',
36
- name: 'Susan',
37
- email: 'susan@actors.local',
38
- roles: [],
39
- goals: ['Get the weekly order in'],
40
- tags: [],
41
- runnable: true,
42
- disposition: 'realistic',
43
- },
44
- observed: {
45
- id: 'observed',
46
- name: 'Observed',
47
- email: 'observed@actors.local',
48
- roles: [],
49
- goals: [],
50
- tags: [],
51
- runnable: false,
52
- },
53
- } as unknown as ScaffoldPersonas
54
-
55
- const runStore = () => {
56
- const started: any[] = []
57
- const completed: any[] = []
58
- const failed: any[] = []
59
- const store = {
60
- start: async (start: any) => {
61
- started.push(start)
62
- return `run-${started.length}`
63
- },
64
- complete: async (runId: string, outcome: any) => {
65
- completed.push({ runId, outcome })
66
- },
67
- fail: async (runId: string, error: string) => {
68
- failed.push({ runId, error })
69
- },
70
- get: async () => null,
71
- list: async () => [],
72
- steps: async () => [],
73
- } as unknown as VirtualUserRunStore
74
- return { store, started, completed, failed }
75
- }
76
-
77
- const variables = (values: Record<string, string>) =>
78
- ({
79
- get: async (name: string) => values[name],
80
- getVariables: async () => ({}),
81
- getAll: async () => values,
82
- set: async () => {},
83
- has: async (name: string) => name in values,
84
- delete: async () => {},
85
- }) as any
86
-
87
- const silentLogger = () => {
88
- const lines: string[] = []
89
- return {
90
- lines,
91
- logger: {
92
- debug: (m: string) => lines.push(`debug ${m}`),
93
- info: (m: string) => lines.push(`info ${m}`),
94
- warn: (m: string) => lines.push(`warn ${m}`),
95
- error: (m: string) => lines.push(`error ${m}`),
96
- } as any,
97
- }
98
- }
99
-
100
- const emptyMeta = {
101
- getFunctionsMeta: async () => ({}),
102
- getSchemas: async () => ({}),
103
- getWorkflowMeta: async () => ({}),
104
- getSystemRolesMeta: async () => ({}),
105
- getAgentsMeta: async () => ({}),
106
- } as any
107
-
108
- describe('signInPathFor', () => {
109
- // Both are better-auth plugins on one mount, so an app that moved auth to
110
- // `/api/auth` should not have to name each door separately.
111
- test('an app that moved its auth mount moves both sign-in paths', () => {
112
- assert.equal(
113
- signInPathFor('/api/auth/sign-in/actor', 'fabric'),
114
- '/api/auth/sign-in/fabric'
115
- )
116
- assert.equal(
117
- signInPathFor('/api/auth/sign-in/fabric', 'actor'),
118
- '/api/auth/sign-in/actor'
119
- )
120
- })
121
-
122
- test('a path naming neither plugin was configured deliberately', () => {
123
- assert.equal(signInPathFor('/custom/login', 'actor'), '/custom/login')
124
- })
125
-
126
- test('nothing configured stays nothing, so the default applies', () => {
127
- assert.equal(signInPathFor(undefined, 'actor'), undefined)
128
- })
129
- })
130
-
131
- describe('runnablePersona', () => {
132
- test('an undeclared persona is named, with what declares one', () => {
133
- assert.throws(
134
- () => runnablePersona(personas, 'nobody'),
135
- /Unknown persona "nobody" — declare it with definePersonas\(\)/
136
- )
137
- })
138
-
139
- // An acted-upon persona has no session of its own, and running one races the
140
- // scenario that acts on it.
141
- test('refuses a persona that is declared as acted upon', () => {
142
- assert.throws(
143
- () => runnablePersona(personas, 'observed'),
144
- /declared as acted upon, never run/
145
- )
146
- })
147
- })
148
-
149
- describe('requireVirtualUserRunStore', () => {
150
- test('says which store to wire rather than failing on undefined', () => {
151
- assert.throws(
152
- () => requireVirtualUserRunStore(undefined),
153
- /KyselyVirtualUserRunStore/
154
- )
155
- })
156
-
157
- test('a read says there are no runs, not that one cannot be recorded', () => {
158
- assert.throws(
159
- () => requireVirtualUserRunStore(undefined, true),
160
- /there are no runs to read/
161
- )
162
- })
163
- })
164
-
165
- describe('startVirtualUserRun', () => {
166
- test('records the run before the caller gets the id back', async () => {
167
- const { store, started } = runStore()
168
- const run = await startVirtualUserRun({
169
- store,
170
- personas,
171
- config: undefined,
172
- persona: 'susan',
173
- startedBy: 'user-1',
174
- })
175
- assert.equal(run.runId, 'run-1')
176
- assert.equal(started.length, 1)
177
- assert.equal(started[0].persona, 'susan')
178
- assert.equal(started[0].startedBy, 'user-1')
179
- })
180
-
181
- // The seed is what makes a finding reproducible; deciding it inside the
182
- // engine would lose it whenever a run dies before returning.
183
- test('seeds the run before the record is written', async () => {
184
- const { store, started } = runStore()
185
- const run = await startVirtualUserRun({
186
- store,
187
- personas,
188
- config: undefined,
189
- persona: 'susan',
190
- })
191
- assert.equal(typeof started[0].seed, 'number')
192
- assert.equal(started[0].seed, run.seed)
193
- })
194
-
195
- test('a seed that was asked for is the one recorded', async () => {
196
- const { store, started } = runStore()
197
- await startVirtualUserRun({
198
- store,
199
- personas,
200
- config: undefined,
201
- persona: 'susan',
202
- seed: 42,
203
- })
204
- assert.equal(started[0].seed, 42)
205
- })
206
-
207
- test('the disposition falls back to what the persona declares', async () => {
208
- const { store, started } = runStore()
209
- await startVirtualUserRun({
210
- store,
211
- personas,
212
- config: undefined,
213
- persona: 'susan',
214
- })
215
- assert.equal(started[0].disposition, 'realistic')
216
- })
217
-
218
- test('refuses every disposition but the accountable one in production', async () => {
219
- const { store, started } = runStore()
220
- await assert.rejects(
221
- startVirtualUserRun({
222
- store,
223
- personas,
224
- config: { nodeEnv: 'production' },
225
- persona: 'susan',
226
- disposition: 'adversarial',
227
- }),
228
- /Only the 'accountable' disposition may run against production/
229
- )
230
- assert.equal(started.length, 0)
231
- })
232
-
233
- // Checked against the effective disposition, so an override cannot smuggle
234
- // one past a persona that declares the safe one.
235
- test('the accountable disposition is allowed through in production', async () => {
236
- const { store, started } = runStore()
237
- await startVirtualUserRun({
238
- store,
239
- personas,
240
- config: { nodeEnv: 'production' },
241
- persona: 'susan',
242
- disposition: 'accountable',
243
- })
244
- assert.equal(started[0].disposition, 'accountable')
245
- })
246
-
247
- // The case NODE_ENV cannot answer: a staging environment that is a production
248
- // mirror runs NODE_ENV=production too, and refusing every disposition there
249
- // refuses them on the one environment they exist to be used on.
250
- test('a non-production environment allows a probing disposition', async () => {
251
- const { store, started } = runStore()
252
- await startVirtualUserRun({
253
- store,
254
- personas,
255
- config: { nodeEnv: 'production' },
256
- environments: { staging: {}, production: { production: true } },
257
- environment: 'staging',
258
- persona: 'susan',
259
- disposition: 'adversarial',
260
- })
261
- assert.equal(started[0].disposition, 'adversarial')
262
- })
263
-
264
- test('the configured production environment still refuses one', async () => {
265
- const { store, started } = runStore()
266
- await assert.rejects(
267
- startVirtualUserRun({
268
- store,
269
- personas,
270
- config: { nodeEnv: 'development' },
271
- environments: { staging: {}, production: { production: true } },
272
- environment: 'production',
273
- persona: 'susan',
274
- disposition: 'adversarial',
275
- }),
276
- /Only the 'accountable' disposition may run against production/
277
- )
278
- assert.equal(started.length, 0)
279
- })
280
-
281
- // An environment nobody can name is one whose data nobody can vouch for.
282
- // PIKKU_ENV is cleared rather than passed as undefined: it is the default the
283
- // parameter falls back to, so leaving it set would test the wrong thing.
284
- test('an unresolved environment is treated as production', async () => {
285
- const { store, started } = runStore()
286
- const pikkuEnv = process.env.PIKKU_ENV
287
- delete process.env.PIKKU_ENV
288
- try {
289
- await assert.rejects(
290
- startVirtualUserRun({
291
- store,
292
- personas,
293
- config: { nodeEnv: 'development' },
294
- environments: { staging: {}, production: { production: true } },
295
- persona: 'susan',
296
- disposition: 'adversarial',
297
- }),
298
- /Only the 'accountable' disposition may run against production/
299
- )
300
- } finally {
301
- if (pikkuEnv !== undefined) process.env.PIKKU_ENV = pikkuEnv
302
- }
303
- assert.equal(started.length, 0)
304
- })
305
-
306
- test('refuses a persona that is declared as acted upon', async () => {
307
- const { store, started } = runStore()
308
- await assert.rejects(
309
- startVirtualUserRun({
310
- store,
311
- personas,
312
- config: undefined,
313
- persona: 'observed',
314
- }),
315
- /declared as acted upon, never run/
316
- )
317
- assert.equal(started.length, 0)
318
- })
319
-
320
- // A run record outlives the run and is read back over RPC, so a credential
321
- // stored on it is a credential anyone with read scope can collect. There is
322
- // no parameter to pass one in with, which is the guarantee.
323
- test('nothing credential-shaped reaches the record', async () => {
324
- const { store, started } = runStore()
325
- await startVirtualUserRun({
326
- store,
327
- personas,
328
- config: undefined,
329
- persona: 'susan',
330
- })
331
- assert.deepEqual(Object.keys(started[0]).sort(), [
332
- 'disposition',
333
- 'goals',
334
- 'memory',
335
- 'persona',
336
- 'seed',
337
- 'startedBy',
338
- ])
339
- })
340
- })
341
-
342
- const record = (): VirtualUserRunRecord =>
343
- ({
344
- runId: 'run-1',
345
- persona: 'susan',
346
- disposition: 'realistic',
347
- seed: 7,
348
- status: 'complete',
349
- goals: [],
350
- memory: {},
351
- findings: [
352
- {
353
- kind: 'a-kind-invented-tomorrow',
354
- detail: 'something',
355
- rpcName: 'getThing',
356
- status: 500,
357
- intentId: 'i1',
358
- step: 3,
359
- },
360
- ],
361
- intents: [
362
- {
363
- id: 'i1',
364
- sourceId: 's1',
365
- title: 'Buy a thing',
366
- status: 'done',
367
- steps: 3,
368
- suspensions: 0,
369
- summary: 'bought it',
370
- },
371
- ],
372
- tally: { steps: 3 },
373
- stoppedBy: null,
374
- error: null,
375
- createdAt: new Date('2026-01-01T00:00:00.000Z'),
376
- finishedAt: new Date('2026-01-01T00:05:00.000Z'),
377
- }) as unknown as VirtualUserRunRecord
378
-
379
- describe('serializeVirtualUserRun', () => {
380
- test('dates cross as strings, since a wire has no Date', () => {
381
- const wire = serializeVirtualUserRun(record())
382
- assert.equal(wire.createdAt, '2026-01-01T00:00:00.000Z')
383
- assert.equal(wire.finishedAt, '2026-01-01T00:05:00.000Z')
384
- })
385
-
386
- // A client built before a finding kind existed should still be able to read a
387
- // run that turned one up.
388
- test('leaves the finding kind open rather than enumerating today s kinds', () => {
389
- const wire = serializeVirtualUserRun(record())
390
- assert.equal(wire.findings[0]!.kind, 'a-kind-invented-tomorrow')
391
- })
392
-
393
- test('carries the seed out with the run, so a finding can be replayed', () => {
394
- assert.equal(serializeVirtualUserRun(record()).seed, 7)
395
- })
396
-
397
- test('a run still going has no finish time rather than a wrong one', () => {
398
- const wire = serializeVirtualUserRun({
399
- ...record(),
400
- finishedAt: null,
401
- } as VirtualUserRunRecord)
402
- assert.equal(wire.finishedAt, null)
403
- })
404
- })
405
-
406
- describe('serializeVirtualUserSteps', () => {
407
- test('a turn carries what it called, what came back, and what it cost', () => {
408
- const steps = serializeVirtualUserSteps([
409
- {
410
- index: 0,
411
- intentId: 'i1',
412
- action: { kind: 'call', rpcName: 'getThing' },
413
- status: 200,
414
- ok: true,
415
- response: '{}',
416
- findingKinds: ['slow'],
417
- tokensIn: 10,
418
- tokensOut: 20,
419
- },
420
- ] as any)
421
- assert.equal(steps.length, 1)
422
- assert.deepEqual(steps[0]!.action, { kind: 'call', rpcName: 'getThing' })
423
- assert.equal(steps[0]!.tokensIn, 10)
424
- assert.deepEqual(steps[0]!.findingKinds, ['slow'])
425
- })
426
- })
427
-
428
- const schedule = (): VirtualUserScheduleRecord =>
429
- ({
430
- persona: 'susan',
431
- enabled: true,
432
- disposition: 'adversarial',
433
- goals: ['Break checkout'],
434
- budget: { steps: 20, mutations: 5, duration: 600_000 },
435
- minIntervalMs: 3_600_000,
436
- maxIntervalMs: 7_200_000,
437
- nextRunAt: new Date('2026-01-02T00:00:00.000Z'),
438
- lastRunId: 'run-1',
439
- lastRunAt: new Date('2026-01-01T00:00:00.000Z'),
440
- }) as VirtualUserScheduleRecord
441
-
442
- describe('serializeVirtualUserSchedule', () => {
443
- // A schedule is enabled once and then outlives the declaration it was written
444
- // from, so both sides have to travel for anyone to see they have parted ways.
445
- test('a schedule carries what the persona currently declares', () => {
446
- const wire = serializeVirtualUserSchedule(schedule(), personas)
447
- assert.equal(wire.disposition, 'adversarial')
448
- assert.equal(wire.declared.disposition, 'realistic')
449
- assert.deepEqual(wire.declared.goals, ['Get the weekly order in'])
450
- })
451
-
452
- // Which fields differ is a question about how to render two values, and the
453
- // answer belongs where they are rendered.
454
- test('the difference is left for the client to work out', () => {
455
- const wire = serializeVirtualUserSchedule(schedule(), personas)
456
- assert.equal('drifted' in wire, false)
457
- })
458
-
459
- test('the budget crosses as durationMs, which is what every call here takes', () => {
460
- const wire = serializeVirtualUserSchedule(schedule(), personas)
461
- assert.equal(wire.budget!.durationMs, 600_000)
462
- })
463
-
464
- // The engine's own duration also accepts `'30m'`, which nothing on this side
465
- // ever writes — so it is dropped rather than sent as a number it is not.
466
- test('a duration that is not a number does not cross as one', () => {
467
- const wire = serializeVirtualUserSchedule(
468
- {
469
- ...schedule(),
470
- budget: { steps: 1, mutations: 1, duration: '30m' },
471
- } as unknown as VirtualUserScheduleRecord,
472
- personas
473
- )
474
- assert.equal(wire.budget!.durationMs, undefined)
475
- })
476
-
477
- test('a persona nobody declares any more still renders', () => {
478
- const wire = serializeVirtualUserSchedule(
479
- { ...schedule(), persona: 'gone' } as VirtualUserScheduleRecord,
480
- personas
481
- )
482
- assert.equal(wire.declared.disposition, 'realistic')
483
- assert.deepEqual(wire.declared.goals, [])
484
- })
485
- })
486
-
487
- describe('writeVirtualUserSchedule', () => {
488
- const scheduleStore = () => {
489
- const writes: any[] = []
490
- return {
491
- writes,
492
- store: {
493
- set: async (input: any) => {
494
- writes.push(input)
495
- return { ...schedule(), ...input }
496
- },
497
- get: async () => null,
498
- list: async () => [],
499
- due: async () => [],
500
- claim: async () => true,
501
- remove: async () => {},
502
- } as unknown as VirtualUserScheduleStore,
503
- }
504
- }
505
-
506
- test('says which store to wire rather than failing on undefined', async () => {
507
- await assert.rejects(
508
- writeVirtualUserSchedule({
509
- store: undefined,
510
- personas,
511
- persona: 'susan',
512
- }),
513
- /KyselyVirtualUserScheduleStore/
514
- )
515
- })
516
-
517
- // The same rule a run enforces, applied at the point the row is written
518
- // rather than every hour afterwards.
519
- test('refuses a cadence for a persona that is only ever acted upon', async () => {
520
- const { store, writes } = scheduleStore()
521
- await assert.rejects(
522
- writeVirtualUserSchedule({ store, personas, persona: 'observed' }),
523
- /declared as acted upon, never run/
524
- )
525
- assert.equal(writes.length, 0)
526
- })
527
-
528
- test('durationMs is written as the budget duration the engine reads', async () => {
529
- const { store, writes } = scheduleStore()
530
- await writeVirtualUserSchedule({
531
- store,
532
- personas,
533
- persona: 'susan',
534
- budget: { steps: 3, durationMs: 1_000 },
535
- })
536
- assert.deepEqual(writes[0].budget, {
537
- steps: 3,
538
- mutations: undefined,
539
- duration: 1_000,
540
- })
541
- })
542
-
543
- // Clearing a budget and leaving it alone are different writes, and both have
544
- // to survive the mapping.
545
- test('an absent budget is left alone and a null one is cleared', async () => {
546
- const { store, writes } = scheduleStore()
547
- await writeVirtualUserSchedule({ store, personas, persona: 'susan' })
548
- assert.equal(writes[0].budget, undefined)
549
- await writeVirtualUserSchedule({
550
- store,
551
- personas,
552
- persona: 'susan',
553
- budget: null,
554
- })
555
- assert.equal(writes[1].budget, null)
556
- })
557
-
558
- test('a next run time crosses as a string and is stored as a date', async () => {
559
- const { store, writes } = scheduleStore()
560
- await writeVirtualUserSchedule({
561
- store,
562
- personas,
563
- persona: 'susan',
564
- nextRunAt: '2026-03-01T00:00:00.000Z',
565
- })
566
- assert.ok(writes[0].nextRunAt instanceof Date)
567
- assert.equal(writes[0].nextRunAt.toISOString(), '2026-03-01T00:00:00.000Z')
568
- })
569
- })
570
-
571
- describe('virtualUserScheduleRunInput', () => {
572
- // The tick starts a run through the same gated entry point a person calls, so
573
- // what it sends has to be the shape that entry point takes.
574
- test('a due schedule becomes the input runVirtualUser accepts', () => {
575
- const input = virtualUserScheduleRunInput(schedule())
576
- assert.deepEqual(input, {
577
- persona: 'susan',
578
- disposition: 'adversarial',
579
- goals: ['Break checkout'],
580
- budget: { steps: 20, mutations: 5, durationMs: 600_000 },
581
- })
582
- })
583
-
584
- test('no budget on the row means no budget on the run', () => {
585
- const input = virtualUserScheduleRunInput({
586
- ...schedule(),
587
- budget: null,
588
- } as VirtualUserScheduleRecord)
589
- assert.equal(input.budget, undefined)
590
- })
591
- })
592
-
593
- describe('logVirtualUserTick', () => {
594
- // The caller is a cron, so a run this started is otherwise the only trace
595
- // that a persona is still out there working.
596
- test('everything a tick did is written down, since nobody is watching', () => {
597
- const { logger, lines } = silentLogger()
598
- logVirtualUserTick(logger, {
599
- dispatched: [{ persona: 'susan', runId: 'run-9' }],
600
- reaped: ['run-8'],
601
- skipped: [{ persona: 'observed', reason: 'not due' }],
602
- } as any)
603
- assert.equal(lines.length, 3)
604
- assert.match(lines[0]!, /^info Virtual user susan started run run-9/)
605
- assert.match(lines[1]!, /^warn Virtual user run run-8 was abandoned/)
606
- assert.match(lines[2]!, /^info Virtual user observed skipped this tick/)
607
- })
608
- })
609
-
610
- describe('executeVirtualUserRun', () => {
611
- const params = (overrides: Record<string, unknown> = {}) => {
612
- const { store, completed, failed } = runStore()
613
- const { logger, lines } = silentLogger()
614
- return {
615
- completed,
616
- failed,
617
- lines,
618
- params: {
619
- runStore: store,
620
- metaService: emptyMeta,
621
- agentRunner: { run: async () => ({}) } as any,
622
- variables: variables({}),
623
- logger,
624
- personas,
625
- createPersonas: () => ({}) as any,
626
- runId: 'run-1',
627
- persona: 'susan',
628
- disposition: 'realistic',
629
- goals: [],
630
- memory: {},
631
- seed: 1,
632
- ...overrides,
633
- } as any,
634
- }
635
- }
636
-
637
- // The record is the only place a crashed run and a run that found nothing are
638
- // different states; leaving it at 'running' forever is what `fail` prevents.
639
- test('a run that cannot start is failed on the record, not left running', async () => {
640
- const { params: p, failed, lines } = params()
641
- await assert.rejects(
642
- executeVirtualUserRun(p),
643
- /VIRTUAL_USER_API_URL is not set/
644
- )
645
- assert.equal(failed.length, 1)
646
- assert.equal(failed[0].runId, 'run-1')
647
- assert.match(failed[0].error, /VIRTUAL_USER_API_URL is not set/)
648
- assert.match(lines[0]!, /^error Virtual user run run-1 \(susan\) failed/)
649
- })
650
-
651
- test('says which credential is missing rather than assuming the local one', async () => {
652
- const { params: p } = params({
653
- variables: variables({ VIRTUAL_USER_API_URL: 'http://localhost:4000' }),
654
- })
655
- await assert.rejects(
656
- executeVirtualUserRun(p),
657
- /Neither an operator token nor SCENARIO_ACTOR_SECRET is available/
658
- )
659
- })
660
-
661
- test('a model to think with is not assumed either', async () => {
662
- const { params: p } = params({
663
- variables: variables({
664
- VIRTUAL_USER_API_URL: 'http://localhost:4000',
665
- SCENARIO_ACTOR_SECRET: 'shh',
666
- }),
667
- })
668
- await assert.rejects(
669
- executeVirtualUserRun(p),
670
- /VIRTUAL_USER_MODEL is not set/
671
- )
672
- })
673
-
674
- // Asymmetric, so the stage can verify one and can never mint one. The actor
675
- // secret is symmetric and only `pikku dev` serves the endpoint that takes it.
676
- test('an operator token wins over the actor secret wherever both exist', async () => {
677
- let options: any
678
- const { params: p } = params({
679
- operatorToken: 'handed-in',
680
- variables: variables({
681
- VIRTUAL_USER_API_URL: 'http://localhost:4000',
682
- SCENARIO_ACTOR_SECRET: 'shh',
683
- VIRTUAL_USER_MODEL: 'a-model',
684
- SCENARIO_SIGN_IN_PATH: '/api/auth/sign-in/actor',
685
- }),
686
- createPersonas: (given: any) => {
687
- options = given
688
- return {}
689
- },
690
- })
691
- await assert.rejects(executeVirtualUserRun(p), /cannot sign in/)
692
- assert.equal(options.secret, undefined)
693
- assert.equal(options.operator.token, 'handed-in')
694
- assert.equal(options.operator.signInPath, '/api/auth/sign-in/fabric')
695
- // The actor door moves with the mount too, for the run that has no token.
696
- assert.equal(options.signInPath, '/api/auth/sign-in/actor')
697
- })
698
-
699
- test('a run nobody handed a token to falls back to the environment', async () => {
700
- let options: any
701
- const { params: p } = params({
702
- variables: variables({
703
- VIRTUAL_USER_API_URL: 'http://localhost:4000',
704
- FABRIC_OPERATOR_TOKEN: 'from-the-environment',
705
- VIRTUAL_USER_MODEL: 'a-model',
706
- }),
707
- createPersonas: (given: any) => {
708
- options = given
709
- return {}
710
- },
711
- })
712
- await assert.rejects(executeVirtualUserRun(p), /cannot sign in/)
713
- assert.equal(options.operator.token, 'from-the-environment')
714
- })
715
-
716
- test('with no token at all the actor secret is what signs in', async () => {
717
- let options: any
718
- const { params: p } = params({
719
- variables: variables({
720
- VIRTUAL_USER_API_URL: 'http://localhost:4000',
721
- SCENARIO_ACTOR_SECRET: 'shh',
722
- VIRTUAL_USER_MODEL: 'a-model',
723
- }),
724
- createPersonas: (given: any) => {
725
- options = given
726
- return {}
727
- },
728
- })
729
- await assert.rejects(executeVirtualUserRun(p), /cannot sign in/)
730
- assert.equal(options.secret, 'shh')
731
- assert.equal(options.operator, undefined)
732
- })
733
-
734
- test('a persona nobody declares any more is refused before signing in', async () => {
735
- let called = false
736
- const { params: p } = params({
737
- persona: 'gone',
738
- variables: variables({
739
- VIRTUAL_USER_API_URL: 'http://localhost:4000',
740
- SCENARIO_ACTOR_SECRET: 'shh',
741
- VIRTUAL_USER_MODEL: 'a-model',
742
- }),
743
- createPersonas: () => {
744
- called = true
745
- return {}
746
- },
747
- })
748
- await assert.rejects(
749
- executeVirtualUserRun(p),
750
- /Persona "gone" is no longer declared/
751
- )
752
- assert.equal(called, false)
753
- })
754
-
755
- // Reaching into pikku internals would make this a thing only the framework
756
- // can do, which is the opposite of a scaffold.
757
- test('derives everything through the public meta surface', async () => {
758
- const asked: string[] = []
759
- const { params: p } = params({
760
- metaService: {
761
- getFunctionsMeta: async () => {
762
- asked.push('functions')
763
- return {
764
- getThing: { inputSchemaName: 'GetThingInput' },
765
- other: { inputSchemaName: 'GetThingInput', outputSchemaName: null },
766
- }
767
- },
768
- getSchemas: async (names: string[]) => {
769
- asked.push(`schemas:${names.join(',')}`)
770
- return {}
771
- },
772
- getWorkflowMeta: async () => {
773
- asked.push('workflows')
774
- return {}
775
- },
776
- getSystemRolesMeta: async () => {
777
- asked.push('roles')
778
- return {}
779
- },
780
- getAgentsMeta: async () => {
781
- asked.push('agents')
782
- return {}
783
- },
784
- },
785
- variables: variables({
786
- VIRTUAL_USER_API_URL: 'http://localhost:4000',
787
- SCENARIO_ACTOR_SECRET: 'shh',
788
- VIRTUAL_USER_MODEL: 'a-model',
789
- }),
790
- })
791
- await assert.rejects(executeVirtualUserRun(p), /cannot sign in/)
792
- assert.ok(asked.includes('functions'))
793
- assert.ok(asked.includes('workflows'))
794
- assert.ok(asked.includes('roles'))
795
- assert.ok(asked.includes('agents'))
796
- // Only the schemas the catalogue can refer to, asked for once each — a
797
- // large app would otherwise pull every schema it has into one run.
798
- assert.ok(asked.includes('schemas:GetThingInput'))
799
- })
800
-
801
- // A budget of no steps runs the engine without letting it take a turn, which
802
- // is the cheapest way to prove the whole path down to the record.
803
- test('the transcript a run produced is stored, not discarded', async () => {
804
- const {
805
- params: p,
806
- completed,
807
- failed,
808
- } = params({
809
- budget: { steps: 0 },
810
- variables: variables({
811
- VIRTUAL_USER_API_URL: 'http://localhost:4000',
812
- SCENARIO_ACTOR_SECRET: 'shh',
813
- VIRTUAL_USER_MODEL: 'a-model',
814
- }),
815
- createPersonas: () => ({
816
- susan: {
817
- name: 'susan',
818
- email: 'susan@actors.local',
819
- invokeRaw: async () => ({ status: 200, body: {} }),
820
- converse: async () => ({
821
- passed: true,
822
- reasoning: '',
823
- transcript: [],
824
- }),
825
- },
826
- }),
827
- })
828
- const result = await executeVirtualUserRun(p)
829
- assert.equal(result.findings, 0)
830
- assert.equal(failed.length, 0)
831
- assert.equal(completed.length, 1)
832
- assert.equal(completed[0].runId, 'run-1')
833
- const outcome = completed[0].outcome
834
- assert.deepEqual(Object.keys(outcome).sort(), [
835
- 'findings',
836
- 'intents',
837
- 'memory',
838
- 'steps',
839
- 'stoppedBy',
840
- 'tally',
841
- ])
842
- assert.equal(outcome.stoppedBy, 'budget-steps')
843
- })
844
-
845
- test('nothing to think with is a wiring problem, said as one', async () => {
846
- const { params: p } = params({ agentRunner: undefined })
847
- await assert.rejects(executeVirtualUserRun(p), /agentRunner is not wired/)
848
- })
849
-
850
- test('nothing to derive from is a wiring problem, said as one', async () => {
851
- const { params: p } = params({ metaService: undefined })
852
- await assert.rejects(executeVirtualUserRun(p), /metaService is not wired/)
853
- })
854
- })