@pikku/core 0.12.72 → 0.12.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1171 -0
- package/dist/column-form.d.ts +32 -0
- package/dist/column-form.js +42 -0
- package/dist/crypto-utils.d.ts +43 -7
- package/dist/crypto-utils.js +163 -42
- package/dist/data-classification.d.ts +44 -0
- package/dist/dev/hot-reload.js +11 -30
- package/dist/dev/module-runner.d.ts +3 -7
- package/dist/dev/module-runner.js +4 -10
- package/dist/dev/reload-meta.d.ts +8 -20
- package/dist/dev/reload-meta.js +9 -29
- package/dist/errors/error-handler.d.ts +5 -30
- package/dist/errors/error-handler.js +16 -32
- package/dist/errors/errors.d.ts +32 -151
- package/dist/errors/errors.js +55 -157
- package/dist/function/abort-scope.d.ts +47 -0
- package/dist/function/abort-scope.js +63 -0
- package/dist/function/function-runner.js +37 -32
- package/dist/function/functions.types.d.ts +57 -136
- package/dist/function/functions.types.js +0 -58
- package/dist/function/index.d.ts +1 -1
- package/dist/function/list.types.d.ts +12 -62
- package/dist/function/list.types.js +4 -25
- package/dist/handle-error.d.ts +0 -13
- package/dist/handle-error.js +0 -18
- package/dist/index.d.ts +11 -5
- package/dist/index.js +7 -2
- package/dist/middleware/auth-apikey.d.ts +3 -18
- package/dist/middleware/auth-apikey.js +0 -17
- package/dist/middleware/auth-bearer.d.ts +6 -41
- package/dist/middleware/auth-bearer.js +5 -41
- package/dist/middleware/auth-cookie.d.ts +5 -27
- package/dist/middleware/auth-cookie.js +2 -26
- package/dist/middleware/cors.d.ts +7 -34
- package/dist/middleware/cors.js +7 -34
- package/dist/middleware/remote-auth.d.ts +3 -1
- package/dist/middleware/remote-auth.js +4 -3
- package/dist/middleware/telemetry.d.ts +8 -33
- package/dist/middleware/telemetry.js +2 -31
- package/dist/middleware-runner.d.ts +4 -55
- package/dist/middleware-runner.js +5 -74
- package/dist/permissions.d.ts +3 -44
- package/dist/permissions.js +19 -71
- package/dist/pikku-request.d.ts +0 -6
- package/dist/pikku-request.js +0 -6
- package/dist/pikku-state.d.ts +0 -26
- package/dist/pikku-state.js +2 -30
- package/dist/remote.d.ts +3 -5
- package/dist/remote.js +9 -8
- package/dist/schema.d.ts +5 -39
- package/dist/schema.js +5 -39
- package/dist/scopes.d.ts +4 -23
- package/dist/scopes.js +7 -48
- package/dist/secret-value.d.ts +56 -0
- package/dist/secret-value.js +46 -0
- package/dist/services/ai-agent-runner-service.d.ts +20 -0
- package/dist/services/ai-embedding-service.d.ts +2 -25
- package/dist/services/audit-service.d.ts +74 -4
- package/dist/services/audit-service.js +8 -7
- package/dist/services/content-service.d.ts +1 -46
- package/dist/services/credential-service.d.ts +3 -40
- package/dist/services/credential-wire-service.d.ts +5 -0
- package/dist/services/credential-wire-service.js +9 -1
- package/dist/services/deployment-service.d.ts +3 -9
- package/dist/services/email-service.d.ts +2 -1
- package/dist/services/gateway-service.d.ts +0 -15
- package/dist/services/http-personas.d.ts +80 -0
- package/dist/services/http-personas.js +233 -0
- package/dist/services/in-memory-queue-service.d.ts +0 -14
- package/dist/services/in-memory-queue-service.js +1 -15
- package/dist/services/in-memory-trigger-service.d.ts +0 -18
- package/dist/services/in-memory-trigger-service.js +1 -18
- package/dist/services/in-memory-workflow-service.d.ts +0 -16
- package/dist/services/in-memory-workflow-service.js +4 -33
- package/dist/services/index.d.ts +8 -9
- package/dist/services/index.js +3 -6
- package/dist/services/istanbul-coverage-service.d.ts +1 -5
- package/dist/services/istanbul-coverage-service.js +2 -8
- package/dist/services/jwt-service.d.ts +1 -16
- package/dist/services/local-content-request-handler.d.ts +29 -0
- package/dist/services/local-content-request-handler.js +176 -0
- package/dist/services/local-content.d.ts +13 -2
- package/dist/services/local-content.js +40 -13
- package/dist/services/local-gateway-service.d.ts +0 -16
- package/dist/services/local-gateway-service.js +2 -17
- package/dist/services/local-secrets.d.ts +4 -7
- package/dist/services/local-secrets.js +7 -7
- package/dist/services/logger-console.d.ts +3 -7
- package/dist/services/logger-console.js +3 -7
- package/dist/services/logger.d.ts +22 -40
- package/dist/services/meta-service.d.ts +23 -26
- package/dist/services/meta-service.js +22 -36
- package/dist/services/personas-service.d.ts +134 -0
- package/dist/services/personas-service.js +40 -0
- package/dist/services/pikku-user-id.js +0 -4
- package/dist/services/queue-webhook-service.d.ts +2 -36
- package/dist/services/queue-webhook-service.js +10 -42
- package/dist/services/scheduler-service.d.ts +1 -50
- package/dist/services/scheduler-service.js +0 -10
- package/dist/services/schema-service.d.ts +1 -24
- package/dist/services/scope-service.d.ts +49 -34
- package/dist/services/scoped-secret-service.d.ts +4 -7
- package/dist/services/scoped-secret-service.js +0 -4
- package/dist/services/secret-host-binding.d.ts +8 -0
- package/dist/services/secret-host-binding.js +36 -0
- package/dist/services/secret-service.d.ts +12 -35
- package/dist/services/secretless.d.ts +6 -0
- package/dist/services/secretless.js +21 -0
- package/dist/services/stub-tracker.d.ts +7 -18
- package/dist/services/stub-tracker.js +8 -18
- package/dist/services/system-role-guard.d.ts +33 -0
- package/dist/services/system-role-guard.js +38 -0
- package/dist/services/trigger-service.d.ts +0 -12
- package/dist/services/typed-secret-service.d.ts +5 -11
- package/dist/services/typed-secret-service.js +1 -7
- package/dist/services/v8-coverage-service.d.ts +2 -3
- package/dist/services/v8-coverage-service.js +1 -2
- package/dist/services/variables-service.d.ts +1 -8
- package/dist/services/webhook-service.d.ts +21 -64
- package/dist/services/webhook-service.js +6 -20
- package/dist/services/workflow-service.d.ts +3 -15
- package/dist/testing/service-tests.js +6 -23
- package/dist/time-utils.d.ts +0 -16
- package/dist/time-utils.js +1 -19
- package/dist/types/core.types.d.ts +120 -219
- package/dist/types/core.types.js +0 -42
- package/dist/types/state.types.d.ts +4 -9
- package/dist/utils/hmac.d.ts +4 -10
- package/dist/utils/hmac.js +4 -10
- package/dist/utils/safe-fetch.d.ts +7 -35
- package/dist/utils/safe-fetch.js +13 -53
- package/dist/utils.d.ts +1 -6
- package/dist/utils.js +6 -15
- package/dist/wirings/actor-flow/actor-flow.types.d.ts +1 -34
- package/dist/wirings/actor-flow/index.d.ts +0 -9
- package/dist/wirings/actor-flow/run-conversation.d.ts +5 -5
- package/dist/wirings/actor-flow/run-conversation.js +14 -7
- package/dist/wirings/ai-agent/ai-agent-agui.d.ts +0 -5
- package/dist/wirings/ai-agent/ai-agent-agui.js +46 -12
- package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +7 -0
- package/dist/wirings/ai-agent/ai-agent-helpers.js +7 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.d.ts +153 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.js +256 -0
- package/dist/wirings/ai-agent/ai-agent-memory.js +0 -2
- package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +0 -9
- package/dist/wirings/ai-agent/ai-agent-model-config.js +1 -9
- package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +10 -99
- package/dist/wirings/ai-agent/ai-agent-prepare.js +65 -132
- package/dist/wirings/ai-agent/ai-agent-registry.d.ts +2 -1
- package/dist/wirings/ai-agent/ai-agent-registry.js +5 -1
- package/dist/wirings/ai-agent/ai-agent-runner.js +63 -22
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +25 -2
- package/dist/wirings/ai-agent/ai-agent-stream.js +180 -64
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +124 -4
- package/dist/wirings/ai-agent/index.d.ts +6 -4
- package/dist/wirings/ai-agent/index.js +5 -4
- package/dist/wirings/ai-agent/voice-input.d.ts +59 -1
- package/dist/wirings/ai-agent/voice-input.js +90 -12
- package/dist/wirings/ai-agent/voice-output.d.ts +69 -1
- package/dist/wirings/ai-agent/voice-output.js +162 -50
- package/dist/wirings/channel/channel-common.d.ts +7 -20
- package/dist/wirings/channel/channel-common.js +7 -21
- package/dist/wirings/channel/channel-handler.js +25 -6
- package/dist/wirings/channel/channel-host-rpc.d.ts +25 -0
- package/dist/wirings/channel/channel-host-rpc.js +38 -0
- package/dist/wirings/channel/channel-middleware-runner.d.ts +0 -12
- package/dist/wirings/channel/channel-middleware-runner.js +0 -12
- package/dist/wirings/channel/channel-rpc-registry.d.ts +31 -0
- package/dist/wirings/channel/channel-rpc-registry.js +89 -0
- package/dist/wirings/channel/channel-rpc-responder.d.ts +15 -0
- package/dist/wirings/channel/channel-rpc-responder.js +71 -0
- package/dist/wirings/channel/channel-rpc-service.d.ts +40 -0
- package/dist/wirings/channel/channel-rpc-service.js +106 -0
- package/dist/wirings/channel/channel-rpc-validators.d.ts +14 -0
- package/dist/wirings/channel/channel-rpc-validators.js +30 -0
- package/dist/wirings/channel/channel-rpc.d.ts +5 -0
- package/dist/wirings/channel/channel-rpc.js +5 -0
- package/dist/wirings/channel/channel-rpc.types.d.ts +90 -0
- package/dist/wirings/channel/channel-rpc.types.js +50 -0
- package/dist/wirings/channel/channel-runner.d.ts +0 -4
- package/dist/wirings/channel/channel-runner.js +0 -14
- package/dist/wirings/channel/channel-store.d.ts +0 -10
- package/dist/wirings/channel/channel.types.d.ts +12 -1
- package/dist/wirings/channel/define-channel-routes.d.ts +0 -20
- package/dist/wirings/channel/define-channel-routes.js +0 -20
- package/dist/wirings/channel/eventhub-service.d.ts +0 -18
- package/dist/wirings/channel/index.d.ts +4 -1
- package/dist/wirings/channel/index.js +2 -0
- package/dist/wirings/channel/local/local-channel-runner.js +3 -1
- package/dist/wirings/channel/local/local-eventhub-service.d.ts +0 -33
- package/dist/wirings/channel/local/local-eventhub-service.js +2 -36
- package/dist/wirings/channel/log-channels.d.ts +0 -4
- package/dist/wirings/channel/log-channels.js +0 -4
- package/dist/wirings/channel/pikku-abstract-channel-handler.js +6 -0
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +2 -5
- package/dist/wirings/cli/channel/cli-approval.d.ts +41 -0
- package/dist/wirings/cli/channel/cli-approval.js +81 -0
- package/dist/wirings/cli/channel/cli-channel-runner.d.ts +0 -4
- package/dist/wirings/cli/channel/cli-channel-runner.js +3 -25
- package/dist/wirings/cli/channel/cli-raw-channel-runner.d.ts +47 -9
- package/dist/wirings/cli/channel/cli-raw-channel-runner.js +24 -16
- package/dist/wirings/cli/channel/cli-raw-client-runner.d.ts +38 -0
- package/dist/wirings/cli/channel/cli-raw-client-runner.js +129 -0
- package/dist/wirings/cli/channel/index.d.ts +5 -0
- package/dist/wirings/cli/channel/index.js +2 -0
- package/dist/wirings/cli/cli-runner.d.ts +20 -20
- package/dist/wirings/cli/cli-runner.js +28 -89
- package/dist/wirings/cli/cli.types.d.ts +14 -3
- package/dist/wirings/cli/command-parser.d.ts +1 -10
- package/dist/wirings/cli/command-parser.js +10 -87
- package/dist/wirings/cli/define-cli-commands.d.ts +1 -17
- package/dist/wirings/cli/define-cli-commands.js +1 -17
- package/dist/wirings/credential/credential.types.d.ts +0 -12
- package/dist/wirings/credential/define-credential.d.ts +48 -0
- package/dist/wirings/credential/define-credential.js +47 -0
- package/dist/wirings/credential/index.d.ts +1 -1
- package/dist/wirings/credential/index.js +1 -1
- package/dist/wirings/credential/validate-credential-definitions.d.ts +2 -4
- package/dist/wirings/gateway/gateway-runner.d.ts +1 -20
- package/dist/wirings/gateway/gateway-runner.js +8 -105
- package/dist/wirings/gateway/gateway.types.d.ts +7 -80
- package/dist/wirings/http/http-routes.d.ts +0 -63
- package/dist/wirings/http/http-routes.js +0 -63
- package/dist/wirings/http/http-runner.d.ts +0 -99
- package/dist/wirings/http/http-runner.js +9 -165
- package/dist/wirings/http/http.types.d.ts +14 -55
- package/dist/wirings/http/log-http-routes.d.ts +0 -4
- package/dist/wirings/http/log-http-routes.js +0 -4
- package/dist/wirings/http/pikku-fetch-http-request.d.ts +0 -40
- package/dist/wirings/http/pikku-fetch-http-request.js +0 -58
- package/dist/wirings/http/pikku-fetch-http-response.js +0 -3
- package/dist/wirings/http/routers/path-to-regex.js +2 -13
- package/dist/wirings/http/web-request.d.ts +0 -8
- package/dist/wirings/http/web-request.js +25 -17
- package/dist/wirings/mcp/mcp-runner.d.ts +1 -4
- package/dist/wirings/mcp/mcp-runner.js +1 -14
- package/dist/wirings/mcp/mcp.types.d.ts +2 -35
- package/dist/wirings/oauth2/oauth2.types.d.ts +0 -28
- package/dist/wirings/oauth2/oauth2.types.js +0 -3
- package/dist/wirings/persona/define-personas.d.ts +32 -0
- package/dist/wirings/persona/define-personas.js +31 -0
- package/dist/wirings/persona/index.d.ts +21 -0
- package/dist/wirings/persona/index.js +17 -0
- package/dist/wirings/persona/persona-email.d.ts +37 -0
- package/dist/wirings/persona/persona-email.js +69 -0
- package/dist/wirings/persona/persona-environments.d.ts +45 -0
- package/dist/wirings/persona/persona-environments.js +81 -0
- package/dist/wirings/persona/persona-mailbox.d.ts +101 -0
- package/dist/wirings/persona/persona-mailbox.js +53 -0
- package/dist/wirings/persona/persona.types.d.ts +136 -0
- package/dist/wirings/persona/persona.types.js +1 -0
- package/dist/wirings/persona/validate-personas.d.ts +53 -0
- package/dist/wirings/persona/validate-personas.js +94 -0
- package/dist/wirings/queue/index.d.ts +3 -0
- package/dist/wirings/queue/index.js +2 -3
- package/dist/wirings/queue/queue-identity.d.ts +28 -0
- package/dist/wirings/queue/queue-identity.js +103 -0
- package/dist/wirings/queue/queue-runner.d.ts +0 -19
- package/dist/wirings/queue/queue-runner.js +9 -30
- package/dist/wirings/queue/queue.types.d.ts +20 -90
- package/dist/wirings/queue/register-queue-helper.d.ts +0 -12
- package/dist/wirings/queue/register-queue-helper.js +0 -11
- package/dist/wirings/queue/signed-queue-service.d.ts +17 -0
- package/dist/wirings/queue/signed-queue-service.js +42 -0
- package/dist/wirings/queue/validate-worker-config.d.ts +2 -23
- package/dist/wirings/queue/validate-worker-config.js +0 -14
- package/dist/wirings/role/define-system-role.d.ts +32 -0
- package/dist/wirings/role/define-system-role.js +31 -0
- package/dist/wirings/role/index.d.ts +3 -0
- package/dist/wirings/role/index.js +2 -0
- package/dist/wirings/role/role.types.d.ts +43 -0
- package/dist/wirings/role/role.types.js +1 -0
- package/dist/wirings/role/validate-role-definitions.d.ts +21 -0
- package/dist/wirings/role/validate-role-definitions.js +71 -0
- package/dist/wirings/rpc/addon-runner.d.ts +0 -19
- package/dist/wirings/rpc/addon-runner.js +0 -51
- package/dist/wirings/rpc/remote-addon-auth.d.ts +3 -13
- package/dist/wirings/rpc/remote-addon-auth.js +7 -11
- package/dist/wirings/rpc/rpc-runner.d.ts +11 -18
- package/dist/wirings/rpc/rpc-runner.js +88 -105
- package/dist/wirings/rpc/rpc-types.d.ts +7 -6
- package/dist/wirings/rpc/wire-addon.d.ts +25 -0
- package/dist/wirings/rpc/wire-addon.js +62 -0
- package/dist/wirings/rpc/wire-remote-addon.d.ts +3 -28
- package/dist/wirings/rpc/wire-remote-addon.js +0 -8
- package/dist/wirings/scheduler/log-schedulers.d.ts +0 -4
- package/dist/wirings/scheduler/log-schedulers.js +0 -4
- package/dist/wirings/scheduler/scheduler-runner.d.ts +0 -1
- package/dist/wirings/scheduler/scheduler-runner.js +0 -1
- package/dist/wirings/scheduler/scheduler.types.d.ts +1 -14
- package/dist/wirings/scope/define-scope.d.ts +32 -0
- package/dist/wirings/scope/define-scope.js +31 -0
- package/dist/wirings/scope/index.d.ts +1 -1
- package/dist/wirings/scope/index.js +1 -1
- package/dist/wirings/scope/scope.types.d.ts +7 -9
- package/dist/wirings/scope/validate-scope-definitions.d.ts +2 -21
- package/dist/wirings/scope/validate-scope-definitions.js +3 -21
- package/dist/wirings/secret/index.d.ts +1 -1
- package/dist/wirings/secret/index.js +1 -1
- package/dist/wirings/secret/secret.types.d.ts +19 -15
- package/dist/wirings/secret/secret.types.js +1 -1
- package/dist/wirings/secret/validate-secret-definitions.d.ts +2 -4
- package/dist/wirings/trigger/trigger-runner.d.ts +0 -27
- package/dist/wirings/trigger/trigger-runner.js +1 -24
- package/dist/wirings/trigger/trigger.types.d.ts +1 -82
- package/dist/wirings/trigger/trigger.types.js +0 -34
- package/dist/wirings/variable/index.d.ts +1 -1
- package/dist/wirings/variable/index.js +1 -1
- package/dist/wirings/variable/validate-variable-definitions.d.ts +2 -4
- package/dist/wirings/variable/variable.types.d.ts +1 -13
- package/dist/wirings/variable/variable.types.js +1 -1
- package/dist/wirings/virtual-user/index.d.ts +30 -0
- package/dist/wirings/virtual-user/index.js +10 -0
- package/dist/wirings/virtual-user/prepare-virtual-user-run.d.ts +54 -0
- package/dist/wirings/virtual-user/prepare-virtual-user-run.js +49 -0
- package/dist/wirings/virtual-user/run-virtual-user.d.ts +92 -0
- package/dist/wirings/virtual-user/run-virtual-user.js +478 -0
- package/dist/wirings/virtual-user/virtual-user-agents.d.ts +38 -0
- package/dist/wirings/virtual-user/virtual-user-agents.js +24 -0
- package/dist/wirings/virtual-user/virtual-user-catalogue.d.ts +92 -0
- package/dist/wirings/virtual-user/virtual-user-catalogue.js +134 -0
- package/dist/wirings/virtual-user/virtual-user-derive.d.ts +26 -0
- package/dist/wirings/virtual-user/virtual-user-derive.js +137 -0
- package/dist/wirings/virtual-user/virtual-user-dispositions.d.ts +79 -0
- package/dist/wirings/virtual-user/virtual-user-dispositions.js +128 -0
- package/dist/wirings/virtual-user/virtual-user-intents.d.ts +78 -0
- package/dist/wirings/virtual-user/virtual-user-intents.js +142 -0
- package/dist/wirings/virtual-user/virtual-user-rng.d.ts +24 -0
- package/dist/wirings/virtual-user/virtual-user-rng.js +44 -0
- package/dist/wirings/virtual-user/virtual-user-run-store.d.ts +90 -0
- package/dist/wirings/virtual-user/virtual-user-run-store.js +1 -0
- package/dist/wirings/virtual-user/virtual-user-target.d.ts +21 -0
- package/dist/wirings/virtual-user/virtual-user-target.js +34 -0
- package/dist/wirings/virtual-user/virtual-user.types.d.ts +199 -0
- package/dist/wirings/virtual-user/virtual-user.types.js +8 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +19 -15
- package/dist/wirings/workflow/dsl/workflow-runner.d.ts +0 -4
- package/dist/wirings/workflow/dsl/workflow-runner.js +0 -4
- package/dist/wirings/workflow/feature.d.ts +0 -19
- package/dist/wirings/workflow/feature.js +0 -19
- package/dist/wirings/workflow/graph/graph-node.d.ts +0 -98
- package/dist/wirings/workflow/graph/graph-node.js +0 -34
- package/dist/wirings/workflow/graph/graph-runner.js +6 -41
- package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +0 -4
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -58
- package/dist/wirings/workflow/graph/workflow-graph.types.js +0 -6
- package/dist/wirings/workflow/index.d.ts +5 -7
- package/dist/wirings/workflow/index.js +3 -17
- package/dist/wirings/workflow/pikku-scenario-service.d.ts +87 -5
- package/dist/wirings/workflow/pikku-scenario-service.js +204 -43
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +7 -459
- package/dist/wirings/workflow/pikku-workflow-service.js +58 -551
- package/dist/wirings/workflow/run-timeline.d.ts +0 -47
- package/dist/wirings/workflow/run-timeline.js +0 -22
- package/dist/wirings/workflow/scenario-cookie-jar.d.ts +0 -23
- package/dist/wirings/workflow/scenario-cookie-jar.js +0 -16
- package/dist/wirings/workflow/scenario-poll.d.ts +0 -15
- package/dist/wirings/workflow/scenario-poll.js +0 -12
- package/dist/wirings/workflow/scenario-prose.d.ts +0 -28
- package/dist/wirings/workflow/scenario-prose.js +1 -19
- package/dist/wirings/workflow/scenario-step-guards.d.ts +0 -13
- package/dist/wirings/workflow/scenario-step-guards.js +1 -14
- package/dist/wirings/workflow/scenario-step.types.d.ts +84 -12
- package/dist/wirings/workflow/scenario-step.types.js +5 -1
- package/dist/wirings/workflow/scenario-surface.d.ts +16 -0
- package/dist/wirings/workflow/scenario-surface.js +56 -0
- package/dist/wirings/workflow/workflow-invocation-id.d.ts +0 -18
- package/dist/wirings/workflow/workflow-invocation-id.js +2 -22
- package/dist/wirings/workflow/workflow-queue-workers.d.ts +0 -20
- package/dist/wirings/workflow/workflow-queue-workers.js +0 -19
- package/dist/wirings/workflow/workflow.types.d.ts +5 -195
- package/knowledge/decisions/index.md +19 -0
- package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +49 -0
- package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-and-not-a-queued-job.md +48 -0
- package/knowledge/decisions/internals/actor-flow-conversations-seed-a-hidden-kickoff-message.md +23 -0
- package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md +24 -0
- package/knowledge/decisions/internals/actor-flow-verdicts-are-llm-self-evaluations.md +25 -0
- package/knowledge/decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md +26 -0
- package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +33 -0
- package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +28 -0
- package/knowledge/decisions/internals/ai-agent-agui-bridge-obeys-the-client-ordering-contract.md +29 -0
- package/knowledge/decisions/internals/ai-agent-audio-chunks-carry-the-format-the-provider-returned.md +20 -0
- package/knowledge/decisions/internals/ai-agent-credential-suspensions-hide-the-tool-result.md +26 -0
- package/knowledge/decisions/internals/ai-agent-delegate-and-supervise-hide-different-text.md +26 -0
- package/knowledge/decisions/internals/ai-agent-llm-tool-arguments-have-nulls-stripped.md +23 -0
- package/knowledge/decisions/internals/ai-agent-model-config-stays-a-single-resolution-seam.md +25 -0
- package/knowledge/decisions/internals/ai-agent-onerror-hooks-cannot-change-the-failure.md +22 -0
- package/knowledge/decisions/internals/ai-agent-runner-methods-must-keep-their-receiver.md +22 -0
- package/knowledge/decisions/internals/ai-agent-stream-persistence-is-best-effort.md +27 -0
- package/knowledge/decisions/internals/ai-agent-sub-agents-inherit-the-parent-context-block.md +26 -0
- package/knowledge/decisions/internals/ai-agent-tool-execute-failures-are-logged-unconditionally.md +25 -0
- package/knowledge/decisions/internals/ai-agent-voice-input-transcribes-audio-parts-in-place.md +22 -0
- package/knowledge/decisions/internals/ai-agent-working-memory-is-persisted-only-when-valid.md +25 -0
- package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +30 -0
- package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +31 -0
- package/knowledge/decisions/internals/channel-state-is-per-socket-session-state-is-per-user.md +29 -0
- package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +28 -0
- package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +27 -0
- package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +28 -0
- package/knowledge/decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md +34 -0
- package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +29 -0
- package/knowledge/decisions/internals/core-column-form-is-an-axis-of-its-own.md +84 -0
- package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +41 -0
- package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +44 -0
- package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +39 -0
- package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +42 -0
- package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +39 -0
- package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +43 -0
- package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +38 -0
- package/knowledge/decisions/internals/core-state-is-a-global-map-written-only-at-registration-time.md +44 -0
- package/knowledge/decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md +27 -0
- package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +32 -0
- package/knowledge/decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md +28 -0
- package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +31 -0
- package/knowledge/decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md +26 -0
- package/knowledge/decisions/internals/http-request-bodies-are-read-once-and-shared.md +32 -0
- package/knowledge/decisions/internals/http-route-groups-cascade-config-in-a-fixed-order.md +28 -0
- package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +30 -0
- package/knowledge/decisions/internals/http-runner-logs-through-a-trace-scoped-logger-functions-do-not.md +26 -0
- package/knowledge/decisions/internals/http-set-cookie-headers-are-appended-never-joined.md +28 -0
- package/knowledge/decisions/internals/http-sse-streams-flush-headers-only-after-middleware.md +32 -0
- package/knowledge/decisions/internals/http-wiring-without-metadata-is-skipped-not-fatal.md +26 -0
- package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +25 -0
- package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +26 -0
- package/knowledge/decisions/internals/index.md +117 -0
- package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +25 -0
- package/knowledge/decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md +26 -0
- package/knowledge/decisions/internals/node-only-builtins-are-imported-dynamically.md +24 -0
- package/knowledge/decisions/internals/one-project-shape-check-two-validators.md +53 -0
- package/knowledge/decisions/internals/queue-group-concurrency-keeps-one-shared-queue-fair.md +28 -0
- package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +27 -0
- package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +31 -0
- package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +32 -0
- package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +27 -0
- package/knowledge/decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md +26 -0
- package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +27 -0
- package/knowledge/decisions/internals/scenarios-live-in-files-named-for-them.md +48 -0
- package/knowledge/decisions/internals/scope-roots-may-be-co-declared-by-an-addon-and-its-host-app.md +30 -0
- package/knowledge/decisions/internals/serverless-channel-disconnect-must-tolerate-a-missing-channel.md +28 -0
- package/knowledge/decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md +30 -0
- package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +29 -0
- package/knowledge/decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md +27 -0
- package/knowledge/decisions/internals/the-kek-salt-is-scoped-to-the-key-version.md +40 -0
- package/knowledge/decisions/internals/the-schema-service-is-never-stubbed.md +26 -0
- package/knowledge/decisions/internals/trigger-declaration-is-split-from-trigger-source.md +33 -0
- package/knowledge/decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md +26 -0
- package/knowledge/decisions/internals/validate-checks-personas-through-a-shared-module.md +43 -0
- package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +26 -0
- package/knowledge/decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md +25 -0
- package/knowledge/decisions/internals/whether-a-run-is-inline-is-read-from-the-run-record.md +58 -0
- package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +34 -0
- package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +42 -0
- package/knowledge/decisions/internals/workflow-dsl-meta-separates-runtime-expressions-from-literals.md +38 -0
- package/knowledge/decisions/internals/workflow-features-resolve-scenarios-by-object-identity.md +29 -0
- package/knowledge/decisions/internals/workflow-graph-inline-and-queued-runs-share-one-planner.md +42 -0
- package/knowledge/decisions/internals/workflow-graph-node-notes-are-excluded-from-the-graph-hash.md +25 -0
- package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +29 -0
- package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +43 -0
- package/knowledge/decisions/internals/workflow-queued-step-dispatch-requires-an-explicit-opt-in.md +29 -0
- package/knowledge/decisions/internals/workflow-queues-are-per-workflow-by-default.md +42 -0
- package/knowledge/decisions/internals/workflow-repeated-step-names-get-an-ordinal-suffix.md +33 -0
- package/knowledge/decisions/internals/workflow-replay-reads-its-steps-once-and-caches-only-the-immutable-half.md +32 -0
- package/knowledge/decisions/internals/workflow-retries-are-owned-by-the-workflow-not-the-queue.md +31 -0
- package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +39 -0
- package/knowledge/decisions/internals/workflow-run-mirror-is-never-a-source-of-truth.md +29 -0
- package/knowledge/decisions/internals/workflow-run-polling-backs-off-to-the-callers-ceiling.md +33 -0
- package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +37 -0
- package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +50 -0
- package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +43 -0
- package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +32 -0
- package/knowledge/decisions/internals/workflow-scenario-quarantine-reason-lives-in-code.md +18 -0
- package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +34 -0
- package/knowledge/decisions/internals/workflow-step-compensation-runs-as-its-own-durable-step.md +26 -0
- package/knowledge/decisions/internals/workflow-step-dispatch-failure-is-transient-not-a-run-failure.md +33 -0
- package/knowledge/decisions/internals/workflow-step-lock-is-held-only-to-claim-the-step.md +27 -0
- package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +34 -0
- package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +38 -0
- package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +30 -0
- package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +26 -0
- package/knowledge/decisions/security/actor-flow-missing-approval-decisions-default-to-denied.md +22 -0
- package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +27 -0
- package/knowledge/decisions/security/actor-sign-in-only-works-for-actor-flagged-users.md +27 -0
- package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +43 -0
- package/knowledge/decisions/security/addon-config-gates-apply-only-at-the-namespaced-rpc-boundary.md +52 -0
- package/knowledge/decisions/security/addon-scopes-are-resolved-where-the-function-runs.md +46 -0
- package/knowledge/decisions/security/ai-agent-approval-forwarding-requires-a-symbol-brand.md +27 -0
- package/knowledge/decisions/security/ai-agent-credential-requests-are-symbol-branded.md +37 -0
- package/knowledge/decisions/security/ai-agent-gate-requires-a-session-only-when-auth-is-true.md +31 -0
- package/knowledge/decisions/security/ai-agent-ownership-failures-never-echo-the-resource.md +23 -0
- package/knowledge/decisions/security/ai-agent-resume-re-runs-the-authorization-gate.md +22 -0
- package/knowledge/decisions/security/ai-agent-sessionless-deployments-have-no-thread-ownership.md +39 -0
- package/knowledge/decisions/security/ai-agent-thread-ownership-composes-the-session-principal.md +30 -0
- package/knowledge/decisions/security/ai-agent-tool-filtering-reads-the-live-function-config.md +24 -0
- package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +30 -0
- package/knowledge/decisions/security/an-exposed-ungated-function-is-a-codegen-warning.md +49 -0
- package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +76 -0
- package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +39 -0
- package/knowledge/decisions/security/core-secrets-use-a-per-secret-dek-wrapped-by-a-kek.md +37 -0
- package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +31 -0
- package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +30 -0
- package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +40 -0
- package/knowledge/decisions/security/http-error-detail-is-withheld-from-clients-in-production.md +33 -0
- package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +46 -0
- package/knowledge/decisions/security/index.md +55 -0
- package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +27 -0
- package/knowledge/decisions/security/passphrases-are-stretched-key-material-is-expanded.md +40 -0
- package/knowledge/decisions/security/permission-auth-filtering-requires-live-permission-functions.md +31 -0
- package/knowledge/decisions/security/pikku-carries-actor-scopes-as-data-and-the-app-grants-them.md +26 -0
- package/knowledge/decisions/security/queue-job-identities-are-signed-at-enqueue.md +69 -0
- package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +39 -0
- package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +34 -0
- package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +49 -0
- package/knowledge/decisions/security/scenario-step-functions-are-never-externally-invocable.md +30 -0
- package/knowledge/decisions/security/scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md +28 -0
- package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +34 -0
- package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +37 -0
- package/knowledge/decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md +25 -0
- package/knowledge/decisions/security/workflow-actor-steps-always-use-the-real-transport.md +34 -0
- package/knowledge/decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md +40 -0
- package/knowledge/decisions/security/workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md +32 -0
- package/knowledge/decisions/security/workflow-scenario-sessions-are-isolated-per-actor-and-per-scenario.md +32 -0
- package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +31 -0
- package/knowledge/index.md +24 -0
- package/knowledge/questions/index.md +15 -0
- package/package.json +6 -2
- package/run-tests.sh +0 -0
- package/src/column-form.test.ts +97 -0
- package/src/column-form.ts +58 -0
- package/src/crypto-utils.test.ts +460 -19
- package/src/crypto-utils.ts +306 -59
- package/src/data-classification.ts +45 -7
- package/src/dev/hot-reload.test.ts +0 -4
- package/src/dev/hot-reload.ts +11 -30
- package/src/dev/module-runner.ts +7 -32
- package/src/dev/reload-meta.ts +9 -29
- package/src/errors/error-handler.ts +20 -35
- package/src/errors/error.test.ts +30 -1
- package/src/errors/errors.ts +73 -157
- package/src/function/abort-scope.test.ts +97 -0
- package/src/function/abort-scope.ts +80 -0
- package/src/function/function-runner.test.ts +0 -7
- package/src/function/function-runner.ts +62 -32
- package/src/function/functions.types.ts +95 -138
- package/src/function/index.ts +1 -0
- package/src/function/list.types.test.ts +3 -25
- package/src/function/list.types.ts +12 -62
- package/src/handle-error.ts +0 -18
- package/src/index.ts +84 -3
- package/src/middleware/auth-apikey.test.ts +0 -1
- package/src/middleware/auth-apikey.ts +0 -17
- package/src/middleware/auth-bearer.test.ts +3 -5
- package/src/middleware/auth-bearer.ts +5 -41
- package/src/middleware/auth-cookie.test.ts +0 -6
- package/src/middleware/auth-cookie.ts +2 -26
- package/src/middleware/cors.test.ts +34 -0
- package/src/middleware/cors.ts +12 -33
- package/src/middleware/remote-auth.test.ts +26 -10
- package/src/middleware/remote-auth.ts +11 -3
- package/src/middleware/telemetry.ts +2 -31
- package/src/middleware-runner.test.ts +0 -2
- package/src/middleware-runner.ts +5 -74
- package/src/permissions.test.ts +30 -0
- package/src/permissions.ts +24 -74
- package/src/pikku-request.ts +0 -6
- package/src/pikku-state.ts +2 -30
- package/src/production-barrels-stay-lean.test.ts +110 -0
- package/src/remote.test.ts +173 -0
- package/src/remote.ts +18 -8
- package/src/schema.ts +5 -39
- package/src/scopes.ts +7 -48
- package/src/secret-value.test.ts +204 -0
- package/src/secret-value.ts +111 -0
- package/src/services/ai-agent-runner-service.ts +20 -0
- package/src/services/ai-embedding-service.ts +3 -25
- package/src/services/audit-service.ts +88 -11
- package/src/services/content-service.ts +1 -46
- package/src/services/credential-service.ts +3 -40
- package/src/services/credential-wire-service.test.ts +0 -2
- package/src/services/credential-wire-service.ts +9 -1
- package/src/services/deployment-service.ts +3 -9
- package/src/services/email-service.ts +3 -1
- package/src/services/gateway-service.ts +0 -15
- package/src/services/{http-scenario-actors-converse.test.ts → http-personas-converse.test.ts} +38 -9
- package/src/services/{http-scenario-actors.test.ts → http-personas.test.ts} +39 -22
- package/src/services/{http-scenario-actors.ts → http-personas.ts} +85 -45
- package/src/services/in-memory-queue-service.ts +1 -15
- package/src/services/in-memory-trigger-service.ts +1 -18
- package/src/services/in-memory-workflow-service.test.ts +0 -13
- package/src/services/in-memory-workflow-service.ts +4 -38
- package/src/services/index.ts +23 -18
- package/src/services/istanbul-coverage-service.ts +2 -8
- package/src/services/jwt-service.ts +1 -16
- package/src/services/local-content-request-handler.test.ts +202 -0
- package/src/services/local-content-request-handler.ts +267 -0
- package/src/services/local-content.test.ts +159 -27
- package/src/services/local-content.ts +55 -23
- package/src/services/local-gateway-service.ts +2 -17
- package/src/services/local-secrets.test.ts +20 -5
- package/src/services/local-secrets.ts +15 -11
- package/src/services/logger-console.test.ts +0 -1
- package/src/services/logger-console.ts +3 -7
- package/src/services/logger.ts +31 -46
- package/src/services/meta-service.test.ts +1 -5
- package/src/services/meta-service.ts +41 -61
- package/src/services/{scenario-actors-service.ts → personas-service.ts} +48 -43
- package/src/services/pikku-user-id.ts +0 -4
- package/src/services/queue-webhook-service.test.ts +2 -1
- package/src/services/queue-webhook-service.ts +10 -42
- package/src/services/scheduler-service.ts +1 -50
- package/src/services/schema-service.ts +1 -24
- package/src/services/scope-service.ts +50 -34
- package/src/services/scoped-secret-service.ts +4 -7
- package/src/services/secret-host-binding.test.ts +138 -0
- package/src/services/secret-host-binding.ts +51 -0
- package/src/services/secret-service.ts +12 -35
- package/src/services/secretless.test.ts +54 -0
- package/src/services/secretless.ts +29 -0
- package/src/services/stub-tracker.ts +8 -18
- package/src/services/system-role-guard.test.ts +93 -0
- package/src/services/system-role-guard.ts +71 -0
- package/src/services/trigger-service.ts +0 -12
- package/src/services/typed-secret-service.ts +12 -14
- package/src/services/v8-coverage-service.ts +3 -6
- package/src/services/variables-service.ts +1 -8
- package/src/services/webhook-service.ts +23 -64
- package/src/services/workflow-service.ts +3 -20
- package/src/testing/service-tests.ts +6 -32
- package/src/time-utils.ts +1 -19
- package/src/types/core.types.ts +137 -229
- package/src/types/state.types.ts +7 -9
- package/src/utils/hmac.ts +4 -10
- package/src/utils/safe-fetch.ts +13 -54
- package/src/utils.test.ts +11 -2
- package/src/utils.ts +6 -15
- package/src/wirings/actor-flow/actor-flow.types.ts +1 -34
- package/src/wirings/actor-flow/index.ts +0 -9
- package/src/wirings/actor-flow/run-conversation.test.ts +11 -6
- package/src/wirings/actor-flow/run-conversation.ts +19 -12
- package/src/wirings/ai-agent/ai-agent-agui.test.ts +91 -10
- package/src/wirings/ai-agent/ai-agent-agui.ts +49 -17
- package/src/wirings/ai-agent/ai-agent-helpers.ts +20 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.test.ts +842 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.ts +399 -0
- package/src/wirings/ai-agent/ai-agent-memory.ts +0 -2
- package/src/wirings/ai-agent/ai-agent-model-config.ts +1 -9
- package/src/wirings/ai-agent/ai-agent-prepare.test.ts +202 -31
- package/src/wirings/ai-agent/ai-agent-prepare.ts +89 -139
- package/src/wirings/ai-agent/ai-agent-registry.test.ts +191 -6
- package/src/wirings/ai-agent/ai-agent-registry.ts +18 -1
- package/src/wirings/ai-agent/ai-agent-resume-authorization.test.ts +0 -2
- package/src/wirings/ai-agent/ai-agent-runner.test.ts +11 -9
- package/src/wirings/ai-agent/ai-agent-runner.ts +85 -35
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +205 -103
- package/src/wirings/ai-agent/ai-agent-stream.ts +224 -76
- package/src/wirings/ai-agent/ai-agent-thread-ownership.test.ts +301 -0
- package/src/wirings/ai-agent/ai-agent.types.ts +130 -5
- package/src/wirings/ai-agent/index.ts +37 -3
- package/src/wirings/ai-agent/voice-input.test.ts +137 -7
- package/src/wirings/ai-agent/voice-input.ts +96 -12
- package/src/wirings/ai-agent/voice-output.test.ts +512 -0
- package/src/wirings/ai-agent/voice-output.ts +243 -56
- package/src/wirings/channel/channel-common.ts +15 -20
- package/src/wirings/channel/channel-handler.test.ts +50 -0
- package/src/wirings/channel/channel-handler.ts +32 -11
- package/src/wirings/channel/channel-host-rpc.test.ts +150 -0
- package/src/wirings/channel/channel-host-rpc.ts +69 -0
- package/src/wirings/channel/channel-middleware-runner.test.ts +0 -1
- package/src/wirings/channel/channel-middleware-runner.ts +0 -12
- package/src/wirings/channel/channel-rpc-registry.ts +116 -0
- package/src/wirings/channel/channel-rpc-responder.ts +117 -0
- package/src/wirings/channel/channel-rpc-service.ts +146 -0
- package/src/wirings/channel/channel-rpc-validators.ts +65 -0
- package/src/wirings/channel/channel-rpc.test.ts +820 -0
- package/src/wirings/channel/channel-rpc.ts +5 -0
- package/src/wirings/channel/channel-rpc.types.ts +150 -0
- package/src/wirings/channel/channel-runner.ts +0 -14
- package/src/wirings/channel/channel-store.ts +0 -10
- package/src/wirings/channel/channel.types.ts +19 -8
- package/src/wirings/channel/define-channel-routes.ts +0 -20
- package/src/wirings/channel/eventhub-service.ts +0 -18
- package/src/wirings/channel/index.ts +35 -0
- package/src/wirings/channel/local/local-channel-handler.ts +3 -1
- package/src/wirings/channel/local/local-channel-runner.test.ts +0 -10
- package/src/wirings/channel/local/local-channel-runner.ts +3 -1
- package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -13
- package/src/wirings/channel/local/local-eventhub-service.ts +2 -37
- package/src/wirings/channel/log-channels.ts +0 -4
- package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +83 -2
- package/src/wirings/channel/pikku-abstract-channel-handler.ts +7 -0
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +2 -5
- package/src/wirings/cli/channel/cli-approval.test.ts +177 -0
- package/src/wirings/cli/channel/cli-approval.ts +135 -0
- package/src/wirings/cli/channel/cli-channel-runner.ts +4 -26
- package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +169 -0
- package/src/wirings/cli/channel/cli-raw-channel-runner.ts +59 -16
- package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +480 -0
- package/src/wirings/cli/channel/cli-raw-client-runner.ts +185 -0
- package/src/wirings/cli/channel/index.ts +13 -0
- package/src/wirings/cli/cli-runner.test.ts +0 -1
- package/src/wirings/cli/cli-runner.ts +46 -88
- package/src/wirings/cli/cli.types.ts +14 -3
- package/src/wirings/cli/command-parser.test.ts +0 -4
- package/src/wirings/cli/command-parser.ts +11 -91
- package/src/wirings/cli/define-cli-commands.ts +1 -17
- package/src/wirings/credential/credential.types.ts +0 -12
- package/src/wirings/credential/{wire-credential.ts → define-credential.ts} +7 -7
- package/src/wirings/credential/index.ts +1 -1
- package/src/wirings/credential/validate-credential-definitions.ts +2 -4
- package/src/wirings/gateway/gateway-runner.test.ts +1 -21
- package/src/wirings/gateway/gateway-runner.ts +8 -110
- package/src/wirings/gateway/gateway.types.ts +7 -80
- package/src/wirings/http/http-routes.test.ts +0 -3
- package/src/wirings/http/http-routes.ts +0 -86
- package/src/wirings/http/http-runner.test.ts +0 -1
- package/src/wirings/http/http-runner.ts +8 -167
- package/src/wirings/http/http.types.ts +15 -62
- package/src/wirings/http/log-http-routes.ts +0 -4
- package/src/wirings/http/pikku-fetch-http-request.test.ts +2 -10
- package/src/wirings/http/pikku-fetch-http-request.ts +0 -58
- package/src/wirings/http/pikku-fetch-http-response.test.ts +1 -1
- package/src/wirings/http/pikku-fetch-http-response.ts +0 -3
- package/src/wirings/http/routers/path-to-regex.test.ts +4 -17
- package/src/wirings/http/routers/path-to-regex.ts +2 -13
- package/src/wirings/http/web-request.test.ts +33 -2
- package/src/wirings/http/web-request.ts +30 -17
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -1
- package/src/wirings/mcp/mcp-runner.ts +2 -17
- package/src/wirings/mcp/mcp.types.ts +7 -42
- package/src/wirings/oauth2/oauth2.types.ts +0 -30
- package/src/wirings/persona/define-personas.ts +33 -0
- package/src/wirings/persona/index.ts +62 -0
- package/src/wirings/persona/persona-email.ts +87 -0
- package/src/wirings/persona/persona-environments.test.ts +183 -0
- package/src/wirings/persona/persona-environments.ts +138 -0
- package/src/wirings/persona/persona-mailbox.ts +156 -0
- package/src/wirings/persona/persona.test.ts +220 -0
- package/src/wirings/persona/persona.types.ts +142 -0
- package/src/wirings/persona/validate-personas.ts +133 -0
- package/src/wirings/queue/index.ts +13 -3
- package/src/wirings/queue/queue-identity.test.ts +454 -0
- package/src/wirings/queue/queue-identity.ts +176 -0
- package/src/wirings/queue/queue-runner.ts +12 -31
- package/src/wirings/queue/queue.types.ts +25 -90
- package/src/wirings/queue/register-queue-helper.ts +0 -14
- package/src/wirings/queue/signed-queue-service.ts +60 -0
- package/src/wirings/queue/validate-worker-config.ts +2 -28
- package/src/wirings/role/define-system-role.ts +33 -0
- package/src/wirings/role/index.ts +13 -0
- package/src/wirings/role/role.test.ts +104 -0
- package/src/wirings/role/role.types.ts +47 -0
- package/src/wirings/role/validate-role-definitions.ts +93 -0
- package/src/wirings/rpc/addon-auth-tags.test.ts +223 -0
- package/src/wirings/rpc/addon-runner.ts +0 -56
- package/src/wirings/rpc/addon-scopes.test.ts +225 -0
- package/src/wirings/rpc/remote-addon-auth.ts +9 -16
- package/src/wirings/rpc/rpc-runner.test.ts +192 -6
- package/src/wirings/rpc/rpc-runner.ts +145 -127
- package/src/wirings/rpc/rpc-types.ts +11 -6
- package/src/wirings/rpc/wire-addon.test.ts +43 -1
- package/src/wirings/rpc/wire-addon.ts +99 -0
- package/src/wirings/rpc/wire-remote-addon.ts +9 -29
- package/src/wirings/scheduler/log-schedulers.ts +0 -4
- package/src/wirings/scheduler/scheduler-runner.test.ts +1 -8
- package/src/wirings/scheduler/scheduler-runner.ts +0 -2
- package/src/wirings/scheduler/scheduler.types.ts +1 -14
- package/src/wirings/scope/{wire-scope.ts → define-scope.ts} +5 -6
- package/src/wirings/scope/index.ts +1 -1
- package/src/wirings/scope/scope.test.ts +1 -2
- package/src/wirings/scope/scope.types.ts +7 -9
- package/src/wirings/scope/validate-scope-definitions.ts +3 -21
- package/src/wirings/secret/index.ts +1 -1
- package/src/wirings/secret/secret.types.ts +19 -15
- package/src/wirings/secret/validate-secret-definitions.ts +2 -4
- package/src/wirings/trigger/trigger-runner.ts +1 -27
- package/src/wirings/trigger/trigger.types.ts +1 -82
- package/src/wirings/variable/index.ts +1 -1
- package/src/wirings/variable/validate-variable-definitions.ts +2 -4
- package/src/wirings/variable/variable.types.ts +1 -13
- package/src/wirings/virtual-user/index.ts +88 -0
- package/src/wirings/virtual-user/prepare-virtual-user-run.test.ts +115 -0
- package/src/wirings/virtual-user/prepare-virtual-user-run.ts +95 -0
- package/src/wirings/virtual-user/run-virtual-user.test.ts +765 -0
- package/src/wirings/virtual-user/run-virtual-user.ts +671 -0
- package/src/wirings/virtual-user/virtual-user-agents.test.ts +65 -0
- package/src/wirings/virtual-user/virtual-user-agents.ts +57 -0
- package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +215 -0
- package/src/wirings/virtual-user/virtual-user-catalogue.ts +184 -0
- package/src/wirings/virtual-user/virtual-user-derive.test.ts +398 -0
- package/src/wirings/virtual-user/virtual-user-derive.ts +173 -0
- package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +63 -0
- package/src/wirings/virtual-user/virtual-user-dispositions.ts +213 -0
- package/src/wirings/virtual-user/virtual-user-intents.test.ts +208 -0
- package/src/wirings/virtual-user/virtual-user-intents.ts +185 -0
- package/src/wirings/virtual-user/virtual-user-rng.test.ts +72 -0
- package/src/wirings/virtual-user/virtual-user-rng.ts +50 -0
- package/src/wirings/virtual-user/virtual-user-run-store.ts +98 -0
- package/src/wirings/virtual-user/virtual-user-target.ts +47 -0
- package/src/wirings/virtual-user/virtual-user.types.ts +219 -0
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +19 -20
- package/src/wirings/workflow/dsl/workflow-runner.ts +0 -4
- package/src/wirings/workflow/feature.ts +0 -19
- package/src/wirings/workflow/graph/graph-node.ts +0 -136
- package/src/wirings/workflow/graph/graph-runner.test.ts +20 -19
- package/src/wirings/workflow/graph/graph-runner.ts +6 -41
- package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -4
- package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -58
- package/src/wirings/workflow/index.ts +10 -44
- package/src/wirings/workflow/pikku-scenario-service.ts +235 -61
- package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -39
- package/src/wirings/workflow/pikku-workflow-service.ts +77 -674
- package/src/wirings/workflow/run-timeline.test.ts +7 -19
- package/src/wirings/workflow/run-timeline.ts +0 -56
- package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -1
- package/src/wirings/workflow/scenario-cookie-jar.ts +0 -25
- package/src/wirings/workflow/scenario-expectations.test.ts +2 -7
- package/src/wirings/workflow/scenario-hooks.test.ts +2 -7
- package/src/wirings/workflow/scenario-poll.test.ts +0 -2
- package/src/wirings/workflow/scenario-poll.ts +0 -15
- package/src/wirings/workflow/scenario-prose.test.ts +5 -7
- package/src/wirings/workflow/scenario-prose.ts +1 -29
- package/src/wirings/workflow/scenario-service.test.ts +2 -10
- package/src/wirings/workflow/scenario-step-guards.ts +1 -14
- package/src/wirings/workflow/scenario-step.test.ts +163 -19
- package/src/wirings/workflow/scenario-step.types.ts +94 -12
- package/src/wirings/workflow/scenario-surface.test.ts +146 -0
- package/src/wirings/workflow/scenario-surface.ts +71 -0
- package/src/wirings/workflow/workflow-dispatch-durability.test.ts +14 -15
- package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -4
- package/src/wirings/workflow/workflow-inline-authority.test.ts +169 -0
- package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -2
- package/src/wirings/workflow/workflow-invocation-id.ts +2 -22
- package/src/wirings/workflow/workflow-mirror.test.ts +0 -7
- package/src/wirings/workflow/workflow-on-error.test.ts +0 -9
- package/src/wirings/workflow/workflow-queue-workers.ts +0 -21
- package/src/wirings/workflow/workflow-replay-snapshot.test.ts +8 -7
- package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -5
- package/src/wirings/workflow/workflow-run-context.test.ts +5 -10
- package/src/wirings/workflow/workflow-run-polling.test.ts +0 -5
- package/src/wirings/workflow/workflow-step-ordinal.test.ts +19 -4
- package/src/wirings/workflow/workflow-step-session.test.ts +0 -7
- package/src/wirings/workflow/workflow.types.ts +5 -201
- package/tsconfig.tsbuildinfo +1 -1
- package/tsconfig.type-tests.json +12 -0
- package/src/middleware/timeout.ts +0 -22
- package/src/pikku-response.ts +0 -5
- package/src/wirings/mcp/mcp-endpoint-registry.test.d.ts +0 -1
- package/src/wirings/workflow/dsl/index.ts +0 -36
- package/src/wirings/workflow/graph/index.ts +0 -15
|
@@ -17,7 +17,8 @@ import type {
|
|
|
17
17
|
FeaturesMeta,
|
|
18
18
|
WorkflowsMeta,
|
|
19
19
|
} from '../wirings/workflow/workflow.types.js'
|
|
20
|
-
import type {
|
|
20
|
+
import type { ResolvedPersona } from './personas-service.js'
|
|
21
|
+
import type { SystemRoleDefinitionsMeta } from '../wirings/role/role.types.js'
|
|
21
22
|
import type {
|
|
22
23
|
TriggerMeta,
|
|
23
24
|
TriggerSourceMeta,
|
|
@@ -34,7 +35,6 @@ import type {
|
|
|
34
35
|
import type { AIAgentMeta } from '../wirings/ai-agent/ai-agent.types.js'
|
|
35
36
|
import type { GatewaysMeta } from '../wirings/gateway/gateway.types.js'
|
|
36
37
|
|
|
37
|
-
// Re-export core types for consumers
|
|
38
38
|
export type {
|
|
39
39
|
FunctionMeta,
|
|
40
40
|
FunctionsMeta,
|
|
@@ -146,39 +146,26 @@ export interface EmailTemplateAssets {
|
|
|
146
146
|
missing: string[]
|
|
147
147
|
}
|
|
148
148
|
|
|
149
|
-
/**
|
|
150
|
-
* Abstraction over .pikku metadata file access.
|
|
151
|
-
* All paths are relative to the .pikku root directory.
|
|
152
|
-
*
|
|
153
|
-
* Node.js uses LocalMetaService (filesystem).
|
|
154
|
-
* Cloudflare uses an R2/KV implementation.
|
|
155
|
-
*/
|
|
149
|
+
/** Every `relativePath` below is relative to the `.pikku` root directory. */
|
|
156
150
|
export interface MetaService {
|
|
157
|
-
/**
|
|
151
|
+
/** Undefined for remote/non-local implementations. */
|
|
158
152
|
readonly basePath?: string
|
|
159
|
-
/** Read a file's content by relative path. Returns null if not found. */
|
|
160
153
|
readFile(relativePath: string): Promise<string | null>
|
|
161
|
-
/** List files in a directory by relative path. Returns empty array if not found. */
|
|
162
154
|
readDir(relativePath: string): Promise<string[]>
|
|
163
|
-
/**
|
|
155
|
+
/** Relative to the project root, one level above `.pikku`. */
|
|
164
156
|
readProjectFile(relativePath: string): Promise<string | null>
|
|
165
157
|
/**
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
* absent. Only local/Node implementations resolve packages; remote impls omit
|
|
171
|
-
* this and callers guard with `?.`.
|
|
158
|
+
* Reads an *installed addon package's* own `.pikku`, not the app's, with
|
|
159
|
+
* `relativePath` rooted there (`../README.md` reaches the package root).
|
|
160
|
+
* Optional because only local/Node implementations resolve packages — remote
|
|
161
|
+
* ones omit it and callers guard with `?.`.
|
|
172
162
|
*/
|
|
173
163
|
readPackageFile?(
|
|
174
164
|
packageName: string,
|
|
175
165
|
relativePath: string
|
|
176
166
|
): Promise<string | null>
|
|
177
|
-
/** List a directory inside an installed addon package's `.pikku`. */
|
|
178
167
|
readPackageDir?(packageName: string, relativePath: string): Promise<string[]>
|
|
179
168
|
|
|
180
|
-
// -- Typed metadata accessors --
|
|
181
|
-
|
|
182
169
|
getHttpMeta(): Promise<HTTPWiringsMeta>
|
|
183
170
|
getChannelsMeta(): Promise<ChannelsMeta>
|
|
184
171
|
getSchedulerMeta(): Promise<ScheduledTasksMeta>
|
|
@@ -188,7 +175,16 @@ export interface MetaService {
|
|
|
188
175
|
getGatewayMeta(): Promise<GatewaysMeta>
|
|
189
176
|
getRpcMeta(): Promise<RPCMetaRecord>
|
|
190
177
|
getWorkflowMeta(): Promise<WorkflowsMeta>
|
|
191
|
-
|
|
178
|
+
getPersonasMeta(): Promise<Record<string, ResolvedPersona>>
|
|
179
|
+
/**
|
|
180
|
+
* The roles declared with `defineSystemRole`, keyed by name.
|
|
181
|
+
*
|
|
182
|
+
* A persona declares roles; a function checks scopes. Anything showing what a
|
|
183
|
+
* persona can reach — the console's persona page, a run's catalogue — needs
|
|
184
|
+
* this to get from one to the other, and needs it to be the same expansion the
|
|
185
|
+
* seed granted from rather than a second one.
|
|
186
|
+
*/
|
|
187
|
+
getSystemRolesMeta(): Promise<SystemRoleDefinitionsMeta>
|
|
192
188
|
getFeaturesMeta(): Promise<FeaturesMeta>
|
|
193
189
|
getTriggerMeta(): Promise<TriggerMeta>
|
|
194
190
|
getTriggerSourceMeta(): Promise<TriggerSourceMeta>
|
|
@@ -212,10 +208,6 @@ export interface MetaService {
|
|
|
212
208
|
clearCache(): void
|
|
213
209
|
}
|
|
214
210
|
|
|
215
|
-
/**
|
|
216
|
-
* Node.js filesystem implementation of MetaService.
|
|
217
|
-
* Reads .gen.json files from a local .pikku directory.
|
|
218
|
-
*/
|
|
219
211
|
export class LocalMetaService implements MetaService {
|
|
220
212
|
public readonly basePath: string
|
|
221
213
|
|
|
@@ -228,8 +220,8 @@ export class LocalMetaService implements MetaService {
|
|
|
228
220
|
private gatewayMetaCache: GatewaysMeta | null = null
|
|
229
221
|
private rpcMetaCache: RPCMetaRecord | null = null
|
|
230
222
|
private workflowMetaCache: WorkflowsMeta | null = null
|
|
231
|
-
private
|
|
232
|
-
|
|
223
|
+
private personasMetaCache: Record<string, ResolvedPersona> | null = null
|
|
224
|
+
private systemRolesMetaCache: SystemRoleDefinitionsMeta | null = null
|
|
233
225
|
private featuresMetaCache: FeaturesMeta | null = null
|
|
234
226
|
private triggerMetaCache: TriggerMeta | null = null
|
|
235
227
|
private triggerSourceMetaCache: TriggerSourceMeta | null = null
|
|
@@ -271,10 +263,7 @@ export class LocalMetaService implements MetaService {
|
|
|
271
263
|
}
|
|
272
264
|
}
|
|
273
265
|
|
|
274
|
-
//
|
|
275
|
-
// The addon packages have no main `exports` entry, so `require.resolve(pkg)`
|
|
276
|
-
// throws; instead we walk the node_modules search paths (anchored at the app
|
|
277
|
-
// root, one level above `.pikku`) and pick the first that contains the package.
|
|
266
|
+
// knowledge: decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md
|
|
278
267
|
private packageRootCache = new Map<string, string | null>()
|
|
279
268
|
private resolvePackageRoot(packageName: string): string | null {
|
|
280
269
|
const cached = this.packageRootCache.get(packageName)
|
|
@@ -332,7 +321,8 @@ export class LocalMetaService implements MetaService {
|
|
|
332
321
|
this.gatewayMetaCache = null
|
|
333
322
|
this.rpcMetaCache = null
|
|
334
323
|
this.workflowMetaCache = null
|
|
335
|
-
this.
|
|
324
|
+
this.personasMetaCache = null
|
|
325
|
+
this.systemRolesMetaCache = null
|
|
336
326
|
this.featuresMetaCache = null
|
|
337
327
|
this.triggerMetaCache = null
|
|
338
328
|
this.triggerSourceMetaCache = null
|
|
@@ -347,8 +337,6 @@ export class LocalMetaService implements MetaService {
|
|
|
347
337
|
this.schemaCache.clear()
|
|
348
338
|
}
|
|
349
339
|
|
|
350
|
-
// -- Private helpers --
|
|
351
|
-
|
|
352
340
|
private async readMetaJson<T>(
|
|
353
341
|
dir: string,
|
|
354
342
|
baseName: string
|
|
@@ -360,8 +348,6 @@ export class LocalMetaService implements MetaService {
|
|
|
360
348
|
return null
|
|
361
349
|
}
|
|
362
350
|
|
|
363
|
-
// -- Typed metadata accessors --
|
|
364
|
-
|
|
365
351
|
async getHttpMeta(): Promise<HTTPWiringsMeta> {
|
|
366
352
|
if (this.httpMetaCache) return this.httpMetaCache
|
|
367
353
|
|
|
@@ -496,9 +482,7 @@ export class LocalMetaService implements MetaService {
|
|
|
496
482
|
|
|
497
483
|
try {
|
|
498
484
|
const result: WorkflowsMeta = {}
|
|
499
|
-
//
|
|
500
|
-
// imports them, but they are still workflows to anything reading meta off
|
|
501
|
-
// disk — the console's scenario list among them.
|
|
485
|
+
// knowledge: decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md
|
|
502
486
|
await Promise.all([
|
|
503
487
|
this.readWorkflowMetaDir('workflow/meta', result),
|
|
504
488
|
this.readWorkflowMetaDir('scenarios/meta', result),
|
|
@@ -513,12 +497,21 @@ export class LocalMetaService implements MetaService {
|
|
|
513
497
|
}
|
|
514
498
|
}
|
|
515
499
|
|
|
516
|
-
async
|
|
517
|
-
if (this.
|
|
500
|
+
async getPersonasMeta(): Promise<Record<string, ResolvedPersona>> {
|
|
501
|
+
if (this.personasMetaCache) return this.personasMetaCache
|
|
502
|
+
|
|
503
|
+
const content = await this.readFile('workflow/personas.gen.json')
|
|
504
|
+
this.personasMetaCache = content ? JSON.parse(content) : {}
|
|
505
|
+
return this.personasMetaCache!
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
async getSystemRolesMeta(): Promise<SystemRoleDefinitionsMeta> {
|
|
509
|
+
if (this.systemRolesMetaCache) return this.systemRolesMetaCache
|
|
518
510
|
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
511
|
+
// Beside the scopes it is composed from, which is where codegen writes it.
|
|
512
|
+
const content = await this.readFile('scopes/pikku-roles-meta.gen.json')
|
|
513
|
+
this.systemRolesMetaCache = content ? JSON.parse(content) : {}
|
|
514
|
+
return this.systemRolesMetaCache!
|
|
522
515
|
}
|
|
523
516
|
|
|
524
517
|
async getFeaturesMeta(): Promise<FeaturesMeta> {
|
|
@@ -556,8 +549,6 @@ export class LocalMetaService implements MetaService {
|
|
|
556
549
|
|
|
557
550
|
const [content, scenarioContent] = await Promise.all([
|
|
558
551
|
this.readMetaJson('function', 'pikku-functions-meta'),
|
|
559
|
-
// Scenario steps register only into the scenario bootstrap, but they are
|
|
560
|
-
// still functions to anything reading meta off disk.
|
|
561
552
|
this.readMetaJson('scenarios', 'pikku-scenario-functions-meta'),
|
|
562
553
|
])
|
|
563
554
|
this.functionsMetaCache = {
|
|
@@ -635,12 +626,7 @@ export class LocalMetaService implements MetaService {
|
|
|
635
626
|
}
|
|
636
627
|
|
|
637
628
|
async getEmailMeta(): Promise<EmailsMeta> {
|
|
638
|
-
//
|
|
639
|
-
// `pikku all`/`pikku emails generate` and is regenerated DURING a long-lived
|
|
640
|
-
// session (sandbox boots the orchestrator before the user project's codegen
|
|
641
|
-
// has written it). Caching here once returned an empty {templates:{}} that
|
|
642
|
-
// then stuck for the whole session, leaving the console emails screen blank
|
|
643
|
-
// even after the file appeared. A local JSON read is essentially free.
|
|
629
|
+
// knowledge: decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md
|
|
644
630
|
const content = await this.readFile('email/pikku-emails-meta.gen.json')
|
|
645
631
|
return content
|
|
646
632
|
? JSON.parse(content)
|
|
@@ -662,9 +648,7 @@ export class LocalMetaService implements MetaService {
|
|
|
662
648
|
)
|
|
663
649
|
}
|
|
664
650
|
|
|
665
|
-
//
|
|
666
|
-
// Read directly rather than through readProjectFile (which prepends the project
|
|
667
|
-
// root and produces a wrong compound path when baseDir is absolute).
|
|
651
|
+
// knowledge: decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md
|
|
668
652
|
const baseDir = emailsMeta.src
|
|
669
653
|
const readEmailFile = async (rel: string): Promise<string | null> => {
|
|
670
654
|
try {
|
|
@@ -700,10 +684,6 @@ export class LocalMetaService implements MetaService {
|
|
|
700
684
|
]
|
|
701
685
|
|
|
702
686
|
if (missing.length > 0) {
|
|
703
|
-
// Diagnostic for the intermittent "Missing source files" report: logs which
|
|
704
|
-
// process and which resolved baseDir saw the gap. Different pids across
|
|
705
|
-
// failures => multiple runtime workers with divergent cached `src`; same pid
|
|
706
|
-
// + transient absence => files being rewritten under us (e.g. regeneration).
|
|
707
687
|
console.warn(
|
|
708
688
|
`[email-assets] pid=${process.pid} template=${templateName} locale=${locale} baseDir=${baseDir} missing=${missing.join(',')}`
|
|
709
689
|
)
|
|
@@ -2,6 +2,7 @@ import type {
|
|
|
2
2
|
ConverseOptions,
|
|
3
3
|
ActorFlowVerdict,
|
|
4
4
|
} from '../wirings/actor-flow/actor-flow.types.js'
|
|
5
|
+
import type { PersonaMeta } from '../wirings/persona/persona.types.js'
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* What the transport answered, for a step that treats the status as data.
|
|
@@ -34,8 +35,8 @@ export interface ScenarioHttpResponse<T = unknown> {
|
|
|
34
35
|
* Drain a response into the shape a step can carry: the parsed body (an empty
|
|
35
36
|
* one counting as no body at all) alongside the text it was parsed from.
|
|
36
37
|
*
|
|
37
|
-
* `invokeRaw` returns this, and a step that has to reach past
|
|
38
|
-
* route with no RPC, an identity no
|
|
38
|
+
* `invokeRaw` returns this, and a step that has to reach past a persona — a
|
|
39
|
+
* route with no RPC, an identity no persona can hold — reaches for this rather
|
|
39
40
|
* than writing the same record by hand.
|
|
40
41
|
*/
|
|
41
42
|
export const readScenarioHttpResponse = async <T = unknown>(
|
|
@@ -77,7 +78,7 @@ export interface ScenarioJsonRequest {
|
|
|
77
78
|
/**
|
|
78
79
|
* POST JSON somewhere and report what came back, without throwing on a 4xx/5xx.
|
|
79
80
|
*
|
|
80
|
-
* Every scenario that reaches past
|
|
81
|
+
* Every scenario that reaches past a persona was writing this by hand — the same
|
|
81
82
|
* `content-type`, the same `JSON.stringify`, the same drain — and the copies had
|
|
82
83
|
* drifted: some returned `res.json()`, which loses the status and throws
|
|
83
84
|
* outright when the target answers an empty body or an HTML error page. A
|
|
@@ -104,39 +105,45 @@ export const postScenarioJson = async <T = unknown>(
|
|
|
104
105
|
/** Per-call transport options. */
|
|
105
106
|
export interface ScenarioInvokeOptions {
|
|
106
107
|
/**
|
|
107
|
-
* Headers to send alongside the
|
|
108
|
-
* expresses an identity
|
|
109
|
-
*
|
|
108
|
+
* Headers to send alongside the persona's own session. This is how a step
|
|
109
|
+
* expresses an identity no declared persona can — an impersonation header, or
|
|
110
|
+
* one of the header-shim principals a credential scenario invents.
|
|
110
111
|
*/
|
|
111
112
|
headers?: Record<string, string>
|
|
112
113
|
}
|
|
113
114
|
|
|
114
115
|
/**
|
|
115
|
-
* The RPC surface
|
|
116
|
+
* The RPC surface a persona can reach, as name → input/output. A project binds
|
|
116
117
|
* its generated exposed RPC map here; the default leaves every name open, which
|
|
117
|
-
* is what
|
|
118
|
+
* is what a persona built by hand (or by a third-party driver) gets.
|
|
118
119
|
*/
|
|
119
120
|
export type ScenarioRpcMap = Record<string, { input: any; output: any }>
|
|
120
121
|
|
|
121
122
|
/**
|
|
122
|
-
* The
|
|
123
|
-
*
|
|
124
|
-
* `never` — a project may still build
|
|
123
|
+
* The persona a step's `actor` slot carries, for a project whose personas are
|
|
124
|
+
* known. No declared personas keeps the open type rather than collapsing to
|
|
125
|
+
* `never` — a project may still build one itself.
|
|
125
126
|
*/
|
|
126
|
-
export type
|
|
127
|
-
?
|
|
128
|
-
:
|
|
127
|
+
export type ScenarioPersonaOf<TPersonas> = [keyof TPersonas] extends [never]
|
|
128
|
+
? ScenarioPersona
|
|
129
|
+
: TPersonas[keyof TPersonas]
|
|
129
130
|
|
|
130
|
-
/**
|
|
131
|
-
|
|
131
|
+
/**
|
|
132
|
+
* A declared person, signed in and acting over the real transport.
|
|
133
|
+
*
|
|
134
|
+
* The runtime half of `definePersonas()`: sign-in materialises a user row
|
|
135
|
+
* flagged `actor: true`, and everything a step or a virtual user does goes
|
|
136
|
+
* through here.
|
|
137
|
+
*/
|
|
138
|
+
export interface ScenarioPersona<
|
|
132
139
|
TAgentName extends string = string,
|
|
133
140
|
TRpcMap extends ScenarioRpcMap = ScenarioRpcMap,
|
|
134
141
|
> {
|
|
135
|
-
/**
|
|
142
|
+
/** The id it was declared under — what a step's `actor` slot names. */
|
|
136
143
|
readonly name: string
|
|
137
|
-
/**
|
|
144
|
+
/** Their address, computed from the id. Flows use it for invites/lookups. */
|
|
138
145
|
readonly email: string
|
|
139
|
-
/** Invoke an exposed RPC as this
|
|
146
|
+
/** Invoke an exposed RPC as this person over the real transport. */
|
|
140
147
|
invoke<TName extends keyof TRpcMap & string>(
|
|
141
148
|
rpcName: TName,
|
|
142
149
|
data: TRpcMap[TName]['input']
|
|
@@ -151,32 +158,30 @@ export interface ScenarioActor<
|
|
|
151
158
|
data: TRpcMap[TName]['input'],
|
|
152
159
|
options?: ScenarioInvokeOptions
|
|
153
160
|
): Promise<ScenarioHttpResponse>
|
|
154
|
-
/** Converse with a Pikku AI agent in
|
|
161
|
+
/** Converse with a Pikku AI agent in character and return its verdict. */
|
|
155
162
|
converse(options: ConverseOptions<TAgentName>): Promise<ActorFlowVerdict>
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/** Display/config metadata for an actor (from pikku.config.json) */
|
|
159
|
-
export interface ScenarioActorConfig {
|
|
160
|
-
email: string
|
|
161
|
-
name?: string
|
|
162
|
-
jobTitle?: string
|
|
163
|
-
personality?: string
|
|
164
|
-
/**
|
|
165
|
-
* The persona this body is one of — the KIND of person, declared in
|
|
166
|
-
* `scenarios.personas`. Most personas have exactly one actor and it is
|
|
167
|
-
* materialised for them; a second body of the same persona is what tenant
|
|
168
|
-
* isolation and peer-sharing scenarios are made of.
|
|
169
|
-
*/
|
|
170
|
-
persona?: string
|
|
171
163
|
/**
|
|
172
|
-
*
|
|
173
|
-
*
|
|
174
|
-
*
|
|
175
|
-
* the
|
|
164
|
+
* The roles this person actually holds on the stage, read back after signing
|
|
165
|
+
* in — what a run compares against the declaration before its first step.
|
|
166
|
+
*
|
|
167
|
+
* `null` when the target does not say. That is not the same as "no roles": a
|
|
168
|
+
* run that treats silence as an empty list refuses to start against every
|
|
169
|
+
* stage whose auth reports roles somewhere else, so the caller must decide
|
|
170
|
+
* whether it can verify at all.
|
|
176
171
|
*/
|
|
177
|
-
|
|
178
|
-
roles?: readonly string[]
|
|
172
|
+
sessionRoles(): Promise<string[] | null>
|
|
179
173
|
}
|
|
180
174
|
|
|
181
|
-
/**
|
|
182
|
-
|
|
175
|
+
/**
|
|
176
|
+
* A declared persona with its address filled in — what codegen writes and what
|
|
177
|
+
* a seed, a scenario run and a virtual-user run all read.
|
|
178
|
+
*
|
|
179
|
+
* The address is not declared. It is derived from the persona's id and the
|
|
180
|
+
* project's persona domain, so two people can never accidentally share one and
|
|
181
|
+
* sign in as the same user row — which would silently collapse exactly the
|
|
182
|
+
* isolation scenarios a second person exists for.
|
|
183
|
+
*/
|
|
184
|
+
export type ResolvedPersona = PersonaMeta & { email: string }
|
|
185
|
+
|
|
186
|
+
/** The injected `personas` service: persona id → persona. */
|
|
187
|
+
export type ScenarioPersonas = Record<string, ScenarioPersona>
|
|
@@ -3,15 +3,11 @@ import type { PikkuRawWire } from '../types/core.types.js'
|
|
|
3
3
|
export type PikkuUserIdResolver = (wire: PikkuRawWire) => string | undefined
|
|
4
4
|
|
|
5
5
|
export const defaultPikkuUserIdResolver: PikkuUserIdResolver = (wire) => {
|
|
6
|
-
// Explicit pikkuUserId on wire (set by earlier middleware or runner)
|
|
7
6
|
if (wire.pikkuUserId) return wire.pikkuUserId
|
|
8
|
-
// Session userId (from auth middleware — user-defined session shape)
|
|
9
7
|
const session = wire.session as Record<string, unknown> | undefined
|
|
10
8
|
if (session?.userId && typeof session.userId === 'string')
|
|
11
9
|
return session.userId
|
|
12
|
-
// Queue job: carried in job metadata
|
|
13
10
|
if (wire.queue?.pikkuUserId) return wire.queue.pikkuUserId
|
|
14
|
-
// Workflow: carried in run wire metadata
|
|
15
11
|
if (wire.workflow?.pikkuUserId) return wire.workflow.pikkuUserId
|
|
16
12
|
return undefined
|
|
17
13
|
}
|
|
@@ -14,6 +14,7 @@ import { InMemoryQueueService } from './in-memory-queue-service.js'
|
|
|
14
14
|
import { wireQueueWorker } from '../wirings/queue/queue-runner.js'
|
|
15
15
|
import { resetPikkuState, pikkuState } from '../pikku-state.js'
|
|
16
16
|
import type { JobOptions } from '../wirings/queue/queue.types.js'
|
|
17
|
+
import { createSecretValue } from '../secret-value.js'
|
|
17
18
|
|
|
18
19
|
const noopLogger = { error() {}, info() {}, warn() {}, debug() {} }
|
|
19
20
|
|
|
@@ -132,7 +133,7 @@ describe('QueueWebhookService.send', () => {
|
|
|
132
133
|
secrets: {
|
|
133
134
|
getSecret: async (key: string) => {
|
|
134
135
|
assert.equal(key, 'WEBHOOK_SIGNING_KEY')
|
|
135
|
-
return 'resolved-key'
|
|
136
|
+
return createSecretValue('resolved-key')
|
|
136
137
|
},
|
|
137
138
|
},
|
|
138
139
|
})
|
|
@@ -13,23 +13,11 @@ import {
|
|
|
13
13
|
WebhookService,
|
|
14
14
|
} from './webhook-service.js'
|
|
15
15
|
|
|
16
|
-
/** Cap on the response body captured on a failed attempt. */
|
|
17
16
|
const MAX_CAPTURED_RESPONSE_BODY = 2_000
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
* Default {@link WebhookService} implementation: serializes and signs the
|
|
21
|
-
* payload, then enqueues a delivery job onto the `pikku-outgoing-webhooks`
|
|
22
|
-
* queue. The signature is computed at enqueue time so the signing key never
|
|
23
|
-
* enters the queue payload; the actual HTTP POST happens in
|
|
24
|
-
* {@link pikkuWebhookWorkerFunc}, and the queue's `attempts`/`backoff`
|
|
25
|
-
* options drive retries.
|
|
26
|
-
*/
|
|
18
|
+
// knowledge: decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md
|
|
27
19
|
export class QueueWebhookService extends WebhookService {
|
|
28
|
-
|
|
29
|
-
* The queue is a constructor dependency rather than a `getSingletonServices()`
|
|
30
|
-
* lookup so that a project wiring up outgoing webhooks without a queue fails
|
|
31
|
-
* to compile, instead of throwing on the first `send()`.
|
|
32
|
-
*/
|
|
20
|
+
// knowledge: decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md
|
|
33
21
|
constructor(protected queueService: QueueService) {
|
|
34
22
|
super()
|
|
35
23
|
}
|
|
@@ -45,10 +33,8 @@ export class QueueWebhookService extends WebhookService {
|
|
|
45
33
|
}
|
|
46
34
|
|
|
47
35
|
/**
|
|
48
|
-
*
|
|
49
|
-
* `
|
|
50
|
-
* store-backed subclass can persist a delivery row and attach its
|
|
51
|
-
* `deliveryId` without re-implementing signing or the retry policy.
|
|
36
|
+
* `protected` so a store-backed subclass can persist a delivery row and attach
|
|
37
|
+
* its `deliveryId` without re-implementing signing or the retry policy.
|
|
52
38
|
*/
|
|
53
39
|
protected async prepareDelivery(
|
|
54
40
|
input: SendWebhookInput
|
|
@@ -65,8 +51,8 @@ export class QueueWebhookService extends WebhookService {
|
|
|
65
51
|
|
|
66
52
|
let secret = input.secret
|
|
67
53
|
if (secret === undefined && webhookConfig?.secret) {
|
|
68
|
-
// Naive read
|
|
69
|
-
secret = await services.secrets.getSecret(webhookConfig.secret)
|
|
54
|
+
// Naive read: caching is the secret service's concern, not ours.
|
|
55
|
+
secret = (await services.secrets.getSecret(webhookConfig.secret)).reveal()
|
|
70
56
|
if (!secret) {
|
|
71
57
|
services.logger.error(
|
|
72
58
|
`Webhook signing secret '${webhookConfig.secret}' (config.webhook.secret) resolved to nothing — outgoing webhooks will be sent UNSIGNED.`
|
|
@@ -89,13 +75,7 @@ export class QueueWebhookService extends WebhookService {
|
|
|
89
75
|
return { jobData, options: this.resolveJobOptions(input) }
|
|
90
76
|
}
|
|
91
77
|
|
|
92
|
-
|
|
93
|
-
* Resolve a delivery's retry policy into queue job options, mirroring the
|
|
94
|
-
* workflow service: per-call values win over `config.webhook` defaults, an
|
|
95
|
-
* explicitly-set `retries` (including 0) is always honored, and `attempts`
|
|
96
|
-
* is ALWAYS passed so the queue can never fall back to its own default.
|
|
97
|
-
* Backoff is exponential unless a concrete `retryDelay` selects a fixed one.
|
|
98
|
-
*/
|
|
78
|
+
// knowledge: decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md
|
|
99
79
|
private resolveJobOptions(input: SendWebhookInput): JobOptions {
|
|
100
80
|
const webhookConfig = getSingletonServices().config?.webhook
|
|
101
81
|
const retries =
|
|
@@ -111,18 +91,7 @@ export class QueueWebhookService extends WebhookService {
|
|
|
111
91
|
}
|
|
112
92
|
}
|
|
113
93
|
|
|
114
|
-
|
|
115
|
-
* Queue worker for the `pikku-outgoing-webhooks` queue: POSTs the delivery to its
|
|
116
|
-
* target URL. Any non-2xx response (or network error) throws so the queue
|
|
117
|
-
* retries the job according to the `attempts`/`backoff` set at enqueue time;
|
|
118
|
-
* the queue runner logs each failed attempt.
|
|
119
|
-
*
|
|
120
|
-
* A `deliveryId` is only present when a store-backed `webhookService` (e.g.
|
|
121
|
-
* `KyselyWebhookService`) enqueued the job, so each attempt (success or failure)
|
|
122
|
-
* is persisted via `webhookService.recordAttempt` before the throw — the console
|
|
123
|
-
* delivery history reflects every try, not just the outcome. The queue-only
|
|
124
|
-
* default never sets a `deliveryId`, so its base `recordAttempt` is never hit.
|
|
125
|
-
*/
|
|
94
|
+
// knowledge: decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md
|
|
126
95
|
export async function pikkuWebhookWorkerFunc(
|
|
127
96
|
services: { logger: Logger; webhookService?: WebhookService },
|
|
128
97
|
{ url, body, headers, deliveryId }: WebhookJobData
|
|
@@ -136,8 +105,8 @@ export async function pikkuWebhookWorkerFunc(
|
|
|
136
105
|
try {
|
|
137
106
|
allowedHosts = getSingletonServices().config?.webhook?.allowedHosts
|
|
138
107
|
} catch {
|
|
139
|
-
//
|
|
140
|
-
//
|
|
108
|
+
// Uninitialised singletons (a bare worker invocation): fall back to the
|
|
109
|
+
// default private-host block rather than failing the delivery.
|
|
141
110
|
}
|
|
142
111
|
|
|
143
112
|
try {
|
|
@@ -165,7 +134,6 @@ export async function pikkuWebhookWorkerFunc(
|
|
|
165
134
|
}
|
|
166
135
|
|
|
167
136
|
if (deliveryId && services.webhookService) {
|
|
168
|
-
// Best-effort history: a store failure must not mask the delivery result.
|
|
169
137
|
await services.webhookService
|
|
170
138
|
.recordAttempt(deliveryId, { statusCode, responseBody, error, delivered })
|
|
171
139
|
.catch((storeError) =>
|
|
@@ -1,47 +1,21 @@
|
|
|
1
1
|
import type { CoreUserSession } from '../types/core.types.js'
|
|
2
2
|
|
|
3
|
-
/**
|
|
4
|
-
* Minimal metadata for listing scheduled tasks
|
|
5
|
-
*/
|
|
6
3
|
export interface ScheduledTaskSummary {
|
|
7
|
-
/** Unique task ID */
|
|
8
4
|
taskId: string
|
|
9
|
-
/** RPC function name to invoke */
|
|
10
5
|
rpcName: string
|
|
11
|
-
/** Scheduled execution time */
|
|
12
6
|
scheduledFor: Date
|
|
13
7
|
}
|
|
14
8
|
|
|
15
|
-
/**
|
|
16
|
-
* Full metadata for a scheduled task retrieved from the queue
|
|
17
|
-
*/
|
|
18
9
|
export interface ScheduledTaskInfo extends ScheduledTaskSummary {
|
|
19
|
-
/** Data to pass to the RPC function */
|
|
20
10
|
data?: any
|
|
21
|
-
/** User session */
|
|
22
11
|
session?: CoreUserSession
|
|
23
|
-
/** Task status */
|
|
24
12
|
status?: 'scheduled' | 'active' | 'completed' | 'failed'
|
|
25
13
|
}
|
|
26
14
|
|
|
27
|
-
/**
|
|
28
|
-
* Abstract scheduler service for persistent scheduled task management
|
|
29
|
-
* Implementations use queue backends (pg-boss, BullMQ) for distributed scheduling
|
|
30
|
-
*/
|
|
31
15
|
export abstract class SchedulerService {
|
|
32
|
-
/**
|
|
33
|
-
* Initialize the scheduler service
|
|
34
|
-
*/
|
|
35
16
|
abstract init(): Promise<void>
|
|
36
17
|
|
|
37
|
-
/**
|
|
38
|
-
* Schedule a one-off delayed RPC call
|
|
39
|
-
* @param delay - Delay before execution (number in milliseconds or duration string like "5h", "30m")
|
|
40
|
-
* @param rpcName - RPC function name to invoke
|
|
41
|
-
* @param data - Data to pass to the RPC function
|
|
42
|
-
* @param session - Optional user session
|
|
43
|
-
* @returns Task ID
|
|
44
|
-
*/
|
|
18
|
+
/** `delay` is milliseconds as a number, or a duration string such as `"5h"` / `"30m"`. */
|
|
45
19
|
abstract scheduleRPC(
|
|
46
20
|
delay: number | string,
|
|
47
21
|
rpcName: string,
|
|
@@ -49,38 +23,15 @@ export abstract class SchedulerService {
|
|
|
49
23
|
session?: CoreUserSession
|
|
50
24
|
): Promise<string>
|
|
51
25
|
|
|
52
|
-
/**
|
|
53
|
-
* Unschedule a task by ID
|
|
54
|
-
* @param taskId - Task ID
|
|
55
|
-
* @returns Success status
|
|
56
|
-
*/
|
|
57
26
|
abstract unschedule(taskId: string): Promise<boolean>
|
|
58
27
|
|
|
59
|
-
/**
|
|
60
|
-
* Get a scheduled task by ID with full details
|
|
61
|
-
* @param taskId - Task ID
|
|
62
|
-
* @returns Task info or null if not found
|
|
63
|
-
*/
|
|
64
28
|
abstract getTask(taskId: string): Promise<ScheduledTaskInfo | null>
|
|
65
29
|
|
|
66
|
-
/**
|
|
67
|
-
* Get all scheduled tasks with minimal info
|
|
68
|
-
* @returns Array of task summaries with taskId, rpcName, and schedule
|
|
69
|
-
*/
|
|
70
30
|
abstract getAllTasks(): Promise<ScheduledTaskSummary[]>
|
|
71
31
|
|
|
72
|
-
/**
|
|
73
|
-
* Close any open connections
|
|
74
|
-
*/
|
|
75
32
|
abstract close(): Promise<void>
|
|
76
33
|
|
|
77
|
-
/**
|
|
78
|
-
* Start recurring scheduled tasks
|
|
79
|
-
*/
|
|
80
34
|
async start(): Promise<void> {}
|
|
81
35
|
|
|
82
|
-
/**
|
|
83
|
-
* Stop recurring scheduled tasks
|
|
84
|
-
*/
|
|
85
36
|
async stop(): Promise<void> {}
|
|
86
37
|
}
|
|
@@ -1,33 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Interface for a schema service that handles schema compilation, validation, and management.
|
|
3
|
-
*/
|
|
4
1
|
export interface SchemaService {
|
|
5
|
-
/**
|
|
6
|
-
* Compiles a schema with the provided name and value, making it available for use.
|
|
7
|
-
* @param {string} name - The unique name for the schema.
|
|
8
|
-
* @param {any} value - The schema definition or configuration to be compiled.
|
|
9
|
-
* @returns {Promise<void> | void} A promise if asynchronous, or void if synchronous.
|
|
10
|
-
*/
|
|
11
2
|
compileSchema: (name: string, value: any) => Promise<void> | void
|
|
12
3
|
|
|
13
|
-
/**
|
|
14
|
-
* Validates data against a specified schema.
|
|
15
|
-
* @param {string} schema - The name of the schema to validate against.
|
|
16
|
-
* @param {any} data - The data to validate against the schema.
|
|
17
|
-
* @returns {Promise<void> | void} A promise if asynchronous, or void if synchronous.
|
|
18
|
-
*/
|
|
19
4
|
validateSchema: (schema: string, data: any) => Promise<void> | void
|
|
20
5
|
|
|
21
|
-
/**
|
|
22
|
-
* Retrieves a set of all registered schema names.
|
|
23
|
-
* @returns {Set<string>} A set containing the names of all available schemas.
|
|
24
|
-
*/
|
|
25
6
|
getSchemaNames: () => Set<string>
|
|
26
7
|
|
|
27
|
-
/**
|
|
28
|
-
* Retrieves the property keys from a compiled JSON schema.
|
|
29
|
-
* @param {string} schemaName - The name of the schema.
|
|
30
|
-
* @returns {string[]} An array of property keys, or empty array if schema not found.
|
|
31
|
-
*/
|
|
8
|
+
/** Empty when the schema is not registered. */
|
|
32
9
|
getSchemaKeys: (schemaName: string) => string[]
|
|
33
10
|
}
|