@pikku/core 0.12.106 → 0.12.111

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (589) hide show
  1. package/CHANGELOG.md +358 -0
  2. package/dist/analytics/analytics.d.ts +6 -0
  3. package/dist/analytics/analytics.js +58 -0
  4. package/dist/analytics/analytics.types.d.ts +156 -0
  5. package/dist/analytics/analytics.types.js +1 -0
  6. package/dist/analytics/anonymous-analytics-identity.d.ts +23 -0
  7. package/dist/analytics/anonymous-analytics-identity.js +27 -0
  8. package/dist/analytics/compose-analytics-identity.d.ts +14 -0
  9. package/dist/analytics/compose-analytics-identity.js +33 -0
  10. package/dist/analytics/cookie-analytics-identity.d.ts +24 -0
  11. package/dist/analytics/cookie-analytics-identity.js +37 -0
  12. package/dist/analytics/define-analytics-events.d.ts +22 -0
  13. package/dist/analytics/define-analytics-events.js +9 -0
  14. package/dist/analytics/fan-out-analytics.d.ts +15 -0
  15. package/dist/analytics/fan-out-analytics.js +36 -0
  16. package/dist/analytics/index.d.ts +13 -0
  17. package/dist/analytics/index.js +8 -0
  18. package/dist/analytics/logger-analytics-service.d.ts +14 -0
  19. package/dist/analytics/logger-analytics-service.js +23 -0
  20. package/dist/analytics/mint-cookie.d.ts +44 -0
  21. package/dist/analytics/mint-cookie.js +55 -0
  22. package/dist/errors/errors.d.ts +7 -0
  23. package/dist/errors/errors.js +17 -0
  24. package/dist/function/function-meta.types.d.ts +2 -0
  25. package/dist/function/function-runner.js +29 -0
  26. package/dist/function/functions.types.d.ts +22 -3
  27. package/dist/middleware/auth-apikey.d.ts +1 -1
  28. package/dist/pikku-state.d.ts +1 -1
  29. package/dist/scopes.d.ts +11 -0
  30. package/dist/scopes.js +17 -0
  31. package/dist/services/credential-wire-service.d.ts +1 -1
  32. package/dist/services/feature-flag-service.d.ts +100 -0
  33. package/dist/services/feature-flag-service.js +1 -0
  34. package/dist/services/index.d.ts +1 -0
  35. package/dist/services/meta-service.d.ts +16 -0
  36. package/dist/services/meta-service.js +19 -0
  37. package/dist/services/webhook-service.d.ts +7 -2
  38. package/dist/services/webhook-service.js +11 -6
  39. package/dist/testing/service-tests/agent-run-service-tests.d.ts +2 -2
  40. package/dist/testing/service-tests/agent-storage-service-tests.d.ts +1 -1
  41. package/dist/testing/service-tests/channel-store-tests.d.ts +1 -1
  42. package/dist/testing/service-tests/credential-service-tests.d.ts +1 -1
  43. package/dist/testing/service-tests/deployment-service-tests.d.ts +1 -1
  44. package/dist/testing/service-tests/event-hub-store-tests.d.ts +1 -1
  45. package/dist/testing/service-tests/secret-service-tests.d.ts +1 -1
  46. package/dist/testing/service-tests/session-store-tests.d.ts +1 -1
  47. package/dist/testing/service-tests/workflow-run-service-tests.d.ts +1 -1
  48. package/dist/testing/service-tests/workflow-service-tests.d.ts +1 -1
  49. package/dist/types/core.types.d.ts +23 -0
  50. package/dist/wirings/agent/agent-rpc.d.ts +1 -1
  51. package/dist/wirings/agent/agent-turn.d.ts +1 -1
  52. package/dist/wirings/agent-scorer/agent-scorer-live.d.ts +1 -1
  53. package/dist/wirings/channel/channel-common.d.ts +1 -1
  54. package/dist/wirings/channel/channel-rpc-validators.d.ts +2 -2
  55. package/dist/wirings/channel/channel-runner.d.ts +1 -1
  56. package/dist/wirings/channel/local/local-channel-runner.d.ts +1 -1
  57. package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +1 -1
  58. package/dist/wirings/cli/channel/cli-approval.d.ts +2 -2
  59. package/dist/wirings/flag/assert-feature-available.d.ts +15 -0
  60. package/dist/wirings/flag/assert-feature-available.js +23 -0
  61. package/dist/wirings/flag/cached-flag-source.d.ts +73 -0
  62. package/dist/wirings/flag/cached-flag-source.js +96 -0
  63. package/dist/wirings/flag/define-feature-flags.d.ts +33 -0
  64. package/dist/wirings/flag/define-feature-flags.js +32 -0
  65. package/dist/wirings/flag/flag.types.d.ts +97 -0
  66. package/dist/wirings/flag/flag.types.js +1 -0
  67. package/dist/wirings/flag/index.d.ts +7 -0
  68. package/dist/wirings/flag/index.js +5 -0
  69. package/dist/wirings/flag/resolve-flag.d.ts +52 -0
  70. package/dist/wirings/flag/resolve-flag.js +90 -0
  71. package/dist/wirings/flag/validate-flag-definitions.d.ts +26 -0
  72. package/dist/wirings/flag/validate-flag-definitions.js +103 -0
  73. package/dist/wirings/rpc/rpc-runner.js +3 -0
  74. package/dist/wirings/virtual-user/virtual-user-scaffold.d.ts +8 -8
  75. package/dist/wirings/virtual-user/virtual-user-schedule.d.ts +1 -1
  76. package/dist/wirings/workflow/workflow-queue-routing.d.ts +1 -1
  77. package/package.json +11 -5
  78. package/run-tests.sh +17 -9
  79. package/src/public-surface.json +26 -0
  80. package/src/agent-naming.test.ts +0 -68
  81. package/src/api-report.test.ts +0 -138
  82. package/src/app-alias-surface.test.ts +0 -179
  83. package/src/app-leaf-surface.test.ts +0 -222
  84. package/src/bootstrap-compat/root.ts +0 -20
  85. package/src/classification/column-form.test.ts +0 -97
  86. package/src/classification/column-form.ts +0 -55
  87. package/src/classification/data-classification.ts +0 -73
  88. package/src/classification/index.ts +0 -40
  89. package/src/classification/key-ids.ts +0 -2
  90. package/src/classification/secret-value.test.ts +0 -204
  91. package/src/classification/secret-value.ts +0 -106
  92. package/src/crypto-utils.test.ts +0 -668
  93. package/src/crypto-utils.ts +0 -460
  94. package/src/dev/hot-reload.test.ts +0 -587
  95. package/src/dev/hot-reload.ts +0 -225
  96. package/src/dev/module-runner.test.ts +0 -235
  97. package/src/dev/module-runner.ts +0 -138
  98. package/src/dev/reload-meta.test.ts +0 -183
  99. package/src/dev/reload-meta.ts +0 -144
  100. package/src/ecosystem-tier-removed.test.ts +0 -72
  101. package/src/env.ts +0 -1
  102. package/src/errors/error-handler.ts +0 -77
  103. package/src/errors/error.test.ts +0 -229
  104. package/src/errors/errors.ts +0 -393
  105. package/src/errors/index.ts +0 -11
  106. package/src/errors/serialized-error.ts +0 -12
  107. package/src/factory-functions.test.ts +0 -111
  108. package/src/function/abort-scope.test.ts +0 -97
  109. package/src/function/abort-scope.ts +0 -80
  110. package/src/function/function-meta.types.ts +0 -151
  111. package/src/function/function-runner.test.ts +0 -1619
  112. package/src/function/function-runner.ts +0 -499
  113. package/src/function/functions.types.ts +0 -319
  114. package/src/function/index.ts +0 -40
  115. package/src/function/list.types.test.ts +0 -100
  116. package/src/function/list.types.ts +0 -69
  117. package/src/function/pikku-request.test.ts +0 -35
  118. package/src/function/pikku-request.ts +0 -17
  119. package/src/gopass-secrets-removed.test.ts +0 -51
  120. package/src/handle-error.test.ts +0 -532
  121. package/src/handle-error.ts +0 -64
  122. package/src/middleware/auth-apikey.test.ts +0 -362
  123. package/src/middleware/auth-apikey.ts +0 -39
  124. package/src/middleware/auth-bearer.test.ts +0 -566
  125. package/src/middleware/auth-bearer.ts +0 -83
  126. package/src/middleware/auth-cookie.test.ts +0 -572
  127. package/src/middleware/auth-cookie.ts +0 -107
  128. package/src/middleware/cors.test.ts +0 -579
  129. package/src/middleware/cors.ts +0 -103
  130. package/src/middleware/index.ts +0 -30
  131. package/src/middleware/middleware-factories.ts +0 -76
  132. package/src/middleware/middleware.types.ts +0 -61
  133. package/src/middleware/remote-auth.test.ts +0 -547
  134. package/src/middleware/remote-auth.ts +0 -95
  135. package/src/middleware/remote-jobs-secret.ts +0 -35
  136. package/src/middleware/require-origin.test.ts +0 -115
  137. package/src/middleware/require-origin.ts +0 -79
  138. package/src/middleware/telemetry.ts +0 -83
  139. package/src/middleware-runner.test.ts +0 -578
  140. package/src/middleware-runner.ts +0 -232
  141. package/src/no-any-casts.test.ts +0 -57
  142. package/src/no-root-barrel.test.ts +0 -122
  143. package/src/permissions.test.ts +0 -256
  144. package/src/permissions.ts +0 -217
  145. package/src/pikku-state.test.ts +0 -198
  146. package/src/pikku-state.ts +0 -206
  147. package/src/production-barrels-stay-lean.test.ts +0 -110
  148. package/src/public-surface.test.ts +0 -133
  149. package/src/remote.test.ts +0 -173
  150. package/src/remote.ts +0 -56
  151. package/src/removed-legacy-exports.test.ts +0 -66
  152. package/src/run-tests-script.test.ts +0 -67
  153. package/src/schema.test.ts +0 -430
  154. package/src/schema.ts +0 -204
  155. package/src/scopes.test.ts +0 -203
  156. package/src/scopes.ts +0 -67
  157. package/src/services/agent-run-state-service.ts +0 -37
  158. package/src/services/agent-runner-service.ts +0 -238
  159. package/src/services/agent-storage-service.ts +0 -39
  160. package/src/services/ai-embedding-service.ts +0 -9
  161. package/src/services/audit-service.test.ts +0 -44
  162. package/src/services/audit-service.ts +0 -280
  163. package/src/services/content-service.ts +0 -65
  164. package/src/services/credential-service.ts +0 -20
  165. package/src/services/credential-wire-service.test.ts +0 -235
  166. package/src/services/credential-wire-service.ts +0 -120
  167. package/src/services/deployment-service.ts +0 -32
  168. package/src/services/email-service.test.ts +0 -100
  169. package/src/services/email-service.ts +0 -60
  170. package/src/services/email-template.test.ts +0 -311
  171. package/src/services/email-template.ts +0 -254
  172. package/src/services/file-scenario-run-store.test.ts +0 -349
  173. package/src/services/file-scenario-run-store.ts +0 -282
  174. package/src/services/gateway-service.ts +0 -5
  175. package/src/services/http-personas-converse.test.ts +0 -274
  176. package/src/services/http-personas.test.ts +0 -379
  177. package/src/services/http-personas.ts +0 -508
  178. package/src/services/in-memory-agent-run-state-service.ts +0 -87
  179. package/src/services/in-memory-queue-service.test.ts +0 -162
  180. package/src/services/in-memory-queue-service.ts +0 -78
  181. package/src/services/in-memory-session-store.test.ts +0 -58
  182. package/src/services/in-memory-session-store.ts +0 -20
  183. package/src/services/in-memory-trigger-service.ts +0 -47
  184. package/src/services/in-memory-workflow-service.test.ts +0 -430
  185. package/src/services/in-memory-workflow-service.ts +0 -595
  186. package/src/services/index.ts +0 -192
  187. package/src/services/istanbul-coverage-service.test.ts +0 -66
  188. package/src/services/istanbul-coverage-service.ts +0 -59
  189. package/src/services/jwt-service.ts +0 -15
  190. package/src/services/local-content-request-handler.test.ts +0 -240
  191. package/src/services/local-content-request-handler.ts +0 -295
  192. package/src/services/local-content.test.ts +0 -186
  193. package/src/services/local-content.ts +0 -242
  194. package/src/services/local-credential-service.ts +0 -63
  195. package/src/services/local-email-service.test.ts +0 -182
  196. package/src/services/local-email-service.ts +0 -43
  197. package/src/services/local-gateway-service.ts +0 -51
  198. package/src/services/local-secrets.test.ts +0 -95
  199. package/src/services/local-secrets.ts +0 -71
  200. package/src/services/local-variables.test.ts +0 -61
  201. package/src/services/local-variables.ts +0 -45
  202. package/src/services/logger-console.test.ts +0 -117
  203. package/src/services/logger-console.ts +0 -174
  204. package/src/services/logger.ts +0 -48
  205. package/src/services/meta-service.test.ts +0 -75
  206. package/src/services/meta-service.ts +0 -767
  207. package/src/services/persona-actor-secret.test.ts +0 -68
  208. package/src/services/persona-actor-secret.ts +0 -70
  209. package/src/services/persona-sign-in.test.ts +0 -219
  210. package/src/services/persona-sign-in.ts +0 -238
  211. package/src/services/personas-service.ts +0 -191
  212. package/src/services/pikku-user-id.test.ts +0 -62
  213. package/src/services/pikku-user-id.ts +0 -13
  214. package/src/services/queue-webhook-service.test.ts +0 -409
  215. package/src/services/queue-webhook-service.ts +0 -150
  216. package/src/services/remote-jobs.test.ts +0 -106
  217. package/src/services/remote-jobs.ts +0 -92
  218. package/src/services/scheduler-service.ts +0 -37
  219. package/src/services/schema-service.ts +0 -10
  220. package/src/services/scope-service.ts +0 -91
  221. package/src/services/scoped-credential-service.test.ts +0 -86
  222. package/src/services/scoped-credential-service.ts +0 -63
  223. package/src/services/scoped-secret-service.test.ts +0 -93
  224. package/src/services/scoped-secret-service.ts +0 -40
  225. package/src/services/secret-host-binding.test.ts +0 -138
  226. package/src/services/secret-host-binding.ts +0 -51
  227. package/src/services/secret-service.ts +0 -25
  228. package/src/services/secretless.test.ts +0 -54
  229. package/src/services/secretless.ts +0 -29
  230. package/src/services/session-store.ts +0 -9
  231. package/src/services/stub-tracker.test.ts +0 -104
  232. package/src/services/stub-tracker.ts +0 -175
  233. package/src/services/system-role-guard.test.ts +0 -96
  234. package/src/services/system-role-guard.ts +0 -71
  235. package/src/services/temporary-file-service.ts +0 -76
  236. package/src/services/trigger-service.ts +0 -5
  237. package/src/services/typed-credential-service.ts +0 -83
  238. package/src/services/typed-secret-service.test.ts +0 -204
  239. package/src/services/typed-secret-service.ts +0 -132
  240. package/src/services/typed-variables-service.test.ts +0 -166
  241. package/src/services/typed-variables-service.ts +0 -166
  242. package/src/services/user-session-service.test.ts +0 -147
  243. package/src/services/user-session-service.ts +0 -85
  244. package/src/services/v8-coverage-service.test.ts +0 -69
  245. package/src/services/v8-coverage-service.ts +0 -163
  246. package/src/services/variables-service.ts +0 -13
  247. package/src/services/webhook-service.ts +0 -147
  248. package/src/services/workflow-service.ts +0 -120
  249. package/src/side-effects-are-declared.test.ts +0 -84
  250. package/src/source-files-stay-composable.test.ts +0 -41
  251. package/src/template-alias-surface.test.ts +0 -240
  252. package/src/test-utils.ts +0 -38
  253. package/src/testing/index.ts +0 -3
  254. package/src/testing/service-tests/agent-run-service-tests.ts +0 -98
  255. package/src/testing/service-tests/agent-storage-service-tests.ts +0 -379
  256. package/src/testing/service-tests/channel-store-tests.ts +0 -98
  257. package/src/testing/service-tests/credential-service-tests.ts +0 -143
  258. package/src/testing/service-tests/deployment-service-tests.ts +0 -33
  259. package/src/testing/service-tests/event-hub-store-tests.ts +0 -48
  260. package/src/testing/service-tests/secret-service-tests.ts +0 -105
  261. package/src/testing/service-tests/session-store-tests.ts +0 -62
  262. package/src/testing/service-tests/workflow-run-service-tests.ts +0 -59
  263. package/src/testing/service-tests/workflow-service-tests.ts +0 -308
  264. package/src/testing/service-tests.ts +0 -95
  265. package/src/time-utils.test.ts +0 -56
  266. package/src/time-utils.ts +0 -89
  267. package/src/types/core.types.ts +0 -446
  268. package/src/types/index.ts +0 -25
  269. package/src/types/state.types.ts +0 -226
  270. package/src/types/typed-credentials.test.ts +0 -72
  271. package/src/utils/hash.test.ts +0 -68
  272. package/src/utils/hash.ts +0 -26
  273. package/src/utils/hmac.ts +0 -21
  274. package/src/utils/node-host-resolver.ts +0 -20
  275. package/src/utils/safe-fetch.test.ts +0 -515
  276. package/src/utils/safe-fetch.ts +0 -347
  277. package/src/utils.test.ts +0 -359
  278. package/src/utils.ts +0 -165
  279. package/src/version.test.ts +0 -80
  280. package/src/version.ts +0 -25
  281. package/src/wirings/actor-flow/actor-flow.types.ts +0 -40
  282. package/src/wirings/actor-flow/index.ts +0 -10
  283. package/src/wirings/actor-flow/run-conversation.test.ts +0 -187
  284. package/src/wirings/actor-flow/run-conversation.ts +0 -280
  285. package/src/wirings/addon/addon-auth-tags.test.ts +0 -219
  286. package/src/wirings/addon/addon-runner.ts +0 -236
  287. package/src/wirings/addon/addon-scopes.test.ts +0 -225
  288. package/src/wirings/addon/addon-secrets.test.ts +0 -391
  289. package/src/wirings/addon/index.ts +0 -12
  290. package/src/wirings/addon/remote-addon-auth.ts +0 -65
  291. package/src/wirings/addon/wire-addon.test.ts +0 -102
  292. package/src/wirings/addon/wire-addon.ts +0 -202
  293. package/src/wirings/addon/wire-remote-addon.ts +0 -41
  294. package/src/wirings/agent/agent-agui.test.ts +0 -1213
  295. package/src/wirings/agent/agent-agui.ts +0 -405
  296. package/src/wirings/agent/agent-authorization.test.ts +0 -208
  297. package/src/wirings/agent/agent-finalize.test.ts +0 -187
  298. package/src/wirings/agent/agent-finalize.ts +0 -197
  299. package/src/wirings/agent/agent-helpers.test.ts +0 -215
  300. package/src/wirings/agent/agent-helpers.ts +0 -96
  301. package/src/wirings/agent/agent-interrupt.test.ts +0 -833
  302. package/src/wirings/agent/agent-interrupt.ts +0 -400
  303. package/src/wirings/agent/agent-memory.test.ts +0 -397
  304. package/src/wirings/agent/agent-memory.ts +0 -496
  305. package/src/wirings/agent/agent-middleware.types.test.ts +0 -41
  306. package/src/wirings/agent/agent-model-config.test.ts +0 -103
  307. package/src/wirings/agent/agent-model-config.ts +0 -59
  308. package/src/wirings/agent/agent-prepare.test.ts +0 -977
  309. package/src/wirings/agent/agent-prepare.ts +0 -1083
  310. package/src/wirings/agent/agent-registry.test.ts +0 -455
  311. package/src/wirings/agent/agent-registry.ts +0 -99
  312. package/src/wirings/agent/agent-resume-authorization.test.ts +0 -206
  313. package/src/wirings/agent/agent-rpc.ts +0 -116
  314. package/src/wirings/agent/agent-runner.test.ts +0 -1229
  315. package/src/wirings/agent/agent-runner.ts +0 -858
  316. package/src/wirings/agent/agent-stream-delegate.test.ts +0 -381
  317. package/src/wirings/agent/agent-stream-output-hooks.test.ts +0 -353
  318. package/src/wirings/agent/agent-stream.test.ts +0 -1800
  319. package/src/wirings/agent/agent-stream.ts +0 -1639
  320. package/src/wirings/agent/agent-thread-ownership.test.ts +0 -297
  321. package/src/wirings/agent/agent-turn.test.ts +0 -65
  322. package/src/wirings/agent/agent-turn.ts +0 -122
  323. package/src/wirings/agent/agent-utils.ts +0 -20
  324. package/src/wirings/agent/agent.types.ts +0 -676
  325. package/src/wirings/agent/index.ts +0 -58
  326. package/src/wirings/agent/voice-input.test.ts +0 -220
  327. package/src/wirings/agent/voice-input.ts +0 -180
  328. package/src/wirings/agent/voice-output.test.ts +0 -510
  329. package/src/wirings/agent/voice-output.ts +0 -311
  330. package/src/wirings/agent-scorer/agent-scorer-grade.test.ts +0 -106
  331. package/src/wirings/agent-scorer/agent-scorer-grade.ts +0 -55
  332. package/src/wirings/agent-scorer/agent-scorer-judge.test.ts +0 -285
  333. package/src/wirings/agent-scorer/agent-scorer-judge.ts +0 -180
  334. package/src/wirings/agent-scorer/agent-scorer-live.test.ts +0 -174
  335. package/src/wirings/agent-scorer/agent-scorer-live.ts +0 -56
  336. package/src/wirings/agent-scorer/agent-scorer-registry.ts +0 -66
  337. package/src/wirings/agent-scorer/agent-scorer-sampling.test.ts +0 -34
  338. package/src/wirings/agent-scorer/agent-scorer-sampling.ts +0 -36
  339. package/src/wirings/agent-scorer/agent-scorer-snapshots.test.ts +0 -49
  340. package/src/wirings/agent-scorer/agent-scorer-snapshots.ts +0 -46
  341. package/src/wirings/agent-scorer/agent-scorer-worker.test.ts +0 -122
  342. package/src/wirings/agent-scorer/agent-scorer-worker.ts +0 -71
  343. package/src/wirings/agent-scorer/agent-scorer.ts +0 -102
  344. package/src/wirings/agent-scorer/agent-scorer.types.ts +0 -128
  345. package/src/wirings/agent-scorer/index.ts +0 -23
  346. package/src/wirings/channel/channel-common.ts +0 -102
  347. package/src/wirings/channel/channel-handler-shapes.test.ts +0 -72
  348. package/src/wirings/channel/channel-handler.test.ts +0 -322
  349. package/src/wirings/channel/channel-handler.ts +0 -259
  350. package/src/wirings/channel/channel-host-rpc.test.ts +0 -150
  351. package/src/wirings/channel/channel-host-rpc.ts +0 -69
  352. package/src/wirings/channel/channel-middleware-runner.test.ts +0 -188
  353. package/src/wirings/channel/channel-middleware-runner.ts +0 -126
  354. package/src/wirings/channel/channel-rpc-registry.ts +0 -116
  355. package/src/wirings/channel/channel-rpc-responder.ts +0 -117
  356. package/src/wirings/channel/channel-rpc-service.ts +0 -132
  357. package/src/wirings/channel/channel-rpc-validators.ts +0 -65
  358. package/src/wirings/channel/channel-rpc.test.ts +0 -841
  359. package/src/wirings/channel/channel-rpc.ts +0 -5
  360. package/src/wirings/channel/channel-rpc.types.ts +0 -160
  361. package/src/wirings/channel/channel-runner.ts +0 -164
  362. package/src/wirings/channel/channel-store.ts +0 -35
  363. package/src/wirings/channel/channel.types.ts +0 -193
  364. package/src/wirings/channel/define-channel-routes.ts +0 -5
  365. package/src/wirings/channel/eventhub-service.ts +0 -16
  366. package/src/wirings/channel/eventhub-store.ts +0 -13
  367. package/src/wirings/channel/index.ts +0 -40
  368. package/src/wirings/channel/local/index.ts +0 -3
  369. package/src/wirings/channel/local/local-channel-handler.ts +0 -98
  370. package/src/wirings/channel/local/local-channel-runner.test.ts +0 -339
  371. package/src/wirings/channel/local/local-channel-runner.ts +0 -271
  372. package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -77
  373. package/src/wirings/channel/local/local-eventhub-service.ts +0 -69
  374. package/src/wirings/channel/log-channels.ts +0 -16
  375. package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +0 -135
  376. package/src/wirings/channel/pikku-abstract-channel-handler.ts +0 -60
  377. package/src/wirings/channel/serverless/index.ts +0 -6
  378. package/src/wirings/channel/serverless/serverless-channel-runner.ts +0 -328
  379. package/src/wirings/cli/channel/cli-approval.test.ts +0 -177
  380. package/src/wirings/cli/channel/cli-approval.ts +0 -135
  381. package/src/wirings/cli/channel/cli-channel-runner.ts +0 -118
  382. package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +0 -192
  383. package/src/wirings/cli/channel/cli-raw-channel-runner.ts +0 -148
  384. package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +0 -480
  385. package/src/wirings/cli/channel/cli-raw-client-runner.ts +0 -188
  386. package/src/wirings/cli/channel/index.ts +0 -6
  387. package/src/wirings/cli/cli-runner.test.ts +0 -969
  388. package/src/wirings/cli/cli-runner.ts +0 -538
  389. package/src/wirings/cli/cli.types.ts +0 -388
  390. package/src/wirings/cli/command-parser.test.ts +0 -1120
  391. package/src/wirings/cli/command-parser.ts +0 -713
  392. package/src/wirings/cli/define-cli-commands.ts +0 -13
  393. package/src/wirings/cli/format-cli-error.test.ts +0 -91
  394. package/src/wirings/cli/format-cli-error.ts +0 -96
  395. package/src/wirings/cli/index.ts +0 -19
  396. package/src/wirings/credential/credential.types.ts +0 -37
  397. package/src/wirings/credential/define-credential.ts +0 -49
  398. package/src/wirings/credential/index.ts +0 -7
  399. package/src/wirings/credential/validate-credential-definitions.ts +0 -63
  400. package/src/wirings/gateway/gateway-authorization.test.ts +0 -575
  401. package/src/wirings/gateway/gateway-channel-meta.test.ts +0 -44
  402. package/src/wirings/gateway/gateway-runner.test.ts +0 -581
  403. package/src/wirings/gateway/gateway-runner.ts +0 -411
  404. package/src/wirings/gateway/gateway.types.ts +0 -137
  405. package/src/wirings/gateway/index.ts +0 -15
  406. package/src/wirings/http/http-routes.test.ts +0 -318
  407. package/src/wirings/http/http-routes.ts +0 -111
  408. package/src/wirings/http/http-runner-addon-ref.test.ts +0 -238
  409. package/src/wirings/http/http-runner.test.ts +0 -503
  410. package/src/wirings/http/http-runner.ts +0 -462
  411. package/src/wirings/http/http.types.ts +0 -307
  412. package/src/wirings/http/index.ts +0 -27
  413. package/src/wirings/http/log-http-routes.ts +0 -18
  414. package/src/wirings/http/pikku-fetch-http-request.test.ts +0 -318
  415. package/src/wirings/http/pikku-fetch-http-request.ts +0 -260
  416. package/src/wirings/http/pikku-fetch-http-response.test.ts +0 -123
  417. package/src/wirings/http/pikku-fetch-http-response.ts +0 -149
  418. package/src/wirings/http/routers/http-router.ts +0 -13
  419. package/src/wirings/http/routers/path-to-regex.test.ts +0 -306
  420. package/src/wirings/http/routers/path-to-regex.ts +0 -115
  421. package/src/wirings/http/web-request.test.ts +0 -382
  422. package/src/wirings/http/web-request.ts +0 -162
  423. package/src/wirings/mcp/index.ts +0 -26
  424. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -388
  425. package/src/wirings/mcp/mcp-endpoint-registry.ts +0 -159
  426. package/src/wirings/mcp/mcp-runner.test.ts +0 -588
  427. package/src/wirings/mcp/mcp-runner.ts +0 -330
  428. package/src/wirings/mcp/mcp.types.ts +0 -199
  429. package/src/wirings/node/index.ts +0 -2
  430. package/src/wirings/node/node.types.ts +0 -23
  431. package/src/wirings/oauth2/index.ts +0 -1
  432. package/src/wirings/oauth2/oauth2.types.ts +0 -12
  433. package/src/wirings/persona/define-personas.ts +0 -33
  434. package/src/wirings/persona/index.ts +0 -75
  435. package/src/wirings/persona/persona-app-scopes.test.ts +0 -47
  436. package/src/wirings/persona/persona-app-scopes.ts +0 -74
  437. package/src/wirings/persona/persona-email.ts +0 -87
  438. package/src/wirings/persona/persona-environments.test.ts +0 -194
  439. package/src/wirings/persona/persona-environments.ts +0 -138
  440. package/src/wirings/persona/persona-mailbox.ts +0 -156
  441. package/src/wirings/persona/persona.test.ts +0 -230
  442. package/src/wirings/persona/persona.types.ts +0 -156
  443. package/src/wirings/persona/validate-personas.ts +0 -137
  444. package/src/wirings/queue/index.ts +0 -29
  445. package/src/wirings/queue/queue-identity.test.ts +0 -454
  446. package/src/wirings/queue/queue-identity.ts +0 -176
  447. package/src/wirings/queue/queue-runner.test.ts +0 -705
  448. package/src/wirings/queue/queue-runner.ts +0 -181
  449. package/src/wirings/queue/queue.types.ts +0 -161
  450. package/src/wirings/queue/register-queue-helper.ts +0 -46
  451. package/src/wirings/queue/signed-queue-service.ts +0 -60
  452. package/src/wirings/queue/validate-worker-config.test.ts +0 -108
  453. package/src/wirings/queue/validate-worker-config.ts +0 -90
  454. package/src/wirings/role/define-system-role.ts +0 -33
  455. package/src/wirings/role/index.ts +0 -13
  456. package/src/wirings/role/role.test.ts +0 -104
  457. package/src/wirings/role/role.types.ts +0 -47
  458. package/src/wirings/role/validate-role-definitions.ts +0 -93
  459. package/src/wirings/rpc/index.ts +0 -8
  460. package/src/wirings/rpc/rpc-runner.test.ts +0 -1130
  461. package/src/wirings/rpc/rpc-runner.ts +0 -566
  462. package/src/wirings/rpc/rpc-types.ts +0 -87
  463. package/src/wirings/scheduler/index.ts +0 -11
  464. package/src/wirings/scheduler/log-schedulers.ts +0 -16
  465. package/src/wirings/scheduler/scheduler-runner.test.ts +0 -835
  466. package/src/wirings/scheduler/scheduler-runner.ts +0 -138
  467. package/src/wirings/scheduler/scheduler.types.ts +0 -42
  468. package/src/wirings/scope/define-scope.ts +0 -33
  469. package/src/wirings/scope/index.ts +0 -15
  470. package/src/wirings/scope/scope.test.ts +0 -159
  471. package/src/wirings/scope/scope.types.ts +0 -42
  472. package/src/wirings/scope/validate-scope-definitions.ts +0 -107
  473. package/src/wirings/secret/index.ts +0 -9
  474. package/src/wirings/secret/secret.types.ts +0 -70
  475. package/src/wirings/secret/validate-secret-definitions.test.ts +0 -232
  476. package/src/wirings/secret/validate-secret-definitions.ts +0 -88
  477. package/src/wirings/trigger/index.ts +0 -9
  478. package/src/wirings/trigger/pikku-trigger-service.ts +0 -107
  479. package/src/wirings/trigger/trigger-runner.test.ts +0 -78
  480. package/src/wirings/trigger/trigger-runner.ts +0 -113
  481. package/src/wirings/trigger/trigger.types.ts +0 -100
  482. package/src/wirings/variable/index.ts +0 -8
  483. package/src/wirings/variable/validate-variable-definitions.test.ts +0 -115
  484. package/src/wirings/variable/validate-variable-definitions.ts +0 -71
  485. package/src/wirings/variable/variable.types.ts +0 -40
  486. package/src/wirings/virtual-user/index.ts +0 -107
  487. package/src/wirings/virtual-user/prepare-virtual-user-run.test.ts +0 -115
  488. package/src/wirings/virtual-user/prepare-virtual-user-run.ts +0 -95
  489. package/src/wirings/virtual-user/run-virtual-user.test.ts +0 -774
  490. package/src/wirings/virtual-user/run-virtual-user.ts +0 -684
  491. package/src/wirings/virtual-user/virtual-user-agents.test.ts +0 -72
  492. package/src/wirings/virtual-user/virtual-user-agents.ts +0 -62
  493. package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +0 -215
  494. package/src/wirings/virtual-user/virtual-user-catalogue.ts +0 -184
  495. package/src/wirings/virtual-user/virtual-user-derive.test.ts +0 -426
  496. package/src/wirings/virtual-user/virtual-user-derive.ts +0 -161
  497. package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +0 -68
  498. package/src/wirings/virtual-user/virtual-user-dispositions.ts +0 -210
  499. package/src/wirings/virtual-user/virtual-user-intents.test.ts +0 -218
  500. package/src/wirings/virtual-user/virtual-user-intents.ts +0 -185
  501. package/src/wirings/virtual-user/virtual-user-rng.test.ts +0 -72
  502. package/src/wirings/virtual-user/virtual-user-rng.ts +0 -50
  503. package/src/wirings/virtual-user/virtual-user-run-store.ts +0 -131
  504. package/src/wirings/virtual-user/virtual-user-scaffold.test.ts +0 -854
  505. package/src/wirings/virtual-user/virtual-user-scaffold.ts +0 -664
  506. package/src/wirings/virtual-user/virtual-user-schedule-store.ts +0 -93
  507. package/src/wirings/virtual-user/virtual-user-schedule.test.ts +0 -280
  508. package/src/wirings/virtual-user/virtual-user-schedule.ts +0 -156
  509. package/src/wirings/virtual-user/virtual-user-target.ts +0 -47
  510. package/src/wirings/virtual-user/virtual-user.types.ts +0 -215
  511. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +0 -709
  512. package/src/wirings/workflow/dsl/workflow-runner.ts +0 -25
  513. package/src/wirings/workflow/feature.test.ts +0 -131
  514. package/src/wirings/workflow/feature.ts +0 -59
  515. package/src/wirings/workflow/graph/graph-foreach-queued.test.ts +0 -569
  516. package/src/wirings/workflow/graph/graph-foreach.test.ts +0 -626
  517. package/src/wirings/workflow/graph/graph-node.ts +0 -115
  518. package/src/wirings/workflow/graph/graph-runner.test.ts +0 -1049
  519. package/src/wirings/workflow/graph/graph-runner.ts +0 -1376
  520. package/src/wirings/workflow/graph/graph-validation.test.ts +0 -27
  521. package/src/wirings/workflow/graph/graph-validation.ts +0 -41
  522. package/src/wirings/workflow/graph/template.test.ts +0 -49
  523. package/src/wirings/workflow/graph/template.ts +0 -42
  524. package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -39
  525. package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -75
  526. package/src/wirings/workflow/index.ts +0 -107
  527. package/src/wirings/workflow/pikku-scenario-service.ts +0 -1013
  528. package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -963
  529. package/src/wirings/workflow/pikku-workflow-service.ts +0 -1993
  530. package/src/wirings/workflow/run-timeline.test.ts +0 -199
  531. package/src/wirings/workflow/run-timeline.ts +0 -185
  532. package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -107
  533. package/src/wirings/workflow/scenario-cookie-jar.ts +0 -57
  534. package/src/wirings/workflow/scenario-expectations.test.ts +0 -238
  535. package/src/wirings/workflow/scenario-hooks.test.ts +0 -259
  536. package/src/wirings/workflow/scenario-poll.test.ts +0 -64
  537. package/src/wirings/workflow/scenario-poll.ts +0 -27
  538. package/src/wirings/workflow/scenario-prose.test.ts +0 -275
  539. package/src/wirings/workflow/scenario-prose.ts +0 -86
  540. package/src/wirings/workflow/scenario-run.types.ts +0 -193
  541. package/src/wirings/workflow/scenario-service.test.ts +0 -147
  542. package/src/wirings/workflow/scenario-step-guards.ts +0 -23
  543. package/src/wirings/workflow/scenario-step.test.ts +0 -800
  544. package/src/wirings/workflow/scenario-step.types.ts +0 -262
  545. package/src/wirings/workflow/scenario-surface.test.ts +0 -146
  546. package/src/wirings/workflow/scenario-surface.ts +0 -71
  547. package/src/wirings/workflow/scenario.types.ts +0 -63
  548. package/src/wirings/workflow/workflow-approval-audit.ts +0 -47
  549. package/src/wirings/workflow/workflow-approval-policy.test.ts +0 -594
  550. package/src/wirings/workflow/workflow-approval-policy.ts +0 -68
  551. package/src/wirings/workflow/workflow-approval.ts +0 -290
  552. package/src/wirings/workflow/workflow-child-run-session.test.ts +0 -168
  553. package/src/wirings/workflow/workflow-constants.ts +0 -66
  554. package/src/wirings/workflow/workflow-dispatch-durability.test.ts +0 -116
  555. package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -55
  556. package/src/wirings/workflow/workflow-dispatch-relay.test.ts +0 -128
  557. package/src/wirings/workflow/workflow-errors.ts +0 -132
  558. package/src/wirings/workflow/workflow-inline-authority.test.ts +0 -175
  559. package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -51
  560. package/src/wirings/workflow/workflow-invocation-id.ts +0 -28
  561. package/src/wirings/workflow/workflow-meta-resolver.ts +0 -45
  562. package/src/wirings/workflow/workflow-mirror.test.ts +0 -171
  563. package/src/wirings/workflow/workflow-missing-meta.test.ts +0 -92
  564. package/src/wirings/workflow/workflow-on-error.test.ts +0 -145
  565. package/src/wirings/workflow/workflow-queue-routing.ts +0 -129
  566. package/src/wirings/workflow/workflow-queue-wiring.ts +0 -149
  567. package/src/wirings/workflow/workflow-queue-workers.test.ts +0 -131
  568. package/src/wirings/workflow/workflow-queue-workers.ts +0 -66
  569. package/src/wirings/workflow/workflow-recovery.ts +0 -192
  570. package/src/wirings/workflow/workflow-replay-snapshot.test.ts +0 -140
  571. package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -113
  572. package/src/wirings/workflow/workflow-run-authority.test.ts +0 -212
  573. package/src/wirings/workflow/workflow-run-context.test.ts +0 -172
  574. package/src/wirings/workflow/workflow-run-engine.types.ts +0 -92
  575. package/src/wirings/workflow/workflow-run-ownership.ts +0 -37
  576. package/src/wirings/workflow/workflow-run-polling.test.ts +0 -127
  577. package/src/wirings/workflow/workflow-stalled-recovery.test.ts +0 -152
  578. package/src/wirings/workflow/workflow-status-stream.test.ts +0 -354
  579. package/src/wirings/workflow/workflow-status-stream.ts +0 -144
  580. package/src/wirings/workflow/workflow-step-claim.ts +0 -46
  581. package/src/wirings/workflow/workflow-step-ordinal.test.ts +0 -94
  582. package/src/wirings/workflow/workflow-step-session.test.ts +0 -87
  583. package/src/wirings/workflow/workflow-suspend.ts +0 -61
  584. package/src/wirings/workflow/workflow-terminal-run-guard.test.ts +0 -105
  585. package/src/wirings/workflow/workflow.types.ts +0 -268
  586. package/src/wirings-stay-decoupled.test.ts +0 -130
  587. package/tsconfig.json +0 -14
  588. package/tsconfig.tsbuildinfo +0 -1
  589. package/tsconfig.type-tests.json +0 -15
@@ -1,210 +0,0 @@
1
- import type { VirtualUserDisposition } from './virtual-user.types.js'
2
-
3
- /**
4
- * The dials a disposition turns. Everything here changes what the engine does;
5
- * `instructions` is the only field the model ever sees, and it describes
6
- * behaviour the dials cannot express on their own.
7
- */
8
- export interface DispositionProfile {
9
- /** Appended to the persona instructions. Behaviour, never identity. */
10
- instructions: string
11
- /**
12
- * Relative weights for the scheduler's four moves. `continue` dominating is
13
- * what makes a run look like work rather than channel-surfing.
14
- */
15
- moves: {
16
- continue: number
17
- suspend: number
18
- resume: number
19
- abandon: number
20
- }
21
- /** Sampling temperature for the model's own turns. */
22
- temperature: number
23
- /** Chance of re-issuing the previous call unchanged — the double-click. */
24
- repeatRate: number
25
- /** Chance of re-reading before acting instead of trusting memory. */
26
- reReadRate: number
27
- /** Start with nothing remembered, whatever the caller seeded. */
28
- emptyMemory: boolean
29
- /** Non-read calls are refused by the engine, not merely discouraged. */
30
- readOnly: boolean
31
- /**
32
- * A 2xx is a finding rather than a success. The engine cannot know *whose*
33
- * resource an id belongs to, so it flags the success and leaves ownership to
34
- * the app's classifier — the honest split, since ownership is app knowledge.
35
- */
36
- invertedOracle: boolean
37
- }
38
-
39
- /**
40
- * Per-user overrides for a disposition's dials.
41
- *
42
- * The six profiles below are starting points, not laws — the weights are a
43
- * considered guess about how people behave, and your product is allowed to know
44
- * better. A user that declares `disposition: 'careless'` with a higher
45
- * `repeatRate` is still a careless user; it is the same behaviour tuned to a
46
- * product where double-submits actually happen.
47
- *
48
- * `instructions` is the one field that appends rather than replaces. Everything
49
- * else is a number the engine reads, so overriding it changes the run and
50
- * nothing else; instructions are the model's sense of who it is, and letting a
51
- * declaration replace them wholesale is how you end up with a `careless` user
52
- * that is not careless — which makes the name, and every run labelled with it,
53
- * a lie.
54
- */
55
- export interface VirtualUserTuning {
56
- /** Relative weights for the scheduler's moves. Merged over the profile's. */
57
- moves?: Partial<DispositionProfile['moves']>
58
- temperature?: number
59
- repeatRate?: number
60
- reReadRate?: number
61
- emptyMemory?: boolean
62
- readOnly?: boolean
63
- invertedOracle?: boolean
64
- /** Extra behaviour, appended to the disposition's own instructions. */
65
- instructions?: string
66
- }
67
-
68
- const REALISTIC: DispositionProfile = {
69
- instructions: [
70
- 'Work towards your current goal the way a competent user would.',
71
- 'Read an endpoint schema before you use it, and prefer values that a real person would plausibly enter.',
72
- ].join(' '),
73
- moves: { continue: 88, suspend: 6, resume: 5, abandon: 1 },
74
- temperature: 0.7,
75
- repeatRate: 0,
76
- reReadRate: 0.1,
77
- emptyMemory: false,
78
- readOnly: false,
79
- invertedOracle: false,
80
- }
81
-
82
- /**
83
- * The profiles, keyed by disposition. `careless` is the one worth reading twice:
84
- * it is not malice, it is an ordinary person being interrupted and impatient,
85
- * and it is where most production bugs actually live.
86
- */
87
- export const DISPOSITIONS: Readonly<
88
- Record<VirtualUserDisposition, DispositionProfile>
89
- > = {
90
- realistic: REALISTIC,
91
-
92
- careless: {
93
- ...REALISTIC,
94
- instructions: [
95
- 'You are busy and easily distracted. You act on what you half-remember rather than checking first,',
96
- 'you sometimes submit the same thing twice because you are not sure it went through,',
97
- 'and you are comfortable entering odd-but-legal values — a very long name, an empty optional field, an emoji, a huge page size.',
98
- 'Stay within what the schema allows; you are careless, not malicious.',
99
- ].join(' '),
100
- moves: { continue: 62, suspend: 18, resume: 12, abandon: 8 },
101
- temperature: 1,
102
- repeatRate: 0.18,
103
- reReadRate: 0.03,
104
- },
105
-
106
- newcomer: {
107
- ...REALISTIC,
108
- instructions: [
109
- 'This is your first time in this product. You know nothing about it and hold no ids or names in your head.',
110
- 'Find your way from whatever lists or lookups exist, and say plainly when there is no path forward from where you are.',
111
- ].join(' '),
112
- moves: { continue: 80, suspend: 8, resume: 6, abandon: 6 },
113
- temperature: 0.8,
114
- reReadRate: 0.4,
115
- emptyMemory: true,
116
- },
117
-
118
- stale: {
119
- ...REALISTIC,
120
- instructions: [
121
- 'You used this product a while ago and are working from notes you took then.',
122
- 'Reach for the ids and names you already have rather than looking them up again — some of them are out of date, and finding out how the product tells you so is the point.',
123
- ].join(' '),
124
- moves: { continue: 84, suspend: 8, resume: 6, abandon: 2 },
125
- temperature: 0.7,
126
- reReadRate: 0.02,
127
- },
128
-
129
- auditor: {
130
- ...REALISTIC,
131
- instructions: [
132
- 'You are reconciling, not achieving. Pick one fact the product reports — a total, a count, a balance, a status —',
133
- 'and read it from every endpoint that claims to know it, then say whether they agree.',
134
- 'Report a disagreement precisely: which endpoints, which field, which two values.',
135
- 'Never change anything.',
136
- ].join(' '),
137
- moves: { continue: 92, suspend: 4, resume: 4, abandon: 0 },
138
- temperature: 0.4,
139
- reReadRate: 0.5,
140
- readOnly: true,
141
- },
142
-
143
- adversarial: {
144
- ...REALISTIC,
145
- instructions: [
146
- 'You are testing whether this product actually enforces the boundaries it claims.',
147
- 'Try reaching resources that should not be yours, reusing identifiers you were given for one purpose in another,',
148
- 'and calling endpoints that look like they belong to someone with more authority than you.',
149
- 'You are probing authorization, not causing damage: never destroy data you can reach, and prefer reads over writes when either would prove the point.',
150
- ].join(' '),
151
- moves: { continue: 70, suspend: 10, resume: 8, abandon: 12 },
152
- temperature: 0.9,
153
- reReadRate: 0.2,
154
- invertedOracle: true,
155
- },
156
-
157
- // knowledge: decisions/internals/the-worker-disposition-is-the-one-that-is-not-testing.md
158
- accountable: {
159
- ...REALISTIC,
160
- instructions: [
161
- 'You are doing this job for real. What you change stays changed, and every call you make is recorded against your name.',
162
- 'Work towards your goals as the person you are, using the tools you have been given.',
163
- 'Where a specialist agent exists for part of the work, hand that part to it rather than reconstructing it yourself.',
164
- 'When you are unsure whether something is wanted, stop and say what you would do and why, rather than doing it and reporting afterwards.',
165
- 'Never guess at an identifier, an amount or a recipient — read it from the product first.',
166
- ].join(' '),
167
- moves: { continue: 94, suspend: 5, resume: 1, abandon: 0 },
168
- temperature: 0.4,
169
- repeatRate: 0,
170
- reReadRate: 0.25,
171
- },
172
- }
173
-
174
- /**
175
- * The profile for a disposition, defaulting to `realistic`, with any declared
176
- * tuning merged over it.
177
- *
178
- * Every consumer resolves a profile through here — the engine, the CLI report
179
- * and the console screen — so a tuned user reads as tuned everywhere rather
180
- * than only behaving differently when it runs.
181
- */
182
- export const dispositionProfile = (
183
- disposition: VirtualUserDisposition = 'realistic',
184
- tuning?: VirtualUserTuning
185
- ): DispositionProfile => {
186
- const base = DISPOSITIONS[disposition] ?? DISPOSITIONS.realistic
187
- if (!tuning) {
188
- return base
189
- }
190
-
191
- const { moves, instructions, ...dials } = tuning
192
- const profile: DispositionProfile = {
193
- ...base,
194
- // An explicit `undefined` is someone spreading an optional value, not a
195
- // request to unset a dial — spreading `dials` straight in would erase it.
196
- ...Object.fromEntries(
197
- Object.entries(dials).filter(([, value]) => value !== undefined)
198
- ),
199
- moves: {
200
- ...base.moves,
201
- ...Object.fromEntries(
202
- Object.entries(moves ?? {}).filter(([, value]) => value !== undefined)
203
- ),
204
- },
205
- }
206
- if (instructions) {
207
- profile.instructions = `${base.instructions} ${instructions}`
208
- }
209
- return profile
210
- }
@@ -1,218 +0,0 @@
1
- import { describe, test } from 'node:test'
2
- import assert from 'node:assert/strict'
3
-
4
- import { IntentStack, intentsForPersona } from './virtual-user-intents.js'
5
- import { createRng } from './virtual-user-rng.js'
6
- import {
7
- DISPOSITIONS,
8
- type DispositionProfile,
9
- } from './virtual-user-dispositions.js'
10
- import type { IntentSource } from './virtual-user.types.js'
11
-
12
- const profileWith = (
13
- moves: DispositionProfile['moves']
14
- ): DispositionProfile => ({ ...DISPOSITIONS.realistic, moves })
15
-
16
- const ONLY_CONTINUE = profileWith({
17
- continue: 1,
18
- suspend: 0,
19
- resume: 0,
20
- abandon: 0,
21
- })
22
- const ONLY_SUSPEND = profileWith({
23
- continue: 0,
24
- suspend: 1,
25
- resume: 0,
26
- abandon: 0,
27
- })
28
- const ONLY_ABANDON = profileWith({
29
- continue: 0,
30
- suspend: 0,
31
- resume: 0,
32
- abandon: 1,
33
- })
34
-
35
- const sources = (count: number): IntentSource[] =>
36
- Array.from({ length: count }, (_, i) => ({
37
- id: `source_${i}`,
38
- title: `do thing ${i}`,
39
- }))
40
-
41
- describe('intent stack', () => {
42
- test('nothing to do means no tick at all', () => {
43
- const stack = new IntentStack([], createRng(1), ONLY_CONTINUE)
44
- assert.equal(stack.next(0), null)
45
- assert.deepEqual(stack.records(), [])
46
- })
47
-
48
- test('the first tick always starts something', () => {
49
- const stack = new IntentStack(sources(2), createRng(1), ONLY_SUSPEND)
50
- const tick = stack.next(0)
51
- assert.equal(tick?.move, 'start')
52
- assert.equal(tick?.intent.status, 'open')
53
- })
54
-
55
- test('continue keeps the same intent live and records the step', () => {
56
- const stack = new IntentStack(sources(3), createRng(1), ONLY_CONTINUE)
57
- const first = stack.next(0)!
58
- for (let step = 1; step < 5; step++) {
59
- const tick = stack.next(step)!
60
- assert.equal(tick.move, 'continue')
61
- assert.equal(tick.intent.id, first.intent.id)
62
- }
63
- const [record] = stack.records()
64
- assert.deepEqual(record!.steps, [0, 1, 2, 3, 4])
65
- })
66
-
67
- test('completing frees the stack to schedule the next thing', () => {
68
- const stack = new IntentStack(sources(2), createRng(1), ONLY_CONTINUE)
69
- const first = stack.next(0)!
70
- stack.complete('got what I came for')
71
- const second = stack.next(1)!
72
- assert.notEqual(second.intent.id, first.intent.id)
73
- assert.equal(second.move, 'start')
74
-
75
- const completed = stack.records().find((r) => r.id === first.intent.id)!
76
- assert.equal(completed.status, 'completed')
77
- assert.equal(completed.summary, 'got what I came for')
78
- })
79
-
80
- test('a run ends once every intent is seen through', () => {
81
- const stack = new IntentStack(sources(2), createRng(1), ONLY_CONTINUE)
82
- stack.next(0)
83
- stack.complete()
84
- stack.next(1)
85
- stack.complete()
86
- assert.equal(stack.next(2), null)
87
- assert.deepEqual(
88
- stack.records().map((r) => r.status),
89
- ['completed', 'completed']
90
- )
91
- })
92
-
93
- test('suspending switches to something else and counts the interruption', () => {
94
- const stack = new IntentStack(sources(2), createRng(1), ONLY_SUSPEND)
95
- const first = stack.next(0)!
96
- const second = stack.next(1)!
97
- assert.equal(second.move, 'suspend')
98
- assert.notEqual(second.intent.id, first.intent.id)
99
-
100
- const suspended = stack.records().find((r) => r.id === first.intent.id)!
101
- assert.equal(suspended.status, 'suspended')
102
- assert.equal(suspended.suspensions, 1)
103
- })
104
-
105
- test('a suspended intent gets picked back up, not lost', () => {
106
- const stack = new IntentStack(sources(2), createRng(1), ONLY_SUSPEND)
107
- const first = stack.next(0)!
108
- stack.next(1)
109
- // Nowhere new to start now, so the suspended one is the only candidate.
110
- const third = stack.next(2)!
111
- assert.equal(third.intent.id, first.intent.id)
112
- assert.equal(third.intent.status, 'open')
113
- })
114
-
115
- test('a move with nowhere to go degrades to continue rather than stalling', () => {
116
- const stack = new IntentStack(sources(1), createRng(1), ONLY_SUSPEND)
117
- const first = stack.next(0)!
118
- const second = stack.next(1)!
119
- assert.equal(second.move, 'continue')
120
- assert.equal(second.intent.id, first.intent.id)
121
- // The interruption never happened, so it must not be counted as one.
122
- assert.equal(stack.records()[0]!.suspensions, 0)
123
- assert.equal(stack.records()[0]!.status, 'open')
124
- })
125
-
126
- test('abandoning is final — the user does not quietly come back to it', () => {
127
- const stack = new IntentStack(sources(1), createRng(1), ONLY_ABANDON)
128
- stack.next(0)
129
- assert.equal(stack.next(1), null)
130
- assert.equal(stack.records()[0]!.status, 'abandoned')
131
- })
132
-
133
- test('stuck records why the user could not get there', () => {
134
- const stack = new IntentStack(sources(1), createRng(1), ONLY_CONTINUE)
135
- stack.next(0)
136
- stack.stuck('no endpoint accepts an invite')
137
- const [record] = stack.records()
138
- assert.equal(record!.status, 'stuck')
139
- assert.equal(record!.summary, 'no endpoint accepts an invite')
140
- })
141
-
142
- test('a distractible user still only juggles so many things at once', () => {
143
- const stack = new IntentStack(sources(10), createRng(4), ONLY_SUSPEND, 3)
144
- for (let step = 0; step < 40; step++) {
145
- stack.next(step)
146
- const live = stack
147
- .records()
148
- .filter((r) => r.status === 'open' || r.status === 'suspended')
149
- assert.ok(live.length <= 3, `juggling ${live.length}`)
150
- }
151
- })
152
-
153
- test('the same seed schedules the same run', () => {
154
- const schedule = (seed: number) => {
155
- const stack = new IntentStack(
156
- sources(5),
157
- createRng(seed),
158
- DISPOSITIONS.careless
159
- )
160
- return Array.from({ length: 30 }, (_, step) => {
161
- const tick = stack.next(step)
162
- return tick ? `${tick.move}:${tick.intent.source.id}` : 'end'
163
- })
164
- }
165
- assert.deepEqual(schedule(123), schedule(123))
166
- assert.notDeepEqual(schedule(123), schedule(456))
167
- })
168
-
169
- test('a careless user interrupts itself far more than a careful one', () => {
170
- const suspensions = (profile: DispositionProfile) => {
171
- const stack = new IntentStack(sources(6), createRng(21), profile)
172
- for (let step = 0; step < 200; step++) stack.next(step)
173
- return stack
174
- .records()
175
- .reduce((total, record) => total + record.suspensions, 0)
176
- }
177
- assert.ok(
178
- suspensions(DISPOSITIONS.careless) >
179
- suspensions(DISPOSITIONS.realistic) * 2
180
- )
181
- })
182
- })
183
-
184
- describe('intents for an actor', () => {
185
- const catalogue: IntentSource[] = [
186
- { id: 'a', title: 'invite a teammate', personas: ['orgAdmin'] },
187
- { id: 'b', title: 'read the dashboard' },
188
- {
189
- id: 'c',
190
- title: 'deploy a stage',
191
- personas: ['platformAdmin', 'orgAdmin'],
192
- },
193
- ]
194
-
195
- test('an actor gets what names it, plus anything that names nobody', () => {
196
- assert.deepEqual(
197
- intentsForPersona(catalogue, 'orgAdmin').map((i) => i.id),
198
- ['a', 'b', 'c']
199
- )
200
- })
201
-
202
- test('an actor is not given other people’s work', () => {
203
- assert.deepEqual(
204
- intentsForPersona(catalogue, 'member').map((i) => i.id),
205
- ['b']
206
- )
207
- })
208
-
209
- test('an empty actor list means everyone', () => {
210
- assert.deepEqual(
211
- intentsForPersona(
212
- [{ id: 'x', title: 'anything', personas: [] }],
213
- 'nobody'
214
- ),
215
- [{ id: 'x', title: 'anything', personas: [] }]
216
- )
217
- })
218
- })
@@ -1,185 +0,0 @@
1
- import type { DispositionProfile } from './virtual-user-dispositions.js'
2
- import type { VirtualUserRng } from './virtual-user-rng.js'
3
- import type {
4
- IntentRecord,
5
- IntentSource,
6
- IntentStatus,
7
- } from './virtual-user.types.js'
8
-
9
- /** One intent as the stack tracks it. */
10
- interface TrackedIntent {
11
- id: string
12
- source: IntentSource
13
- status: IntentStatus
14
- steps: number[]
15
- suspensions: number
16
- summary?: string
17
- }
18
-
19
- /** The move the scheduler rolled for a tick. */
20
- export type IntentMove = 'start' | 'continue' | 'suspend' | 'resume' | 'abandon'
21
-
22
- /** What the stack scheduled: which intent is active, and how it got there. */
23
- export interface ScheduledTick {
24
- intent: TrackedIntent
25
- move: IntentMove
26
- }
27
-
28
- /**
29
- * The stack of things this user is in the middle of — and the whole of the
30
- * engine's randomness.
31
- *
32
- * A real person does not run a flow end to end: they start something, get
33
- * pulled away, do a bit of something else, come back to a world that moved
34
- * underneath them, and sometimes never come back at all. Modelling that as a
35
- * stack of partially-completed intents is what produces the bugs worth having —
36
- * half-mutated state, a flow resumed against changed data, an invite accepted
37
- * after the plan changed — none of which a scripted scenario can reach.
38
- *
39
- * Scheduling is the engine's job and the model's turns are not: the model
40
- * decides what to do *within* the active intent, the stack decides which intent
41
- * that is. Keeping the split there is what makes a run reproducible from a seed
42
- * while the work inside it stays free.
43
- *
44
- * A feature is only where an intent comes from. Nothing here tracks whether one
45
- * was "completed correctly", and the model is never told an intent boundary
46
- * exists.
47
- */
48
- export class IntentStack {
49
- private readonly tracked: TrackedIntent[] = []
50
- private readonly unstarted: IntentSource[]
51
- private active: TrackedIntent | null = null
52
- private counter = 0
53
-
54
- constructor(
55
- sources: readonly IntentSource[],
56
- private readonly rng: VirtualUserRng,
57
- private readonly profile: DispositionProfile,
58
- /** Cap on intents open at once, so a distractible user still finishes things. */
59
- private readonly maxOpen = 3
60
- ) {
61
- this.unstarted = [...sources]
62
- }
63
-
64
- /**
65
- * Pick the intent for this tick, or `null` when there is nothing left to do.
66
- *
67
- * The first tick always starts something; after that the four moves are
68
- * weighted by the disposition, and a move that has nowhere to go degrades to
69
- * `continue` rather than stalling the run.
70
- */
71
- next(step: number): ScheduledTick | null {
72
- if (!this.active) {
73
- const started = this.startOrResume()
74
- if (!started) return null
75
- started.steps.push(step)
76
- this.active = started
77
- return { intent: started, move: 'start' }
78
- }
79
-
80
- const move = this.rng.weighted(this.profile.moves) ?? 'continue'
81
- if (move === 'continue') {
82
- this.active.steps.push(step)
83
- return { intent: this.active, move: 'continue' }
84
- }
85
-
86
- const current = this.active
87
- if (move === 'abandon') {
88
- current.status = 'abandoned'
89
- } else {
90
- current.status = 'suspended'
91
- current.suspensions++
92
- }
93
- this.active = null
94
-
95
- const next =
96
- move === 'resume' ? this.resumeSuspended() : this.startOrResume(current)
97
- if (!next) {
98
- // Nowhere to go: keep working on what we had rather than ending a run
99
- // early. An abandoned intent stays abandoned — that decision stands.
100
- if (current.status === 'abandoned') return null
101
- current.status = 'open'
102
- current.suspensions--
103
- current.steps.push(step)
104
- this.active = current
105
- return { intent: current, move: 'continue' }
106
- }
107
-
108
- next.status = 'open'
109
- next.steps.push(step)
110
- this.active = next
111
- return { intent: next, move }
112
- }
113
-
114
- /** Mark the active intent finished; the next tick schedules something else. */
115
- complete(summary?: string): void {
116
- if (!this.active) return
117
- this.active.status = 'completed'
118
- this.active.summary = summary
119
- this.active = null
120
- }
121
-
122
- /** Mark the active intent as one the user could not get through. */
123
- stuck(reason?: string): void {
124
- if (!this.active) return
125
- this.active.status = 'stuck'
126
- this.active.summary = reason
127
- this.active = null
128
- }
129
-
130
- /** Every intent the run touched, in the order it first opened them. */
131
- records(): IntentRecord[] {
132
- return this.tracked.map((intent) => ({
133
- id: intent.id,
134
- sourceId: intent.source.id,
135
- title: intent.source.title,
136
- status: intent.status,
137
- steps: [...intent.steps],
138
- suspensions: intent.suspensions,
139
- summary: intent.summary,
140
- }))
141
- }
142
-
143
- /** Prefer opening something new, falling back to picking a suspended one up. */
144
- private startOrResume(exclude?: TrackedIntent): TrackedIntent | null {
145
- const openCount = this.tracked.filter(
146
- (intent) => intent.status === 'open' || intent.status === 'suspended'
147
- ).length
148
- if (this.unstarted.length > 0 && openCount < this.maxOpen) {
149
- const source = this.rng.pick(this.unstarted)!
150
- this.unstarted.splice(this.unstarted.indexOf(source), 1)
151
- const intent: TrackedIntent = {
152
- id: `intent_${++this.counter}`,
153
- source,
154
- status: 'open',
155
- steps: [],
156
- suspensions: 0,
157
- }
158
- this.tracked.push(intent)
159
- return intent
160
- }
161
- return this.resumeSuspended(exclude)
162
- }
163
-
164
- private resumeSuspended(exclude?: TrackedIntent): TrackedIntent | null {
165
- const suspended = this.tracked.filter(
166
- (intent) => intent.status === 'suspended' && intent !== exclude
167
- )
168
- return this.rng.pick(suspended) ?? null
169
- }
170
- }
171
-
172
- /**
173
- * The intents a persona may be given: those whose source names them, plus every
174
- * source that names nobody.
175
- *
176
- * This is a free lookup rather than new authoring — scenario meta already
177
- * records which personas each scenario runs as.
178
- */
179
- export const intentsForPersona = (
180
- sources: readonly IntentSource[],
181
- personaId: string
182
- ): IntentSource[] =>
183
- sources.filter(
184
- (source) => !source.personas?.length || source.personas.includes(personaId)
185
- )
@@ -1,72 +0,0 @@
1
- import { describe, test } from 'node:test'
2
- import assert from 'node:assert/strict'
3
-
4
- import { createRng } from './virtual-user-rng.js'
5
-
6
- describe('virtual user rng', () => {
7
- test('the same seed replays the same run', () => {
8
- const a = createRng(42)
9
- const b = createRng(42)
10
- const drawsA = Array.from({ length: 50 }, () => a.next())
11
- const drawsB = Array.from({ length: 50 }, () => b.next())
12
- assert.deepEqual(drawsA, drawsB)
13
- })
14
-
15
- test('different seeds diverge', () => {
16
- const a = Array.from({ length: 20 }, createRng(1).next)
17
- const b = Array.from({ length: 20 }, createRng(2).next)
18
- assert.notDeepEqual(a, b)
19
- })
20
-
21
- test('draws stay in [0, 1)', () => {
22
- const rng = createRng(7)
23
- for (let i = 0; i < 1000; i++) {
24
- const value = rng.next()
25
- assert.ok(value >= 0 && value < 1, `out of range: ${value}`)
26
- }
27
- })
28
-
29
- test('chance is roughly its probability', () => {
30
- const rng = createRng(9)
31
- let hits = 0
32
- for (let i = 0; i < 10_000; i++) if (rng.chance(0.25)) hits++
33
- assert.ok(hits > 2200 && hits < 2800, `got ${hits} of 10000`)
34
- })
35
-
36
- test('chance(0) never fires and chance(1) always does', () => {
37
- const rng = createRng(3)
38
- for (let i = 0; i < 200; i++) {
39
- assert.equal(rng.chance(0), false)
40
- assert.equal(rng.chance(1), true)
41
- }
42
- })
43
-
44
- test('pick returns undefined for an empty list and only members otherwise', () => {
45
- const rng = createRng(11)
46
- assert.equal(rng.pick([]), undefined)
47
- const items = ['a', 'b', 'c']
48
- const seen = new Set<string>()
49
- for (let i = 0; i < 200; i++) seen.add(rng.pick(items)!)
50
- assert.deepEqual([...seen].sort(), items)
51
- })
52
-
53
- test('weighted respects the weights', () => {
54
- const rng = createRng(5)
55
- const counts = { continue: 0, suspend: 0 }
56
- for (let i = 0; i < 10_000; i++) {
57
- counts[rng.weighted({ continue: 90, suspend: 10 })!]++
58
- }
59
- assert.ok(counts.continue > counts.suspend * 5, JSON.stringify(counts))
60
- })
61
-
62
- test('a zero weight can never be drawn — that is how a disposition switches a move off', () => {
63
- const rng = createRng(13)
64
- for (let i = 0; i < 5000; i++) {
65
- assert.notEqual(rng.weighted({ continue: 92, abandon: 0 }), 'abandon')
66
- }
67
- })
68
-
69
- test('weighted with nothing to draw returns undefined', () => {
70
- assert.equal(createRng(1).weighted({ a: 0, b: 0 }), undefined)
71
- })
72
- })