@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
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
ScenarioPersona,
|
|
3
|
+
ResolvedPersona,
|
|
4
|
+
ScenarioPersonas,
|
|
5
5
|
ScenarioInvokeOptions,
|
|
6
6
|
ScenarioHttpResponse,
|
|
7
|
-
} from './
|
|
8
|
-
import { readScenarioHttpResponse } from './
|
|
7
|
+
} from './personas-service.js'
|
|
8
|
+
import { readScenarioHttpResponse } from './personas-service.js'
|
|
9
9
|
import type {
|
|
10
10
|
ConverseOptions,
|
|
11
11
|
ActorFlowVerdict,
|
|
@@ -19,42 +19,44 @@ import {
|
|
|
19
19
|
import { getSingletonServices } from '../pikku-state.js'
|
|
20
20
|
import { AIProviderNotConfiguredError } from '../errors/errors.js'
|
|
21
21
|
|
|
22
|
-
export interface
|
|
22
|
+
export interface HttpPersonasConfig {
|
|
23
23
|
/**
|
|
24
24
|
* Base API URL of the target app, INCLUDING the HTTP prefix — e.g.
|
|
25
|
-
* `https://app.example.com/api` or `http://localhost:4000/api`.
|
|
26
|
-
*
|
|
25
|
+
* `https://app.example.com/api` or `http://localhost:4000/api`. Sign-in is
|
|
26
|
+
* reached at `${apiUrl}${signInPath}` and exposed RPCs at
|
|
27
27
|
* `${apiUrl}${rpcPath}/:rpcName`.
|
|
28
28
|
*/
|
|
29
29
|
apiUrl: string
|
|
30
30
|
/**
|
|
31
|
-
* The
|
|
32
|
-
*
|
|
31
|
+
* The impersonation secret. Sign-in only ever works for user rows flagged
|
|
32
|
+
* `actor: true` — knowing the secret never impersonates real users.
|
|
33
33
|
*/
|
|
34
34
|
secret: string
|
|
35
|
-
/**
|
|
36
|
-
|
|
35
|
+
/** Persona id → the declaration with its address filled in. */
|
|
36
|
+
personas: Record<string, ResolvedPersona>
|
|
37
37
|
/** Sign-in path under apiUrl. Default: the actor plugin's `/auth/sign-in/actor`. */
|
|
38
38
|
signInPath?: string
|
|
39
|
+
/** Where the session (and its roles) is read back. Default `/auth/get-session`. */
|
|
40
|
+
sessionPath?: string
|
|
39
41
|
/** Exposed-RPC path prefix under apiUrl. Default `/rpc`. */
|
|
40
42
|
rpcPath?: string
|
|
41
43
|
/**
|
|
42
|
-
* Default model
|
|
43
|
-
* an explicit `model`.
|
|
44
|
-
*
|
|
44
|
+
* Default model a persona thinks with when `converse(...)` is called without
|
|
45
|
+
* an explicit `model`. Its own turns/approvals/evaluation run in-process via
|
|
46
|
+
* the configured `aiAgentRunner`.
|
|
45
47
|
*/
|
|
46
48
|
model?: string
|
|
47
49
|
}
|
|
48
50
|
|
|
49
51
|
/**
|
|
50
|
-
* Default HTTP-backed
|
|
52
|
+
* Default HTTP-backed persona. Signs in lazily on first invoke via the Better
|
|
51
53
|
* Auth actor plugin (`POST /auth/sign-in/actor` with `{ email, secret }` —
|
|
52
54
|
* the plugin upserts the actor-flagged user row and mints a session whose
|
|
53
55
|
* `actor` flag flows into audits/analytics). Holds the session cookies for
|
|
54
56
|
* its lifetime; a 401 mid-run re-logs-in once (long health-check runs can
|
|
55
57
|
* outlive a session).
|
|
56
58
|
*/
|
|
57
|
-
export class
|
|
59
|
+
export class HttpPersona implements ScenarioPersona {
|
|
58
60
|
private jar: ScenarioCookieJar
|
|
59
61
|
/**
|
|
60
62
|
* Whether `login()` has succeeded since the last time the session was
|
|
@@ -66,14 +68,14 @@ export class HttpScenarioActor implements ScenarioActor {
|
|
|
66
68
|
|
|
67
69
|
constructor(
|
|
68
70
|
readonly name: string,
|
|
69
|
-
private
|
|
70
|
-
private config:
|
|
71
|
+
private persona: ResolvedPersona,
|
|
72
|
+
private config: HttpPersonasConfig
|
|
71
73
|
) {
|
|
72
74
|
this.jar = createCookieJar(config.apiUrl)
|
|
73
75
|
}
|
|
74
76
|
|
|
75
77
|
get email(): string {
|
|
76
|
-
return this.
|
|
78
|
+
return this.persona.email
|
|
77
79
|
}
|
|
78
80
|
|
|
79
81
|
async invoke(rpcName: string, data: unknown): Promise<unknown> {
|
|
@@ -112,15 +114,15 @@ export class HttpScenarioActor implements ScenarioActor {
|
|
|
112
114
|
const model = options.model ?? this.config.model
|
|
113
115
|
if (!model) {
|
|
114
116
|
throw new Error(
|
|
115
|
-
`[scenario]
|
|
117
|
+
`[scenario] persona '${this.name}' converse needs a model — pass options.model or set 'model' on the personas service`
|
|
116
118
|
)
|
|
117
119
|
}
|
|
118
120
|
const threadId = globalThis.crypto.randomUUID()
|
|
119
|
-
const resourceId = `
|
|
121
|
+
const resourceId = `persona:${this.name}`
|
|
120
122
|
|
|
121
123
|
return runConversation({
|
|
122
|
-
|
|
123
|
-
|
|
124
|
+
persona: this.persona,
|
|
125
|
+
personaId: this.name,
|
|
124
126
|
agentName: options.agent,
|
|
125
127
|
task: options.task,
|
|
126
128
|
evaluate: options.evaluate,
|
|
@@ -137,7 +139,51 @@ export class HttpScenarioActor implements ScenarioActor {
|
|
|
137
139
|
})
|
|
138
140
|
}
|
|
139
141
|
|
|
140
|
-
/**
|
|
142
|
+
/**
|
|
143
|
+
* The roles the stage says this session holds.
|
|
144
|
+
*
|
|
145
|
+
* Read from better-auth's `get-session`, which is what most pikku apps are
|
|
146
|
+
* running and where its admin plugin puts `role` — on the user, as a
|
|
147
|
+
* comma-separated list. A target that answers something else returns `null`
|
|
148
|
+
* rather than an empty list, because "this stage does not report roles" and
|
|
149
|
+
* "this person has none" call for opposite responses from the caller.
|
|
150
|
+
*/
|
|
151
|
+
async sessionRoles(): Promise<string[] | null> {
|
|
152
|
+
if (!this.signedIn) {
|
|
153
|
+
await this.login()
|
|
154
|
+
}
|
|
155
|
+
const sessionPath = this.config.sessionPath ?? '/auth/get-session'
|
|
156
|
+
const res = await this.jar.fetch(`${this.config.apiUrl}${sessionPath}`)
|
|
157
|
+
if (!res.ok) {
|
|
158
|
+
return null
|
|
159
|
+
}
|
|
160
|
+
const text = await res.text().catch(() => '')
|
|
161
|
+
if (!text) {
|
|
162
|
+
return null
|
|
163
|
+
}
|
|
164
|
+
let payload: unknown
|
|
165
|
+
try {
|
|
166
|
+
payload = JSON.parse(text)
|
|
167
|
+
} catch {
|
|
168
|
+
return null
|
|
169
|
+
}
|
|
170
|
+
const user = (payload as { user?: { role?: unknown } } | null)?.user
|
|
171
|
+
const role = user?.role
|
|
172
|
+
if (typeof role === 'string') {
|
|
173
|
+
return role
|
|
174
|
+
.split(',')
|
|
175
|
+
.map((name) => name.trim())
|
|
176
|
+
.filter(Boolean)
|
|
177
|
+
}
|
|
178
|
+
if (Array.isArray(role)) {
|
|
179
|
+
return role.filter((name): name is string => typeof name === 'string')
|
|
180
|
+
}
|
|
181
|
+
// The session came back and carried a user, but no role field — that is a
|
|
182
|
+
// stage reporting "none", not a stage that cannot report.
|
|
183
|
+
return user ? [] : null
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/** Start/continue the target agent's run over HTTP as this persona. */
|
|
141
187
|
private async agentRun(
|
|
142
188
|
agentName: string,
|
|
143
189
|
message: string,
|
|
@@ -165,13 +211,7 @@ export class HttpScenarioActor implements ScenarioActor {
|
|
|
165
211
|
return normalizeAgentReply(raw)
|
|
166
212
|
}
|
|
167
213
|
|
|
168
|
-
|
|
169
|
-
* POST an agent HTTP route (raw body, not RPC-wrapped). Signs in lazily: the
|
|
170
|
-
* first call goes out with whatever cookie we hold (none, for a no-auth
|
|
171
|
-
* agent), and only a 401 triggers `login()` + one retry. This lets an actor
|
|
172
|
-
* converse with a no-auth agent without any sign-in wiring, while still
|
|
173
|
-
* authenticating against agents that require a session.
|
|
174
|
-
*/
|
|
214
|
+
// knowledge: decisions/internals/scenario-agent-calls-sign-in-on-401-only.md
|
|
175
215
|
private async postAgent(subPath: string, body: unknown): Promise<unknown> {
|
|
176
216
|
const rpcPath = this.config.rpcPath ?? '/rpc'
|
|
177
217
|
const url = `${this.config.apiUrl}${rpcPath}/${subPath}`
|
|
@@ -224,22 +264,22 @@ export class HttpScenarioActor implements ScenarioActor {
|
|
|
224
264
|
method: 'POST',
|
|
225
265
|
headers: { 'content-type': 'application/json' },
|
|
226
266
|
body: JSON.stringify({
|
|
227
|
-
email: this.
|
|
228
|
-
name: this.
|
|
267
|
+
email: this.persona.email,
|
|
268
|
+
name: this.persona.name,
|
|
229
269
|
secret: this.config.secret,
|
|
230
270
|
}),
|
|
231
271
|
})
|
|
232
272
|
if (!res.ok) {
|
|
233
273
|
const body = (await res.text().catch(() => '')).slice(0, 300)
|
|
234
274
|
throw new Error(
|
|
235
|
-
`[scenario]
|
|
275
|
+
`[scenario] persona sign-in failed for '${this.name}' (${res.status}): ${body}`
|
|
236
276
|
)
|
|
237
277
|
}
|
|
238
278
|
// What proves a session was established is this response setting a cookie,
|
|
239
279
|
// not the jar being non-empty — the target may have set one earlier.
|
|
240
280
|
if (res.headers.getSetCookie().length === 0) {
|
|
241
281
|
throw new Error(
|
|
242
|
-
`[scenario]
|
|
282
|
+
`[scenario] persona sign-in for '${this.name}' returned no session cookie`
|
|
243
283
|
)
|
|
244
284
|
}
|
|
245
285
|
this.signedIn = true
|
|
@@ -269,15 +309,15 @@ function normalizeAgentReply(raw: unknown): TargetAgentReply {
|
|
|
269
309
|
}
|
|
270
310
|
|
|
271
311
|
/**
|
|
272
|
-
* Build the injected `
|
|
273
|
-
*
|
|
312
|
+
* Build the injected `personas` service from the declared personas: id → lazy
|
|
313
|
+
* HTTP persona. Wire the result as the `personas` singleton service.
|
|
274
314
|
*/
|
|
275
|
-
export function
|
|
276
|
-
config:
|
|
277
|
-
):
|
|
278
|
-
const
|
|
279
|
-
for (const [
|
|
280
|
-
|
|
315
|
+
export function createHttpPersonas(
|
|
316
|
+
config: HttpPersonasConfig
|
|
317
|
+
): ScenarioPersonas {
|
|
318
|
+
const personas: ScenarioPersonas = {}
|
|
319
|
+
for (const [id, persona] of Object.entries(config.personas)) {
|
|
320
|
+
personas[id] = new HttpPersona(id, persona, config)
|
|
281
321
|
}
|
|
282
|
-
return
|
|
322
|
+
return personas
|
|
283
323
|
}
|
|
@@ -5,19 +5,7 @@ import type {
|
|
|
5
5
|
} from '../wirings/queue/queue.types.js'
|
|
6
6
|
import { runQueueJob } from '../wirings/queue/queue-runner.js'
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
* In-process queue for local/dev runs. Schedules jobs on the macrotask queue
|
|
10
|
-
* (setTimeout) so dispatch is genuinely asynchronous — the same timing shape as
|
|
11
|
-
* a real queue — and redelivers a failed job up to `options.attempts` times with
|
|
12
|
-
* backoff, so a transiently-failing workflow step recovers exactly as it would
|
|
13
|
-
* on pg-boss/bullmq instead of being silently dropped on its first error.
|
|
14
|
-
*
|
|
15
|
-
* Payloads are JSON round-tripped on the way in, because every real backend
|
|
16
|
-
* puts the job on a wire (SQS body, Redis value, jsonb column) and the worker
|
|
17
|
-
* therefore never sees the caller's live object. Doing it here keeps dev
|
|
18
|
-
* behaviour honest, and keeps the callers — who cannot know which backend they
|
|
19
|
-
* are talking to — from having to serialise defensively.
|
|
20
|
-
*/
|
|
8
|
+
// knowledge: decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md
|
|
21
9
|
export class InMemoryQueueService implements QueueService {
|
|
22
10
|
readonly supportsResults = false
|
|
23
11
|
private jobCounter = 0
|
|
@@ -48,7 +36,6 @@ export class InMemoryQueueService implements QueueService {
|
|
|
48
36
|
await runQueueJob({ job })
|
|
49
37
|
} catch (e: any) {
|
|
50
38
|
if (attemptsMade < maxAttempts) {
|
|
51
|
-
// Transient failure — redeliver with backoff, mirroring a real queue.
|
|
52
39
|
setTimeout(
|
|
53
40
|
runAttempt,
|
|
54
41
|
this.backoffDelay(options?.backoff, attemptsMade)
|
|
@@ -68,7 +55,6 @@ export class InMemoryQueueService implements QueueService {
|
|
|
68
55
|
return jobId
|
|
69
56
|
}
|
|
70
57
|
|
|
71
|
-
/** Delay before the next redelivery, honoring the job's backoff policy. */
|
|
72
58
|
private backoffDelay(
|
|
73
59
|
backoff: JobOptions['backoff'],
|
|
74
60
|
attemptsMade: number
|
|
@@ -1,24 +1,7 @@
|
|
|
1
1
|
import { PikkuTriggerService } from '../wirings/trigger/pikku-trigger-service.js'
|
|
2
2
|
import { getSingletonServices } from '../pikku-state.js'
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
* In-memory TriggerService implementation.
|
|
6
|
-
*
|
|
7
|
-
* Reads both `wireTrigger` declarations and `wireTriggerSource` registrations
|
|
8
|
-
* from pikkuState. Only starts triggers that have both a declaration and a source.
|
|
9
|
-
* On fire, invokes target via `ContextAwareRPCService`.
|
|
10
|
-
*
|
|
11
|
-
* Single owner — one process runs triggers, no distributed claiming.
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
14
|
-
* ```typescript
|
|
15
|
-
* const triggerService = new InMemoryTriggerService()
|
|
16
|
-
* await triggerService.start()
|
|
17
|
-
*
|
|
18
|
-
* // On shutdown
|
|
19
|
-
* await triggerService.stop()
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
4
|
+
// knowledge: decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md
|
|
22
5
|
export class InMemoryTriggerService extends PikkuTriggerService {
|
|
23
6
|
async start(): Promise<void> {
|
|
24
7
|
const singletonServices = getSingletonServices()
|
|
@@ -91,7 +91,6 @@ describe('InMemoryWorkflowService', () => {
|
|
|
91
91
|
|
|
92
92
|
test('should handle non-existent run gracefully', async () => {
|
|
93
93
|
await service.updateRunStatus('non-existent', 'failed')
|
|
94
|
-
// Should not throw
|
|
95
94
|
})
|
|
96
95
|
})
|
|
97
96
|
|
|
@@ -258,18 +257,6 @@ describe('InMemoryWorkflowService', () => {
|
|
|
258
257
|
assert.deepStrictEqual(state.failedNodeIds, [])
|
|
259
258
|
})
|
|
260
259
|
|
|
261
|
-
test('should find nodes without steps', async () => {
|
|
262
|
-
const runId = await service.createRun('wf', {}, true, 'h', {} as any)
|
|
263
|
-
await service.insertStepState(runId, 'node1', null, {})
|
|
264
|
-
|
|
265
|
-
const missing = await service.getNodesWithoutSteps(runId, [
|
|
266
|
-
'node1',
|
|
267
|
-
'node2',
|
|
268
|
-
'node3',
|
|
269
|
-
])
|
|
270
|
-
assert.deepStrictEqual(missing, ['node2', 'node3'])
|
|
271
|
-
})
|
|
272
|
-
|
|
273
260
|
test('should get node results', async () => {
|
|
274
261
|
const runId = await service.createRun('wf', {}, true, 'h', {} as any)
|
|
275
262
|
const step1 = await service.insertStepState(runId, 'node1', null, {})
|
|
@@ -21,21 +21,7 @@ interface InternalStepData {
|
|
|
21
21
|
stepName: string
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
* In-memory implementation of WorkflowService for inline-only execution
|
|
26
|
-
*
|
|
27
|
-
* This is a lightweight workflow service that stores all state in memory.
|
|
28
|
-
* It only supports inline execution (no queue workers) and is ideal for:
|
|
29
|
-
* - CLI tools that need workflow-like step orchestration
|
|
30
|
-
* - Testing and development
|
|
31
|
-
* - Single-process applications without persistence requirements
|
|
32
|
-
*
|
|
33
|
-
* @example
|
|
34
|
-
* ```typescript
|
|
35
|
-
* const workflowService = new InMemoryWorkflowService()
|
|
36
|
-
* await workflowService.startWorkflow('myWorkflow', input, { type: 'cli' }, rpc, { inline: true })
|
|
37
|
-
* ```
|
|
38
|
-
*/
|
|
24
|
+
// knowledge: decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md
|
|
39
25
|
export class InMemoryWorkflowService
|
|
40
26
|
extends PikkuWorkflowService
|
|
41
27
|
implements WorkflowRunService
|
|
@@ -169,7 +155,7 @@ export class InMemoryWorkflowService
|
|
|
169
155
|
this.steps.set(key, step)
|
|
170
156
|
this.stepData.set(stepId, { rpcName, data, stepName })
|
|
171
157
|
|
|
172
|
-
//
|
|
158
|
+
// knowledge: decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md
|
|
173
159
|
const history = this.stepHistory.get(runId) || []
|
|
174
160
|
history.push(step)
|
|
175
161
|
this.stepHistory.set(runId, history)
|
|
@@ -262,7 +248,6 @@ export class InMemoryWorkflowService
|
|
|
262
248
|
failedStepId: string,
|
|
263
249
|
status: 'pending' | 'running'
|
|
264
250
|
): Promise<StepState> {
|
|
265
|
-
// Find the failed step
|
|
266
251
|
let failedStep: StepState | undefined
|
|
267
252
|
let runId: string | undefined
|
|
268
253
|
let stepName: string | undefined
|
|
@@ -304,12 +289,11 @@ export class InMemoryWorkflowService
|
|
|
304
289
|
const key = `${runId}:${stepName}`
|
|
305
290
|
this.steps.set(key, newStep)
|
|
306
291
|
|
|
307
|
-
// Copy step data to new step
|
|
308
292
|
if (failedStepData) {
|
|
309
293
|
this.stepData.set(newStepId, { ...failedStepData })
|
|
310
294
|
}
|
|
311
295
|
|
|
312
|
-
//
|
|
296
|
+
// knowledge: decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md
|
|
313
297
|
const history = this.stepHistory.get(runId) || []
|
|
314
298
|
history.push(newStep)
|
|
315
299
|
this.stepHistory.set(runId, history)
|
|
@@ -380,7 +364,7 @@ export class InMemoryWorkflowService
|
|
|
380
364
|
}
|
|
381
365
|
|
|
382
366
|
async withRunLock<T>(_id: string, fn: () => Promise<T>): Promise<T> {
|
|
383
|
-
//
|
|
367
|
+
// knowledge: decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md
|
|
384
368
|
return fn()
|
|
385
369
|
}
|
|
386
370
|
|
|
@@ -389,7 +373,6 @@ export class InMemoryWorkflowService
|
|
|
389
373
|
_stepName: string,
|
|
390
374
|
fn: () => Promise<T>
|
|
391
375
|
): Promise<T> {
|
|
392
|
-
// In-memory service doesn't need locking for inline execution
|
|
393
376
|
return fn()
|
|
394
377
|
}
|
|
395
378
|
|
|
@@ -398,7 +381,6 @@ export class InMemoryWorkflowService
|
|
|
398
381
|
clearTimeout(timer)
|
|
399
382
|
}
|
|
400
383
|
this.sleepTimers.clear()
|
|
401
|
-
// Clear all in-memory state
|
|
402
384
|
this.runs.clear()
|
|
403
385
|
this.steps.clear()
|
|
404
386
|
this.stepData.clear()
|
|
@@ -408,8 +390,6 @@ export class InMemoryWorkflowService
|
|
|
408
390
|
this.workflowVersions.clear()
|
|
409
391
|
}
|
|
410
392
|
|
|
411
|
-
// Graph workflow methods
|
|
412
|
-
|
|
413
393
|
async getCompletedGraphState(runId: string): Promise<{
|
|
414
394
|
completedNodeIds: string[]
|
|
415
395
|
failedNodeIds: string[]
|
|
@@ -442,20 +422,6 @@ export class InMemoryWorkflowService
|
|
|
442
422
|
return { completedNodeIds, failedNodeIds, branchKeys }
|
|
443
423
|
}
|
|
444
424
|
|
|
445
|
-
async getNodesWithoutSteps(
|
|
446
|
-
runId: string,
|
|
447
|
-
nodeIds: string[]
|
|
448
|
-
): Promise<string[]> {
|
|
449
|
-
const existingSteps = new Set<string>()
|
|
450
|
-
const prefix = `${runId}:`
|
|
451
|
-
for (const [key] of this.steps.entries()) {
|
|
452
|
-
if (key.startsWith(prefix)) {
|
|
453
|
-
existingSteps.add(key.substring(prefix.length))
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
return nodeIds.filter((id) => !existingSteps.has(id))
|
|
457
|
-
}
|
|
458
|
-
|
|
459
425
|
protected override async listStepStates(
|
|
460
426
|
runId: string
|
|
461
427
|
): Promise<Array<StepState & { stepName: string }>> {
|
package/src/services/index.ts
CHANGED
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module @pikku/core
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
1
|
export { LogLevel } from './logger.js'
|
|
6
2
|
export { ScopedSecretService } from './scoped-secret-service.js'
|
|
7
3
|
export {
|
|
@@ -41,20 +37,19 @@ export type {
|
|
|
41
37
|
CopyFileArgs,
|
|
42
38
|
} from './content-service.js'
|
|
43
39
|
export type {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
40
|
+
ScenarioPersona,
|
|
41
|
+
ResolvedPersona,
|
|
42
|
+
ScenarioPersonaOf,
|
|
43
|
+
ScenarioPersonas,
|
|
48
44
|
ScenarioInvokeOptions,
|
|
49
45
|
ScenarioRpcMap,
|
|
50
46
|
ScenarioHttpResponse,
|
|
51
|
-
} from './
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
} from './http-scenario-actors.js'
|
|
47
|
+
} from './personas-service.js'
|
|
48
|
+
// The persona runtime — `HttpPersona`, `createHttpPersonas`,
|
|
49
|
+
// `readScenarioHttpResponse`, `postScenarioJson` — is exported from
|
|
50
|
+
// `@pikku/core/persona`, not from here. Types are free; those are values, and
|
|
51
|
+
// they reach the actor-flow and agent runners, which no production server runs.
|
|
52
|
+
export type { HttpPersonasConfig } from './http-personas.js'
|
|
58
53
|
export type { JWTService } from './jwt-service.js'
|
|
59
54
|
export type {
|
|
60
55
|
EmailService,
|
|
@@ -137,6 +132,12 @@ export type { VariableStatus, VariableMeta } from './typed-variables-service.js'
|
|
|
137
132
|
export type { MetaService } from './meta-service.js'
|
|
138
133
|
export type { SessionStore } from './session-store.js'
|
|
139
134
|
export type { ScopeService, Role } from './scope-service.js'
|
|
135
|
+
export {
|
|
136
|
+
assertRoleIsMutable,
|
|
137
|
+
assertRoleNameAvailable,
|
|
138
|
+
roleLockReason,
|
|
139
|
+
} from './system-role-guard.js'
|
|
140
|
+
export type { IsSystemRole } from './system-role-guard.js'
|
|
140
141
|
export {
|
|
141
142
|
NoopAuditService,
|
|
142
143
|
createInvocationAudit,
|
|
@@ -200,3 +201,7 @@ export {
|
|
|
200
201
|
spy,
|
|
201
202
|
type StubCall,
|
|
202
203
|
} from './stub-tracker.js'
|
|
204
|
+
export {
|
|
205
|
+
SecretHostNotAllowedError,
|
|
206
|
+
assertSecretAllowedForHost,
|
|
207
|
+
} from './secret-host-binding.js'
|
|
@@ -22,11 +22,7 @@ type IstanbulCoverageGlobal = Record<string, IstanbulFileCoverage>
|
|
|
22
22
|
const getCoverageGlobal = (): IstanbulCoverageGlobal | undefined =>
|
|
23
23
|
(globalThis as { __coverage__?: IstanbulCoverageGlobal }).__coverage__
|
|
24
24
|
|
|
25
|
-
/**
|
|
26
|
-
* Reads istanbul-instrumented counters from the `__coverage__` global —
|
|
27
|
-
* the coverage backend for runtimes without V8 precise coverage (e.g. Bun,
|
|
28
|
-
* where source files are instrumented at load time by a Bun loader plugin).
|
|
29
|
-
*/
|
|
25
|
+
/** The coverage backend for runtimes without V8 precise coverage, e.g. Bun. */
|
|
30
26
|
export class IstanbulCoverageService implements CoverageService {
|
|
31
27
|
async start(): Promise<void> {}
|
|
32
28
|
|
|
@@ -39,9 +35,7 @@ export class IstanbulCoverageService implements CoverageService {
|
|
|
39
35
|
hits = new Map()
|
|
40
36
|
lineHits.set(file.path, hits)
|
|
41
37
|
}
|
|
42
|
-
//
|
|
43
|
-
// line only, so an enclosing multi-line statement never masks an
|
|
44
|
-
// unexecuted inner statement (e.g. a throw inside a taken if).
|
|
38
|
+
// knowledge: decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md
|
|
45
39
|
for (const [id, location] of Object.entries(file.statementMap)) {
|
|
46
40
|
const count = file.s[id] ?? 0
|
|
47
41
|
const line = location.start.line
|
|
@@ -1,27 +1,12 @@
|
|
|
1
1
|
import type { RelativeTimeInput } from '../time-utils.js'
|
|
2
2
|
|
|
3
|
-
/**
|
|
4
|
-
* Interface for handling JSON Web Tokens (JWT).
|
|
5
|
-
*/
|
|
6
3
|
export interface JWTService {
|
|
7
|
-
/**
|
|
8
|
-
* Encodes a payload into a JWT.
|
|
9
|
-
* @param expiresIn - The expiration time of the token.
|
|
10
|
-
* @param payload - The payload to encode.
|
|
11
|
-
* @returns A promise that resolves to the encoded JWT.
|
|
12
|
-
*/
|
|
13
4
|
encode: <T extends any>(
|
|
14
5
|
expiresIn: RelativeTimeInput,
|
|
15
6
|
payload: T
|
|
16
7
|
) => Promise<string>
|
|
17
8
|
|
|
18
|
-
/**
|
|
19
|
-
* Decodes a JWT into its payload.
|
|
20
|
-
* @param hash - The JWT to decode.
|
|
21
|
-
* @param invalidHashError - An optional error to throw if the hash is invalid.
|
|
22
|
-
* @param debug - An optional flag for debugging.
|
|
23
|
-
* @returns A promise that resolves to the decoded payload.
|
|
24
|
-
*/
|
|
9
|
+
/** `invalidHashError` replaces the implementation's own error when the hash does not verify. */
|
|
25
10
|
decode: <T>(
|
|
26
11
|
hash: string,
|
|
27
12
|
invalidHashError?: Error,
|