@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,508 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
ScenarioPersona,
|
|
3
|
-
ResolvedPersona,
|
|
4
|
-
ScenarioPersonas,
|
|
5
|
-
ScenarioInvokeOptions,
|
|
6
|
-
ScenarioHttpResponse,
|
|
7
|
-
} from './personas-service.js'
|
|
8
|
-
import { readScenarioHttpResponse } from './personas-service.js'
|
|
9
|
-
import type {
|
|
10
|
-
ConverseOptions,
|
|
11
|
-
ActorFlowVerdict,
|
|
12
|
-
TargetAgentReply,
|
|
13
|
-
TargetPendingApproval,
|
|
14
|
-
} from '../wirings/actor-flow/actor-flow.types.js'
|
|
15
|
-
import { runConversation } from '../wirings/actor-flow/run-conversation.js'
|
|
16
|
-
import {
|
|
17
|
-
createCookieJar,
|
|
18
|
-
type ScenarioCookieJar,
|
|
19
|
-
} from '../wirings/workflow/scenario-cookie-jar.js'
|
|
20
|
-
import {
|
|
21
|
-
ActorSignIn,
|
|
22
|
-
type ActorSecretResolver,
|
|
23
|
-
OperatorSignIn,
|
|
24
|
-
type OperatorSignInOptions,
|
|
25
|
-
type PersonaSignIn,
|
|
26
|
-
authMount,
|
|
27
|
-
} from './persona-sign-in.js'
|
|
28
|
-
import { getSingletonServices } from '../pikku-state.js'
|
|
29
|
-
import { AIProviderNotConfiguredError } from '../errors/errors.js'
|
|
30
|
-
|
|
31
|
-
export interface HttpPersonasConfig {
|
|
32
|
-
/**
|
|
33
|
-
* Base API URL of the target app, INCLUDING the HTTP prefix — e.g.
|
|
34
|
-
* `https://app.example.com/api` or `http://localhost:4000/api`. Sign-in is
|
|
35
|
-
* reached at `${apiUrl}${signInPath}` and exposed RPCs at
|
|
36
|
-
* `${apiUrl}${rpcPath}/:rpcName`.
|
|
37
|
-
*/
|
|
38
|
-
apiUrl: string
|
|
39
|
-
/**
|
|
40
|
-
* The ROOT actor secret, from which each persona's own credential is derived
|
|
41
|
-
* and bound to their address. Sign-in only ever works for user rows flagged
|
|
42
|
-
* `actor: true`, and a derived credential only ever works for the one address
|
|
43
|
-
* it was derived for.
|
|
44
|
-
*
|
|
45
|
-
* Pass an {@link ActorSecretResolver} instead to drive personas whose
|
|
46
|
-
* credentials were minted elsewhere — a caller entitled to one persona then
|
|
47
|
-
* never holds the root.
|
|
48
|
-
*
|
|
49
|
-
* The local-development credential. A deployed stage has none, and passes
|
|
50
|
-
* {@link HttpPersonasConfig.operator} instead.
|
|
51
|
-
*/
|
|
52
|
-
secret?: string | ActorSecretResolver
|
|
53
|
-
/**
|
|
54
|
-
* Fabric operator credentials, for signing personas into a DEPLOYED stage.
|
|
55
|
-
*
|
|
56
|
-
* Mutually exclusive with {@link HttpPersonasConfig.secret}: the operator
|
|
57
|
-
* path acts as the persona through an admin session rather than logging in as
|
|
58
|
-
* them, so no test credential has to exist on the target at all.
|
|
59
|
-
*/
|
|
60
|
-
operator?: OperatorSignInOptions
|
|
61
|
-
/** Persona id → the declaration with its address filled in. */
|
|
62
|
-
personas: Record<string, ResolvedPersona>
|
|
63
|
-
/**
|
|
64
|
-
* Sign-in path under apiUrl, for whichever of the two paths is in use — an
|
|
65
|
-
* app that mounts auth under `/api` moves both. Default: the actor plugin's
|
|
66
|
-
* `/auth/sign-in/actor`, or `/auth/sign-in/fabric` for an operator.
|
|
67
|
-
* {@link OperatorSignInOptions.signInPath} overrides it.
|
|
68
|
-
*/
|
|
69
|
-
signInPath?: string
|
|
70
|
-
/**
|
|
71
|
-
* Where the session (and its roles) is read back. Defaults to `get-session`
|
|
72
|
-
* under the same auth mount as {@link HttpPersonasConfig.signInPath}, so an
|
|
73
|
-
* app that moved auth under `/api` moves this with it and does not have to
|
|
74
|
-
* say so twice.
|
|
75
|
-
*/
|
|
76
|
-
sessionPath?: string
|
|
77
|
-
/** Exposed-RPC path prefix under apiUrl. Default `/rpc`. */
|
|
78
|
-
rpcPath?: string
|
|
79
|
-
/**
|
|
80
|
-
* Exposed RPC that reports the CALLER's own roles, as `{ roles: string[] }`.
|
|
81
|
-
* Default `getMyScopes`. Pass `false` to skip it and read better-auth only.
|
|
82
|
-
*
|
|
83
|
-
* Asked before better-auth's `user.role`, because in an app that authorizes
|
|
84
|
-
* on scopes that column is a projection rather than the model — it exists so
|
|
85
|
-
* better-auth's own admin endpoints have something to read, is written by
|
|
86
|
-
* whatever keeps it in step, and is absent entirely from an app that declares
|
|
87
|
-
* no such field. A persona verified against it is verified against a copy.
|
|
88
|
-
*/
|
|
89
|
-
rolesRpc?: string | false
|
|
90
|
-
/**
|
|
91
|
-
* Default model a persona thinks with when `converse(...)` is called without
|
|
92
|
-
* an explicit `model`. Its own turns/approvals/evaluation run in-process via
|
|
93
|
-
* the configured `agentRunner`.
|
|
94
|
-
*/
|
|
95
|
-
model?: string
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Default HTTP-backed persona. Signs in lazily on first invoke, holds the
|
|
100
|
-
* session cookies for its lifetime, and re-logs-in once on a 401 mid-run (long
|
|
101
|
-
* health-check runs can outlive a session).
|
|
102
|
-
*
|
|
103
|
-
* How it signs in depends on the target, and the two ways are not
|
|
104
|
-
* interchangeable — see {@link ActorSignIn} for local development and
|
|
105
|
-
* {@link OperatorSignIn} for a deployed stage.
|
|
106
|
-
*/
|
|
107
|
-
export class HttpPersona implements ScenarioPersona {
|
|
108
|
-
private jar: ScenarioCookieJar
|
|
109
|
-
/**
|
|
110
|
-
* Whether `login()` has succeeded since the last time the session was
|
|
111
|
-
* dropped. The jar cannot answer this — a target may set a cookie before
|
|
112
|
-
* anyone signs in, and it would then look like a session that was never
|
|
113
|
-
* established.
|
|
114
|
-
*/
|
|
115
|
-
private signedIn = false
|
|
116
|
-
private signIn: PersonaSignIn
|
|
117
|
-
|
|
118
|
-
constructor(
|
|
119
|
-
readonly name: string,
|
|
120
|
-
private persona: ResolvedPersona,
|
|
121
|
-
private config: HttpPersonasConfig
|
|
122
|
-
) {
|
|
123
|
-
this.jar = createCookieJar(config.apiUrl)
|
|
124
|
-
if (config.operator) {
|
|
125
|
-
this.signIn = new OperatorSignIn(config.apiUrl, {
|
|
126
|
-
...config.operator,
|
|
127
|
-
signInPath:
|
|
128
|
-
config.operator.signInPath ??
|
|
129
|
-
(authMount(config.signInPath)
|
|
130
|
-
? `${authMount(config.signInPath)}/sign-in/fabric`
|
|
131
|
-
: undefined),
|
|
132
|
-
})
|
|
133
|
-
} else if (config.secret) {
|
|
134
|
-
this.signIn = new ActorSignIn(
|
|
135
|
-
config.apiUrl,
|
|
136
|
-
config.secret,
|
|
137
|
-
config.signInPath ?? '/auth/sign-in/actor'
|
|
138
|
-
)
|
|
139
|
-
} else {
|
|
140
|
-
throw new Error(
|
|
141
|
-
`[scenario] persona '${name}' has no way to sign in — set 'secret' for a dev target or 'operator' for a deployed one`
|
|
142
|
-
)
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
get email(): string {
|
|
147
|
-
return this.persona.email
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
async invoke(rpcName: string, data: unknown): Promise<unknown> {
|
|
151
|
-
const res = await this.invokeRaw(rpcName, data)
|
|
152
|
-
if (!res.ok) {
|
|
153
|
-
throw new Error(
|
|
154
|
-
`[scenario] '${rpcName}' as '${this.name}' returned ${res.status}: ${res.serialized.slice(0, 300)}`
|
|
155
|
-
)
|
|
156
|
-
}
|
|
157
|
-
return res.body
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
async invokeRaw(
|
|
161
|
-
rpcName: string,
|
|
162
|
-
data: unknown,
|
|
163
|
-
options?: ScenarioInvokeOptions
|
|
164
|
-
): Promise<ScenarioHttpResponse> {
|
|
165
|
-
if (!this.signedIn) {
|
|
166
|
-
await this.login()
|
|
167
|
-
}
|
|
168
|
-
let res = await this.postRpc(rpcName, data, options?.headers)
|
|
169
|
-
if (res.status === 401) {
|
|
170
|
-
// Session expired mid-run — re-login once and retry.
|
|
171
|
-
this.signOut()
|
|
172
|
-
await this.login()
|
|
173
|
-
res = await this.postRpc(rpcName, data, options?.headers)
|
|
174
|
-
}
|
|
175
|
-
return readScenarioHttpResponse(res)
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
async converse(options: ConverseOptions): Promise<ActorFlowVerdict> {
|
|
179
|
-
const { agentRunner } = getSingletonServices()
|
|
180
|
-
if (!agentRunner) {
|
|
181
|
-
throw new AIProviderNotConfiguredError()
|
|
182
|
-
}
|
|
183
|
-
// Signed in here rather than left to postAgent's 401 retry, which a public
|
|
184
|
-
// agent route never triggers. An unowned thread is minted under a fresh
|
|
185
|
-
// anonymous id per request, so turn one succeeds and turn two is refused as
|
|
186
|
-
// somebody else's — and a persona is a real account with real credentials,
|
|
187
|
-
// so there is no case where conversing as nobody is the intent.
|
|
188
|
-
if (!this.signedIn) {
|
|
189
|
-
await this.login()
|
|
190
|
-
}
|
|
191
|
-
const model = options.model ?? this.config.model
|
|
192
|
-
if (!model) {
|
|
193
|
-
throw new Error(
|
|
194
|
-
`[scenario] persona '${this.name}' converse needs a model — pass options.model or set 'model' on the personas service`
|
|
195
|
-
)
|
|
196
|
-
}
|
|
197
|
-
const threadId = globalThis.crypto.randomUUID()
|
|
198
|
-
const resourceId = `persona:${this.name}`
|
|
199
|
-
|
|
200
|
-
return runConversation({
|
|
201
|
-
persona: this.persona,
|
|
202
|
-
personaId: this.name,
|
|
203
|
-
agentName: options.agent,
|
|
204
|
-
task: options.task,
|
|
205
|
-
evaluate: options.evaluate,
|
|
206
|
-
approvals: options.approvals,
|
|
207
|
-
model,
|
|
208
|
-
maxTurns: options.maxTurns,
|
|
209
|
-
llm: (params) => agentRunner.run(params),
|
|
210
|
-
target: {
|
|
211
|
-
run: (message) =>
|
|
212
|
-
this.agentRun(options.agent, message, threadId, resourceId),
|
|
213
|
-
approve: (runId, decisions) =>
|
|
214
|
-
this.agentApprove(options.agent, runId, decisions),
|
|
215
|
-
},
|
|
216
|
-
})
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* The roles the stage says this session holds.
|
|
221
|
-
*
|
|
222
|
-
* {@link HttpPersonasConfig.rolesRpc} first, then better-auth's
|
|
223
|
-
* `get-session` — where its admin plugin puts `role` on the user, as a
|
|
224
|
-
* comma-separated list. A target that answers neither returns `null` rather
|
|
225
|
-
* than an empty list, because "this stage does not report roles" and "this
|
|
226
|
-
* person has none" call for opposite responses from the caller.
|
|
227
|
-
*/
|
|
228
|
-
async sessionRoles(): Promise<string[] | null> {
|
|
229
|
-
if (!this.signedIn) {
|
|
230
|
-
await this.login()
|
|
231
|
-
}
|
|
232
|
-
const fromRpc = await this.rolesFromRpc()
|
|
233
|
-
if (fromRpc) return fromRpc
|
|
234
|
-
return await this.rolesFromSession()
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
/**
|
|
238
|
-
* The caller's own roles, from the app's own RPC. `null` for every answer
|
|
239
|
-
* that is not a role list — an app without the RPC 404s here, which is a
|
|
240
|
-
* reason to go on and ask better-auth, not a reason to report "none".
|
|
241
|
-
*/
|
|
242
|
-
private async rolesFromRpc(): Promise<string[] | null> {
|
|
243
|
-
const rpcName = this.config.rolesRpc ?? 'getMyScopes'
|
|
244
|
-
if (rpcName === false) return null
|
|
245
|
-
let res: Response
|
|
246
|
-
try {
|
|
247
|
-
res = await this.postRpc(rpcName, {})
|
|
248
|
-
} catch {
|
|
249
|
-
return null
|
|
250
|
-
}
|
|
251
|
-
if (!res.ok) return null
|
|
252
|
-
const { body } = await readScenarioHttpResponse<{
|
|
253
|
-
roles?: unknown
|
|
254
|
-
data?: { roles?: unknown }
|
|
255
|
-
}>(res)
|
|
256
|
-
const roles = body?.roles ?? body?.data?.roles
|
|
257
|
-
if (!Array.isArray(roles)) return null
|
|
258
|
-
return roles.filter((name): name is string => typeof name === 'string')
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
private async rolesFromSession(): Promise<string[] | null> {
|
|
262
|
-
const mount = authMount(
|
|
263
|
-
this.config.operator?.signInPath ?? this.config.signInPath
|
|
264
|
-
)
|
|
265
|
-
const sessionPath =
|
|
266
|
-
this.config.sessionPath ?? `${mount ?? '/auth'}/get-session`
|
|
267
|
-
const res = await this.jar.fetch(`${this.config.apiUrl}${sessionPath}`, {
|
|
268
|
-
headers: this.signIn.headers(),
|
|
269
|
-
})
|
|
270
|
-
if (!res.ok) {
|
|
271
|
-
return null
|
|
272
|
-
}
|
|
273
|
-
const text = await res.text().catch(() => '')
|
|
274
|
-
if (!text) {
|
|
275
|
-
return null
|
|
276
|
-
}
|
|
277
|
-
let payload: unknown
|
|
278
|
-
try {
|
|
279
|
-
payload = JSON.parse(text)
|
|
280
|
-
} catch {
|
|
281
|
-
return null
|
|
282
|
-
}
|
|
283
|
-
const user = (payload as { user?: { role?: unknown } } | null)?.user
|
|
284
|
-
const role = user?.role
|
|
285
|
-
if (typeof role === 'string') {
|
|
286
|
-
return role
|
|
287
|
-
.split(',')
|
|
288
|
-
.map((name) => name.trim())
|
|
289
|
-
.filter(Boolean)
|
|
290
|
-
}
|
|
291
|
-
if (Array.isArray(role)) {
|
|
292
|
-
return role.filter((name): name is string => typeof name === 'string')
|
|
293
|
-
}
|
|
294
|
-
// The session came back and carried a user, but no role field — that is a
|
|
295
|
-
// stage reporting "none", not a stage that cannot report.
|
|
296
|
-
return user ? [] : null
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
/**
|
|
300
|
-
* Start/continue the target agent's run over HTTP as this persona.
|
|
301
|
-
*
|
|
302
|
-
* The SSE route, not the plain one. `POST /rpc/agent/:name` buffers the whole
|
|
303
|
-
* run before it sends a single byte, so a run longer than the client's
|
|
304
|
-
* headers timeout — 300s in undici, which is what Node and Bun both use —
|
|
305
|
-
* fails with `UND_ERR_HEADERS_TIMEOUT` and no way to tell it apart from a
|
|
306
|
-
* stage that is down. An agent that talks for several minutes, which is the
|
|
307
|
-
* normal case for anything conversational, cannot be driven that way at all.
|
|
308
|
-
* The stream sends its first event immediately and the run's length stops
|
|
309
|
-
* mattering.
|
|
310
|
-
*/
|
|
311
|
-
private async agentRun(
|
|
312
|
-
agentName: string,
|
|
313
|
-
message: string,
|
|
314
|
-
threadId: string,
|
|
315
|
-
resourceId: string
|
|
316
|
-
): Promise<TargetAgentReply> {
|
|
317
|
-
const res = await this.sendAgent(`agent/${agentName}/stream`, {
|
|
318
|
-
message,
|
|
319
|
-
threadId,
|
|
320
|
-
resourceId,
|
|
321
|
-
})
|
|
322
|
-
return await collectAgentStream(res)
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
/** Answer the target agent's pending approvals over HTTP and continue. */
|
|
326
|
-
private async agentApprove(
|
|
327
|
-
agentName: string,
|
|
328
|
-
runId: string,
|
|
329
|
-
decisions: { toolCallId: string; approved: boolean }[]
|
|
330
|
-
): Promise<TargetAgentReply> {
|
|
331
|
-
const raw = await this.postAgent(`agent/${agentName}/approve`, {
|
|
332
|
-
runId,
|
|
333
|
-
approvals: decisions,
|
|
334
|
-
})
|
|
335
|
-
return normalizeAgentReply(raw)
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
// knowledge: decisions/internals/scenario-agent-calls-sign-in-on-401-only.md
|
|
339
|
-
private async sendAgent(subPath: string, body: unknown): Promise<Response> {
|
|
340
|
-
const rpcPath = this.config.rpcPath ?? '/rpc'
|
|
341
|
-
const url = `${this.config.apiUrl}${rpcPath}/${subPath}`
|
|
342
|
-
const send = () =>
|
|
343
|
-
this.jar.fetch(url, {
|
|
344
|
-
method: 'POST',
|
|
345
|
-
headers: {
|
|
346
|
-
'content-type': 'application/json',
|
|
347
|
-
...this.signIn.headers(),
|
|
348
|
-
},
|
|
349
|
-
body: JSON.stringify(body),
|
|
350
|
-
})
|
|
351
|
-
|
|
352
|
-
let res = await send()
|
|
353
|
-
if (res.status === 401) {
|
|
354
|
-
this.signOut()
|
|
355
|
-
await this.login()
|
|
356
|
-
res = await send()
|
|
357
|
-
}
|
|
358
|
-
if (!res.ok) {
|
|
359
|
-
const text = (await res.text().catch(() => '')).slice(0, 300)
|
|
360
|
-
throw new Error(
|
|
361
|
-
`[scenario] agent call '${subPath}' as '${this.name}' returned ${res.status}: ${text}`
|
|
362
|
-
)
|
|
363
|
-
}
|
|
364
|
-
return res
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
private async postAgent(subPath: string, body: unknown): Promise<unknown> {
|
|
368
|
-
const res = await this.sendAgent(subPath, body)
|
|
369
|
-
if (res.status === 204) return undefined
|
|
370
|
-
const text = await res.text()
|
|
371
|
-
return text ? JSON.parse(text) : undefined
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
private async postRpc(
|
|
375
|
-
rpcName: string,
|
|
376
|
-
data: unknown,
|
|
377
|
-
extraHeaders?: Record<string, string>
|
|
378
|
-
) {
|
|
379
|
-
const rpcPath = this.config.rpcPath ?? '/rpc'
|
|
380
|
-
return this.jar.fetch(`${this.config.apiUrl}${rpcPath}/${rpcName}`, {
|
|
381
|
-
method: 'POST',
|
|
382
|
-
headers: {
|
|
383
|
-
'content-type': 'application/json',
|
|
384
|
-
...this.signIn.headers(),
|
|
385
|
-
...extraHeaders,
|
|
386
|
-
},
|
|
387
|
-
body: JSON.stringify({ data }),
|
|
388
|
-
})
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
/** Drop the session, so the next call signs in again before it goes out. */
|
|
392
|
-
private signOut(): void {
|
|
393
|
-
this.jar.clear()
|
|
394
|
-
this.signedIn = false
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
private async login(): Promise<void> {
|
|
398
|
-
await this.signIn.login(this.jar, this.persona)
|
|
399
|
-
this.signedIn = true
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
/**
|
|
404
|
-
* Reduce the agent's SSE run into the same reply shape the plain route returns.
|
|
405
|
-
*
|
|
406
|
-
* `RUN_ERROR` is raised rather than returned: the plain route answers a failed
|
|
407
|
-
* run with a non-2xx, and a scenario that read an error as an empty transcript
|
|
408
|
-
* would score the agent on silence it never produced.
|
|
409
|
-
*/
|
|
410
|
-
async function collectAgentStream(res: Response): Promise<TargetAgentReply> {
|
|
411
|
-
const body = res.body
|
|
412
|
-
if (!body) {
|
|
413
|
-
throw new Error('[scenario] the agent stream carried no body')
|
|
414
|
-
}
|
|
415
|
-
const decoder = new TextDecoder()
|
|
416
|
-
const reader = body.getReader()
|
|
417
|
-
let buffer = ''
|
|
418
|
-
let text = ''
|
|
419
|
-
let runId = ''
|
|
420
|
-
const pendingApprovals: TargetPendingApproval[] = []
|
|
421
|
-
|
|
422
|
-
const consume = (line: string) => {
|
|
423
|
-
if (!line.startsWith('data:')) return
|
|
424
|
-
const payload = line.slice(5).trim()
|
|
425
|
-
if (!payload) return
|
|
426
|
-
let event: Record<string, unknown>
|
|
427
|
-
try {
|
|
428
|
-
event = JSON.parse(payload)
|
|
429
|
-
} catch {
|
|
430
|
-
return
|
|
431
|
-
}
|
|
432
|
-
if (typeof event.runId === 'string' && event.runId) runId = event.runId
|
|
433
|
-
if (
|
|
434
|
-
event.type === 'TEXT_MESSAGE_CONTENT' &&
|
|
435
|
-
typeof event.delta === 'string'
|
|
436
|
-
) {
|
|
437
|
-
text += event.delta
|
|
438
|
-
} else if (event.type === 'approval-request') {
|
|
439
|
-
pendingApprovals.push({
|
|
440
|
-
toolCallId: String(event.toolCallId),
|
|
441
|
-
toolName: String(event.toolName),
|
|
442
|
-
args: event.args,
|
|
443
|
-
reason: typeof event.reason === 'string' ? event.reason : undefined,
|
|
444
|
-
})
|
|
445
|
-
} else if (event.type === 'RUN_ERROR' || event.type === 'error') {
|
|
446
|
-
const message = event.message ?? event.errorText ?? 'the agent run failed'
|
|
447
|
-
throw new Error(`[scenario] agent run failed: ${String(message)}`)
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
try {
|
|
452
|
-
for (;;) {
|
|
453
|
-
const { done, value } = await reader.read()
|
|
454
|
-
if (done) break
|
|
455
|
-
buffer += decoder.decode(value, { stream: true })
|
|
456
|
-
const lines = buffer.split('\n')
|
|
457
|
-
buffer = lines.pop() ?? ''
|
|
458
|
-
for (const line of lines) consume(line)
|
|
459
|
-
}
|
|
460
|
-
if (buffer) consume(buffer)
|
|
461
|
-
} finally {
|
|
462
|
-
await reader.cancel().catch(() => {})
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
return {
|
|
466
|
-
text,
|
|
467
|
-
runId,
|
|
468
|
-
status: pendingApprovals.length > 0 ? 'suspended' : 'completed',
|
|
469
|
-
pendingApprovals:
|
|
470
|
-
pendingApprovals.length > 0 ? pendingApprovals : undefined,
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
/** Normalize an agentRun/agentApprove HTTP response into a TargetAgentReply. */
|
|
475
|
-
function normalizeAgentReply(raw: unknown): TargetAgentReply {
|
|
476
|
-
const r = (raw ?? {}) as Record<string, unknown>
|
|
477
|
-
const pending = Array.isArray(r.pendingApprovals)
|
|
478
|
-
? (r.pendingApprovals as Array<Record<string, unknown>>).map((p) => ({
|
|
479
|
-
toolCallId: String(p.toolCallId),
|
|
480
|
-
toolName: String(p.toolName),
|
|
481
|
-
args: p.args,
|
|
482
|
-
reason: typeof p.reason === 'string' ? p.reason : undefined,
|
|
483
|
-
}))
|
|
484
|
-
: undefined
|
|
485
|
-
return {
|
|
486
|
-
text: typeof r.text === 'string' ? r.text : '',
|
|
487
|
-
runId: typeof r.runId === 'string' ? r.runId : '',
|
|
488
|
-
status:
|
|
489
|
-
r.status === 'completed' || r.status === 'suspended'
|
|
490
|
-
? r.status
|
|
491
|
-
: undefined,
|
|
492
|
-
pendingApprovals: pending,
|
|
493
|
-
}
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
/**
|
|
497
|
-
* Build the injected `personas` service from the declared personas: id → lazy
|
|
498
|
-
* HTTP persona. Wire the result as the `personas` singleton service.
|
|
499
|
-
*/
|
|
500
|
-
export function createHttpPersonas(
|
|
501
|
-
config: HttpPersonasConfig
|
|
502
|
-
): ScenarioPersonas {
|
|
503
|
-
const personas: ScenarioPersonas = {}
|
|
504
|
-
for (const [id, persona] of Object.entries(config.personas)) {
|
|
505
|
-
personas[id] = new HttpPersona(id, persona, config)
|
|
506
|
-
}
|
|
507
|
-
return personas
|
|
508
|
-
}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
AgentRunStateService,
|
|
3
|
-
CreateRunInput,
|
|
4
|
-
SaveScoreInput,
|
|
5
|
-
} from './agent-run-state-service.js'
|
|
6
|
-
import type {
|
|
7
|
-
AgentRunState,
|
|
8
|
-
PendingApproval,
|
|
9
|
-
} from '../wirings/agent/agent.types.js'
|
|
10
|
-
import type { AgentRunScore } from '../wirings/agent-scorer/agent-scorer.types.js'
|
|
11
|
-
|
|
12
|
-
export class InMemoryAgentRunStateService implements AgentRunStateService {
|
|
13
|
-
private runs = new Map<string, AgentRunState>()
|
|
14
|
-
private scores = new Map<string, AgentRunScore[]>()
|
|
15
|
-
private counter = 0
|
|
16
|
-
|
|
17
|
-
async createRun(run: CreateRunInput): Promise<string> {
|
|
18
|
-
const runId = `run-${++this.counter}-${Date.now()}`
|
|
19
|
-
this.runs.set(runId, { ...run, runId })
|
|
20
|
-
return runId
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
async updateRun(
|
|
24
|
-
runId: string,
|
|
25
|
-
updates: Partial<AgentRunState>
|
|
26
|
-
): Promise<void> {
|
|
27
|
-
const run = this.runs.get(runId)
|
|
28
|
-
if (run) {
|
|
29
|
-
Object.assign(run, updates, { updatedAt: new Date() })
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
async getRun(runId: string): Promise<AgentRunState | null> {
|
|
34
|
-
return this.runs.get(runId) ?? null
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
async getRunsByThread(threadId: string): Promise<AgentRunState[]> {
|
|
38
|
-
return [...this.runs.values()].filter((r) => r.threadId === threadId)
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
async resolveApproval(
|
|
42
|
-
toolCallId: string,
|
|
43
|
-
status: 'approved' | 'denied'
|
|
44
|
-
): Promise<boolean> {
|
|
45
|
-
for (const run of this.runs.values()) {
|
|
46
|
-
if (run.pendingApprovals) {
|
|
47
|
-
const approval = run.pendingApprovals.find(
|
|
48
|
-
(a) => a.toolCallId === toolCallId
|
|
49
|
-
)
|
|
50
|
-
if (approval) {
|
|
51
|
-
run.pendingApprovals = run.pendingApprovals.filter(
|
|
52
|
-
(a) => a.toolCallId !== toolCallId
|
|
53
|
-
)
|
|
54
|
-
run.updatedAt = new Date()
|
|
55
|
-
return true
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
return false
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
async findRunByToolCallId(
|
|
63
|
-
toolCallId: string
|
|
64
|
-
): Promise<{ run: AgentRunState; approval: PendingApproval } | null> {
|
|
65
|
-
for (const run of this.runs.values()) {
|
|
66
|
-
if (run.pendingApprovals) {
|
|
67
|
-
const approval = run.pendingApprovals.find(
|
|
68
|
-
(a) => a.toolCallId === toolCallId
|
|
69
|
-
)
|
|
70
|
-
if (approval) {
|
|
71
|
-
return { run, approval }
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
return null
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
async saveScore(score: SaveScoreInput): Promise<void> {
|
|
79
|
-
const existing = this.scores.get(score.runId) ?? []
|
|
80
|
-
existing.push({ ...score, createdAt: new Date() })
|
|
81
|
-
this.scores.set(score.runId, existing)
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
async getScores(runId: string): Promise<AgentRunScore[]> {
|
|
85
|
-
return [...(this.scores.get(runId) ?? [])]
|
|
86
|
-
}
|
|
87
|
-
}
|