@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
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Runs resolvers in order, each seeing what the ones before it produced.
3
+ *
4
+ * Order is meaningful rather than incidental: a resolver that mints a cookie
5
+ * may only do so once consent has been read, so the resolver reading consent
6
+ * has to come first. Put the other way round, the minter sees no consent, mints
7
+ * nothing, and the app collects nothing — silently, which is why this threads
8
+ * state through instead of merging independent results.
9
+ *
10
+ * A later resolver wins a key it sets, so a minter's freshly created id
11
+ * replaces the absent one the cookie reader could not find.
12
+ */
13
+ export const composeAnalyticsIdentity = (...resolvers) => {
14
+ return (wire, initial) => {
15
+ let resolved = initial ?? {};
16
+ for (const resolver of resolvers) {
17
+ const next = resolver(wire, resolved);
18
+ if (!next)
19
+ continue;
20
+ resolved = {
21
+ ...resolved,
22
+ ...next,
23
+ ...(next.vendorIds === undefined && resolved.vendorIds === undefined
24
+ ? {}
25
+ : { vendorIds: { ...resolved.vendorIds, ...next.vendorIds } }),
26
+ ...(next.consent === undefined && resolved.consent === undefined
27
+ ? {}
28
+ : { consent: { ...resolved.consent, ...next.consent } }),
29
+ };
30
+ }
31
+ return Object.keys(resolved).length === 0 ? undefined : resolved;
32
+ };
33
+ };
@@ -0,0 +1,24 @@
1
+ import type { AnalyticsIdentityResolver } from './analytics.types.js';
2
+ export interface CookieAnalyticsIdentityOptions {
3
+ /** Identity key to read it from, e.g. `{ gaClientId: '_ga' }`. */
4
+ vendorIds?: Record<string, string>;
5
+ /**
6
+ * Consent purpose to the cookie that grants it. The purpose is true only when
7
+ * the cookie is present and is not a recognised denial (`'0'`, `'false'`,
8
+ * `'denied'`), so a consent tool that writes a refusal rather than deleting
9
+ * the cookie is read as a refusal.
10
+ */
11
+ consent?: Record<string, string>;
12
+ }
13
+ /**
14
+ * Reads the browser-originated half of the identity off first-party cookies.
15
+ *
16
+ * Covers the common case only. A consent tool that packs every purpose into one
17
+ * encoded blob needs its own resolver — which is why the resolver is a function
18
+ * and this is a helper rather than the mechanism.
19
+ *
20
+ * Resolves nothing off an HTTP wire, which is correct: a cron task and a queue
21
+ * worker have no browser behind them, so any vendor id they produced would be
22
+ * invented.
23
+ */
24
+ export declare const cookieAnalyticsIdentity: (options: CookieAnalyticsIdentityOptions) => AnalyticsIdentityResolver;
@@ -0,0 +1,37 @@
1
+ const DENIALS = new Set(['0', 'false', 'denied', 'deny', 'no']);
2
+ /**
3
+ * Reads the browser-originated half of the identity off first-party cookies.
4
+ *
5
+ * Covers the common case only. A consent tool that packs every purpose into one
6
+ * encoded blob needs its own resolver — which is why the resolver is a function
7
+ * and this is a helper rather than the mechanism.
8
+ *
9
+ * Resolves nothing off an HTTP wire, which is correct: a cron task and a queue
10
+ * worker have no browser behind them, so any vendor id they produced would be
11
+ * invented.
12
+ */
13
+ export const cookieAnalyticsIdentity = (options) => {
14
+ return (wire) => {
15
+ const request = wire.http?.request;
16
+ if (!request)
17
+ return undefined;
18
+ const vendorIds = {};
19
+ for (const [key, cookieName] of Object.entries(options.vendorIds ?? {})) {
20
+ const value = request.cookie(cookieName);
21
+ if (value) {
22
+ vendorIds[key] = value;
23
+ }
24
+ }
25
+ const consent = {};
26
+ for (const [purpose, cookieName] of Object.entries(options.consent ?? {})) {
27
+ const value = request.cookie(cookieName);
28
+ if (value !== null) {
29
+ consent[purpose] = !DENIALS.has(value.toLowerCase());
30
+ }
31
+ }
32
+ return {
33
+ ...(Object.keys(vendorIds).length === 0 ? {} : { vendorIds }),
34
+ ...(Object.keys(consent).length === 0 ? {} : { consent }),
35
+ };
36
+ };
37
+ };
@@ -0,0 +1,22 @@
1
+ import type { StandardSchemaV1 } from '@standard-schema/spec';
2
+ /**
3
+ * The schema for one event's props. The generated ingest rebuilds each member
4
+ * of the union as `z.object(schema.shape)` so it can attach the event name, so
5
+ * a schema with no `shape` — a union, a primitive, a schema from a library
6
+ * that does not expose one — is not something an event can be declared with,
7
+ * and saying so here fails at the declaration rather than in generated code.
8
+ */
9
+ export type AnalyticsEventPropsSchema = StandardSchemaV1 & {
10
+ shape: Record<string, unknown>;
11
+ };
12
+ /** Events keyed by name; each value is the schema for that event's props. */
13
+ export type AnalyticsEventDefinitions = Record<string, AnalyticsEventPropsSchema>;
14
+ /**
15
+ * Declare what a module can measure. Call it as often as suits the project; the
16
+ * CLI unions every declaration into the ingest schema.
17
+ *
18
+ * It must stay an exported const — the schema pipeline reads the value by name.
19
+ * It registers nothing at runtime: where events go is an `AnalyticsService` on
20
+ * singleton services.
21
+ */
22
+ export declare const defineAnalyticsEvents: <const Events extends AnalyticsEventDefinitions>(events: Events) => Events;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Declare what a module can measure. Call it as often as suits the project; the
3
+ * CLI unions every declaration into the ingest schema.
4
+ *
5
+ * It must stay an exported const — the schema pipeline reads the value by name.
6
+ * It registers nothing at runtime: where events go is an `AnalyticsService` on
7
+ * singleton services.
8
+ */
9
+ export const defineAnalyticsEvents = (events) => events;
@@ -0,0 +1,15 @@
1
+ import type { AnalyticsService, AnalyticsSink } from './analytics.types.js';
2
+ /**
3
+ * One `AnalyticsService` over several destinations.
4
+ *
5
+ * A composite rather than a change to the interface, so a single-destination
6
+ * app never meets it and a sink is the same class whether it runs alone or
7
+ * beside three others.
8
+ *
9
+ * Settled, not awaited in sequence: `flush()` runs inside the invocation, so a
10
+ * vendor that is slow must not add its latency to the request and a vendor that
11
+ * is down must not cost the others their events. A destination that throws is
12
+ * reported by the caller's existing flush guard, which already treats analytics
13
+ * as best-effort.
14
+ */
15
+ export declare const fanOutAnalytics: (sinks: ReadonlyArray<AnalyticsSink | AnalyticsService>) => AnalyticsService;
@@ -0,0 +1,36 @@
1
+ /**
2
+ * One `AnalyticsService` over several destinations.
3
+ *
4
+ * A composite rather than a change to the interface, so a single-destination
5
+ * app never meets it and a sink is the same class whether it runs alone or
6
+ * beside three others.
7
+ *
8
+ * Settled, not awaited in sequence: `flush()` runs inside the invocation, so a
9
+ * vendor that is slow must not add its latency to the request and a vendor that
10
+ * is down must not cost the others their events. A destination that throws is
11
+ * reported by the caller's existing flush guard, which already treats analytics
12
+ * as best-effort.
13
+ */
14
+ export const fanOutAnalytics = (sinks) => {
15
+ const resolved = sinks.map((sink) => 'service' in sink ? sink : { service: sink });
16
+ return {
17
+ async write(batch) {
18
+ if (batch.length === 0)
19
+ return;
20
+ const results = await Promise.allSettled(
21
+ // `accepts` is app code and runs inside this map. Thrown
22
+ // synchronously it would escape before `allSettled` was ever called,
23
+ // and every destination after it in the list would lose the batch.
24
+ resolved.map(async ({ service, accepts }) => {
25
+ const records = accepts ? batch.filter(accepts) : batch;
26
+ if (records.length === 0)
27
+ return;
28
+ await service.write(records);
29
+ }));
30
+ const failures = results.filter((result) => result.status === 'rejected');
31
+ if (failures.length > 0) {
32
+ throw new AggregateError(failures.map((failure) => failure.reason), `${failures.length} of ${resolved.length} analytics destinations failed`);
33
+ }
34
+ },
35
+ };
36
+ };
@@ -0,0 +1,13 @@
1
+ export type { AnalyticsClientContext, AnalyticsEventBase, AnalyticsEventMeta, AnalyticsEventsMeta, AnalyticsEventInput, AnalyticsIdentity, AnalyticsLog, AnalyticsIdentityResolver, AnalyticsRecord, AnalyticsService, AnalyticsSink, } from './analytics.types.js';
2
+ export { createInvocationAnalytics, flattenAnalyticsEvent, } from './analytics.js';
3
+ export { LoggerAnalyticsService } from './logger-analytics-service.js';
4
+ export { defineAnalyticsEvents } from './define-analytics-events.js';
5
+ export type { AnalyticsEventDefinitions, AnalyticsEventPropsSchema, } from './define-analytics-events.js';
6
+ export { fanOutAnalytics } from './fan-out-analytics.js';
7
+ export { cookieAnalyticsIdentity } from './cookie-analytics-identity.js';
8
+ export type { CookieAnalyticsIdentityOptions } from './cookie-analytics-identity.js';
9
+ export { mintCookie, randomDigits } from './mint-cookie.js';
10
+ export type { MintCookieOptions } from './mint-cookie.js';
11
+ export { composeAnalyticsIdentity } from './compose-analytics-identity.js';
12
+ export { anonymousAnalyticsIdentity } from './anonymous-analytics-identity.js';
13
+ export type { AnonymousAnalyticsIdentityOptions } from './anonymous-analytics-identity.js';
@@ -0,0 +1,8 @@
1
+ export { createInvocationAnalytics, flattenAnalyticsEvent, } from './analytics.js';
2
+ export { LoggerAnalyticsService } from './logger-analytics-service.js';
3
+ export { defineAnalyticsEvents } from './define-analytics-events.js';
4
+ export { fanOutAnalytics } from './fan-out-analytics.js';
5
+ export { cookieAnalyticsIdentity } from './cookie-analytics-identity.js';
6
+ export { mintCookie, randomDigits } from './mint-cookie.js';
7
+ export { composeAnalyticsIdentity } from './compose-analytics-identity.js';
8
+ export { anonymousAnalyticsIdentity } from './anonymous-analytics-identity.js';
@@ -0,0 +1,14 @@
1
+ import type { Logger } from '../services/logger.js';
2
+ import type { AnalyticsRecord, AnalyticsService } from './analytics.types.js';
3
+ /**
4
+ * What an app gets before it has chosen a store. There is deliberately no noop:
5
+ * a validated wire with nowhere for the events to go is indistinguishable from
6
+ * a broken one.
7
+ *
8
+ * At `debug` so attaching a real store does not report every event twice.
9
+ */
10
+ export declare class LoggerAnalyticsService implements AnalyticsService {
11
+ private readonly logger;
12
+ constructor(logger: Logger);
13
+ write(batch: AnalyticsRecord[]): Promise<void>;
14
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * What an app gets before it has chosen a store. There is deliberately no noop:
3
+ * a validated wire with nowhere for the events to go is indistinguishable from
4
+ * a broken one.
5
+ *
6
+ * At `debug` so attaching a real store does not report every event twice.
7
+ */
8
+ export class LoggerAnalyticsService {
9
+ logger;
10
+ constructor(logger) {
11
+ this.logger = logger;
12
+ }
13
+ async write(batch) {
14
+ for (const event of batch) {
15
+ this.logger.debug(`analytics: ${event.name}`, {
16
+ ...event.props,
17
+ userId: event.userIdentity.userId,
18
+ source: event.source,
19
+ ...(event.at === undefined ? {} : { at: event.at }),
20
+ });
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,44 @@
1
+ import type { SerializeOptions } from 'cookie';
2
+ import type { CoreUserSession, PikkuWire } from '../types/core.types.js';
3
+ type AnyWire = PikkuWire<any, any, any, CoreUserSession>;
4
+ export interface MintCookieOptions {
5
+ /** Cookie attributes. Long-lived and first-party is the usual shape. */
6
+ cookie: SerializeOptions;
7
+ /**
8
+ * Purposes that must all be `true` before anything is written. Writing the
9
+ * cookie IS the act consent governs, so a minter that runs before the banner
10
+ * is answered has already done the thing the send gate was meant to prevent.
11
+ */
12
+ requires?: string[];
13
+ consent?: Record<string, boolean>;
14
+ /**
15
+ * Replace the cookie already on the device rather than returning it.
16
+ *
17
+ * For the case where the request itself carries something newer than what is
18
+ * stored — Meta's `_fbc` derives from the `fbclid` on the current URL, and
19
+ * keeping an older click would attribute the conversion to the wrong ad.
20
+ */
21
+ overwrite?: boolean;
22
+ }
23
+ /**
24
+ * Reads a first-party cookie, creating and setting it when absent.
25
+ *
26
+ * This is how an app tracks a visitor with no vendor SDK on the page: the
27
+ * identifiers GA4 and Meta key on are ordinary first-party cookies in a
28
+ * documented format, and nothing requires a browser script to be the one that
29
+ * writes them. It is the mechanism behind server-side tagging, and the reason
30
+ * pikku can offer it as a wired service rather than a second container to run.
31
+ *
32
+ * Minted once per wire, not once per call. The resolver runs for every event,
33
+ * and a second mint within one request would hand the same visitor two
34
+ * identities — which reads downstream as two people rather than as a bug.
35
+ *
36
+ * Writes nothing on a wire with no HTTP response, and nothing once the response
37
+ * has been sent; a cron task and a queue worker have no browser to store it,
38
+ * and a stream's headers are long gone. Both return undefined rather than
39
+ * pretending.
40
+ */
41
+ export declare const mintCookie: (wire: AnyWire, name: string, options: MintCookieOptions, mint: () => string) => string | undefined;
42
+ /** Cryptographically random digits, the shape both vendor formats use. */
43
+ export declare const randomDigits: (length: number) => string;
44
+ export {};
@@ -0,0 +1,55 @@
1
+ const minted = new WeakMap();
2
+ const permitted = (requires, consent) => {
3
+ if (!requires || requires.length === 0)
4
+ return true;
5
+ return requires.every((purpose) => consent?.[purpose] === true);
6
+ };
7
+ /**
8
+ * Reads a first-party cookie, creating and setting it when absent.
9
+ *
10
+ * This is how an app tracks a visitor with no vendor SDK on the page: the
11
+ * identifiers GA4 and Meta key on are ordinary first-party cookies in a
12
+ * documented format, and nothing requires a browser script to be the one that
13
+ * writes them. It is the mechanism behind server-side tagging, and the reason
14
+ * pikku can offer it as a wired service rather than a second container to run.
15
+ *
16
+ * Minted once per wire, not once per call. The resolver runs for every event,
17
+ * and a second mint within one request would hand the same visitor two
18
+ * identities — which reads downstream as two people rather than as a bug.
19
+ *
20
+ * Writes nothing on a wire with no HTTP response, and nothing once the response
21
+ * has been sent; a cron task and a queue worker have no browser to store it,
22
+ * and a stream's headers are long gone. Both return undefined rather than
23
+ * pretending.
24
+ */
25
+ export const mintCookie = (wire, name, options, mint) => {
26
+ const existing = options.overwrite
27
+ ? null
28
+ : wire.http?.request?.cookie(name);
29
+ if (existing)
30
+ return existing;
31
+ const cache = minted.get(wire) ?? new Map();
32
+ const already = cache.get(name);
33
+ if (already)
34
+ return already;
35
+ const response = wire.http?.response;
36
+ if (!response)
37
+ return undefined;
38
+ if (!permitted(options.requires, options.consent))
39
+ return undefined;
40
+ const value = mint();
41
+ response.cookie(name, value, options.cookie);
42
+ cache.set(name, value);
43
+ minted.set(wire, cache);
44
+ return value;
45
+ };
46
+ /** Cryptographically random digits, the shape both vendor formats use. */
47
+ export const randomDigits = (length) => {
48
+ const bytes = new Uint8Array(length);
49
+ crypto.getRandomValues(bytes);
50
+ let digits = '';
51
+ for (const byte of bytes) {
52
+ digits += String(byte % 10);
53
+ }
54
+ return digits;
55
+ };
@@ -35,6 +35,13 @@ export declare class MissingScopeError extends PikkuError {
35
35
  };
36
36
  constructor(scope: string);
37
37
  }
38
+ export declare class FeatureUnavailableError extends PikkuError {
39
+ payload: {
40
+ error: 'feature_unavailable';
41
+ feature: string;
42
+ };
43
+ constructor(feature: string);
44
+ }
38
45
  export declare class ReadonlySessionError extends PikkuError {
39
46
  }
40
47
  export declare class InvalidOriginError extends PikkuError {
@@ -87,6 +87,23 @@ addError(MissingScopeError, {
87
87
  status: 403,
88
88
  message: 'The session does not hold a scope required by this function.',
89
89
  });
90
+ export class FeatureUnavailableError extends PikkuError {
91
+ payload;
92
+ constructor(feature) {
93
+ super(`Feature is currently unavailable: ${feature}`);
94
+ this.payload = {
95
+ error: 'feature_unavailable',
96
+ feature,
97
+ };
98
+ }
99
+ }
100
+ // 503 and not 403: a killed feature is a server-side, temporary, not-your-fault
101
+ // condition, and it should be retryable and monitorable as one. A 403 here
102
+ // would page the wrong team and tell the caller to fix something they cannot.
103
+ addError(FeatureUnavailableError, {
104
+ status: 503,
105
+ message: 'This feature is switched off.',
106
+ });
90
107
  export class ReadonlySessionError extends PikkuError {
91
108
  }
92
109
  addError(ReadonlySessionError, {
@@ -25,6 +25,8 @@ export type FunctionRuntimeMeta = {
25
25
  outputSchemaName: string | null;
26
26
  /** Scopes the session must hold to run this function. All are required (AND). */
27
27
  scopes?: string[];
28
+ /** The feature this function belongs to. Checked for availability only. */
29
+ featureFlag?: string;
28
30
  expose?: boolean;
29
31
  /**
30
32
  * A sessionless function's own `auth: true`. `sessionless` carries the
@@ -9,9 +9,12 @@ import { parseVersionedId } from '../version.js';
9
9
  import { PikkuSessionService } from '../services/user-session-service.js';
10
10
  import { MissingSessionError, ReadonlySessionError } from '../errors/errors.js';
11
11
  import { verifyScopes } from '../scopes.js';
12
+ import { assertFeatureAvailable } from '../wirings/flag/assert-feature-available.js';
12
13
  import { PikkuCredentialWireService, createWireServicesCredentialWireProps, } from '../services/credential-wire-service.js';
13
14
  import { defaultPikkuUserIdResolver } from '../services/pikku-user-id.js';
14
15
  import { createInvocationAudit, resolveAuditConfig, } from '../services/audit-service.js';
16
+ import { createInvocationAnalytics } from '../analytics/analytics.js';
17
+ import { LoggerAnalyticsService } from '../analytics/logger-analytics-service.js';
15
18
  import { rpcService } from '../wirings/rpc/rpc-runner.js';
16
19
  import { getOrCreatePackageSingletonServices } from '../wirings/addon/addon-runner.js';
17
20
  import { resolveAddonAuth, resolveAddonFunctionTarget, resolveAddonScopes, resolveAddonTagMiddleware, } from '../wirings/addon/wire-addon.js';
@@ -209,6 +212,16 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
209
212
  verifyScopes(addonScopes.length > 0
210
213
  ? [...addonScopes, ...(functionScopes ?? [])]
211
214
  : functionScopes, session);
215
+ const featureFlag = funcConfig.featureFlag ?? funcMeta.featureFlag;
216
+ if (featureFlag) {
217
+ // The host's source, not the package's: a `featureFlag:` on an addon
218
+ // function names a flag the consuming application declared and its
219
+ // operators switch. A package factory builds its own services and has no
220
+ // reason to carry one, and reading that would leave every addon gate
221
+ // open.
222
+ await assertFeatureAvailable(featureFlag, singletonServices.featureFlags ??
223
+ resolvedSingletonServices.featureFlags, session);
224
+ }
212
225
  let actualData = await data();
213
226
  const inputSchemaName = funcMeta.inputSchemaName;
214
227
  if (inputSchemaName) {
@@ -228,6 +241,7 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
228
241
  });
229
242
  let wireServices;
230
243
  let invocationAuditLog;
244
+ let invocationAnalytics;
231
245
  try {
232
246
  wireServices = (await resolvedCreateWireServices?.(resolvedSingletonServices, invocationWire));
233
247
  let services = wireServices && Object.keys(wireServices).length > 0
@@ -240,6 +254,20 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
240
254
  invocationAuditLog = createInvocationAudit(resolvedSingletonServices.audit, invocationWire, resolvedSingletonServices.logger);
241
255
  services = { ...services, auditLog: invocationAuditLog };
242
256
  }
257
+ // Unconditional, unlike the audit — every function can record. Built on
258
+ // first access, since most invocations record nothing.
259
+ if (!services.analytics) {
260
+ services = { ...services };
261
+ Object.defineProperty(services, 'analytics', {
262
+ get() {
263
+ invocationAnalytics ??= createInvocationAnalytics(resolvedSingletonServices.analyticsService ??
264
+ new LoggerAnalyticsService(resolvedSingletonServices.logger), invocationWire, resolvedSingletonServices.logger, resolvedSingletonServices.analyticsIdentity);
265
+ return invocationAnalytics;
266
+ },
267
+ configurable: true,
268
+ enumerable: true,
269
+ });
270
+ }
243
271
  const callerPackageName = funcPackageName;
244
272
  Object.defineProperty(invocationWire, 'rpc', {
245
273
  get() {
@@ -259,6 +287,7 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
259
287
  finally {
260
288
  // Flush the runner-installed audit buffer before wire services close.
261
289
  await invocationAuditLog?.close();
290
+ await invocationAnalytics?.close();
262
291
  if (wireServices && Object.keys(wireServices).length > 0) {
263
292
  await closeWireServices(resolvedSingletonServices.logger, wireServices);
264
293
  }
@@ -15,7 +15,7 @@ export type CorePikkuPermissionConfig<In = any, Services extends CoreSecretlessS
15
15
  name?: string;
16
16
  description?: string;
17
17
  };
18
- export declare const pikkuPermission: <In = any, Services extends CoreSecretlessSingletonServices = SecretlessServices<CoreServices>, Wire extends PickRequired<PikkuWire<In, never, false, any, PikkuRPC, never, never>, "session"> = PickRequired<PikkuWire<In, never, false, any, PikkuRPC, never, never>, "session">>(permission: CorePikkuPermission<In, Services, Wire> | CorePikkuPermissionConfig<In, Services, Wire>) => CorePikkuPermission<In, Services, Wire>;
18
+ export declare const pikkuPermission: <In = any, Services extends CoreSecretlessSingletonServices = SecretlessServices<CoreServices>, Wire extends PickRequired<PikkuWire<In, never, false, any, PikkuRPC, never, never>, 'session'> = PickRequired<PikkuWire<In, never, false, any, PikkuRPC, never, never>, 'session'>>(permission: CorePikkuPermission<In, Services, Wire> | CorePikkuPermissionConfig<In, Services, Wire>) => CorePikkuPermission<In, Services, Wire>;
19
19
  export type CorePikkuPermissionFactory<In = any, Services extends CoreSecretlessSingletonServices = SecretlessServices<CoreServices>, Wire extends PikkuWire<In, never, false, any, PikkuRPC, never, never> = PikkuWire<In, never, false, any, PikkuRPC, never, never>> = (input: In) => CorePikkuPermission<any, Services, Wire>;
20
20
  export declare const pikkuPermissionFactory: <In = any>(factory: CorePikkuPermissionFactory<In>) => CorePikkuPermissionFactory<In>;
21
21
  /**
@@ -47,7 +47,7 @@ export type CorePermissionGroup<PikkuPermission = CorePikkuPermission<any>> = Re
47
47
  * it is never recorded and never replayed.
48
48
  */
49
49
  export type CorePikkuFunctionHook<Services = any, Data = any, Wire = any> = (services: Services, data: Data, wire: Wire) => Promise<void> | void;
50
- export type CorePikkuFunctionConfig<PikkuFunction extends CorePikkuFunction<any, any, any, any, any> | CorePikkuFunctionSessionless<any, any, any, any, any>, PikkuPermission extends CorePikkuPermission<any, any, any> = CorePikkuPermission<any>, PikkuMiddleware extends CorePikkuMiddleware<any, any> = CorePikkuMiddleware<any, any>, InputSchema extends StandardSchemaV1 | undefined = undefined, OutputSchema extends StandardSchemaV1 | undefined = undefined, Scope extends string = string> = {
50
+ export type CorePikkuFunctionConfig<PikkuFunction extends CorePikkuFunction<any, any, any, any, any> | CorePikkuFunctionSessionless<any, any, any, any, any>, PikkuPermission extends CorePikkuPermission<any, any, any> = CorePikkuPermission<any>, PikkuMiddleware extends CorePikkuMiddleware<any, any> = CorePikkuMiddleware<any, any>, InputSchema extends StandardSchemaV1 | undefined = undefined, OutputSchema extends StandardSchemaV1 | undefined = undefined, Scope extends string = string, FeatureFlagName extends string = string> = {
51
51
  /** A human name for this function, shown wherever it is listed rather than called. */
52
52
  title?: string;
53
53
  /** What the function does. An agent choosing between tools reads this, so it is worth more care than a comment would be. */
@@ -128,6 +128,20 @@ export type CorePikkuFunctionConfig<PikkuFunction extends CorePikkuFunction<any,
128
128
  auth?: boolean;
129
129
  /** Scopes the session must hold. All are required, and checked before `permissions`, which OR together — a scope only narrows access. */
130
130
  scopes?: Scope[];
131
+ /**
132
+ * The feature this function belongs to. Singular: a function implements part
133
+ * of one feature, and needing two is a sign it does two things.
134
+ *
135
+ * Resolved at runtime on every call, unlike `tags:` — a flag is
136
+ * meant to be flipped in a running system, so nothing here filters a build.
137
+ *
138
+ * Checked for AVAILABILITY only, never capability — if the runner enforced
139
+ * the capability half a flag would become a second authorization path with
140
+ * OR-ish semantics against `scopes:`. Authorization is always `scopes:`.
141
+ * Runs after `scopes:` so an unauthorized caller gets a 403 whether or not
142
+ * the feature is up, rather than learning that it exists and is off.
143
+ */
144
+ featureFlag?: FeatureFlagName;
131
145
  /** Checks that run before the body. Grouped names OR together, so any one passing admits the caller; use `scopes` to require rather than offer. */
132
146
  permissions?: CorePermissionGroup<PikkuPermission>;
133
147
  /** Wraps this function wherever it is called from, unlike wiring middleware which only wraps one route into it. */
@@ -148,5 +162,10 @@ export type CorePikkuFunctionConfig<PikkuFunction extends CorePikkuFunction<any,
148
162
  * so an anonymous caller holds none and satisfies none — a sessionless function
149
163
  * with scopes rejects every caller it exists to serve. Gate it with
150
164
  * `permissions`, which receive the optional session and may pass anonymous.
165
+ *
166
+ * `featureFlag` is deliberately NOT omitted. It reads the config snapshot
167
+ * rather than the session, so it applies identically to a cron task, a queue
168
+ * worker and a webhook — which is where a kill switch matters most, since
169
+ * nobody is watching a UI to notice the feature is off.
151
170
  */
152
- export type CorePikkuSessionlessFunctionConfig<PikkuFunction extends CorePikkuFunctionSessionless<any, any, any, any, any>, PikkuPermission extends CorePikkuPermission<any, any, any> = CorePikkuPermission<any>, PikkuMiddleware extends CorePikkuMiddleware<any, any> = CorePikkuMiddleware<any, any>, InputSchema extends StandardSchemaV1 | undefined = undefined, OutputSchema extends StandardSchemaV1 | undefined = undefined> = Omit<CorePikkuFunctionConfig<PikkuFunction, PikkuPermission, PikkuMiddleware, InputSchema, OutputSchema>, 'scopes'>;
171
+ export type CorePikkuSessionlessFunctionConfig<PikkuFunction extends CorePikkuFunctionSessionless<any, any, any, any, any>, PikkuPermission extends CorePikkuPermission<any, any, any> = CorePikkuPermission<any>, PikkuMiddleware extends CorePikkuMiddleware<any, any> = CorePikkuMiddleware<any, any>, InputSchema extends StandardSchemaV1 | undefined = undefined, OutputSchema extends StandardSchemaV1 | undefined = undefined, FeatureFlagName extends string = string> = Omit<CorePikkuFunctionConfig<PikkuFunction, PikkuPermission, PikkuMiddleware, InputSchema, OutputSchema, string, FeatureFlagName>, 'scopes'>;
@@ -6,5 +6,5 @@
6
6
  */
7
7
  export declare const authAPIKey: import("./middleware.types.js").CorePikkuMiddlewareFactory<{
8
8
  /** Where to look: the `x-api-key` header, the `apiKey` query param, or both. */
9
- source: "header" | "query" | "all";
9
+ source: 'header' | 'query' | 'all';
10
10
  }>;
@@ -7,5 +7,5 @@ export declare const resetPikkuState: () => void;
7
7
  export declare const getSingletonServices: () => CoreSingletonServices;
8
8
  export declare const setSingletonServices: (services: CoreSingletonServices) => void;
9
9
  export declare const getCreateWireServices: () => CreateWireServices | undefined;
10
- export declare const addPackageServiceFactories: (packageName: string, factories: NonNullable<PikkuPackageState["package"]["factories"]>) => void;
10
+ export declare const addPackageServiceFactories: (packageName: string, factories: NonNullable<PikkuPackageState['package']['factories']>) => void;
11
11
  export type { PikkuPackageState } from './types/state.types.js';
package/dist/scopes.d.ts CHANGED
@@ -4,6 +4,17 @@ import type { CoreUserSession } from './types/core.types.js';
4
4
  * than enforcing. Fails closed; an empty `required` is satisfied by anything.
5
5
  */
6
6
  export declare const hasScopes: (required: readonly string[] | undefined, held: Iterable<string> | undefined) => boolean;
7
+ /**
8
+ * True when `held` satisfies AT LEAST ONE of `candidates`, with the same
9
+ * parent/wildcard rules as {@link hasScopes}.
10
+ *
11
+ * The OR counterpart to {@link hasScopes}, for a feature flag's `anyOf`: a flag
12
+ * usually reveals one entry point several roles can reach, so requiring all of
13
+ * them would hide it from everyone who can actually use it. Fails closed — an
14
+ * empty or absent `candidates` is satisfied by nothing, because "any of
15
+ * nothing" has no member that could hold.
16
+ */
17
+ export declare const hasAnyScope: (candidates: readonly string[] | undefined, held: Iterable<string> | undefined) => boolean;
7
18
  /**
8
19
  * Throws {@link MissingScopeError} naming the first scope the session does not
9
20
  * hold. Fails closed: no session, or a session without `scopes`, satisfies
package/dist/scopes.js CHANGED
@@ -36,6 +36,23 @@ const firstUnsatisfied = (required, held) => {
36
36
  * than enforcing. Fails closed; an empty `required` is satisfied by anything.
37
37
  */
38
38
  export const hasScopes = (required, held) => firstUnsatisfied(required, held) === null;
39
+ /**
40
+ * True when `held` satisfies AT LEAST ONE of `candidates`, with the same
41
+ * parent/wildcard rules as {@link hasScopes}.
42
+ *
43
+ * The OR counterpart to {@link hasScopes}, for a feature flag's `anyOf`: a flag
44
+ * usually reveals one entry point several roles can reach, so requiring all of
45
+ * them would hide it from everyone who can actually use it. Fails closed — an
46
+ * empty or absent `candidates` is satisfied by nothing, because "any of
47
+ * nothing" has no member that could hold.
48
+ */
49
+ export const hasAnyScope = (candidates, held) => {
50
+ if (!candidates || candidates.length === 0) {
51
+ return false;
52
+ }
53
+ const grants = new Set(held ?? []);
54
+ return candidates.some((scope) => holds(grants, scope));
55
+ };
39
56
  /**
40
57
  * Throws {@link MissingScopeError} naming the first scope the session does not
41
58
  * hold. Fails closed: no session, or a session without `scopes`, satisfies
@@ -42,5 +42,5 @@ export declare function createMiddlewareCredentialWireProps(credentialWire: Pikk
42
42
  export declare function createWireServicesCredentialWireProps(credentialWire: PikkuCredentialWireService, allowedNames?: string[]): {
43
43
  setCredential: (name: string, value: unknown) => void;
44
44
  getCredential: <T = unknown>(name: string) => T | Promise<T | null> | null;
45
- getCredentials: () => Record<string, unknown> | Promise<Record<string, unknown>>;
45
+ getCredentials: () => Promise<Record<string, unknown>> | Record<string, unknown>;
46
46
  };