@pikku/core 0.12.72 → 0.12.77
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 +1171 -0
- package/dist/column-form.d.ts +32 -0
- package/dist/column-form.js +42 -0
- package/dist/crypto-utils.d.ts +43 -7
- package/dist/crypto-utils.js +163 -42
- package/dist/data-classification.d.ts +44 -0
- package/dist/dev/hot-reload.js +11 -30
- package/dist/dev/module-runner.d.ts +3 -7
- package/dist/dev/module-runner.js +4 -10
- package/dist/dev/reload-meta.d.ts +8 -20
- package/dist/dev/reload-meta.js +9 -29
- package/dist/errors/error-handler.d.ts +5 -30
- package/dist/errors/error-handler.js +16 -32
- package/dist/errors/errors.d.ts +32 -151
- package/dist/errors/errors.js +55 -157
- package/dist/function/abort-scope.d.ts +47 -0
- package/dist/function/abort-scope.js +63 -0
- package/dist/function/function-runner.js +37 -32
- package/dist/function/functions.types.d.ts +57 -136
- package/dist/function/functions.types.js +0 -58
- package/dist/function/index.d.ts +1 -1
- package/dist/function/list.types.d.ts +12 -62
- package/dist/function/list.types.js +4 -25
- package/dist/handle-error.d.ts +0 -13
- package/dist/handle-error.js +0 -18
- package/dist/index.d.ts +11 -5
- package/dist/index.js +7 -2
- package/dist/middleware/auth-apikey.d.ts +3 -18
- package/dist/middleware/auth-apikey.js +0 -17
- package/dist/middleware/auth-bearer.d.ts +6 -41
- package/dist/middleware/auth-bearer.js +5 -41
- package/dist/middleware/auth-cookie.d.ts +5 -27
- package/dist/middleware/auth-cookie.js +2 -26
- package/dist/middleware/cors.d.ts +7 -34
- package/dist/middleware/cors.js +7 -34
- package/dist/middleware/remote-auth.d.ts +3 -1
- package/dist/middleware/remote-auth.js +4 -3
- package/dist/middleware/telemetry.d.ts +8 -33
- package/dist/middleware/telemetry.js +2 -31
- package/dist/middleware-runner.d.ts +4 -55
- package/dist/middleware-runner.js +5 -74
- package/dist/permissions.d.ts +3 -44
- package/dist/permissions.js +19 -71
- package/dist/pikku-request.d.ts +0 -6
- package/dist/pikku-request.js +0 -6
- package/dist/pikku-state.d.ts +0 -26
- package/dist/pikku-state.js +2 -30
- package/dist/remote.d.ts +3 -5
- package/dist/remote.js +9 -8
- package/dist/schema.d.ts +5 -39
- package/dist/schema.js +5 -39
- package/dist/scopes.d.ts +4 -23
- package/dist/scopes.js +7 -48
- package/dist/secret-value.d.ts +56 -0
- package/dist/secret-value.js +46 -0
- package/dist/services/ai-agent-runner-service.d.ts +20 -0
- package/dist/services/ai-embedding-service.d.ts +2 -25
- package/dist/services/audit-service.d.ts +74 -4
- package/dist/services/audit-service.js +8 -7
- package/dist/services/content-service.d.ts +1 -46
- package/dist/services/credential-service.d.ts +3 -40
- package/dist/services/credential-wire-service.d.ts +5 -0
- package/dist/services/credential-wire-service.js +9 -1
- package/dist/services/deployment-service.d.ts +3 -9
- package/dist/services/email-service.d.ts +2 -1
- package/dist/services/gateway-service.d.ts +0 -15
- package/dist/services/http-personas.d.ts +80 -0
- package/dist/services/http-personas.js +233 -0
- package/dist/services/in-memory-queue-service.d.ts +0 -14
- package/dist/services/in-memory-queue-service.js +1 -15
- package/dist/services/in-memory-trigger-service.d.ts +0 -18
- package/dist/services/in-memory-trigger-service.js +1 -18
- package/dist/services/in-memory-workflow-service.d.ts +0 -16
- package/dist/services/in-memory-workflow-service.js +4 -33
- package/dist/services/index.d.ts +8 -9
- package/dist/services/index.js +3 -6
- package/dist/services/istanbul-coverage-service.d.ts +1 -5
- package/dist/services/istanbul-coverage-service.js +2 -8
- package/dist/services/jwt-service.d.ts +1 -16
- package/dist/services/local-content-request-handler.d.ts +29 -0
- package/dist/services/local-content-request-handler.js +176 -0
- package/dist/services/local-content.d.ts +13 -2
- package/dist/services/local-content.js +40 -13
- package/dist/services/local-gateway-service.d.ts +0 -16
- package/dist/services/local-gateway-service.js +2 -17
- package/dist/services/local-secrets.d.ts +4 -7
- package/dist/services/local-secrets.js +7 -7
- package/dist/services/logger-console.d.ts +3 -7
- package/dist/services/logger-console.js +3 -7
- package/dist/services/logger.d.ts +22 -40
- package/dist/services/meta-service.d.ts +23 -26
- package/dist/services/meta-service.js +22 -36
- package/dist/services/personas-service.d.ts +134 -0
- package/dist/services/personas-service.js +40 -0
- package/dist/services/pikku-user-id.js +0 -4
- package/dist/services/queue-webhook-service.d.ts +2 -36
- package/dist/services/queue-webhook-service.js +10 -42
- package/dist/services/scheduler-service.d.ts +1 -50
- package/dist/services/scheduler-service.js +0 -10
- package/dist/services/schema-service.d.ts +1 -24
- package/dist/services/scope-service.d.ts +49 -34
- package/dist/services/scoped-secret-service.d.ts +4 -7
- package/dist/services/scoped-secret-service.js +0 -4
- package/dist/services/secret-host-binding.d.ts +8 -0
- package/dist/services/secret-host-binding.js +36 -0
- package/dist/services/secret-service.d.ts +12 -35
- package/dist/services/secretless.d.ts +6 -0
- package/dist/services/secretless.js +21 -0
- package/dist/services/stub-tracker.d.ts +7 -18
- package/dist/services/stub-tracker.js +8 -18
- package/dist/services/system-role-guard.d.ts +33 -0
- package/dist/services/system-role-guard.js +38 -0
- package/dist/services/trigger-service.d.ts +0 -12
- package/dist/services/typed-secret-service.d.ts +5 -11
- package/dist/services/typed-secret-service.js +1 -7
- package/dist/services/v8-coverage-service.d.ts +2 -3
- package/dist/services/v8-coverage-service.js +1 -2
- package/dist/services/variables-service.d.ts +1 -8
- package/dist/services/webhook-service.d.ts +21 -64
- package/dist/services/webhook-service.js +6 -20
- package/dist/services/workflow-service.d.ts +3 -15
- package/dist/testing/service-tests.js +6 -23
- package/dist/time-utils.d.ts +0 -16
- package/dist/time-utils.js +1 -19
- package/dist/types/core.types.d.ts +120 -219
- package/dist/types/core.types.js +0 -42
- package/dist/types/state.types.d.ts +4 -9
- package/dist/utils/hmac.d.ts +4 -10
- package/dist/utils/hmac.js +4 -10
- package/dist/utils/safe-fetch.d.ts +7 -35
- package/dist/utils/safe-fetch.js +13 -53
- package/dist/utils.d.ts +1 -6
- package/dist/utils.js +6 -15
- package/dist/wirings/actor-flow/actor-flow.types.d.ts +1 -34
- package/dist/wirings/actor-flow/index.d.ts +0 -9
- package/dist/wirings/actor-flow/run-conversation.d.ts +5 -5
- package/dist/wirings/actor-flow/run-conversation.js +14 -7
- package/dist/wirings/ai-agent/ai-agent-agui.d.ts +0 -5
- package/dist/wirings/ai-agent/ai-agent-agui.js +46 -12
- package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +7 -0
- package/dist/wirings/ai-agent/ai-agent-helpers.js +7 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.d.ts +153 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.js +256 -0
- package/dist/wirings/ai-agent/ai-agent-memory.js +0 -2
- package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +0 -9
- package/dist/wirings/ai-agent/ai-agent-model-config.js +1 -9
- package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +10 -99
- package/dist/wirings/ai-agent/ai-agent-prepare.js +65 -132
- package/dist/wirings/ai-agent/ai-agent-registry.d.ts +2 -1
- package/dist/wirings/ai-agent/ai-agent-registry.js +5 -1
- package/dist/wirings/ai-agent/ai-agent-runner.js +63 -22
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +25 -2
- package/dist/wirings/ai-agent/ai-agent-stream.js +180 -64
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +124 -4
- package/dist/wirings/ai-agent/index.d.ts +6 -4
- package/dist/wirings/ai-agent/index.js +5 -4
- package/dist/wirings/ai-agent/voice-input.d.ts +59 -1
- package/dist/wirings/ai-agent/voice-input.js +90 -12
- package/dist/wirings/ai-agent/voice-output.d.ts +69 -1
- package/dist/wirings/ai-agent/voice-output.js +162 -50
- package/dist/wirings/channel/channel-common.d.ts +7 -20
- package/dist/wirings/channel/channel-common.js +7 -21
- package/dist/wirings/channel/channel-handler.js +25 -6
- package/dist/wirings/channel/channel-host-rpc.d.ts +25 -0
- package/dist/wirings/channel/channel-host-rpc.js +38 -0
- package/dist/wirings/channel/channel-middleware-runner.d.ts +0 -12
- package/dist/wirings/channel/channel-middleware-runner.js +0 -12
- package/dist/wirings/channel/channel-rpc-registry.d.ts +31 -0
- package/dist/wirings/channel/channel-rpc-registry.js +89 -0
- package/dist/wirings/channel/channel-rpc-responder.d.ts +15 -0
- package/dist/wirings/channel/channel-rpc-responder.js +71 -0
- package/dist/wirings/channel/channel-rpc-service.d.ts +40 -0
- package/dist/wirings/channel/channel-rpc-service.js +106 -0
- package/dist/wirings/channel/channel-rpc-validators.d.ts +14 -0
- package/dist/wirings/channel/channel-rpc-validators.js +30 -0
- package/dist/wirings/channel/channel-rpc.d.ts +5 -0
- package/dist/wirings/channel/channel-rpc.js +5 -0
- package/dist/wirings/channel/channel-rpc.types.d.ts +90 -0
- package/dist/wirings/channel/channel-rpc.types.js +50 -0
- package/dist/wirings/channel/channel-runner.d.ts +0 -4
- package/dist/wirings/channel/channel-runner.js +0 -14
- package/dist/wirings/channel/channel-store.d.ts +0 -10
- package/dist/wirings/channel/channel.types.d.ts +12 -1
- package/dist/wirings/channel/define-channel-routes.d.ts +0 -20
- package/dist/wirings/channel/define-channel-routes.js +0 -20
- package/dist/wirings/channel/eventhub-service.d.ts +0 -18
- package/dist/wirings/channel/index.d.ts +4 -1
- package/dist/wirings/channel/index.js +2 -0
- package/dist/wirings/channel/local/local-channel-runner.js +3 -1
- package/dist/wirings/channel/local/local-eventhub-service.d.ts +0 -33
- package/dist/wirings/channel/local/local-eventhub-service.js +2 -36
- package/dist/wirings/channel/log-channels.d.ts +0 -4
- package/dist/wirings/channel/log-channels.js +0 -4
- package/dist/wirings/channel/pikku-abstract-channel-handler.js +6 -0
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +2 -5
- package/dist/wirings/cli/channel/cli-approval.d.ts +41 -0
- package/dist/wirings/cli/channel/cli-approval.js +81 -0
- package/dist/wirings/cli/channel/cli-channel-runner.d.ts +0 -4
- package/dist/wirings/cli/channel/cli-channel-runner.js +3 -25
- package/dist/wirings/cli/channel/cli-raw-channel-runner.d.ts +47 -9
- package/dist/wirings/cli/channel/cli-raw-channel-runner.js +24 -16
- package/dist/wirings/cli/channel/cli-raw-client-runner.d.ts +38 -0
- package/dist/wirings/cli/channel/cli-raw-client-runner.js +129 -0
- package/dist/wirings/cli/channel/index.d.ts +5 -0
- package/dist/wirings/cli/channel/index.js +2 -0
- package/dist/wirings/cli/cli-runner.d.ts +20 -20
- package/dist/wirings/cli/cli-runner.js +28 -89
- package/dist/wirings/cli/cli.types.d.ts +14 -3
- package/dist/wirings/cli/command-parser.d.ts +1 -10
- package/dist/wirings/cli/command-parser.js +10 -87
- package/dist/wirings/cli/define-cli-commands.d.ts +1 -17
- package/dist/wirings/cli/define-cli-commands.js +1 -17
- package/dist/wirings/credential/credential.types.d.ts +0 -12
- package/dist/wirings/credential/define-credential.d.ts +48 -0
- package/dist/wirings/credential/define-credential.js +47 -0
- package/dist/wirings/credential/index.d.ts +1 -1
- package/dist/wirings/credential/index.js +1 -1
- package/dist/wirings/credential/validate-credential-definitions.d.ts +2 -4
- package/dist/wirings/gateway/gateway-runner.d.ts +1 -20
- package/dist/wirings/gateway/gateway-runner.js +8 -105
- package/dist/wirings/gateway/gateway.types.d.ts +7 -80
- package/dist/wirings/http/http-routes.d.ts +0 -63
- package/dist/wirings/http/http-routes.js +0 -63
- package/dist/wirings/http/http-runner.d.ts +0 -99
- package/dist/wirings/http/http-runner.js +9 -165
- package/dist/wirings/http/http.types.d.ts +14 -55
- package/dist/wirings/http/log-http-routes.d.ts +0 -4
- package/dist/wirings/http/log-http-routes.js +0 -4
- package/dist/wirings/http/pikku-fetch-http-request.d.ts +0 -40
- package/dist/wirings/http/pikku-fetch-http-request.js +0 -58
- package/dist/wirings/http/pikku-fetch-http-response.js +0 -3
- package/dist/wirings/http/routers/path-to-regex.js +2 -13
- package/dist/wirings/http/web-request.d.ts +0 -8
- package/dist/wirings/http/web-request.js +25 -17
- package/dist/wirings/mcp/mcp-runner.d.ts +1 -4
- package/dist/wirings/mcp/mcp-runner.js +1 -14
- package/dist/wirings/mcp/mcp.types.d.ts +2 -35
- package/dist/wirings/oauth2/oauth2.types.d.ts +0 -28
- package/dist/wirings/oauth2/oauth2.types.js +0 -3
- package/dist/wirings/persona/define-personas.d.ts +32 -0
- package/dist/wirings/persona/define-personas.js +31 -0
- package/dist/wirings/persona/index.d.ts +21 -0
- package/dist/wirings/persona/index.js +17 -0
- package/dist/wirings/persona/persona-email.d.ts +37 -0
- package/dist/wirings/persona/persona-email.js +69 -0
- package/dist/wirings/persona/persona-environments.d.ts +45 -0
- package/dist/wirings/persona/persona-environments.js +81 -0
- package/dist/wirings/persona/persona-mailbox.d.ts +101 -0
- package/dist/wirings/persona/persona-mailbox.js +53 -0
- package/dist/wirings/persona/persona.types.d.ts +136 -0
- package/dist/wirings/persona/persona.types.js +1 -0
- package/dist/wirings/persona/validate-personas.d.ts +53 -0
- package/dist/wirings/persona/validate-personas.js +94 -0
- package/dist/wirings/queue/index.d.ts +3 -0
- package/dist/wirings/queue/index.js +2 -3
- package/dist/wirings/queue/queue-identity.d.ts +28 -0
- package/dist/wirings/queue/queue-identity.js +103 -0
- package/dist/wirings/queue/queue-runner.d.ts +0 -19
- package/dist/wirings/queue/queue-runner.js +9 -30
- package/dist/wirings/queue/queue.types.d.ts +20 -90
- package/dist/wirings/queue/register-queue-helper.d.ts +0 -12
- package/dist/wirings/queue/register-queue-helper.js +0 -11
- package/dist/wirings/queue/signed-queue-service.d.ts +17 -0
- package/dist/wirings/queue/signed-queue-service.js +42 -0
- package/dist/wirings/queue/validate-worker-config.d.ts +2 -23
- package/dist/wirings/queue/validate-worker-config.js +0 -14
- package/dist/wirings/role/define-system-role.d.ts +32 -0
- package/dist/wirings/role/define-system-role.js +31 -0
- package/dist/wirings/role/index.d.ts +3 -0
- package/dist/wirings/role/index.js +2 -0
- package/dist/wirings/role/role.types.d.ts +43 -0
- package/dist/wirings/role/role.types.js +1 -0
- package/dist/wirings/role/validate-role-definitions.d.ts +21 -0
- package/dist/wirings/role/validate-role-definitions.js +71 -0
- package/dist/wirings/rpc/addon-runner.d.ts +0 -19
- package/dist/wirings/rpc/addon-runner.js +0 -51
- package/dist/wirings/rpc/remote-addon-auth.d.ts +3 -13
- package/dist/wirings/rpc/remote-addon-auth.js +7 -11
- package/dist/wirings/rpc/rpc-runner.d.ts +11 -18
- package/dist/wirings/rpc/rpc-runner.js +88 -105
- package/dist/wirings/rpc/rpc-types.d.ts +7 -6
- package/dist/wirings/rpc/wire-addon.d.ts +25 -0
- package/dist/wirings/rpc/wire-addon.js +62 -0
- package/dist/wirings/rpc/wire-remote-addon.d.ts +3 -28
- package/dist/wirings/rpc/wire-remote-addon.js +0 -8
- package/dist/wirings/scheduler/log-schedulers.d.ts +0 -4
- package/dist/wirings/scheduler/log-schedulers.js +0 -4
- package/dist/wirings/scheduler/scheduler-runner.d.ts +0 -1
- package/dist/wirings/scheduler/scheduler-runner.js +0 -1
- package/dist/wirings/scheduler/scheduler.types.d.ts +1 -14
- package/dist/wirings/scope/define-scope.d.ts +32 -0
- package/dist/wirings/scope/define-scope.js +31 -0
- package/dist/wirings/scope/index.d.ts +1 -1
- package/dist/wirings/scope/index.js +1 -1
- package/dist/wirings/scope/scope.types.d.ts +7 -9
- package/dist/wirings/scope/validate-scope-definitions.d.ts +2 -21
- package/dist/wirings/scope/validate-scope-definitions.js +3 -21
- package/dist/wirings/secret/index.d.ts +1 -1
- package/dist/wirings/secret/index.js +1 -1
- package/dist/wirings/secret/secret.types.d.ts +19 -15
- package/dist/wirings/secret/secret.types.js +1 -1
- package/dist/wirings/secret/validate-secret-definitions.d.ts +2 -4
- package/dist/wirings/trigger/trigger-runner.d.ts +0 -27
- package/dist/wirings/trigger/trigger-runner.js +1 -24
- package/dist/wirings/trigger/trigger.types.d.ts +1 -82
- package/dist/wirings/trigger/trigger.types.js +0 -34
- package/dist/wirings/variable/index.d.ts +1 -1
- package/dist/wirings/variable/index.js +1 -1
- package/dist/wirings/variable/validate-variable-definitions.d.ts +2 -4
- package/dist/wirings/variable/variable.types.d.ts +1 -13
- package/dist/wirings/variable/variable.types.js +1 -1
- package/dist/wirings/virtual-user/index.d.ts +30 -0
- package/dist/wirings/virtual-user/index.js +10 -0
- package/dist/wirings/virtual-user/prepare-virtual-user-run.d.ts +54 -0
- package/dist/wirings/virtual-user/prepare-virtual-user-run.js +49 -0
- package/dist/wirings/virtual-user/run-virtual-user.d.ts +92 -0
- package/dist/wirings/virtual-user/run-virtual-user.js +478 -0
- package/dist/wirings/virtual-user/virtual-user-agents.d.ts +38 -0
- package/dist/wirings/virtual-user/virtual-user-agents.js +24 -0
- package/dist/wirings/virtual-user/virtual-user-catalogue.d.ts +92 -0
- package/dist/wirings/virtual-user/virtual-user-catalogue.js +134 -0
- package/dist/wirings/virtual-user/virtual-user-derive.d.ts +26 -0
- package/dist/wirings/virtual-user/virtual-user-derive.js +137 -0
- package/dist/wirings/virtual-user/virtual-user-dispositions.d.ts +79 -0
- package/dist/wirings/virtual-user/virtual-user-dispositions.js +128 -0
- package/dist/wirings/virtual-user/virtual-user-intents.d.ts +78 -0
- package/dist/wirings/virtual-user/virtual-user-intents.js +142 -0
- package/dist/wirings/virtual-user/virtual-user-rng.d.ts +24 -0
- package/dist/wirings/virtual-user/virtual-user-rng.js +44 -0
- package/dist/wirings/virtual-user/virtual-user-run-store.d.ts +90 -0
- package/dist/wirings/virtual-user/virtual-user-run-store.js +1 -0
- package/dist/wirings/virtual-user/virtual-user-target.d.ts +21 -0
- package/dist/wirings/virtual-user/virtual-user-target.js +34 -0
- package/dist/wirings/virtual-user/virtual-user.types.d.ts +199 -0
- package/dist/wirings/virtual-user/virtual-user.types.js +8 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +19 -15
- package/dist/wirings/workflow/dsl/workflow-runner.d.ts +0 -4
- package/dist/wirings/workflow/dsl/workflow-runner.js +0 -4
- package/dist/wirings/workflow/feature.d.ts +0 -19
- package/dist/wirings/workflow/feature.js +0 -19
- package/dist/wirings/workflow/graph/graph-node.d.ts +0 -98
- package/dist/wirings/workflow/graph/graph-node.js +0 -34
- package/dist/wirings/workflow/graph/graph-runner.js +6 -41
- package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +0 -4
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -58
- package/dist/wirings/workflow/graph/workflow-graph.types.js +0 -6
- package/dist/wirings/workflow/index.d.ts +5 -7
- package/dist/wirings/workflow/index.js +3 -17
- package/dist/wirings/workflow/pikku-scenario-service.d.ts +87 -5
- package/dist/wirings/workflow/pikku-scenario-service.js +204 -43
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +7 -459
- package/dist/wirings/workflow/pikku-workflow-service.js +58 -551
- package/dist/wirings/workflow/run-timeline.d.ts +0 -47
- package/dist/wirings/workflow/run-timeline.js +0 -22
- package/dist/wirings/workflow/scenario-cookie-jar.d.ts +0 -23
- package/dist/wirings/workflow/scenario-cookie-jar.js +0 -16
- package/dist/wirings/workflow/scenario-poll.d.ts +0 -15
- package/dist/wirings/workflow/scenario-poll.js +0 -12
- package/dist/wirings/workflow/scenario-prose.d.ts +0 -28
- package/dist/wirings/workflow/scenario-prose.js +1 -19
- package/dist/wirings/workflow/scenario-step-guards.d.ts +0 -13
- package/dist/wirings/workflow/scenario-step-guards.js +1 -14
- package/dist/wirings/workflow/scenario-step.types.d.ts +84 -12
- package/dist/wirings/workflow/scenario-step.types.js +5 -1
- package/dist/wirings/workflow/scenario-surface.d.ts +16 -0
- package/dist/wirings/workflow/scenario-surface.js +56 -0
- package/dist/wirings/workflow/workflow-invocation-id.d.ts +0 -18
- package/dist/wirings/workflow/workflow-invocation-id.js +2 -22
- package/dist/wirings/workflow/workflow-queue-workers.d.ts +0 -20
- package/dist/wirings/workflow/workflow-queue-workers.js +0 -19
- package/dist/wirings/workflow/workflow.types.d.ts +5 -195
- package/knowledge/decisions/index.md +19 -0
- package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +49 -0
- package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-and-not-a-queued-job.md +48 -0
- package/knowledge/decisions/internals/actor-flow-conversations-seed-a-hidden-kickoff-message.md +23 -0
- package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md +24 -0
- package/knowledge/decisions/internals/actor-flow-verdicts-are-llm-self-evaluations.md +25 -0
- package/knowledge/decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md +26 -0
- package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +33 -0
- package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +28 -0
- package/knowledge/decisions/internals/ai-agent-agui-bridge-obeys-the-client-ordering-contract.md +29 -0
- package/knowledge/decisions/internals/ai-agent-audio-chunks-carry-the-format-the-provider-returned.md +20 -0
- package/knowledge/decisions/internals/ai-agent-credential-suspensions-hide-the-tool-result.md +26 -0
- package/knowledge/decisions/internals/ai-agent-delegate-and-supervise-hide-different-text.md +26 -0
- package/knowledge/decisions/internals/ai-agent-llm-tool-arguments-have-nulls-stripped.md +23 -0
- package/knowledge/decisions/internals/ai-agent-model-config-stays-a-single-resolution-seam.md +25 -0
- package/knowledge/decisions/internals/ai-agent-onerror-hooks-cannot-change-the-failure.md +22 -0
- package/knowledge/decisions/internals/ai-agent-runner-methods-must-keep-their-receiver.md +22 -0
- package/knowledge/decisions/internals/ai-agent-stream-persistence-is-best-effort.md +27 -0
- package/knowledge/decisions/internals/ai-agent-sub-agents-inherit-the-parent-context-block.md +26 -0
- package/knowledge/decisions/internals/ai-agent-tool-execute-failures-are-logged-unconditionally.md +25 -0
- package/knowledge/decisions/internals/ai-agent-voice-input-transcribes-audio-parts-in-place.md +22 -0
- package/knowledge/decisions/internals/ai-agent-working-memory-is-persisted-only-when-valid.md +25 -0
- package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +30 -0
- package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +31 -0
- package/knowledge/decisions/internals/channel-state-is-per-socket-session-state-is-per-user.md +29 -0
- package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +28 -0
- package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +27 -0
- package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +28 -0
- package/knowledge/decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md +34 -0
- package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +29 -0
- package/knowledge/decisions/internals/core-column-form-is-an-axis-of-its-own.md +84 -0
- package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +41 -0
- package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +44 -0
- package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +39 -0
- package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +42 -0
- package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +39 -0
- package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +43 -0
- package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +38 -0
- package/knowledge/decisions/internals/core-state-is-a-global-map-written-only-at-registration-time.md +44 -0
- package/knowledge/decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md +27 -0
- package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +32 -0
- package/knowledge/decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md +28 -0
- package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +31 -0
- package/knowledge/decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md +26 -0
- package/knowledge/decisions/internals/http-request-bodies-are-read-once-and-shared.md +32 -0
- package/knowledge/decisions/internals/http-route-groups-cascade-config-in-a-fixed-order.md +28 -0
- package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +30 -0
- package/knowledge/decisions/internals/http-runner-logs-through-a-trace-scoped-logger-functions-do-not.md +26 -0
- package/knowledge/decisions/internals/http-set-cookie-headers-are-appended-never-joined.md +28 -0
- package/knowledge/decisions/internals/http-sse-streams-flush-headers-only-after-middleware.md +32 -0
- package/knowledge/decisions/internals/http-wiring-without-metadata-is-skipped-not-fatal.md +26 -0
- package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +25 -0
- package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +26 -0
- package/knowledge/decisions/internals/index.md +117 -0
- package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +25 -0
- package/knowledge/decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md +26 -0
- package/knowledge/decisions/internals/node-only-builtins-are-imported-dynamically.md +24 -0
- package/knowledge/decisions/internals/one-project-shape-check-two-validators.md +53 -0
- package/knowledge/decisions/internals/queue-group-concurrency-keeps-one-shared-queue-fair.md +28 -0
- package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +27 -0
- package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +31 -0
- package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +32 -0
- package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +27 -0
- package/knowledge/decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md +26 -0
- package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +27 -0
- package/knowledge/decisions/internals/scenarios-live-in-files-named-for-them.md +48 -0
- package/knowledge/decisions/internals/scope-roots-may-be-co-declared-by-an-addon-and-its-host-app.md +30 -0
- package/knowledge/decisions/internals/serverless-channel-disconnect-must-tolerate-a-missing-channel.md +28 -0
- package/knowledge/decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md +30 -0
- package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +29 -0
- package/knowledge/decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md +27 -0
- package/knowledge/decisions/internals/the-kek-salt-is-scoped-to-the-key-version.md +40 -0
- package/knowledge/decisions/internals/the-schema-service-is-never-stubbed.md +26 -0
- package/knowledge/decisions/internals/trigger-declaration-is-split-from-trigger-source.md +33 -0
- package/knowledge/decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md +26 -0
- package/knowledge/decisions/internals/validate-checks-personas-through-a-shared-module.md +43 -0
- package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +26 -0
- package/knowledge/decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md +25 -0
- package/knowledge/decisions/internals/whether-a-run-is-inline-is-read-from-the-run-record.md +58 -0
- package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +34 -0
- package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +42 -0
- package/knowledge/decisions/internals/workflow-dsl-meta-separates-runtime-expressions-from-literals.md +38 -0
- package/knowledge/decisions/internals/workflow-features-resolve-scenarios-by-object-identity.md +29 -0
- package/knowledge/decisions/internals/workflow-graph-inline-and-queued-runs-share-one-planner.md +42 -0
- package/knowledge/decisions/internals/workflow-graph-node-notes-are-excluded-from-the-graph-hash.md +25 -0
- package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +29 -0
- package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +43 -0
- package/knowledge/decisions/internals/workflow-queued-step-dispatch-requires-an-explicit-opt-in.md +29 -0
- package/knowledge/decisions/internals/workflow-queues-are-per-workflow-by-default.md +42 -0
- package/knowledge/decisions/internals/workflow-repeated-step-names-get-an-ordinal-suffix.md +33 -0
- package/knowledge/decisions/internals/workflow-replay-reads-its-steps-once-and-caches-only-the-immutable-half.md +32 -0
- package/knowledge/decisions/internals/workflow-retries-are-owned-by-the-workflow-not-the-queue.md +31 -0
- package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +39 -0
- package/knowledge/decisions/internals/workflow-run-mirror-is-never-a-source-of-truth.md +29 -0
- package/knowledge/decisions/internals/workflow-run-polling-backs-off-to-the-callers-ceiling.md +33 -0
- package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +37 -0
- package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +50 -0
- package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +43 -0
- package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +32 -0
- package/knowledge/decisions/internals/workflow-scenario-quarantine-reason-lives-in-code.md +18 -0
- package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +34 -0
- package/knowledge/decisions/internals/workflow-step-compensation-runs-as-its-own-durable-step.md +26 -0
- package/knowledge/decisions/internals/workflow-step-dispatch-failure-is-transient-not-a-run-failure.md +33 -0
- package/knowledge/decisions/internals/workflow-step-lock-is-held-only-to-claim-the-step.md +27 -0
- package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +34 -0
- package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +38 -0
- package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +30 -0
- package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +26 -0
- package/knowledge/decisions/security/actor-flow-missing-approval-decisions-default-to-denied.md +22 -0
- package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +27 -0
- package/knowledge/decisions/security/actor-sign-in-only-works-for-actor-flagged-users.md +27 -0
- package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +43 -0
- package/knowledge/decisions/security/addon-config-gates-apply-only-at-the-namespaced-rpc-boundary.md +52 -0
- package/knowledge/decisions/security/addon-scopes-are-resolved-where-the-function-runs.md +46 -0
- package/knowledge/decisions/security/ai-agent-approval-forwarding-requires-a-symbol-brand.md +27 -0
- package/knowledge/decisions/security/ai-agent-credential-requests-are-symbol-branded.md +37 -0
- package/knowledge/decisions/security/ai-agent-gate-requires-a-session-only-when-auth-is-true.md +31 -0
- package/knowledge/decisions/security/ai-agent-ownership-failures-never-echo-the-resource.md +23 -0
- package/knowledge/decisions/security/ai-agent-resume-re-runs-the-authorization-gate.md +22 -0
- package/knowledge/decisions/security/ai-agent-sessionless-deployments-have-no-thread-ownership.md +39 -0
- package/knowledge/decisions/security/ai-agent-thread-ownership-composes-the-session-principal.md +30 -0
- package/knowledge/decisions/security/ai-agent-tool-filtering-reads-the-live-function-config.md +24 -0
- package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +30 -0
- package/knowledge/decisions/security/an-exposed-ungated-function-is-a-codegen-warning.md +49 -0
- package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +76 -0
- package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +39 -0
- package/knowledge/decisions/security/core-secrets-use-a-per-secret-dek-wrapped-by-a-kek.md +37 -0
- package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +31 -0
- package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +30 -0
- package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +40 -0
- package/knowledge/decisions/security/http-error-detail-is-withheld-from-clients-in-production.md +33 -0
- package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +46 -0
- package/knowledge/decisions/security/index.md +55 -0
- package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +27 -0
- package/knowledge/decisions/security/passphrases-are-stretched-key-material-is-expanded.md +40 -0
- package/knowledge/decisions/security/permission-auth-filtering-requires-live-permission-functions.md +31 -0
- package/knowledge/decisions/security/pikku-carries-actor-scopes-as-data-and-the-app-grants-them.md +26 -0
- package/knowledge/decisions/security/queue-job-identities-are-signed-at-enqueue.md +69 -0
- package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +39 -0
- package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +34 -0
- package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +49 -0
- package/knowledge/decisions/security/scenario-step-functions-are-never-externally-invocable.md +30 -0
- package/knowledge/decisions/security/scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md +28 -0
- package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +34 -0
- package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +37 -0
- package/knowledge/decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md +25 -0
- package/knowledge/decisions/security/workflow-actor-steps-always-use-the-real-transport.md +34 -0
- package/knowledge/decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md +40 -0
- package/knowledge/decisions/security/workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md +32 -0
- package/knowledge/decisions/security/workflow-scenario-sessions-are-isolated-per-actor-and-per-scenario.md +32 -0
- package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +31 -0
- package/knowledge/index.md +24 -0
- package/knowledge/questions/index.md +15 -0
- package/package.json +6 -2
- package/run-tests.sh +0 -0
- package/src/column-form.test.ts +97 -0
- package/src/column-form.ts +58 -0
- package/src/crypto-utils.test.ts +460 -19
- package/src/crypto-utils.ts +306 -59
- package/src/data-classification.ts +45 -7
- package/src/dev/hot-reload.test.ts +0 -4
- package/src/dev/hot-reload.ts +11 -30
- package/src/dev/module-runner.ts +7 -32
- package/src/dev/reload-meta.ts +9 -29
- package/src/errors/error-handler.ts +20 -35
- package/src/errors/error.test.ts +30 -1
- package/src/errors/errors.ts +73 -157
- package/src/function/abort-scope.test.ts +97 -0
- package/src/function/abort-scope.ts +80 -0
- package/src/function/function-runner.test.ts +0 -7
- package/src/function/function-runner.ts +62 -32
- package/src/function/functions.types.ts +95 -138
- package/src/function/index.ts +1 -0
- package/src/function/list.types.test.ts +3 -25
- package/src/function/list.types.ts +12 -62
- package/src/handle-error.ts +0 -18
- package/src/index.ts +84 -3
- package/src/middleware/auth-apikey.test.ts +0 -1
- package/src/middleware/auth-apikey.ts +0 -17
- package/src/middleware/auth-bearer.test.ts +3 -5
- package/src/middleware/auth-bearer.ts +5 -41
- package/src/middleware/auth-cookie.test.ts +0 -6
- package/src/middleware/auth-cookie.ts +2 -26
- package/src/middleware/cors.test.ts +34 -0
- package/src/middleware/cors.ts +12 -33
- package/src/middleware/remote-auth.test.ts +26 -10
- package/src/middleware/remote-auth.ts +11 -3
- package/src/middleware/telemetry.ts +2 -31
- package/src/middleware-runner.test.ts +0 -2
- package/src/middleware-runner.ts +5 -74
- package/src/permissions.test.ts +30 -0
- package/src/permissions.ts +24 -74
- package/src/pikku-request.ts +0 -6
- package/src/pikku-state.ts +2 -30
- package/src/production-barrels-stay-lean.test.ts +110 -0
- package/src/remote.test.ts +173 -0
- package/src/remote.ts +18 -8
- package/src/schema.ts +5 -39
- package/src/scopes.ts +7 -48
- package/src/secret-value.test.ts +204 -0
- package/src/secret-value.ts +111 -0
- package/src/services/ai-agent-runner-service.ts +20 -0
- package/src/services/ai-embedding-service.ts +3 -25
- package/src/services/audit-service.ts +88 -11
- package/src/services/content-service.ts +1 -46
- package/src/services/credential-service.ts +3 -40
- package/src/services/credential-wire-service.test.ts +0 -2
- package/src/services/credential-wire-service.ts +9 -1
- package/src/services/deployment-service.ts +3 -9
- package/src/services/email-service.ts +3 -1
- package/src/services/gateway-service.ts +0 -15
- package/src/services/{http-scenario-actors-converse.test.ts → http-personas-converse.test.ts} +38 -9
- package/src/services/{http-scenario-actors.test.ts → http-personas.test.ts} +39 -22
- package/src/services/{http-scenario-actors.ts → http-personas.ts} +85 -45
- package/src/services/in-memory-queue-service.ts +1 -15
- package/src/services/in-memory-trigger-service.ts +1 -18
- package/src/services/in-memory-workflow-service.test.ts +0 -13
- package/src/services/in-memory-workflow-service.ts +4 -38
- package/src/services/index.ts +23 -18
- package/src/services/istanbul-coverage-service.ts +2 -8
- package/src/services/jwt-service.ts +1 -16
- package/src/services/local-content-request-handler.test.ts +202 -0
- package/src/services/local-content-request-handler.ts +267 -0
- package/src/services/local-content.test.ts +159 -27
- package/src/services/local-content.ts +55 -23
- package/src/services/local-gateway-service.ts +2 -17
- package/src/services/local-secrets.test.ts +20 -5
- package/src/services/local-secrets.ts +15 -11
- package/src/services/logger-console.test.ts +0 -1
- package/src/services/logger-console.ts +3 -7
- package/src/services/logger.ts +31 -46
- package/src/services/meta-service.test.ts +1 -5
- package/src/services/meta-service.ts +41 -61
- package/src/services/{scenario-actors-service.ts → personas-service.ts} +48 -43
- package/src/services/pikku-user-id.ts +0 -4
- package/src/services/queue-webhook-service.test.ts +2 -1
- package/src/services/queue-webhook-service.ts +10 -42
- package/src/services/scheduler-service.ts +1 -50
- package/src/services/schema-service.ts +1 -24
- package/src/services/scope-service.ts +50 -34
- package/src/services/scoped-secret-service.ts +4 -7
- package/src/services/secret-host-binding.test.ts +138 -0
- package/src/services/secret-host-binding.ts +51 -0
- package/src/services/secret-service.ts +12 -35
- package/src/services/secretless.test.ts +54 -0
- package/src/services/secretless.ts +29 -0
- package/src/services/stub-tracker.ts +8 -18
- package/src/services/system-role-guard.test.ts +93 -0
- package/src/services/system-role-guard.ts +71 -0
- package/src/services/trigger-service.ts +0 -12
- package/src/services/typed-secret-service.ts +12 -14
- package/src/services/v8-coverage-service.ts +3 -6
- package/src/services/variables-service.ts +1 -8
- package/src/services/webhook-service.ts +23 -64
- package/src/services/workflow-service.ts +3 -20
- package/src/testing/service-tests.ts +6 -32
- package/src/time-utils.ts +1 -19
- package/src/types/core.types.ts +137 -229
- package/src/types/state.types.ts +7 -9
- package/src/utils/hmac.ts +4 -10
- package/src/utils/safe-fetch.ts +13 -54
- package/src/utils.test.ts +11 -2
- package/src/utils.ts +6 -15
- package/src/wirings/actor-flow/actor-flow.types.ts +1 -34
- package/src/wirings/actor-flow/index.ts +0 -9
- package/src/wirings/actor-flow/run-conversation.test.ts +11 -6
- package/src/wirings/actor-flow/run-conversation.ts +19 -12
- package/src/wirings/ai-agent/ai-agent-agui.test.ts +91 -10
- package/src/wirings/ai-agent/ai-agent-agui.ts +49 -17
- package/src/wirings/ai-agent/ai-agent-helpers.ts +20 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.test.ts +842 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.ts +399 -0
- package/src/wirings/ai-agent/ai-agent-memory.ts +0 -2
- package/src/wirings/ai-agent/ai-agent-model-config.ts +1 -9
- package/src/wirings/ai-agent/ai-agent-prepare.test.ts +202 -31
- package/src/wirings/ai-agent/ai-agent-prepare.ts +89 -139
- package/src/wirings/ai-agent/ai-agent-registry.test.ts +191 -6
- package/src/wirings/ai-agent/ai-agent-registry.ts +18 -1
- package/src/wirings/ai-agent/ai-agent-resume-authorization.test.ts +0 -2
- package/src/wirings/ai-agent/ai-agent-runner.test.ts +11 -9
- package/src/wirings/ai-agent/ai-agent-runner.ts +85 -35
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +205 -103
- package/src/wirings/ai-agent/ai-agent-stream.ts +224 -76
- package/src/wirings/ai-agent/ai-agent-thread-ownership.test.ts +301 -0
- package/src/wirings/ai-agent/ai-agent.types.ts +130 -5
- package/src/wirings/ai-agent/index.ts +37 -3
- package/src/wirings/ai-agent/voice-input.test.ts +137 -7
- package/src/wirings/ai-agent/voice-input.ts +96 -12
- package/src/wirings/ai-agent/voice-output.test.ts +512 -0
- package/src/wirings/ai-agent/voice-output.ts +243 -56
- package/src/wirings/channel/channel-common.ts +15 -20
- package/src/wirings/channel/channel-handler.test.ts +50 -0
- package/src/wirings/channel/channel-handler.ts +32 -11
- package/src/wirings/channel/channel-host-rpc.test.ts +150 -0
- package/src/wirings/channel/channel-host-rpc.ts +69 -0
- package/src/wirings/channel/channel-middleware-runner.test.ts +0 -1
- package/src/wirings/channel/channel-middleware-runner.ts +0 -12
- package/src/wirings/channel/channel-rpc-registry.ts +116 -0
- package/src/wirings/channel/channel-rpc-responder.ts +117 -0
- package/src/wirings/channel/channel-rpc-service.ts +146 -0
- package/src/wirings/channel/channel-rpc-validators.ts +65 -0
- package/src/wirings/channel/channel-rpc.test.ts +820 -0
- package/src/wirings/channel/channel-rpc.ts +5 -0
- package/src/wirings/channel/channel-rpc.types.ts +150 -0
- package/src/wirings/channel/channel-runner.ts +0 -14
- package/src/wirings/channel/channel-store.ts +0 -10
- package/src/wirings/channel/channel.types.ts +19 -8
- package/src/wirings/channel/define-channel-routes.ts +0 -20
- package/src/wirings/channel/eventhub-service.ts +0 -18
- package/src/wirings/channel/index.ts +35 -0
- package/src/wirings/channel/local/local-channel-handler.ts +3 -1
- package/src/wirings/channel/local/local-channel-runner.test.ts +0 -10
- package/src/wirings/channel/local/local-channel-runner.ts +3 -1
- package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -13
- package/src/wirings/channel/local/local-eventhub-service.ts +2 -37
- package/src/wirings/channel/log-channels.ts +0 -4
- package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +83 -2
- package/src/wirings/channel/pikku-abstract-channel-handler.ts +7 -0
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +2 -5
- package/src/wirings/cli/channel/cli-approval.test.ts +177 -0
- package/src/wirings/cli/channel/cli-approval.ts +135 -0
- package/src/wirings/cli/channel/cli-channel-runner.ts +4 -26
- package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +169 -0
- package/src/wirings/cli/channel/cli-raw-channel-runner.ts +59 -16
- package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +480 -0
- package/src/wirings/cli/channel/cli-raw-client-runner.ts +185 -0
- package/src/wirings/cli/channel/index.ts +13 -0
- package/src/wirings/cli/cli-runner.test.ts +0 -1
- package/src/wirings/cli/cli-runner.ts +46 -88
- package/src/wirings/cli/cli.types.ts +14 -3
- package/src/wirings/cli/command-parser.test.ts +0 -4
- package/src/wirings/cli/command-parser.ts +11 -91
- package/src/wirings/cli/define-cli-commands.ts +1 -17
- package/src/wirings/credential/credential.types.ts +0 -12
- package/src/wirings/credential/{wire-credential.ts → define-credential.ts} +7 -7
- package/src/wirings/credential/index.ts +1 -1
- package/src/wirings/credential/validate-credential-definitions.ts +2 -4
- package/src/wirings/gateway/gateway-runner.test.ts +1 -21
- package/src/wirings/gateway/gateway-runner.ts +8 -110
- package/src/wirings/gateway/gateway.types.ts +7 -80
- package/src/wirings/http/http-routes.test.ts +0 -3
- package/src/wirings/http/http-routes.ts +0 -86
- package/src/wirings/http/http-runner.test.ts +0 -1
- package/src/wirings/http/http-runner.ts +8 -167
- package/src/wirings/http/http.types.ts +15 -62
- package/src/wirings/http/log-http-routes.ts +0 -4
- package/src/wirings/http/pikku-fetch-http-request.test.ts +2 -10
- package/src/wirings/http/pikku-fetch-http-request.ts +0 -58
- package/src/wirings/http/pikku-fetch-http-response.test.ts +1 -1
- package/src/wirings/http/pikku-fetch-http-response.ts +0 -3
- package/src/wirings/http/routers/path-to-regex.test.ts +4 -17
- package/src/wirings/http/routers/path-to-regex.ts +2 -13
- package/src/wirings/http/web-request.test.ts +33 -2
- package/src/wirings/http/web-request.ts +30 -17
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -1
- package/src/wirings/mcp/mcp-runner.ts +2 -17
- package/src/wirings/mcp/mcp.types.ts +7 -42
- package/src/wirings/oauth2/oauth2.types.ts +0 -30
- package/src/wirings/persona/define-personas.ts +33 -0
- package/src/wirings/persona/index.ts +62 -0
- package/src/wirings/persona/persona-email.ts +87 -0
- package/src/wirings/persona/persona-environments.test.ts +183 -0
- package/src/wirings/persona/persona-environments.ts +138 -0
- package/src/wirings/persona/persona-mailbox.ts +156 -0
- package/src/wirings/persona/persona.test.ts +220 -0
- package/src/wirings/persona/persona.types.ts +142 -0
- package/src/wirings/persona/validate-personas.ts +133 -0
- package/src/wirings/queue/index.ts +13 -3
- package/src/wirings/queue/queue-identity.test.ts +454 -0
- package/src/wirings/queue/queue-identity.ts +176 -0
- package/src/wirings/queue/queue-runner.ts +12 -31
- package/src/wirings/queue/queue.types.ts +25 -90
- package/src/wirings/queue/register-queue-helper.ts +0 -14
- package/src/wirings/queue/signed-queue-service.ts +60 -0
- package/src/wirings/queue/validate-worker-config.ts +2 -28
- package/src/wirings/role/define-system-role.ts +33 -0
- package/src/wirings/role/index.ts +13 -0
- package/src/wirings/role/role.test.ts +104 -0
- package/src/wirings/role/role.types.ts +47 -0
- package/src/wirings/role/validate-role-definitions.ts +93 -0
- package/src/wirings/rpc/addon-auth-tags.test.ts +223 -0
- package/src/wirings/rpc/addon-runner.ts +0 -56
- package/src/wirings/rpc/addon-scopes.test.ts +225 -0
- package/src/wirings/rpc/remote-addon-auth.ts +9 -16
- package/src/wirings/rpc/rpc-runner.test.ts +192 -6
- package/src/wirings/rpc/rpc-runner.ts +145 -127
- package/src/wirings/rpc/rpc-types.ts +11 -6
- package/src/wirings/rpc/wire-addon.test.ts +43 -1
- package/src/wirings/rpc/wire-addon.ts +99 -0
- package/src/wirings/rpc/wire-remote-addon.ts +9 -29
- package/src/wirings/scheduler/log-schedulers.ts +0 -4
- package/src/wirings/scheduler/scheduler-runner.test.ts +1 -8
- package/src/wirings/scheduler/scheduler-runner.ts +0 -2
- package/src/wirings/scheduler/scheduler.types.ts +1 -14
- package/src/wirings/scope/{wire-scope.ts → define-scope.ts} +5 -6
- package/src/wirings/scope/index.ts +1 -1
- package/src/wirings/scope/scope.test.ts +1 -2
- package/src/wirings/scope/scope.types.ts +7 -9
- package/src/wirings/scope/validate-scope-definitions.ts +3 -21
- package/src/wirings/secret/index.ts +1 -1
- package/src/wirings/secret/secret.types.ts +19 -15
- package/src/wirings/secret/validate-secret-definitions.ts +2 -4
- package/src/wirings/trigger/trigger-runner.ts +1 -27
- package/src/wirings/trigger/trigger.types.ts +1 -82
- package/src/wirings/variable/index.ts +1 -1
- package/src/wirings/variable/validate-variable-definitions.ts +2 -4
- package/src/wirings/variable/variable.types.ts +1 -13
- package/src/wirings/virtual-user/index.ts +88 -0
- package/src/wirings/virtual-user/prepare-virtual-user-run.test.ts +115 -0
- package/src/wirings/virtual-user/prepare-virtual-user-run.ts +95 -0
- package/src/wirings/virtual-user/run-virtual-user.test.ts +765 -0
- package/src/wirings/virtual-user/run-virtual-user.ts +671 -0
- package/src/wirings/virtual-user/virtual-user-agents.test.ts +65 -0
- package/src/wirings/virtual-user/virtual-user-agents.ts +57 -0
- package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +215 -0
- package/src/wirings/virtual-user/virtual-user-catalogue.ts +184 -0
- package/src/wirings/virtual-user/virtual-user-derive.test.ts +398 -0
- package/src/wirings/virtual-user/virtual-user-derive.ts +173 -0
- package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +63 -0
- package/src/wirings/virtual-user/virtual-user-dispositions.ts +213 -0
- package/src/wirings/virtual-user/virtual-user-intents.test.ts +208 -0
- package/src/wirings/virtual-user/virtual-user-intents.ts +185 -0
- package/src/wirings/virtual-user/virtual-user-rng.test.ts +72 -0
- package/src/wirings/virtual-user/virtual-user-rng.ts +50 -0
- package/src/wirings/virtual-user/virtual-user-run-store.ts +98 -0
- package/src/wirings/virtual-user/virtual-user-target.ts +47 -0
- package/src/wirings/virtual-user/virtual-user.types.ts +219 -0
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +19 -20
- package/src/wirings/workflow/dsl/workflow-runner.ts +0 -4
- package/src/wirings/workflow/feature.ts +0 -19
- package/src/wirings/workflow/graph/graph-node.ts +0 -136
- package/src/wirings/workflow/graph/graph-runner.test.ts +20 -19
- package/src/wirings/workflow/graph/graph-runner.ts +6 -41
- package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -4
- package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -58
- package/src/wirings/workflow/index.ts +10 -44
- package/src/wirings/workflow/pikku-scenario-service.ts +235 -61
- package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -39
- package/src/wirings/workflow/pikku-workflow-service.ts +77 -674
- package/src/wirings/workflow/run-timeline.test.ts +7 -19
- package/src/wirings/workflow/run-timeline.ts +0 -56
- package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -1
- package/src/wirings/workflow/scenario-cookie-jar.ts +0 -25
- package/src/wirings/workflow/scenario-expectations.test.ts +2 -7
- package/src/wirings/workflow/scenario-hooks.test.ts +2 -7
- package/src/wirings/workflow/scenario-poll.test.ts +0 -2
- package/src/wirings/workflow/scenario-poll.ts +0 -15
- package/src/wirings/workflow/scenario-prose.test.ts +5 -7
- package/src/wirings/workflow/scenario-prose.ts +1 -29
- package/src/wirings/workflow/scenario-service.test.ts +2 -10
- package/src/wirings/workflow/scenario-step-guards.ts +1 -14
- package/src/wirings/workflow/scenario-step.test.ts +163 -19
- package/src/wirings/workflow/scenario-step.types.ts +94 -12
- package/src/wirings/workflow/scenario-surface.test.ts +146 -0
- package/src/wirings/workflow/scenario-surface.ts +71 -0
- package/src/wirings/workflow/workflow-dispatch-durability.test.ts +14 -15
- package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -4
- package/src/wirings/workflow/workflow-inline-authority.test.ts +169 -0
- package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -2
- package/src/wirings/workflow/workflow-invocation-id.ts +2 -22
- package/src/wirings/workflow/workflow-mirror.test.ts +0 -7
- package/src/wirings/workflow/workflow-on-error.test.ts +0 -9
- package/src/wirings/workflow/workflow-queue-workers.ts +0 -21
- package/src/wirings/workflow/workflow-replay-snapshot.test.ts +8 -7
- package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -5
- package/src/wirings/workflow/workflow-run-context.test.ts +5 -10
- package/src/wirings/workflow/workflow-run-polling.test.ts +0 -5
- package/src/wirings/workflow/workflow-step-ordinal.test.ts +19 -4
- package/src/wirings/workflow/workflow-step-session.test.ts +0 -7
- package/src/wirings/workflow/workflow.types.ts +5 -201
- package/tsconfig.tsbuildinfo +1 -1
- package/tsconfig.type-tests.json +12 -0
- package/src/middleware/timeout.ts +0 -22
- package/src/pikku-response.ts +0 -5
- package/src/wirings/mcp/mcp-endpoint-registry.test.d.ts +0 -1
- package/src/wirings/workflow/dsl/index.ts +0 -36
- package/src/wirings/workflow/graph/index.ts +0 -15
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { CorePermissionGroup, CorePikkuPermission } from '../../function/functions.types.js';
|
|
2
2
|
import type { CorePikkuMiddleware, MiddlewareMetadata, PermissionMetadata } from '../../types/core.types.js';
|
|
3
|
+
import type { AIProviderOptions } from '../../services/ai-agent-runner-service.js';
|
|
3
4
|
import type { PikkuChannel } from '../channel/channel.types.js';
|
|
4
5
|
import type { CorePikkuChannelMiddleware } from '../channel/channel.types.js';
|
|
6
|
+
import type { ApprovalPolicy } from '../channel/channel-rpc.js';
|
|
5
7
|
export interface AIThread {
|
|
6
8
|
id: string;
|
|
7
9
|
resourceId: string;
|
|
@@ -49,6 +51,23 @@ export interface AIMessage {
|
|
|
49
51
|
toolCalls?: AIToolCall[];
|
|
50
52
|
toolResults?: AIToolResult[];
|
|
51
53
|
reasoningContent?: string;
|
|
54
|
+
/**
|
|
55
|
+
* Set on an assistant message whose generation was cut short by
|
|
56
|
+
* an interrupt — the text is a mid-sentence fragment, not a reply.
|
|
57
|
+
* Carried into the next turn's context so the model can see it said only
|
|
58
|
+
* this much before being talked over, and decide for itself whether to
|
|
59
|
+
* resume, restate or move on. Storage that drops unknown fields loses the
|
|
60
|
+
* marker but keeps the fragment, which degrades to a truncated reply.
|
|
61
|
+
*/
|
|
62
|
+
interrupted?: boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Set on a tool message whose result arrived after the run was interrupted,
|
|
65
|
+
* so the model never got to describe it. The work happened; only the reply
|
|
66
|
+
* about it was lost. It is ordinary thread context on the next turn — the
|
|
67
|
+
* model raises it unprompted ("that deploy did go through") rather than the
|
|
68
|
+
* result being silently dropped or replayed as a fresh tool call.
|
|
69
|
+
*/
|
|
70
|
+
undelivered?: boolean;
|
|
52
71
|
createdAt: Date;
|
|
53
72
|
}
|
|
54
73
|
export interface AIAgentStep {
|
|
@@ -113,13 +132,24 @@ export interface AIAgentOutput {
|
|
|
113
132
|
* another user's or org's threads.
|
|
114
133
|
*/
|
|
115
134
|
export type SessionScope = 'user' | 'org';
|
|
116
|
-
|
|
135
|
+
/**
|
|
136
|
+
* `ApprovalPolicy` is shared with channel capabilities, but `Partial` here:
|
|
137
|
+
* absent `needsApproval` means "do not ask", which is safe because a tool is
|
|
138
|
+
* written by whoever runs the server it executes on. A capability runs on
|
|
139
|
+
* someone else's machine, so it requires the field instead.
|
|
140
|
+
*/
|
|
141
|
+
export interface AIAgentToolDef extends Partial<ApprovalPolicy> {
|
|
117
142
|
name: string;
|
|
118
143
|
description: string;
|
|
119
144
|
inputSchema: Record<string, unknown>;
|
|
120
145
|
execute: (input: unknown) => Promise<unknown>;
|
|
121
|
-
|
|
122
|
-
|
|
146
|
+
/**
|
|
147
|
+
* Mirrors the pikku function's `readonly` flag. A read that gets interrupted
|
|
148
|
+
* is discarded rather than reported: nothing changed, and by the next turn
|
|
149
|
+
* the data may be stale anyway — re-reading is cheaper than explaining a
|
|
150
|
+
* result the user never asked to hear about.
|
|
151
|
+
*/
|
|
152
|
+
readonly?: boolean;
|
|
123
153
|
/**
|
|
124
154
|
* Set only by the framework on sub-agent delegating tools. Such a tool may
|
|
125
155
|
* legitimately return an `__approvalRequired` marker to forward a nested
|
|
@@ -133,6 +163,23 @@ export interface PikkuAIMiddlewareHooks<State extends Record<string, unknown> =
|
|
|
133
163
|
modifyInput?: (services: Services, ctx: {
|
|
134
164
|
messages: AIMessage[];
|
|
135
165
|
instructions: string;
|
|
166
|
+
/**
|
|
167
|
+
* Notes about this run that every middleware can read and write, as
|
|
168
|
+
* opposed to {@link modifyOutputStream}'s `state`, which is private to
|
|
169
|
+
* one middleware.
|
|
170
|
+
*
|
|
171
|
+
* It exists because middlewares transform the turn for each other, and
|
|
172
|
+
* the transformation can destroy what a later one needed to know. Voice
|
|
173
|
+
* is the case in point: `voiceInput` replaces the user's audio with its
|
|
174
|
+
* transcript, so by the time anything downstream looks, the turn is
|
|
175
|
+
* indistinguishable from one that was typed — and whether it was typed is
|
|
176
|
+
* exactly what `voiceOutput` needs in order to decide whether to answer
|
|
177
|
+
* aloud. Only the middleware that consumed the audio can still say so.
|
|
178
|
+
*
|
|
179
|
+
* Namespace what you put here (`voice:spokenTurn`); it is one bag for
|
|
180
|
+
* everybody. Cleared between runs.
|
|
181
|
+
*/
|
|
182
|
+
shared: Record<string, unknown>;
|
|
136
183
|
}) => Promise<{
|
|
137
184
|
messages: AIMessage[];
|
|
138
185
|
instructions: string;
|
|
@@ -143,7 +190,31 @@ export interface PikkuAIMiddlewareHooks<State extends Record<string, unknown> =
|
|
|
143
190
|
modifyOutputStream?: (services: Services, ctx: {
|
|
144
191
|
event: AIStreamEvent;
|
|
145
192
|
allEvents: readonly AIStreamEvent[];
|
|
193
|
+
/** Private to this middleware, for this run. Cross-middleware facts go in `shared`. */
|
|
146
194
|
state: State;
|
|
195
|
+
/** Per-run notes shared with every middleware — see {@link modifyInput}. */
|
|
196
|
+
shared: Record<string, unknown>;
|
|
197
|
+
/**
|
|
198
|
+
* Push an event into the stream *after* this call has returned.
|
|
199
|
+
*
|
|
200
|
+
* Returning events blocks the stream until the hook resolves, which is
|
|
201
|
+
* right for anything derived from the event and wrong for anything slow.
|
|
202
|
+
* Speech is the motivating case: awaiting a text-to-speech call before
|
|
203
|
+
* returning the text delta stalls the reader at every full stop and
|
|
204
|
+
* serialises synthesis behind playback. Return the text immediately,
|
|
205
|
+
* start the slow work, and `emit` its result when it lands.
|
|
206
|
+
*
|
|
207
|
+
* Ordering among emitted events is the caller's problem — chain them if
|
|
208
|
+
* it matters — and a hook that emits must make sure anything still
|
|
209
|
+
* outstanding has landed before it lets `done` through.
|
|
210
|
+
*/
|
|
211
|
+
emit: (event: AIStreamEvent) => Promise<void>;
|
|
212
|
+
/**
|
|
213
|
+
* Aborts when the run is interrupted. Pass it to any provider call the
|
|
214
|
+
* hook makes: work started for a reply the user has already talked over
|
|
215
|
+
* is billed but never heard.
|
|
216
|
+
*/
|
|
217
|
+
signal?: AbortSignal;
|
|
147
218
|
}) => Promise<AIStreamEvent | AIStreamEvent[] | null> | AIStreamEvent | AIStreamEvent[] | null;
|
|
148
219
|
modifyOutput?: (services: Services, ctx: {
|
|
149
220
|
text: string;
|
|
@@ -216,8 +287,19 @@ export type CoreAIAgent<PikkuPermission = CorePikkuPermission<any, any>, PikkuMi
|
|
|
216
287
|
description: string;
|
|
217
288
|
summary?: string;
|
|
218
289
|
errors?: string[];
|
|
290
|
+
/**
|
|
291
|
+
* The three fields below are the system prompt. `buildInstructions` joins
|
|
292
|
+
* whichever are set with a blank line, always in this order — role, then
|
|
293
|
+
* personality, then goal — and appends the tool-usage rules if the agent has
|
|
294
|
+
* tools. Nothing checks them against each other: the split is there to keep a
|
|
295
|
+
* prompt legible, and text put in the wrong one still reaches the model.
|
|
296
|
+
*
|
|
297
|
+
* Who the agent is. 'You are a support engineer triaging inbound bugs.'
|
|
298
|
+
*/
|
|
219
299
|
role?: string;
|
|
300
|
+
/** How it should sound: tone, vocabulary, how much it says at a time. */
|
|
220
301
|
personality?: string;
|
|
302
|
+
/** What it is for — the only one of the three that is required. */
|
|
221
303
|
goal: string;
|
|
222
304
|
model: string;
|
|
223
305
|
temperature?: number;
|
|
@@ -230,6 +312,16 @@ export type CoreAIAgent<PikkuPermission = CorePikkuPermission<any, any>, PikkuMi
|
|
|
230
312
|
memory?: AIAgentMemoryConfig;
|
|
231
313
|
maxSteps?: number;
|
|
232
314
|
toolChoice?: 'auto' | 'required' | 'none';
|
|
315
|
+
/**
|
|
316
|
+
* Per-provider model settings, keyed by provider id and passed through
|
|
317
|
+
* untouched — for anything only one vendor offers, which the fields above
|
|
318
|
+
* deliberately do not try to unify.
|
|
319
|
+
*
|
|
320
|
+
* `{ openai: { reasoningEffort: 'minimal' } }` is the one that matters for
|
|
321
|
+
* voice: on gpt-5-mini it measured 0.9s to first token against 2.5s at the
|
|
322
|
+
* default, and a spoken reply is waited through rather than skimmed.
|
|
323
|
+
*/
|
|
324
|
+
providerOptions?: AIProviderOptions;
|
|
233
325
|
input?: unknown;
|
|
234
326
|
output?: unknown;
|
|
235
327
|
tags?: string[];
|
|
@@ -340,12 +432,32 @@ export type AIStreamEvent = {
|
|
|
340
432
|
type: 'audio-delta';
|
|
341
433
|
data: string;
|
|
342
434
|
format: string;
|
|
435
|
+
/**
|
|
436
|
+
* The sentence this audio says.
|
|
437
|
+
*
|
|
438
|
+
* Carried alongside the bytes because a client that gets talked over has
|
|
439
|
+
* to tell the model what the user actually heard, and playback position
|
|
440
|
+
* is the only place that is knowable. Without it a barge-in can stop the
|
|
441
|
+
* sound but not report it, and the next turn is answered as though the
|
|
442
|
+
* whole reply had landed.
|
|
443
|
+
*/
|
|
444
|
+
text?: string;
|
|
343
445
|
agent?: string;
|
|
344
446
|
session?: string;
|
|
345
447
|
} | {
|
|
346
448
|
type: 'audio-done';
|
|
347
449
|
agent?: string;
|
|
348
450
|
session?: string;
|
|
451
|
+
} | {
|
|
452
|
+
/**
|
|
453
|
+
* What the user was heard to say, sent once at the start of a spoken
|
|
454
|
+
* turn. Only the server knows this — the client sent audio — and a chat
|
|
455
|
+
* surface needs it to show the user's own message.
|
|
456
|
+
*/
|
|
457
|
+
type: 'transcript';
|
|
458
|
+
text: string;
|
|
459
|
+
agent?: string;
|
|
460
|
+
session?: string;
|
|
349
461
|
} | {
|
|
350
462
|
type: 'data';
|
|
351
463
|
name: string;
|
|
@@ -361,6 +473,14 @@ export type AIStreamEvent = {
|
|
|
361
473
|
type: 'suspended';
|
|
362
474
|
reason: 'rpc-missing';
|
|
363
475
|
missingRpcs: string[];
|
|
476
|
+
} | {
|
|
477
|
+
type: 'interrupted';
|
|
478
|
+
runId: string;
|
|
479
|
+
/** The truncated assistant text at the moment generation stopped. */
|
|
480
|
+
text: string;
|
|
481
|
+
reason: 'speech' | 'user' | 'timeout';
|
|
482
|
+
agent?: string;
|
|
483
|
+
session?: string;
|
|
364
484
|
} | {
|
|
365
485
|
type: 'done';
|
|
366
486
|
};
|
|
@@ -392,7 +512,7 @@ export interface AgentRunState {
|
|
|
392
512
|
agentName: string;
|
|
393
513
|
threadId: string;
|
|
394
514
|
resourceId: string;
|
|
395
|
-
status: 'running' | 'suspended' | 'completed' | 'failed';
|
|
515
|
+
status: 'running' | 'suspended' | 'completed' | 'failed' | 'interrupted';
|
|
396
516
|
errorMessage?: string;
|
|
397
517
|
suspendReason?: 'approval' | 'credential' | 'rpc-missing';
|
|
398
518
|
missingRpcs?: string[];
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
export { agent, agentStream, agentResume, agentApprove, } from './ai-agent-helpers.js';
|
|
1
|
+
export { agent, agentStream, agentResume, agentApprove, agentInterrupt, } from './ai-agent-helpers.js';
|
|
2
2
|
export { wrapChannelWithAGUI, type AGUIEvent } from './ai-agent-agui.js';
|
|
3
3
|
export { runAIAgent, resumeAIAgentSync } from './ai-agent-runner.js';
|
|
4
|
-
export { streamAIAgent, resumeAIAgent } from './ai-agent-stream.js';
|
|
5
|
-
export { voiceInput } from './voice-input.js';
|
|
6
|
-
export { voiceOutput } from './voice-output.js';
|
|
4
|
+
export { streamAIAgent, resumeAIAgent, interruptAIAgent, } from './ai-agent-stream.js';
|
|
5
|
+
export { voiceInput, readsAsNonSpeech, NoSpeechDetectedError, SPOKEN_TURN, SPOKEN_TRANSCRIPT, } from './voice-input.js';
|
|
6
|
+
export { voiceOutput, unspeakableScripts, voiceForText, type SpeakableScripts, } from './voice-output.js';
|
|
7
|
+
export { AgentInterruptedError, awaitPendingInterruptNote, getInFlightTools, isAbortError, isRunInterruptible, persistOrphanedToolResults, registerInterruptibleRun, signalRunInterrupt, trackInterruptNote, trackToolExecution, } from './ai-agent-interrupt.js';
|
|
8
|
+
export type { AgentInterruption, AgentInterruptResult, InterruptibleRunHandle, OrphanedToolResult, } from './ai-agent-interrupt.js';
|
|
7
9
|
export { type RunAIAgentParams, type StreamAIAgentOptions, ToolApprovalRequired, ToolCredentialRequired, canAccessThread, isOwnedByPrincipal, sessionPrincipals, threadOwnerConstraint, } from './ai-agent-prepare.js';
|
|
8
10
|
export { addAIAgent, approveAIAgent, getAIAgents, getAIAgentsMeta, } from './ai-agent-registry.js';
|
|
9
11
|
export type { AIAgentInput, AIAgentInputAttachment, AIAgentMeta, AIAgentMemoryConfig, AIAgentStep, AIContentPart, AgentRunRow, AgentRunService, AgentRunState, AIMessage, AIStreamChannel, AIStreamEvent, AIThread, CoreAIAgent, PendingApproval, PikkuAIMiddlewareHooks, } from './ai-agent.types.js';
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
export { agent, agentStream, agentResume, agentApprove, } from './ai-agent-helpers.js';
|
|
1
|
+
export { agent, agentStream, agentResume, agentApprove, agentInterrupt, } from './ai-agent-helpers.js';
|
|
2
2
|
export { wrapChannelWithAGUI } from './ai-agent-agui.js';
|
|
3
3
|
export { runAIAgent, resumeAIAgentSync } from './ai-agent-runner.js';
|
|
4
|
-
export { streamAIAgent, resumeAIAgent } from './ai-agent-stream.js';
|
|
5
|
-
export { voiceInput } from './voice-input.js';
|
|
6
|
-
export { voiceOutput } from './voice-output.js';
|
|
4
|
+
export { streamAIAgent, resumeAIAgent, interruptAIAgent, } from './ai-agent-stream.js';
|
|
5
|
+
export { voiceInput, readsAsNonSpeech, NoSpeechDetectedError, SPOKEN_TURN, SPOKEN_TRANSCRIPT, } from './voice-input.js';
|
|
6
|
+
export { voiceOutput, unspeakableScripts, voiceForText, } from './voice-output.js';
|
|
7
|
+
export { AgentInterruptedError, awaitPendingInterruptNote, getInFlightTools, isAbortError, isRunInterruptible, persistOrphanedToolResults, registerInterruptibleRun, signalRunInterrupt, trackInterruptNote, trackToolExecution, } from './ai-agent-interrupt.js';
|
|
7
8
|
export { ToolApprovalRequired, ToolCredentialRequired, canAccessThread, isOwnedByPrincipal, sessionPrincipals, threadOwnerConstraint, } from './ai-agent-prepare.js';
|
|
8
9
|
export { addAIAgent, approveAIAgent, getAIAgents, getAIAgentsMeta, } from './ai-agent-registry.js';
|
|
@@ -1,10 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Raised when every audio part in a turn turned out to be non-speech.
|
|
3
|
+
*
|
|
4
|
+
* Distinct from a transcription failure, because the response is different: a
|
|
5
|
+
* failure is worth reporting, whereas this is the microphone doing its job on a
|
|
6
|
+
* pause. A voice loop should catch it and go back to listening without running
|
|
7
|
+
* the agent — answering a hallucinated sentence is worse than answering nothing.
|
|
8
|
+
*/
|
|
9
|
+
export declare class NoSpeechDetectedError extends Error {
|
|
10
|
+
constructor();
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Whether nothing usable was said — an empty transcript, and nothing cleverer
|
|
14
|
+
* than that.
|
|
15
|
+
*
|
|
16
|
+
* There was a confidence gate here once, and it is worth recording why it is
|
|
17
|
+
* gone. Whisper is trained on subtitles, so audio it cannot parse comes back
|
|
18
|
+
* not as nothing but as stock filler appended to real speech: "Hello, my name
|
|
19
|
+
* is Yasir. Thank you." where only the first sentence was spoken. The obvious
|
|
20
|
+
* defence is to drop low-confidence segments, and it does not work. Measured on
|
|
21
|
+
* a real turn, the invented "Thank you." scored `avg_logprob` -0.52 against
|
|
22
|
+
* -0.30 for the genuine sentence beside it, and `no_speech_prob` read 0.000 for
|
|
23
|
+
* both. Whisper is *confident* when it invents, because the text it invents is
|
|
24
|
+
* high-probability text. No threshold separates those two numbers, and one set
|
|
25
|
+
* low enough to try would take real quiet speech with it.
|
|
26
|
+
*
|
|
27
|
+
* The fix belongs at the model, not behind it: an ASR that is not a
|
|
28
|
+
* subtitle-trained autoregressive decoder returns an empty string on non-speech
|
|
29
|
+
* and there is nothing left to filter. Hence this reduces to asking whether
|
|
30
|
+
* anything came back at all — which is a property every provider reports
|
|
31
|
+
* honestly, unlike per-segment confidence (Nemotron, for one, hardcodes
|
|
32
|
+
* `avg_logprob` to 0.0).
|
|
33
|
+
*/
|
|
34
|
+
export declare const readsAsNonSpeech: (result: {
|
|
35
|
+
text?: string;
|
|
36
|
+
}) => boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Shared-notes key recording whether the user's turn arrived as audio.
|
|
39
|
+
*
|
|
40
|
+
* Written here because this is the last point at which it is knowable: the
|
|
41
|
+
* transcript that replaces the audio is indistinguishable from something typed.
|
|
42
|
+
* Read by `voiceOutput` to decide whether to answer aloud.
|
|
43
|
+
*
|
|
44
|
+
* Absent — rather than `false` — when this middleware is not wired at all, which
|
|
45
|
+
* is what lets `voiceOutput` still speak for a caller that has no voice input.
|
|
46
|
+
*/
|
|
47
|
+
export declare const SPOKEN_TURN = "voice:spokenTurn";
|
|
48
|
+
/**
|
|
49
|
+
* Shared-notes key holding what the user was heard to say, when they spoke.
|
|
50
|
+
*
|
|
51
|
+
* Absent on a typed turn. Read by the stream wiring, which forwards it to the
|
|
52
|
+
* client as a `transcript` event — a voice client has no idea what its own
|
|
53
|
+
* audio said, and without this the user's turn shows up in the UI as an empty
|
|
54
|
+
* bubble followed by an answer to a question they cannot see.
|
|
55
|
+
*/
|
|
56
|
+
export declare const SPOKEN_TRANSCRIPT = "voice:transcript";
|
|
1
57
|
export declare const voiceInput: (config?: {
|
|
2
58
|
language?: string;
|
|
3
59
|
model?: string;
|
|
4
60
|
allowedAudioHosts?: string[];
|
|
5
61
|
}) => import("./ai-agent.types.js").PikkuAIMiddlewareHooks<Record<string, unknown>, import("../../types/core.types.js").CoreSingletonServices<{
|
|
6
62
|
logLevel?: import("../../services/logger.js").LogLevel;
|
|
7
|
-
secrets?: {
|
|
63
|
+
secrets?: {
|
|
64
|
+
requireAllowedHosts?: boolean;
|
|
65
|
+
};
|
|
8
66
|
workflow?: import("../workflow/workflow.types.js").WorkflowServiceConfig;
|
|
9
67
|
webhook?: import("../../services/webhook-service.js").WebhookServiceConfig;
|
|
10
68
|
postgres?: import("../../types/core.types.js").PostgresConfig;
|
|
@@ -9,6 +9,43 @@ function base64ToUint8Array(base64) {
|
|
|
9
9
|
return bytes;
|
|
10
10
|
}
|
|
11
11
|
const MAX_AUDIO_SIZE = 50 * 1024 * 1024;
|
|
12
|
+
/**
|
|
13
|
+
* Raised when every audio part in a turn turned out to be non-speech.
|
|
14
|
+
*
|
|
15
|
+
* Distinct from a transcription failure, because the response is different: a
|
|
16
|
+
* failure is worth reporting, whereas this is the microphone doing its job on a
|
|
17
|
+
* pause. A voice loop should catch it and go back to listening without running
|
|
18
|
+
* the agent — answering a hallucinated sentence is worse than answering nothing.
|
|
19
|
+
*/
|
|
20
|
+
export class NoSpeechDetectedError extends Error {
|
|
21
|
+
constructor() {
|
|
22
|
+
super('No speech was detected in the audio.');
|
|
23
|
+
this.name = 'NoSpeechDetectedError';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Whether nothing usable was said — an empty transcript, and nothing cleverer
|
|
28
|
+
* than that.
|
|
29
|
+
*
|
|
30
|
+
* There was a confidence gate here once, and it is worth recording why it is
|
|
31
|
+
* gone. Whisper is trained on subtitles, so audio it cannot parse comes back
|
|
32
|
+
* not as nothing but as stock filler appended to real speech: "Hello, my name
|
|
33
|
+
* is Yasir. Thank you." where only the first sentence was spoken. The obvious
|
|
34
|
+
* defence is to drop low-confidence segments, and it does not work. Measured on
|
|
35
|
+
* a real turn, the invented "Thank you." scored `avg_logprob` -0.52 against
|
|
36
|
+
* -0.30 for the genuine sentence beside it, and `no_speech_prob` read 0.000 for
|
|
37
|
+
* both. Whisper is *confident* when it invents, because the text it invents is
|
|
38
|
+
* high-probability text. No threshold separates those two numbers, and one set
|
|
39
|
+
* low enough to try would take real quiet speech with it.
|
|
40
|
+
*
|
|
41
|
+
* The fix belongs at the model, not behind it: an ASR that is not a
|
|
42
|
+
* subtitle-trained autoregressive decoder returns an empty string on non-speech
|
|
43
|
+
* and there is nothing left to filter. Hence this reduces to asking whether
|
|
44
|
+
* anything came back at all — which is a property every provider reports
|
|
45
|
+
* honestly, unlike per-segment confidence (Nemotron, for one, hardcodes
|
|
46
|
+
* `avg_logprob` to 0.0).
|
|
47
|
+
*/
|
|
48
|
+
export const readsAsNonSpeech = (result) => !(result.text ?? '').trim();
|
|
12
49
|
async function fetchAsUint8Array(url, allowedAudioHosts) {
|
|
13
50
|
const response = await safeFetch(url, {}, { allowedHosts: allowedAudioHosts });
|
|
14
51
|
const contentLength = response.headers.get('content-length');
|
|
@@ -21,25 +58,44 @@ async function fetchAsUint8Array(url, allowedAudioHosts) {
|
|
|
21
58
|
}
|
|
22
59
|
return new Uint8Array(buffer);
|
|
23
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* Shared-notes key recording whether the user's turn arrived as audio.
|
|
63
|
+
*
|
|
64
|
+
* Written here because this is the last point at which it is knowable: the
|
|
65
|
+
* transcript that replaces the audio is indistinguishable from something typed.
|
|
66
|
+
* Read by `voiceOutput` to decide whether to answer aloud.
|
|
67
|
+
*
|
|
68
|
+
* Absent — rather than `false` — when this middleware is not wired at all, which
|
|
69
|
+
* is what lets `voiceOutput` still speak for a caller that has no voice input.
|
|
70
|
+
*/
|
|
71
|
+
export const SPOKEN_TURN = 'voice:spokenTurn';
|
|
72
|
+
/**
|
|
73
|
+
* Shared-notes key holding what the user was heard to say, when they spoke.
|
|
74
|
+
*
|
|
75
|
+
* Absent on a typed turn. Read by the stream wiring, which forwards it to the
|
|
76
|
+
* client as a `transcript` event — a voice client has no idea what its own
|
|
77
|
+
* audio said, and without this the user's turn shows up in the UI as an empty
|
|
78
|
+
* bubble followed by an answer to a question they cannot see.
|
|
79
|
+
*/
|
|
80
|
+
export const SPOKEN_TRANSCRIPT = 'voice:transcript';
|
|
24
81
|
export const voiceInput = (config) => pikkuAIMiddleware({
|
|
25
|
-
modifyInput: async (services, { messages, instructions }) => {
|
|
82
|
+
modifyInput: async (services, { messages, instructions, shared }) => {
|
|
26
83
|
const aiAgentRunner = services.aiAgentRunner;
|
|
27
84
|
if (!aiAgentRunner?.transcribe)
|
|
28
85
|
return { messages, instructions };
|
|
29
86
|
const last = messages[messages.length - 1];
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const
|
|
34
|
-
|
|
87
|
+
const parts = last?.role === 'user' && typeof last.content !== 'string'
|
|
88
|
+
? last.content
|
|
89
|
+
: undefined;
|
|
90
|
+
const hasAudio = !!parts?.some((p) => p.type === 'file' && !!p.mediaType?.startsWith('audio/'));
|
|
91
|
+
// Recorded on every turn this middleware sees, spoken or not, so that a
|
|
92
|
+
// typed turn is an explicit `false` downstream rather than a silence that
|
|
93
|
+
// could equally mean nobody was asked.
|
|
94
|
+
shared[SPOKEN_TURN] = hasAudio;
|
|
95
|
+
if (!hasAudio || !parts)
|
|
35
96
|
return { messages, instructions };
|
|
36
|
-
const hasAudio = parts.some((p) => p.type === 'file' && !!p.mediaType?.startsWith('audio/'));
|
|
37
|
-
if (!hasAudio)
|
|
38
|
-
return { messages, instructions };
|
|
39
|
-
// Process parts in order, replacing each audio part with its transcription
|
|
40
|
-
// in place. Sequential, so no unbounded parallel downloads/transcriptions
|
|
41
|
-
// and original content ordering is preserved.
|
|
42
97
|
const updatedContent = [];
|
|
98
|
+
const heard = [];
|
|
43
99
|
for (const p of parts) {
|
|
44
100
|
if (!(p.type === 'file' && p.mediaType?.startsWith('audio/'))) {
|
|
45
101
|
updatedContent.push(p);
|
|
@@ -51,6 +107,9 @@ export const voiceInput = (config) => pikkuAIMiddleware({
|
|
|
51
107
|
const audioData = p.data
|
|
52
108
|
? base64ToUint8Array(p.data)
|
|
53
109
|
: await fetchAsUint8Array(p.url, config.allowedAudioHosts);
|
|
110
|
+
if (audioData.byteLength > MAX_AUDIO_SIZE) {
|
|
111
|
+
throw new Error('Audio file exceeds maximum size');
|
|
112
|
+
}
|
|
54
113
|
const result = await aiAgentRunner.transcribe({
|
|
55
114
|
model: config.model,
|
|
56
115
|
audio: audioData,
|
|
@@ -64,8 +123,27 @@ export const voiceInput = (config) => pikkuAIMiddleware({
|
|
|
64
123
|
}
|
|
65
124
|
: {}),
|
|
66
125
|
});
|
|
126
|
+
// Dropped when nothing was said: an empty text part is still a turn the
|
|
127
|
+
// model will answer, and what it answers is a guess about what it could
|
|
128
|
+
// not hear.
|
|
129
|
+
if (readsAsNonSpeech(result))
|
|
130
|
+
continue;
|
|
131
|
+
heard.push(result.text);
|
|
67
132
|
updatedContent.push({ type: 'text', text: result.text });
|
|
68
133
|
}
|
|
134
|
+
// Every part was audio, and none of it was speech. There is nothing left
|
|
135
|
+
// to send, and a message with no content is not a question.
|
|
136
|
+
if (updatedContent.length === 0)
|
|
137
|
+
throw new NoSpeechDetectedError();
|
|
138
|
+
// Only when something was actually heard. A turn can carry audio that all
|
|
139
|
+
// reads as non-speech and still have content — an image with a silent
|
|
140
|
+
// caption clip — which leaves nothing above to throw. Recording `''` here
|
|
141
|
+
// would send a transcript event saying the user said nothing, and a client
|
|
142
|
+
// that tells "not transcribed yet" from "transcribed" by the key being
|
|
143
|
+
// absent would render the turn as an empty bubble rather than a pending one.
|
|
144
|
+
if (heard.length > 0) {
|
|
145
|
+
shared[SPOKEN_TRANSCRIPT] = heard.join(' ');
|
|
146
|
+
}
|
|
69
147
|
return {
|
|
70
148
|
messages: [
|
|
71
149
|
...messages.slice(0, -1),
|
|
@@ -1,6 +1,47 @@
|
|
|
1
1
|
type VoiceOutputState = {
|
|
2
2
|
textBuffer?: string;
|
|
3
|
+
/**
|
|
4
|
+
* The audio emitted so far, as a chain.
|
|
5
|
+
*
|
|
6
|
+
* Synthesis for every finished sentence starts immediately, so the second
|
|
7
|
+
* sentence is being generated while the first is still being spoken. That
|
|
8
|
+
* also means the second can finish first — a short sentence after a long one
|
|
9
|
+
* routinely does. Chaining the *emissions* keeps the client receiving audio
|
|
10
|
+
* in the order it was written while leaving the generation overlapped.
|
|
11
|
+
*/
|
|
12
|
+
tail?: Promise<void>;
|
|
13
|
+
/** Whether this reply has already said it cannot be spoken aloud. */
|
|
14
|
+
reportedUnspeakable?: boolean;
|
|
3
15
|
};
|
|
16
|
+
/**
|
|
17
|
+
* The scripts a model can pronounce, and optionally the voice each one needs.
|
|
18
|
+
*
|
|
19
|
+
* The array form is for a model whose voice is the same whatever the script.
|
|
20
|
+
* The record form exists because that is not the common case: Kokoro speaks
|
|
21
|
+
* Mandarin, Japanese and Hindi well, but only through a voice belonging to that
|
|
22
|
+
* language. Asked for Chinese in its default American-English voice it spells
|
|
23
|
+
* the characters out — 9.9 seconds of "Chinese letter, Chinese letter" for a
|
|
24
|
+
* sentence the right voice says in 3.5. Same model, same text, same price.
|
|
25
|
+
*/
|
|
26
|
+
export type SpeakableScripts = string[] | Record<string, string>;
|
|
27
|
+
/**
|
|
28
|
+
* The scripts present in `text` that the model was not said to handle.
|
|
29
|
+
*
|
|
30
|
+
* Silence would be the wrong answer here and so would a best effort. Handed
|
|
31
|
+
* Arabic — which it has no voice for at all — Kokoro does not fail and does not
|
|
32
|
+
* stay quiet: it reads out the *letter names*, twenty-four seconds of "Arabic
|
|
33
|
+
* meem, Arabic ra" for a one-line sentence, which is worse than either. Naming
|
|
34
|
+
* the gap lets the caller say so instead.
|
|
35
|
+
*/
|
|
36
|
+
export declare const unspeakableScripts: (text: string, speakable: SpeakableScripts) => string[];
|
|
37
|
+
/**
|
|
38
|
+
* The voice to speak `text` in, or `fallback` if no mapped script appears.
|
|
39
|
+
*
|
|
40
|
+
* A sentence is regularly in more than one script, so which one decides is
|
|
41
|
+
* settled by {@link SCRIPT_PRECEDENCE} rather than by the order the config
|
|
42
|
+
* happens to be written in.
|
|
43
|
+
*/
|
|
44
|
+
export declare const voiceForText: (text: string, speakable: SpeakableScripts, fallback?: string) => string | undefined;
|
|
4
45
|
export declare const voiceOutput: (config?: {
|
|
5
46
|
model?: string;
|
|
6
47
|
format?: string;
|
|
@@ -8,9 +49,36 @@ export declare const voiceOutput: (config?: {
|
|
|
8
49
|
instructions?: string;
|
|
9
50
|
speed?: number;
|
|
10
51
|
language?: string;
|
|
52
|
+
/**
|
|
53
|
+
* Scripts the configured model can actually pronounce, and the voice each
|
|
54
|
+
* needs — see {@link SpeakableScripts}. Anything written in another script is
|
|
55
|
+
* left unspoken and reported once, as a `voice-unsupported` data event,
|
|
56
|
+
* rather than sent to a model that will mangle it.
|
|
57
|
+
*
|
|
58
|
+
* Omitted means no check: every model is trusted with every script, which is
|
|
59
|
+
* the right default for a provider that genuinely is multilingual.
|
|
60
|
+
*/
|
|
61
|
+
speakableScripts?: SpeakableScripts;
|
|
62
|
+
/**
|
|
63
|
+
* Speak every reply, including answers to turns that were typed.
|
|
64
|
+
*
|
|
65
|
+
* The default is to speak only what was spoken to. An agent is usually one
|
|
66
|
+
* agent serving both kinds of caller — the same thread is typed at from a
|
|
67
|
+
* desk and talked to from a phone — and synthesizing a reply nobody is
|
|
68
|
+
* listening to costs real money on every sentence of every turn. Whether the
|
|
69
|
+
* user is in a call is not something the client needs to declare: sending
|
|
70
|
+
* audio is what saying so looks like.
|
|
71
|
+
*
|
|
72
|
+
* Set this for the cases where speech is not a reply to speech at all — a
|
|
73
|
+
* read-aloud accessibility mode, a kiosk, anything whose whole output is
|
|
74
|
+
* meant to be heard.
|
|
75
|
+
*/
|
|
76
|
+
always?: boolean;
|
|
11
77
|
}) => import("./ai-agent.types.js").PikkuAIMiddlewareHooks<VoiceOutputState, import("../../types/core.types.js").CoreSingletonServices<{
|
|
12
78
|
logLevel?: import("../../services/logger.js").LogLevel;
|
|
13
|
-
secrets?: {
|
|
79
|
+
secrets?: {
|
|
80
|
+
requireAllowedHosts?: boolean;
|
|
81
|
+
};
|
|
14
82
|
workflow?: import("../workflow/workflow.types.js").WorkflowServiceConfig;
|
|
15
83
|
webhook?: import("../../services/webhook-service.js").WebhookServiceConfig;
|
|
16
84
|
postgres?: import("../../types/core.types.js").PostgresConfig;
|