@pikku/core 0.12.72 → 0.12.74
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 +793 -0
- package/dist/crypto-utils.d.ts +30 -5
- package/dist/crypto-utils.js +146 -41
- 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 +44 -136
- package/dist/function/functions.types.js +0 -58
- 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 +5 -2
- package/dist/index.js +4 -1
- 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 +3 -40
- 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 +3 -2
- 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 +8 -7
- 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/services/ai-agent-runner-service.d.ts +20 -0
- package/dist/services/ai-embedding-service.d.ts +2 -25
- package/dist/services/audit-service.js +1 -2
- package/dist/services/content-service.d.ts +1 -46
- package/dist/services/credential-service.d.ts +3 -40
- package/dist/services/deployment-service.d.ts +3 -9
- 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 +5 -6
- package/dist/services/index.js +2 -5
- 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.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 +0 -4
- package/dist/services/local-secrets.js +0 -4
- package/dist/services/logger-console.d.ts +3 -7
- package/dist/services/logger-console.js +3 -7
- package/dist/services/logger.d.ts +2 -37
- 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 +9 -41
- 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 +0 -4
- 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 +5 -33
- 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 +0 -7
- 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 +19 -63
- package/dist/services/webhook-service.js +6 -20
- package/dist/services/workflow-service.d.ts +3 -15
- package/dist/testing/service-tests.js +0 -17
- package/dist/time-utils.d.ts +0 -16
- package/dist/time-utils.js +1 -19
- package/dist/types/core.types.d.ts +99 -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 +34 -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 +58 -131
- 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 +49 -20
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +25 -2
- package/dist/wirings/ai-agent/ai-agent-stream.js +153 -63
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +84 -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 +39 -1
- package/dist/wirings/ai-agent/voice-input.js +46 -3
- package/dist/wirings/ai-agent/voice-output.d.ts +54 -1
- package/dist/wirings/ai-agent/voice-output.js +153 -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 +20 -0
- package/dist/wirings/cli/channel/cli-raw-client-runner.js +121 -0
- package/dist/wirings/cli/channel/index.d.ts +4 -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 +28 -0
- package/dist/wirings/persona/define-personas.js +27 -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 +125 -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 +102 -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 +18 -89
- 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 +16 -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 +1 -12
- package/dist/wirings/rpc/remote-addon-auth.js +1 -9
- 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 +27 -0
- package/dist/wirings/virtual-user/index.js +8 -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-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 +5 -5
- 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 -42
- 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 +0 -18
- 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 +72 -6
- 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 +0 -197
- 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/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-data-classification-brand-is-an-optional-property.md +34 -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 +113 -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/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/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/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 +4 -1
- package/run-tests.sh +0 -0
- package/src/crypto-utils.test.ts +460 -19
- package/src/crypto-utils.ts +283 -55
- package/src/data-classification.ts +1 -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 +56 -136
- 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 +60 -1
- package/src/middleware/auth-apikey.test.ts +0 -1
- package/src/middleware/auth-apikey.ts +0 -17
- package/src/middleware/auth-bearer.test.ts +0 -3
- package/src/middleware/auth-bearer.ts +3 -40
- 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 +24 -9
- package/src/middleware/remote-auth.ts +10 -2
- 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 +172 -0
- package/src/remote.ts +17 -7
- package/src/schema.ts +5 -39
- package/src/scopes.ts +7 -48
- 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 +1 -2
- 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/deployment-service.ts +3 -9
- 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 +20 -15
- package/src/services/istanbul-coverage-service.ts +2 -8
- package/src/services/jwt-service.ts +1 -16
- 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.ts +0 -4
- package/src/services/logger-console.test.ts +0 -1
- package/src/services/logger-console.ts +3 -7
- package/src/services/logger.ts +2 -37
- 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.ts +9 -41
- 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 +0 -4
- 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 +5 -33
- 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 +1 -7
- package/src/services/v8-coverage-service.ts +3 -6
- package/src/services/variables-service.ts +1 -8
- package/src/services/webhook-service.ts +19 -63
- package/src/services/workflow-service.ts +3 -20
- package/src/testing/service-tests.ts +0 -26
- package/src/time-utils.ts +1 -19
- package/src/types/core.types.ts +116 -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 +75 -10
- package/src/wirings/ai-agent/ai-agent-agui.ts +36 -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 +82 -138
- 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 +67 -33
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +205 -103
- package/src/wirings/ai-agent/ai-agent-stream.ts +192 -75
- package/src/wirings/ai-agent/ai-agent-thread-ownership.test.ts +301 -0
- package/src/wirings/ai-agent/ai-agent.types.ts +85 -4
- package/src/wirings/ai-agent/index.ts +35 -3
- package/src/wirings/ai-agent/voice-input.test.ts +72 -7
- package/src/wirings/ai-agent/voice-input.ts +48 -3
- package/src/wirings/ai-agent/voice-output.test.ts +422 -0
- package/src/wirings/ai-agent/voice-output.ts +216 -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 +155 -0
- package/src/wirings/cli/channel/index.ts +9 -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 +29 -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 +131 -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 +453 -0
- package/src/wirings/queue/queue-identity.ts +173 -0
- package/src/wirings/queue/queue-runner.ts +12 -31
- package/src/wirings/queue/queue.types.ts +19 -89
- package/src/wirings/queue/register-queue-helper.ts +0 -14
- package/src/wirings/queue/signed-queue-service.ts +59 -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 +1 -13
- package/src/wirings/rpc/rpc-runner.test.ts +186 -2
- 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 +76 -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-target.ts +47 -0
- package/src/wirings/virtual-user/virtual-user.types.ts +219 -0
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +5 -4
- 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 -52
- 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.ts +0 -28
- package/src/wirings/workflow/scenario-service.test.ts +2 -9
- package/src/wirings/workflow/scenario-step-guards.ts +1 -14
- package/src/wirings/workflow/scenario-step.test.ts +159 -14
- package/src/wirings/workflow/scenario-step.types.ts +82 -6
- package/src/wirings/workflow/scenario-surface.test.ts +145 -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 +0 -203
- package/tsconfig.tsbuildinfo +1 -1
- 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
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import type { AIStorageService } from '../../services/ai-storage-service.js';
|
|
2
|
+
/**
|
|
3
|
+
* Why an in-flight agent run was cut short.
|
|
4
|
+
*
|
|
5
|
+
* Deliberately carries no interjection text. A voice interruption is not a
|
|
6
|
+
* cancel button — it is the user starting to talk — but what they said arrives
|
|
7
|
+
* a second later as an ordinary next turn on the same thread, and that turn
|
|
8
|
+
* already has a working path through `streamAIAgent`. The model then sees its
|
|
9
|
+
* own truncated message (marked `interrupted`) followed by the interjection and
|
|
10
|
+
* decides for itself whether to resume, correct itself or drop the thread.
|
|
11
|
+
* Nothing here classifies the interjection; a second delivery path for the same
|
|
12
|
+
* text would only give the two ways to disagree about ordering.
|
|
13
|
+
*/
|
|
14
|
+
export interface AgentInterruption {
|
|
15
|
+
/** `'speech'` — the user started talking over the agent (voice barge-in).
|
|
16
|
+
* `'user'` — an explicit stop (a button). `'timeout'` — a caller-side deadline. */
|
|
17
|
+
reason: 'speech' | 'user' | 'timeout';
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Thrown out of the step loop when a run is interrupted, so an interruption is
|
|
21
|
+
* distinguishable from a genuine failure at the one `catch` that would
|
|
22
|
+
* otherwise mark the run `failed`.
|
|
23
|
+
*/
|
|
24
|
+
export declare class AgentInterruptedError extends Error {
|
|
25
|
+
readonly runId: string;
|
|
26
|
+
readonly interruption: AgentInterruption;
|
|
27
|
+
constructor(runId: string, interruption: AgentInterruption);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* A tool call that settled after its run was interrupted, so its result never
|
|
31
|
+
* reached the model.
|
|
32
|
+
*
|
|
33
|
+
* These are not failures, and they are only ever mutations. The tool ran, its
|
|
34
|
+
* side effect happened, and the only thing the interrupt cost was the reply
|
|
35
|
+
* describing it — so the result is worth mentioning on the next turn. Reads are
|
|
36
|
+
* excluded at the call site: nothing changed, so there is nothing to account
|
|
37
|
+
* for, and a stale answer is worse than re-reading.
|
|
38
|
+
*/
|
|
39
|
+
export interface OrphanedToolResult {
|
|
40
|
+
toolCallId: string;
|
|
41
|
+
toolName: string;
|
|
42
|
+
result: unknown;
|
|
43
|
+
/** Set instead of `result` when the tool threw after the interrupt. */
|
|
44
|
+
error?: string;
|
|
45
|
+
}
|
|
46
|
+
/** What an authorized interrupt actually achieved. */
|
|
47
|
+
export interface AgentInterruptResult {
|
|
48
|
+
/**
|
|
49
|
+
* Whether a generating run was stopped. `false` is routine, not an error:
|
|
50
|
+
* racing a run that finishes on its own is the normal case in voice.
|
|
51
|
+
*/
|
|
52
|
+
stopped: boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Tools that were still executing when the interrupt landed. Their side
|
|
55
|
+
* effects have already happened and cannot be undone from here — this is for
|
|
56
|
+
* saying something true ("the deploy is still going"), not for offering to
|
|
57
|
+
* roll it back. Each will surface as an `undelivered` tool message on the
|
|
58
|
+
* thread once it settles.
|
|
59
|
+
*/
|
|
60
|
+
inFlightTools: string[];
|
|
61
|
+
}
|
|
62
|
+
export interface InterruptibleRunHandle {
|
|
63
|
+
readonly signal: AbortSignal;
|
|
64
|
+
/** Set at the moment the run is interrupted; `undefined` on a clean run. */
|
|
65
|
+
readonly interruption: AgentInterruption | undefined;
|
|
66
|
+
/** Names of tools executing right now — what an interrupt would talk over. */
|
|
67
|
+
readonly inFlightTools: string[];
|
|
68
|
+
/**
|
|
69
|
+
* Wrap a tool execution so it survives an interrupt. Before the interrupt
|
|
70
|
+
* this is a pass-through; after one, the settled value is collected as an
|
|
71
|
+
* {@link OrphanedToolResult} rather than vanishing with the aborted stream.
|
|
72
|
+
*/
|
|
73
|
+
trackTool<T>(toolName: string, toolCallId: string, exec: () => Promise<T>, opts?: {
|
|
74
|
+
collectResult?: boolean;
|
|
75
|
+
}): Promise<T>;
|
|
76
|
+
/**
|
|
77
|
+
* Resolves once every tool still running at the moment of the interrupt has
|
|
78
|
+
* settled, with the results the model never got to see.
|
|
79
|
+
*
|
|
80
|
+
* Deliberately not awaited before the stream closes: barge-in has to stop the
|
|
81
|
+
* agent talking immediately, and a tool holding that up for its own duration
|
|
82
|
+
* is the one thing voice cannot tolerate.
|
|
83
|
+
*/
|
|
84
|
+
settle(timeoutMs?: number): Promise<OrphanedToolResult[]>;
|
|
85
|
+
release(): void;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Make a run interruptible for the duration of its stream. The returned signal
|
|
89
|
+
* is threaded into the model call, so an interrupt cancels the upstream HTTP
|
|
90
|
+
* request rather than merely stopping delivery of tokens we are still paying
|
|
91
|
+
* for.
|
|
92
|
+
*/
|
|
93
|
+
export declare const registerInterruptibleRun: (runId: string) => InterruptibleRunHandle;
|
|
94
|
+
/**
|
|
95
|
+
* Stop a run that is generating right now.
|
|
96
|
+
*
|
|
97
|
+
* Plumbing: this performs NO authorization, so anyone holding a runId can stop
|
|
98
|
+
* it. Reach for {@link interruptAIAgent} instead unless the caller has already
|
|
99
|
+
* established that the run belongs to the session — which in practice means
|
|
100
|
+
* only the runner itself and code already inside an authorized run.
|
|
101
|
+
*
|
|
102
|
+
* Returns `false` when the run is not in flight in this process — already
|
|
103
|
+
* finished, never started, or running elsewhere — which callers should treat as
|
|
104
|
+
* "nothing to interrupt", not as an error: racing a run that finishes on its own
|
|
105
|
+
* is the normal case in voice.
|
|
106
|
+
*/
|
|
107
|
+
export declare const signalRunInterrupt: (runId: string, interruption?: AgentInterruption) => boolean;
|
|
108
|
+
/** Whether a run is currently interruptible in this process. */
|
|
109
|
+
export declare const isRunInterruptible: (runId: string) => boolean;
|
|
110
|
+
/**
|
|
111
|
+
* Tools executing in a run right now. Empty for a run that is merely
|
|
112
|
+
* generating, or one this process does not hold.
|
|
113
|
+
*
|
|
114
|
+
* Callers use this to say something true about work that outlives the reply —
|
|
115
|
+
* "that deploy is still going" — rather than to offer to stop it. By the time a
|
|
116
|
+
* tool is executing its side effect has already happened, and pikku functions
|
|
117
|
+
* receive no abort signal, so there is nothing left to cancel.
|
|
118
|
+
*/
|
|
119
|
+
export declare const getInFlightTools: (runId: string) => string[];
|
|
120
|
+
/**
|
|
121
|
+
* Wrap tool definitions so their results survive an interrupt.
|
|
122
|
+
*
|
|
123
|
+
* Applied by the runner after the handle exists rather than in `buildToolDefs`,
|
|
124
|
+
* which builds tools before there is a runId to attach them to.
|
|
125
|
+
*/
|
|
126
|
+
export declare const trackToolExecution: <T extends {
|
|
127
|
+
name: string;
|
|
128
|
+
readonly?: boolean;
|
|
129
|
+
execute: (input: any) => Promise<any>;
|
|
130
|
+
}>(tools: T[], handle: InterruptibleRunHandle) => T[];
|
|
131
|
+
export declare const trackInterruptNote: (threadId: string, write: Promise<void>) => void;
|
|
132
|
+
/** Await an interrupted tool result still being written to this thread. */
|
|
133
|
+
export declare const awaitPendingInterruptNote: (threadId: string) => Promise<void>;
|
|
134
|
+
/**
|
|
135
|
+
* Write the results of tools that were still running when a run was cut off.
|
|
136
|
+
*
|
|
137
|
+
* Saved as an ordinary tool message so it reaches the model through the same
|
|
138
|
+
* context load as everything else — there is no separate "notes" channel to
|
|
139
|
+
* keep in sync, and storage that drops the `undelivered` flag still keeps the
|
|
140
|
+
* result itself.
|
|
141
|
+
*
|
|
142
|
+
* Callers should hand this to {@link trackInterruptNote} rather than awaiting
|
|
143
|
+
* it: an interrupt has to end the reply immediately, and a slow tool must not
|
|
144
|
+
* hold that up.
|
|
145
|
+
*/
|
|
146
|
+
export declare const persistOrphanedToolResults: (handle: InterruptibleRunHandle, storage: AIStorageService, threadId: string) => Promise<void>;
|
|
147
|
+
/**
|
|
148
|
+
* Whether a thrown value is an abort rather than a failure. The AI SDK
|
|
149
|
+
* surfaces cancellation as a DOMException/Error named `AbortError`, so the
|
|
150
|
+
* name is the only portable signal — there is no shared error class to
|
|
151
|
+
* `instanceof` against across fetch, undici and the provider SDKs.
|
|
152
|
+
*/
|
|
153
|
+
export declare const isAbortError: (err: unknown) => boolean;
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { randomUUID } from './ai-agent-utils.js';
|
|
2
|
+
import { AbandonedError, runInAbortScope, } from '../../function/abort-scope.js';
|
|
3
|
+
/**
|
|
4
|
+
* Thrown out of the step loop when a run is interrupted, so an interruption is
|
|
5
|
+
* distinguishable from a genuine failure at the one `catch` that would
|
|
6
|
+
* otherwise mark the run `failed`.
|
|
7
|
+
*/
|
|
8
|
+
export class AgentInterruptedError extends Error {
|
|
9
|
+
runId;
|
|
10
|
+
interruption;
|
|
11
|
+
constructor(runId, interruption) {
|
|
12
|
+
super(`Agent run ${runId} interrupted (${interruption.reason})`);
|
|
13
|
+
this.runId = runId;
|
|
14
|
+
this.interruption = interruption;
|
|
15
|
+
this.name = 'AgentInterruptedError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Live runs, keyed by runId.
|
|
20
|
+
*
|
|
21
|
+
* Module-level rather than `pikkuState` because the value is an
|
|
22
|
+
* `AbortController` — a process-local object that cannot be serialised or
|
|
23
|
+
* shared. That is also this registry's limit: an interrupt only reaches a run
|
|
24
|
+
* executing in the same process. Single-process and channel-attached callers
|
|
25
|
+
* (where the interrupt arrives on the socket already carrying the run) are
|
|
26
|
+
* covered; a horizontally-scaled deployment interrupting over a *separate* HTTP
|
|
27
|
+
* request needs the interrupt fanned out over `eventHub` to every instance
|
|
28
|
+
* first, with each instance calling `signalRunInterrupt` locally.
|
|
29
|
+
*/
|
|
30
|
+
const runs = new Map();
|
|
31
|
+
/**
|
|
32
|
+
* Make a run interruptible for the duration of its stream. The returned signal
|
|
33
|
+
* is threaded into the model call, so an interrupt cancels the upstream HTTP
|
|
34
|
+
* request rather than merely stopping delivery of tokens we are still paying
|
|
35
|
+
* for.
|
|
36
|
+
*/
|
|
37
|
+
export const registerInterruptibleRun = (runId) => {
|
|
38
|
+
const entry = {
|
|
39
|
+
controller: new AbortController(),
|
|
40
|
+
inFlight: new Map(),
|
|
41
|
+
orphaned: [],
|
|
42
|
+
pending: new Set(),
|
|
43
|
+
};
|
|
44
|
+
runs.set(runId, entry);
|
|
45
|
+
return {
|
|
46
|
+
signal: entry.controller.signal,
|
|
47
|
+
get interruption() {
|
|
48
|
+
return entry.interruption;
|
|
49
|
+
},
|
|
50
|
+
get inFlightTools() {
|
|
51
|
+
return [...entry.inFlight.values()];
|
|
52
|
+
},
|
|
53
|
+
trackTool: async (toolName, toolCallId, exec, opts) => {
|
|
54
|
+
entry.inFlight.set(toolCallId, toolName);
|
|
55
|
+
const call = exec();
|
|
56
|
+
// Tracked separately from the returned promise so an interrupt can wait
|
|
57
|
+
// on the tool without the caller's rejection becoming an unhandled one.
|
|
58
|
+
const tracked = call.then((result) => {
|
|
59
|
+
entry.inFlight.delete(toolCallId);
|
|
60
|
+
// Read now rather than at call time: a tool that uses
|
|
61
|
+
// `beginChanges()` only reveals partway through whether it mutated.
|
|
62
|
+
if ((opts?.collectResult ?? true) &&
|
|
63
|
+
entry.controller.signal.aborted) {
|
|
64
|
+
entry.orphaned.push({ toolCallId, toolName, result });
|
|
65
|
+
}
|
|
66
|
+
}, (err) => {
|
|
67
|
+
entry.inFlight.delete(toolCallId);
|
|
68
|
+
// A tool that stopped *at* its own checkpoint changed nothing by
|
|
69
|
+
// construction, so it never files a note — reporting "it aborted"
|
|
70
|
+
// is exactly the noise `beginChanges()` exists to remove.
|
|
71
|
+
if (err instanceof AbandonedError)
|
|
72
|
+
return;
|
|
73
|
+
if ((opts?.collectResult ?? true) &&
|
|
74
|
+
entry.controller.signal.aborted) {
|
|
75
|
+
entry.orphaned.push({
|
|
76
|
+
toolCallId,
|
|
77
|
+
toolName,
|
|
78
|
+
result: undefined,
|
|
79
|
+
error: err instanceof Error ? err.message : String(err),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
entry.pending.add(tracked);
|
|
84
|
+
void tracked.finally(() => entry.pending.delete(tracked));
|
|
85
|
+
return call;
|
|
86
|
+
},
|
|
87
|
+
settle: async (timeoutMs = 30_000) => {
|
|
88
|
+
if (entry.pending.size > 0) {
|
|
89
|
+
// A tool that never settles must not strand the note forever; whatever
|
|
90
|
+
// has landed by the deadline is what gets reported.
|
|
91
|
+
let timer;
|
|
92
|
+
await Promise.race([
|
|
93
|
+
Promise.all([...entry.pending]),
|
|
94
|
+
new Promise((resolve) => {
|
|
95
|
+
timer = setTimeout(resolve, timeoutMs);
|
|
96
|
+
}),
|
|
97
|
+
]);
|
|
98
|
+
if (timer)
|
|
99
|
+
clearTimeout(timer);
|
|
100
|
+
}
|
|
101
|
+
return entry.orphaned;
|
|
102
|
+
},
|
|
103
|
+
release: () => {
|
|
104
|
+
if (runs.get(runId) === entry)
|
|
105
|
+
runs.delete(runId);
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* Stop a run that is generating right now.
|
|
111
|
+
*
|
|
112
|
+
* Plumbing: this performs NO authorization, so anyone holding a runId can stop
|
|
113
|
+
* it. Reach for {@link interruptAIAgent} instead unless the caller has already
|
|
114
|
+
* established that the run belongs to the session — which in practice means
|
|
115
|
+
* only the runner itself and code already inside an authorized run.
|
|
116
|
+
*
|
|
117
|
+
* Returns `false` when the run is not in flight in this process — already
|
|
118
|
+
* finished, never started, or running elsewhere — which callers should treat as
|
|
119
|
+
* "nothing to interrupt", not as an error: racing a run that finishes on its own
|
|
120
|
+
* is the normal case in voice.
|
|
121
|
+
*/
|
|
122
|
+
export const signalRunInterrupt = (runId, interruption = { reason: 'user' }) => {
|
|
123
|
+
const entry = runs.get(runId);
|
|
124
|
+
if (!entry || entry.controller.signal.aborted)
|
|
125
|
+
return false;
|
|
126
|
+
entry.interruption = interruption;
|
|
127
|
+
entry.controller.abort();
|
|
128
|
+
return true;
|
|
129
|
+
};
|
|
130
|
+
/** Whether a run is currently interruptible in this process. */
|
|
131
|
+
export const isRunInterruptible = (runId) => runs.has(runId);
|
|
132
|
+
/**
|
|
133
|
+
* Tools executing in a run right now. Empty for a run that is merely
|
|
134
|
+
* generating, or one this process does not hold.
|
|
135
|
+
*
|
|
136
|
+
* Callers use this to say something true about work that outlives the reply —
|
|
137
|
+
* "that deploy is still going" — rather than to offer to stop it. By the time a
|
|
138
|
+
* tool is executing its side effect has already happened, and pikku functions
|
|
139
|
+
* receive no abort signal, so there is nothing left to cancel.
|
|
140
|
+
*/
|
|
141
|
+
export const getInFlightTools = (runId) => {
|
|
142
|
+
const entry = runs.get(runId);
|
|
143
|
+
return entry ? [...entry.inFlight.values()] : [];
|
|
144
|
+
};
|
|
145
|
+
/**
|
|
146
|
+
* Wrap tool definitions so their results survive an interrupt.
|
|
147
|
+
*
|
|
148
|
+
* Applied by the runner after the handle exists rather than in `buildToolDefs`,
|
|
149
|
+
* which builds tools before there is a runId to attach them to.
|
|
150
|
+
*/
|
|
151
|
+
export const trackToolExecution = (tools, handle) => tools.map((tool) => {
|
|
152
|
+
// Reads run outside the scope entirely: they never produce a note and have
|
|
153
|
+
// nothing to declare, so `beginChanges()` inside one is a no-op rather than
|
|
154
|
+
// a contradiction to resolve.
|
|
155
|
+
if (tool.readonly) {
|
|
156
|
+
return {
|
|
157
|
+
...tool,
|
|
158
|
+
execute: (input) => handle.trackTool(tool.name, randomUUID(), () => tool.execute(input), {
|
|
159
|
+
collectResult: false,
|
|
160
|
+
}),
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
...tool,
|
|
165
|
+
execute: (input) => {
|
|
166
|
+
// Assumed to have changed something unless it says otherwise — the tool
|
|
167
|
+
// that never declares its checkpoint is the one that cannot be assumed
|
|
168
|
+
// harmless. `beginChanges()` can only ever make this more precise.
|
|
169
|
+
const call = { mutating: true };
|
|
170
|
+
const scope = {
|
|
171
|
+
get abandoned() {
|
|
172
|
+
return handle.signal.aborted;
|
|
173
|
+
},
|
|
174
|
+
get reason() {
|
|
175
|
+
return handle.interruption?.reason;
|
|
176
|
+
},
|
|
177
|
+
onBeginChanges: () => {
|
|
178
|
+
call.mutating = true;
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
return handle.trackTool(tool.name, randomUUID(), () => runInAbortScope(scope, () => tool.execute(input)), {
|
|
182
|
+
get collectResult() {
|
|
183
|
+
return call.mutating;
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
});
|
|
189
|
+
/**
|
|
190
|
+
* Threads with an interrupted tool call still settling.
|
|
191
|
+
*
|
|
192
|
+
* The note describing that result has to be in the thread before the turn that
|
|
193
|
+
* ought to mention it loads its context, and the user's next sentence usually
|
|
194
|
+
* arrives well inside a slow tool. Runs await this for their own thread first,
|
|
195
|
+
* so the ordering holds without the interrupt itself blocking on anything.
|
|
196
|
+
*/
|
|
197
|
+
const pendingNotes = new Map();
|
|
198
|
+
export const trackInterruptNote = (threadId, write) => {
|
|
199
|
+
const done = write.finally(() => {
|
|
200
|
+
if (pendingNotes.get(threadId) === done)
|
|
201
|
+
pendingNotes.delete(threadId);
|
|
202
|
+
});
|
|
203
|
+
pendingNotes.set(threadId, done);
|
|
204
|
+
};
|
|
205
|
+
/** Await an interrupted tool result still being written to this thread. */
|
|
206
|
+
export const awaitPendingInterruptNote = async (threadId) => {
|
|
207
|
+
await pendingNotes.get(threadId);
|
|
208
|
+
};
|
|
209
|
+
/**
|
|
210
|
+
* Write the results of tools that were still running when a run was cut off.
|
|
211
|
+
*
|
|
212
|
+
* Saved as an ordinary tool message so it reaches the model through the same
|
|
213
|
+
* context load as everything else — there is no separate "notes" channel to
|
|
214
|
+
* keep in sync, and storage that drops the `undelivered` flag still keeps the
|
|
215
|
+
* result itself.
|
|
216
|
+
*
|
|
217
|
+
* Callers should hand this to {@link trackInterruptNote} rather than awaiting
|
|
218
|
+
* it: an interrupt has to end the reply immediately, and a slow tool must not
|
|
219
|
+
* hold that up.
|
|
220
|
+
*/
|
|
221
|
+
export const persistOrphanedToolResults = async (handle, storage, threadId) => {
|
|
222
|
+
let orphaned;
|
|
223
|
+
try {
|
|
224
|
+
orphaned = await handle.settle();
|
|
225
|
+
}
|
|
226
|
+
finally {
|
|
227
|
+
handle.release();
|
|
228
|
+
}
|
|
229
|
+
if (orphaned.length === 0)
|
|
230
|
+
return;
|
|
231
|
+
await storage.saveMessages(threadId, [
|
|
232
|
+
{
|
|
233
|
+
id: randomUUID(),
|
|
234
|
+
role: 'tool',
|
|
235
|
+
toolResults: orphaned.map((entry) => ({
|
|
236
|
+
id: entry.toolCallId,
|
|
237
|
+
name: entry.toolName,
|
|
238
|
+
result: entry.error
|
|
239
|
+
? `Error: ${entry.error}`
|
|
240
|
+
: typeof entry.result === 'string'
|
|
241
|
+
? entry.result
|
|
242
|
+
: JSON.stringify(entry.result),
|
|
243
|
+
})),
|
|
244
|
+
undelivered: true,
|
|
245
|
+
createdAt: new Date(),
|
|
246
|
+
},
|
|
247
|
+
]);
|
|
248
|
+
};
|
|
249
|
+
/**
|
|
250
|
+
* Whether a thrown value is an abort rather than a failure. The AI SDK
|
|
251
|
+
* surfaces cancellation as a DOMException/Error named `AbortError`, so the
|
|
252
|
+
* name is the only portable signal — there is no shared error class to
|
|
253
|
+
* `instanceof` against across fetch, undici and the provider SDKs.
|
|
254
|
+
*/
|
|
255
|
+
export const isAbortError = (err) => err instanceof Error &&
|
|
256
|
+
(err.name === 'AbortError' || err.name === 'TimeoutError');
|
|
@@ -288,8 +288,6 @@ export function createWorkingMemoryMiddleware(options) {
|
|
|
288
288
|
options.logger?.warn(`Working memory validation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
289
289
|
}
|
|
290
290
|
}
|
|
291
|
-
// Only persist when the merged value passes schema validation —
|
|
292
|
-
// saving invalid data would poison subsequent getWorkingMemory reads.
|
|
293
291
|
if (valid) {
|
|
294
292
|
await options.storage.saveWorkingMemory(options.threadId, 'thread', merged);
|
|
295
293
|
}
|
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Resolves the effective model/temperature/maxSteps for an agent at runtime.
|
|
3
|
-
*
|
|
4
|
-
* Models are declared per-agent using the provider-qualified `provider/model`
|
|
5
|
-
* form (e.g. `openai/gpt-5-mini`); there is no config-level alias map. This
|
|
6
|
-
* function remains the single merge point for request-time overrides (see
|
|
7
|
-
* ai-agent-prepare's `input.model`), so callers stay decoupled from how the
|
|
8
|
-
* effective config is assembled.
|
|
9
|
-
*/
|
|
10
1
|
export declare function resolveModelConfig(_agentName: string, agent: {
|
|
11
2
|
model: string;
|
|
12
3
|
temperature?: number;
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* Resolves the effective model/temperature/maxSteps for an agent at runtime.
|
|
3
|
-
*
|
|
4
|
-
* Models are declared per-agent using the provider-qualified `provider/model`
|
|
5
|
-
* form (e.g. `openai/gpt-5-mini`); there is no config-level alias map. This
|
|
6
|
-
* function remains the single merge point for request-time overrides (see
|
|
7
|
-
* ai-agent-prepare's `input.model`), so callers stay decoupled from how the
|
|
8
|
-
* effective config is assembled.
|
|
9
|
-
*/
|
|
1
|
+
// knowledge: decisions/internals/ai-agent-model-config-stays-a-single-resolution-seam.md
|
|
10
2
|
export function resolveModelConfig(_agentName, agent) {
|
|
11
3
|
return {
|
|
12
4
|
model: agent.model,
|
|
@@ -7,92 +7,38 @@ export type RunAIAgentParams = {
|
|
|
7
7
|
sessionService?: SessionService<CoreUserSession>;
|
|
8
8
|
/** Credential accessor for the current request — used to read per-user overrides (e.g. AI_API_KEY). */
|
|
9
9
|
getCredential?: <T = unknown>(name: string) => T | null | Promise<T | null>;
|
|
10
|
+
/** Ephemeral owner identity minted for a sessionless request; never client-supplied, never reused across requests. */
|
|
11
|
+
anonymousOwnerResourceId?: string;
|
|
10
12
|
};
|
|
11
|
-
|
|
12
|
-
* The ownership key for a thread/run: the trusted principal (the authenticated
|
|
13
|
-
* `session.userId` for `'user'` scope, or `session.orgId` for `'org'` scope)
|
|
14
|
-
* composed with the client-supplied `resourceId` as a sub-partition —
|
|
15
|
-
* `principal:resourceId`. Because the principal is always the prefix, a client
|
|
16
|
-
* `resourceId` can sub-divide within the caller's own boundary but can never
|
|
17
|
-
* widen access to another user's or org's threads.
|
|
18
|
-
*
|
|
19
|
-
* Idempotent: a value that is already within the caller's namespace (top-level
|
|
20
|
-
* re-entry, sub-agent recursion, or resume, which all pass an already-composite
|
|
21
|
-
* `resourceId`) is returned unchanged rather than double-composed.
|
|
22
|
-
*
|
|
23
|
-
* `'org'` scope with no session org throws {@link ForbiddenError} — falling back
|
|
24
|
-
* to a bare/shared key would leak across organizations. Sessionless `'user'`
|
|
25
|
-
* wirings have no trusted principal and fall back to the requested `resourceId`
|
|
26
|
-
* as a best-effort partition key.
|
|
27
|
-
*/
|
|
13
|
+
export declare function resolveSessionPrincipal(params: RunAIAgentParams, sessionScope: SessionScope | undefined): string | undefined;
|
|
28
14
|
export declare function resolveOwnerResourceId(params: RunAIAgentParams, sessionScope: SessionScope | undefined, requestedResourceId: string): string;
|
|
29
|
-
|
|
15
|
+
export declare function assertResourcePrincipalOwner(params: RunAIAgentParams, sessionScope: SessionScope | undefined, storedResourceId: string, kind: 'thread' | 'run'): void;
|
|
30
16
|
export declare function agentSessionScope(agentName: string): SessionScope;
|
|
31
|
-
/**
|
|
32
|
-
* Enforce that a stored thread/run belongs to the caller's owner resource,
|
|
33
|
-
* throwing {@link ForbiddenError} (without echoing the id, to avoid an
|
|
34
|
-
* existence oracle) on a mismatch.
|
|
35
|
-
*/
|
|
36
17
|
export declare function assertResourceOwner(ownerResourceId: string, storedResourceId: string, kind: 'thread' | 'run'): void;
|
|
37
|
-
/** A session's trusted principals, in the order they may be read as. */
|
|
38
18
|
export declare function sessionPrincipals(session: {
|
|
39
19
|
userId?: string;
|
|
40
20
|
orgId?: string;
|
|
41
21
|
} | undefined): string[];
|
|
42
|
-
/**
|
|
43
|
-
* Whether `storedResourceId` belongs to `principal` under the composition
|
|
44
|
-
* {@link resolveOwnerResourceId} performs — either the bare principal or one of
|
|
45
|
-
* its `principal:` sub-partitions. The `:` is required so that `alice` does not
|
|
46
|
-
* match a `alice-evil:…` lookalike.
|
|
47
|
-
*/
|
|
48
22
|
export declare function isOwnedByPrincipal(storedResourceId: string, principal: string): boolean;
|
|
49
|
-
/**
|
|
50
|
-
* The `owners` constraint to pass to `AgentRunService.listThreads` for a caller.
|
|
51
|
-
*
|
|
52
|
-
* Returns `undefined` — not `[]` — for a session with no principal, because an
|
|
53
|
-
* empty list means "match nothing" whereas a sessionless deployment (agent
|
|
54
|
-
* `no-auth`) has no ownership model to constrain by. Keeping that carve-out here
|
|
55
|
-
* rather than at each call site stops it from being re-derived inconsistently.
|
|
56
|
-
*/
|
|
57
23
|
export declare function threadOwnerConstraint(session: {
|
|
58
24
|
userId?: string;
|
|
59
25
|
orgId?: string;
|
|
60
|
-
} | undefined): string[]
|
|
61
|
-
/**
|
|
62
|
-
* Whether a stored thread/run may be read by the caller. Shaped as a predicate
|
|
63
|
-
* so it can back a `pikkuPermission` — authorization belongs in a function's
|
|
64
|
-
* `permissions` field, never in its body.
|
|
65
|
-
*
|
|
66
|
-
* Unlike {@link assertResourceOwner}, which compares against a single composed
|
|
67
|
-
* owner key on the run path, this guards the thread-management reads where the
|
|
68
|
-
* caller supplies only a `threadId` — so ownership has to be derived from the
|
|
69
|
-
* session rather than from the request.
|
|
70
|
-
*
|
|
71
|
-
* A session with no principal means the deployment opted out of authorization
|
|
72
|
-
* (agent `no-auth`), so there is no ownership model to enforce and access is not
|
|
73
|
-
* gated — mirroring {@link resolveOwnerResourceId}'s sessionless fallback to a
|
|
74
|
-
* bare resourceId.
|
|
75
|
-
*/
|
|
26
|
+
} | undefined): string[];
|
|
76
27
|
export declare function canAccessThread(storedResourceId: string, session: {
|
|
77
28
|
userId?: string;
|
|
78
29
|
orgId?: string;
|
|
79
30
|
} | undefined): boolean;
|
|
80
31
|
export type StreamAIAgentOptions = {
|
|
81
32
|
requiresToolApproval?: 'all' | 'explicit' | false;
|
|
82
|
-
/**
|
|
83
|
-
* Invoked as soon as the run's AIRunStateService id exists, so transport
|
|
84
|
-
* wrappers (e.g. the AG-UI bridge) can stamp the real runId on RUN_STARTED.
|
|
85
|
-
*/
|
|
86
33
|
onRunCreated?: (runId: string) => void;
|
|
87
34
|
};
|
|
35
|
+
export declare const APPROVAL_REQUIRED: unique symbol;
|
|
88
36
|
/**
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
* so `checkForApprovals` trusts the brand rather than the `__approvalRequired`
|
|
93
|
-
* string key to decide an approval must be surfaced.
|
|
37
|
+
* In-process brand proving a credential request was produced by pikku itself and
|
|
38
|
+
* not by tool output an attacker can influence. Never serialized — a value that
|
|
39
|
+
* has crossed a JSON boundary has lost the brand and is treated as untrusted.
|
|
94
40
|
*/
|
|
95
|
-
export declare const
|
|
41
|
+
export declare const CREDENTIAL_REQUIRED: unique symbol;
|
|
96
42
|
export declare class ToolApprovalRequired extends PikkuError {
|
|
97
43
|
readonly toolCallId: string;
|
|
98
44
|
readonly toolName: string;
|
|
@@ -119,10 +65,6 @@ export interface AddonCredentialRequirement {
|
|
|
119
65
|
type: 'wire';
|
|
120
66
|
oauth2: boolean;
|
|
121
67
|
}
|
|
122
|
-
/**
|
|
123
|
-
* Given a list of tool names (e.g. ["oauth-api:getProfile"]),
|
|
124
|
-
* returns the wire OAuth credentials required by their addons.
|
|
125
|
-
*/
|
|
126
68
|
export declare function getAddonCredentialRequirements(toolNames: string[]): AddonCredentialRequirement[];
|
|
127
69
|
export type StreamContext = {
|
|
128
70
|
channel: AIStreamChannel;
|
|
@@ -136,26 +78,6 @@ export declare const resolveAgent: (agentName: string) => {
|
|
|
136
78
|
packageName: string | null;
|
|
137
79
|
resolvedName: string;
|
|
138
80
|
};
|
|
139
|
-
/**
|
|
140
|
-
* Enforces an agent's own authorization before it runs: session presence
|
|
141
|
-
* (`auth`), then `scopes`, then `permissions`.
|
|
142
|
-
*
|
|
143
|
-
* The ordering mirrors the function runner — scopes are an AND gate checked
|
|
144
|
-
* first, so they can only ever narrow access, and a missing scope short-circuits
|
|
145
|
-
* before any permission function does I/O.
|
|
146
|
-
*
|
|
147
|
-
* `auth` follows `pikkuSessionlessFunc` rather than `pikkuFunc`: a session is
|
|
148
|
-
* required only when `auth: true` is set explicitly. An agent is normally
|
|
149
|
-
* reached from a function that has already enforced its own auth, and agents are
|
|
150
|
-
* also run from genuinely sessionless contexts (crons, queue workers), so
|
|
151
|
-
* requiring a session by default would reject those without adding a meaningful
|
|
152
|
-
* gate. `scopes` and `permissions` are always enforced when declared.
|
|
153
|
-
*
|
|
154
|
-
* Globals are evaluated here too (via {@link runPermissions}) rather than being
|
|
155
|
-
* assumed to have already run: an agent is reachable from entry points that do
|
|
156
|
-
* not go through the function runner, and re-evaluating an AND gate of
|
|
157
|
-
* side-effect-free predicates is idempotent.
|
|
158
|
-
*/
|
|
159
81
|
export declare function assertAgentAuthorized(agent: CoreAIAgent, params: RunAIAgentParams, packageName: string | null): Promise<void>;
|
|
160
82
|
export declare function buildInstructions(agentName: string, packageName: string | null): Promise<string>;
|
|
161
83
|
export type ScopedChannel = AIStreamChannel & {
|
|
@@ -168,17 +90,6 @@ export type ScopedChannel = AIStreamChannel & {
|
|
|
168
90
|
}>;
|
|
169
91
|
};
|
|
170
92
|
export declare function createScopedChannel(parent: AIStreamChannel, agentName: string, session: string): ScopedChannel;
|
|
171
|
-
/**
|
|
172
|
-
* Build the run input for a delegated sub-agent.
|
|
173
|
-
*
|
|
174
|
-
* `context` is the PARENT run's identifier block (the "Current context" text
|
|
175
|
-
* with organizationId, project/stage ids). A sub-agent's tool-call schema only
|
|
176
|
-
* carries { message, session }, so unless the sub-agent inherits the parent's
|
|
177
|
-
* context it never sees the authoritative ids — it depends on the model
|
|
178
|
-
* re-typing them into `message`, which weak models botch, causing
|
|
179
|
-
* schema/permission rejections and retry loops. Forwarding it here is the
|
|
180
|
-
* regression this seam guards.
|
|
181
|
-
*/
|
|
182
93
|
export declare function buildSubAgentRunInput(message: string, threadId: string, resourceId: string, parentContext?: string): {
|
|
183
94
|
message: string;
|
|
184
95
|
threadId: string;
|