@pikku/core 0.12.107 → 0.12.112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +357 -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/dev/hot-reload.d.ts +0 -1
- package/dist/dev/hot-reload.js +4 -25
- package/dist/dev/module-runner.js +104 -25
- 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/knowledge/decisions/internals/a-reset-suite-makes-the-dev-seed-the-fixture.md +50 -0
- package/knowledge/decisions/internals/hot-reload-reads-the-changed-source-never-a-compiled-copy.md +38 -0
- package/knowledge/decisions/internals/index.md +2 -0
- 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,103 @@
|
|
|
1
|
+
const SEPARATOR = ':';
|
|
2
|
+
/**
|
|
3
|
+
* Names that already exist on every object literal. Declaring one makes the
|
|
4
|
+
* meta lookup below find `Object.prototype`'s member, treat the flag as
|
|
5
|
+
* already declared, and drop it — a flag that validated but never reached the
|
|
6
|
+
* snapshot, which is the one failure a typed flag key exists to prevent.
|
|
7
|
+
*/
|
|
8
|
+
const INHERITED_NAMES = new Set(['__proto__', 'constructor', 'prototype']);
|
|
9
|
+
const assertFlagName = (name) => {
|
|
10
|
+
if (name.length === 0) {
|
|
11
|
+
throw new Error('A feature flag is declared with an empty name.');
|
|
12
|
+
}
|
|
13
|
+
if (INHERITED_NAMES.has(name)) {
|
|
14
|
+
throw new Error(`Feature flag '${name}' is named after a property every object already ` +
|
|
15
|
+
`carries, so it cannot be told apart from one. Pick another name.`);
|
|
16
|
+
}
|
|
17
|
+
if (name.includes(SEPARATOR)) {
|
|
18
|
+
throw new Error(`Feature flag '${name}' contains the '${SEPARATOR}' separator. ` +
|
|
19
|
+
`'${SEPARATOR}' delimits scope ids; a flag named like a scope reads as one.`);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* The declared flags as a flat list, deduplicated by name.
|
|
24
|
+
*
|
|
25
|
+
* A flag may legitimately be declared more than once — an addon and its host
|
|
26
|
+
* app both contributing one — and
|
|
27
|
+
* {@link validateAndBuildFeatureFlagDefinitionsMeta} has already guaranteed
|
|
28
|
+
* those declarations are identical.
|
|
29
|
+
*/
|
|
30
|
+
export const flattenFeatureFlagDefinitions = (definitions) => {
|
|
31
|
+
const seen = new Set();
|
|
32
|
+
const out = [];
|
|
33
|
+
for (const def of definitions) {
|
|
34
|
+
if (seen.has(def.name)) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
seen.add(def.name);
|
|
38
|
+
out.push({
|
|
39
|
+
name: def.name,
|
|
40
|
+
description: def.description,
|
|
41
|
+
anyOf: def.anyOf ? [...def.anyOf] : undefined,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Validates declared flags and keys them by name.
|
|
48
|
+
*
|
|
49
|
+
* Definitions sharing a name must name the same scope set; a conflicting
|
|
50
|
+
* redeclaration is a hard error naming both source files. Order within `anyOf`
|
|
51
|
+
* is not significant.
|
|
52
|
+
*/
|
|
53
|
+
export function validateAndBuildFeatureFlagDefinitionsMeta(definitions) {
|
|
54
|
+
const meta = {};
|
|
55
|
+
for (const def of definitions) {
|
|
56
|
+
assertFlagName(def.name);
|
|
57
|
+
if (def.anyOf && def.anyOf.length === 0) {
|
|
58
|
+
throw new Error(`Feature flag '${def.name}' declares 'anyOf: []'. ` +
|
|
59
|
+
`An empty list satisfies nobody, which is never what is meant: ` +
|
|
60
|
+
`omit 'anyOf' for a pure switch, or name the scopes that reveal it.`);
|
|
61
|
+
}
|
|
62
|
+
const existing = meta[def.name];
|
|
63
|
+
if (existing) {
|
|
64
|
+
const sameScopes = JSON.stringify([...(existing.anyOf ?? [])].sort()) ===
|
|
65
|
+
JSON.stringify([...(def.anyOf ?? [])].sort());
|
|
66
|
+
if (!sameScopes) {
|
|
67
|
+
throw new Error(`Feature flag '${def.name}' is declared with different scopes.\n` +
|
|
68
|
+
` First declaration: ${existing.sourceFile ?? 'unknown'}\n` +
|
|
69
|
+
` Second declaration: ${def.sourceFile ?? 'unknown'}\n` +
|
|
70
|
+
`Flags sharing a name must name the same scopes.`);
|
|
71
|
+
}
|
|
72
|
+
// The description is what an operator reads beside the switch, and the
|
|
73
|
+
// winner here is whichever file the inspector walked first. Two
|
|
74
|
+
// descriptions for one flag is a disagreement about what the switch
|
|
75
|
+
// does, and source order is not the thing that should settle it.
|
|
76
|
+
if (existing.description !== def.description) {
|
|
77
|
+
throw new Error(`Feature flag '${def.name}' is declared with different descriptions.\n` +
|
|
78
|
+
` First declaration: ${existing.sourceFile ?? 'unknown'}\n` +
|
|
79
|
+
` Second declaration: ${def.sourceFile ?? 'unknown'}\n` +
|
|
80
|
+
`Flags sharing a name must describe the same thing.`);
|
|
81
|
+
}
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
meta[def.name] = {
|
|
85
|
+
name: def.name,
|
|
86
|
+
description: def.description,
|
|
87
|
+
anyOf: def.anyOf ? [...def.anyOf] : undefined,
|
|
88
|
+
sourceFile: def.sourceFile,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return meta;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* The snapshot a flag source falls back to when its store cannot be read: every
|
|
95
|
+
* declared flag on, no rollout, no overrides.
|
|
96
|
+
*
|
|
97
|
+
* This is the compiled declaration, not a database read — putting a fallback
|
|
98
|
+
* query on the request path is how a slow store becomes a slow product.
|
|
99
|
+
*/
|
|
100
|
+
export const compiledFallbackSnapshot = (flags) => Object.fromEntries(flags.map((flag) => [
|
|
101
|
+
flag.name,
|
|
102
|
+
{ enabled: true, rolloutPercent: null, overrides: {} },
|
|
103
|
+
]));
|
|
@@ -38,9 +38,9 @@ export declare const VIRTUAL_USER_VARIABLES: {
|
|
|
38
38
|
* and a server that cannot name its own public URL would be signing in
|
|
39
39
|
* somewhere it only assumed was itself.
|
|
40
40
|
*/
|
|
41
|
-
readonly apiUrl:
|
|
42
|
-
readonly secret:
|
|
43
|
-
readonly model:
|
|
41
|
+
readonly apiUrl: 'VIRTUAL_USER_API_URL';
|
|
42
|
+
readonly secret: 'SCENARIO_ACTOR_SECRET';
|
|
43
|
+
readonly model: 'VIRTUAL_USER_MODEL';
|
|
44
44
|
/**
|
|
45
45
|
* The same two variables a scenario run reads, because a virtual user signs
|
|
46
46
|
* in and calls through exactly the doors a scenario does. An app that mounts
|
|
@@ -48,15 +48,15 @@ export declare const VIRTUAL_USER_VARIABLES: {
|
|
|
48
48
|
* other way to say so, and without them the run signs in against a 404 and
|
|
49
49
|
* spends its whole budget thinking about why nothing works.
|
|
50
50
|
*/
|
|
51
|
-
readonly signInPath:
|
|
52
|
-
readonly rpcPath:
|
|
51
|
+
readonly signInPath: 'SCENARIO_SIGN_IN_PATH';
|
|
52
|
+
readonly rpcPath: 'SCENARIO_RPC_PATH';
|
|
53
53
|
/**
|
|
54
54
|
* The deployed way in. A Fabric operator token is asymmetric — a stage can
|
|
55
55
|
* verify one and can never mint one — so unlike the actor secret it is safe
|
|
56
56
|
* for a run against a real environment. Read from the environment only as the
|
|
57
57
|
* fallback for a run nobody handed a token to, which is what a schedule is.
|
|
58
58
|
*/
|
|
59
|
-
readonly operatorToken:
|
|
59
|
+
readonly operatorToken: 'FABRIC_OPERATOR_TOKEN';
|
|
60
60
|
};
|
|
61
61
|
/**
|
|
62
62
|
* Which door under the auth mount, given the credential in hand.
|
|
@@ -66,7 +66,7 @@ export declare const VIRTUAL_USER_VARIABLES: {
|
|
|
66
66
|
* to `/api/auth` says so once and both paths follow. A path that names neither
|
|
67
67
|
* plugin is left alone, since it was configured deliberately.
|
|
68
68
|
*/
|
|
69
|
-
export declare const signInPathFor: (configured: string | undefined, plugin:
|
|
69
|
+
export declare const signInPathFor: (configured: string | undefined, plugin: 'actor' | 'fabric') => string | undefined;
|
|
70
70
|
/**
|
|
71
71
|
* The declared persona behind an id, refused unless it is one a run may be.
|
|
72
72
|
*
|
|
@@ -130,7 +130,7 @@ export declare const serializeVirtualUserRun: (run: VirtualUserRunRecord) => {
|
|
|
130
130
|
persona: string;
|
|
131
131
|
disposition: VirtualUserDisposition;
|
|
132
132
|
seed: number;
|
|
133
|
-
status: "
|
|
133
|
+
status: "completed" | "failed" | "running";
|
|
134
134
|
goals: string[];
|
|
135
135
|
memory: Record<string, string>;
|
|
136
136
|
findings: {
|
|
@@ -31,7 +31,7 @@ export declare const isDue: (schedule: VirtualUserScheduleRecord, now: Date) =>
|
|
|
31
31
|
* than rejected, because a schedule is configuration and a swapped pair is a
|
|
32
32
|
* typo, not an attack.
|
|
33
33
|
*/
|
|
34
|
-
export declare const nextRunAt: (schedule: Pick<VirtualUserScheduleRecord,
|
|
34
|
+
export declare const nextRunAt: (schedule: Pick<VirtualUserScheduleRecord, 'minIntervalMs' | 'maxIntervalMs'>, now: Date, random: () => number) => Date;
|
|
35
35
|
export type VirtualUserSkipReason = 'in-flight' | 'dispatch-failed' | 'claimed-elsewhere';
|
|
36
36
|
export interface VirtualUserTickResult {
|
|
37
37
|
dispatched: {
|
|
@@ -21,6 +21,6 @@ export declare const stepWorkerQueueName: (strategy: WorkflowQueueStrategy, rpcN
|
|
|
21
21
|
* every step dispatch would pay for that — only a step that names a workflow
|
|
22
22
|
* and has a queue to reach ever asks.
|
|
23
23
|
*/
|
|
24
|
-
export declare const stepDispatchTarget: (rpcName: string, stepName: string, parentIsInline: () => Promise<boolean>) => Promise<
|
|
24
|
+
export declare const stepDispatchTarget: (rpcName: string, stepName: string, parentIsInline: () => Promise<boolean>) => Promise<'queue' | 'inline'>;
|
|
25
25
|
export declare const jobGroupFor: (strategy: WorkflowQueueStrategy, id?: string) => JobGroup | undefined;
|
|
26
26
|
export declare const stepJobOptions: (stepOptions?: WorkflowStepOptions) => JobOptions;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: decision
|
|
3
|
+
title: With scenarios.reset on, the dev seed is the fixture every assertion is written against
|
|
4
|
+
description: The rollback restores the database as the suite found it, so seed rows are the shared baseline — which makes an absolute date in the seed a test that expires
|
|
5
|
+
tags: cli, scenarios
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# A reset suite makes the dev seed the fixture
|
|
9
|
+
|
|
10
|
+
`scenarios.reset` takes a copy of every table when the suite starts and restores
|
|
11
|
+
that copy between scenarios. It is a snapshot-and-restore, not a
|
|
12
|
+
truncate-and-reseed: nothing replays the seed file, and nothing regenerates its
|
|
13
|
+
rows.
|
|
14
|
+
|
|
15
|
+
Two things follow, and both are easy to get wrong.
|
|
16
|
+
|
|
17
|
+
**The seed is the fixture.** Before a reset was available, a project usually had
|
|
18
|
+
a hand-rolled reset RPC that wiped and re-created the handful of rows its
|
|
19
|
+
scenarios touched. That RPC was the fixture and the seed was scenery. With the
|
|
20
|
+
rollback on, the whole seed is in scope — every booking, invoice and event a
|
|
21
|
+
developer put there for their own convenience is now a row some scenario can
|
|
22
|
+
count. Assertions written as counts against the old narrow fixture go wrong the
|
|
23
|
+
moment the baseline widens.
|
|
24
|
+
|
|
25
|
+
**A date literal in the seed expires.** A seed is applied once, and from then on
|
|
26
|
+
the restore keeps handing back the same rows. Write `'2026-03-14'` and the
|
|
27
|
+
fixture is correct on the day it was written and quietly wrong a month later —
|
|
28
|
+
the booking that was supposed to be upcoming is in the past, and the scenario
|
|
29
|
+
that asserts on it fails for a reason that has nothing to do with the code. Seed
|
|
30
|
+
dates belong relative to the moment the seed is applied:
|
|
31
|
+
|
|
32
|
+
```sql
|
|
33
|
+
INSERT INTO booking (id, starts_at, ends_at) VALUES
|
|
34
|
+
('b_upcoming', date('now', '+200 days'), date('now', '+207 days')),
|
|
35
|
+
('b_ended', date('now', '-8 days'), date('now', '-1 days'));
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
`date('now', ...)` in sqlite, `now() + interval '200 days'` in postgres. Pick the
|
|
39
|
+
offsets so each row sits unambiguously on the side of whatever boundary the
|
|
40
|
+
scenarios test, rather than a day away from it.
|
|
41
|
+
|
|
42
|
+
There is a third limit worth stating plainly: the baseline is the database _as
|
|
43
|
+
the suite starts_, so it is not a pristine seed. Run N+1 inherits whatever run N
|
|
44
|
+
left behind. A value that must be unique in the database — an invoice number, a
|
|
45
|
+
reference code — has to be scoped to the run, not hard-coded, or the second run
|
|
46
|
+
collides with the first.
|
|
47
|
+
|
|
48
|
+
**What this rules out:** treating the reset as "the suite starts from the seed
|
|
49
|
+
every time". It starts from wherever the database was, and keeps returning
|
|
50
|
+
there.
|
package/knowledge/decisions/internals/hot-reload-reads-the-changed-source-never-a-compiled-copy.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: decision
|
|
3
|
+
title: Hot reload reads the changed source, never a compiled copy of it
|
|
4
|
+
description: A leftover .js beside a .ts made the reloader announce a reload while re-registering the previous implementation; project TypeScript is now compiled by the reloader itself
|
|
5
|
+
tags: core, dev
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Hot reload reads the changed source, never a compiled copy of it
|
|
9
|
+
|
|
10
|
+
The reloader watches `.ts` files and runs the file that changed. It used to
|
|
11
|
+
look for a compiled `.js` first — `<outDir>/dist/<rel>.js`, then the sibling
|
|
12
|
+
`<file>.js` — and import the source only when neither existed.
|
|
13
|
+
|
|
14
|
+
`pikku dev` compiles nothing. Every one of those `.js` files is a leftover from
|
|
15
|
+
an earlier `tsc`, `pikku dist` or bundler run, so reading one re-registered the
|
|
16
|
+
implementation the developer had just replaced and logged `Hot-reloaded: <fn>`
|
|
17
|
+
over the top of it. The log line reads as confirmation, so the change looks
|
|
18
|
+
applied and wrong rather than unapplied — which is the expensive way round
|
|
19
|
+
(#1721).
|
|
20
|
+
|
|
21
|
+
The lookup was a leftover of the first implementation, which imported raw file
|
|
22
|
+
content through a `data:` URL and genuinely could not handle TypeScript. The
|
|
23
|
+
module runner has transpiled with esbuild since, so the source was loadable all
|
|
24
|
+
along and the compiled candidates could only ever supply stale code.
|
|
25
|
+
|
|
26
|
+
Loading the source means the reloader also owns resolution. `require('./x.js')`
|
|
27
|
+
where only `x.ts` exists is what every relative import in a TypeScript project
|
|
28
|
+
looks like, and node's `require` has no `.js → .ts` rewrite. Resolution goes
|
|
29
|
+
through the host first — so packages bind to the instance the rest of the
|
|
30
|
+
process holds and `wire*` side effects mutate live state — and a resolved
|
|
31
|
+
TypeScript file outside `node_modules` is then compiled by the reloader rather
|
|
32
|
+
than handed back, because both node and Bun cache what they load and a helper
|
|
33
|
+
edited alongside its caller would otherwise keep answering with the copy loaded
|
|
34
|
+
at startup. That cache is scoped to a single reload for the same reason.
|
|
35
|
+
|
|
36
|
+
**What this rules out:** reintroducing a compiled-output lookup as a
|
|
37
|
+
"performance" shortcut, and letting the host load project `.ts` dependencies so
|
|
38
|
+
reloads inherit its module cache.
|
|
@@ -12,6 +12,7 @@ caller is entitled to assume.
|
|
|
12
12
|
<!-- pikku:knowledge-index -->
|
|
13
13
|
|
|
14
14
|
- [A non-streaming agent run registers with aiRunState on the same terms as a streaming one](a-non-streaming-agent-run-registers-with-airunstate-too.md) — Otherwise interruptAIAgent finds the run, passes the ownership check, then cannot stop it — and reports that as if the run were on another host
|
|
15
|
+
- [With scenarios.reset on, the dev seed is the fixture every assertion is written against](a-reset-suite-makes-the-dev-seed-the-fixture.md) — The rollback restores the database as the suite found it, so seed rows are the shared baseline — which makes an absolute date in the seed a test that expires
|
|
15
16
|
- [A resumed turn is as interruptible as the first one](a-resumed-agent-turn-is-as-interruptible-as-the-first.md) — It is the same person listening to the same voice, and after an approval it is where most of the reply actually gets spoken
|
|
16
17
|
- [A scenario step's prose template is offered to a virtual user unfilled](a-scenario-step-template-is-offered-unfilled.md) — A reporter fills placeholders from a run that happened; there is no run yet, and the filled form would answer the question the user is there to answer
|
|
17
18
|
- [A secret that fails to decrypt fails the whole read](a-secret-that-fails-to-decrypt-fails-the-whole-read.md) — getSecrets throws naming the key and its key_version rather than omitting the row, because a silent omission surfaces as an unrelated failure much later
|
|
@@ -73,6 +74,7 @@ caller is entitled to assume.
|
|
|
73
74
|
- [Gateway webhook challenges echo bytes not JSON](gateway-webhook-challenges-echo-bytes-not-json.md) — String verification challenges are returned raw with returnsJSON false, because platforms byte-compare the echo and JSON quoting fails the handshake
|
|
74
75
|
- [Gateway wiring is a meta-wiring over HTTP and channels](gateway-wiring-is-a-meta-wiring-over-http-and-channels.md) — wireGateway writes handler implementations into the HTTP and channel state directly while the inspector compiles the corresponding meta, so runtime registration deliberately writes no meta
|
|
75
76
|
- [Generated src paths in pikku meta are absolute](generated-src-paths-in-pikku-meta-are-absolute.md) — emailsMeta.src is resolved by the CLI at generation time, so reading through the project-relative helpers produces a wrong compound path
|
|
77
|
+
- [Hot reload reads the changed source, never a compiled copy of it](hot-reload-reads-the-changed-source-never-a-compiled-copy.md) — A leftover .js beside a .ts made the reloader announce a reload while re-registering the previous implementation; project TypeScript is now compiled by the reloader itself
|
|
76
78
|
- [Hot reload writes into the function map captured at startup, not pikkuState's current one](hot-reload-writes-into-the-function-map-captured-at-startup.md) — A dev-server watcher may have swapped in a codegen-scoped map whose writes are discarded on restore, and schemas are deliberately left alone
|
|
77
79
|
- [HTTP request bodies are read once and shared between consumers](http-request-bodies-are-read-once-and-shared.md) — The fetch request wrapper memoises the single-use body and builds web Requests lazily, at the cost of holding the whole body in memory
|
|
78
80
|
- [HTTP route groups cascade config in a fixed, per-field order](http-route-groups-cascade-config-in-a-fixed-order.md) — basePath concatenates, tags and middleware merge outward-in, auth is overridden by the innermost group
|
package/package.json
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pikku/core",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.112",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "git+https://github.com/pikkujs/pikku.git",
|
|
7
|
+
"directory": "packages/core"
|
|
8
|
+
},
|
|
4
9
|
"description": "The Pikku runtime — functions, wirings, services, middleware and types",
|
|
5
10
|
"author": "yasser.fadl@gmail.com",
|
|
6
11
|
"license": "MIT",
|
|
@@ -13,7 +18,7 @@
|
|
|
13
18
|
"test": "bash run-tests.sh",
|
|
14
19
|
"test:watch": "bash run-tests.sh --watch",
|
|
15
20
|
"test:coverage": "bash run-tests.sh --coverage",
|
|
16
|
-
"prepublishOnly": "
|
|
21
|
+
"prepublishOnly": "bun run build",
|
|
17
22
|
"api-report": "tsx scripts/generate-api-report.mts"
|
|
18
23
|
},
|
|
19
24
|
"sideEffects": [
|
|
@@ -51,6 +56,7 @@
|
|
|
51
56
|
"./mcp": "./dist/wirings/mcp/index.js",
|
|
52
57
|
"./agent": "./dist/wirings/agent/index.js",
|
|
53
58
|
"./agent-scorer": "./dist/wirings/agent-scorer/index.js",
|
|
59
|
+
"./analytics": "./dist/analytics/index.js",
|
|
54
60
|
"./gateway": "./dist/wirings/gateway/index.js",
|
|
55
61
|
"./cli": "./dist/wirings/cli/index.js",
|
|
56
62
|
"./cli/command-parser": "./dist/wirings/cli/command-parser.js",
|
|
@@ -65,6 +71,7 @@
|
|
|
65
71
|
"./oauth2": "./dist/wirings/oauth2/index.js",
|
|
66
72
|
"./errors": "./dist/errors/index.js",
|
|
67
73
|
"./services": "./dist/services/index.js",
|
|
74
|
+
"./flag": "./dist/wirings/flag/index.js",
|
|
68
75
|
"./services/local-meta": "./dist/services/meta-service.js",
|
|
69
76
|
"./services/v8-coverage": "./dist/services/v8-coverage-service.js",
|
|
70
77
|
"./services/istanbul-coverage": "./dist/services/istanbul-coverage-service.js",
|
|
@@ -92,10 +99,9 @@
|
|
|
92
99
|
"@ag-ui/core": "0.0.57",
|
|
93
100
|
"@types/node": "^24.13.3",
|
|
94
101
|
"esbuild": "~0.28.2",
|
|
95
|
-
"tsx": "^4.23.12"
|
|
96
|
-
"typescript": "^6.0.3"
|
|
102
|
+
"tsx": "^4.23.12"
|
|
97
103
|
},
|
|
98
104
|
"engines": {
|
|
99
105
|
"node": ">=24"
|
|
100
106
|
}
|
|
101
|
-
}
|
|
107
|
+
}
|
package/run-tests.sh
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
|
|
3
|
-
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
4
|
-
cd "$script_dir"
|
|
5
|
-
|
|
6
3
|
# Enable nullglob to handle cases where no files match the pattern
|
|
7
4
|
shopt -s nullglob
|
|
8
5
|
|
|
@@ -43,18 +40,29 @@ if [ ${#files[@]} -eq 0 ]; then
|
|
|
43
40
|
exit 0
|
|
44
41
|
fi
|
|
45
42
|
|
|
46
|
-
# Construct the
|
|
47
|
-
|
|
43
|
+
# Construct the bun command
|
|
44
|
+
#
|
|
45
|
+
# --parallel gives every test file its own worker process, which is what node's
|
|
46
|
+
# `--test` did. Several suites keep module-level caches (a TypeScript program, a
|
|
47
|
+
# temp fixture directory) that a shared process would leak between files.
|
|
48
|
+
#
|
|
49
|
+
# --timeout because bun caps a test at 5s by default where node had no cap, and
|
|
50
|
+
# the suites that build real TypeScript programs run well past that.
|
|
51
|
+
bun_cmd=(bun test --parallel --timeout 120000)
|
|
48
52
|
|
|
49
53
|
# Append options based on flags
|
|
50
54
|
if [ "$watch_mode" = true ]; then
|
|
51
|
-
|
|
55
|
+
# --watch reruns in one process; parallel workers have nothing to watch.
|
|
56
|
+
bun_cmd=(bun test --watch --timeout 120000)
|
|
52
57
|
fi
|
|
53
58
|
|
|
54
59
|
if [ "$coverage_mode" = true ]; then
|
|
55
|
-
|
|
60
|
+
# --coverage-dir=. keeps lcov.info at the package root: CI merges every
|
|
61
|
+
# package's report by prefixing its SF paths with the file's own directory,
|
|
62
|
+
# so a nested coverage/ directory would re-root them one level too deep.
|
|
63
|
+
bun_cmd+=(--coverage --coverage-reporter=lcov --coverage-reporter=text --coverage-dir=.)
|
|
56
64
|
export PIKKU_TEST_COVERAGE=1
|
|
57
65
|
fi
|
|
58
66
|
|
|
59
|
-
# Execute the
|
|
60
|
-
"${
|
|
67
|
+
# Execute the bun command with the expanded list of files
|
|
68
|
+
"${bun_cmd[@]}" "${files[@]}"
|
package/src/public-surface.json
CHANGED
|
@@ -350,6 +350,7 @@
|
|
|
350
350
|
"BadRequestError",
|
|
351
351
|
"ConflictError",
|
|
352
352
|
"ExpectationFailedError",
|
|
353
|
+
"FeatureUnavailableError",
|
|
353
354
|
"ForbiddenError",
|
|
354
355
|
"GatewayTimeoutError",
|
|
355
356
|
"GoneError",
|
|
@@ -449,6 +450,19 @@
|
|
|
449
450
|
"verifyActorSecret",
|
|
450
451
|
"withoutSecrets"
|
|
451
452
|
],
|
|
453
|
+
"./flag": [
|
|
454
|
+
"CachedFlagSource",
|
|
455
|
+
"assertFeatureAvailable",
|
|
456
|
+
"bucketOf",
|
|
457
|
+
"compiledFallbackSnapshot",
|
|
458
|
+
"defineFeatureFlags",
|
|
459
|
+
"flattenFeatureFlagDefinitions",
|
|
460
|
+
"resolveFlag",
|
|
461
|
+
"resolveFlagForClient",
|
|
462
|
+
"resolveFlagsForClient",
|
|
463
|
+
"subjectIdOf",
|
|
464
|
+
"validateAndBuildFeatureFlagDefinitionsMeta"
|
|
465
|
+
],
|
|
452
466
|
"./services/local-meta": [
|
|
453
467
|
"LocalMetaService"
|
|
454
468
|
],
|
|
@@ -549,5 +563,17 @@
|
|
|
549
563
|
"pikkuDevReloader",
|
|
550
564
|
"reconcileAddonRegistry",
|
|
551
565
|
"reloadGeneratedMeta"
|
|
566
|
+
],
|
|
567
|
+
"./analytics": [
|
|
568
|
+
"LoggerAnalyticsService",
|
|
569
|
+
"anonymousAnalyticsIdentity",
|
|
570
|
+
"composeAnalyticsIdentity",
|
|
571
|
+
"cookieAnalyticsIdentity",
|
|
572
|
+
"createInvocationAnalytics",
|
|
573
|
+
"defineAnalyticsEvents",
|
|
574
|
+
"fanOutAnalytics",
|
|
575
|
+
"flattenAnalyticsEvent",
|
|
576
|
+
"mintCookie",
|
|
577
|
+
"randomDigits"
|
|
552
578
|
]
|
|
553
579
|
}
|
package/src/agent-naming.test.ts
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { describe, test } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
import { readFileSync } from 'node:fs'
|
|
4
|
-
import { fileURLToPath } from 'node:url'
|
|
5
|
-
import { join, dirname } from 'node:path'
|
|
6
|
-
|
|
7
|
-
const packageRoot = join(dirname(fileURLToPath(import.meta.url)), '..')
|
|
8
|
-
const reportPath = join(packageRoot, 'api-report.md')
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* `AI` described the model provider, never the agent runtime, so #596 renamed
|
|
12
|
-
* every agent symbol to `Agent`. The names below are the ones that survived,
|
|
13
|
-
* because each really does wrap a provider call.
|
|
14
|
-
*
|
|
15
|
-
* Listing them here is what makes the rule checkable: anything else exported as
|
|
16
|
-
* `AI*` is a symbol that slipped back to the old naming, and this fails rather
|
|
17
|
-
* than letting it reach a consumer.
|
|
18
|
-
*/
|
|
19
|
-
const PROVIDER_SYMBOLS = new Set([
|
|
20
|
-
'AIEmbeddingService',
|
|
21
|
-
'AIEmbedManyParams',
|
|
22
|
-
'AIEmbedManyResult',
|
|
23
|
-
'AIEmbedParams',
|
|
24
|
-
'AIEmbedResult',
|
|
25
|
-
'AIGenerateImageParams',
|
|
26
|
-
'AIGenerateImagePrompt',
|
|
27
|
-
'AIGenerateImageResult',
|
|
28
|
-
'AIGenerateSpeechParams',
|
|
29
|
-
'AIGenerateSpeechResult',
|
|
30
|
-
'AIProviderAuthError',
|
|
31
|
-
'AIProviderNotConfiguredError',
|
|
32
|
-
'AIProviderOptions',
|
|
33
|
-
'AIRerankParams',
|
|
34
|
-
'AIRerankResult',
|
|
35
|
-
'AITranscriptionParams',
|
|
36
|
-
'AITranscriptionResult',
|
|
37
|
-
])
|
|
38
|
-
|
|
39
|
-
describe('the agent runtime is not exported under the AI name', () => {
|
|
40
|
-
test('every AI* symbol in the public surface is a provider wrapper', () => {
|
|
41
|
-
const report = readFileSync(reportPath, 'utf-8')
|
|
42
|
-
const found = new Set(report.match(/\bAI[A-Z][A-Za-z]*/g) ?? [])
|
|
43
|
-
|
|
44
|
-
const strays = [...found].filter((name) => !PROVIDER_SYMBOLS.has(name))
|
|
45
|
-
|
|
46
|
-
assert.deepEqual(
|
|
47
|
-
strays,
|
|
48
|
-
[],
|
|
49
|
-
'these are exported as `AI*` but are not provider wrappers — rename them ' +
|
|
50
|
-
'to `Agent*`, or add them to PROVIDER_SYMBOLS if they genuinely wrap a ' +
|
|
51
|
-
'model provider call'
|
|
52
|
-
)
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
test('the agent entry points are the renamed ones', () => {
|
|
56
|
-
const { exports } = JSON.parse(
|
|
57
|
-
readFileSync(join(packageRoot, 'package.json'), 'utf-8')
|
|
58
|
-
)
|
|
59
|
-
|
|
60
|
-
assert.ok(exports['./agent'], 'expected the ./agent entry point')
|
|
61
|
-
assert.ok(
|
|
62
|
-
exports['./agent-scorer'],
|
|
63
|
-
'expected the ./agent-scorer entry point'
|
|
64
|
-
)
|
|
65
|
-
assert.equal(exports['./ai-agent'], undefined)
|
|
66
|
-
assert.equal(exports['./ai-scorer'], undefined)
|
|
67
|
-
})
|
|
68
|
-
})
|
package/src/api-report.test.ts
DELETED
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
import { describe, test } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
import { execFileSync } from 'node:child_process'
|
|
4
|
-
import { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
|
|
5
|
-
import { tmpdir } from 'node:os'
|
|
6
|
-
import { fileURLToPath } from 'node:url'
|
|
7
|
-
import { join, dirname } from 'node:path'
|
|
8
|
-
|
|
9
|
-
const packageRoot = join(dirname(fileURLToPath(import.meta.url)), '..')
|
|
10
|
-
const reportPath = join(packageRoot, 'api-report.md')
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* `public-surface.json` pins the *names* a consumer can reach. That catches an
|
|
14
|
-
* export appearing or vanishing and nothing else — adding a method to
|
|
15
|
-
* `MetaService`, or making a field on `ChannelMeta` required, sails past it,
|
|
16
|
-
* as does every type-only export. Those are the changes that break a
|
|
17
|
-
* consumer's build, and the report's summary counts how many more of them
|
|
18
|
-
* there are than there are names.
|
|
19
|
-
*
|
|
20
|
-
* So `api-report.md` records what each symbol *is*, and this fails when the
|
|
21
|
-
* committed report and the code disagree.
|
|
22
|
-
*
|
|
23
|
-
* knowledge: decisions/internals/the-api-report-pins-members-not-just-names.md
|
|
24
|
-
*/
|
|
25
|
-
describe('the API report matches the code', () => {
|
|
26
|
-
test('regenerating produces no diff', () => {
|
|
27
|
-
const committed = readFileSync(reportPath, 'utf-8')
|
|
28
|
-
|
|
29
|
-
execFileSync(
|
|
30
|
-
'npx',
|
|
31
|
-
['tsx', join(packageRoot, 'scripts', 'generate-api-report.mts')],
|
|
32
|
-
{ cwd: packageRoot, stdio: 'pipe' }
|
|
33
|
-
)
|
|
34
|
-
const regenerated = readFileSync(reportPath, 'utf-8')
|
|
35
|
-
|
|
36
|
-
if (committed !== regenerated) {
|
|
37
|
-
// Restore, so a failing run does not leave the tree dirty.
|
|
38
|
-
const committedLines = committed.split('\n')
|
|
39
|
-
const regeneratedLines = regenerated.split('\n')
|
|
40
|
-
const firstDiff = regeneratedLines.findIndex(
|
|
41
|
-
(line, i) => line !== committedLines[i]
|
|
42
|
-
)
|
|
43
|
-
writeFileSync(reportPath, committed)
|
|
44
|
-
|
|
45
|
-
assert.fail(
|
|
46
|
-
'the public API changed but api-report.md was not regenerated.\n' +
|
|
47
|
-
`First difference at line ${firstDiff + 1}:\n` +
|
|
48
|
-
` committed: ${committedLines[firstDiff] ?? '(end of file)'}\n` +
|
|
49
|
-
` regenerated: ${regeneratedLines[firstDiff] ?? '(end of file)'}\n` +
|
|
50
|
-
'Run `yarn api-report` and review the diff — a member added to an ' +
|
|
51
|
-
'exported interface or class is a change consumers compile against.'
|
|
52
|
-
)
|
|
53
|
-
}
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
test('the report actually contains member-level detail', () => {
|
|
57
|
-
// Guards the test above: a report of bare names would match itself forever
|
|
58
|
-
// while pinning nothing that public-surface.json does not already pin.
|
|
59
|
-
const report = readFileSync(reportPath, 'utf-8')
|
|
60
|
-
|
|
61
|
-
assert.ok(
|
|
62
|
-
/export interface MetaService \{[^}]*getHttpMeta/.test(report),
|
|
63
|
-
'expected MetaService to be reported with its members'
|
|
64
|
-
)
|
|
65
|
-
assert.ok(
|
|
66
|
-
!/^\w+: any$/m.test(report),
|
|
67
|
-
'symbols reported as `any` mean re-export aliases are not being followed'
|
|
68
|
-
)
|
|
69
|
-
})
|
|
70
|
-
})
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Every branch that touches the public surface rewrites the whole report, so
|
|
74
|
-
* two of them meeting is a ~9000-line conflict with no meaningful resolution
|
|
75
|
-
* in it. A merge driver takes the conflict away; the test above is what still
|
|
76
|
-
* insists on a report that matches the code.
|
|
77
|
-
*
|
|
78
|
-
* knowledge: decisions/internals/the-api-report-pins-members-not-just-names.md
|
|
79
|
-
*/
|
|
80
|
-
describe('merging the API report is not hand work', () => {
|
|
81
|
-
const repoRoot = join(packageRoot, '..', '..')
|
|
82
|
-
|
|
83
|
-
test('.gitattributes routes the report through the driver', () => {
|
|
84
|
-
const attributes = readFileSync(join(repoRoot, '.gitattributes'), 'utf-8')
|
|
85
|
-
|
|
86
|
-
assert.match(
|
|
87
|
-
attributes,
|
|
88
|
-
/^packages\/core\/api-report\.md\s+merge=api-report\b/m,
|
|
89
|
-
'the report must name the merge driver, or git conflicts on it as usual'
|
|
90
|
-
)
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
test('the setup script registers the driver as a plain take-one-side', () => {
|
|
94
|
-
// Against a throwaway repository rather than this one: a driver is written
|
|
95
|
-
// to `.git/config`, which every worktree of a checkout shares, so running
|
|
96
|
-
// this in place would reach into whatever else is checked out beside it.
|
|
97
|
-
const sandbox = mkdtempSync(join(tmpdir(), 'pikku-merge-driver-'))
|
|
98
|
-
try {
|
|
99
|
-
execFileSync('git', ['init', '--quiet', sandbox], { stdio: 'pipe' })
|
|
100
|
-
execFileSync(
|
|
101
|
-
'node',
|
|
102
|
-
[join(repoRoot, 'scripts', 'setup-merge-drivers.mjs')],
|
|
103
|
-
{ cwd: sandbox, stdio: 'pipe' }
|
|
104
|
-
)
|
|
105
|
-
const driver = execFileSync(
|
|
106
|
-
'git',
|
|
107
|
-
['config', '--local', 'merge.api-report.driver'],
|
|
108
|
-
{ cwd: sandbox, stdio: 'pipe' }
|
|
109
|
-
)
|
|
110
|
-
.toString()
|
|
111
|
-
.trim()
|
|
112
|
-
|
|
113
|
-
// `true` writes nothing and succeeds, which is how a driver tells git to
|
|
114
|
-
// keep the side already in %A. Anything that regenerates the report is
|
|
115
|
-
// the trap this pins shut: git runs a driver while merging that one
|
|
116
|
-
// path, with the rest of the tree still unmerged, so the generator reads
|
|
117
|
-
// the old sources and resolves to a report missing exactly the API the
|
|
118
|
-
// incoming branch adds — conflict-free and wrong, which is worse than a
|
|
119
|
-
// conflict. The regeneration belongs to the guard above, which runs
|
|
120
|
-
// against a finished tree.
|
|
121
|
-
assert.equal(
|
|
122
|
-
driver,
|
|
123
|
-
'true',
|
|
124
|
-
'the driver must resolve to one side verbatim and run nothing'
|
|
125
|
-
)
|
|
126
|
-
} finally {
|
|
127
|
-
rmSync(sandbox, { recursive: true, force: true })
|
|
128
|
-
}
|
|
129
|
-
})
|
|
130
|
-
|
|
131
|
-
test('postinstall runs the setup, so a fresh clone is not left without it', () => {
|
|
132
|
-
const manifest = JSON.parse(
|
|
133
|
-
readFileSync(join(repoRoot, 'package.json'), 'utf-8')
|
|
134
|
-
)
|
|
135
|
-
|
|
136
|
-
assert.match(manifest.scripts.postinstall, /setup-merge-drivers\.mjs/)
|
|
137
|
-
})
|
|
138
|
-
})
|