@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
@@ -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
  };
@@ -0,0 +1,100 @@
1
+ import type { DeclaredFlag, FlagConfigSnapshot, FlagSubject } from '../wirings/flag/flag.types.js';
2
+ /**
3
+ * The read half of feature flags, and the only half on the request path.
4
+ *
5
+ * Split from {@link FeatureFlagStore} so a third-party provider — PostHog,
6
+ * Unleash, LaunchDarkly — can back flags without pretending to implement an
7
+ * administration surface it does not own. Their UI is the operator surface;
8
+ * writing flags back through their management API means two systems own the
9
+ * same rows, and an implementation that throws from six methods is a console
10
+ * full of buttons that 500.
11
+ */
12
+ export interface FeatureFlagSource {
13
+ /**
14
+ * The global config half: one small blob shared by every user, never
15
+ * per-user data.
16
+ *
17
+ * Implementations MUST cache this in isolate memory and MUST fall back to the
18
+ * compiled declaration when the backing store cannot be read — never to a
19
+ * database query, which would put I/O on the request path this design exists
20
+ * to keep clear. See `compiledFallbackSnapshot`.
21
+ */
22
+ snapshot(): Promise<FlagConfigSnapshot>;
23
+ /**
24
+ * The flags the running app declares, where the implementation was told.
25
+ *
26
+ * Optional because it is not on the request path: resolution reads the
27
+ * snapshot, and a declaration absent from it already fails open. It exists so
28
+ * an administration surface can report the drift a provider cannot fix for
29
+ * itself — a flag declared in code that nobody created in PostHog resolves as
30
+ * on for everyone, and that is worth seeing before production finds it.
31
+ */
32
+ declaredFlags?(): readonly DeclaredFlag[];
33
+ }
34
+ /** One flag as an administration surface sees it. */
35
+ export type FlagRow = DeclaredFlag & {
36
+ enabled: boolean;
37
+ rolloutPercent: number | null;
38
+ /**
39
+ * False when the flag's declaration has been removed from code but its row
40
+ * survives: still switchable, no longer offered, awaiting `pikku flags
41
+ * prune`. Never a silent revoke.
42
+ */
43
+ declared: boolean;
44
+ };
45
+ /**
46
+ * One override, as an administration surface sees it.
47
+ *
48
+ * Carries the subject's kind, which resolution does not: by the time a flag is
49
+ * resolved the organization and the user are one opaque string, and only a
50
+ * screen rendering the row needs to say which it was.
51
+ */
52
+ export type FlagOverrideRow = {
53
+ /** The organization or user this override pins, as an opaque id. */
54
+ subjectId: string;
55
+ /** Which of the two `subjectId` is — `organization` or `user`. */
56
+ subjectKind: string;
57
+ /** Whether the subject is pinned on or pinned off, past the rollout either way. */
58
+ enabled: boolean;
59
+ /** The user who wrote the override, where the store recorded one. */
60
+ grantedBy?: string;
61
+ /** When it was written, as an ISO-8601 instant, where the store recorded one. */
62
+ grantedAt?: string;
63
+ };
64
+ /**
65
+ * The write half: the declaration lifecycle plus the operator controls.
66
+ *
67
+ * Implemented by a store pikku owns. Absent when flags come from a provider,
68
+ * which is what makes the console's Flags tab read-only rather than lying.
69
+ */
70
+ export interface FeatureFlagStore extends FeatureFlagSource {
71
+ /**
72
+ * Registers the declared vocabulary. Additive on the same terms as
73
+ * `syncScopes`: a removed declaration leaves the row marked `declared: false`
74
+ * rather than deleting an operator's switch on deploy.
75
+ *
76
+ * A flag's description and `anyOf` *are* re-synced, because that is the
77
+ * declaration's whole content — editing it is how you change what the flag
78
+ * means, and the deploy is when it takes effect. `enabled`, the rollout and
79
+ * every override are the operator's, and are never touched.
80
+ */
81
+ syncFlags(flags: DeclaredFlag[]): Promise<void>;
82
+ listFlags(): Promise<FlagRow[]>;
83
+ /**
84
+ * One flag's overrides, in full.
85
+ *
86
+ * Not folded into {@link listFlags}: the overrides are unbounded per flag
87
+ * while the list is one row each, and a screen that reads every override of
88
+ * every flag to render a board would grow with the wrong number.
89
+ */
90
+ listOverrides(key: string): Promise<FlagOverrideRow[]>;
91
+ setEnabled(key: string, enabled: boolean, actor?: string, note?: string): Promise<void>;
92
+ /** `percent` is 0–100, or null to remove the rollout constraint. */
93
+ setRollout(key: string, percent: number | null, actor?: string): Promise<void>;
94
+ setOverride(key: string, subject: FlagSubject, enabled: boolean, actor?: string): Promise<void>;
95
+ clearOverride(key: string, subject: FlagSubject): Promise<void>;
96
+ /** Flags in the store with no declaration left in code; powers `pikku flags audit`. */
97
+ findStaleFlags(): Promise<string[]>;
98
+ /** Removes undeclared flags and their overrides. */
99
+ pruneFlags(): Promise<string[]>;
100
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -47,6 +47,7 @@ export type { VariableMeta } from './typed-variables-service.js';
47
47
  export type { MetaService } from './meta-service.js';
48
48
  export type { SessionStore } from './session-store.js';
49
49
  export type { ScopeService, Role } from './scope-service.js';
50
+ export type { FeatureFlagSource, FeatureFlagStore, FlagRow, FlagOverrideRow, } from './feature-flag-service.js';
50
51
  export type { IsSystemRole } from './system-role-guard.js';
51
52
  export { NoopAuditService, createInvocationAudit } from './audit-service.js';
52
53
  export type { AuditConfig, AuditDurability, AuditEvent, AuditEventBatch, AuditLog, AuditService, AuditUserIdentity, ResolvedAuditConfig, } from './audit-service.js';
@@ -9,6 +9,8 @@ import type { WorkflowsMeta } from '../wirings/workflow/workflow.types.js';
9
9
  import type { FeaturesMeta } from '../wirings/workflow/scenario.types.js';
10
10
  import type { ResolvedPersona } from './personas-service.js';
11
11
  import type { SystemRoleDefinitionsMeta } from '../wirings/role/role.types.js';
12
+ import type { FeatureFlagDefinitionsMeta } from '../wirings/flag/flag.types.js';
13
+ import type { AnalyticsEventsMeta } from '../analytics/analytics.types.js';
12
14
  import type { TriggerMeta, TriggerSourceMeta } from '../wirings/trigger/trigger.types.js';
13
15
  import type { SecretDefinitionsMeta } from '../wirings/secret/secret.types.js';
14
16
  import type { CredentialDefinitionsMeta } from '../wirings/credential/credential.types.js';
@@ -152,6 +154,16 @@ export interface MetaService {
152
154
  * seed granted from rather than a second one.
153
155
  */
154
156
  getSystemRolesMeta(): Promise<SystemRoleDefinitionsMeta>;
157
+ /**
158
+ * The flags declared with `defineFeatureFlags`, keyed by name.
159
+ *
160
+ * The declaration half only. What an operator set — the switch, the rollout,
161
+ * the overrides — lives in the flag store and is read through the admin
162
+ * surface, because it changes without a deploy and this does not.
163
+ */
164
+ getFeatureFlagsMeta(): Promise<FeatureFlagDefinitionsMeta>;
165
+ /** The events declared with `defineAnalyticsEvents`, keyed by name. */
166
+ getAnalyticsMeta(): Promise<AnalyticsEventsMeta>;
155
167
  getFeaturesMeta(): Promise<FeaturesMeta>;
156
168
  getTriggerMeta(): Promise<TriggerMeta>;
157
169
  getTriggerSourceMeta(): Promise<TriggerSourceMeta>;
@@ -182,6 +194,8 @@ export declare class LocalMetaService implements MetaService {
182
194
  private workflowMetaCache;
183
195
  private personasMetaCache;
184
196
  private systemRolesMetaCache;
197
+ private featureFlagsMetaCache;
198
+ private analyticsMetaCache;
185
199
  private featuresMetaCache;
186
200
  private triggerMetaCache;
187
201
  private triggerSourceMetaCache;
@@ -216,6 +230,8 @@ export declare class LocalMetaService implements MetaService {
216
230
  getWorkflowMeta(): Promise<WorkflowsMeta>;
217
231
  getPersonasMeta(): Promise<Record<string, ResolvedPersona>>;
218
232
  getSystemRolesMeta(): Promise<SystemRoleDefinitionsMeta>;
233
+ getFeatureFlagsMeta(): Promise<FeatureFlagDefinitionsMeta>;
234
+ getAnalyticsMeta(): Promise<AnalyticsEventsMeta>;
219
235
  getFeaturesMeta(): Promise<FeaturesMeta>;
220
236
  getTriggerMeta(): Promise<TriggerMeta>;
221
237
  getTriggerSourceMeta(): Promise<TriggerSourceMeta>;
@@ -15,6 +15,8 @@ export class LocalMetaService {
15
15
  workflowMetaCache = null;
16
16
  personasMetaCache = null;
17
17
  systemRolesMetaCache = null;
18
+ featureFlagsMetaCache = null;
19
+ analyticsMetaCache = null;
18
20
  featuresMetaCache = null;
19
21
  triggerMetaCache = null;
20
22
  triggerSourceMetaCache = null;
@@ -111,6 +113,8 @@ export class LocalMetaService {
111
113
  this.workflowMetaCache = null;
112
114
  this.personasMetaCache = null;
113
115
  this.systemRolesMetaCache = null;
116
+ this.featureFlagsMetaCache = null;
117
+ this.analyticsMetaCache = null;
114
118
  this.featuresMetaCache = null;
115
119
  this.triggerMetaCache = null;
116
120
  this.triggerSourceMetaCache = null;
@@ -270,6 +274,21 @@ export class LocalMetaService {
270
274
  this.systemRolesMetaCache = content ? JSON.parse(content) : {};
271
275
  return this.systemRolesMetaCache;
272
276
  }
277
+ async getFeatureFlagsMeta() {
278
+ if (this.featureFlagsMetaCache)
279
+ return this.featureFlagsMetaCache;
280
+ // Beside the scopes their `anyOf` names, which is where codegen writes it.
281
+ const content = await this.readFile('scopes/pikku-flags-meta.gen.json');
282
+ this.featureFlagsMetaCache = content ? JSON.parse(content) : {};
283
+ return this.featureFlagsMetaCache;
284
+ }
285
+ async getAnalyticsMeta() {
286
+ if (this.analyticsMetaCache)
287
+ return this.analyticsMetaCache;
288
+ const content = await this.readFile('analytics/pikku-analytics-meta.gen.json');
289
+ this.analyticsMetaCache = content ? JSON.parse(content) : {};
290
+ return this.analyticsMetaCache;
291
+ }
273
292
  async getFeaturesMeta() {
274
293
  if (this.featuresMetaCache)
275
294
  return this.featuresMetaCache;
@@ -92,8 +92,13 @@ export declare abstract class WebhookService {
92
92
  verify(secret: string, signature: string, body: string): boolean;
93
93
  /**
94
94
  * The three methods below are optional capability: the default queue-only
95
- * service keeps no history and throws, and a store-backed implementation
96
- * (e.g. `KyselyWebhookService` in `@pikku/kysely`) overrides them.
95
+ * service keeps no history, and a store-backed implementation (e.g.
96
+ * `KyselyWebhookService` in `@pikku/kysely`) overrides them.
97
+ *
98
+ * Only the write throws. A write that goes nowhere loses the caller's data,
99
+ * so it has to say so; a read of a history nobody keeps is honestly empty,
100
+ * and throwing there turns the console's webhooks page into an error on
101
+ * every app that has not opted into persistence.
97
102
  */
98
103
  recordAttempt(_deliveryId: string, _result: WebhookAttemptResult): Promise<void>;
99
104
  /** Most recent first. */
@@ -14,17 +14,22 @@ export class WebhookService {
14
14
  }
15
15
  /**
16
16
  * The three methods below are optional capability: the default queue-only
17
- * service keeps no history and throws, and a store-backed implementation
18
- * (e.g. `KyselyWebhookService` in `@pikku/kysely`) overrides them.
17
+ * service keeps no history, and a store-backed implementation (e.g.
18
+ * `KyselyWebhookService` in `@pikku/kysely`) overrides them.
19
+ *
20
+ * Only the write throws. A write that goes nowhere loses the caller's data,
21
+ * so it has to say so; a read of a history nobody keeps is honestly empty,
22
+ * and throwing there turns the console's webhooks page into an error on
23
+ * every app that has not opted into persistence.
19
24
  */
20
25
  recordAttempt(_deliveryId, _result) {
21
26
  throw new NotImplementedError('webhook delivery persistence is not configured');
22
27
  }
23
28
  /** Most recent first. */
24
- listDeliveries(_opts) {
25
- throw new NotImplementedError('webhook delivery persistence is not configured');
29
+ async listDeliveries(_opts) {
30
+ return [];
26
31
  }
27
- getDelivery(_deliveryId) {
28
- throw new NotImplementedError('webhook delivery persistence is not configured');
32
+ async getDelivery(_deliveryId) {
33
+ return null;
29
34
  }
30
35
  }
@@ -1,10 +1,10 @@
1
1
  import type { ServiceTestConfig } from '../service-tests.js';
2
2
  /** Conformance suite for `agentRunService`. Runs only when a backend supplies one. */
3
- export declare const defineAgentRunServiceTests: (name: string, agentRunService: NonNullable<ServiceTestConfig["services"]["agentRunService"]>,
3
+ export declare const defineAgentRunServiceTests: (name: string, agentRunService: NonNullable<ServiceTestConfig['services']['agentRunService']>,
4
4
  /**
5
5
  * Thread-ownership is a property of the two services together — the run
6
6
  * service lists what the storage service owns — so that half of the suite
7
7
  * only runs when a backend supplies both. Passed explicitly rather than
8
8
  * closed over, so the dependency is visible in the signature.
9
9
  */
10
- agentStorageService?: ServiceTestConfig["services"]["agentStorageService"]) => void;
10
+ agentStorageService?: ServiceTestConfig['services']['agentStorageService']) => void;
@@ -1,3 +1,3 @@
1
1
  import type { ServiceTestConfig } from '../service-tests.js';
2
2
  /** Conformance suite for `agentStorageService`. Runs only when a backend supplies one. */
3
- export declare const defineAiStorageServiceTests: (name: string, agentStorageService: NonNullable<ServiceTestConfig["services"]["agentStorageService"]>) => void;
3
+ export declare const defineAiStorageServiceTests: (name: string, agentStorageService: NonNullable<ServiceTestConfig['services']['agentStorageService']>) => void;
@@ -1,3 +1,3 @@
1
1
  import type { ServiceTestConfig } from '../service-tests.js';
2
2
  /** Conformance suite for `channelStore`. Runs only when a backend supplies one. */
3
- export declare const defineChannelStoreTests: (name: string, channelStore: NonNullable<ServiceTestConfig["services"]["channelStore"]>) => void;
3
+ export declare const defineChannelStoreTests: (name: string, channelStore: NonNullable<ServiceTestConfig['services']['channelStore']>) => void;
@@ -1,3 +1,3 @@
1
1
  import type { ServiceTestConfig } from '../service-tests.js';
2
2
  /** Conformance suite for `credentialService`. Runs only when a backend supplies one. */
3
- export declare const defineCredentialServiceTests: (name: string, credentialService: NonNullable<ServiceTestConfig["services"]["credentialService"]>) => void;
3
+ export declare const defineCredentialServiceTests: (name: string, credentialService: NonNullable<ServiceTestConfig['services']['credentialService']>) => void;
@@ -1,3 +1,3 @@
1
1
  import type { ServiceTestConfig } from '../service-tests.js';
2
2
  /** Conformance suite for `deploymentService`. Runs only when a backend supplies one. */
3
- export declare const defineDeploymentServiceTests: (name: string, deploymentService: NonNullable<ServiceTestConfig["services"]["deploymentService"]>) => void;
3
+ export declare const defineDeploymentServiceTests: (name: string, deploymentService: NonNullable<ServiceTestConfig['services']['deploymentService']>) => void;
@@ -1,3 +1,3 @@
1
1
  import type { ServiceTestConfig } from '../service-tests.js';
2
2
  /** Conformance suite for `eventHubStore`. Runs only when a backend supplies one. */
3
- export declare const defineEventHubStoreTests: (name: string, eventHubStore: NonNullable<ServiceTestConfig["services"]["eventHubStore"]>) => void;
3
+ export declare const defineEventHubStoreTests: (name: string, eventHubStore: NonNullable<ServiceTestConfig['services']['eventHubStore']>) => void;
@@ -1,3 +1,3 @@
1
1
  import type { ServiceTestConfig } from '../service-tests.js';
2
2
  /** Conformance suite for `secretService`. Runs only when a backend supplies one. */
3
- export declare const defineSecretServiceTests: (name: string, secretService: NonNullable<ServiceTestConfig["services"]["secretService"]>) => void;
3
+ export declare const defineSecretServiceTests: (name: string, secretService: NonNullable<ServiceTestConfig['services']['secretService']>) => void;
@@ -1,3 +1,3 @@
1
1
  import type { ServiceTestConfig } from '../service-tests.js';
2
2
  /** Conformance suite for `sessionStore`. Runs only when a backend supplies one. */
3
- export declare const defineSessionStoreTests: (name: string, sessionStore: NonNullable<ServiceTestConfig["services"]["sessionStore"]>) => void;
3
+ export declare const defineSessionStoreTests: (name: string, sessionStore: NonNullable<ServiceTestConfig['services']['sessionStore']>) => void;
@@ -1,3 +1,3 @@
1
1
  import type { ServiceTestConfig } from '../service-tests.js';
2
2
  /** Conformance suite for `workflowRunService`. Runs only when a backend supplies one. */
3
- export declare const defineWorkflowRunServiceTests: (name: string, workflowRunService: NonNullable<ServiceTestConfig["services"]["workflowRunService"]>) => void;
3
+ export declare const defineWorkflowRunServiceTests: (name: string, workflowRunService: NonNullable<ServiceTestConfig['services']['workflowRunService']>) => void;
@@ -1,3 +1,3 @@
1
1
  import type { ServiceTestConfig } from '../service-tests.js';
2
2
  /** Conformance suite for `workflowService`. Runs only when a backend supplies one. */
3
- export declare const defineWorkflowServiceTests: (name: string, workflowService: NonNullable<ServiceTestConfig["services"]["workflowService"]>) => void;
3
+ export declare const defineWorkflowServiceTests: (name: string, workflowService: NonNullable<ServiceTestConfig['services']['workflowService']>) => void;
@@ -38,7 +38,9 @@ import type { MetaService } from '../services/meta-service.js';
38
38
  import type { CoverageService } from '../services/v8-coverage-service.js';
39
39
  import type { SessionStore } from '../services/session-store.js';
40
40
  import type { ScopeService } from '../services/scope-service.js';
41
+ import type { FeatureFlagSource } from '../services/feature-flag-service.js';
41
42
  import type { AuditDurability, AuditLog, AuditService } from '../services/audit-service.js';
43
+ import type { AnalyticsLog, AnalyticsIdentityResolver, AnalyticsService } from '../analytics/analytics.types.js';
42
44
  export type PikkuWiringTypes = 'http' | 'scheduler' | 'trigger' | 'channel' | 'rpc' | 'queue' | 'mcp' | 'cli' | 'workflow' | 'agent' | 'gateway';
43
45
  /**
44
46
  * Runtime pool tuning for the Postgres adapter. The connection string stays
@@ -145,6 +147,20 @@ export interface CoreSingletonServices<Config extends CoreConfig = CoreConfig> {
145
147
  /** V8 precise-coverage collector (`pikku dev --coverage` only) */
146
148
  coverageService?: CoverageService;
147
149
  audit?: AuditService;
150
+ /** Where product-analytics events go; unset means the logger. */
151
+ analyticsService?: AnalyticsService;
152
+ /**
153
+ * Resolves the browser-originated half of an event's identity — vendor ids
154
+ * and consent — from the wire. Unset means a sink sees only what the session
155
+ * carries, which is enough for a product-analytics tool and not enough for an
156
+ * ad platform.
157
+ */
158
+ analyticsIdentity?: AnalyticsIdentityResolver;
159
+ /**
160
+ * Request-scoped buffer writing into `analyticsService`. Narrow it to the
161
+ * app's own event union in `SingletonServices` to type `record()`.
162
+ */
163
+ analytics?: AnalyticsLog;
148
164
  /**
149
165
  * Request-scoped audit buffer that writes into `audit` (the durable sink).
150
166
  * Returned as a wire service so the runner flushes it via `close()` when the
@@ -158,6 +174,13 @@ export interface CoreSingletonServices<Config extends CoreConfig = CoreConfig> {
158
174
  * never by the function runner.
159
175
  */
160
176
  scopeService?: ScopeService;
177
+ /**
178
+ * The global feature-flag config, read by the function runner to enforce a
179
+ * flag's availability. Inert when absent: a project that declares no flag
180
+ * carries nothing, and a `featureFlag:` with no source registered is a
181
+ * no-op rather than a closed door.
182
+ */
183
+ featureFlags?: FeatureFlagSource;
161
184
  /**
162
185
  * Built once by the factory an auth package registers and injected by the
163
186
  * generated `pikkuServices` wrapper — service factories must not return it
@@ -12,4 +12,4 @@ export type AgentRPCOptions = {
12
12
  * to the runner and stream code it delegates to, instead of a wing of the RPC
13
13
  * primitive.
14
14
  */
15
- export declare const createAgentRPC: (wire: PikkuRawWire, options: AgentRPCOptions) => PikkuRPC["agent"];
15
+ export declare const createAgentRPC: (wire: PikkuRawWire, options: AgentRPCOptions) => PikkuRPC['agent'];
@@ -30,10 +30,10 @@ export declare const toAccumulatedStep: (stepResult: StepResult) => {
30
30
  outputTokens: number;
31
31
  };
32
32
  toolCalls: {
33
- error?: string | undefined;
34
33
  name: string;
35
34
  args: Record<string, unknown>;
36
35
  result: string;
36
+ error?: string | undefined;
37
37
  }[];
38
38
  };
39
39
  type PendingApproval = {
@@ -8,7 +8,7 @@ import { type ScorerInput } from './agent-scorer.types.js';
8
8
  * also strictly best-effort: the client already has its answer, so nothing here
9
9
  * may fail the run.
10
10
  */
11
- export declare const scoreFinishedRun: (run: ScorerInput, services: Pick<CoreSingletonServices, "logger"> & {
11
+ export declare const scoreFinishedRun: (run: ScorerInput, services: Pick<CoreSingletonServices, 'logger'> & {
12
12
  queueService?: {
13
13
  add: (queueName: string, data: unknown) => Promise<any>;
14
14
  };
@@ -6,7 +6,7 @@ export declare const runChannelLifecycleWithMiddleware: ({ channelConfig, meta,
6
6
  channelConfig: CoreChannel<unknown, any>;
7
7
  meta: ChannelMessageMeta;
8
8
  lifecycleConfig: any;
9
- lifecycleType: "connect" | "disconnect";
9
+ lifecycleType: 'connect' | 'disconnect';
10
10
  services: CoreSingletonServices;
11
11
  channel: any;
12
12
  data?: unknown;
@@ -5,10 +5,10 @@ import type { ChannelRPCValidator } from './channel-rpc.types.js';
5
5
  * declared return type — the same one an agent tool or an HTTP response is
6
6
  * checked against.
7
7
  */
8
- export declare const createChannelRPCResultValidator: (singletonServices: Pick<CoreSingletonServices, "logger" | "schema">, packageName?: string | null) => ChannelRPCValidator;
8
+ export declare const createChannelRPCResultValidator: (singletonServices: Pick<CoreSingletonServices, 'logger' | 'schema'>, packageName?: string | null) => ChannelRPCValidator;
9
9
  /**
10
10
  * Checks outbound arguments against the declared input type. Unlike the result
11
11
  * check this is not a boundary — it catches version drift, where a server built
12
12
  * against a newer capability signature calls a client that predates it.
13
13
  */
14
- export declare const createChannelRPCInputValidator: (singletonServices: Pick<CoreSingletonServices, "logger" | "schema">, packageName?: string | null) => ChannelRPCValidator;
14
+ export declare const createChannelRPCInputValidator: (singletonServices: Pick<CoreSingletonServices, 'logger' | 'schema'>, packageName?: string | null) => ChannelRPCValidator;
@@ -1,7 +1,7 @@
1
1
  import type { SessionService } from '../../services/user-session-service.js';
2
2
  import type { ChannelMeta, CoreChannel, RunChannelOptions, RunChannelParams } from './channel.types.js';
3
3
  export declare const wireChannel: <In, Channel extends string, ChannelConnect, ChannelDisconnect, ChannelFunctionMessage>(channel: CoreChannel<In, Channel, ChannelConnect, ChannelDisconnect, ChannelFunctionMessage>) => void;
4
- export declare const openChannel: ({ route, coerceDataFromSchema, request, }: Pick<CoreChannel<unknown, string>, "route"> & RunChannelParams<unknown> & {
4
+ export declare const openChannel: ({ route, coerceDataFromSchema, request, }: Pick<CoreChannel<unknown, string>, 'route'> & RunChannelParams<unknown> & {
5
5
  userSession: SessionService<any>;
6
6
  } & RunChannelOptions) => Promise<{
7
7
  openingData: unknown;