@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,285 +0,0 @@
|
|
|
1
|
-
import { describe, test } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
import { buildJudgePrompt, runJudge } from './agent-scorer-judge.js'
|
|
4
|
-
import { pikkuAgentJudge } from './agent-scorer.js'
|
|
5
|
-
import type { ScorerInput } from './agent-scorer.types.js'
|
|
6
|
-
import type { AgentRunnerService } from '../../services/agent-runner-service.js'
|
|
7
|
-
|
|
8
|
-
const input = (overrides: Partial<ScorerInput> = {}): ScorerInput => ({
|
|
9
|
-
runId: 'run-1',
|
|
10
|
-
agentName: 'assistant',
|
|
11
|
-
input: 'what is the capital of France?',
|
|
12
|
-
output: 'Paris',
|
|
13
|
-
toolCalls: [],
|
|
14
|
-
usage: { inputTokens: 10, outputTokens: 5 },
|
|
15
|
-
...overrides,
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
const runner = (object: unknown, seen?: { params: any }): AgentRunnerService =>
|
|
19
|
-
({
|
|
20
|
-
run: async (params: any) => {
|
|
21
|
-
if (seen) seen.params = params
|
|
22
|
-
return { object, usage: { inputTokens: 100, outputTokens: 20 } }
|
|
23
|
-
},
|
|
24
|
-
}) as unknown as AgentRunnerService
|
|
25
|
-
|
|
26
|
-
describe('buildJudgePrompt', () => {
|
|
27
|
-
test('shows the answer key to a reference-based judge', () => {
|
|
28
|
-
const scorer = pikkuAgentJudge({
|
|
29
|
-
name: 'correctness',
|
|
30
|
-
description: 'Is the answer right',
|
|
31
|
-
model: 'claude-opus-5',
|
|
32
|
-
goal: 'Grade correctness.',
|
|
33
|
-
requiresReference: true,
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
const prompt = buildJudgePrompt(
|
|
37
|
-
scorer.judge!,
|
|
38
|
-
input({ reference: 'Paris' })
|
|
39
|
-
)
|
|
40
|
-
|
|
41
|
-
assert.match(prompt, /Reference answer:\nParis/)
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
test('withholds a reference section when there is no answer key', () => {
|
|
45
|
-
const scorer = pikkuAgentJudge({
|
|
46
|
-
name: 'helpfulness',
|
|
47
|
-
description: 'Is the answer useful',
|
|
48
|
-
model: 'claude-opus-5',
|
|
49
|
-
goal: 'Grade helpfulness.',
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
const prompt = buildJudgePrompt(scorer.judge!, input())
|
|
53
|
-
|
|
54
|
-
assert.doesNotMatch(prompt, /Reference answer/)
|
|
55
|
-
assert.match(prompt, /Grade helpfulness\./)
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
test('shows which tools ran, so an answer is distinguishable from a guess', () => {
|
|
59
|
-
const scorer = pikkuAgentJudge({
|
|
60
|
-
name: 'helpfulness',
|
|
61
|
-
description: 'Is the answer useful',
|
|
62
|
-
model: 'claude-opus-5',
|
|
63
|
-
goal: 'Grade helpfulness.',
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
const prompt = buildJudgePrompt(
|
|
67
|
-
scorer.judge!,
|
|
68
|
-
input({
|
|
69
|
-
toolCalls: [
|
|
70
|
-
{ name: 'listTodos', args: {}, result: { todos: ['Buy groceries'] } },
|
|
71
|
-
],
|
|
72
|
-
})
|
|
73
|
-
)
|
|
74
|
-
|
|
75
|
-
assert.match(prompt, /Tools the assistant ran:\n- listTodos/)
|
|
76
|
-
})
|
|
77
|
-
|
|
78
|
-
test('the default disclosure sends the judge no arguments and no results', () => {
|
|
79
|
-
const scorer = pikkuAgentJudge({
|
|
80
|
-
name: 'helpfulness',
|
|
81
|
-
description: 'Is the answer useful',
|
|
82
|
-
model: 'claude-opus-5',
|
|
83
|
-
goal: 'Grade helpfulness.',
|
|
84
|
-
})
|
|
85
|
-
|
|
86
|
-
const prompt = buildJudgePrompt(
|
|
87
|
-
scorer.judge!,
|
|
88
|
-
input({
|
|
89
|
-
toolCalls: [
|
|
90
|
-
{
|
|
91
|
-
name: 'lookupCustomer',
|
|
92
|
-
args: { email: 'ada@example.com' },
|
|
93
|
-
result: { address: '12 Mill Lane' },
|
|
94
|
-
},
|
|
95
|
-
],
|
|
96
|
-
})
|
|
97
|
-
)
|
|
98
|
-
|
|
99
|
-
assert.doesNotMatch(prompt, /ada@example\.com/)
|
|
100
|
-
assert.doesNotMatch(prompt, /Mill Lane/)
|
|
101
|
-
})
|
|
102
|
-
|
|
103
|
-
test('a run that called nothing gets no tool section rather than an empty one', () => {
|
|
104
|
-
const scorer = pikkuAgentJudge({
|
|
105
|
-
name: 'helpfulness',
|
|
106
|
-
description: 'Is the answer useful',
|
|
107
|
-
model: 'claude-opus-5',
|
|
108
|
-
goal: 'Grade helpfulness.',
|
|
109
|
-
})
|
|
110
|
-
|
|
111
|
-
assert.doesNotMatch(buildJudgePrompt(scorer.judge!, input()), /Tools the/)
|
|
112
|
-
})
|
|
113
|
-
|
|
114
|
-
test('a failed call is shown as failed, which is not the same as no call', () => {
|
|
115
|
-
const scorer = pikkuAgentJudge({
|
|
116
|
-
name: 'helpfulness',
|
|
117
|
-
description: 'Is the answer useful',
|
|
118
|
-
model: 'claude-opus-5',
|
|
119
|
-
goal: 'Grade helpfulness.',
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
const prompt = buildJudgePrompt(
|
|
123
|
-
scorer.judge!,
|
|
124
|
-
input({
|
|
125
|
-
toolCalls: [
|
|
126
|
-
{
|
|
127
|
-
name: 'listTodos',
|
|
128
|
-
args: {},
|
|
129
|
-
error: 'no such user ada@example.com',
|
|
130
|
-
},
|
|
131
|
-
],
|
|
132
|
-
})
|
|
133
|
-
)
|
|
134
|
-
|
|
135
|
-
assert.match(prompt, /- listTodos \(failed\)/)
|
|
136
|
-
assert.doesNotMatch(prompt, /ada@example\.com/)
|
|
137
|
-
})
|
|
138
|
-
|
|
139
|
-
test("'full' shows the arguments and results, for a judge that grades against them", () => {
|
|
140
|
-
const scorer = pikkuAgentJudge({
|
|
141
|
-
name: 'helpfulness',
|
|
142
|
-
description: 'Is the answer useful',
|
|
143
|
-
model: 'claude-opus-5',
|
|
144
|
-
goal: 'Grade helpfulness.',
|
|
145
|
-
toolCalls: 'full',
|
|
146
|
-
})
|
|
147
|
-
|
|
148
|
-
const prompt = buildJudgePrompt(
|
|
149
|
-
scorer.judge!,
|
|
150
|
-
input({
|
|
151
|
-
toolCalls: [
|
|
152
|
-
{ name: 'listTodos', args: {}, result: { todos: ['Buy groceries'] } },
|
|
153
|
-
{ name: 'save', args: {}, error: 'store unreachable' },
|
|
154
|
-
],
|
|
155
|
-
})
|
|
156
|
-
)
|
|
157
|
-
|
|
158
|
-
assert.match(
|
|
159
|
-
prompt,
|
|
160
|
-
/listTodos\(\{\}\) returned \{"todos":\["Buy groceries"\]\}/
|
|
161
|
-
)
|
|
162
|
-
assert.match(prompt, /save\(\{\}\) failed: store unreachable/)
|
|
163
|
-
})
|
|
164
|
-
|
|
165
|
-
test("'off' withholds the trajectory entirely, even from a run that used tools", () => {
|
|
166
|
-
const scorer = pikkuAgentJudge({
|
|
167
|
-
name: 'helpfulness',
|
|
168
|
-
description: 'Is the answer useful',
|
|
169
|
-
model: 'claude-opus-5',
|
|
170
|
-
goal: 'Grade helpfulness.',
|
|
171
|
-
toolCalls: 'off',
|
|
172
|
-
})
|
|
173
|
-
|
|
174
|
-
const prompt = buildJudgePrompt(
|
|
175
|
-
scorer.judge!,
|
|
176
|
-
input({ toolCalls: [{ name: 'listTodos', args: {}, result: {} }] })
|
|
177
|
-
)
|
|
178
|
-
|
|
179
|
-
assert.doesNotMatch(prompt, /Tools the/)
|
|
180
|
-
assert.doesNotMatch(prompt, /listTodos/)
|
|
181
|
-
})
|
|
182
|
-
|
|
183
|
-
test('a large tool result is truncated rather than crowding out the answer', () => {
|
|
184
|
-
const scorer = pikkuAgentJudge({
|
|
185
|
-
name: 'helpfulness',
|
|
186
|
-
description: 'Is the answer useful',
|
|
187
|
-
model: 'claude-opus-5',
|
|
188
|
-
goal: 'Grade helpfulness.',
|
|
189
|
-
toolCalls: 'full',
|
|
190
|
-
})
|
|
191
|
-
|
|
192
|
-
const prompt = buildJudgePrompt(
|
|
193
|
-
scorer.judge!,
|
|
194
|
-
input({
|
|
195
|
-
toolCalls: [{ name: 'search', args: {}, result: 'x'.repeat(5000) }],
|
|
196
|
-
})
|
|
197
|
-
)
|
|
198
|
-
|
|
199
|
-
assert.match(prompt, /… \(truncated\)/)
|
|
200
|
-
assert.ok(prompt.length < 1500, `prompt was ${prompt.length} characters`)
|
|
201
|
-
})
|
|
202
|
-
|
|
203
|
-
test('a scorer that supplies its own prompt replaces the framing entirely', () => {
|
|
204
|
-
const scorer = pikkuAgentJudge({
|
|
205
|
-
name: 'custom',
|
|
206
|
-
description: 'Custom framing',
|
|
207
|
-
model: 'claude-opus-5',
|
|
208
|
-
goal: 'ignored',
|
|
209
|
-
prompt: (run) => `Only this: ${run.output}`,
|
|
210
|
-
})
|
|
211
|
-
|
|
212
|
-
assert.equal(buildJudgePrompt(scorer.judge!, input()), 'Only this: Paris')
|
|
213
|
-
})
|
|
214
|
-
})
|
|
215
|
-
|
|
216
|
-
describe('runJudge', () => {
|
|
217
|
-
const helpfulness = pikkuAgentJudge({
|
|
218
|
-
name: 'helpfulness',
|
|
219
|
-
description: 'Is the answer useful',
|
|
220
|
-
model: 'claude-opus-5',
|
|
221
|
-
goal: 'Grade helpfulness.',
|
|
222
|
-
})
|
|
223
|
-
|
|
224
|
-
test('records the score, the reason and what the judgement cost', async () => {
|
|
225
|
-
const result = await runJudge(
|
|
226
|
-
helpfulness,
|
|
227
|
-
input(),
|
|
228
|
-
runner({ score: 0.8, reason: 'Direct and correct.' })
|
|
229
|
-
)
|
|
230
|
-
|
|
231
|
-
assert.equal(result.score, 0.8)
|
|
232
|
-
assert.equal(result.reason, 'Direct and correct.')
|
|
233
|
-
assert.deepEqual(result.metadata, {
|
|
234
|
-
judgeModel: 'claude-opus-5',
|
|
235
|
-
judgeTokens: 120,
|
|
236
|
-
})
|
|
237
|
-
})
|
|
238
|
-
|
|
239
|
-
test('clamps an out-of-range score rather than losing the judgement', async () => {
|
|
240
|
-
const high = await runJudge(helpfulness, input(), runner({ score: 1.4 }))
|
|
241
|
-
const low = await runJudge(helpfulness, input(), runner({ score: -2 }))
|
|
242
|
-
|
|
243
|
-
assert.equal(high.score, 1)
|
|
244
|
-
assert.equal(low.score, 0)
|
|
245
|
-
})
|
|
246
|
-
|
|
247
|
-
test('rejects a non-numeric score, which is not a judgement at all', async () => {
|
|
248
|
-
await assert.rejects(
|
|
249
|
-
() => runJudge(helpfulness, input(), runner({ score: 'great' })),
|
|
250
|
-
/non-numeric score/
|
|
251
|
-
)
|
|
252
|
-
})
|
|
253
|
-
|
|
254
|
-
test('gives the judge no tools, so its structured output is actually honoured', async () => {
|
|
255
|
-
const seen = { params: undefined as any }
|
|
256
|
-
await runJudge(helpfulness, input(), runner({ score: 1 }, seen))
|
|
257
|
-
|
|
258
|
-
assert.deepEqual(seen.params.tools, [])
|
|
259
|
-
assert.equal(seen.params.toolChoice, 'none')
|
|
260
|
-
assert.equal(seen.params.maxSteps, 1)
|
|
261
|
-
assert.equal(seen.params.model, 'claude-opus-5')
|
|
262
|
-
})
|
|
263
|
-
|
|
264
|
-
test('names the missing provider rather than failing as an undefined call', async () => {
|
|
265
|
-
await assert.rejects(
|
|
266
|
-
() => runJudge(helpfulness, input(), undefined),
|
|
267
|
-
/needs an AI provider/
|
|
268
|
-
)
|
|
269
|
-
})
|
|
270
|
-
|
|
271
|
-
test('refuses to grade a reference-based judge with no answer key', async () => {
|
|
272
|
-
const correctness = pikkuAgentJudge({
|
|
273
|
-
name: 'correctness',
|
|
274
|
-
description: 'Is the answer right',
|
|
275
|
-
model: 'claude-opus-5',
|
|
276
|
-
goal: 'Grade correctness.',
|
|
277
|
-
requiresReference: true,
|
|
278
|
-
})
|
|
279
|
-
|
|
280
|
-
await assert.rejects(
|
|
281
|
-
() => runJudge(correctness, input(), runner({ score: 1 })),
|
|
282
|
-
/grades against a reference answer/
|
|
283
|
-
)
|
|
284
|
-
})
|
|
285
|
-
})
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
import type { AgentRunnerService } from '../../services/agent-runner-service.js'
|
|
2
|
-
import type { AgentMessage } from '../agent/agent.types.js'
|
|
3
|
-
import { randomUUID } from '../agent/agent-utils.js'
|
|
4
|
-
import type {
|
|
5
|
-
PikkuAgentScorer,
|
|
6
|
-
ScorerInput,
|
|
7
|
-
ScorerJudgeConfig,
|
|
8
|
-
ScorerOutput,
|
|
9
|
-
} from './agent-scorer.types.js'
|
|
10
|
-
|
|
11
|
-
const JUDGE_OUTPUT_SCHEMA = {
|
|
12
|
-
type: 'object',
|
|
13
|
-
properties: {
|
|
14
|
-
score: {
|
|
15
|
-
type: 'number',
|
|
16
|
-
minimum: 0,
|
|
17
|
-
maximum: 1,
|
|
18
|
-
description: 'How well the answer meets the rubric. 1 is best.',
|
|
19
|
-
},
|
|
20
|
-
reason: {
|
|
21
|
-
type: 'string',
|
|
22
|
-
description: 'One or two sentences explaining the score.',
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
required: ['score', 'reason'],
|
|
26
|
-
additionalProperties: false,
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* The default disclosure: which tools ran and which failed, and nothing about
|
|
31
|
-
* what went in or came back. A judge that can see a run reached `listTodos`
|
|
32
|
-
* can tell a retrieved list from an invented one, which is the whole of what
|
|
33
|
-
* the trajectory is needed for — the rows themselves it does not need, and an
|
|
34
|
-
* error string is a tool's own words about the caller's data, so it is
|
|
35
|
-
* summarised rather than quoted.
|
|
36
|
-
*/
|
|
37
|
-
const describeToolCallName = (call: ScorerInput['toolCalls'][number]): string =>
|
|
38
|
-
`- ${call.name}${call.error ? ' (failed)' : ''}`
|
|
39
|
-
|
|
40
|
-
/** Everything about a call, for a judge that grades against what came back. */
|
|
41
|
-
const describeToolCall = (call: ScorerInput['toolCalls'][number]): string => {
|
|
42
|
-
const outcome = call.error
|
|
43
|
-
? `failed: ${call.error}`
|
|
44
|
-
: `returned ${formatToolValue(call.result)}`
|
|
45
|
-
return `- ${call.name}(${formatToolValue(call.args)}) ${outcome}`
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* A tool's arguments and result are arbitrary JSON, and some of it is large —
|
|
50
|
-
* a listing, a document, a page of search results. Truncating keeps a single
|
|
51
|
-
* fat call from crowding the answer out of the judge's context; what survives
|
|
52
|
-
* is the head, which is where the shape of a value is.
|
|
53
|
-
*/
|
|
54
|
-
const TOOL_VALUE_LIMIT = 500
|
|
55
|
-
|
|
56
|
-
const formatToolValue = (value: unknown): string => {
|
|
57
|
-
if (value === undefined) {
|
|
58
|
-
return 'nothing'
|
|
59
|
-
}
|
|
60
|
-
const text = typeof value === 'string' ? value : JSON.stringify(value)
|
|
61
|
-
if (text === undefined) {
|
|
62
|
-
return 'nothing'
|
|
63
|
-
}
|
|
64
|
-
return text.length > TOOL_VALUE_LIMIT
|
|
65
|
-
? `${text.slice(0, TOOL_VALUE_LIMIT)}… (truncated)`
|
|
66
|
-
: text
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* The message a judge grades when its scorer supplies no `prompt`.
|
|
71
|
-
*
|
|
72
|
-
* A reference-based judge is shown the answer key; a reference-free one is not,
|
|
73
|
-
* and grades the answer on its own merits.
|
|
74
|
-
*
|
|
75
|
-
* The tool calls are shown because without them a judge cannot tell a fact from
|
|
76
|
-
* a fabrication. Grading a todo agent that had just listed the user's todos
|
|
77
|
-
* correctly, a judge given only the answer called it "a plausible-looking list"
|
|
78
|
-
* that "offers no real access to your actual list, making it effectively a
|
|
79
|
-
* guess", and scored 0.2 what it scored 1 on other runs — right by its rubric,
|
|
80
|
-
* on the evidence it was given, and wrong about the run. An agent that answers
|
|
81
|
-
* from a tool and one that invents the same sentence are indistinguishable in
|
|
82
|
-
* the output alone; they differ only in what the run did to get there.
|
|
83
|
-
*
|
|
84
|
-
* How much of that to show is `judge.toolCalls`, and the default stops at the
|
|
85
|
-
* names: the 0.2 was the judge doubting the run had any access, and a name
|
|
86
|
-
* settles that without handing a third-party model the rows.
|
|
87
|
-
*/
|
|
88
|
-
export const buildJudgePrompt = (
|
|
89
|
-
judge: ScorerJudgeConfig,
|
|
90
|
-
input: ScorerInput
|
|
91
|
-
): string => {
|
|
92
|
-
if (judge.prompt) return judge.prompt(input)
|
|
93
|
-
|
|
94
|
-
const sections = [`User asked:\n${input.input}`]
|
|
95
|
-
if (input.reference !== undefined) {
|
|
96
|
-
sections.push(`Reference answer:\n${input.reference}`)
|
|
97
|
-
}
|
|
98
|
-
sections.push(`Assistant answered:\n${input.output}`)
|
|
99
|
-
if (judge.toolCalls !== 'off' && input.toolCalls.length > 0) {
|
|
100
|
-
const describe =
|
|
101
|
-
judge.toolCalls === 'full' ? describeToolCall : describeToolCallName
|
|
102
|
-
sections.push(
|
|
103
|
-
`Tools the assistant ran:\n${input.toolCalls.map(describe).join('\n')}`
|
|
104
|
-
)
|
|
105
|
-
}
|
|
106
|
-
sections.push(judge.goal)
|
|
107
|
-
sections.push('Respond with a score 0..1 and a brief reason.')
|
|
108
|
-
return sections.join('\n\n')
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Clamp rather than reject: a model that answers 1.2 has still made a legible
|
|
113
|
-
* judgement, and failing the job would lose it. A non-number has not.
|
|
114
|
-
*/
|
|
115
|
-
const normalizeScore = (scorerName: string, value: unknown): number => {
|
|
116
|
-
if (typeof value !== 'number' || Number.isNaN(value)) {
|
|
117
|
-
throw new Error(
|
|
118
|
-
`Judge '${scorerName}' returned a non-numeric score: ${JSON.stringify(value)}`
|
|
119
|
-
)
|
|
120
|
-
}
|
|
121
|
-
return Math.min(1, Math.max(0, value))
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Run an LLM judge and force the `{ score, reason }` contract, so a scorer
|
|
126
|
-
* author writes a rubric rather than a parser.
|
|
127
|
-
*
|
|
128
|
-
* A judge has no tools, which is the one case where an output schema is
|
|
129
|
-
* reliably honoured.
|
|
130
|
-
*/
|
|
131
|
-
export const runJudge = async (
|
|
132
|
-
scorer: PikkuAgentScorer<any>,
|
|
133
|
-
input: ScorerInput,
|
|
134
|
-
agentRunner: AgentRunnerService | undefined
|
|
135
|
-
): Promise<ScorerOutput> => {
|
|
136
|
-
const judge = scorer.judge
|
|
137
|
-
if (!judge) {
|
|
138
|
-
throw new Error(`Scorer '${scorer.name}' is not a judge`)
|
|
139
|
-
}
|
|
140
|
-
if (!agentRunner) {
|
|
141
|
-
throw new Error(
|
|
142
|
-
`Judge '${scorer.name}' needs an AI provider, but no agentRunner is registered in this process. ` +
|
|
143
|
-
`A worker deployed apart from the API has to register one to run the slow scoring lane.`
|
|
144
|
-
)
|
|
145
|
-
}
|
|
146
|
-
if (scorer.requiresReference && input.reference === undefined) {
|
|
147
|
-
throw new Error(
|
|
148
|
-
`Judge '${scorer.name}' grades against a reference answer, but none was supplied`
|
|
149
|
-
)
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
const messages: AgentMessage[] = [
|
|
153
|
-
{
|
|
154
|
-
id: randomUUID(),
|
|
155
|
-
role: 'user',
|
|
156
|
-
content: buildJudgePrompt(judge, input),
|
|
157
|
-
createdAt: new Date(),
|
|
158
|
-
},
|
|
159
|
-
]
|
|
160
|
-
|
|
161
|
-
const result = await agentRunner.run({
|
|
162
|
-
model: judge.model,
|
|
163
|
-
instructions: judge.goal,
|
|
164
|
-
messages,
|
|
165
|
-
tools: [],
|
|
166
|
-
maxSteps: 1,
|
|
167
|
-
toolChoice: 'none',
|
|
168
|
-
outputSchema: JUDGE_OUTPUT_SCHEMA,
|
|
169
|
-
})
|
|
170
|
-
|
|
171
|
-
const object = (result.object ?? {}) as { score?: unknown; reason?: unknown }
|
|
172
|
-
return {
|
|
173
|
-
score: normalizeScore(scorer.name, object.score),
|
|
174
|
-
...(typeof object.reason === 'string' ? { reason: object.reason } : {}),
|
|
175
|
-
metadata: {
|
|
176
|
-
judgeModel: judge.model,
|
|
177
|
-
judgeTokens: result.usage.inputTokens + result.usage.outputTokens,
|
|
178
|
-
},
|
|
179
|
-
}
|
|
180
|
-
}
|
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
import { beforeEach, describe, test } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
import { pikkuState, resetPikkuState } from '../../pikku-state.js'
|
|
4
|
-
import { scoreFinishedRun } from './agent-scorer-live.js'
|
|
5
|
-
import { pikkuAgentJudge, pikkuAgentScorer } from './agent-scorer.js'
|
|
6
|
-
import type { PikkuAgentScorer, ScorerInput } from './agent-scorer.types.js'
|
|
7
|
-
|
|
8
|
-
const register = (agentName: string, scorers: PikkuAgentScorer[]) => {
|
|
9
|
-
pikkuState(null, 'agent', 'agents').set(agentName, {
|
|
10
|
-
name: agentName,
|
|
11
|
-
scorers: scorers.map((scorer) => scorer.name),
|
|
12
|
-
} as never)
|
|
13
|
-
for (const scorer of scorers) {
|
|
14
|
-
pikkuState(null, 'agent', 'scorers').set(scorer.name, scorer)
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const run = (overrides: Partial<ScorerInput> = {}): ScorerInput => ({
|
|
19
|
-
runId: 'run-1',
|
|
20
|
-
agentName: 'assistant',
|
|
21
|
-
threadId: 'thread-1',
|
|
22
|
-
input: 'what is the capital of France?',
|
|
23
|
-
output: 'Paris',
|
|
24
|
-
toolCalls: [],
|
|
25
|
-
usage: { inputTokens: 10, outputTokens: 5 },
|
|
26
|
-
...overrides,
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
const collectingServices = () => {
|
|
30
|
-
const added: { queueName: string; data: any }[] = []
|
|
31
|
-
const warnings: string[] = []
|
|
32
|
-
const errors: string[] = []
|
|
33
|
-
return {
|
|
34
|
-
added,
|
|
35
|
-
warnings,
|
|
36
|
-
errors,
|
|
37
|
-
services: {
|
|
38
|
-
logger: {
|
|
39
|
-
warn: (message: string) => warnings.push(message),
|
|
40
|
-
error: (message: string) => errors.push(message),
|
|
41
|
-
},
|
|
42
|
-
queueService: {
|
|
43
|
-
add: async (queueName: string, data: unknown) => {
|
|
44
|
-
added.push({ queueName, data })
|
|
45
|
-
return undefined
|
|
46
|
-
},
|
|
47
|
-
},
|
|
48
|
-
} as any,
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const alwaysOne = pikkuAgentScorer({
|
|
53
|
-
name: 'brevity',
|
|
54
|
-
description: 'Shorter is better',
|
|
55
|
-
score: () => ({ score: 1 }),
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
describe('scoreFinishedRun', () => {
|
|
59
|
-
beforeEach(() => {
|
|
60
|
-
resetPikkuState()
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
test('sends one message per scorer, each to its own lane', async () => {
|
|
64
|
-
const judge = pikkuAgentJudge({
|
|
65
|
-
name: 'helpfulness',
|
|
66
|
-
description: 'Is the answer useful',
|
|
67
|
-
model: 'claude-opus-5',
|
|
68
|
-
goal: 'Grade helpfulness.',
|
|
69
|
-
})
|
|
70
|
-
register('assistant', [alwaysOne, judge])
|
|
71
|
-
const { added, services } = collectingServices()
|
|
72
|
-
|
|
73
|
-
await scoreFinishedRun(run(), services)
|
|
74
|
-
|
|
75
|
-
assert.deepEqual(
|
|
76
|
-
added.map((entry) => [entry.queueName, entry.data.scorerName]),
|
|
77
|
-
[
|
|
78
|
-
['agent-score-fast', 'brevity'],
|
|
79
|
-
['agent-score-slow', 'helpfulness'],
|
|
80
|
-
]
|
|
81
|
-
)
|
|
82
|
-
})
|
|
83
|
-
|
|
84
|
-
test('never grades a reference-based judge, because live traffic has no answer key', async () => {
|
|
85
|
-
const correctness = pikkuAgentJudge({
|
|
86
|
-
name: 'correctness',
|
|
87
|
-
description: 'Is the answer right',
|
|
88
|
-
model: 'claude-opus-5',
|
|
89
|
-
goal: 'Grade correctness.',
|
|
90
|
-
requiresReference: true,
|
|
91
|
-
})
|
|
92
|
-
register('assistant', [correctness])
|
|
93
|
-
const { added, services } = collectingServices()
|
|
94
|
-
|
|
95
|
-
await scoreFinishedRun(run(), services)
|
|
96
|
-
|
|
97
|
-
assert.deepEqual(added, [])
|
|
98
|
-
})
|
|
99
|
-
|
|
100
|
-
test('honours the sample rate rather than grading every run', async () => {
|
|
101
|
-
const sampled = pikkuAgentScorer({
|
|
102
|
-
name: 'brevity',
|
|
103
|
-
description: 'Shorter is better',
|
|
104
|
-
sampleRate: 0,
|
|
105
|
-
score: () => ({ score: 1 }),
|
|
106
|
-
})
|
|
107
|
-
register('assistant', [sampled])
|
|
108
|
-
const { added, services } = collectingServices()
|
|
109
|
-
|
|
110
|
-
await scoreFinishedRun(run(), services)
|
|
111
|
-
|
|
112
|
-
assert.deepEqual(added, [])
|
|
113
|
-
})
|
|
114
|
-
|
|
115
|
-
test('warns about a scorer the agent named but nothing registered, rather than failing the run', async () => {
|
|
116
|
-
pikkuState(null, 'agent', 'agents').set('assistant', {
|
|
117
|
-
name: 'assistant',
|
|
118
|
-
scorers: ['nonexistent'],
|
|
119
|
-
} as never)
|
|
120
|
-
const { added, warnings, services } = collectingServices()
|
|
121
|
-
|
|
122
|
-
await scoreFinishedRun(run(), services)
|
|
123
|
-
|
|
124
|
-
assert.deepEqual(added, [])
|
|
125
|
-
assert.equal(warnings.length, 1)
|
|
126
|
-
assert.match(warnings[0]!, /nonexistent/)
|
|
127
|
-
})
|
|
128
|
-
|
|
129
|
-
test('says why nothing was graded when there is no queue to grade on', async () => {
|
|
130
|
-
register('assistant', [alwaysOne])
|
|
131
|
-
const { warnings, services } = collectingServices()
|
|
132
|
-
delete services.queueService
|
|
133
|
-
|
|
134
|
-
await scoreFinishedRun(run(), services)
|
|
135
|
-
|
|
136
|
-
assert.equal(warnings.length, 1)
|
|
137
|
-
assert.match(warnings[0]!, /no queue service is registered/)
|
|
138
|
-
})
|
|
139
|
-
|
|
140
|
-
test('one scorer that cannot be enqueued does not stop the others', async () => {
|
|
141
|
-
const judge = pikkuAgentJudge({
|
|
142
|
-
name: 'helpfulness',
|
|
143
|
-
description: 'Is the answer useful',
|
|
144
|
-
model: 'claude-opus-5',
|
|
145
|
-
goal: 'Grade helpfulness.',
|
|
146
|
-
})
|
|
147
|
-
register('assistant', [alwaysOne, judge])
|
|
148
|
-
const { added, errors, services } = collectingServices()
|
|
149
|
-
const add = services.queueService.add
|
|
150
|
-
services.queueService.add = async (queueName: string, data: any) => {
|
|
151
|
-
if (data.scorerName === 'brevity') throw new Error('queue is down')
|
|
152
|
-
return add(queueName, data)
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
await scoreFinishedRun(run(), services)
|
|
156
|
-
|
|
157
|
-
assert.deepEqual(
|
|
158
|
-
added.map((entry) => entry.data.scorerName),
|
|
159
|
-
['helpfulness']
|
|
160
|
-
)
|
|
161
|
-
assert.equal(errors.length, 1)
|
|
162
|
-
})
|
|
163
|
-
|
|
164
|
-
test('an agent that names no scorers touches the queue at all', async () => {
|
|
165
|
-
pikkuState(null, 'agent', 'agents').set('assistant', {
|
|
166
|
-
name: 'assistant',
|
|
167
|
-
} as never)
|
|
168
|
-
const { added, services } = collectingServices()
|
|
169
|
-
|
|
170
|
-
await scoreFinishedRun(run(), services)
|
|
171
|
-
|
|
172
|
-
assert.deepEqual(added, [])
|
|
173
|
-
})
|
|
174
|
-
})
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import type { CoreSingletonServices } from '../../types/core.types.js'
|
|
2
|
-
import { scorersForAgent } from './agent-scorer-registry.js'
|
|
3
|
-
import { isSampled } from './agent-scorer-sampling.js'
|
|
4
|
-
import { SCORER_LANE_QUEUES, type ScorerInput } from './agent-scorer.types.js'
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Grade one finished run on live traffic.
|
|
8
|
-
*
|
|
9
|
-
* Called as the terminal step of `finalizeAgentRun`, so it is structurally last
|
|
10
|
-
* — a developer cannot register anything after it, and cannot reorder it. It is
|
|
11
|
-
* also strictly best-effort: the client already has its answer, so nothing here
|
|
12
|
-
* may fail the run.
|
|
13
|
-
*/
|
|
14
|
-
export const scoreFinishedRun = async (
|
|
15
|
-
run: ScorerInput,
|
|
16
|
-
services: Pick<CoreSingletonServices, 'logger'> & {
|
|
17
|
-
queueService?: { add: (queueName: string, data: unknown) => Promise<any> }
|
|
18
|
-
}
|
|
19
|
-
): Promise<void> => {
|
|
20
|
-
const scorers = scorersForAgent(run.agentName, services.logger).filter(
|
|
21
|
-
// A reference-based judge grades against an answer key, and live traffic
|
|
22
|
-
// has none.
|
|
23
|
-
(scorer) => !scorer.requiresReference
|
|
24
|
-
)
|
|
25
|
-
if (scorers.length === 0) return
|
|
26
|
-
|
|
27
|
-
if (!services.queueService) {
|
|
28
|
-
services.logger?.warn(
|
|
29
|
-
`[pikku] Agent '${run.agentName}' declares scorers but no queue service is registered — skipping live scoring`
|
|
30
|
-
)
|
|
31
|
-
return
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const sampled = scorers.filter((scorer) =>
|
|
35
|
-
isSampled(run.runId, scorer.name, scorer.sampleRate)
|
|
36
|
-
)
|
|
37
|
-
|
|
38
|
-
// One message per scorer, so each gets its own retry, isolation and lane.
|
|
39
|
-
await Promise.all(
|
|
40
|
-
sampled.map(async (scorer) => {
|
|
41
|
-
try {
|
|
42
|
-
await services.queueService!.add(SCORER_LANE_QUEUES[scorer.lane], {
|
|
43
|
-
...run,
|
|
44
|
-
scorerName: scorer.name,
|
|
45
|
-
// No reference: a live run has no answer key.
|
|
46
|
-
reference: undefined,
|
|
47
|
-
})
|
|
48
|
-
} catch (error) {
|
|
49
|
-
services.logger?.error(
|
|
50
|
-
`[pikku] Failed to enqueue the '${scorer.name}' grade of run ${run.runId}`,
|
|
51
|
-
{ error }
|
|
52
|
-
)
|
|
53
|
-
}
|
|
54
|
-
})
|
|
55
|
-
)
|
|
56
|
-
}
|