@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,58 +0,0 @@
|
|
|
1
|
-
export {
|
|
2
|
-
agent,
|
|
3
|
-
agentStream,
|
|
4
|
-
agentResume,
|
|
5
|
-
agentApprove,
|
|
6
|
-
agentInterrupt,
|
|
7
|
-
} from './agent-helpers.js'
|
|
8
|
-
export { wrapChannelWithAGUI } from './agent-agui.js'
|
|
9
|
-
export { runAgent, resumeAgentSync } from './agent-runner.js'
|
|
10
|
-
export { resolveModelAlias } from './agent-model-config.js'
|
|
11
|
-
export { streamAgent, resumeAgent, interruptAgent } from './agent-stream.js'
|
|
12
|
-
export {
|
|
13
|
-
voiceInput,
|
|
14
|
-
NoSpeechDetectedError,
|
|
15
|
-
SPOKEN_TURN,
|
|
16
|
-
SPOKEN_TRANSCRIPT,
|
|
17
|
-
} from './voice-input.js'
|
|
18
|
-
export {
|
|
19
|
-
voiceOutput,
|
|
20
|
-
unspeakableScripts,
|
|
21
|
-
voiceForText,
|
|
22
|
-
type SpeakableScripts,
|
|
23
|
-
type VoiceOutputState,
|
|
24
|
-
} from './voice-output.js'
|
|
25
|
-
export { AgentInterruptedError, signalRunInterrupt } from './agent-interrupt.js'
|
|
26
|
-
export type {
|
|
27
|
-
AgentInterruption,
|
|
28
|
-
AgentInterruptResult,
|
|
29
|
-
InterruptibleRunHandle,
|
|
30
|
-
} from './agent-interrupt.js'
|
|
31
|
-
export {
|
|
32
|
-
type RunAgentParams,
|
|
33
|
-
type StreamAgentOptions,
|
|
34
|
-
ToolApprovalRequired,
|
|
35
|
-
ToolCredentialRequired,
|
|
36
|
-
agentCallOptions,
|
|
37
|
-
canAccessThread,
|
|
38
|
-
isOwnedByPrincipal,
|
|
39
|
-
threadOwnerConstraint,
|
|
40
|
-
} from './agent-prepare.js'
|
|
41
|
-
export { addAgent } from './agent-registry.js'
|
|
42
|
-
export type {
|
|
43
|
-
AgentInput,
|
|
44
|
-
AgentsMeta,
|
|
45
|
-
AgentMemoryConfig,
|
|
46
|
-
AgentStep,
|
|
47
|
-
AgentContentPart,
|
|
48
|
-
AgentRunRow,
|
|
49
|
-
AgentRunService,
|
|
50
|
-
AgentRunState,
|
|
51
|
-
AgentMessage,
|
|
52
|
-
AgentStreamChannel,
|
|
53
|
-
AgentStreamEvent,
|
|
54
|
-
AgentThread,
|
|
55
|
-
CoreAgent,
|
|
56
|
-
PendingApproval,
|
|
57
|
-
PikkuAgentMiddlewareHooks,
|
|
58
|
-
} from './agent.types.js'
|
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
import { describe, test } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
voiceInput,
|
|
6
|
-
readsAsNonSpeech,
|
|
7
|
-
NoSpeechDetectedError,
|
|
8
|
-
SPOKEN_TURN,
|
|
9
|
-
SPOKEN_TRANSCRIPT,
|
|
10
|
-
} from './voice-input.js'
|
|
11
|
-
import type { AgentContentPart, AgentMessage } from './agent.types.js'
|
|
12
|
-
|
|
13
|
-
class ThisDependentRunner {
|
|
14
|
-
private readonly transcript = 'the transcribed spoken words'
|
|
15
|
-
|
|
16
|
-
async transcribe() {
|
|
17
|
-
return {
|
|
18
|
-
text: this.transcript,
|
|
19
|
-
segments: [],
|
|
20
|
-
language: 'en',
|
|
21
|
-
durationInSeconds: 1,
|
|
22
|
-
warnings: [],
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const audioMessage = (): AgentMessage => ({
|
|
28
|
-
id: 'm1',
|
|
29
|
-
role: 'user',
|
|
30
|
-
content: [
|
|
31
|
-
{ type: 'file', mediaType: 'audio/wav', data: 'AAAA' },
|
|
32
|
-
] as AgentContentPart[],
|
|
33
|
-
createdAt: new Date(0),
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
describe('voiceInput', () => {
|
|
37
|
-
test('transcribes an audio part by calling the runner with its receiver intact', async () => {
|
|
38
|
-
const mw = voiceInput({ model: 'mock/whisper' })
|
|
39
|
-
const services = { agentRunner: new ThisDependentRunner() }
|
|
40
|
-
|
|
41
|
-
const result = await mw.modifyInput!(services as any, {
|
|
42
|
-
messages: [audioMessage()],
|
|
43
|
-
instructions: 'sys',
|
|
44
|
-
shared: {},
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
const last = result.messages[result.messages.length - 1]!
|
|
48
|
-
const parts = last.content as AgentContentPart[]
|
|
49
|
-
assert.equal(parts.length, 1)
|
|
50
|
-
assert.equal(parts[0]!.type, 'text')
|
|
51
|
-
assert.equal(
|
|
52
|
-
(parts[0] as { text: string }).text,
|
|
53
|
-
'the transcribed spoken words'
|
|
54
|
-
)
|
|
55
|
-
assert.ok(!parts.some((p) => p.type === 'file'))
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
test('leaves the message untouched when there is no audio part', async () => {
|
|
59
|
-
const mw = voiceInput({ model: 'mock/whisper' })
|
|
60
|
-
const services = { agentRunner: new ThisDependentRunner() }
|
|
61
|
-
const messages: AgentMessage[] = [
|
|
62
|
-
{
|
|
63
|
-
id: 'm1',
|
|
64
|
-
role: 'user',
|
|
65
|
-
content: 'just text',
|
|
66
|
-
createdAt: new Date(0),
|
|
67
|
-
},
|
|
68
|
-
]
|
|
69
|
-
|
|
70
|
-
const result = await mw.modifyInput!(services as any, {
|
|
71
|
-
messages,
|
|
72
|
-
instructions: 'sys',
|
|
73
|
-
shared: {},
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
assert.equal(result.messages[0]!.content, 'just text')
|
|
77
|
-
})
|
|
78
|
-
|
|
79
|
-
test('throws when an audio part is present but no model is configured', async () => {
|
|
80
|
-
const mw = voiceInput({})
|
|
81
|
-
const services = { agentRunner: new ThisDependentRunner() }
|
|
82
|
-
|
|
83
|
-
await assert.rejects(
|
|
84
|
-
() =>
|
|
85
|
-
mw.modifyInput!(services as any, {
|
|
86
|
-
messages: [audioMessage()],
|
|
87
|
-
instructions: 'sys',
|
|
88
|
-
shared: {},
|
|
89
|
-
}),
|
|
90
|
-
/voiceInput requires a transcription model/
|
|
91
|
-
)
|
|
92
|
-
})
|
|
93
|
-
|
|
94
|
-
test('a turn with no speech in it never reaches the model', async () => {
|
|
95
|
-
// The failure this prevents: the user says nothing, the model answers
|
|
96
|
-
// anyway, and what it answers is a guess about audio it could not hear.
|
|
97
|
-
// An ASR that returns '' on non-speech is what makes this checkable — see
|
|
98
|
-
// readsAsNonSpeech for why nothing subtler than '' survived contact.
|
|
99
|
-
const silent = {
|
|
100
|
-
async transcribe() {
|
|
101
|
-
return { text: '', segments: [], warnings: [] }
|
|
102
|
-
},
|
|
103
|
-
}
|
|
104
|
-
const mw = voiceInput({
|
|
105
|
-
model: 'deepinfra/nvidia/Nemotron-3.5-ASR-Streaming-Multilingual-0.6b',
|
|
106
|
-
})
|
|
107
|
-
|
|
108
|
-
await assert.rejects(
|
|
109
|
-
() =>
|
|
110
|
-
mw.modifyInput!({ agentRunner: silent } as any, {
|
|
111
|
-
messages: [audioMessage()],
|
|
112
|
-
instructions: 'sys',
|
|
113
|
-
shared: {},
|
|
114
|
-
}),
|
|
115
|
-
NoSpeechDetectedError
|
|
116
|
-
)
|
|
117
|
-
})
|
|
118
|
-
|
|
119
|
-
test('a transcript is passed through exactly as the provider wrote it', async () => {
|
|
120
|
-
// No reassembly, no trimming, no filtering — whatever the model heard is
|
|
121
|
-
// what the agent is asked about.
|
|
122
|
-
const spaced = {
|
|
123
|
-
async transcribe() {
|
|
124
|
-
return {
|
|
125
|
-
text: ' spacing the provider chose ',
|
|
126
|
-
segments: [],
|
|
127
|
-
warnings: [],
|
|
128
|
-
}
|
|
129
|
-
},
|
|
130
|
-
}
|
|
131
|
-
const mw = voiceInput({ model: 'mock/asr' })
|
|
132
|
-
|
|
133
|
-
const result = await mw.modifyInput!({ agentRunner: spaced } as any, {
|
|
134
|
-
messages: [audioMessage()],
|
|
135
|
-
instructions: 'sys',
|
|
136
|
-
shared: {},
|
|
137
|
-
})
|
|
138
|
-
|
|
139
|
-
const parts = result.messages.at(-1)!.content as AgentContentPart[]
|
|
140
|
-
assert.equal(
|
|
141
|
-
(parts[0] as { text: string }).text,
|
|
142
|
-
' spacing the provider chose '
|
|
143
|
-
)
|
|
144
|
-
})
|
|
145
|
-
})
|
|
146
|
-
|
|
147
|
-
describe('readsAsNonSpeech', () => {
|
|
148
|
-
test('only an empty transcript counts as nothing said', () => {
|
|
149
|
-
assert.equal(readsAsNonSpeech({ text: '' }), true)
|
|
150
|
-
assert.equal(readsAsNonSpeech({ text: ' ' }), true)
|
|
151
|
-
assert.equal(readsAsNonSpeech({}), true)
|
|
152
|
-
assert.equal(readsAsNonSpeech({ text: 'add milk to the list' }), false)
|
|
153
|
-
})
|
|
154
|
-
|
|
155
|
-
test('a short or low-confidence-looking transcript is still speech', () => {
|
|
156
|
-
// The gate that used to live here would have been tempted by these. "Yes"
|
|
157
|
-
// is the single most important word in an approval flow, and dropping it
|
|
158
|
-
// because it is brief or quiet is far worse than keeping a stray one.
|
|
159
|
-
assert.equal(readsAsNonSpeech({ text: 'yes' }), false)
|
|
160
|
-
assert.equal(readsAsNonSpeech({ text: 'Thank you.' }), false)
|
|
161
|
-
})
|
|
162
|
-
test('records that the turn was spoken, for voiceOutput to read', async () => {
|
|
163
|
-
// The note has to be written here: the transcript this middleware puts in
|
|
164
|
-
// the message's place is indistinguishable from something typed, so no
|
|
165
|
-
// later middleware can tell what it started as.
|
|
166
|
-
const mw = voiceInput({ model: 'mock/whisper' })
|
|
167
|
-
const shared: Record<string, unknown> = {}
|
|
168
|
-
|
|
169
|
-
await mw.modifyInput!({ agentRunner: new ThisDependentRunner() } as any, {
|
|
170
|
-
messages: [audioMessage()],
|
|
171
|
-
instructions: 'sys',
|
|
172
|
-
shared,
|
|
173
|
-
})
|
|
174
|
-
|
|
175
|
-
assert.equal(shared[SPOKEN_TURN], true)
|
|
176
|
-
})
|
|
177
|
-
|
|
178
|
-
test('records a typed turn as not spoken, rather than leaving it unsaid', async () => {
|
|
179
|
-
const mw = voiceInput({ model: 'mock/whisper' })
|
|
180
|
-
const shared: Record<string, unknown> = {}
|
|
181
|
-
|
|
182
|
-
await mw.modifyInput!({ agentRunner: new ThisDependentRunner() } as any, {
|
|
183
|
-
messages: [{ role: 'user', content: 'typed' } as any],
|
|
184
|
-
instructions: 'sys',
|
|
185
|
-
shared,
|
|
186
|
-
})
|
|
187
|
-
|
|
188
|
-
// Explicitly false, not absent: absent is what a caller with no voice input
|
|
189
|
-
// at all looks like, and that one should still be spoken to.
|
|
190
|
-
assert.equal(shared[SPOKEN_TURN], false)
|
|
191
|
-
})
|
|
192
|
-
|
|
193
|
-
test('records what was heard, so the client can show the user their own turn', async () => {
|
|
194
|
-
const mw = voiceInput({ model: 'mock/whisper' })
|
|
195
|
-
const shared: Record<string, unknown> = {}
|
|
196
|
-
|
|
197
|
-
await mw.modifyInput!({ agentRunner: new ThisDependentRunner() } as any, {
|
|
198
|
-
messages: [audioMessage()],
|
|
199
|
-
instructions: 'sys',
|
|
200
|
-
shared,
|
|
201
|
-
})
|
|
202
|
-
|
|
203
|
-
assert.equal(shared[SPOKEN_TRANSCRIPT], 'the transcribed spoken words')
|
|
204
|
-
})
|
|
205
|
-
|
|
206
|
-
test('a typed turn leaves no transcript behind', async () => {
|
|
207
|
-
// Absence is the signal: the stream only announces a transcript when there
|
|
208
|
-
// was one, and a typed message is already on the client's screen.
|
|
209
|
-
const mw = voiceInput({ model: 'mock/whisper' })
|
|
210
|
-
const shared: Record<string, unknown> = {}
|
|
211
|
-
|
|
212
|
-
await mw.modifyInput!({ agentRunner: new ThisDependentRunner() } as any, {
|
|
213
|
-
messages: [{ role: 'user', content: 'typed' } as any],
|
|
214
|
-
instructions: 'sys',
|
|
215
|
-
shared,
|
|
216
|
-
})
|
|
217
|
-
|
|
218
|
-
assert.equal(SPOKEN_TRANSCRIPT in shared, false)
|
|
219
|
-
})
|
|
220
|
-
})
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
import type { AgentRunnerService } from '../../services/agent-runner-service.js'
|
|
2
|
-
import { pikkuAgentMiddleware } from '../../middleware/middleware-factories.js'
|
|
3
|
-
import { safeFetch } from '../../utils/safe-fetch.js'
|
|
4
|
-
import type { AgentContentPart } from './agent.types.js'
|
|
5
|
-
|
|
6
|
-
function base64ToUint8Array(base64: string): Uint8Array {
|
|
7
|
-
const binary = atob(base64)
|
|
8
|
-
const bytes = new Uint8Array(binary.length)
|
|
9
|
-
for (let i = 0; i < binary.length; i++) {
|
|
10
|
-
bytes[i] = binary.charCodeAt(i)
|
|
11
|
-
}
|
|
12
|
-
return bytes
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
const MAX_AUDIO_SIZE = 50 * 1024 * 1024
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Raised when every audio part in a turn turned out to be non-speech.
|
|
19
|
-
*
|
|
20
|
-
* Distinct from a transcription failure, because the response is different: a
|
|
21
|
-
* failure is worth reporting, whereas this is the microphone doing its job on a
|
|
22
|
-
* pause. A voice loop should catch it and go back to listening without running
|
|
23
|
-
* the agent — answering a hallucinated sentence is worse than answering nothing.
|
|
24
|
-
*/
|
|
25
|
-
export class NoSpeechDetectedError extends Error {
|
|
26
|
-
constructor() {
|
|
27
|
-
super('No speech was detected in the audio.')
|
|
28
|
-
this.name = 'NoSpeechDetectedError'
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Whether nothing usable was said — an empty transcript, and nothing cleverer
|
|
34
|
-
* than that.
|
|
35
|
-
*
|
|
36
|
-
* There was a confidence gate here once, and it is worth recording why it is
|
|
37
|
-
* gone. Whisper is trained on subtitles, so audio it cannot parse comes back
|
|
38
|
-
* not as nothing but as stock filler appended to real speech: "Hello, my name
|
|
39
|
-
* is Yasir. Thank you." where only the first sentence was spoken. The obvious
|
|
40
|
-
* defence is to drop low-confidence segments, and it does not work. Measured on
|
|
41
|
-
* a real turn, the invented "Thank you." scored `avg_logprob` -0.52 against
|
|
42
|
-
* -0.30 for the genuine sentence beside it, and `no_speech_prob` read 0.000 for
|
|
43
|
-
* both. Whisper is *confident* when it invents, because the text it invents is
|
|
44
|
-
* high-probability text. No threshold separates those two numbers, and one set
|
|
45
|
-
* low enough to try would take real quiet speech with it.
|
|
46
|
-
*
|
|
47
|
-
* The fix belongs at the model, not behind it: an ASR that is not a
|
|
48
|
-
* subtitle-trained autoregressive decoder returns an empty string on non-speech
|
|
49
|
-
* and there is nothing left to filter. Hence this reduces to asking whether
|
|
50
|
-
* anything came back at all — which is a property every provider reports
|
|
51
|
-
* honestly, unlike per-segment confidence (Nemotron, for one, hardcodes
|
|
52
|
-
* `avg_logprob` to 0.0).
|
|
53
|
-
*/
|
|
54
|
-
export const readsAsNonSpeech = (result: { text?: string }): boolean =>
|
|
55
|
-
!(result.text ?? '').trim()
|
|
56
|
-
|
|
57
|
-
async function fetchAsUint8Array(
|
|
58
|
-
url: string,
|
|
59
|
-
allowedAudioHosts?: string[]
|
|
60
|
-
): Promise<Uint8Array> {
|
|
61
|
-
const response = await safeFetch(url, {}, { allowedHosts: allowedAudioHosts })
|
|
62
|
-
const contentLength = response.headers.get('content-length')
|
|
63
|
-
if (contentLength && parseInt(contentLength, 10) > MAX_AUDIO_SIZE) {
|
|
64
|
-
throw new Error('Audio file exceeds maximum size')
|
|
65
|
-
}
|
|
66
|
-
const buffer = await response.arrayBuffer()
|
|
67
|
-
if (buffer.byteLength > MAX_AUDIO_SIZE) {
|
|
68
|
-
throw new Error('Audio file exceeds maximum size')
|
|
69
|
-
}
|
|
70
|
-
return new Uint8Array(buffer)
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Shared-notes key recording whether the user's turn arrived as audio.
|
|
75
|
-
*
|
|
76
|
-
* Written here because this is the last point at which it is knowable: the
|
|
77
|
-
* transcript that replaces the audio is indistinguishable from something typed.
|
|
78
|
-
* Read by `voiceOutput` to decide whether to answer aloud.
|
|
79
|
-
*
|
|
80
|
-
* Absent — rather than `false` — when this middleware is not wired at all, which
|
|
81
|
-
* is what lets `voiceOutput` still speak for a caller that has no voice input.
|
|
82
|
-
*/
|
|
83
|
-
export const SPOKEN_TURN = 'voice:spokenTurn'
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Shared-notes key holding what the user was heard to say, when they spoke.
|
|
87
|
-
*
|
|
88
|
-
* Absent on a typed turn. Read by the stream wiring, which forwards it to the
|
|
89
|
-
* client as a `transcript` event — a voice client has no idea what its own
|
|
90
|
-
* audio said, and without this the user's turn shows up in the UI as an empty
|
|
91
|
-
* bubble followed by an answer to a question they cannot see.
|
|
92
|
-
*/
|
|
93
|
-
export const SPOKEN_TRANSCRIPT = 'voice:transcript'
|
|
94
|
-
|
|
95
|
-
export const voiceInput = (config?: {
|
|
96
|
-
language?: string
|
|
97
|
-
model?: string
|
|
98
|
-
allowedAudioHosts?: string[]
|
|
99
|
-
}) =>
|
|
100
|
-
pikkuAgentMiddleware({
|
|
101
|
-
modifyInput: async (services, { messages, instructions, shared }) => {
|
|
102
|
-
const agentRunner = (
|
|
103
|
-
services as {
|
|
104
|
-
agentRunner?: AgentRunnerService
|
|
105
|
-
}
|
|
106
|
-
).agentRunner
|
|
107
|
-
if (!agentRunner?.transcribe) return { messages, instructions }
|
|
108
|
-
|
|
109
|
-
const last = messages[messages.length - 1]
|
|
110
|
-
const parts =
|
|
111
|
-
last?.role === 'user' && typeof last.content !== 'string'
|
|
112
|
-
? (last.content as AgentContentPart[] | undefined)
|
|
113
|
-
: undefined
|
|
114
|
-
|
|
115
|
-
const hasAudio = !!parts?.some(
|
|
116
|
-
(p) => p.type === 'file' && !!p.mediaType?.startsWith('audio/')
|
|
117
|
-
)
|
|
118
|
-
// Recorded on every turn this middleware sees, spoken or not, so that a
|
|
119
|
-
// typed turn is an explicit `false` downstream rather than a silence that
|
|
120
|
-
// could equally mean nobody was asked.
|
|
121
|
-
shared[SPOKEN_TURN] = hasAudio
|
|
122
|
-
if (!hasAudio || !parts) return { messages, instructions }
|
|
123
|
-
|
|
124
|
-
const updatedContent: AgentContentPart[] = []
|
|
125
|
-
const heard: string[] = []
|
|
126
|
-
for (const p of parts) {
|
|
127
|
-
if (!(p.type === 'file' && p.mediaType?.startsWith('audio/'))) {
|
|
128
|
-
updatedContent.push(p)
|
|
129
|
-
continue
|
|
130
|
-
}
|
|
131
|
-
if (!config?.model) {
|
|
132
|
-
throw new Error(
|
|
133
|
-
'voiceInput requires a transcription model (e.g. openai/whisper-1)'
|
|
134
|
-
)
|
|
135
|
-
}
|
|
136
|
-
const audioData = p.data
|
|
137
|
-
? base64ToUint8Array(p.data)
|
|
138
|
-
: await fetchAsUint8Array(p.url!, config.allowedAudioHosts)
|
|
139
|
-
if (audioData.byteLength > MAX_AUDIO_SIZE) {
|
|
140
|
-
throw new Error('Audio file exceeds maximum size')
|
|
141
|
-
}
|
|
142
|
-
const result = await agentRunner.transcribe({
|
|
143
|
-
model: config.model,
|
|
144
|
-
audio: audioData,
|
|
145
|
-
...(config.language
|
|
146
|
-
? {
|
|
147
|
-
providerOptions: {
|
|
148
|
-
openai: {
|
|
149
|
-
language: config.language,
|
|
150
|
-
},
|
|
151
|
-
},
|
|
152
|
-
}
|
|
153
|
-
: {}),
|
|
154
|
-
})
|
|
155
|
-
// Dropped when nothing was said: an empty text part is still a turn the
|
|
156
|
-
// model will answer, and what it answers is a guess about what it could
|
|
157
|
-
// not hear.
|
|
158
|
-
if (readsAsNonSpeech(result)) continue
|
|
159
|
-
heard.push(result.text)
|
|
160
|
-
updatedContent.push({ type: 'text' as const, text: result.text })
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// Every part was audio, and none of it was speech. There is nothing left
|
|
164
|
-
// to send, and a message with no content is not a question.
|
|
165
|
-
if (updatedContent.length === 0) throw new NoSpeechDetectedError()
|
|
166
|
-
|
|
167
|
-
// knowledge: decisions/internals/an-empty-transcript-is-not-recorded.md
|
|
168
|
-
if (heard.length > 0) {
|
|
169
|
-
shared[SPOKEN_TRANSCRIPT] = heard.join(' ')
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
return {
|
|
173
|
-
messages: [
|
|
174
|
-
...messages.slice(0, -1),
|
|
175
|
-
{ ...last, content: updatedContent },
|
|
176
|
-
],
|
|
177
|
-
instructions,
|
|
178
|
-
}
|
|
179
|
-
},
|
|
180
|
-
})
|