@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
|
@@ -1,311 +0,0 @@
|
|
|
1
|
-
import type { AgentRunnerService } from '../../services/agent-runner-service.js'
|
|
2
|
-
import { pikkuAgentMiddleware } from '../../middleware/middleware-factories.js'
|
|
3
|
-
import { SPOKEN_TURN } from './voice-input.js'
|
|
4
|
-
|
|
5
|
-
export type VoiceOutputState = {
|
|
6
|
-
textBuffer?: string
|
|
7
|
-
/**
|
|
8
|
-
* The audio emitted so far, as a chain.
|
|
9
|
-
*
|
|
10
|
-
* Synthesis for every finished sentence starts immediately, so the second
|
|
11
|
-
* sentence is being generated while the first is still being spoken. That
|
|
12
|
-
* also means the second can finish first — a short sentence after a long one
|
|
13
|
-
* routinely does. Chaining the *emissions* keeps the client receiving audio
|
|
14
|
-
* in the order it was written while leaving the generation overlapped.
|
|
15
|
-
*/
|
|
16
|
-
tail?: Promise<void>
|
|
17
|
-
/** Whether this reply has already said it cannot be spoken aloud. */
|
|
18
|
-
reportedUnspeakable?: boolean
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function bufferToBase64(data: Uint8Array): string {
|
|
22
|
-
let binary = ''
|
|
23
|
-
for (let i = 0; i < data.length; i++) {
|
|
24
|
-
binary += String.fromCharCode(data[i]!)
|
|
25
|
-
}
|
|
26
|
-
return btoa(binary)
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const SENTENCE_BOUNDARY = /[.!?]\s*$/
|
|
30
|
-
|
|
31
|
-
function isSentenceBoundary(text: string): boolean {
|
|
32
|
-
return SENTENCE_BOUNDARY.test(text)
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Scripts a speech model can pronounce, as named by {@link voiceOutput}'s
|
|
37
|
-
* `speakableScripts`.
|
|
38
|
-
*
|
|
39
|
-
* Script rather than language because script is what is decidable from the text
|
|
40
|
-
* alone. Spanish, French and English are one test, not three — and the models
|
|
41
|
-
* that handle one Latin-script language generally handle the others. What a
|
|
42
|
-
* model cannot do is invent a phoneme set it was never given.
|
|
43
|
-
*/
|
|
44
|
-
const SCRIPT_RANGES: Record<string, RegExp> = {
|
|
45
|
-
latin: /[A-ɏ]/,
|
|
46
|
-
devanagari: /[ऀ-ॿ]/,
|
|
47
|
-
han: /[㐀-鿿]/,
|
|
48
|
-
kana: /[-ヿ]/,
|
|
49
|
-
arabic: /[-ۿݐ-ݿ]/,
|
|
50
|
-
cyrillic: /[Ѐ-ӿ]/,
|
|
51
|
-
hangul: /[가-ᄀ-ᇿ]/,
|
|
52
|
-
hebrew: /[-]/,
|
|
53
|
-
greek: /[Ͱ-Ͽ]/,
|
|
54
|
-
thai: /[-]/,
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* The scripts a model can pronounce, and optionally the voice each one needs.
|
|
59
|
-
*
|
|
60
|
-
* The array form is for a model whose voice is the same whatever the script.
|
|
61
|
-
* The record form exists because that is not the common case: Kokoro speaks
|
|
62
|
-
* Mandarin, Japanese and Hindi well, but only through a voice belonging to that
|
|
63
|
-
* language. Asked for Chinese in its default American-English voice it spells
|
|
64
|
-
* the characters out — 9.9 seconds of "Chinese letter, Chinese letter" for a
|
|
65
|
-
* sentence the right voice says in 3.5. Same model, same text, same price.
|
|
66
|
-
*/
|
|
67
|
-
export type SpeakableScripts = string[] | Record<string, string>
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Which script decides the voice when a sentence contains several.
|
|
71
|
-
*
|
|
72
|
-
* The ordering is by how much a script narrows down the language, not by
|
|
73
|
-
* preference. Kana appears only in Japanese, so a sentence holding any settles
|
|
74
|
-
* it — while Han is written in both Chinese and Japanese and so cannot, which
|
|
75
|
-
* matters because ordinary Japanese is mostly kanji. Latin comes last for the
|
|
76
|
-
* same reason from the other end: it turns up inside sentences in every other
|
|
77
|
-
* script, and it is the one whose voice is least often the one that counts. A
|
|
78
|
-
* Chinese voice reading an English word is accented; an English voice reading
|
|
79
|
-
* Chinese spells it out.
|
|
80
|
-
*
|
|
81
|
-
* Everything else — Han included — sits between the two in config order.
|
|
82
|
-
*/
|
|
83
|
-
const SCRIPT_PRECEDENCE: Record<string, number> = { kana: -1, latin: 1 }
|
|
84
|
-
|
|
85
|
-
const scriptRank = (name: string): number => SCRIPT_PRECEDENCE[name] ?? 0
|
|
86
|
-
|
|
87
|
-
const scriptNames = (speakable: SpeakableScripts): string[] =>
|
|
88
|
-
Array.isArray(speakable) ? speakable : Object.keys(speakable)
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* The scripts present in `text` that the model was not said to handle.
|
|
92
|
-
*
|
|
93
|
-
* Silence would be the wrong answer here and so would a best effort. Handed
|
|
94
|
-
* Arabic — which it has no voice for at all — Kokoro does not fail and does not
|
|
95
|
-
* stay quiet: it reads out the *letter names*, twenty-four seconds of "Arabic
|
|
96
|
-
* meem, Arabic ra" for a one-line sentence, which is worse than either. Naming
|
|
97
|
-
* the gap lets the caller say so instead.
|
|
98
|
-
*/
|
|
99
|
-
export const unspeakableScripts = (
|
|
100
|
-
text: string,
|
|
101
|
-
speakable: SpeakableScripts
|
|
102
|
-
): string[] => {
|
|
103
|
-
const allowed = new Set(scriptNames(speakable))
|
|
104
|
-
return Object.entries(SCRIPT_RANGES)
|
|
105
|
-
.filter(([name, range]) => !allowed.has(name) && range.test(text))
|
|
106
|
-
.map(([name]) => name)
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* The voice to speak `text` in, or `fallback` if no mapped script appears.
|
|
111
|
-
*
|
|
112
|
-
* A sentence is regularly in more than one script, so which one decides is
|
|
113
|
-
* settled by {@link SCRIPT_PRECEDENCE} rather than by the order the config
|
|
114
|
-
* happens to be written in.
|
|
115
|
-
*/
|
|
116
|
-
export const voiceForText = (
|
|
117
|
-
text: string,
|
|
118
|
-
speakable: SpeakableScripts,
|
|
119
|
-
fallback?: string
|
|
120
|
-
): string | undefined => {
|
|
121
|
-
if (Array.isArray(speakable)) return fallback
|
|
122
|
-
const mapped = Object.entries(speakable).sort(
|
|
123
|
-
([a], [b]) => scriptRank(a) - scriptRank(b)
|
|
124
|
-
)
|
|
125
|
-
for (const [name, voice] of mapped) {
|
|
126
|
-
if (SCRIPT_RANGES[name]?.test(text)) return voice
|
|
127
|
-
}
|
|
128
|
-
return fallback
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
async function synthesizeAudio(
|
|
132
|
-
agentRunner: AgentRunnerService,
|
|
133
|
-
input: {
|
|
134
|
-
model: string
|
|
135
|
-
text: string
|
|
136
|
-
voice?: string
|
|
137
|
-
format?: string
|
|
138
|
-
instructions?: string
|
|
139
|
-
speed?: number
|
|
140
|
-
language?: string
|
|
141
|
-
abortSignal?: AbortSignal
|
|
142
|
-
}
|
|
143
|
-
): Promise<{ bytes: Uint8Array; format: string }> {
|
|
144
|
-
const result = await agentRunner.generateSpeech?.({
|
|
145
|
-
model: input.model,
|
|
146
|
-
text: input.text,
|
|
147
|
-
voice: input.voice,
|
|
148
|
-
outputFormat: input.format,
|
|
149
|
-
instructions: input.instructions,
|
|
150
|
-
speed: input.speed,
|
|
151
|
-
language: input.language,
|
|
152
|
-
abortSignal: input.abortSignal,
|
|
153
|
-
})
|
|
154
|
-
if (!result) {
|
|
155
|
-
throw new Error(
|
|
156
|
-
'voiceOutput requires an agentRunner with generateSpeech support'
|
|
157
|
-
)
|
|
158
|
-
}
|
|
159
|
-
return {
|
|
160
|
-
bytes: result.audio.uint8Array,
|
|
161
|
-
format: result.audio.format || input.format || 'pcm16',
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
export const voiceOutput = (config?: {
|
|
166
|
-
model?: string
|
|
167
|
-
format?: string
|
|
168
|
-
voice?: string
|
|
169
|
-
instructions?: string
|
|
170
|
-
speed?: number
|
|
171
|
-
language?: string
|
|
172
|
-
/**
|
|
173
|
-
* Scripts the configured model can actually pronounce, and the voice each
|
|
174
|
-
* needs — see {@link SpeakableScripts}. Anything written in another script is
|
|
175
|
-
* left unspoken and reported once, as a `voice-unsupported` data event,
|
|
176
|
-
* rather than sent to a model that will mangle it.
|
|
177
|
-
*
|
|
178
|
-
* Omitted means no check: every model is trusted with every script, which is
|
|
179
|
-
* the right default for a provider that genuinely is multilingual.
|
|
180
|
-
*/
|
|
181
|
-
speakableScripts?: SpeakableScripts
|
|
182
|
-
/**
|
|
183
|
-
* Speak every reply, including answers to turns that were typed.
|
|
184
|
-
*
|
|
185
|
-
* The default is to speak only what was spoken to. An agent is usually one
|
|
186
|
-
* agent serving both kinds of caller — the same thread is typed at from a
|
|
187
|
-
* desk and talked to from a phone — and synthesizing a reply nobody is
|
|
188
|
-
* listening to costs real money on every sentence of every turn. Whether the
|
|
189
|
-
* user is in a call is not something the client needs to declare: sending
|
|
190
|
-
* audio is what saying so looks like.
|
|
191
|
-
*
|
|
192
|
-
* Set this for the cases where speech is not a reply to speech at all — a
|
|
193
|
-
* read-aloud accessibility mode, a kiosk, anything whose whole output is
|
|
194
|
-
* meant to be heard.
|
|
195
|
-
*/
|
|
196
|
-
always?: boolean
|
|
197
|
-
}) =>
|
|
198
|
-
pikkuAgentMiddleware<VoiceOutputState>({
|
|
199
|
-
modifyOutputStream: async (
|
|
200
|
-
services,
|
|
201
|
-
{ event, state, shared, emit, signal }
|
|
202
|
-
) => {
|
|
203
|
-
const { agentRunner, logger } = services as {
|
|
204
|
-
agentRunner?: AgentRunnerService
|
|
205
|
-
logger?: { error: (message: string) => void }
|
|
206
|
-
}
|
|
207
|
-
if (!agentRunner?.generateSpeech) return event
|
|
208
|
-
|
|
209
|
-
// knowledge: decisions/internals/voice-output-speaks-unless-voice-input-explicitly-says-otherwise.md
|
|
210
|
-
if (!config?.always && shared[SPOKEN_TURN] === false) return event
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* Queue a finished sentence for speech.
|
|
214
|
-
*
|
|
215
|
-
* Nothing here is awaited by the caller. Synthesis is kicked off at once
|
|
216
|
-
* and its emission is chained behind the previous sentence, which is
|
|
217
|
-
* what keeps the text flowing at the speed the model writes it instead
|
|
218
|
-
* of the speed the speech provider answers.
|
|
219
|
-
*/
|
|
220
|
-
const speak = (text: string) => {
|
|
221
|
-
if (!config?.model) {
|
|
222
|
-
throw new Error(
|
|
223
|
-
'voiceOutput requires a speech model (e.g. openai/tts-1)'
|
|
224
|
-
)
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
// knowledge: decisions/internals/speech-synthesis-picks-a-voice-per-sentence-and-warns-once.md
|
|
228
|
-
let voice = config.voice
|
|
229
|
-
if (config.speakableScripts) {
|
|
230
|
-
const unspeakable = unspeakableScripts(text, config.speakableScripts)
|
|
231
|
-
voice = voiceForText(text, config.speakableScripts, config.voice)
|
|
232
|
-
if (unspeakable.length > 0) {
|
|
233
|
-
if (!state.reportedUnspeakable) {
|
|
234
|
-
state.reportedUnspeakable = true
|
|
235
|
-
state.tail = (state.tail ?? Promise.resolve()).then(() =>
|
|
236
|
-
emit({
|
|
237
|
-
type: 'data',
|
|
238
|
-
name: 'voice-unsupported',
|
|
239
|
-
data: { model: config.model, scripts: unspeakable },
|
|
240
|
-
})
|
|
241
|
-
)
|
|
242
|
-
}
|
|
243
|
-
return
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
// Settled into a value rather than left as a rejectable promise: it
|
|
247
|
-
// sits unobserved until the chain reaches it, and an unhandled
|
|
248
|
-
// rejection in that window would take the process down.
|
|
249
|
-
const synthesis = synthesizeAudio(agentRunner, {
|
|
250
|
-
model: config.model,
|
|
251
|
-
text,
|
|
252
|
-
voice,
|
|
253
|
-
format: config?.format,
|
|
254
|
-
instructions: config?.instructions,
|
|
255
|
-
speed: config?.speed,
|
|
256
|
-
language: config?.language,
|
|
257
|
-
// Barge-in should stop the bill, not just the playback. Without this
|
|
258
|
-
// every sentence already in flight is synthesized in full and paid
|
|
259
|
-
// for after the user has stopped listening.
|
|
260
|
-
abortSignal: signal,
|
|
261
|
-
}).then(
|
|
262
|
-
(audio) => ({ ok: true as const, audio }),
|
|
263
|
-
(error: unknown) => ({ ok: false as const, error })
|
|
264
|
-
)
|
|
265
|
-
|
|
266
|
-
state.tail = (state.tail ?? Promise.resolve()).then(async () => {
|
|
267
|
-
const result = await synthesis
|
|
268
|
-
if (!result.ok) {
|
|
269
|
-
// One sentence going unspoken is better than the rest of the reply
|
|
270
|
-
// never arriving, so the chain carries on.
|
|
271
|
-
logger?.error(
|
|
272
|
-
`voiceOutput could not synthesize a sentence: ${String(result.error)}`
|
|
273
|
-
)
|
|
274
|
-
return
|
|
275
|
-
}
|
|
276
|
-
await emit({
|
|
277
|
-
type: 'audio-delta',
|
|
278
|
-
data: bufferToBase64(result.audio.bytes),
|
|
279
|
-
format: result.audio.format,
|
|
280
|
-
text,
|
|
281
|
-
})
|
|
282
|
-
})
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
if (event.type === 'done') {
|
|
286
|
-
const remaining = state.textBuffer ?? ''
|
|
287
|
-
state.textBuffer = ''
|
|
288
|
-
if (remaining.trim()) {
|
|
289
|
-
speak(remaining)
|
|
290
|
-
}
|
|
291
|
-
// The only place this hook waits. The reply is already over, so the
|
|
292
|
-
// wait costs the reader nothing, and it is what makes `audio-done`
|
|
293
|
-
// mean what it says rather than racing the last chunk.
|
|
294
|
-
await state.tail
|
|
295
|
-
state.tail = undefined
|
|
296
|
-
return [{ type: 'audio-done' as const }, event]
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
if (event.type !== 'text-delta') return event
|
|
300
|
-
|
|
301
|
-
state.textBuffer = `${state.textBuffer ?? ''}${event.text}`
|
|
302
|
-
if (isSentenceBoundary(state.textBuffer)) {
|
|
303
|
-
const text = state.textBuffer
|
|
304
|
-
state.textBuffer = ''
|
|
305
|
-
speak(text)
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
// Returned without waiting for any audio — the entire point.
|
|
309
|
-
return event
|
|
310
|
-
},
|
|
311
|
-
})
|
|
@@ -1,106 +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 { gradeRun } from './agent-scorer-grade.js'
|
|
5
|
-
import { pikkuAgentJudge, pikkuAgentScorer } from './agent-scorer.js'
|
|
6
|
-
import type { ScoreJob } from './agent-scorer.types.js'
|
|
7
|
-
|
|
8
|
-
const job = (overrides: Partial<ScoreJob> = {}): ScoreJob => ({
|
|
9
|
-
scorerName: 'correctness',
|
|
10
|
-
runId: 'run-1',
|
|
11
|
-
agentName: 'assistant',
|
|
12
|
-
input: 'what is the capital of France?',
|
|
13
|
-
output: 'Paris',
|
|
14
|
-
toolCalls: [],
|
|
15
|
-
usage: { inputTokens: 10, outputTokens: 5 },
|
|
16
|
-
...overrides,
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
describe('gradeRun', () => {
|
|
20
|
-
beforeEach(() => resetPikkuState())
|
|
21
|
-
|
|
22
|
-
test('a scenario grade is returned and not written to the live record', async () => {
|
|
23
|
-
pikkuState(null, 'agent', 'scorers').set(
|
|
24
|
-
'correctness',
|
|
25
|
-
pikkuAgentScorer({
|
|
26
|
-
name: 'correctness',
|
|
27
|
-
description: 'Matches the answer key',
|
|
28
|
-
requiresReference: true,
|
|
29
|
-
score: (input) => ({
|
|
30
|
-
score: input.output === input.reference ? 1 : 0,
|
|
31
|
-
}),
|
|
32
|
-
})
|
|
33
|
-
)
|
|
34
|
-
let saves = 0
|
|
35
|
-
|
|
36
|
-
const result = await gradeRun(
|
|
37
|
-
job({ reference: 'Paris' }),
|
|
38
|
-
{
|
|
39
|
-
agentRunState: {
|
|
40
|
-
saveScore: async () => {
|
|
41
|
-
saves++
|
|
42
|
-
},
|
|
43
|
-
},
|
|
44
|
-
},
|
|
45
|
-
{ persist: false }
|
|
46
|
-
)
|
|
47
|
-
|
|
48
|
-
assert.deepEqual(result, { score: 1 })
|
|
49
|
-
assert.equal(saves, 0)
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
test('a reference-based scorer sees the answer key it was given', async () => {
|
|
53
|
-
pikkuState(null, 'agent', 'scorers').set(
|
|
54
|
-
'correctness',
|
|
55
|
-
pikkuAgentScorer({
|
|
56
|
-
name: 'correctness',
|
|
57
|
-
description: 'Matches the answer key',
|
|
58
|
-
requiresReference: true,
|
|
59
|
-
score: (input) => ({
|
|
60
|
-
score: input.output === input.reference ? 1 : 0,
|
|
61
|
-
}),
|
|
62
|
-
})
|
|
63
|
-
)
|
|
64
|
-
|
|
65
|
-
const result = await gradeRun(
|
|
66
|
-
job({ reference: 'Lyon' }),
|
|
67
|
-
{},
|
|
68
|
-
{
|
|
69
|
-
persist: false,
|
|
70
|
-
}
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
assert.equal(result.score, 0)
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
test('a judge grades without a score function, and reports the model it used', async () => {
|
|
77
|
-
pikkuState(null, 'agent', 'scorers').set(
|
|
78
|
-
'helpfulness',
|
|
79
|
-
pikkuAgentJudge({
|
|
80
|
-
name: 'helpfulness',
|
|
81
|
-
description: 'Is the answer useful',
|
|
82
|
-
model: 'claude-opus-5',
|
|
83
|
-
goal: 'Grade helpfulness.',
|
|
84
|
-
})
|
|
85
|
-
)
|
|
86
|
-
|
|
87
|
-
const result = await gradeRun(
|
|
88
|
-
job({ scorerName: 'helpfulness' }),
|
|
89
|
-
{
|
|
90
|
-
agentRunner: {
|
|
91
|
-
run: async () => ({
|
|
92
|
-
object: { score: 0.75, reason: 'Correct but terse.' },
|
|
93
|
-
usage: { inputTokens: 80, outputTokens: 20 },
|
|
94
|
-
}),
|
|
95
|
-
},
|
|
96
|
-
},
|
|
97
|
-
{ persist: false }
|
|
98
|
-
)
|
|
99
|
-
|
|
100
|
-
assert.equal(result.score, 0.75)
|
|
101
|
-
assert.deepEqual(result.metadata, {
|
|
102
|
-
judgeModel: 'claude-opus-5',
|
|
103
|
-
judgeTokens: 100,
|
|
104
|
-
})
|
|
105
|
-
})
|
|
106
|
-
})
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { runJudge } from './agent-scorer-judge.js'
|
|
2
|
-
import { resolveAgentScorer } from './agent-scorer-registry.js'
|
|
3
|
-
import type { ScoreJob, ScorerOutput } from './agent-scorer.types.js'
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Grade one run with one scorer.
|
|
7
|
-
*
|
|
8
|
-
* The single path both callers take — the lane worker on live traffic and the
|
|
9
|
-
* scenario grading RPC — so a scenario's grade is the same computation the
|
|
10
|
-
* production sampler would have made, not an approximation of it.
|
|
11
|
-
*
|
|
12
|
-
* Persisting is optional because the two callers differ on it: a live grade is
|
|
13
|
-
* only useful once recorded, while a scenario asserts on the returned value and
|
|
14
|
-
* runs against servers that may have no run-state adapter at all.
|
|
15
|
-
*/
|
|
16
|
-
export const gradeRun = async (
|
|
17
|
-
job: ScoreJob,
|
|
18
|
-
services: {
|
|
19
|
-
agentRunner?: unknown
|
|
20
|
-
agentRunState?: {
|
|
21
|
-
saveScore: (score: {
|
|
22
|
-
runId: string
|
|
23
|
-
scorerName: string
|
|
24
|
-
score: number
|
|
25
|
-
reason?: string
|
|
26
|
-
metadata?: Record<string, unknown>
|
|
27
|
-
}) => Promise<void>
|
|
28
|
-
}
|
|
29
|
-
},
|
|
30
|
-
options: { persist: boolean }
|
|
31
|
-
): Promise<ScorerOutput> => {
|
|
32
|
-
const { scorerName, ...input } = job
|
|
33
|
-
const scorer = resolveAgentScorer(scorerName)
|
|
34
|
-
|
|
35
|
-
const result = scorer.score
|
|
36
|
-
? await scorer.score(input, services)
|
|
37
|
-
: await runJudge(scorer, input, services.agentRunner as never)
|
|
38
|
-
|
|
39
|
-
if (options.persist) {
|
|
40
|
-
if (!services.agentRunState) {
|
|
41
|
-
throw new Error(
|
|
42
|
-
`AI run state service not initialized: cannot record the '${scorerName}' grade of run ${job.runId}`
|
|
43
|
-
)
|
|
44
|
-
}
|
|
45
|
-
await services.agentRunState.saveScore({
|
|
46
|
-
runId: job.runId,
|
|
47
|
-
scorerName,
|
|
48
|
-
score: result.score,
|
|
49
|
-
...(result.reason !== undefined ? { reason: result.reason } : {}),
|
|
50
|
-
...(result.metadata !== undefined ? { metadata: result.metadata } : {}),
|
|
51
|
-
})
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
return result
|
|
55
|
-
}
|