@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,68 +0,0 @@
1
- import assert from 'node:assert/strict'
2
- import { describe, test } from 'node:test'
3
-
4
- import {
5
- ACTOR_ROOT_SECRET_MIN_LENGTH,
6
- deriveActorSecret,
7
- verifyActorSecret,
8
- } from './persona-actor-secret.js'
9
-
10
- const ROOT = 'root-secret-root-secret-root-secret'
11
- const OTHER_ROOT = 'other-secret-other-secret-other-sec'
12
-
13
- describe('actor credentials', () => {
14
- test('a credential verifies for its own address', async () => {
15
- const secret = await deriveActorSecret(ROOT, 'susan@actors.local')
16
- assert.equal(
17
- await verifyActorSecret(ROOT, 'susan@actors.local', secret),
18
- true
19
- )
20
- })
21
-
22
- test('and for no other address', async () => {
23
- const secret = await deriveActorSecret(ROOT, 'susan@actors.local')
24
- assert.equal(
25
- await verifyActorSecret(ROOT, 'yasser@actors.local', secret),
26
- false
27
- )
28
- })
29
-
30
- test('the address is matched the way the row is looked up', async () => {
31
- const secret = await deriveActorSecret(ROOT, ' Susan@Actors.Local ')
32
- assert.equal(
33
- await verifyActorSecret(ROOT, 'susan@actors.local', secret),
34
- true
35
- )
36
- })
37
-
38
- test('rotating the root invalidates every credential at once', async () => {
39
- const secret = await deriveActorSecret(ROOT, 'susan@actors.local')
40
- assert.equal(
41
- await verifyActorSecret(OTHER_ROOT, 'susan@actors.local', secret),
42
- false
43
- )
44
- })
45
-
46
- test('the root is not a credential for anybody', async () => {
47
- assert.equal(
48
- await verifyActorSecret(ROOT, 'susan@actors.local', ROOT),
49
- false
50
- )
51
- })
52
-
53
- test('a malformed value is false rather than a throw', async () => {
54
- assert.equal(await verifyActorSecret(ROOT, 'susan@actors.local', ''), false)
55
- assert.equal(
56
- await verifyActorSecret(ROOT, 'susan@actors.local', 'not base64url!!'),
57
- false
58
- )
59
- })
60
-
61
- test('key material shorter than the minimum is refused, not silently used', async () => {
62
- await assert.rejects(
63
- () => deriveActorSecret('short', 'susan@actors.local'),
64
- /SCENARIO_ACTOR_SECRET/
65
- )
66
- assert.ok(ACTOR_ROOT_SECRET_MIN_LENGTH >= 32)
67
- })
68
- })
@@ -1,70 +0,0 @@
1
- import {
2
- MIN_KEY_MATERIAL_LENGTH,
3
- signWithKeyMaterial,
4
- verifyWithKeyMaterial,
5
- } from '../crypto-utils.js'
6
-
7
- /** The name the root secret is held under, used only in error messages. */
8
- export const ACTOR_SECRET_NAME = 'SCENARIO_ACTOR_SECRET'
9
-
10
- /**
11
- * Namespaces the derivation so the same root secret used for anything else
12
- * produces different values. See knowledge/crypto.md.
13
- */
14
- export const ACTOR_SECRET_INFO = 'pikku:actor-sign-in'
15
-
16
- /** The root must be strong: every persona's credential is derived from it. */
17
- export const ACTOR_ROOT_SECRET_MIN_LENGTH = MIN_KEY_MATERIAL_LENGTH
18
-
19
- /**
20
- * What the derivation is bound to. Lowercased because the sign-in endpoint
21
- * looks the user up by lowercased address, and a credential that verified
22
- * against a different string than the row it opens is a credential for nothing.
23
- */
24
- export const actorSecretSubject = (email: string): string =>
25
- email.trim().toLowerCase()
26
-
27
- /**
28
- * One persona's actor credential: `HMAC-SHA256(root, email)`, base64url.
29
- *
30
- * The root secret is not itself a valid credential and never travels: what a
31
- * scenario run, a CI job or a virtual user is handed is the derived value for
32
- * the one address it is entitled to. Presenting it for any other address fails,
33
- * so a leaked credential is worth exactly one synthetic account rather than the
34
- * whole actor population.
35
- *
36
- * Deterministic, so nothing is stored and nothing is provisioned — the target
37
- * re-derives the expected value from the address being signed in as. Rotating
38
- * the root invalidates every derived credential at once, which is the property
39
- * a per-persona secret table would have to implement by hand.
40
- */
41
- export const deriveActorSecret = async (
42
- rootSecret: string,
43
- email: string
44
- ): Promise<string> =>
45
- signWithKeyMaterial(
46
- ACTOR_SECRET_NAME,
47
- rootSecret,
48
- ACTOR_SECRET_INFO,
49
- actorSecretSubject(email)
50
- )
51
-
52
- /**
53
- * Whether `presented` is the credential for `email` under `rootSecret`.
54
- *
55
- * False — never throws — for a malformed, truncated or mismatched value, and
56
- * the comparison is WebCrypto's own HMAC verify, so it does not exit early on
57
- * the first differing byte.
58
- */
59
- export const verifyActorSecret = async (
60
- rootSecret: string,
61
- email: string,
62
- presented: string
63
- ): Promise<boolean> =>
64
- verifyWithKeyMaterial(
65
- ACTOR_SECRET_NAME,
66
- rootSecret,
67
- ACTOR_SECRET_INFO,
68
- actorSecretSubject(email),
69
- presented
70
- )
@@ -1,219 +0,0 @@
1
- import { describe, test, after } from 'node:test'
2
- import assert from 'node:assert/strict'
3
- import { createServer, type Server } from 'node:http'
4
-
5
- import { createHttpPersonas } from './http-personas.js'
6
- import { establishOperatorSession } from './persona-sign-in.js'
7
-
8
- const OPERATOR_TOKEN = 'operator.jwt.token'
9
-
10
- /**
11
- * Minimal deployed stage: the fabric plugin's sign-in, which resolves the
12
- * account to act as in the same request, and an RPC route that reports back who
13
- * it was addressed as.
14
- */
15
- const startStage = async (seeded: Array<{ id: string; email: string }>) => {
16
- const users = [...seeded]
17
- const sentBodies: unknown[] = []
18
- const server: Server = createServer((req, res) => {
19
- const chunks: Buffer[] = []
20
- req.on('data', (c) => chunks.push(c))
21
- req.on('end', () => {
22
- const body = chunks.length
23
- ? JSON.parse(Buffer.concat(chunks).toString())
24
- : {}
25
- const url = new URL(req.url ?? '/', 'http://stage.invalid')
26
-
27
- if (url.pathname === '/api/auth/sign-in/fabric') {
28
- if (body.token !== OPERATOR_TOKEN) {
29
- res.writeHead(401).end(JSON.stringify({ message: 'bad token' }))
30
- return
31
- }
32
- let actAs: { userId: string } | undefined
33
- if (body.actAs) {
34
- sentBodies.push(body.actAs)
35
- const user = users.find((u) => u.email === body.actAs.email)
36
- if (!user) {
37
- res.writeHead(404).end(
38
- JSON.stringify({
39
- message: `No account on this stage for ${body.actAs.email}`,
40
- })
41
- )
42
- return
43
- }
44
- actAs = { userId: user.id }
45
- }
46
- res.setHeader('set-cookie', ['session=operator; Path=/; HttpOnly'])
47
- res
48
- .writeHead(200, { 'content-type': 'application/json' })
49
- .end(JSON.stringify({ token: 'operator', actAs }))
50
- return
51
- }
52
-
53
- if (url.pathname.startsWith('/api/rpc/')) {
54
- res.writeHead(200, { 'content-type': 'application/json' }).end(
55
- JSON.stringify({
56
- actingAs: req.headers['x-pikku-impersonate-user-id'] ?? null,
57
- cookie: req.headers.cookie ?? '',
58
- })
59
- )
60
- return
61
- }
62
-
63
- res.writeHead(404).end()
64
- })
65
- })
66
- await new Promise<void>((resolve) => server.listen(0, resolve))
67
- const port = (server.address() as { port: number }).port
68
- return {
69
- apiUrl: `http://127.0.0.1:${port}/api`,
70
- server,
71
- get sentBodies() {
72
- return sentBodies
73
- },
74
- }
75
- }
76
-
77
- const persona = (email: string) => ({
78
- id: 'customer',
79
- name: 'Customer',
80
- email,
81
- roles: ['client'],
82
- goals: [],
83
- tags: [],
84
- runnable: true,
85
- })
86
-
87
- describe('operator persona sign-in', () => {
88
- const servers: Server[] = []
89
- after(() => servers.forEach((s) => s.close()))
90
-
91
- test('acts as an existing account rather than signing in as it', async () => {
92
- const stage = await startStage([
93
- { id: 'user-7', email: 'customer@personas.invalid' },
94
- ])
95
- servers.push(stage.server)
96
-
97
- const personas = createHttpPersonas({
98
- apiUrl: stage.apiUrl,
99
- operator: { token: OPERATOR_TOKEN },
100
- personas: { customer: persona('customer@personas.invalid') },
101
- })
102
-
103
- const result = (await personas.customer!.invoke('whoami', {})) as {
104
- actingAs: string | null
105
- cookie: string
106
- }
107
- assert.equal(result.actingAs, 'user-7')
108
- assert.match(result.cookie, /session=operator/)
109
- })
110
-
111
- // An app that mounts auth somewhere other than the root moves both sign-in
112
- // paths together, and `SCENARIO_SIGN_IN_PATH` is the only place it can say so.
113
- test('honours a moved sign-in path the same way the actor path does', async () => {
114
- const stage = await startStage([
115
- { id: 'user-7', email: 'customer@personas.invalid' },
116
- ])
117
- servers.push(stage.server)
118
-
119
- const personas = createHttpPersonas({
120
- apiUrl: stage.apiUrl.replace(/\/api$/, ''),
121
- operator: { token: OPERATOR_TOKEN },
122
- signInPath: '/api/auth/sign-in/fabric',
123
- rpcPath: '/api/rpc',
124
- personas: { customer: persona('customer@personas.invalid') },
125
- })
126
-
127
- const result = (await personas.customer!.invoke('whoami', {})) as {
128
- actingAs: string | null
129
- }
130
- assert.equal(result.actingAs, 'user-7')
131
- })
132
-
133
- test('refuses a persona the stage has no account for', async () => {
134
- const stage = await startStage([])
135
- servers.push(stage.server)
136
-
137
- const personas = createHttpPersonas({
138
- apiUrl: stage.apiUrl,
139
- operator: { token: OPERATOR_TOKEN },
140
- personas: { customer: persona('ghost@personas.invalid') },
141
- })
142
-
143
- await assert.rejects(
144
- () => personas.customer!.invoke('whoami', {}),
145
- /operator sign-in failed for 'customer' \(404\)/
146
- )
147
- })
148
-
149
- // Provisioning moved into the stage, so the handshake carries an address and
150
- // nothing else. A `create` flag or a role list here would be the caller
151
- // deciding what the stage holds, which is the arrangement this replaced.
152
- test('asks only to act as an address', async () => {
153
- const stage = await startStage([
154
- { id: 'user-3', email: 'customer@personas.invalid' },
155
- ])
156
- servers.push(stage.server)
157
-
158
- const personas = createHttpPersonas({
159
- apiUrl: stage.apiUrl,
160
- operator: { token: OPERATOR_TOKEN },
161
- personas: { customer: persona('customer@personas.invalid') },
162
- })
163
-
164
- await personas.customer!.invoke('whoami', {})
165
- assert.deepEqual(stage.sentBodies, [{ email: 'customer@personas.invalid' }])
166
- })
167
-
168
- test('mints the operator session from a token factory', async () => {
169
- const stage = await startStage([
170
- { id: 'user-9', email: 'lazy@personas.invalid' },
171
- ])
172
- servers.push(stage.server)
173
-
174
- let minted = 0
175
- const personas = createHttpPersonas({
176
- apiUrl: stage.apiUrl,
177
- operator: {
178
- token: () => {
179
- minted++
180
- return OPERATOR_TOKEN
181
- },
182
- },
183
- personas: { customer: persona('lazy@personas.invalid') },
184
- })
185
-
186
- await personas.customer!.invoke('whoami', {})
187
- assert.equal(minted, 1)
188
- })
189
-
190
- test('resolves the account to act as without a second request', async () => {
191
- const stage = await startStage([{ id: 'user-9', email: 'susan@acme.test' }])
192
- servers.push(stage.server)
193
-
194
- // Plain fetch keeps no cookies, which is the browser provider's situation:
195
- // it plants them on a Playwright context only once this has returned. The
196
- // handshake must not need a session of its own to resolve the persona.
197
- const { userId } = await establishOperatorSession(
198
- fetch,
199
- stage.apiUrl,
200
- persona('susan@acme.test'),
201
- { token: OPERATOR_TOKEN }
202
- )
203
- assert.equal(userId, 'user-9')
204
- })
205
-
206
- test('a persona with neither credential is refused at construction', async () => {
207
- const stage = await startStage([])
208
- servers.push(stage.server)
209
-
210
- assert.throws(
211
- () =>
212
- createHttpPersonas({
213
- apiUrl: stage.apiUrl,
214
- personas: { customer: persona('nobody@personas.invalid') },
215
- }),
216
- /has no way to sign in/
217
- )
218
- })
219
- })
@@ -1,238 +0,0 @@
1
- import { deriveActorSecret } from './persona-actor-secret.js'
2
- import { PikkuError } from '../errors/error-handler.js'
3
- import type { ResolvedPersona } from './personas-service.js'
4
- import type { ScenarioCookieJar } from '../wirings/workflow/scenario-cookie-jar.js'
5
-
6
- /**
7
- * The header `resolveImpersonatedSession` reads the target user id from.
8
- *
9
- * A wire value rather than a shared import: the reader lives in
10
- * `@pikku/services-better-auth`, which depends on core, so core cannot import
11
- * it back. The two agree by protocol, the way an HTTP header always does.
12
- */
13
- export const IMPERSONATE_USER_ID_HEADER = 'x-pikku-impersonate-user-id'
14
-
15
- /**
16
- * How a persona obtains a session on the target, and what every later request
17
- * needs to carry to keep acting as them.
18
- *
19
- * Two answers exist because the two environments have opposite trust models,
20
- * not because one is a fallback for the other. See {@link ActorSignIn} and
21
- * {@link OperatorSignIn}.
22
- */
23
- export interface PersonaSignIn {
24
- /**
25
- * Establish a session in `jar`. Throws on failure with a message naming the
26
- * persona, since a run that continues unauthenticated fails later and
27
- * somewhere less informative.
28
- */
29
- login(jar: ScenarioCookieJar, persona: ResolvedPersona): Promise<void>
30
- /** Headers every request after `login` must carry. */
31
- headers(): Record<string, string>
32
- }
33
-
34
- /**
35
- * A sign-in the target refused. `PikkuError`, not `Error`, so the CLI prints
36
- * this message alone: an expired token or a persona the stage has never seen is
37
- * something to go and fix, and a stack trace through the fetch internals only
38
- * buries the status and the body that say which one it is.
39
- */
40
- const failed = async (
41
- what: string,
42
- personaId: string,
43
- res: Response
44
- ): Promise<Error> => {
45
- const body = (await res.text().catch(() => '')).slice(0, 300)
46
- return new PikkuError(
47
- `[scenario] ${what} failed for '${personaId}' (${res.status}): ${body}`
48
- )
49
- }
50
-
51
- /**
52
- * Yields the credential for one persona, for a caller that holds that persona's
53
- * derived secret and not the root it came from.
54
- */
55
- export type ActorSecretResolver = (
56
- persona: ResolvedPersona
57
- ) => string | Promise<string>
58
-
59
- /**
60
- * Sign a persona in through the Better Auth actor plugin — the local-development
61
- * path.
62
- *
63
- * `POST /auth/sign-in/actor` upserts an `actor: true` row and mints a session
64
- * for it. Passwordless by design and refused for any row not carrying that flag,
65
- * so the secret can never reach a real user's account; the plugin still declines
66
- * to serve the endpoint at all outside `pikku dev`.
67
- *
68
- * What is presented is the persona's own credential, derived from the root and
69
- * bound to their address. A run driving many personas holds the root and
70
- * derives as it goes; a run entitled to one persona is handed that one value
71
- * through a resolver and can sign in as nobody else.
72
- */
73
- export class ActorSignIn implements PersonaSignIn {
74
- constructor(
75
- private readonly apiUrl: string,
76
- private readonly secret: string | ActorSecretResolver,
77
- private readonly signInPath: string
78
- ) {}
79
-
80
- async login(jar: ScenarioCookieJar, persona: ResolvedPersona): Promise<void> {
81
- const secret =
82
- typeof this.secret === 'function'
83
- ? await this.secret(persona)
84
- : await deriveActorSecret(this.secret, persona.email)
85
- const res = await jar.fetch(`${this.apiUrl}${this.signInPath}`, {
86
- method: 'POST',
87
- headers: { 'content-type': 'application/json' },
88
- body: JSON.stringify({
89
- email: persona.email,
90
- name: persona.name,
91
- secret,
92
- }),
93
- })
94
- if (!res.ok) {
95
- throw await failed('persona sign-in', persona.id, res)
96
- }
97
- // What proves a session was established is this response setting a cookie,
98
- // not the jar being non-empty — the target may have set one earlier.
99
- if (res.headers.getSetCookie().length === 0) {
100
- throw new Error(
101
- `[scenario] persona sign-in for '${persona.id}' returned no session cookie`
102
- )
103
- }
104
- }
105
-
106
- headers(): Record<string, string> {
107
- return {}
108
- }
109
- }
110
-
111
- /**
112
- * The auth mount a configured sign-in path sits under, or `undefined` when it
113
- * names nothing recognisable.
114
- *
115
- * better-auth serves sign-in, operator sign-in and `get-session` from one
116
- * prefix, so an app that mounts it at `/api/auth` moves all three together and
117
- * says so once through `signInPath`. Reading the other two from a hardcoded
118
- * `/auth` on such an app 404s — and for `get-session` a 404 reads as "this
119
- * stage does not report roles", which silently turns off the check that tells a
120
- * permissions finding from seed drift.
121
- */
122
- export const authMount = (signInPath?: string): string | undefined => {
123
- const mount = signInPath ? signInPath.lastIndexOf('/sign-in/') : -1
124
- return !signInPath || mount === -1 ? undefined : signInPath.slice(0, mount)
125
- }
126
-
127
- export interface OperatorSignInOptions {
128
- /**
129
- * The short-lived RS256 operator token, or a function that mints one. Prefer
130
- * the function: tokens expire, and a long run re-logs-in after a 401.
131
- */
132
- token: string | (() => string | Promise<string>)
133
- /** Fabric operator sign-in path under apiUrl. Default `/auth/sign-in/fabric`. */
134
- signInPath?: string
135
- }
136
-
137
- /** What an operator handshake yields: the session, and who to act as. */
138
- export interface OperatorSessionResult {
139
- /** `Set-Cookie` values the operator sign-in returned. */
140
- setCookies: string[]
141
- /** The target's own id for the persona, for the impersonation header. */
142
- userId: string
143
- }
144
-
145
- /**
146
- * Establish a Fabric operator session against `apiUrl` and resolve the target's
147
- * own id for `persona`, which is what the impersonation header names.
148
- *
149
- * Takes the fetch to use rather than making one, because the two callers need
150
- * the cookies to land in different places: an HTTP persona keeps them in its
151
- * jar, a browser run plants them on a Playwright context. Both need the same
152
- * handshake, and it is the kind of sequence that quietly diverges once it is
153
- * written twice.
154
- */
155
- export const establishOperatorSession = async (
156
- fetchImpl: typeof fetch,
157
- apiUrl: string,
158
- persona: ResolvedPersona,
159
- options: OperatorSignInOptions,
160
- extraHeaders: Record<string, string> = {}
161
- ): Promise<OperatorSessionResult> => {
162
- const signInPath = options.signInPath ?? '/auth/sign-in/fabric'
163
- const token =
164
- typeof options.token === 'function' ? await options.token() : options.token
165
-
166
- const res = await fetchImpl(`${apiUrl}${signInPath}`, {
167
- method: 'POST',
168
- headers: { 'content-type': 'application/json', ...extraHeaders },
169
- body: JSON.stringify({
170
- token,
171
- actAs: { email: persona.email },
172
- }),
173
- })
174
- if (!res.ok) {
175
- throw await failed('operator sign-in', persona.id, res)
176
- }
177
- const setCookies = res.headers.getSetCookie?.() ?? []
178
- if (setCookies.length === 0) {
179
- throw new PikkuError(
180
- `[scenario] operator sign-in for '${persona.id}' returned no session cookie`
181
- )
182
- }
183
-
184
- const body = (await res.json().catch(() => null)) as {
185
- actAs?: { userId?: unknown }
186
- } | null
187
- const userId = body?.actAs?.userId
188
- if (!userId) {
189
- throw new PikkuError(
190
- `[scenario] operator sign-in for '${persona.id}' returned no user to act as — ` +
191
- 'the target is running a @pikku/better-auth too old to resolve one'
192
- )
193
- }
194
- return { setCookies, userId: String(userId) }
195
- }
196
-
197
- /**
198
- * Sign a persona in on a DEPLOYED stage, by having a Fabric operator act as
199
- * them — the path that needs no test credential to exist anywhere.
200
- *
201
- * `POST /auth/sign-in/fabric` verifies an RS256 token against the stage's
202
- * `FABRIC_AUTH_PUBLIC_KEY` and mints a session for a synthetic operator row
203
- * granted the umbrella `admin` scope. Impersonation is then a header on each
204
- * request rather than a second session, and its gate is that scope — not
205
- * `user.role`, which is why this works without touching the app's roles.
206
- *
207
- * Asymmetric throughout: the stage can verify an operator token and never mint
208
- * one, so nothing in a deployed environment is worth stealing. That is the
209
- * property the actor secret cannot have, and the reason these are two classes
210
- * instead of one with a flag.
211
- */
212
- export class OperatorSignIn implements PersonaSignIn {
213
- private userId: string | null = null
214
-
215
- constructor(
216
- private readonly apiUrl: string,
217
- private readonly options: OperatorSignInOptions
218
- ) {}
219
-
220
- async login(jar: ScenarioCookieJar, persona: ResolvedPersona): Promise<void> {
221
- const { userId } = await establishOperatorSession(
222
- jar.fetch,
223
- this.apiUrl,
224
- persona,
225
- this.options
226
- )
227
- this.userId = userId
228
- }
229
-
230
- headers(): Record<string, string> {
231
- if (!this.userId) {
232
- throw new Error(
233
- '[scenario] operator session has no persona to act as — login() first'
234
- )
235
- }
236
- return { [IMPERSONATE_USER_ID_HEADER]: this.userId }
237
- }
238
- }