@pikku/core 0.12.107 → 0.12.111
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +344 -0
- package/dist/analytics/analytics.d.ts +6 -0
- package/dist/analytics/analytics.js +58 -0
- package/dist/analytics/analytics.types.d.ts +156 -0
- package/dist/analytics/analytics.types.js +1 -0
- package/dist/analytics/anonymous-analytics-identity.d.ts +23 -0
- package/dist/analytics/anonymous-analytics-identity.js +27 -0
- package/dist/analytics/compose-analytics-identity.d.ts +14 -0
- package/dist/analytics/compose-analytics-identity.js +33 -0
- package/dist/analytics/cookie-analytics-identity.d.ts +24 -0
- package/dist/analytics/cookie-analytics-identity.js +37 -0
- package/dist/analytics/define-analytics-events.d.ts +22 -0
- package/dist/analytics/define-analytics-events.js +9 -0
- package/dist/analytics/fan-out-analytics.d.ts +15 -0
- package/dist/analytics/fan-out-analytics.js +36 -0
- package/dist/analytics/index.d.ts +13 -0
- package/dist/analytics/index.js +8 -0
- package/dist/analytics/logger-analytics-service.d.ts +14 -0
- package/dist/analytics/logger-analytics-service.js +23 -0
- package/dist/analytics/mint-cookie.d.ts +44 -0
- package/dist/analytics/mint-cookie.js +55 -0
- package/dist/errors/errors.d.ts +7 -0
- package/dist/errors/errors.js +17 -0
- package/dist/function/function-meta.types.d.ts +2 -0
- package/dist/function/function-runner.js +29 -0
- package/dist/function/functions.types.d.ts +22 -3
- package/dist/middleware/auth-apikey.d.ts +1 -1
- package/dist/pikku-state.d.ts +1 -1
- package/dist/scopes.d.ts +11 -0
- package/dist/scopes.js +17 -0
- package/dist/services/credential-wire-service.d.ts +1 -1
- package/dist/services/feature-flag-service.d.ts +100 -0
- package/dist/services/feature-flag-service.js +1 -0
- package/dist/services/index.d.ts +1 -0
- package/dist/services/meta-service.d.ts +16 -0
- package/dist/services/meta-service.js +19 -0
- package/dist/services/webhook-service.d.ts +7 -2
- package/dist/services/webhook-service.js +11 -6
- package/dist/testing/service-tests/agent-run-service-tests.d.ts +2 -2
- package/dist/testing/service-tests/agent-storage-service-tests.d.ts +1 -1
- package/dist/testing/service-tests/channel-store-tests.d.ts +1 -1
- package/dist/testing/service-tests/credential-service-tests.d.ts +1 -1
- package/dist/testing/service-tests/deployment-service-tests.d.ts +1 -1
- package/dist/testing/service-tests/event-hub-store-tests.d.ts +1 -1
- package/dist/testing/service-tests/secret-service-tests.d.ts +1 -1
- package/dist/testing/service-tests/session-store-tests.d.ts +1 -1
- package/dist/testing/service-tests/workflow-run-service-tests.d.ts +1 -1
- package/dist/testing/service-tests/workflow-service-tests.d.ts +1 -1
- package/dist/types/core.types.d.ts +23 -0
- package/dist/wirings/agent/agent-rpc.d.ts +1 -1
- package/dist/wirings/agent/agent-turn.d.ts +1 -1
- package/dist/wirings/agent-scorer/agent-scorer-live.d.ts +1 -1
- package/dist/wirings/channel/channel-common.d.ts +1 -1
- package/dist/wirings/channel/channel-rpc-validators.d.ts +2 -2
- package/dist/wirings/channel/channel-runner.d.ts +1 -1
- package/dist/wirings/channel/local/local-channel-runner.d.ts +1 -1
- package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +1 -1
- package/dist/wirings/cli/channel/cli-approval.d.ts +2 -2
- package/dist/wirings/flag/assert-feature-available.d.ts +15 -0
- package/dist/wirings/flag/assert-feature-available.js +23 -0
- package/dist/wirings/flag/cached-flag-source.d.ts +73 -0
- package/dist/wirings/flag/cached-flag-source.js +96 -0
- package/dist/wirings/flag/define-feature-flags.d.ts +33 -0
- package/dist/wirings/flag/define-feature-flags.js +32 -0
- package/dist/wirings/flag/flag.types.d.ts +97 -0
- package/dist/wirings/flag/flag.types.js +1 -0
- package/dist/wirings/flag/index.d.ts +7 -0
- package/dist/wirings/flag/index.js +5 -0
- package/dist/wirings/flag/resolve-flag.d.ts +52 -0
- package/dist/wirings/flag/resolve-flag.js +90 -0
- package/dist/wirings/flag/validate-flag-definitions.d.ts +26 -0
- package/dist/wirings/flag/validate-flag-definitions.js +103 -0
- package/dist/wirings/virtual-user/virtual-user-scaffold.d.ts +8 -8
- package/dist/wirings/virtual-user/virtual-user-schedule.d.ts +1 -1
- package/dist/wirings/workflow/workflow-queue-routing.d.ts +1 -1
- package/package.json +11 -5
- package/run-tests.sh +17 -9
- package/src/public-surface.json +26 -0
- package/src/agent-naming.test.ts +0 -68
- package/src/api-report.test.ts +0 -138
- package/src/app-alias-surface.test.ts +0 -179
- package/src/app-leaf-surface.test.ts +0 -222
- package/src/bootstrap-compat/root.ts +0 -20
- package/src/classification/column-form.test.ts +0 -97
- package/src/classification/column-form.ts +0 -55
- package/src/classification/data-classification.ts +0 -73
- package/src/classification/index.ts +0 -40
- package/src/classification/key-ids.ts +0 -2
- package/src/classification/secret-value.test.ts +0 -204
- package/src/classification/secret-value.ts +0 -106
- package/src/crypto-utils.test.ts +0 -668
- package/src/crypto-utils.ts +0 -460
- package/src/dev/hot-reload.test.ts +0 -587
- package/src/dev/hot-reload.ts +0 -225
- package/src/dev/module-runner.test.ts +0 -235
- package/src/dev/module-runner.ts +0 -138
- package/src/dev/reload-meta.test.ts +0 -183
- package/src/dev/reload-meta.ts +0 -144
- package/src/ecosystem-tier-removed.test.ts +0 -72
- package/src/env.ts +0 -1
- package/src/errors/error-handler.ts +0 -77
- package/src/errors/error.test.ts +0 -229
- package/src/errors/errors.ts +0 -393
- package/src/errors/index.ts +0 -11
- package/src/errors/serialized-error.ts +0 -12
- package/src/factory-functions.test.ts +0 -111
- package/src/function/abort-scope.test.ts +0 -97
- package/src/function/abort-scope.ts +0 -80
- package/src/function/function-meta.types.ts +0 -151
- package/src/function/function-runner.test.ts +0 -1619
- package/src/function/function-runner.ts +0 -499
- package/src/function/functions.types.ts +0 -319
- package/src/function/index.ts +0 -40
- package/src/function/list.types.test.ts +0 -100
- package/src/function/list.types.ts +0 -69
- package/src/function/pikku-request.test.ts +0 -35
- package/src/function/pikku-request.ts +0 -17
- package/src/gopass-secrets-removed.test.ts +0 -51
- package/src/handle-error.test.ts +0 -532
- package/src/handle-error.ts +0 -64
- package/src/middleware/auth-apikey.test.ts +0 -362
- package/src/middleware/auth-apikey.ts +0 -39
- package/src/middleware/auth-bearer.test.ts +0 -566
- package/src/middleware/auth-bearer.ts +0 -83
- package/src/middleware/auth-cookie.test.ts +0 -572
- package/src/middleware/auth-cookie.ts +0 -107
- package/src/middleware/cors.test.ts +0 -579
- package/src/middleware/cors.ts +0 -103
- package/src/middleware/index.ts +0 -30
- package/src/middleware/middleware-factories.ts +0 -76
- package/src/middleware/middleware.types.ts +0 -61
- package/src/middleware/remote-auth.test.ts +0 -547
- package/src/middleware/remote-auth.ts +0 -95
- package/src/middleware/remote-jobs-secret.ts +0 -35
- package/src/middleware/require-origin.test.ts +0 -115
- package/src/middleware/require-origin.ts +0 -79
- package/src/middleware/telemetry.ts +0 -83
- package/src/middleware-runner.test.ts +0 -578
- package/src/middleware-runner.ts +0 -232
- package/src/no-any-casts.test.ts +0 -57
- package/src/no-root-barrel.test.ts +0 -122
- package/src/permissions.test.ts +0 -256
- package/src/permissions.ts +0 -217
- package/src/pikku-state.test.ts +0 -198
- package/src/pikku-state.ts +0 -206
- package/src/production-barrels-stay-lean.test.ts +0 -110
- package/src/public-surface.test.ts +0 -133
- package/src/remote.test.ts +0 -173
- package/src/remote.ts +0 -56
- package/src/removed-legacy-exports.test.ts +0 -66
- package/src/run-tests-script.test.ts +0 -67
- package/src/schema.test.ts +0 -430
- package/src/schema.ts +0 -204
- package/src/scopes.test.ts +0 -203
- package/src/scopes.ts +0 -67
- package/src/services/agent-run-state-service.ts +0 -37
- package/src/services/agent-runner-service.ts +0 -238
- package/src/services/agent-storage-service.ts +0 -39
- package/src/services/ai-embedding-service.ts +0 -9
- package/src/services/audit-service.test.ts +0 -44
- package/src/services/audit-service.ts +0 -280
- package/src/services/content-service.ts +0 -65
- package/src/services/credential-service.ts +0 -20
- package/src/services/credential-wire-service.test.ts +0 -235
- package/src/services/credential-wire-service.ts +0 -120
- package/src/services/deployment-service.ts +0 -32
- package/src/services/email-service.test.ts +0 -100
- package/src/services/email-service.ts +0 -60
- package/src/services/email-template.test.ts +0 -311
- package/src/services/email-template.ts +0 -254
- package/src/services/file-scenario-run-store.test.ts +0 -349
- package/src/services/file-scenario-run-store.ts +0 -282
- package/src/services/gateway-service.ts +0 -5
- package/src/services/http-personas-converse.test.ts +0 -274
- package/src/services/http-personas.test.ts +0 -379
- package/src/services/http-personas.ts +0 -508
- package/src/services/in-memory-agent-run-state-service.ts +0 -87
- package/src/services/in-memory-queue-service.test.ts +0 -162
- package/src/services/in-memory-queue-service.ts +0 -78
- package/src/services/in-memory-session-store.test.ts +0 -58
- package/src/services/in-memory-session-store.ts +0 -20
- package/src/services/in-memory-trigger-service.ts +0 -47
- package/src/services/in-memory-workflow-service.test.ts +0 -430
- package/src/services/in-memory-workflow-service.ts +0 -595
- package/src/services/index.ts +0 -192
- package/src/services/istanbul-coverage-service.test.ts +0 -66
- package/src/services/istanbul-coverage-service.ts +0 -59
- package/src/services/jwt-service.ts +0 -15
- package/src/services/local-content-request-handler.test.ts +0 -240
- package/src/services/local-content-request-handler.ts +0 -295
- package/src/services/local-content.test.ts +0 -186
- package/src/services/local-content.ts +0 -242
- package/src/services/local-credential-service.ts +0 -63
- package/src/services/local-email-service.test.ts +0 -182
- package/src/services/local-email-service.ts +0 -43
- package/src/services/local-gateway-service.ts +0 -51
- package/src/services/local-secrets.test.ts +0 -95
- package/src/services/local-secrets.ts +0 -71
- package/src/services/local-variables.test.ts +0 -61
- package/src/services/local-variables.ts +0 -45
- package/src/services/logger-console.test.ts +0 -117
- package/src/services/logger-console.ts +0 -174
- package/src/services/logger.ts +0 -48
- package/src/services/meta-service.test.ts +0 -75
- package/src/services/meta-service.ts +0 -767
- package/src/services/persona-actor-secret.test.ts +0 -68
- package/src/services/persona-actor-secret.ts +0 -70
- package/src/services/persona-sign-in.test.ts +0 -219
- package/src/services/persona-sign-in.ts +0 -238
- package/src/services/personas-service.ts +0 -191
- package/src/services/pikku-user-id.test.ts +0 -62
- package/src/services/pikku-user-id.ts +0 -13
- package/src/services/queue-webhook-service.test.ts +0 -409
- package/src/services/queue-webhook-service.ts +0 -150
- package/src/services/remote-jobs.test.ts +0 -106
- package/src/services/remote-jobs.ts +0 -92
- package/src/services/scheduler-service.ts +0 -37
- package/src/services/schema-service.ts +0 -10
- package/src/services/scope-service.ts +0 -91
- package/src/services/scoped-credential-service.test.ts +0 -86
- package/src/services/scoped-credential-service.ts +0 -63
- package/src/services/scoped-secret-service.test.ts +0 -93
- package/src/services/scoped-secret-service.ts +0 -40
- package/src/services/secret-host-binding.test.ts +0 -138
- package/src/services/secret-host-binding.ts +0 -51
- package/src/services/secret-service.ts +0 -25
- package/src/services/secretless.test.ts +0 -54
- package/src/services/secretless.ts +0 -29
- package/src/services/session-store.ts +0 -9
- package/src/services/stub-tracker.test.ts +0 -104
- package/src/services/stub-tracker.ts +0 -175
- package/src/services/system-role-guard.test.ts +0 -96
- package/src/services/system-role-guard.ts +0 -71
- package/src/services/temporary-file-service.ts +0 -76
- package/src/services/trigger-service.ts +0 -5
- package/src/services/typed-credential-service.ts +0 -83
- package/src/services/typed-secret-service.test.ts +0 -204
- package/src/services/typed-secret-service.ts +0 -132
- package/src/services/typed-variables-service.test.ts +0 -166
- package/src/services/typed-variables-service.ts +0 -166
- package/src/services/user-session-service.test.ts +0 -147
- package/src/services/user-session-service.ts +0 -85
- package/src/services/v8-coverage-service.test.ts +0 -69
- package/src/services/v8-coverage-service.ts +0 -163
- package/src/services/variables-service.ts +0 -13
- package/src/services/webhook-service.ts +0 -147
- package/src/services/workflow-service.ts +0 -120
- package/src/side-effects-are-declared.test.ts +0 -84
- package/src/source-files-stay-composable.test.ts +0 -41
- package/src/template-alias-surface.test.ts +0 -240
- package/src/test-utils.ts +0 -38
- package/src/testing/index.ts +0 -3
- package/src/testing/service-tests/agent-run-service-tests.ts +0 -98
- package/src/testing/service-tests/agent-storage-service-tests.ts +0 -379
- package/src/testing/service-tests/channel-store-tests.ts +0 -98
- package/src/testing/service-tests/credential-service-tests.ts +0 -143
- package/src/testing/service-tests/deployment-service-tests.ts +0 -33
- package/src/testing/service-tests/event-hub-store-tests.ts +0 -48
- package/src/testing/service-tests/secret-service-tests.ts +0 -105
- package/src/testing/service-tests/session-store-tests.ts +0 -62
- package/src/testing/service-tests/workflow-run-service-tests.ts +0 -59
- package/src/testing/service-tests/workflow-service-tests.ts +0 -308
- package/src/testing/service-tests.ts +0 -95
- package/src/time-utils.test.ts +0 -56
- package/src/time-utils.ts +0 -89
- package/src/types/core.types.ts +0 -446
- package/src/types/index.ts +0 -25
- package/src/types/state.types.ts +0 -226
- package/src/types/typed-credentials.test.ts +0 -72
- package/src/utils/hash.test.ts +0 -68
- package/src/utils/hash.ts +0 -26
- package/src/utils/hmac.ts +0 -21
- package/src/utils/node-host-resolver.ts +0 -20
- package/src/utils/safe-fetch.test.ts +0 -515
- package/src/utils/safe-fetch.ts +0 -347
- package/src/utils.test.ts +0 -359
- package/src/utils.ts +0 -165
- package/src/version.test.ts +0 -80
- package/src/version.ts +0 -25
- package/src/wirings/actor-flow/actor-flow.types.ts +0 -40
- package/src/wirings/actor-flow/index.ts +0 -10
- package/src/wirings/actor-flow/run-conversation.test.ts +0 -187
- package/src/wirings/actor-flow/run-conversation.ts +0 -280
- package/src/wirings/addon/addon-auth-tags.test.ts +0 -219
- package/src/wirings/addon/addon-runner.ts +0 -236
- package/src/wirings/addon/addon-scopes.test.ts +0 -225
- package/src/wirings/addon/addon-secrets.test.ts +0 -391
- package/src/wirings/addon/index.ts +0 -12
- package/src/wirings/addon/remote-addon-auth.ts +0 -65
- package/src/wirings/addon/wire-addon.test.ts +0 -102
- package/src/wirings/addon/wire-addon.ts +0 -202
- package/src/wirings/addon/wire-remote-addon.ts +0 -41
- package/src/wirings/agent/agent-agui.test.ts +0 -1213
- package/src/wirings/agent/agent-agui.ts +0 -405
- package/src/wirings/agent/agent-authorization.test.ts +0 -208
- package/src/wirings/agent/agent-finalize.test.ts +0 -187
- package/src/wirings/agent/agent-finalize.ts +0 -197
- package/src/wirings/agent/agent-helpers.test.ts +0 -215
- package/src/wirings/agent/agent-helpers.ts +0 -96
- package/src/wirings/agent/agent-interrupt.test.ts +0 -833
- package/src/wirings/agent/agent-interrupt.ts +0 -400
- package/src/wirings/agent/agent-memory.test.ts +0 -397
- package/src/wirings/agent/agent-memory.ts +0 -496
- package/src/wirings/agent/agent-middleware.types.test.ts +0 -41
- package/src/wirings/agent/agent-model-config.test.ts +0 -103
- package/src/wirings/agent/agent-model-config.ts +0 -59
- package/src/wirings/agent/agent-prepare.test.ts +0 -977
- package/src/wirings/agent/agent-prepare.ts +0 -1083
- package/src/wirings/agent/agent-registry.test.ts +0 -455
- package/src/wirings/agent/agent-registry.ts +0 -99
- package/src/wirings/agent/agent-resume-authorization.test.ts +0 -206
- package/src/wirings/agent/agent-rpc.ts +0 -116
- package/src/wirings/agent/agent-runner.test.ts +0 -1229
- package/src/wirings/agent/agent-runner.ts +0 -858
- package/src/wirings/agent/agent-stream-delegate.test.ts +0 -381
- package/src/wirings/agent/agent-stream-output-hooks.test.ts +0 -353
- package/src/wirings/agent/agent-stream.test.ts +0 -1800
- package/src/wirings/agent/agent-stream.ts +0 -1639
- package/src/wirings/agent/agent-thread-ownership.test.ts +0 -297
- package/src/wirings/agent/agent-turn.test.ts +0 -65
- package/src/wirings/agent/agent-turn.ts +0 -122
- package/src/wirings/agent/agent-utils.ts +0 -20
- package/src/wirings/agent/agent.types.ts +0 -676
- package/src/wirings/agent/index.ts +0 -58
- package/src/wirings/agent/voice-input.test.ts +0 -220
- package/src/wirings/agent/voice-input.ts +0 -180
- package/src/wirings/agent/voice-output.test.ts +0 -510
- package/src/wirings/agent/voice-output.ts +0 -311
- package/src/wirings/agent-scorer/agent-scorer-grade.test.ts +0 -106
- package/src/wirings/agent-scorer/agent-scorer-grade.ts +0 -55
- package/src/wirings/agent-scorer/agent-scorer-judge.test.ts +0 -285
- package/src/wirings/agent-scorer/agent-scorer-judge.ts +0 -180
- package/src/wirings/agent-scorer/agent-scorer-live.test.ts +0 -174
- package/src/wirings/agent-scorer/agent-scorer-live.ts +0 -56
- package/src/wirings/agent-scorer/agent-scorer-registry.ts +0 -66
- package/src/wirings/agent-scorer/agent-scorer-sampling.test.ts +0 -34
- package/src/wirings/agent-scorer/agent-scorer-sampling.ts +0 -36
- package/src/wirings/agent-scorer/agent-scorer-snapshots.test.ts +0 -49
- package/src/wirings/agent-scorer/agent-scorer-snapshots.ts +0 -46
- package/src/wirings/agent-scorer/agent-scorer-worker.test.ts +0 -122
- package/src/wirings/agent-scorer/agent-scorer-worker.ts +0 -71
- package/src/wirings/agent-scorer/agent-scorer.ts +0 -102
- package/src/wirings/agent-scorer/agent-scorer.types.ts +0 -128
- package/src/wirings/agent-scorer/index.ts +0 -23
- package/src/wirings/channel/channel-common.ts +0 -102
- package/src/wirings/channel/channel-handler-shapes.test.ts +0 -72
- package/src/wirings/channel/channel-handler.test.ts +0 -322
- package/src/wirings/channel/channel-handler.ts +0 -259
- package/src/wirings/channel/channel-host-rpc.test.ts +0 -150
- package/src/wirings/channel/channel-host-rpc.ts +0 -69
- package/src/wirings/channel/channel-middleware-runner.test.ts +0 -188
- package/src/wirings/channel/channel-middleware-runner.ts +0 -126
- package/src/wirings/channel/channel-rpc-registry.ts +0 -116
- package/src/wirings/channel/channel-rpc-responder.ts +0 -117
- package/src/wirings/channel/channel-rpc-service.ts +0 -132
- package/src/wirings/channel/channel-rpc-validators.ts +0 -65
- package/src/wirings/channel/channel-rpc.test.ts +0 -841
- package/src/wirings/channel/channel-rpc.ts +0 -5
- package/src/wirings/channel/channel-rpc.types.ts +0 -160
- package/src/wirings/channel/channel-runner.ts +0 -164
- package/src/wirings/channel/channel-store.ts +0 -35
- package/src/wirings/channel/channel.types.ts +0 -193
- package/src/wirings/channel/define-channel-routes.ts +0 -5
- package/src/wirings/channel/eventhub-service.ts +0 -16
- package/src/wirings/channel/eventhub-store.ts +0 -13
- package/src/wirings/channel/index.ts +0 -40
- package/src/wirings/channel/local/index.ts +0 -3
- package/src/wirings/channel/local/local-channel-handler.ts +0 -98
- package/src/wirings/channel/local/local-channel-runner.test.ts +0 -339
- package/src/wirings/channel/local/local-channel-runner.ts +0 -271
- package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -77
- package/src/wirings/channel/local/local-eventhub-service.ts +0 -69
- package/src/wirings/channel/log-channels.ts +0 -16
- package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +0 -135
- package/src/wirings/channel/pikku-abstract-channel-handler.ts +0 -60
- package/src/wirings/channel/serverless/index.ts +0 -6
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +0 -328
- package/src/wirings/cli/channel/cli-approval.test.ts +0 -177
- package/src/wirings/cli/channel/cli-approval.ts +0 -135
- package/src/wirings/cli/channel/cli-channel-runner.ts +0 -118
- package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +0 -192
- package/src/wirings/cli/channel/cli-raw-channel-runner.ts +0 -148
- package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +0 -480
- package/src/wirings/cli/channel/cli-raw-client-runner.ts +0 -188
- package/src/wirings/cli/channel/index.ts +0 -6
- package/src/wirings/cli/cli-runner.test.ts +0 -969
- package/src/wirings/cli/cli-runner.ts +0 -538
- package/src/wirings/cli/cli.types.ts +0 -388
- package/src/wirings/cli/command-parser.test.ts +0 -1120
- package/src/wirings/cli/command-parser.ts +0 -713
- package/src/wirings/cli/define-cli-commands.ts +0 -13
- package/src/wirings/cli/format-cli-error.test.ts +0 -91
- package/src/wirings/cli/format-cli-error.ts +0 -96
- package/src/wirings/cli/index.ts +0 -19
- package/src/wirings/credential/credential.types.ts +0 -37
- package/src/wirings/credential/define-credential.ts +0 -49
- package/src/wirings/credential/index.ts +0 -7
- package/src/wirings/credential/validate-credential-definitions.ts +0 -63
- package/src/wirings/gateway/gateway-authorization.test.ts +0 -575
- package/src/wirings/gateway/gateway-channel-meta.test.ts +0 -44
- package/src/wirings/gateway/gateway-runner.test.ts +0 -581
- package/src/wirings/gateway/gateway-runner.ts +0 -411
- package/src/wirings/gateway/gateway.types.ts +0 -137
- package/src/wirings/gateway/index.ts +0 -15
- package/src/wirings/http/http-routes.test.ts +0 -318
- package/src/wirings/http/http-routes.ts +0 -111
- package/src/wirings/http/http-runner-addon-ref.test.ts +0 -238
- package/src/wirings/http/http-runner.test.ts +0 -503
- package/src/wirings/http/http-runner.ts +0 -462
- package/src/wirings/http/http.types.ts +0 -307
- package/src/wirings/http/index.ts +0 -27
- package/src/wirings/http/log-http-routes.ts +0 -18
- package/src/wirings/http/pikku-fetch-http-request.test.ts +0 -318
- package/src/wirings/http/pikku-fetch-http-request.ts +0 -260
- package/src/wirings/http/pikku-fetch-http-response.test.ts +0 -123
- package/src/wirings/http/pikku-fetch-http-response.ts +0 -149
- package/src/wirings/http/routers/http-router.ts +0 -13
- package/src/wirings/http/routers/path-to-regex.test.ts +0 -306
- package/src/wirings/http/routers/path-to-regex.ts +0 -115
- package/src/wirings/http/web-request.test.ts +0 -382
- package/src/wirings/http/web-request.ts +0 -162
- package/src/wirings/mcp/index.ts +0 -26
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -388
- package/src/wirings/mcp/mcp-endpoint-registry.ts +0 -159
- package/src/wirings/mcp/mcp-runner.test.ts +0 -588
- package/src/wirings/mcp/mcp-runner.ts +0 -330
- package/src/wirings/mcp/mcp.types.ts +0 -199
- package/src/wirings/node/index.ts +0 -2
- package/src/wirings/node/node.types.ts +0 -23
- package/src/wirings/oauth2/index.ts +0 -1
- package/src/wirings/oauth2/oauth2.types.ts +0 -12
- package/src/wirings/persona/define-personas.ts +0 -33
- package/src/wirings/persona/index.ts +0 -75
- package/src/wirings/persona/persona-app-scopes.test.ts +0 -47
- package/src/wirings/persona/persona-app-scopes.ts +0 -74
- package/src/wirings/persona/persona-email.ts +0 -87
- package/src/wirings/persona/persona-environments.test.ts +0 -194
- package/src/wirings/persona/persona-environments.ts +0 -138
- package/src/wirings/persona/persona-mailbox.ts +0 -156
- package/src/wirings/persona/persona.test.ts +0 -230
- package/src/wirings/persona/persona.types.ts +0 -156
- package/src/wirings/persona/validate-personas.ts +0 -137
- package/src/wirings/queue/index.ts +0 -29
- package/src/wirings/queue/queue-identity.test.ts +0 -454
- package/src/wirings/queue/queue-identity.ts +0 -176
- package/src/wirings/queue/queue-runner.test.ts +0 -705
- package/src/wirings/queue/queue-runner.ts +0 -181
- package/src/wirings/queue/queue.types.ts +0 -161
- package/src/wirings/queue/register-queue-helper.ts +0 -46
- package/src/wirings/queue/signed-queue-service.ts +0 -60
- package/src/wirings/queue/validate-worker-config.test.ts +0 -108
- package/src/wirings/queue/validate-worker-config.ts +0 -90
- package/src/wirings/role/define-system-role.ts +0 -33
- package/src/wirings/role/index.ts +0 -13
- package/src/wirings/role/role.test.ts +0 -104
- package/src/wirings/role/role.types.ts +0 -47
- package/src/wirings/role/validate-role-definitions.ts +0 -93
- package/src/wirings/rpc/index.ts +0 -8
- package/src/wirings/rpc/rpc-runner.test.ts +0 -1130
- package/src/wirings/rpc/rpc-runner.ts +0 -569
- package/src/wirings/rpc/rpc-types.ts +0 -87
- package/src/wirings/scheduler/index.ts +0 -11
- package/src/wirings/scheduler/log-schedulers.ts +0 -16
- package/src/wirings/scheduler/scheduler-runner.test.ts +0 -835
- package/src/wirings/scheduler/scheduler-runner.ts +0 -138
- package/src/wirings/scheduler/scheduler.types.ts +0 -42
- package/src/wirings/scope/define-scope.ts +0 -33
- package/src/wirings/scope/index.ts +0 -15
- package/src/wirings/scope/scope.test.ts +0 -159
- package/src/wirings/scope/scope.types.ts +0 -42
- package/src/wirings/scope/validate-scope-definitions.ts +0 -107
- package/src/wirings/secret/index.ts +0 -9
- package/src/wirings/secret/secret.types.ts +0 -70
- package/src/wirings/secret/validate-secret-definitions.test.ts +0 -232
- package/src/wirings/secret/validate-secret-definitions.ts +0 -88
- package/src/wirings/trigger/index.ts +0 -9
- package/src/wirings/trigger/pikku-trigger-service.ts +0 -107
- package/src/wirings/trigger/trigger-runner.test.ts +0 -78
- package/src/wirings/trigger/trigger-runner.ts +0 -113
- package/src/wirings/trigger/trigger.types.ts +0 -100
- package/src/wirings/variable/index.ts +0 -8
- package/src/wirings/variable/validate-variable-definitions.test.ts +0 -115
- package/src/wirings/variable/validate-variable-definitions.ts +0 -71
- package/src/wirings/variable/variable.types.ts +0 -40
- package/src/wirings/virtual-user/index.ts +0 -107
- package/src/wirings/virtual-user/prepare-virtual-user-run.test.ts +0 -115
- package/src/wirings/virtual-user/prepare-virtual-user-run.ts +0 -95
- package/src/wirings/virtual-user/run-virtual-user.test.ts +0 -774
- package/src/wirings/virtual-user/run-virtual-user.ts +0 -684
- package/src/wirings/virtual-user/virtual-user-agents.test.ts +0 -72
- package/src/wirings/virtual-user/virtual-user-agents.ts +0 -62
- package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +0 -215
- package/src/wirings/virtual-user/virtual-user-catalogue.ts +0 -184
- package/src/wirings/virtual-user/virtual-user-derive.test.ts +0 -426
- package/src/wirings/virtual-user/virtual-user-derive.ts +0 -161
- package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +0 -68
- package/src/wirings/virtual-user/virtual-user-dispositions.ts +0 -210
- package/src/wirings/virtual-user/virtual-user-intents.test.ts +0 -218
- package/src/wirings/virtual-user/virtual-user-intents.ts +0 -185
- package/src/wirings/virtual-user/virtual-user-rng.test.ts +0 -72
- package/src/wirings/virtual-user/virtual-user-rng.ts +0 -50
- package/src/wirings/virtual-user/virtual-user-run-store.ts +0 -131
- package/src/wirings/virtual-user/virtual-user-scaffold.test.ts +0 -854
- package/src/wirings/virtual-user/virtual-user-scaffold.ts +0 -664
- package/src/wirings/virtual-user/virtual-user-schedule-store.ts +0 -93
- package/src/wirings/virtual-user/virtual-user-schedule.test.ts +0 -280
- package/src/wirings/virtual-user/virtual-user-schedule.ts +0 -156
- package/src/wirings/virtual-user/virtual-user-target.ts +0 -47
- package/src/wirings/virtual-user/virtual-user.types.ts +0 -215
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +0 -709
- package/src/wirings/workflow/dsl/workflow-runner.ts +0 -25
- package/src/wirings/workflow/feature.test.ts +0 -131
- package/src/wirings/workflow/feature.ts +0 -59
- package/src/wirings/workflow/graph/graph-foreach-queued.test.ts +0 -569
- package/src/wirings/workflow/graph/graph-foreach.test.ts +0 -626
- package/src/wirings/workflow/graph/graph-node.ts +0 -115
- package/src/wirings/workflow/graph/graph-runner.test.ts +0 -1049
- package/src/wirings/workflow/graph/graph-runner.ts +0 -1376
- package/src/wirings/workflow/graph/graph-validation.test.ts +0 -27
- package/src/wirings/workflow/graph/graph-validation.ts +0 -41
- package/src/wirings/workflow/graph/template.test.ts +0 -49
- package/src/wirings/workflow/graph/template.ts +0 -42
- package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -39
- package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -75
- package/src/wirings/workflow/index.ts +0 -107
- package/src/wirings/workflow/pikku-scenario-service.ts +0 -1013
- package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -963
- package/src/wirings/workflow/pikku-workflow-service.ts +0 -1993
- package/src/wirings/workflow/run-timeline.test.ts +0 -199
- package/src/wirings/workflow/run-timeline.ts +0 -185
- package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -107
- package/src/wirings/workflow/scenario-cookie-jar.ts +0 -57
- package/src/wirings/workflow/scenario-expectations.test.ts +0 -238
- package/src/wirings/workflow/scenario-hooks.test.ts +0 -259
- package/src/wirings/workflow/scenario-poll.test.ts +0 -64
- package/src/wirings/workflow/scenario-poll.ts +0 -27
- package/src/wirings/workflow/scenario-prose.test.ts +0 -275
- package/src/wirings/workflow/scenario-prose.ts +0 -86
- package/src/wirings/workflow/scenario-run.types.ts +0 -193
- package/src/wirings/workflow/scenario-service.test.ts +0 -147
- package/src/wirings/workflow/scenario-step-guards.ts +0 -23
- package/src/wirings/workflow/scenario-step.test.ts +0 -800
- package/src/wirings/workflow/scenario-step.types.ts +0 -262
- package/src/wirings/workflow/scenario-surface.test.ts +0 -146
- package/src/wirings/workflow/scenario-surface.ts +0 -71
- package/src/wirings/workflow/scenario.types.ts +0 -63
- package/src/wirings/workflow/workflow-approval-audit.ts +0 -47
- package/src/wirings/workflow/workflow-approval-policy.test.ts +0 -594
- package/src/wirings/workflow/workflow-approval-policy.ts +0 -68
- package/src/wirings/workflow/workflow-approval.ts +0 -290
- package/src/wirings/workflow/workflow-child-run-session.test.ts +0 -168
- package/src/wirings/workflow/workflow-constants.ts +0 -66
- package/src/wirings/workflow/workflow-dispatch-durability.test.ts +0 -116
- package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -55
- package/src/wirings/workflow/workflow-dispatch-relay.test.ts +0 -128
- package/src/wirings/workflow/workflow-errors.ts +0 -132
- package/src/wirings/workflow/workflow-inline-authority.test.ts +0 -175
- package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -51
- package/src/wirings/workflow/workflow-invocation-id.ts +0 -28
- package/src/wirings/workflow/workflow-meta-resolver.ts +0 -45
- package/src/wirings/workflow/workflow-mirror.test.ts +0 -171
- package/src/wirings/workflow/workflow-missing-meta.test.ts +0 -92
- package/src/wirings/workflow/workflow-on-error.test.ts +0 -145
- package/src/wirings/workflow/workflow-queue-routing.ts +0 -129
- package/src/wirings/workflow/workflow-queue-wiring.ts +0 -149
- package/src/wirings/workflow/workflow-queue-workers.test.ts +0 -131
- package/src/wirings/workflow/workflow-queue-workers.ts +0 -66
- package/src/wirings/workflow/workflow-recovery.ts +0 -192
- package/src/wirings/workflow/workflow-replay-snapshot.test.ts +0 -140
- package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -113
- package/src/wirings/workflow/workflow-run-authority.test.ts +0 -212
- package/src/wirings/workflow/workflow-run-context.test.ts +0 -172
- package/src/wirings/workflow/workflow-run-engine.types.ts +0 -92
- package/src/wirings/workflow/workflow-run-ownership.ts +0 -37
- package/src/wirings/workflow/workflow-run-polling.test.ts +0 -127
- package/src/wirings/workflow/workflow-stalled-recovery.test.ts +0 -152
- package/src/wirings/workflow/workflow-status-stream.test.ts +0 -354
- package/src/wirings/workflow/workflow-status-stream.ts +0 -144
- package/src/wirings/workflow/workflow-step-claim.ts +0 -46
- package/src/wirings/workflow/workflow-step-ordinal.test.ts +0 -94
- package/src/wirings/workflow/workflow-step-session.test.ts +0 -87
- package/src/wirings/workflow/workflow-suspend.ts +0 -61
- package/src/wirings/workflow/workflow-terminal-run-guard.test.ts +0 -105
- package/src/wirings/workflow/workflow.types.ts +0 -268
- package/src/wirings-stay-decoupled.test.ts +0 -130
- package/tsconfig.json +0 -14
- package/tsconfig.tsbuildinfo +0 -1
- 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
|
+
};
|
package/dist/errors/errors.d.ts
CHANGED
|
@@ -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 {
|
package/dist/errors/errors.js
CHANGED
|
@@ -87,6 +87,23 @@ addError(MissingScopeError, {
|
|
|
87
87
|
status: 403,
|
|
88
88
|
message: 'The session does not hold a scope required by this function.',
|
|
89
89
|
});
|
|
90
|
+
export class FeatureUnavailableError extends PikkuError {
|
|
91
|
+
payload;
|
|
92
|
+
constructor(feature) {
|
|
93
|
+
super(`Feature is currently unavailable: ${feature}`);
|
|
94
|
+
this.payload = {
|
|
95
|
+
error: 'feature_unavailable',
|
|
96
|
+
feature,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// 503 and not 403: a killed feature is a server-side, temporary, not-your-fault
|
|
101
|
+
// condition, and it should be retryable and monitorable as one. A 403 here
|
|
102
|
+
// would page the wrong team and tell the caller to fix something they cannot.
|
|
103
|
+
addError(FeatureUnavailableError, {
|
|
104
|
+
status: 503,
|
|
105
|
+
message: 'This feature is switched off.',
|
|
106
|
+
});
|
|
90
107
|
export class ReadonlySessionError extends PikkuError {
|
|
91
108
|
}
|
|
92
109
|
addError(ReadonlySessionError, {
|
|
@@ -25,6 +25,8 @@ export type FunctionRuntimeMeta = {
|
|
|
25
25
|
outputSchemaName: string | null;
|
|
26
26
|
/** Scopes the session must hold to run this function. All are required (AND). */
|
|
27
27
|
scopes?: string[];
|
|
28
|
+
/** The feature this function belongs to. Checked for availability only. */
|
|
29
|
+
featureFlag?: string;
|
|
28
30
|
expose?: boolean;
|
|
29
31
|
/**
|
|
30
32
|
* A sessionless function's own `auth: true`. `sessionless` carries the
|
|
@@ -9,9 +9,12 @@ import { parseVersionedId } from '../version.js';
|
|
|
9
9
|
import { PikkuSessionService } from '../services/user-session-service.js';
|
|
10
10
|
import { MissingSessionError, ReadonlySessionError } from '../errors/errors.js';
|
|
11
11
|
import { verifyScopes } from '../scopes.js';
|
|
12
|
+
import { assertFeatureAvailable } from '../wirings/flag/assert-feature-available.js';
|
|
12
13
|
import { PikkuCredentialWireService, createWireServicesCredentialWireProps, } from '../services/credential-wire-service.js';
|
|
13
14
|
import { defaultPikkuUserIdResolver } from '../services/pikku-user-id.js';
|
|
14
15
|
import { createInvocationAudit, resolveAuditConfig, } from '../services/audit-service.js';
|
|
16
|
+
import { createInvocationAnalytics } from '../analytics/analytics.js';
|
|
17
|
+
import { LoggerAnalyticsService } from '../analytics/logger-analytics-service.js';
|
|
15
18
|
import { rpcService } from '../wirings/rpc/rpc-runner.js';
|
|
16
19
|
import { getOrCreatePackageSingletonServices } from '../wirings/addon/addon-runner.js';
|
|
17
20
|
import { resolveAddonAuth, resolveAddonFunctionTarget, resolveAddonScopes, resolveAddonTagMiddleware, } from '../wirings/addon/wire-addon.js';
|
|
@@ -209,6 +212,16 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
|
|
|
209
212
|
verifyScopes(addonScopes.length > 0
|
|
210
213
|
? [...addonScopes, ...(functionScopes ?? [])]
|
|
211
214
|
: functionScopes, session);
|
|
215
|
+
const featureFlag = funcConfig.featureFlag ?? funcMeta.featureFlag;
|
|
216
|
+
if (featureFlag) {
|
|
217
|
+
// The host's source, not the package's: a `featureFlag:` on an addon
|
|
218
|
+
// function names a flag the consuming application declared and its
|
|
219
|
+
// operators switch. A package factory builds its own services and has no
|
|
220
|
+
// reason to carry one, and reading that would leave every addon gate
|
|
221
|
+
// open.
|
|
222
|
+
await assertFeatureAvailable(featureFlag, singletonServices.featureFlags ??
|
|
223
|
+
resolvedSingletonServices.featureFlags, session);
|
|
224
|
+
}
|
|
212
225
|
let actualData = await data();
|
|
213
226
|
const inputSchemaName = funcMeta.inputSchemaName;
|
|
214
227
|
if (inputSchemaName) {
|
|
@@ -228,6 +241,7 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
|
|
|
228
241
|
});
|
|
229
242
|
let wireServices;
|
|
230
243
|
let invocationAuditLog;
|
|
244
|
+
let invocationAnalytics;
|
|
231
245
|
try {
|
|
232
246
|
wireServices = (await resolvedCreateWireServices?.(resolvedSingletonServices, invocationWire));
|
|
233
247
|
let services = wireServices && Object.keys(wireServices).length > 0
|
|
@@ -240,6 +254,20 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
|
|
|
240
254
|
invocationAuditLog = createInvocationAudit(resolvedSingletonServices.audit, invocationWire, resolvedSingletonServices.logger);
|
|
241
255
|
services = { ...services, auditLog: invocationAuditLog };
|
|
242
256
|
}
|
|
257
|
+
// Unconditional, unlike the audit — every function can record. Built on
|
|
258
|
+
// first access, since most invocations record nothing.
|
|
259
|
+
if (!services.analytics) {
|
|
260
|
+
services = { ...services };
|
|
261
|
+
Object.defineProperty(services, 'analytics', {
|
|
262
|
+
get() {
|
|
263
|
+
invocationAnalytics ??= createInvocationAnalytics(resolvedSingletonServices.analyticsService ??
|
|
264
|
+
new LoggerAnalyticsService(resolvedSingletonServices.logger), invocationWire, resolvedSingletonServices.logger, resolvedSingletonServices.analyticsIdentity);
|
|
265
|
+
return invocationAnalytics;
|
|
266
|
+
},
|
|
267
|
+
configurable: true,
|
|
268
|
+
enumerable: true,
|
|
269
|
+
});
|
|
270
|
+
}
|
|
243
271
|
const callerPackageName = funcPackageName;
|
|
244
272
|
Object.defineProperty(invocationWire, 'rpc', {
|
|
245
273
|
get() {
|
|
@@ -259,6 +287,7 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
|
|
|
259
287
|
finally {
|
|
260
288
|
// Flush the runner-installed audit buffer before wire services close.
|
|
261
289
|
await invocationAuditLog?.close();
|
|
290
|
+
await invocationAnalytics?.close();
|
|
262
291
|
if (wireServices && Object.keys(wireServices).length > 0) {
|
|
263
292
|
await closeWireServices(resolvedSingletonServices.logger, wireServices);
|
|
264
293
|
}
|
|
@@ -15,7 +15,7 @@ export type CorePikkuPermissionConfig<In = any, Services extends CoreSecretlessS
|
|
|
15
15
|
name?: string;
|
|
16
16
|
description?: string;
|
|
17
17
|
};
|
|
18
|
-
export declare const pikkuPermission: <In = any, Services extends CoreSecretlessSingletonServices = SecretlessServices<CoreServices>, Wire extends PickRequired<PikkuWire<In, never, false, any, PikkuRPC, never, never>,
|
|
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'>;
|
package/dist/pikku-state.d.ts
CHANGED
|
@@ -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[
|
|
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
|
|
45
|
+
getCredentials: () => Promise<Record<string, unknown>> | Record<string, unknown>;
|
|
46
46
|
};
|