@pikku/core 0.12.107 → 0.12.112

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (594) hide show
  1. package/CHANGELOG.md +357 -0
  2. package/dist/analytics/analytics.d.ts +6 -0
  3. package/dist/analytics/analytics.js +58 -0
  4. package/dist/analytics/analytics.types.d.ts +156 -0
  5. package/dist/analytics/analytics.types.js +1 -0
  6. package/dist/analytics/anonymous-analytics-identity.d.ts +23 -0
  7. package/dist/analytics/anonymous-analytics-identity.js +27 -0
  8. package/dist/analytics/compose-analytics-identity.d.ts +14 -0
  9. package/dist/analytics/compose-analytics-identity.js +33 -0
  10. package/dist/analytics/cookie-analytics-identity.d.ts +24 -0
  11. package/dist/analytics/cookie-analytics-identity.js +37 -0
  12. package/dist/analytics/define-analytics-events.d.ts +22 -0
  13. package/dist/analytics/define-analytics-events.js +9 -0
  14. package/dist/analytics/fan-out-analytics.d.ts +15 -0
  15. package/dist/analytics/fan-out-analytics.js +36 -0
  16. package/dist/analytics/index.d.ts +13 -0
  17. package/dist/analytics/index.js +8 -0
  18. package/dist/analytics/logger-analytics-service.d.ts +14 -0
  19. package/dist/analytics/logger-analytics-service.js +23 -0
  20. package/dist/analytics/mint-cookie.d.ts +44 -0
  21. package/dist/analytics/mint-cookie.js +55 -0
  22. package/dist/dev/hot-reload.d.ts +0 -1
  23. package/dist/dev/hot-reload.js +4 -25
  24. package/dist/dev/module-runner.js +104 -25
  25. package/dist/errors/errors.d.ts +7 -0
  26. package/dist/errors/errors.js +17 -0
  27. package/dist/function/function-meta.types.d.ts +2 -0
  28. package/dist/function/function-runner.js +29 -0
  29. package/dist/function/functions.types.d.ts +22 -3
  30. package/dist/middleware/auth-apikey.d.ts +1 -1
  31. package/dist/pikku-state.d.ts +1 -1
  32. package/dist/scopes.d.ts +11 -0
  33. package/dist/scopes.js +17 -0
  34. package/dist/services/credential-wire-service.d.ts +1 -1
  35. package/dist/services/feature-flag-service.d.ts +100 -0
  36. package/dist/services/feature-flag-service.js +1 -0
  37. package/dist/services/index.d.ts +1 -0
  38. package/dist/services/meta-service.d.ts +16 -0
  39. package/dist/services/meta-service.js +19 -0
  40. package/dist/services/webhook-service.d.ts +7 -2
  41. package/dist/services/webhook-service.js +11 -6
  42. package/dist/testing/service-tests/agent-run-service-tests.d.ts +2 -2
  43. package/dist/testing/service-tests/agent-storage-service-tests.d.ts +1 -1
  44. package/dist/testing/service-tests/channel-store-tests.d.ts +1 -1
  45. package/dist/testing/service-tests/credential-service-tests.d.ts +1 -1
  46. package/dist/testing/service-tests/deployment-service-tests.d.ts +1 -1
  47. package/dist/testing/service-tests/event-hub-store-tests.d.ts +1 -1
  48. package/dist/testing/service-tests/secret-service-tests.d.ts +1 -1
  49. package/dist/testing/service-tests/session-store-tests.d.ts +1 -1
  50. package/dist/testing/service-tests/workflow-run-service-tests.d.ts +1 -1
  51. package/dist/testing/service-tests/workflow-service-tests.d.ts +1 -1
  52. package/dist/types/core.types.d.ts +23 -0
  53. package/dist/wirings/agent/agent-rpc.d.ts +1 -1
  54. package/dist/wirings/agent/agent-turn.d.ts +1 -1
  55. package/dist/wirings/agent-scorer/agent-scorer-live.d.ts +1 -1
  56. package/dist/wirings/channel/channel-common.d.ts +1 -1
  57. package/dist/wirings/channel/channel-rpc-validators.d.ts +2 -2
  58. package/dist/wirings/channel/channel-runner.d.ts +1 -1
  59. package/dist/wirings/channel/local/local-channel-runner.d.ts +1 -1
  60. package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +1 -1
  61. package/dist/wirings/cli/channel/cli-approval.d.ts +2 -2
  62. package/dist/wirings/flag/assert-feature-available.d.ts +15 -0
  63. package/dist/wirings/flag/assert-feature-available.js +23 -0
  64. package/dist/wirings/flag/cached-flag-source.d.ts +73 -0
  65. package/dist/wirings/flag/cached-flag-source.js +96 -0
  66. package/dist/wirings/flag/define-feature-flags.d.ts +33 -0
  67. package/dist/wirings/flag/define-feature-flags.js +32 -0
  68. package/dist/wirings/flag/flag.types.d.ts +97 -0
  69. package/dist/wirings/flag/flag.types.js +1 -0
  70. package/dist/wirings/flag/index.d.ts +7 -0
  71. package/dist/wirings/flag/index.js +5 -0
  72. package/dist/wirings/flag/resolve-flag.d.ts +52 -0
  73. package/dist/wirings/flag/resolve-flag.js +90 -0
  74. package/dist/wirings/flag/validate-flag-definitions.d.ts +26 -0
  75. package/dist/wirings/flag/validate-flag-definitions.js +103 -0
  76. package/dist/wirings/virtual-user/virtual-user-scaffold.d.ts +8 -8
  77. package/dist/wirings/virtual-user/virtual-user-schedule.d.ts +1 -1
  78. package/dist/wirings/workflow/workflow-queue-routing.d.ts +1 -1
  79. package/knowledge/decisions/internals/a-reset-suite-makes-the-dev-seed-the-fixture.md +50 -0
  80. package/knowledge/decisions/internals/hot-reload-reads-the-changed-source-never-a-compiled-copy.md +38 -0
  81. package/knowledge/decisions/internals/index.md +2 -0
  82. package/package.json +11 -5
  83. package/run-tests.sh +17 -9
  84. package/src/public-surface.json +26 -0
  85. package/src/agent-naming.test.ts +0 -68
  86. package/src/api-report.test.ts +0 -138
  87. package/src/app-alias-surface.test.ts +0 -179
  88. package/src/app-leaf-surface.test.ts +0 -222
  89. package/src/bootstrap-compat/root.ts +0 -20
  90. package/src/classification/column-form.test.ts +0 -97
  91. package/src/classification/column-form.ts +0 -55
  92. package/src/classification/data-classification.ts +0 -73
  93. package/src/classification/index.ts +0 -40
  94. package/src/classification/key-ids.ts +0 -2
  95. package/src/classification/secret-value.test.ts +0 -204
  96. package/src/classification/secret-value.ts +0 -106
  97. package/src/crypto-utils.test.ts +0 -668
  98. package/src/crypto-utils.ts +0 -460
  99. package/src/dev/hot-reload.test.ts +0 -587
  100. package/src/dev/hot-reload.ts +0 -225
  101. package/src/dev/module-runner.test.ts +0 -235
  102. package/src/dev/module-runner.ts +0 -138
  103. package/src/dev/reload-meta.test.ts +0 -183
  104. package/src/dev/reload-meta.ts +0 -144
  105. package/src/ecosystem-tier-removed.test.ts +0 -72
  106. package/src/env.ts +0 -1
  107. package/src/errors/error-handler.ts +0 -77
  108. package/src/errors/error.test.ts +0 -229
  109. package/src/errors/errors.ts +0 -393
  110. package/src/errors/index.ts +0 -11
  111. package/src/errors/serialized-error.ts +0 -12
  112. package/src/factory-functions.test.ts +0 -111
  113. package/src/function/abort-scope.test.ts +0 -97
  114. package/src/function/abort-scope.ts +0 -80
  115. package/src/function/function-meta.types.ts +0 -151
  116. package/src/function/function-runner.test.ts +0 -1619
  117. package/src/function/function-runner.ts +0 -499
  118. package/src/function/functions.types.ts +0 -319
  119. package/src/function/index.ts +0 -40
  120. package/src/function/list.types.test.ts +0 -100
  121. package/src/function/list.types.ts +0 -69
  122. package/src/function/pikku-request.test.ts +0 -35
  123. package/src/function/pikku-request.ts +0 -17
  124. package/src/gopass-secrets-removed.test.ts +0 -51
  125. package/src/handle-error.test.ts +0 -532
  126. package/src/handle-error.ts +0 -64
  127. package/src/middleware/auth-apikey.test.ts +0 -362
  128. package/src/middleware/auth-apikey.ts +0 -39
  129. package/src/middleware/auth-bearer.test.ts +0 -566
  130. package/src/middleware/auth-bearer.ts +0 -83
  131. package/src/middleware/auth-cookie.test.ts +0 -572
  132. package/src/middleware/auth-cookie.ts +0 -107
  133. package/src/middleware/cors.test.ts +0 -579
  134. package/src/middleware/cors.ts +0 -103
  135. package/src/middleware/index.ts +0 -30
  136. package/src/middleware/middleware-factories.ts +0 -76
  137. package/src/middleware/middleware.types.ts +0 -61
  138. package/src/middleware/remote-auth.test.ts +0 -547
  139. package/src/middleware/remote-auth.ts +0 -95
  140. package/src/middleware/remote-jobs-secret.ts +0 -35
  141. package/src/middleware/require-origin.test.ts +0 -115
  142. package/src/middleware/require-origin.ts +0 -79
  143. package/src/middleware/telemetry.ts +0 -83
  144. package/src/middleware-runner.test.ts +0 -578
  145. package/src/middleware-runner.ts +0 -232
  146. package/src/no-any-casts.test.ts +0 -57
  147. package/src/no-root-barrel.test.ts +0 -122
  148. package/src/permissions.test.ts +0 -256
  149. package/src/permissions.ts +0 -217
  150. package/src/pikku-state.test.ts +0 -198
  151. package/src/pikku-state.ts +0 -206
  152. package/src/production-barrels-stay-lean.test.ts +0 -110
  153. package/src/public-surface.test.ts +0 -133
  154. package/src/remote.test.ts +0 -173
  155. package/src/remote.ts +0 -56
  156. package/src/removed-legacy-exports.test.ts +0 -66
  157. package/src/run-tests-script.test.ts +0 -67
  158. package/src/schema.test.ts +0 -430
  159. package/src/schema.ts +0 -204
  160. package/src/scopes.test.ts +0 -203
  161. package/src/scopes.ts +0 -67
  162. package/src/services/agent-run-state-service.ts +0 -37
  163. package/src/services/agent-runner-service.ts +0 -238
  164. package/src/services/agent-storage-service.ts +0 -39
  165. package/src/services/ai-embedding-service.ts +0 -9
  166. package/src/services/audit-service.test.ts +0 -44
  167. package/src/services/audit-service.ts +0 -280
  168. package/src/services/content-service.ts +0 -65
  169. package/src/services/credential-service.ts +0 -20
  170. package/src/services/credential-wire-service.test.ts +0 -235
  171. package/src/services/credential-wire-service.ts +0 -120
  172. package/src/services/deployment-service.ts +0 -32
  173. package/src/services/email-service.test.ts +0 -100
  174. package/src/services/email-service.ts +0 -60
  175. package/src/services/email-template.test.ts +0 -311
  176. package/src/services/email-template.ts +0 -254
  177. package/src/services/file-scenario-run-store.test.ts +0 -349
  178. package/src/services/file-scenario-run-store.ts +0 -282
  179. package/src/services/gateway-service.ts +0 -5
  180. package/src/services/http-personas-converse.test.ts +0 -274
  181. package/src/services/http-personas.test.ts +0 -379
  182. package/src/services/http-personas.ts +0 -508
  183. package/src/services/in-memory-agent-run-state-service.ts +0 -87
  184. package/src/services/in-memory-queue-service.test.ts +0 -162
  185. package/src/services/in-memory-queue-service.ts +0 -78
  186. package/src/services/in-memory-session-store.test.ts +0 -58
  187. package/src/services/in-memory-session-store.ts +0 -20
  188. package/src/services/in-memory-trigger-service.ts +0 -47
  189. package/src/services/in-memory-workflow-service.test.ts +0 -430
  190. package/src/services/in-memory-workflow-service.ts +0 -595
  191. package/src/services/index.ts +0 -192
  192. package/src/services/istanbul-coverage-service.test.ts +0 -66
  193. package/src/services/istanbul-coverage-service.ts +0 -59
  194. package/src/services/jwt-service.ts +0 -15
  195. package/src/services/local-content-request-handler.test.ts +0 -240
  196. package/src/services/local-content-request-handler.ts +0 -295
  197. package/src/services/local-content.test.ts +0 -186
  198. package/src/services/local-content.ts +0 -242
  199. package/src/services/local-credential-service.ts +0 -63
  200. package/src/services/local-email-service.test.ts +0 -182
  201. package/src/services/local-email-service.ts +0 -43
  202. package/src/services/local-gateway-service.ts +0 -51
  203. package/src/services/local-secrets.test.ts +0 -95
  204. package/src/services/local-secrets.ts +0 -71
  205. package/src/services/local-variables.test.ts +0 -61
  206. package/src/services/local-variables.ts +0 -45
  207. package/src/services/logger-console.test.ts +0 -117
  208. package/src/services/logger-console.ts +0 -174
  209. package/src/services/logger.ts +0 -48
  210. package/src/services/meta-service.test.ts +0 -75
  211. package/src/services/meta-service.ts +0 -767
  212. package/src/services/persona-actor-secret.test.ts +0 -68
  213. package/src/services/persona-actor-secret.ts +0 -70
  214. package/src/services/persona-sign-in.test.ts +0 -219
  215. package/src/services/persona-sign-in.ts +0 -238
  216. package/src/services/personas-service.ts +0 -191
  217. package/src/services/pikku-user-id.test.ts +0 -62
  218. package/src/services/pikku-user-id.ts +0 -13
  219. package/src/services/queue-webhook-service.test.ts +0 -409
  220. package/src/services/queue-webhook-service.ts +0 -150
  221. package/src/services/remote-jobs.test.ts +0 -106
  222. package/src/services/remote-jobs.ts +0 -92
  223. package/src/services/scheduler-service.ts +0 -37
  224. package/src/services/schema-service.ts +0 -10
  225. package/src/services/scope-service.ts +0 -91
  226. package/src/services/scoped-credential-service.test.ts +0 -86
  227. package/src/services/scoped-credential-service.ts +0 -63
  228. package/src/services/scoped-secret-service.test.ts +0 -93
  229. package/src/services/scoped-secret-service.ts +0 -40
  230. package/src/services/secret-host-binding.test.ts +0 -138
  231. package/src/services/secret-host-binding.ts +0 -51
  232. package/src/services/secret-service.ts +0 -25
  233. package/src/services/secretless.test.ts +0 -54
  234. package/src/services/secretless.ts +0 -29
  235. package/src/services/session-store.ts +0 -9
  236. package/src/services/stub-tracker.test.ts +0 -104
  237. package/src/services/stub-tracker.ts +0 -175
  238. package/src/services/system-role-guard.test.ts +0 -96
  239. package/src/services/system-role-guard.ts +0 -71
  240. package/src/services/temporary-file-service.ts +0 -76
  241. package/src/services/trigger-service.ts +0 -5
  242. package/src/services/typed-credential-service.ts +0 -83
  243. package/src/services/typed-secret-service.test.ts +0 -204
  244. package/src/services/typed-secret-service.ts +0 -132
  245. package/src/services/typed-variables-service.test.ts +0 -166
  246. package/src/services/typed-variables-service.ts +0 -166
  247. package/src/services/user-session-service.test.ts +0 -147
  248. package/src/services/user-session-service.ts +0 -85
  249. package/src/services/v8-coverage-service.test.ts +0 -69
  250. package/src/services/v8-coverage-service.ts +0 -163
  251. package/src/services/variables-service.ts +0 -13
  252. package/src/services/webhook-service.ts +0 -147
  253. package/src/services/workflow-service.ts +0 -120
  254. package/src/side-effects-are-declared.test.ts +0 -84
  255. package/src/source-files-stay-composable.test.ts +0 -41
  256. package/src/template-alias-surface.test.ts +0 -240
  257. package/src/test-utils.ts +0 -38
  258. package/src/testing/index.ts +0 -3
  259. package/src/testing/service-tests/agent-run-service-tests.ts +0 -98
  260. package/src/testing/service-tests/agent-storage-service-tests.ts +0 -379
  261. package/src/testing/service-tests/channel-store-tests.ts +0 -98
  262. package/src/testing/service-tests/credential-service-tests.ts +0 -143
  263. package/src/testing/service-tests/deployment-service-tests.ts +0 -33
  264. package/src/testing/service-tests/event-hub-store-tests.ts +0 -48
  265. package/src/testing/service-tests/secret-service-tests.ts +0 -105
  266. package/src/testing/service-tests/session-store-tests.ts +0 -62
  267. package/src/testing/service-tests/workflow-run-service-tests.ts +0 -59
  268. package/src/testing/service-tests/workflow-service-tests.ts +0 -308
  269. package/src/testing/service-tests.ts +0 -95
  270. package/src/time-utils.test.ts +0 -56
  271. package/src/time-utils.ts +0 -89
  272. package/src/types/core.types.ts +0 -446
  273. package/src/types/index.ts +0 -25
  274. package/src/types/state.types.ts +0 -226
  275. package/src/types/typed-credentials.test.ts +0 -72
  276. package/src/utils/hash.test.ts +0 -68
  277. package/src/utils/hash.ts +0 -26
  278. package/src/utils/hmac.ts +0 -21
  279. package/src/utils/node-host-resolver.ts +0 -20
  280. package/src/utils/safe-fetch.test.ts +0 -515
  281. package/src/utils/safe-fetch.ts +0 -347
  282. package/src/utils.test.ts +0 -359
  283. package/src/utils.ts +0 -165
  284. package/src/version.test.ts +0 -80
  285. package/src/version.ts +0 -25
  286. package/src/wirings/actor-flow/actor-flow.types.ts +0 -40
  287. package/src/wirings/actor-flow/index.ts +0 -10
  288. package/src/wirings/actor-flow/run-conversation.test.ts +0 -187
  289. package/src/wirings/actor-flow/run-conversation.ts +0 -280
  290. package/src/wirings/addon/addon-auth-tags.test.ts +0 -219
  291. package/src/wirings/addon/addon-runner.ts +0 -236
  292. package/src/wirings/addon/addon-scopes.test.ts +0 -225
  293. package/src/wirings/addon/addon-secrets.test.ts +0 -391
  294. package/src/wirings/addon/index.ts +0 -12
  295. package/src/wirings/addon/remote-addon-auth.ts +0 -65
  296. package/src/wirings/addon/wire-addon.test.ts +0 -102
  297. package/src/wirings/addon/wire-addon.ts +0 -202
  298. package/src/wirings/addon/wire-remote-addon.ts +0 -41
  299. package/src/wirings/agent/agent-agui.test.ts +0 -1213
  300. package/src/wirings/agent/agent-agui.ts +0 -405
  301. package/src/wirings/agent/agent-authorization.test.ts +0 -208
  302. package/src/wirings/agent/agent-finalize.test.ts +0 -187
  303. package/src/wirings/agent/agent-finalize.ts +0 -197
  304. package/src/wirings/agent/agent-helpers.test.ts +0 -215
  305. package/src/wirings/agent/agent-helpers.ts +0 -96
  306. package/src/wirings/agent/agent-interrupt.test.ts +0 -833
  307. package/src/wirings/agent/agent-interrupt.ts +0 -400
  308. package/src/wirings/agent/agent-memory.test.ts +0 -397
  309. package/src/wirings/agent/agent-memory.ts +0 -496
  310. package/src/wirings/agent/agent-middleware.types.test.ts +0 -41
  311. package/src/wirings/agent/agent-model-config.test.ts +0 -103
  312. package/src/wirings/agent/agent-model-config.ts +0 -59
  313. package/src/wirings/agent/agent-prepare.test.ts +0 -977
  314. package/src/wirings/agent/agent-prepare.ts +0 -1083
  315. package/src/wirings/agent/agent-registry.test.ts +0 -455
  316. package/src/wirings/agent/agent-registry.ts +0 -99
  317. package/src/wirings/agent/agent-resume-authorization.test.ts +0 -206
  318. package/src/wirings/agent/agent-rpc.ts +0 -116
  319. package/src/wirings/agent/agent-runner.test.ts +0 -1229
  320. package/src/wirings/agent/agent-runner.ts +0 -858
  321. package/src/wirings/agent/agent-stream-delegate.test.ts +0 -381
  322. package/src/wirings/agent/agent-stream-output-hooks.test.ts +0 -353
  323. package/src/wirings/agent/agent-stream.test.ts +0 -1800
  324. package/src/wirings/agent/agent-stream.ts +0 -1639
  325. package/src/wirings/agent/agent-thread-ownership.test.ts +0 -297
  326. package/src/wirings/agent/agent-turn.test.ts +0 -65
  327. package/src/wirings/agent/agent-turn.ts +0 -122
  328. package/src/wirings/agent/agent-utils.ts +0 -20
  329. package/src/wirings/agent/agent.types.ts +0 -676
  330. package/src/wirings/agent/index.ts +0 -58
  331. package/src/wirings/agent/voice-input.test.ts +0 -220
  332. package/src/wirings/agent/voice-input.ts +0 -180
  333. package/src/wirings/agent/voice-output.test.ts +0 -510
  334. package/src/wirings/agent/voice-output.ts +0 -311
  335. package/src/wirings/agent-scorer/agent-scorer-grade.test.ts +0 -106
  336. package/src/wirings/agent-scorer/agent-scorer-grade.ts +0 -55
  337. package/src/wirings/agent-scorer/agent-scorer-judge.test.ts +0 -285
  338. package/src/wirings/agent-scorer/agent-scorer-judge.ts +0 -180
  339. package/src/wirings/agent-scorer/agent-scorer-live.test.ts +0 -174
  340. package/src/wirings/agent-scorer/agent-scorer-live.ts +0 -56
  341. package/src/wirings/agent-scorer/agent-scorer-registry.ts +0 -66
  342. package/src/wirings/agent-scorer/agent-scorer-sampling.test.ts +0 -34
  343. package/src/wirings/agent-scorer/agent-scorer-sampling.ts +0 -36
  344. package/src/wirings/agent-scorer/agent-scorer-snapshots.test.ts +0 -49
  345. package/src/wirings/agent-scorer/agent-scorer-snapshots.ts +0 -46
  346. package/src/wirings/agent-scorer/agent-scorer-worker.test.ts +0 -122
  347. package/src/wirings/agent-scorer/agent-scorer-worker.ts +0 -71
  348. package/src/wirings/agent-scorer/agent-scorer.ts +0 -102
  349. package/src/wirings/agent-scorer/agent-scorer.types.ts +0 -128
  350. package/src/wirings/agent-scorer/index.ts +0 -23
  351. package/src/wirings/channel/channel-common.ts +0 -102
  352. package/src/wirings/channel/channel-handler-shapes.test.ts +0 -72
  353. package/src/wirings/channel/channel-handler.test.ts +0 -322
  354. package/src/wirings/channel/channel-handler.ts +0 -259
  355. package/src/wirings/channel/channel-host-rpc.test.ts +0 -150
  356. package/src/wirings/channel/channel-host-rpc.ts +0 -69
  357. package/src/wirings/channel/channel-middleware-runner.test.ts +0 -188
  358. package/src/wirings/channel/channel-middleware-runner.ts +0 -126
  359. package/src/wirings/channel/channel-rpc-registry.ts +0 -116
  360. package/src/wirings/channel/channel-rpc-responder.ts +0 -117
  361. package/src/wirings/channel/channel-rpc-service.ts +0 -132
  362. package/src/wirings/channel/channel-rpc-validators.ts +0 -65
  363. package/src/wirings/channel/channel-rpc.test.ts +0 -841
  364. package/src/wirings/channel/channel-rpc.ts +0 -5
  365. package/src/wirings/channel/channel-rpc.types.ts +0 -160
  366. package/src/wirings/channel/channel-runner.ts +0 -164
  367. package/src/wirings/channel/channel-store.ts +0 -35
  368. package/src/wirings/channel/channel.types.ts +0 -193
  369. package/src/wirings/channel/define-channel-routes.ts +0 -5
  370. package/src/wirings/channel/eventhub-service.ts +0 -16
  371. package/src/wirings/channel/eventhub-store.ts +0 -13
  372. package/src/wirings/channel/index.ts +0 -40
  373. package/src/wirings/channel/local/index.ts +0 -3
  374. package/src/wirings/channel/local/local-channel-handler.ts +0 -98
  375. package/src/wirings/channel/local/local-channel-runner.test.ts +0 -339
  376. package/src/wirings/channel/local/local-channel-runner.ts +0 -271
  377. package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -77
  378. package/src/wirings/channel/local/local-eventhub-service.ts +0 -69
  379. package/src/wirings/channel/log-channels.ts +0 -16
  380. package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +0 -135
  381. package/src/wirings/channel/pikku-abstract-channel-handler.ts +0 -60
  382. package/src/wirings/channel/serverless/index.ts +0 -6
  383. package/src/wirings/channel/serverless/serverless-channel-runner.ts +0 -328
  384. package/src/wirings/cli/channel/cli-approval.test.ts +0 -177
  385. package/src/wirings/cli/channel/cli-approval.ts +0 -135
  386. package/src/wirings/cli/channel/cli-channel-runner.ts +0 -118
  387. package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +0 -192
  388. package/src/wirings/cli/channel/cli-raw-channel-runner.ts +0 -148
  389. package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +0 -480
  390. package/src/wirings/cli/channel/cli-raw-client-runner.ts +0 -188
  391. package/src/wirings/cli/channel/index.ts +0 -6
  392. package/src/wirings/cli/cli-runner.test.ts +0 -969
  393. package/src/wirings/cli/cli-runner.ts +0 -538
  394. package/src/wirings/cli/cli.types.ts +0 -388
  395. package/src/wirings/cli/command-parser.test.ts +0 -1120
  396. package/src/wirings/cli/command-parser.ts +0 -713
  397. package/src/wirings/cli/define-cli-commands.ts +0 -13
  398. package/src/wirings/cli/format-cli-error.test.ts +0 -91
  399. package/src/wirings/cli/format-cli-error.ts +0 -96
  400. package/src/wirings/cli/index.ts +0 -19
  401. package/src/wirings/credential/credential.types.ts +0 -37
  402. package/src/wirings/credential/define-credential.ts +0 -49
  403. package/src/wirings/credential/index.ts +0 -7
  404. package/src/wirings/credential/validate-credential-definitions.ts +0 -63
  405. package/src/wirings/gateway/gateway-authorization.test.ts +0 -575
  406. package/src/wirings/gateway/gateway-channel-meta.test.ts +0 -44
  407. package/src/wirings/gateway/gateway-runner.test.ts +0 -581
  408. package/src/wirings/gateway/gateway-runner.ts +0 -411
  409. package/src/wirings/gateway/gateway.types.ts +0 -137
  410. package/src/wirings/gateway/index.ts +0 -15
  411. package/src/wirings/http/http-routes.test.ts +0 -318
  412. package/src/wirings/http/http-routes.ts +0 -111
  413. package/src/wirings/http/http-runner-addon-ref.test.ts +0 -238
  414. package/src/wirings/http/http-runner.test.ts +0 -503
  415. package/src/wirings/http/http-runner.ts +0 -462
  416. package/src/wirings/http/http.types.ts +0 -307
  417. package/src/wirings/http/index.ts +0 -27
  418. package/src/wirings/http/log-http-routes.ts +0 -18
  419. package/src/wirings/http/pikku-fetch-http-request.test.ts +0 -318
  420. package/src/wirings/http/pikku-fetch-http-request.ts +0 -260
  421. package/src/wirings/http/pikku-fetch-http-response.test.ts +0 -123
  422. package/src/wirings/http/pikku-fetch-http-response.ts +0 -149
  423. package/src/wirings/http/routers/http-router.ts +0 -13
  424. package/src/wirings/http/routers/path-to-regex.test.ts +0 -306
  425. package/src/wirings/http/routers/path-to-regex.ts +0 -115
  426. package/src/wirings/http/web-request.test.ts +0 -382
  427. package/src/wirings/http/web-request.ts +0 -162
  428. package/src/wirings/mcp/index.ts +0 -26
  429. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -388
  430. package/src/wirings/mcp/mcp-endpoint-registry.ts +0 -159
  431. package/src/wirings/mcp/mcp-runner.test.ts +0 -588
  432. package/src/wirings/mcp/mcp-runner.ts +0 -330
  433. package/src/wirings/mcp/mcp.types.ts +0 -199
  434. package/src/wirings/node/index.ts +0 -2
  435. package/src/wirings/node/node.types.ts +0 -23
  436. package/src/wirings/oauth2/index.ts +0 -1
  437. package/src/wirings/oauth2/oauth2.types.ts +0 -12
  438. package/src/wirings/persona/define-personas.ts +0 -33
  439. package/src/wirings/persona/index.ts +0 -75
  440. package/src/wirings/persona/persona-app-scopes.test.ts +0 -47
  441. package/src/wirings/persona/persona-app-scopes.ts +0 -74
  442. package/src/wirings/persona/persona-email.ts +0 -87
  443. package/src/wirings/persona/persona-environments.test.ts +0 -194
  444. package/src/wirings/persona/persona-environments.ts +0 -138
  445. package/src/wirings/persona/persona-mailbox.ts +0 -156
  446. package/src/wirings/persona/persona.test.ts +0 -230
  447. package/src/wirings/persona/persona.types.ts +0 -156
  448. package/src/wirings/persona/validate-personas.ts +0 -137
  449. package/src/wirings/queue/index.ts +0 -29
  450. package/src/wirings/queue/queue-identity.test.ts +0 -454
  451. package/src/wirings/queue/queue-identity.ts +0 -176
  452. package/src/wirings/queue/queue-runner.test.ts +0 -705
  453. package/src/wirings/queue/queue-runner.ts +0 -181
  454. package/src/wirings/queue/queue.types.ts +0 -161
  455. package/src/wirings/queue/register-queue-helper.ts +0 -46
  456. package/src/wirings/queue/signed-queue-service.ts +0 -60
  457. package/src/wirings/queue/validate-worker-config.test.ts +0 -108
  458. package/src/wirings/queue/validate-worker-config.ts +0 -90
  459. package/src/wirings/role/define-system-role.ts +0 -33
  460. package/src/wirings/role/index.ts +0 -13
  461. package/src/wirings/role/role.test.ts +0 -104
  462. package/src/wirings/role/role.types.ts +0 -47
  463. package/src/wirings/role/validate-role-definitions.ts +0 -93
  464. package/src/wirings/rpc/index.ts +0 -8
  465. package/src/wirings/rpc/rpc-runner.test.ts +0 -1130
  466. package/src/wirings/rpc/rpc-runner.ts +0 -569
  467. package/src/wirings/rpc/rpc-types.ts +0 -87
  468. package/src/wirings/scheduler/index.ts +0 -11
  469. package/src/wirings/scheduler/log-schedulers.ts +0 -16
  470. package/src/wirings/scheduler/scheduler-runner.test.ts +0 -835
  471. package/src/wirings/scheduler/scheduler-runner.ts +0 -138
  472. package/src/wirings/scheduler/scheduler.types.ts +0 -42
  473. package/src/wirings/scope/define-scope.ts +0 -33
  474. package/src/wirings/scope/index.ts +0 -15
  475. package/src/wirings/scope/scope.test.ts +0 -159
  476. package/src/wirings/scope/scope.types.ts +0 -42
  477. package/src/wirings/scope/validate-scope-definitions.ts +0 -107
  478. package/src/wirings/secret/index.ts +0 -9
  479. package/src/wirings/secret/secret.types.ts +0 -70
  480. package/src/wirings/secret/validate-secret-definitions.test.ts +0 -232
  481. package/src/wirings/secret/validate-secret-definitions.ts +0 -88
  482. package/src/wirings/trigger/index.ts +0 -9
  483. package/src/wirings/trigger/pikku-trigger-service.ts +0 -107
  484. package/src/wirings/trigger/trigger-runner.test.ts +0 -78
  485. package/src/wirings/trigger/trigger-runner.ts +0 -113
  486. package/src/wirings/trigger/trigger.types.ts +0 -100
  487. package/src/wirings/variable/index.ts +0 -8
  488. package/src/wirings/variable/validate-variable-definitions.test.ts +0 -115
  489. package/src/wirings/variable/validate-variable-definitions.ts +0 -71
  490. package/src/wirings/variable/variable.types.ts +0 -40
  491. package/src/wirings/virtual-user/index.ts +0 -107
  492. package/src/wirings/virtual-user/prepare-virtual-user-run.test.ts +0 -115
  493. package/src/wirings/virtual-user/prepare-virtual-user-run.ts +0 -95
  494. package/src/wirings/virtual-user/run-virtual-user.test.ts +0 -774
  495. package/src/wirings/virtual-user/run-virtual-user.ts +0 -684
  496. package/src/wirings/virtual-user/virtual-user-agents.test.ts +0 -72
  497. package/src/wirings/virtual-user/virtual-user-agents.ts +0 -62
  498. package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +0 -215
  499. package/src/wirings/virtual-user/virtual-user-catalogue.ts +0 -184
  500. package/src/wirings/virtual-user/virtual-user-derive.test.ts +0 -426
  501. package/src/wirings/virtual-user/virtual-user-derive.ts +0 -161
  502. package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +0 -68
  503. package/src/wirings/virtual-user/virtual-user-dispositions.ts +0 -210
  504. package/src/wirings/virtual-user/virtual-user-intents.test.ts +0 -218
  505. package/src/wirings/virtual-user/virtual-user-intents.ts +0 -185
  506. package/src/wirings/virtual-user/virtual-user-rng.test.ts +0 -72
  507. package/src/wirings/virtual-user/virtual-user-rng.ts +0 -50
  508. package/src/wirings/virtual-user/virtual-user-run-store.ts +0 -131
  509. package/src/wirings/virtual-user/virtual-user-scaffold.test.ts +0 -854
  510. package/src/wirings/virtual-user/virtual-user-scaffold.ts +0 -664
  511. package/src/wirings/virtual-user/virtual-user-schedule-store.ts +0 -93
  512. package/src/wirings/virtual-user/virtual-user-schedule.test.ts +0 -280
  513. package/src/wirings/virtual-user/virtual-user-schedule.ts +0 -156
  514. package/src/wirings/virtual-user/virtual-user-target.ts +0 -47
  515. package/src/wirings/virtual-user/virtual-user.types.ts +0 -215
  516. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +0 -709
  517. package/src/wirings/workflow/dsl/workflow-runner.ts +0 -25
  518. package/src/wirings/workflow/feature.test.ts +0 -131
  519. package/src/wirings/workflow/feature.ts +0 -59
  520. package/src/wirings/workflow/graph/graph-foreach-queued.test.ts +0 -569
  521. package/src/wirings/workflow/graph/graph-foreach.test.ts +0 -626
  522. package/src/wirings/workflow/graph/graph-node.ts +0 -115
  523. package/src/wirings/workflow/graph/graph-runner.test.ts +0 -1049
  524. package/src/wirings/workflow/graph/graph-runner.ts +0 -1376
  525. package/src/wirings/workflow/graph/graph-validation.test.ts +0 -27
  526. package/src/wirings/workflow/graph/graph-validation.ts +0 -41
  527. package/src/wirings/workflow/graph/template.test.ts +0 -49
  528. package/src/wirings/workflow/graph/template.ts +0 -42
  529. package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -39
  530. package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -75
  531. package/src/wirings/workflow/index.ts +0 -107
  532. package/src/wirings/workflow/pikku-scenario-service.ts +0 -1013
  533. package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -963
  534. package/src/wirings/workflow/pikku-workflow-service.ts +0 -1993
  535. package/src/wirings/workflow/run-timeline.test.ts +0 -199
  536. package/src/wirings/workflow/run-timeline.ts +0 -185
  537. package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -107
  538. package/src/wirings/workflow/scenario-cookie-jar.ts +0 -57
  539. package/src/wirings/workflow/scenario-expectations.test.ts +0 -238
  540. package/src/wirings/workflow/scenario-hooks.test.ts +0 -259
  541. package/src/wirings/workflow/scenario-poll.test.ts +0 -64
  542. package/src/wirings/workflow/scenario-poll.ts +0 -27
  543. package/src/wirings/workflow/scenario-prose.test.ts +0 -275
  544. package/src/wirings/workflow/scenario-prose.ts +0 -86
  545. package/src/wirings/workflow/scenario-run.types.ts +0 -193
  546. package/src/wirings/workflow/scenario-service.test.ts +0 -147
  547. package/src/wirings/workflow/scenario-step-guards.ts +0 -23
  548. package/src/wirings/workflow/scenario-step.test.ts +0 -800
  549. package/src/wirings/workflow/scenario-step.types.ts +0 -262
  550. package/src/wirings/workflow/scenario-surface.test.ts +0 -146
  551. package/src/wirings/workflow/scenario-surface.ts +0 -71
  552. package/src/wirings/workflow/scenario.types.ts +0 -63
  553. package/src/wirings/workflow/workflow-approval-audit.ts +0 -47
  554. package/src/wirings/workflow/workflow-approval-policy.test.ts +0 -594
  555. package/src/wirings/workflow/workflow-approval-policy.ts +0 -68
  556. package/src/wirings/workflow/workflow-approval.ts +0 -290
  557. package/src/wirings/workflow/workflow-child-run-session.test.ts +0 -168
  558. package/src/wirings/workflow/workflow-constants.ts +0 -66
  559. package/src/wirings/workflow/workflow-dispatch-durability.test.ts +0 -116
  560. package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -55
  561. package/src/wirings/workflow/workflow-dispatch-relay.test.ts +0 -128
  562. package/src/wirings/workflow/workflow-errors.ts +0 -132
  563. package/src/wirings/workflow/workflow-inline-authority.test.ts +0 -175
  564. package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -51
  565. package/src/wirings/workflow/workflow-invocation-id.ts +0 -28
  566. package/src/wirings/workflow/workflow-meta-resolver.ts +0 -45
  567. package/src/wirings/workflow/workflow-mirror.test.ts +0 -171
  568. package/src/wirings/workflow/workflow-missing-meta.test.ts +0 -92
  569. package/src/wirings/workflow/workflow-on-error.test.ts +0 -145
  570. package/src/wirings/workflow/workflow-queue-routing.ts +0 -129
  571. package/src/wirings/workflow/workflow-queue-wiring.ts +0 -149
  572. package/src/wirings/workflow/workflow-queue-workers.test.ts +0 -131
  573. package/src/wirings/workflow/workflow-queue-workers.ts +0 -66
  574. package/src/wirings/workflow/workflow-recovery.ts +0 -192
  575. package/src/wirings/workflow/workflow-replay-snapshot.test.ts +0 -140
  576. package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -113
  577. package/src/wirings/workflow/workflow-run-authority.test.ts +0 -212
  578. package/src/wirings/workflow/workflow-run-context.test.ts +0 -172
  579. package/src/wirings/workflow/workflow-run-engine.types.ts +0 -92
  580. package/src/wirings/workflow/workflow-run-ownership.ts +0 -37
  581. package/src/wirings/workflow/workflow-run-polling.test.ts +0 -127
  582. package/src/wirings/workflow/workflow-stalled-recovery.test.ts +0 -152
  583. package/src/wirings/workflow/workflow-status-stream.test.ts +0 -354
  584. package/src/wirings/workflow/workflow-status-stream.ts +0 -144
  585. package/src/wirings/workflow/workflow-step-claim.ts +0 -46
  586. package/src/wirings/workflow/workflow-step-ordinal.test.ts +0 -94
  587. package/src/wirings/workflow/workflow-step-session.test.ts +0 -87
  588. package/src/wirings/workflow/workflow-suspend.ts +0 -61
  589. package/src/wirings/workflow/workflow-terminal-run-guard.test.ts +0 -105
  590. package/src/wirings/workflow/workflow.types.ts +0 -268
  591. package/src/wirings-stay-decoupled.test.ts +0 -130
  592. package/tsconfig.json +0 -14
  593. package/tsconfig.tsbuildinfo +0 -1
  594. package/tsconfig.type-tests.json +0 -15
@@ -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
+ };
@@ -3,7 +3,6 @@ export { reloadGeneratedMeta, reconcileAddonRegistry } from './reload-meta.js';
3
3
  interface PikkuDevReloaderOptions {
4
4
  srcDirectories: string[];
5
5
  logger: Logger;
6
- pikkuDir?: string;
7
6
  }
8
7
  export interface PikkuDevReloaderHandle {
9
8
  close: () => void;
@@ -1,5 +1,4 @@
1
1
  import { watch } from 'node:fs';
2
- import { stat } from 'node:fs/promises';
3
2
  import { basename, join, resolve, relative } from 'node:path';
4
3
  import { pikkuState } from '../pikku-state.js';
5
4
  import { clearMiddlewareCache } from '../middleware-runner.js';
@@ -14,24 +13,6 @@ const isFunctionConfig = (value) => {
14
13
  'func' in value &&
15
14
  typeof value.func === 'function');
16
15
  };
17
- const findCompiledFile = async (tsFile, srcDir, pikkuDir) => {
18
- const rel = relative(srcDir, tsFile).replace(/\.ts$/, '.js');
19
- const candidates = [
20
- join(pikkuDir, 'dist', rel),
21
- join(srcDir, rel),
22
- tsFile.replace(/\.ts$/, '.js'),
23
- ];
24
- for (const candidate of candidates) {
25
- try {
26
- await stat(candidate);
27
- return candidate;
28
- }
29
- catch {
30
- // not found, try next
31
- }
32
- }
33
- return null;
34
- };
35
16
  const isWatchedTsFile = (filename) => {
36
17
  return (filename.endsWith('.ts') &&
37
18
  !filename.endsWith('.test.ts') &&
@@ -55,9 +36,8 @@ const reloadFailureReason = (error) => {
55
36
  return ` ${error.stack ?? error.message}`;
56
37
  };
57
38
  export async function pikkuDevReloader(options) {
58
- const { srcDirectories, logger, pikkuDir = '.pikku' } = options;
39
+ const { srcDirectories, logger } = options;
59
40
  const absSrcDirs = srcDirectories.map((d) => resolve(d));
60
- const absPikkuDir = resolve(pikkuDir);
61
41
  const watchers = [];
62
42
  const functionsMap = pikkuState(null, 'function', 'functions');
63
43
  const moduleRunner = createModuleRunner();
@@ -68,15 +48,14 @@ export async function pikkuDevReloader(options) {
68
48
  const srcDir = absSrcDirs.find((d) => changedTsFile.startsWith(d));
69
49
  if (!srcDir)
70
50
  return;
71
- const compiledFile = await findCompiledFile(changedTsFile, srcDir, absPikkuDir);
72
- const importPath = compiledFile ?? changedTsFile;
73
- const result = await moduleRunner.run(importPath);
51
+ // knowledge: decisions/internals/hot-reload-reads-the-changed-source-never-a-compiled-copy.md
52
+ const result = await moduleRunner.run(changedTsFile);
74
53
  if (!result.ok) {
75
54
  // Keeping the old code leaves the process disagreeing with the file on
76
55
  // disk, and the only symptom is stale output from a function that looks
77
56
  // correct in the editor — so the reason has to be printed here, where it
78
57
  // is still known, rather than left for the developer to reconstruct.
79
- logger.error(`Failed to import: ${relative(process.cwd(), importPath)} (keeping old code)\n` +
58
+ logger.error(`Failed to import: ${relative(process.cwd(), changedTsFile)} (keeping old code)\n` +
80
59
  reloadFailureReason(result.error));
81
60
  return;
82
61
  }
@@ -1,6 +1,6 @@
1
- import { readFile } from 'node:fs/promises';
1
+ import { readFileSync, statSync } from 'node:fs';
2
2
  import { createRequire } from 'node:module';
3
- import { dirname, resolve } from 'node:path';
3
+ import { dirname, isAbsolute, join, resolve, sep } from 'node:path';
4
4
  import { pathToFileURL } from 'node:url';
5
5
  import { compileFunction } from 'node:vm';
6
6
  let transformSync;
@@ -18,7 +18,78 @@ const loadTransform = async () => {
18
18
  * is correct, and no amount of re-reading it will reveal that the reloader —
19
19
  * not the file — is what cannot cope. */
20
20
  export const isTopLevelAwaitLimitation = (error) => /top-level await/i.test(error.message);
21
+ const TYPESCRIPT_FILE = /\.(m|c)?tsx?$/;
22
+ const isFile = (path) => {
23
+ try {
24
+ return statSync(path).isFile();
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ };
30
+ /** Where a relative specifier's TypeScript source lives, for the specifiers a
31
+ * plain `require` cannot resolve. A TS project writes `./sibling.js` for a file
32
+ * that only exists as `./sibling.ts`, and a reloaded module is the source, so
33
+ * every one of its relative imports arrives in that unresolvable form. */
34
+ const findTypeScriptSource = (specifier, importerDir) => {
35
+ if (!specifier.startsWith('.') && !isAbsolute(specifier))
36
+ return undefined;
37
+ const base = resolve(importerDir, specifier);
38
+ const withoutJs = base.replace(/\.(m|c)?js$/, '');
39
+ const candidates = [
40
+ `${withoutJs}.ts`,
41
+ `${withoutJs}.tsx`,
42
+ `${withoutJs}.mts`,
43
+ `${withoutJs}.cts`,
44
+ join(base, 'index.ts'),
45
+ join(base, 'index.tsx'),
46
+ ];
47
+ return candidates.find(isFile);
48
+ };
49
+ const isProjectTypeScript = (path) => TYPESCRIPT_FILE.test(path) && !path.includes(`${sep}node_modules${sep}`);
50
+ /** JSX is a syntax esbuild only parses when asked, so a `.tsx` helper handed to
51
+ * the `ts` loader fails to compile and the file importing it keeps its old
52
+ * code. */
53
+ const loaderFor = (path) => {
54
+ if (path.endsWith('.tsx'))
55
+ return 'tsx';
56
+ if (TYPESCRIPT_FILE.test(path))
57
+ return 'ts';
58
+ if (path.endsWith('.jsx'))
59
+ return 'jsx';
60
+ return 'js';
61
+ };
62
+ const evaluateModule = (absPath, cache) => {
63
+ const cached = cache.get(absPath);
64
+ if (cached)
65
+ return cached;
66
+ const source = readFileSync(absPath, 'utf-8');
67
+ const { code } = transformSync(source, {
68
+ loader: loaderFor(absPath),
69
+ format: 'cjs',
70
+ sourcefile: absPath,
71
+ });
72
+ const fn = compileFunction(code, ['require', 'exports', 'module', '__filename', '__dirname'], { filename: absPath });
73
+ const moduleObj = { exports: {} };
74
+ // Seeded before evaluation so an import cycle terminates the way CJS's own
75
+ // cache makes it terminate, and overwritten after because esbuild's `cjs`
76
+ // emit assigns a fresh `module.exports` on the way out.
77
+ cache.set(absPath, moduleObj.exports);
78
+ fn(createRequireForFile(absPath, cache), moduleObj.exports, moduleObj, absPath, dirname(absPath));
79
+ cache.set(absPath, moduleObj.exports);
80
+ return moduleObj.exports;
81
+ };
21
82
  /** The `require` a reloaded module is run with.
83
+ *
84
+ * Resolution goes through the host first, so every package binds to the
85
+ * instance the rest of the process holds and a user file's `wire*` side
86
+ * effect mutates live state rather than a private copy.
87
+ *
88
+ * A resolved TypeScript file outside `node_modules` is the project's own
89
+ * source, and is compiled here instead of handed back to the host: both hosts
90
+ * cache what they load, so a helper edited alongside the function importing it
91
+ * would otherwise keep answering with the version loaded at startup — the same
92
+ * stale-code-under-a-successful-reload the reloader exists to avoid.
22
93
  *
23
94
  * On Bun, `createRequire`'s referrer stops being honoured somewhere in a
24
95
  * long-running process: the same relative specifier that resolves in a fresh
@@ -27,47 +98,55 @@ export const isTopLevelAwaitLimitation = (error) => /top-level await/i.test(erro
27
98
  * is left serving the previous code from an edit that looked applied. Bun's
28
99
  * own resolver still answers correctly when handed the importer's directory
29
100
  * outright, so the specifier is resolved to an absolute path first and the
30
- * referrer never has to survive the trip. Anything Bun's resolver declines —
31
- * builtins among them — falls through to `require` unchanged.
101
+ * referrer never has to survive the trip.
102
+ *
103
+ * What neither host resolves is a relative `./sibling.js` whose only file on
104
+ * disk is `./sibling.ts` — node's `require` has no `.js → .ts` rewrite, and
105
+ * the reloader hands it source. Those, and only those, are compiled here.
32
106
  */
33
- const createRequireForFile = (absPath) => {
107
+ const createRequireForFile = (absPath, cache) => {
34
108
  const base = createRequire(pathToFileURL(absPath));
35
109
  const bun = globalThis.Bun;
36
- if (!bun)
37
- return base;
38
110
  const importerDir = dirname(absPath);
39
- const resolveThroughBun = (specifier) => {
111
+ const resolveThroughHost = (specifier) => {
112
+ if (bun) {
113
+ try {
114
+ return bun.resolveSync(specifier, importerDir);
115
+ }
116
+ catch {
117
+ return undefined;
118
+ }
119
+ }
40
120
  try {
41
- return bun.resolveSync(specifier, importerDir);
121
+ return base.resolve(specifier);
42
122
  }
43
123
  catch {
44
- return specifier;
124
+ return undefined;
45
125
  }
46
126
  };
47
127
  // Only resolution is delegated; the require itself stays outside the guard so
48
128
  // a module that throws while evaluating reports its own error rather than
49
129
  // being retried under a second specifier.
50
- const bunRequire = ((specifier) => base(resolveThroughBun(specifier)));
51
- return Object.assign(bunRequire, base);
130
+ const loadingRequire = ((specifier) => {
131
+ const resolved = resolveThroughHost(specifier) ??
132
+ findTypeScriptSource(specifier, importerDir);
133
+ if (!resolved)
134
+ return base(specifier);
135
+ if (isProjectTypeScript(resolved))
136
+ return evaluateModule(resolved, cache);
137
+ return base(resolved);
138
+ });
139
+ return Object.assign(loadingRequire, base);
52
140
  };
53
141
  export const createModuleRunner = () => {
54
142
  const registry = new Map();
55
143
  const run = async (filePath) => {
56
144
  const absPath = resolve(filePath);
57
145
  try {
58
- const transform = await loadTransform();
59
- const source = await readFile(absPath, 'utf-8');
60
- const { code } = transform(source, {
61
- loader: absPath.endsWith('.ts') ? 'ts' : 'js',
62
- format: 'cjs',
63
- sourcefile: absPath,
64
- });
65
- const fn = compileFunction(code, ['require', 'exports', 'module', '__filename', '__dirname'], { filename: absPath });
66
- const require = createRequireForFile(absPath);
67
- const moduleObj = { exports: {} };
68
- fn(require, moduleObj.exports, moduleObj, absPath, dirname(absPath));
69
- registry.set(absPath, moduleObj.exports);
70
- return { ok: true, exports: moduleObj.exports };
146
+ await loadTransform();
147
+ const exports = evaluateModule(absPath, new Map());
148
+ registry.set(absPath, exports);
149
+ return { ok: true, exports };
71
150
  }
72
151
  catch (thrown) {
73
152
  // A bad edit, or the one known limitation: a file using top-level
@@ -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