@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
package/dist/utils/hmac.d.ts
CHANGED
|
@@ -1,16 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* HMAC-SHA256 a payload, hex-encoded.
|
|
3
|
-
*
|
|
4
|
-
* Senders wrap this in their own scheme prefix (`sha256=`, `v0=`, …).
|
|
5
|
-
*
|
|
6
|
-
* @param secret - The signing key shared with the other side
|
|
7
|
-
* @param payload - The exact bytes that were signed
|
|
2
|
+
* HMAC-SHA256 of a payload, hex-encoded. Senders wrap this in their own scheme
|
|
3
|
+
* prefix (`sha256=`, `v0=`, …).
|
|
8
4
|
*/
|
|
9
5
|
export declare function hmacSha256Hex(secret: string, payload: string): string;
|
|
10
6
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* Returns false rather than throwing on a length mismatch, which is what
|
|
14
|
-
* `timingSafeEqual` does when the buffers differ in size.
|
|
7
|
+
* Constant-time signature comparison. Returns false on a length mismatch,
|
|
8
|
+
* where `timingSafeEqual` itself throws.
|
|
15
9
|
*/
|
|
16
10
|
export declare function timingSafeStringEqual(a: string, b: string): boolean;
|
package/dist/utils/hmac.js
CHANGED
|
@@ -1,20 +1,14 @@
|
|
|
1
1
|
import { createHmac, timingSafeEqual } from 'node:crypto';
|
|
2
2
|
/**
|
|
3
|
-
* HMAC-SHA256 a payload, hex-encoded.
|
|
4
|
-
*
|
|
5
|
-
* Senders wrap this in their own scheme prefix (`sha256=`, `v0=`, …).
|
|
6
|
-
*
|
|
7
|
-
* @param secret - The signing key shared with the other side
|
|
8
|
-
* @param payload - The exact bytes that were signed
|
|
3
|
+
* HMAC-SHA256 of a payload, hex-encoded. Senders wrap this in their own scheme
|
|
4
|
+
* prefix (`sha256=`, `v0=`, …).
|
|
9
5
|
*/
|
|
10
6
|
export function hmacSha256Hex(secret, payload) {
|
|
11
7
|
return createHmac('sha256', secret).update(payload).digest('hex');
|
|
12
8
|
}
|
|
13
9
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* Returns false rather than throwing on a length mismatch, which is what
|
|
17
|
-
* `timingSafeEqual` does when the buffers differ in size.
|
|
10
|
+
* Constant-time signature comparison. Returns false on a length mismatch,
|
|
11
|
+
* where `timingSafeEqual` itself throws.
|
|
18
12
|
*/
|
|
19
13
|
export function timingSafeStringEqual(a, b) {
|
|
20
14
|
try {
|
|
@@ -1,23 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* so we cannot resolve hostnames to check for private targets. We reject the
|
|
6
|
-
* obvious internal literals and, crucially, re-validate every redirect hop —
|
|
7
|
-
* a public URL that 302s to `169.254.169.254` is the common bypass. This does
|
|
8
|
-
* NOT defend against a public hostname that itself resolves to a private IP
|
|
9
|
-
* (DNS rebinding), which is out of reach without DNS resolution.
|
|
10
|
-
*/
|
|
11
|
-
/**
|
|
12
|
-
* Whether a hostname is an obvious internal/private target (loopback, private
|
|
13
|
-
* IPv4 ranges, link-local incl. the cloud metadata endpoint, or private IPv6).
|
|
14
|
-
*
|
|
15
|
-
* Alias/encoded forms that resolve to the same targets are also rejected: a
|
|
16
|
-
* trailing-dot FQDN (`localhost.`), the `*.localhost` reserved name, IPv4-mapped
|
|
17
|
-
* IPv6 (`::ffff:127.0.0.1`), and octal/decimal/hex-encoded IPv4. This is
|
|
18
|
-
* best-effort literal matching only — it cannot catch a public hostname that
|
|
19
|
-
* *resolves* to a private IP (DNS rebinding), which needs DNS resolution
|
|
20
|
-
* unavailable in edge runtimes.
|
|
2
|
+
* Whether a hostname is an obvious internal target. Best-effort literal
|
|
3
|
+
* matching only: it cannot catch a public hostname that *resolves* to a
|
|
4
|
+
* private IP.
|
|
21
5
|
*/
|
|
22
6
|
export declare function isPrivateHost(hostname: string): boolean;
|
|
23
7
|
export interface SafeFetchOptions {
|
|
@@ -29,23 +13,11 @@ export interface SafeFetchOptions {
|
|
|
29
13
|
/** Maximum redirect hops to follow (each re-validated). Defaults to 3. */
|
|
30
14
|
maxRedirects?: number;
|
|
31
15
|
}
|
|
32
|
-
/**
|
|
33
|
-
* Parse and validate a URL for outbound fetching: only http(s), and — unless an
|
|
34
|
-
* `allowedHosts` allowlist is supplied — not an obvious private/internal host.
|
|
35
|
-
* Returns the parsed URL or throws.
|
|
36
|
-
*/
|
|
37
16
|
export declare function assertFetchableUrl(url: string, options?: SafeFetchOptions): URL;
|
|
38
17
|
/**
|
|
39
|
-
* `fetch` with SSRF protection
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* followed, and the method/body are transformed per {@link redirectInit}. Each
|
|
44
|
-
* intermediate redirect response body is cancelled before the next hop so it is
|
|
45
|
-
* not left dangling. When a redirect cannot or should not be followed (no
|
|
46
|
-
* `Location`, or the hop budget is exhausted) the raw redirect response is
|
|
47
|
-
* returned for the caller to handle by status. Credential headers
|
|
48
|
-
* (`Authorization`, `Cookie`) are stripped whenever a redirect crosses origin,
|
|
49
|
-
* so they never leak to a redirected host.
|
|
18
|
+
* `fetch` with SSRF protection on the initial URL and every redirect hop.
|
|
19
|
+
* When a redirect cannot be followed (no `Location`, or the hop budget is
|
|
20
|
+
* spent) the raw redirect response is returned for the caller to handle by
|
|
21
|
+
* status.
|
|
50
22
|
*/
|
|
51
23
|
export declare function safeFetch(url: string, init?: RequestInit, options?: SafeFetchOptions): Promise<Response>;
|
package/dist/utils/safe-fetch.js
CHANGED
|
@@ -1,19 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* so we cannot resolve hostnames to check for private targets. We reject the
|
|
6
|
-
* obvious internal literals and, crucially, re-validate every redirect hop —
|
|
7
|
-
* a public URL that 302s to `169.254.169.254` is the common bypass. This does
|
|
8
|
-
* NOT defend against a public hostname that itself resolves to a private IP
|
|
9
|
-
* (DNS rebinding), which is out of reach without DNS resolution.
|
|
10
|
-
*/
|
|
11
|
-
/**
|
|
12
|
-
* Parse the many textual encodings of an IPv4 address that `fetch`/`undici`
|
|
13
|
-
* (and `inet_aton`-style parsers) accept — a dotted quad whose octets may be
|
|
14
|
-
* decimal, octal (`0177`) or hex (`0x7f`), or the whole address as a single
|
|
15
|
-
* 32-bit integer (decimal `2130706433`, hex `0x7f000001`). Returns the four
|
|
16
|
-
* octets, or `null` when the host is not a numeric IPv4 literal.
|
|
2
|
+
* Parses the textual IPv4 encodings `fetch`/`undici` accept — a dotted quad
|
|
3
|
+
* whose octets may be decimal, octal (`0177`) or hex (`0x7f`), or the whole
|
|
4
|
+
* address as a single 32-bit integer. `null` when not an IPv4 literal.
|
|
17
5
|
*/
|
|
18
6
|
function parseIPv4Octets(host) {
|
|
19
7
|
const toInt = (part) => {
|
|
@@ -47,15 +35,9 @@ function parseIPv4Octets(host) {
|
|
|
47
35
|
return octets;
|
|
48
36
|
}
|
|
49
37
|
/**
|
|
50
|
-
* Whether a hostname is an obvious internal
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
* Alias/encoded forms that resolve to the same targets are also rejected: a
|
|
54
|
-
* trailing-dot FQDN (`localhost.`), the `*.localhost` reserved name, IPv4-mapped
|
|
55
|
-
* IPv6 (`::ffff:127.0.0.1`), and octal/decimal/hex-encoded IPv4. This is
|
|
56
|
-
* best-effort literal matching only — it cannot catch a public hostname that
|
|
57
|
-
* *resolves* to a private IP (DNS rebinding), which needs DNS resolution
|
|
58
|
-
* unavailable in edge runtimes.
|
|
38
|
+
* Whether a hostname is an obvious internal target. Best-effort literal
|
|
39
|
+
* matching only: it cannot catch a public hostname that *resolves* to a
|
|
40
|
+
* private IP.
|
|
59
41
|
*/
|
|
60
42
|
export function isPrivateHost(hostname) {
|
|
61
43
|
const host = hostname
|
|
@@ -96,11 +78,6 @@ export function isPrivateHost(hostname) {
|
|
|
96
78
|
}
|
|
97
79
|
return false;
|
|
98
80
|
}
|
|
99
|
-
/**
|
|
100
|
-
* Parse and validate a URL for outbound fetching: only http(s), and — unless an
|
|
101
|
-
* `allowedHosts` allowlist is supplied — not an obvious private/internal host.
|
|
102
|
-
* Returns the parsed URL or throws.
|
|
103
|
-
*/
|
|
104
81
|
export function assertFetchableUrl(url, options = {}) {
|
|
105
82
|
const parsed = new URL(url);
|
|
106
83
|
if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {
|
|
@@ -116,16 +93,8 @@ export function assertFetchableUrl(url, options = {}) {
|
|
|
116
93
|
}
|
|
117
94
|
return parsed;
|
|
118
95
|
}
|
|
119
|
-
/**
|
|
120
|
-
* The only 3xx statuses that request a redirect be followed. `300` (Multiple
|
|
121
|
-
* Choices), `304` (Not Modified), `305` (Use Proxy) and `306` are returned to
|
|
122
|
-
* the caller as-is rather than followed.
|
|
123
|
-
*/
|
|
96
|
+
/** The only 3xx statuses followed; every other 3xx is returned to the caller. */
|
|
124
97
|
const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);
|
|
125
|
-
/**
|
|
126
|
-
* Drop credential-bearing headers (`Authorization`, `Cookie`) so they are not
|
|
127
|
-
* replayed to a different origin across a redirect.
|
|
128
|
-
*/
|
|
129
98
|
function stripCredentialHeaders(init) {
|
|
130
99
|
if (!init.headers)
|
|
131
100
|
return init;
|
|
@@ -135,10 +104,8 @@ function stripCredentialHeaders(init) {
|
|
|
135
104
|
return { ...init, headers };
|
|
136
105
|
}
|
|
137
106
|
/**
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
* original method and body. When the method changes to `GET` the request body
|
|
141
|
-
* and its `Content-*` headers are dropped.
|
|
107
|
+
* The WHATWG method/body transform for a redirect: `303` (and `301`/`302` on
|
|
108
|
+
* a `POST`) becomes a bodyless `GET`; `307`/`308` preserve method and body.
|
|
142
109
|
*/
|
|
143
110
|
function redirectInit(status, init) {
|
|
144
111
|
const method = (init.method ?? 'GET').toUpperCase();
|
|
@@ -152,17 +119,10 @@ function redirectInit(status, init) {
|
|
|
152
119
|
return { ...init, method: 'GET', body: undefined, headers };
|
|
153
120
|
}
|
|
154
121
|
/**
|
|
155
|
-
* `fetch` with SSRF protection
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
* followed, and the method/body are transformed per {@link redirectInit}. Each
|
|
160
|
-
* intermediate redirect response body is cancelled before the next hop so it is
|
|
161
|
-
* not left dangling. When a redirect cannot or should not be followed (no
|
|
162
|
-
* `Location`, or the hop budget is exhausted) the raw redirect response is
|
|
163
|
-
* returned for the caller to handle by status. Credential headers
|
|
164
|
-
* (`Authorization`, `Cookie`) are stripped whenever a redirect crosses origin,
|
|
165
|
-
* so they never leak to a redirected host.
|
|
122
|
+
* `fetch` with SSRF protection on the initial URL and every redirect hop.
|
|
123
|
+
* When a redirect cannot be followed (no `Location`, or the hop budget is
|
|
124
|
+
* spent) the raw redirect response is returned for the caller to handle by
|
|
125
|
+
* status.
|
|
166
126
|
*/
|
|
167
127
|
export async function safeFetch(url, init = {}, options = {}) {
|
|
168
128
|
const maxRedirects = options.maxRedirects ?? 3;
|
package/dist/utils.d.ts
CHANGED
|
@@ -5,12 +5,7 @@ export declare const createWeakUID: () => string;
|
|
|
5
5
|
export declare const isSerializable: (data: any) => boolean;
|
|
6
6
|
export declare const getTagGroups: <T>(tagGroups: Record<string, T>, tag: string) => T[];
|
|
7
7
|
export declare const freezeDedupe: <T>(arr?: readonly T[] | T[] | undefined) => readonly T[];
|
|
8
|
-
/**
|
|
9
|
-
* Stop all singleton services, including addon package services.
|
|
10
|
-
* Addon package services are stopped first, then the parent services.
|
|
11
|
-
*
|
|
12
|
-
* @param singletonServices - The parent singleton services to stop
|
|
13
|
-
*/
|
|
8
|
+
/** Stops addon package services first, then the parent singleton services. */
|
|
14
9
|
export declare const stopSingletonServices: () => Promise<void>;
|
|
15
10
|
/** Wrap server lifecycle hooks so the inspector can discover them. */
|
|
16
11
|
export declare const pikkuServerLifecycle: <SS extends CoreSingletonServices = CoreSingletonServices>(lifecycle: ServerLifecycle<SS>) => ServerLifecycle<SS>;
|
package/dist/utils.js
CHANGED
|
@@ -11,9 +11,12 @@ export const closeWireServices = async (logger, wireServices) => {
|
|
|
11
11
|
}
|
|
12
12
|
}));
|
|
13
13
|
};
|
|
14
|
-
|
|
14
|
+
let _uidPrefix;
|
|
15
15
|
let _uidCounter = 0;
|
|
16
|
-
export const createWeakUID = () =>
|
|
16
|
+
export const createWeakUID = () => {
|
|
17
|
+
_uidPrefix ??= globalThis.crypto.randomUUID().slice(0, 8);
|
|
18
|
+
return `${_uidPrefix}-${++_uidCounter}`;
|
|
19
|
+
};
|
|
17
20
|
export const isSerializable = (data) => {
|
|
18
21
|
return !(typeof data === 'string' ||
|
|
19
22
|
data instanceof ArrayBuffer ||
|
|
@@ -58,9 +61,6 @@ export const freezeDedupe = (arr) => {
|
|
|
58
61
|
}
|
|
59
62
|
return Object.freeze(out);
|
|
60
63
|
};
|
|
61
|
-
/**
|
|
62
|
-
* Stop a single service by calling its stop method if it exists
|
|
63
|
-
*/
|
|
64
64
|
const stopService = async (logger, name, service) => {
|
|
65
65
|
const stop = service?.stop;
|
|
66
66
|
if (stop) {
|
|
@@ -73,20 +73,13 @@ const stopService = async (logger, name, service) => {
|
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
};
|
|
76
|
-
/**
|
|
77
|
-
* Stop all singleton services, including addon package services.
|
|
78
|
-
* Addon package services are stopped first, then the parent services.
|
|
79
|
-
*
|
|
80
|
-
* @param singletonServices - The parent singleton services to stop
|
|
81
|
-
*/
|
|
76
|
+
/** Stops addon package services first, then the parent singleton services. */
|
|
82
77
|
export const stopSingletonServices = async () => {
|
|
83
78
|
const singletonServices = getSingletonServices();
|
|
84
79
|
const logger = singletonServices.logger;
|
|
85
|
-
// Stop all addon package singleton services
|
|
86
80
|
const stateMap = getAllPackageStates();
|
|
87
81
|
if (stateMap.size > 0) {
|
|
88
82
|
for (const [packageName, packageState] of stateMap) {
|
|
89
|
-
// Skip main package - we handle it separately
|
|
90
83
|
if (packageName === '__main__')
|
|
91
84
|
continue;
|
|
92
85
|
const packageServices = packageState.package?.singletonServices;
|
|
@@ -95,12 +88,10 @@ export const stopSingletonServices = async () => {
|
|
|
95
88
|
for (const [name, service] of Object.entries(packageServices)) {
|
|
96
89
|
await stopService(logger, `${packageName}/${name}`, service);
|
|
97
90
|
}
|
|
98
|
-
// Clear the cached services
|
|
99
91
|
packageState.package.singletonServices = null;
|
|
100
92
|
}
|
|
101
93
|
}
|
|
102
94
|
}
|
|
103
|
-
// Then stop the parent singleton services
|
|
104
95
|
for (const [name, service] of Object.entries(singletonServices)) {
|
|
105
96
|
await stopService(logger, name, service);
|
|
106
97
|
}
|
|
@@ -1,66 +1,33 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* How an actor agent answers the target agent's tool-approval requests during
|
|
3
|
-
* a conversation.
|
|
4
|
-
* - `'in-persona'` — the actor agent decides as the persona would (default).
|
|
5
|
-
* - `'always'` — approve every request (stress the happy path).
|
|
6
|
-
* - `'never'` — deny every request (exercise refusal handling).
|
|
7
|
-
*/
|
|
8
1
|
export type ActorFlowApprovalPolicy = 'in-persona' | 'always' | 'never';
|
|
9
|
-
/**
|
|
10
|
-
* Options for `actor.converse(...)` — a dynamic conversation an actor holds
|
|
11
|
-
* with a target Pikku AI agent, in the actor's own persona. `TAgentName` is
|
|
12
|
-
* bound to the generated union of agent names in a typed project.
|
|
13
|
-
*/
|
|
14
2
|
export interface ConverseOptions<TAgentName extends string = string> {
|
|
15
|
-
/** Target Pikku AI agent name to converse with. */
|
|
16
3
|
agent: TAgentName;
|
|
17
4
|
/** What the actor is trying to get the agent to accomplish. */
|
|
18
5
|
task: string;
|
|
19
|
-
/** Natural-language success criterion the actor
|
|
6
|
+
/** Natural-language success criterion the actor judges the conversation against. */
|
|
20
7
|
evaluate: string;
|
|
21
|
-
/** How the actor answers the agent's tool-approval requests. Default `'in-persona'`. */
|
|
22
8
|
approvals?: ActorFlowApprovalPolicy;
|
|
23
|
-
/** Model the actor uses for its own turns/decisions. Falls back to the actor service default. */
|
|
24
9
|
model?: string;
|
|
25
|
-
/** Hard cap on conversation turns before forcing evaluation. Default 12. */
|
|
26
10
|
maxTurns?: number;
|
|
27
11
|
}
|
|
28
|
-
/**
|
|
29
|
-
* The verdict a conversation produces: the persona's LLM self-evaluation of
|
|
30
|
-
* whether the task was met. Deterministic checks are the caller's job — they
|
|
31
|
-
* already hold the actor and can `actor.invoke(...)` afterwards.
|
|
32
|
-
*/
|
|
33
12
|
export interface ActorFlowVerdict {
|
|
34
|
-
/** Whether the actor judged the task accomplished. */
|
|
35
13
|
passed: boolean;
|
|
36
|
-
/** The actor's reasoning for its verdict. */
|
|
37
14
|
reasoning: string;
|
|
38
|
-
/** The conversation transcript, for debugging/reporting. */
|
|
39
15
|
transcript: string[];
|
|
40
16
|
}
|
|
41
|
-
/** A pending tool-approval request surfaced by the target agent. */
|
|
42
17
|
export interface TargetPendingApproval {
|
|
43
18
|
toolCallId: string;
|
|
44
19
|
toolName: string;
|
|
45
20
|
args: unknown;
|
|
46
21
|
reason?: string;
|
|
47
22
|
}
|
|
48
|
-
/** A normalized reply from the target agent, independent of transport. */
|
|
49
23
|
export interface TargetAgentReply {
|
|
50
24
|
text: string;
|
|
51
25
|
runId: string;
|
|
52
26
|
status?: 'completed' | 'suspended';
|
|
53
27
|
pendingApprovals?: TargetPendingApproval[];
|
|
54
28
|
}
|
|
55
|
-
/**
|
|
56
|
-
* Drives the target agent. In production this is HTTP-backed (the actor's
|
|
57
|
-
* `agentRun` / `agentApprove` calls as the signed-in actor); the conversation
|
|
58
|
-
* engine only sees this transport-agnostic contract.
|
|
59
|
-
*/
|
|
60
29
|
export interface TargetAgentDriver {
|
|
61
|
-
/** Send a message, starting or continuing the target agent's run. */
|
|
62
30
|
run(message: string): Promise<TargetAgentReply>;
|
|
63
|
-
/** Answer the target agent's pending approvals and continue its run. */
|
|
64
31
|
approve(runId: string, decisions: {
|
|
65
32
|
toolCallId: string;
|
|
66
33
|
approved: boolean;
|
|
@@ -1,11 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Actor flow module exports.
|
|
3
|
-
*
|
|
4
|
-
* An actor holds a dynamic conversation with a target Pikku AI agent via
|
|
5
|
-
* `actor.converse(...)` — playing its own persona, approving the agent's tool
|
|
6
|
-
* requests in-persona, and evaluating whether the task was accomplished. The
|
|
7
|
-
* conversation engine here is transport-agnostic; the actor drives the target
|
|
8
|
-
* over HTTP.
|
|
9
|
-
*/
|
|
10
1
|
export type { ActorFlowApprovalPolicy, ActorFlowVerdict, ConverseOptions, TargetAgentReply, TargetPendingApproval, TargetAgentDriver, } from './actor-flow.types.js';
|
|
11
2
|
export { runConversation, type RunConversationParams, type ActorLLM, } from './run-conversation.js';
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import type { ActorFlowApprovalPolicy, ActorFlowVerdict, TargetAgentDriver } from './actor-flow.types.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { ResolvedPersona } from '../../services/personas-service.js';
|
|
3
3
|
import type { AIAgentRunnerParams, AIAgentStepResult } from '../../services/ai-agent-runner-service.js';
|
|
4
4
|
/** The LLM call the actor uses for its own turns/decisions/evaluation. */
|
|
5
5
|
export type ActorLLM = (params: AIAgentRunnerParams) => Promise<AIAgentStepResult>;
|
|
6
6
|
export interface RunConversationParams {
|
|
7
|
-
/** The
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
|
|
7
|
+
/** The person being played — name, job title, personality. */
|
|
8
|
+
persona: ResolvedPersona;
|
|
9
|
+
/** The id they were declared under (for transcript labelling). */
|
|
10
|
+
personaId: string;
|
|
11
11
|
/** What the actor is trying to get the target agent to accomplish. */
|
|
12
12
|
task: string;
|
|
13
13
|
/** Natural-language success criterion the actor evaluates at the end. */
|
|
@@ -60,16 +60,23 @@ function readObject(result) {
|
|
|
60
60
|
}
|
|
61
61
|
return null;
|
|
62
62
|
}
|
|
63
|
-
function actorInstructions(
|
|
63
|
+
function actorInstructions(persona, task) {
|
|
64
64
|
return [
|
|
65
65
|
`You are role-playing a real user interacting with an AI assistant. Stay in character at all times — you are the user, not the assistant.`,
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
? `Your personality and communication style: ${
|
|
66
|
+
`Your name is ${persona.name}.`,
|
|
67
|
+
persona.jobTitle ? `Your role: ${persona.jobTitle}.` : '',
|
|
68
|
+
persona.personality
|
|
69
|
+
? `Your personality and communication style: ${persona.personality}. Match this tone, vocabulary, and level of detail exactly.`
|
|
70
70
|
: '',
|
|
71
71
|
`Your goal in this conversation: ${task}.`,
|
|
72
72
|
`Send one message at a time. Set "done" to true only once your goal is clearly accomplished, or clearly impossible.`,
|
|
73
|
+
// Every call the actor makes wants a schema'd object back, and a gateway
|
|
74
|
+
// that cannot take a JSON *schema* degrades to OpenAI's `json_object`
|
|
75
|
+
// mode — which refuses the request outright unless the word "json" appears
|
|
76
|
+
// somewhere in the prompt. Saying it once here covers all three call sites
|
|
77
|
+
// (turn, approvals, verdict), since each builds on these instructions, and
|
|
78
|
+
// it costs nothing on providers that never needed telling.
|
|
79
|
+
`Reply with json matching the schema you are given, and nothing else.`,
|
|
73
80
|
]
|
|
74
81
|
.filter(Boolean)
|
|
75
82
|
.join('\n');
|
|
@@ -129,7 +136,7 @@ async function converseWithTarget(params, instructions, message) {
|
|
|
129
136
|
*/
|
|
130
137
|
export async function runConversation(params) {
|
|
131
138
|
const maxTurns = params.maxTurns ?? DEFAULT_MAX_TURNS;
|
|
132
|
-
const instructions = actorInstructions(params.
|
|
139
|
+
const instructions = actorInstructions(params.persona, params.task);
|
|
133
140
|
// Seed a kickoff so the very first actor turn has a non-empty message list
|
|
134
141
|
// (providers reject an empty prompt). It's an instruction TO the actor, so
|
|
135
142
|
// it never appears in the transcript.
|
|
@@ -153,7 +160,7 @@ export async function runConversation(params) {
|
|
|
153
160
|
break;
|
|
154
161
|
}
|
|
155
162
|
actorMessages.push(msg('assistant', actorMessage));
|
|
156
|
-
transcript.push(`${params.
|
|
163
|
+
transcript.push(`${params.persona.name}: ${actorMessage}`);
|
|
157
164
|
const reply = await converseWithTarget(params, instructions, actorMessage);
|
|
158
165
|
actorMessages.push(msg('user', reply.text ?? ''));
|
|
159
166
|
transcript.push(`${params.agentName}: ${reply.text ?? ''}`);
|
|
@@ -74,11 +74,6 @@ export type { AGUIEvent };
|
|
|
74
74
|
export type AGUIChannelOptions = {
|
|
75
75
|
threadId?: string;
|
|
76
76
|
runId?: string;
|
|
77
|
-
/**
|
|
78
|
-
* Late-bound runId source, resolved when the run is opened (first event).
|
|
79
|
-
* Lets the stream path report the AIRunStateService runId on RUN_STARTED
|
|
80
|
-
* even though that id is only created after the channel is wrapped.
|
|
81
|
-
*/
|
|
82
77
|
getRunId?: () => string | undefined;
|
|
83
78
|
};
|
|
84
79
|
export declare function wrapChannelWithAGUI(inner: AIStreamChannel, options?: AGUIChannelOptions): AIStreamChannel;
|
|
@@ -27,8 +27,6 @@ export function wrapChannelWithAGUI(inner, options) {
|
|
|
27
27
|
let sawUsage = false;
|
|
28
28
|
let usageModel;
|
|
29
29
|
const usageTotals = { input: 0, output: 0 };
|
|
30
|
-
// The AG-UI client rejects any event arriving before RUN_STARTED, so the
|
|
31
|
-
// run is opened lazily with the first translated event.
|
|
32
30
|
function send(event) {
|
|
33
31
|
if (!runStartedSent) {
|
|
34
32
|
runStartedSent = true;
|
|
@@ -77,11 +75,6 @@ export function wrapChannelWithAGUI(inner, options) {
|
|
|
77
75
|
}
|
|
78
76
|
return thinkingMessageId;
|
|
79
77
|
}
|
|
80
|
-
// The AG-UI client treats RUN_FINISHED as terminal and rejects everything
|
|
81
|
-
// after it, so it is emitted exactly once — on 'done' — with the usage
|
|
82
|
-
// accumulated across all steps (per-step 'usage' events must NOT finish
|
|
83
|
-
// the run: on multi-step tool runs later steps would arrive after
|
|
84
|
-
// RUN_FINISHED and the client would drop the whole stream).
|
|
85
78
|
function finishRun() {
|
|
86
79
|
endTextMessage();
|
|
87
80
|
endThinkingMessage();
|
|
@@ -112,6 +105,9 @@ export function wrapChannelWithAGUI(inner, options) {
|
|
|
112
105
|
setState: (s) => inner.setState(s),
|
|
113
106
|
getState: () => inner.getState(),
|
|
114
107
|
clearState: () => inner.clearState(),
|
|
108
|
+
// Delegated: the wrapper is a view over the same connection, so a peer
|
|
109
|
+
// reachable from the channel underneath is reachable from here too.
|
|
110
|
+
remote: (funcName, data) => inner.remote(funcName, data),
|
|
115
111
|
sendBinary: (data) => inner.sendBinary(data),
|
|
116
112
|
close: () => inner.close(),
|
|
117
113
|
send: (event) => {
|
|
@@ -190,9 +186,6 @@ export function wrapChannelWithAGUI(inner, options) {
|
|
|
190
186
|
finishRun();
|
|
191
187
|
break;
|
|
192
188
|
}
|
|
193
|
-
// Step names must be unique among active steps on the client and
|
|
194
|
-
// sub-agents reuse step numbers on the shared channel, so each
|
|
195
|
-
// step-start closes the previous step and gets a sequential name.
|
|
196
189
|
case 'step-start': {
|
|
197
190
|
endTextMessage();
|
|
198
191
|
endThinkingMessage();
|
|
@@ -288,9 +281,38 @@ export function wrapChannelWithAGUI(inner, options) {
|
|
|
288
281
|
});
|
|
289
282
|
break;
|
|
290
283
|
}
|
|
291
|
-
case '
|
|
292
|
-
|
|
284
|
+
case 'interrupted': {
|
|
285
|
+
endTextMessage();
|
|
286
|
+
endThinkingMessage();
|
|
287
|
+
endStep();
|
|
288
|
+
send({
|
|
289
|
+
type: 'CUSTOM',
|
|
290
|
+
name: 'pikku:interrupted',
|
|
291
|
+
value: {
|
|
292
|
+
runId: event.runId,
|
|
293
|
+
text: event.text,
|
|
294
|
+
reason: event.reason,
|
|
295
|
+
},
|
|
296
|
+
});
|
|
293
297
|
break;
|
|
298
|
+
}
|
|
299
|
+
// AG-UI has no event for speech, so it travels as CUSTOM like the other
|
|
300
|
+
// pikku-specific ones. Dropping it instead — which is what this did —
|
|
301
|
+
// means a voice agent reached over HTTP is inaudible: `voiceOutput`
|
|
302
|
+
// synthesizes every sentence, the provider bills for it, and nothing
|
|
303
|
+
// gets past the mapper.
|
|
304
|
+
case 'audio-delta': {
|
|
305
|
+
send({
|
|
306
|
+
type: 'CUSTOM',
|
|
307
|
+
name: 'pikku:audio-delta',
|
|
308
|
+
value: { data: event.data, format: event.format },
|
|
309
|
+
});
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
case 'audio-done': {
|
|
313
|
+
send({ type: 'CUSTOM', name: 'pikku:audio-done', value: {} });
|
|
314
|
+
break;
|
|
315
|
+
}
|
|
294
316
|
}
|
|
295
317
|
},
|
|
296
318
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { AgentInterruptResult } from './ai-agent-interrupt.js';
|
|
1
2
|
export declare function agent<TAgentMap extends Record<string, {
|
|
2
3
|
output: any;
|
|
3
4
|
}>>(agentName: string & keyof TAgentMap): {
|
|
@@ -15,6 +16,12 @@ export declare function agentResume(): {
|
|
|
15
16
|
approved: boolean;
|
|
16
17
|
}, wire: any) => Promise<void>;
|
|
17
18
|
};
|
|
19
|
+
export declare function agentInterrupt(): {
|
|
20
|
+
func: (services: any, data: {
|
|
21
|
+
runId: string;
|
|
22
|
+
reason?: 'speech' | 'user' | 'timeout';
|
|
23
|
+
}, wire: any) => Promise<AgentInterruptResult>;
|
|
24
|
+
};
|
|
18
25
|
export declare function agentApprove<TAgentMap extends Record<string, {
|
|
19
26
|
output: any;
|
|
20
27
|
}>>(_agentName: string & keyof TAgentMap): {
|
|
@@ -31,6 +31,13 @@ export function agentResume() {
|
|
|
31
31
|
},
|
|
32
32
|
};
|
|
33
33
|
}
|
|
34
|
+
export function agentInterrupt() {
|
|
35
|
+
return {
|
|
36
|
+
func: async (_services, data, { rpc }) => {
|
|
37
|
+
return rpc.agent.interrupt(data.runId, data.reason);
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
34
41
|
export function agentApprove(_agentName) {
|
|
35
42
|
return {
|
|
36
43
|
func: async (_services, data, { rpc }) => {
|