@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,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 {};
|
package/dist/services/index.d.ts
CHANGED
|
@@ -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
|
|
96
|
-
*
|
|
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
|
|
18
|
-
*
|
|
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
|
-
|
|
29
|
+
async listDeliveries(_opts) {
|
|
30
|
+
return [];
|
|
26
31
|
}
|
|
27
|
-
getDelivery(_deliveryId) {
|
|
28
|
-
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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,
|
|
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:
|
|
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,
|
|
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,
|
|
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>,
|
|
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;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { CoreChannel, RunChannelOptions } from '../channel.types.js';
|
|
2
2
|
import { PikkuLocalChannelHandler } from './local-channel-handler.js';
|
|
3
3
|
import type { PikkuHTTPRequest, PikkuHTTPResponse } from '../../http/http.types.js';
|
|
4
|
-
export declare const runLocalChannel: ({ channelId, request, response, route, skipUserSession, respondWith404, coerceDataFromSchema, logWarningsForStatusCodes, bubbleErrors, }: Partial<Pick<CoreChannel<unknown, any>,
|
|
4
|
+
export declare const runLocalChannel: ({ channelId, request, response, route, skipUserSession, respondWith404, coerceDataFromSchema, logWarningsForStatusCodes, bubbleErrors, }: Partial<Pick<CoreChannel<unknown, any>, 'route'>> & RunChannelOptions & {
|
|
5
5
|
channelId: string;
|
|
6
6
|
request?: PikkuHTTPRequest;
|
|
7
7
|
response?: PikkuHTTPResponse;
|
|
@@ -5,6 +5,6 @@ export interface RunServerlessChannelParams<ChannelData> extends RunChannelParam
|
|
|
5
5
|
channelHandlerFactory: PikkuChannelHandlerFactory;
|
|
6
6
|
channelObject?: unknown;
|
|
7
7
|
}
|
|
8
|
-
export declare const runChannelConnect: ({ channelId, channelObject, request, response, route, channelStore, channelHandlerFactory, coerceDataFromSchema, logWarningsForStatusCodes, respondWith404, bubbleErrors, }: Pick<CoreChannel<unknown, any>,
|
|
8
|
+
export declare const runChannelConnect: ({ channelId, channelObject, request, response, route, channelStore, channelHandlerFactory, coerceDataFromSchema, logWarningsForStatusCodes, respondWith404, bubbleErrors, }: Pick<CoreChannel<unknown, any>, 'route'> & RunChannelOptions & RunServerlessChannelParams<unknown>) => Promise<void>;
|
|
9
9
|
export declare const runChannelDisconnect: ({ channelId, channelStore, channelHandlerFactory, }: RunServerlessChannelParams<unknown>) => Promise<void>;
|
|
10
10
|
export declare const runChannelMessage: ({ channelId, channelStore, channelHandlerFactory, }: RunServerlessChannelParams<unknown>, data: unknown) => Promise<unknown>;
|
|
@@ -6,8 +6,8 @@ import type { ApprovalRequester } from '../../channel/channel-rpc.js';
|
|
|
6
6
|
*/
|
|
7
7
|
export type ApprovalMode = 'prompt' | 'auto' | 'dangerous';
|
|
8
8
|
export declare const APPROVAL_FLAGS: {
|
|
9
|
-
readonly auto:
|
|
10
|
-
readonly dangerous:
|
|
9
|
+
readonly auto: '--auto-approve';
|
|
10
|
+
readonly dangerous: '--dangerously-auto-approve';
|
|
11
11
|
};
|
|
12
12
|
/**
|
|
13
13
|
* Stripped from argv, not just read: the server owns the command tree and has
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CoreUserSession } from '../../types/core.types.js';
|
|
2
|
+
import type { FeatureFlagSource } from '../../services/feature-flag-service.js';
|
|
3
|
+
import type { FlagSubject } from './flag.types.js';
|
|
4
|
+
/**
|
|
5
|
+
* The runner's half of a `featureFlag:` declaration.
|
|
6
|
+
*
|
|
7
|
+
* Availability only. Enforcing the capability half here would make a flag a
|
|
8
|
+
* second authorization path that ORs against `scopes:`, and the two would
|
|
9
|
+
* disagree the first time someone widened a flag's `anyOf` to preview it.
|
|
10
|
+
*
|
|
11
|
+
* No source registered is a no-op rather than a closed door: a project that has
|
|
12
|
+
* not wired one yet should not discover it by having every flagged function
|
|
13
|
+
* start throwing.
|
|
14
|
+
*/
|
|
15
|
+
export declare const assertFeatureAvailable: (key: string, featureFlags: FeatureFlagSource | undefined, session: CoreUserSession | undefined, subject?: FlagSubject) => Promise<void>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { FeatureUnavailableError } from '../../errors/errors.js';
|
|
2
|
+
import { resolveFlag } from './resolve-flag.js';
|
|
3
|
+
/**
|
|
4
|
+
* The runner's half of a `featureFlag:` declaration.
|
|
5
|
+
*
|
|
6
|
+
* Availability only. Enforcing the capability half here would make a flag a
|
|
7
|
+
* second authorization path that ORs against `scopes:`, and the two would
|
|
8
|
+
* disagree the first time someone widened a flag's `anyOf` to preview it.
|
|
9
|
+
*
|
|
10
|
+
* No source registered is a no-op rather than a closed door: a project that has
|
|
11
|
+
* not wired one yet should not discover it by having every flagged function
|
|
12
|
+
* start throwing.
|
|
13
|
+
*/
|
|
14
|
+
export const assertFeatureAvailable = async (key, featureFlags, session, subject) => {
|
|
15
|
+
if (!featureFlags) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const config = await featureFlags.snapshot();
|
|
19
|
+
const { available } = resolveFlag(key, undefined, session, config, subject);
|
|
20
|
+
if (!available) {
|
|
21
|
+
throw new FeatureUnavailableError(key);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { FeatureFlagSource } from '../../services/feature-flag-service.js';
|
|
2
|
+
import type { DeclaredFlag, FlagConfigSnapshot } from './flag.types.js';
|
|
3
|
+
export interface CachedFlagSourceOptions {
|
|
4
|
+
/**
|
|
5
|
+
* How long a snapshot is served before it is refreshed, in milliseconds.
|
|
6
|
+
*
|
|
7
|
+
* This is the latency of a kill switch, so it is short. It is not zero
|
|
8
|
+
* because the alternative is a round trip on every call to every flagged
|
|
9
|
+
* function, and a flag system that costs one is a flag system nobody puts on
|
|
10
|
+
* a hot path — which is exactly where a kill switch earns its keep.
|
|
11
|
+
*/
|
|
12
|
+
ttlMs?: number;
|
|
13
|
+
/**
|
|
14
|
+
* The declared flags, used to build the cold-start fallback. Omitted leaves
|
|
15
|
+
* the fallback empty, which resolves every flag as available: a flag absent
|
|
16
|
+
* from a snapshot fails open.
|
|
17
|
+
*/
|
|
18
|
+
declared?: readonly DeclaredFlag[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The caching every flag source needs, so no adapter has to get it right twice.
|
|
22
|
+
*
|
|
23
|
+
* Three layers, in descending order of truth: a fresh read, the last good read,
|
|
24
|
+
* and the compiled declaration. The middle layer is the one that matters —
|
|
25
|
+
* dropping straight to the compiled fallback on a blip would switch on every
|
|
26
|
+
* flag an operator had deliberately left off, which is the opposite of what a
|
|
27
|
+
* dark launch is for. The compiled fallback is reached only on a cold start
|
|
28
|
+
* that has never managed a read, where there is nothing better to say.
|
|
29
|
+
*
|
|
30
|
+
* Refresh is pull-on-demand rather than a background poller on purpose. A
|
|
31
|
+
* poller assumes a long-lived process; an isolate on a serverless runtime is
|
|
32
|
+
* neither long-lived nor allowed to hold a timer between requests, so a vendor
|
|
33
|
+
* SDK built around one either never refreshes or leaks. Fetching inside the
|
|
34
|
+
* request that noticed the snapshot was stale works in both places.
|
|
35
|
+
*/
|
|
36
|
+
export declare abstract class CachedFlagSource implements FeatureFlagSource {
|
|
37
|
+
private cached;
|
|
38
|
+
private cachedAt;
|
|
39
|
+
private inflight;
|
|
40
|
+
/**
|
|
41
|
+
* Bumped by every `invalidate()`. A read that started before the signal
|
|
42
|
+
* arrived carries the generation it started in, and stores nothing if that
|
|
43
|
+
* generation is no longer current — otherwise a webhook that landed
|
|
44
|
+
* mid-fetch would be answered by the pre-webhook snapshot, stamped fresh,
|
|
45
|
+
* and the kill switch would sit stale for another whole TTL.
|
|
46
|
+
*/
|
|
47
|
+
private generation;
|
|
48
|
+
private fallback;
|
|
49
|
+
private declared;
|
|
50
|
+
private readonly ttlMs;
|
|
51
|
+
constructor(options?: CachedFlagSourceOptions);
|
|
52
|
+
/** One read of the backing store. Never called concurrently with itself. */
|
|
53
|
+
protected abstract fetchSnapshot(): Promise<FlagConfigSnapshot>;
|
|
54
|
+
/** Replaces the cold-start fallback, once the declared set is known. */
|
|
55
|
+
protected setDeclared(declared: DeclaredFlag[]): void;
|
|
56
|
+
declaredFlags(): readonly DeclaredFlag[];
|
|
57
|
+
/**
|
|
58
|
+
* Drops the cache, so the next read goes to the store.
|
|
59
|
+
*
|
|
60
|
+
* Public because the signal usually arrives from outside: PostHog and Unleash
|
|
61
|
+
* both emit a webhook on a flag change, and an HTTP wiring that receives one
|
|
62
|
+
* calls this to cut the kill-switch latency from the TTL to delivery time. A
|
|
63
|
+
* LaunchDarkly stream is the same call from a held-open connection rather
|
|
64
|
+
* than a request.
|
|
65
|
+
*
|
|
66
|
+
* It does not fetch. An eager refetch makes a burst of webhooks N round
|
|
67
|
+
* trips, and on a serverless runtime the isolate that received the signal may
|
|
68
|
+
* be gone before anything reads the result. The request that next notices the
|
|
69
|
+
* cache is empty pays for the read, and it is the one that needs it.
|
|
70
|
+
*/
|
|
71
|
+
invalidate(): void;
|
|
72
|
+
snapshot(): Promise<FlagConfigSnapshot>;
|
|
73
|
+
}
|