@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
|
@@ -1,275 +0,0 @@
|
|
|
1
|
-
import { describe, test } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { composeStepProse, renderStepTemplate } from './scenario-prose.js'
|
|
5
|
-
|
|
6
|
-
describe('renderStepTemplate', () => {
|
|
7
|
-
test('substitutes the step input into its placeholders', () => {
|
|
8
|
-
assert.equal(
|
|
9
|
-
renderStepTemplate('sees {packageName}', {
|
|
10
|
-
packageName: '@pikku/addon-stripe',
|
|
11
|
-
}),
|
|
12
|
-
'sees @pikku/addon-stripe'
|
|
13
|
-
)
|
|
14
|
-
})
|
|
15
|
-
|
|
16
|
-
test('renders numbers and booleans as words rather than JSON', () => {
|
|
17
|
-
assert.equal(
|
|
18
|
-
renderStepTemplate('sees at least {atLeast} addons, listed {listed}', {
|
|
19
|
-
atLeast: 10,
|
|
20
|
-
listed: true,
|
|
21
|
-
}),
|
|
22
|
-
'sees at least 10 addons, listed true'
|
|
23
|
-
)
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
test('an absent optional value leaves no gap in the sentence', () => {
|
|
27
|
-
assert.equal(
|
|
28
|
-
renderStepTemplate('sees {packageName} {state}', {
|
|
29
|
-
packageName: '@pikku/addon-stripe',
|
|
30
|
-
}),
|
|
31
|
-
'sees @pikku/addon-stripe'
|
|
32
|
-
)
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
test('a placeholder repeated in the template is substituted each time', () => {
|
|
36
|
-
assert.equal(
|
|
37
|
-
renderStepTemplate('searches {query} and sees {query}', {
|
|
38
|
-
query: 'stripe',
|
|
39
|
-
}),
|
|
40
|
-
'searches stripe and sees stripe'
|
|
41
|
-
)
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
test('a non-primitive value is serialised compactly', () => {
|
|
45
|
-
assert.equal(
|
|
46
|
-
renderStepTemplate('sends {payload}', { payload: { a: 1 } }),
|
|
47
|
-
'sends {"a":1}'
|
|
48
|
-
)
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
test('no recorded input leaves the template legible rather than half-rendered', () => {
|
|
52
|
-
assert.equal(renderStepTemplate('sees {packageName}', undefined), 'sees')
|
|
53
|
-
})
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
describe('composeStepProse', () => {
|
|
57
|
-
test('renders a template against the step input in place of the description', () => {
|
|
58
|
-
assert.equal(
|
|
59
|
-
composeStepProse({
|
|
60
|
-
phase: 'then',
|
|
61
|
-
description: 'sees an addon in the gallery',
|
|
62
|
-
template: 'sees {packageName}',
|
|
63
|
-
input: { packageName: '@pikku/addon-todos' },
|
|
64
|
-
actor: 'admin',
|
|
65
|
-
}),
|
|
66
|
-
'Then admin sees @pikku/addon-todos'
|
|
67
|
-
)
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
test('falls back to the description when the step declares no template', () => {
|
|
71
|
-
assert.equal(
|
|
72
|
-
composeStepProse({
|
|
73
|
-
phase: 'then',
|
|
74
|
-
description: 'sees an addon in the gallery',
|
|
75
|
-
input: { packageName: '@pikku/addon-todos' },
|
|
76
|
-
actor: 'admin',
|
|
77
|
-
}),
|
|
78
|
-
'Then admin sees an addon in the gallery'
|
|
79
|
-
)
|
|
80
|
-
})
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
describe('composeStepProse with an actor role', () => {
|
|
84
|
-
test('the role renders as an apposition after the actor', () => {
|
|
85
|
-
assert.equal(
|
|
86
|
-
composeStepProse({
|
|
87
|
-
phase: 'given',
|
|
88
|
-
description: 'signs in',
|
|
89
|
-
actor: 'yasser',
|
|
90
|
-
actorRole: 'founder',
|
|
91
|
-
}),
|
|
92
|
-
'Given yasser (the founder) signs in'
|
|
93
|
-
)
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
test('no role renders exactly as it did before', () => {
|
|
97
|
-
assert.equal(
|
|
98
|
-
composeStepProse({
|
|
99
|
-
phase: 'given',
|
|
100
|
-
description: 'signs in',
|
|
101
|
-
actor: 'yasser',
|
|
102
|
-
}),
|
|
103
|
-
'Given yasser signs in'
|
|
104
|
-
)
|
|
105
|
-
})
|
|
106
|
-
|
|
107
|
-
test('a role without an actor has nothing to qualify, so it is dropped', () => {
|
|
108
|
-
assert.equal(
|
|
109
|
-
composeStepProse({
|
|
110
|
-
phase: 'then',
|
|
111
|
-
description: 'the receipt totals 4.50',
|
|
112
|
-
actorRole: 'founder',
|
|
113
|
-
}),
|
|
114
|
-
'Then the receipt totals 4.50'
|
|
115
|
-
)
|
|
116
|
-
})
|
|
117
|
-
|
|
118
|
-
test('the role sits inside the padded sentence, not the keyword column', () => {
|
|
119
|
-
assert.equal(
|
|
120
|
-
composeStepProse({
|
|
121
|
-
phase: 'when',
|
|
122
|
-
description: 'opens /app',
|
|
123
|
-
actor: 'nadia',
|
|
124
|
-
actorRole: 'head of ops',
|
|
125
|
-
keywordWidth: 5,
|
|
126
|
-
}),
|
|
127
|
-
'When nadia (the head of ops) opens /app'
|
|
128
|
-
)
|
|
129
|
-
})
|
|
130
|
-
})
|
|
131
|
-
|
|
132
|
-
describe('composeStepProse continuations', () => {
|
|
133
|
-
test('a repeated phase reads as And', () => {
|
|
134
|
-
assert.equal(
|
|
135
|
-
composeStepProse({
|
|
136
|
-
phase: 'given',
|
|
137
|
-
description: 'is invited',
|
|
138
|
-
actor: 'nadia',
|
|
139
|
-
continuesPhase: true,
|
|
140
|
-
}),
|
|
141
|
-
'And nadia is invited'
|
|
142
|
-
)
|
|
143
|
-
})
|
|
144
|
-
|
|
145
|
-
test('the same actor continuing drops the repeated subject', () => {
|
|
146
|
-
assert.equal(
|
|
147
|
-
composeStepProse({
|
|
148
|
-
phase: 'when',
|
|
149
|
-
description: 'sees the audit log',
|
|
150
|
-
actor: 'yasser',
|
|
151
|
-
continuesPhase: true,
|
|
152
|
-
continuesActor: true,
|
|
153
|
-
}),
|
|
154
|
-
'And sees the audit log'
|
|
155
|
-
)
|
|
156
|
-
})
|
|
157
|
-
|
|
158
|
-
test('a new actor keeps their name even under And', () => {
|
|
159
|
-
assert.equal(
|
|
160
|
-
composeStepProse({
|
|
161
|
-
phase: 'given',
|
|
162
|
-
description: 'is invited',
|
|
163
|
-
actor: 'nadia',
|
|
164
|
-
continuesPhase: true,
|
|
165
|
-
continuesActor: false,
|
|
166
|
-
}),
|
|
167
|
-
'And nadia is invited'
|
|
168
|
-
)
|
|
169
|
-
})
|
|
170
|
-
|
|
171
|
-
test('the same actor across a phase change keeps the subject', () => {
|
|
172
|
-
assert.equal(
|
|
173
|
-
composeStepProse({
|
|
174
|
-
phase: 'when',
|
|
175
|
-
description: 'opens the dashboard',
|
|
176
|
-
actor: 'yasser',
|
|
177
|
-
continuesActor: true,
|
|
178
|
-
}),
|
|
179
|
-
'When yasser opens the dashboard'
|
|
180
|
-
)
|
|
181
|
-
})
|
|
182
|
-
|
|
183
|
-
test('an introduction is never dropped by a continuation', () => {
|
|
184
|
-
assert.equal(
|
|
185
|
-
composeStepProse({
|
|
186
|
-
phase: 'given',
|
|
187
|
-
description: 'is invited',
|
|
188
|
-
actor: 'nadia',
|
|
189
|
-
actorRole: 'reviewer',
|
|
190
|
-
continuesPhase: true,
|
|
191
|
-
}),
|
|
192
|
-
'And nadia (the reviewer) is invited'
|
|
193
|
-
)
|
|
194
|
-
})
|
|
195
|
-
})
|
|
196
|
-
|
|
197
|
-
describe('composeStepProse basics', () => {
|
|
198
|
-
test('renders the gherkin keyword, the actor and the description', () => {
|
|
199
|
-
assert.equal(
|
|
200
|
-
composeStepProse({
|
|
201
|
-
phase: 'given',
|
|
202
|
-
description: 'buys an apple',
|
|
203
|
-
actor: 'shopper',
|
|
204
|
-
}),
|
|
205
|
-
'Given shopper buys an apple'
|
|
206
|
-
)
|
|
207
|
-
assert.equal(
|
|
208
|
-
composeStepProse({
|
|
209
|
-
phase: 'then',
|
|
210
|
-
description: 'sees a receipt',
|
|
211
|
-
actor: 'shopper',
|
|
212
|
-
}),
|
|
213
|
-
'Then shopper sees a receipt'
|
|
214
|
-
)
|
|
215
|
-
})
|
|
216
|
-
|
|
217
|
-
test('a persona named after a person reads as that person', () => {
|
|
218
|
-
assert.equal(
|
|
219
|
-
composeStepProse({
|
|
220
|
-
phase: 'when',
|
|
221
|
-
description: 'opens /app',
|
|
222
|
-
actor: 'nadia',
|
|
223
|
-
}),
|
|
224
|
-
'When nadia opens /app'
|
|
225
|
-
)
|
|
226
|
-
})
|
|
227
|
-
|
|
228
|
-
test('an actorless step reads as a plain sentence', () => {
|
|
229
|
-
assert.equal(
|
|
230
|
-
composeStepProse({
|
|
231
|
-
phase: 'given',
|
|
232
|
-
description: 'the app data is reset',
|
|
233
|
-
}),
|
|
234
|
-
'Given the app data is reset'
|
|
235
|
-
)
|
|
236
|
-
})
|
|
237
|
-
|
|
238
|
-
test('every phase renders its keyword', () => {
|
|
239
|
-
assert.equal(
|
|
240
|
-
composeStepProse({
|
|
241
|
-
phase: 'when',
|
|
242
|
-
description: 'refreshes the dashboard',
|
|
243
|
-
actor: 'admin',
|
|
244
|
-
}),
|
|
245
|
-
'When admin refreshes the dashboard'
|
|
246
|
-
)
|
|
247
|
-
})
|
|
248
|
-
|
|
249
|
-
test('a keyword width lines the sentences up under each other', () => {
|
|
250
|
-
const rendered = (
|
|
251
|
-
[
|
|
252
|
-
{ phase: 'given', description: 'buys an apple' },
|
|
253
|
-
{ phase: 'when', description: 'checks out' },
|
|
254
|
-
{ phase: 'then', description: 'sees a receipt' },
|
|
255
|
-
] as const
|
|
256
|
-
).map((step) =>
|
|
257
|
-
composeStepProse({ ...step, actor: 'shopper', keywordWidth: 5 })
|
|
258
|
-
)
|
|
259
|
-
|
|
260
|
-
assert.deepEqual(rendered, [
|
|
261
|
-
'Given shopper buys an apple',
|
|
262
|
-
'When shopper checks out',
|
|
263
|
-
'Then shopper sees a receipt',
|
|
264
|
-
])
|
|
265
|
-
const columns = new Set(rendered.map((line) => line.indexOf('shopper')))
|
|
266
|
-
assert.equal(columns.size, 1, 'every sentence starts in the same column')
|
|
267
|
-
})
|
|
268
|
-
|
|
269
|
-
test('prose degrades to just the description when nothing else is known', () => {
|
|
270
|
-
assert.equal(
|
|
271
|
-
composeStepProse({ phase: 'when', description: 'does the thing' }),
|
|
272
|
-
'When does the thing'
|
|
273
|
-
)
|
|
274
|
-
})
|
|
275
|
-
})
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import type { ScenarioStepPhase } from './scenario-step.types.js'
|
|
2
|
-
|
|
3
|
-
export const renderStepTemplate = (
|
|
4
|
-
template: string,
|
|
5
|
-
input: unknown
|
|
6
|
-
): string => {
|
|
7
|
-
const values =
|
|
8
|
-
input && typeof input === 'object' ? (input as Record<string, unknown>) : {}
|
|
9
|
-
return template
|
|
10
|
-
.replace(/\{(\w+)\}/g, (_match, key: string) => formatValue(values[key]))
|
|
11
|
-
.replace(/\s+/g, ' ')
|
|
12
|
-
.trim()
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
const formatValue = (value: unknown): string => {
|
|
16
|
-
if (value === undefined || value === null) {
|
|
17
|
-
return ''
|
|
18
|
-
}
|
|
19
|
-
if (typeof value === 'object') {
|
|
20
|
-
return JSON.stringify(value)
|
|
21
|
-
}
|
|
22
|
-
return String(value)
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export const composeStepProse = ({
|
|
26
|
-
phase,
|
|
27
|
-
description,
|
|
28
|
-
template,
|
|
29
|
-
input,
|
|
30
|
-
actor,
|
|
31
|
-
actorRole,
|
|
32
|
-
continuesPhase,
|
|
33
|
-
continuesActor,
|
|
34
|
-
keywordWidth,
|
|
35
|
-
}: {
|
|
36
|
-
phase: ScenarioStepPhase
|
|
37
|
-
description: string
|
|
38
|
-
template?: string
|
|
39
|
-
input?: unknown
|
|
40
|
-
actor?: string
|
|
41
|
-
/**
|
|
42
|
-
* What this actor is, rendered as an apposition after their key — "yasser
|
|
43
|
-
* (the founder)". Only pass it where the actor has not been named yet: an
|
|
44
|
-
* ordinary run repeats one actor for a dozen steps, and repeating the role
|
|
45
|
-
* with them turns the one piece of context into the noise around it.
|
|
46
|
-
*/
|
|
47
|
-
actorRole?: string
|
|
48
|
-
/**
|
|
49
|
-
* This step repeats the phase of the one before it, so it reads as `And`
|
|
50
|
-
* rather than saying `Given` three times — the same thing Gherkin does.
|
|
51
|
-
*/
|
|
52
|
-
continuesPhase?: boolean
|
|
53
|
-
/**
|
|
54
|
-
* The step before this one had the same actor. Combined with `continuesPhase`
|
|
55
|
-
* the subject is dropped, because English drops a repeated subject in a
|
|
56
|
-
* compound predicate: "yasser opens the dashboard / and sees the audit log".
|
|
57
|
-
*
|
|
58
|
-
* It takes both. Dropping the subject across a phase change gives "When opens
|
|
59
|
-
* the dashboard", and a pronoun instead of a name would give "they sees",
|
|
60
|
-
* since step templates are authored in the third person singular.
|
|
61
|
-
*/
|
|
62
|
-
continuesActor?: boolean
|
|
63
|
-
keywordWidth?: number
|
|
64
|
-
}): string => {
|
|
65
|
-
const keyword = capitalise(continuesPhase ? 'and' : phase)
|
|
66
|
-
// The actor key is the subject verbatim, with no article in front of it.
|
|
67
|
-
// "the ${actor}" only reads as English when the key happens to be a role
|
|
68
|
-
// noun — it turns a persona named after a person into "the nadia", which
|
|
69
|
-
// is the reporter quietly imposing a naming convention on the author.
|
|
70
|
-
const subject =
|
|
71
|
-
continuesPhase && continuesActor ? '' : composeSubject(actor, actorRole)
|
|
72
|
-
const rendered = template ? renderStepTemplate(template, input) : description
|
|
73
|
-
const sentence = [subject, rendered].filter(Boolean).join(' ')
|
|
74
|
-
if (keywordWidth === undefined) {
|
|
75
|
-
return [keyword, sentence].filter(Boolean).join(' ')
|
|
76
|
-
}
|
|
77
|
-
return `${keyword.padEnd(keywordWidth)} ${sentence}`
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const composeSubject = (actor?: string, actorRole?: string): string => {
|
|
81
|
-
if (!actor) return ''
|
|
82
|
-
return actorRole ? `${actor} (the ${actorRole})` : actor
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
const capitalise = (value: string) =>
|
|
86
|
-
value.charAt(0).toUpperCase() + value.slice(1)
|
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* What one `pikku scenario run` leaves behind.
|
|
3
|
-
*
|
|
4
|
-
* A run is history: the scenarios it selected, the sentences they were made of,
|
|
5
|
-
* and the images and footage they produced. The sentences are snapshotted into
|
|
6
|
-
* the record rather than looked up later, because a scenario is code and the
|
|
7
|
-
* code moves — a run from last week describes a suite that no longer exists,
|
|
8
|
-
* and re-deriving its ladder from today's source would quietly rewrite it.
|
|
9
|
-
*
|
|
10
|
-
* Everything here is plain serialisable data. That is what lets one record be
|
|
11
|
-
* a JSON file on disk in OSS and a row in Postgres on a hosted project, read
|
|
12
|
-
* back by the same console screen either way.
|
|
13
|
-
*/
|
|
14
|
-
import type { ScenarioBrowserFailure } from './scenario-step.types.js'
|
|
15
|
-
|
|
16
|
-
/** What a run filed, in the order it filed it. */
|
|
17
|
-
export type ScenarioArtifactKind = 'screenshot' | 'failure' | 'video'
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* One image or recording a scenario produced.
|
|
21
|
-
*
|
|
22
|
-
* `path` is relative to the run's artifact root and always uses forward
|
|
23
|
-
* slashes: it is a content key, not a filesystem path. Locally it resolves
|
|
24
|
-
* under the run's directory; on a hosted project it is the object key in a
|
|
25
|
-
* bucket, and the same record works unchanged.
|
|
26
|
-
*/
|
|
27
|
-
export interface ScenarioArtifact {
|
|
28
|
-
/** The scenario label this belongs to, as the report names it. */
|
|
29
|
-
scenario: string
|
|
30
|
-
kind: ScenarioArtifactKind
|
|
31
|
-
path: string
|
|
32
|
-
/** Whose window it was — a two-actor scenario produces two of everything. */
|
|
33
|
-
actor?: string
|
|
34
|
-
/** The caption the scenario author took a screenshot under. */
|
|
35
|
-
name?: string
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/** One step of a run, already joined to the prose that declared it. */
|
|
39
|
-
export interface ScenarioStepRow {
|
|
40
|
-
sentence: string
|
|
41
|
-
/**
|
|
42
|
-
* The same sentence with the actor's role in it — "yasser (the founder)
|
|
43
|
-
* signs in". Set only on the step that first names each actor, and only
|
|
44
|
-
* when a persona declares a job title or a role, so a reader who wants the
|
|
45
|
-
* context picks this and one who wants the bare run picks `sentence`.
|
|
46
|
-
*/
|
|
47
|
-
sentenceWithRole?: string
|
|
48
|
-
status: string
|
|
49
|
-
durationMs?: number
|
|
50
|
-
error?: string
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/** Everything known about why one scenario failed. */
|
|
54
|
-
export interface ScenarioFailureDetail {
|
|
55
|
-
/** The rendered sentence of the failing step; absent if no step failed. */
|
|
56
|
-
sentence?: string
|
|
57
|
-
message: string
|
|
58
|
-
stack?: string
|
|
59
|
-
/**
|
|
60
|
-
* True when the failure was a deliberate one (a PikkuError). Its message is
|
|
61
|
-
* the whole story, so the stack is noise.
|
|
62
|
-
*/
|
|
63
|
-
expected?: boolean
|
|
64
|
-
browser?: ScenarioBrowserFailure[]
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export interface ScenarioResult {
|
|
68
|
-
name: string
|
|
69
|
-
status: 'passed' | 'failed'
|
|
70
|
-
durationMs: number
|
|
71
|
-
output?: unknown
|
|
72
|
-
error?: string
|
|
73
|
-
steps?: ScenarioStepRow[]
|
|
74
|
-
failure?: ScenarioFailureDetail
|
|
75
|
-
/** The scenario registration this ran, which the label alone does not give. */
|
|
76
|
-
scenarioName?: string
|
|
77
|
-
/** The feature that grouped it, when one did. */
|
|
78
|
-
feature?: string
|
|
79
|
-
tags?: string[]
|
|
80
|
-
/** Images and footage this scenario produced, filed under the run. */
|
|
81
|
-
artifacts?: ScenarioArtifact[]
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/** One scenario that was not run, and why. */
|
|
85
|
-
export interface ScenarioSkip {
|
|
86
|
-
name: string
|
|
87
|
-
reason: string
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
export interface ScenarioRunReport {
|
|
91
|
-
environment: string
|
|
92
|
-
results: ScenarioResult[]
|
|
93
|
-
/**
|
|
94
|
-
* Scenarios not run at all, each carrying why. A skip is only useful if the
|
|
95
|
-
* reader can tell a browser scenario held back by `--no-browser` from one the
|
|
96
|
-
* project itself quarantined, so the reason travels with the name rather than
|
|
97
|
-
* being assumed by the formatter.
|
|
98
|
-
*/
|
|
99
|
-
skipped: ScenarioSkip[]
|
|
100
|
-
/** Feature-level hook failures, which belong to no single scenario. */
|
|
101
|
-
hookFailures: string[]
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
export type ScenarioRunStatus = 'running' | 'passed' | 'failed'
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* A whole run, as it is stored and read back.
|
|
108
|
-
*
|
|
109
|
-
* `status` is `running` from the moment the run is created until it finishes,
|
|
110
|
-
* so a console watching a run in progress can tell "still going" from "nothing
|
|
111
|
-
* came back" — and a run killed halfway stays `running` forever, which is the
|
|
112
|
-
* honest record of what happened to it.
|
|
113
|
-
*/
|
|
114
|
-
export interface ScenarioRunRecord extends ScenarioRunReport {
|
|
115
|
-
runId: string
|
|
116
|
-
status: ScenarioRunStatus
|
|
117
|
-
/** The surface the run targeted: `default`, `browser`, … */
|
|
118
|
-
surface: string
|
|
119
|
-
startedAt: string
|
|
120
|
-
finishedAt?: string
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/** Enough of a run to list it without loading its steps and stacks. */
|
|
124
|
-
export interface ScenarioRunSummary {
|
|
125
|
-
runId: string
|
|
126
|
-
environment: string
|
|
127
|
-
surface: string
|
|
128
|
-
status: ScenarioRunStatus
|
|
129
|
-
startedAt: string
|
|
130
|
-
finishedAt?: string
|
|
131
|
-
durationMs?: number
|
|
132
|
-
passed: number
|
|
133
|
-
failed: number
|
|
134
|
-
skipped: number
|
|
135
|
-
/** Whether anything is there to watch, so a list can say so without a second read. */
|
|
136
|
-
artifacts: number
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* Where runs are kept.
|
|
141
|
-
*
|
|
142
|
-
* Deliberately not the workflow service: a scenario run is a workflow run under
|
|
143
|
-
* the hood, but its history has a different lifetime, a different audience, and
|
|
144
|
-
* a different home — a JSON file beside the project locally, a project-scoped
|
|
145
|
-
* table and an object store when hosted.
|
|
146
|
-
*
|
|
147
|
-
* Written progressively rather than at the end, so a suite that dies on its
|
|
148
|
-
* fortieth scenario still leaves the thirty-nine behind.
|
|
149
|
-
*/
|
|
150
|
-
export interface ScenarioRunStore {
|
|
151
|
-
/** Open a run. Called before the first scenario, with `status: 'running'`. */
|
|
152
|
-
start(record: ScenarioRunRecord): Promise<void>
|
|
153
|
-
/** Append one finished scenario to an open run. */
|
|
154
|
-
recordScenario(runId: string, result: ScenarioResult): Promise<void>
|
|
155
|
-
/**
|
|
156
|
-
* File the run's artifacts against the scenarios that produced them.
|
|
157
|
-
*
|
|
158
|
-
* Separate from `recordScenario` because a scenario's video does not exist
|
|
159
|
-
* when the scenario ends — it is finalised by the next scenario's reset, and
|
|
160
|
-
* renamed again when the run closes. Artifacts are matched to a result by the
|
|
161
|
-
* label the report knows it under.
|
|
162
|
-
*/
|
|
163
|
-
attachArtifacts(runId: string, artifacts: ScenarioArtifact[]): Promise<void>
|
|
164
|
-
/** Close a run, settling everything only known once every scenario has run. */
|
|
165
|
-
finish(
|
|
166
|
-
runId: string,
|
|
167
|
-
outcome: Pick<
|
|
168
|
-
ScenarioRunRecord,
|
|
169
|
-
'status' | 'finishedAt' | 'skipped' | 'hookFailures'
|
|
170
|
-
>
|
|
171
|
-
): Promise<void>
|
|
172
|
-
/**
|
|
173
|
-
* The bytes of one artifact, by the `path` its record carries.
|
|
174
|
-
*
|
|
175
|
-
* Reading goes through the store because only the store knows where a run's
|
|
176
|
-
* files actually are — a directory beside the project, or an object store
|
|
177
|
-
* behind a bucket. Absent when the run or the path is unknown, which is also
|
|
178
|
-
* the answer for a path that tries to leave the run.
|
|
179
|
-
*
|
|
180
|
-
* The bytes are backed by their own `ArrayBuffer` so they can be handed
|
|
181
|
-
* straight to a `Response` — a view onto a pooled or shared buffer is not a
|
|
182
|
-
* valid body.
|
|
183
|
-
*/
|
|
184
|
-
readArtifact(
|
|
185
|
-
runId: string,
|
|
186
|
-
path: string
|
|
187
|
-
): Promise<{ body: Uint8Array<ArrayBuffer>; contentType: string } | undefined>
|
|
188
|
-
/** Most recent first. */
|
|
189
|
-
list(options?: { limit?: number }): Promise<ScenarioRunSummary[]>
|
|
190
|
-
get(runId: string): Promise<ScenarioRunRecord | undefined>
|
|
191
|
-
/** Forget a run and everything it filed. */
|
|
192
|
-
remove(runId: string): Promise<void>
|
|
193
|
-
}
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
import { describe, test, beforeEach } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { InMemoryWorkflowService } from '../../services/in-memory-workflow-service.js'
|
|
5
|
-
import {
|
|
6
|
-
PikkuScenarioService,
|
|
7
|
-
createScenarioRunner,
|
|
8
|
-
} from './pikku-scenario-service.js'
|
|
9
|
-
import { pikkuState, resetPikkuState } from '../../pikku-state.js'
|
|
10
|
-
|
|
11
|
-
const noopLogger = { error() {}, info() {}, warn() {}, debug() {} }
|
|
12
|
-
|
|
13
|
-
const SCENARIO_MEMBERS = [
|
|
14
|
-
'scenarioStep',
|
|
15
|
-
'runScenarioHook',
|
|
16
|
-
'resolvePersonas',
|
|
17
|
-
'setScenarioBrowserProvider',
|
|
18
|
-
'getScenarioBrowserProvider',
|
|
19
|
-
'setScenarioEnvironment',
|
|
20
|
-
'getScenarioEnvironment',
|
|
21
|
-
]
|
|
22
|
-
|
|
23
|
-
const SCENARIO_WIRE_MEMBERS = [
|
|
24
|
-
'given',
|
|
25
|
-
'when',
|
|
26
|
-
'then',
|
|
27
|
-
'expectEventually',
|
|
28
|
-
'expectError',
|
|
29
|
-
'expectService',
|
|
30
|
-
'runScheduledTask',
|
|
31
|
-
]
|
|
32
|
-
|
|
33
|
-
const setup = async (ws: InMemoryWorkflowService) => {
|
|
34
|
-
pikkuState(null, 'package', 'singletonServices', {
|
|
35
|
-
logger: noopLogger,
|
|
36
|
-
} as any)
|
|
37
|
-
const runId = await ws.createRun('surfaceTest', {}, true, 'hash', {
|
|
38
|
-
type: 'test',
|
|
39
|
-
} as any)
|
|
40
|
-
ws.registerInlineRun(runId)
|
|
41
|
-
return runId
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
describe('the production workflow service carries no scenario surface', () => {
|
|
45
|
-
beforeEach(() => resetPikkuState())
|
|
46
|
-
|
|
47
|
-
test('no scenario method is declared on the workflow service prototype chain', () => {
|
|
48
|
-
const ws = new InMemoryWorkflowService()
|
|
49
|
-
for (const member of SCENARIO_MEMBERS) {
|
|
50
|
-
assert.equal(
|
|
51
|
-
typeof (ws as any)[member],
|
|
52
|
-
'undefined',
|
|
53
|
-
`'${member}' ships in every production bundle while it is a member of PikkuWorkflowService`
|
|
54
|
-
)
|
|
55
|
-
}
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
test('the workflow wire exposes only workflow members', async () => {
|
|
59
|
-
const ws = new InMemoryWorkflowService()
|
|
60
|
-
const runId = await setup(ws)
|
|
61
|
-
const wire = ws.createWorkflowWire('surfaceTest', runId, {}) as any
|
|
62
|
-
|
|
63
|
-
for (const member of SCENARIO_WIRE_MEMBERS) {
|
|
64
|
-
assert.equal(
|
|
65
|
-
typeof wire[member],
|
|
66
|
-
'undefined',
|
|
67
|
-
`wire.${member} is a scenario affordance and must not be built for a production workflow run`
|
|
68
|
-
)
|
|
69
|
-
}
|
|
70
|
-
for (const member of ['do', 'sleep', 'suspend', 'approval', 'getRun']) {
|
|
71
|
-
assert.equal(
|
|
72
|
-
typeof wire[member],
|
|
73
|
-
'function',
|
|
74
|
-
`wire.${member} is a workflow member and must survive`
|
|
75
|
-
)
|
|
76
|
-
}
|
|
77
|
-
})
|
|
78
|
-
|
|
79
|
-
test('a service with no extension installed runs a plain workflow untouched', async () => {
|
|
80
|
-
const ws = new InMemoryWorkflowService()
|
|
81
|
-
assert.equal(ws.getRunExtension(), undefined)
|
|
82
|
-
const runId = await setup(ws)
|
|
83
|
-
const wire = ws.createWorkflowWire('surfaceTest', runId, {}) as any
|
|
84
|
-
assert.equal(typeof wire.do, 'function')
|
|
85
|
-
})
|
|
86
|
-
|
|
87
|
-
test('the actor client is not reachable from the workflow service module graph', async () => {
|
|
88
|
-
const { readFileSync } = await import('node:fs')
|
|
89
|
-
const source = readFileSync(
|
|
90
|
-
new URL('./pikku-workflow-service.ts', import.meta.url),
|
|
91
|
-
'utf8'
|
|
92
|
-
)
|
|
93
|
-
assert.ok(
|
|
94
|
-
!source.includes('http-personas'),
|
|
95
|
-
'PikkuWorkflowService must not reference the HTTP actor client — it pulls the AI persona loop into every bundle'
|
|
96
|
-
)
|
|
97
|
-
})
|
|
98
|
-
})
|
|
99
|
-
|
|
100
|
-
describe('PikkuScenarioService carries the scenario surface', () => {
|
|
101
|
-
beforeEach(() => resetPikkuState())
|
|
102
|
-
|
|
103
|
-
test('every scenario method is declared on the scenario service', () => {
|
|
104
|
-
const { scenarioService } = createScenarioRunner()
|
|
105
|
-
for (const member of SCENARIO_MEMBERS) {
|
|
106
|
-
assert.equal(
|
|
107
|
-
typeof (scenarioService as any)[member],
|
|
108
|
-
'function',
|
|
109
|
-
`PikkuScenarioService is missing '${member}'`
|
|
110
|
-
)
|
|
111
|
-
}
|
|
112
|
-
})
|
|
113
|
-
|
|
114
|
-
test('the wire it decorates carries both the workflow and the scenario members', async () => {
|
|
115
|
-
const { workflowService: ws } = createScenarioRunner()
|
|
116
|
-
const runId = await setup(ws)
|
|
117
|
-
const wire = ws.createWorkflowWire('surfaceTest', runId, {}) as any
|
|
118
|
-
|
|
119
|
-
for (const member of [
|
|
120
|
-
...SCENARIO_WIRE_MEMBERS,
|
|
121
|
-
'do',
|
|
122
|
-
'sleep',
|
|
123
|
-
'approval',
|
|
124
|
-
]) {
|
|
125
|
-
assert.equal(
|
|
126
|
-
typeof wire[member],
|
|
127
|
-
'function',
|
|
128
|
-
`PikkuScenarioService's wire is missing ${member}`
|
|
129
|
-
)
|
|
130
|
-
}
|
|
131
|
-
})
|
|
132
|
-
|
|
133
|
-
test('it is not a workflow service, so it cannot be registered as one by mistake', () => {
|
|
134
|
-
const { scenarioService } = createScenarioRunner()
|
|
135
|
-
assert.ok(!(scenarioService instanceof InMemoryWorkflowService))
|
|
136
|
-
assert.equal(
|
|
137
|
-
typeof (scenarioService as any).startWorkflow,
|
|
138
|
-
'undefined',
|
|
139
|
-
'the scenario capability is layered onto a run, it does not own one'
|
|
140
|
-
)
|
|
141
|
-
})
|
|
142
|
-
|
|
143
|
-
test('the runner installs it as the workflow service extension', () => {
|
|
144
|
-
const { workflowService, scenarioService } = createScenarioRunner()
|
|
145
|
-
assert.equal(workflowService.getRunExtension(), scenarioService)
|
|
146
|
-
})
|
|
147
|
-
})
|