@pikku/core 0.12.71 → 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 +848 -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 +40 -30
- 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 -11
- package/dist/handle-error.js +6 -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 +7 -17
- package/dist/schema.js +30 -18
- 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 +1 -100
- package/dist/wirings/http/http-runner.js +12 -166
- package/dist/wirings/http/http.types.d.ts +16 -55
- package/dist/wirings/http/index.d.ts +2 -1
- package/dist/wirings/http/index.js +1 -1
- 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 +6 -36
- package/dist/wirings/http/pikku-fetch-http-request.js +56 -50
- 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 +2 -0
- package/dist/wirings/mcp/mcp-runner.js +6 -16
- 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 -2
- 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 +75 -7
- package/src/function/function-runner.ts +73 -30
- 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/gopass-secrets-removed.test.ts +51 -0
- package/src/handle-error.test.ts +108 -1
- package/src/handle-error.ts +8 -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.test.ts +103 -0
- package/src/schema.ts +35 -18
- 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 +12 -168
- package/src/wirings/http/http.types.ts +17 -62
- package/src/wirings/http/index.ts +5 -1
- package/src/wirings/http/log-http-routes.ts +0 -4
- package/src/wirings/http/pikku-fetch-http-request.test.ts +88 -7
- package/src/wirings/http/pikku-fetch-http-request.ts +74 -50
- 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.test.ts +40 -0
- package/src/wirings/mcp/mcp-runner.ts +9 -15
- 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/services/gopass-secrets.ts +0 -78
- 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
|
@@ -2,6 +2,31 @@ import { createReadStream, createWriteStream, promises } from 'fs';
|
|
|
2
2
|
import { mkdir, readFile } from 'fs/promises';
|
|
3
3
|
import { resolve, normalize } from 'path';
|
|
4
4
|
import { pipeline } from 'stream/promises';
|
|
5
|
+
/**
|
|
6
|
+
* The representation of an asset that gets bound into a signed URL's
|
|
7
|
+
* signature, and that a server can reconstruct from an incoming request:
|
|
8
|
+
* the decoded path, without origin or query string.
|
|
9
|
+
*
|
|
10
|
+
* Both sides must derive it the same way, so signer and verifier share this
|
|
11
|
+
* function. Percent escapes are decoded so that a client re-encoding an
|
|
12
|
+
* optional character still matches; a malformed escape is left verbatim
|
|
13
|
+
* rather than throwing, which keeps both sides in agreement.
|
|
14
|
+
*/
|
|
15
|
+
export const signedContentPath = (urlOrPath) => {
|
|
16
|
+
let pathname;
|
|
17
|
+
try {
|
|
18
|
+
pathname = new URL(urlOrPath, 'http://pikku.local').pathname;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
pathname = urlOrPath;
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
return decodeURIComponent(pathname);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return pathname;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
5
30
|
export class LocalContent {
|
|
6
31
|
config;
|
|
7
32
|
logger;
|
|
@@ -10,6 +35,9 @@ export class LocalContent {
|
|
|
10
35
|
this.config = config;
|
|
11
36
|
this.logger = logger;
|
|
12
37
|
this.jwt = jwt;
|
|
38
|
+
if (!jwt) {
|
|
39
|
+
throw new Error('LocalContent requires a JWTService: without one it cannot sign asset URLs, and unsigned URLs cannot be verified.');
|
|
40
|
+
}
|
|
13
41
|
}
|
|
14
42
|
safePath(bucket, key) {
|
|
15
43
|
const base = resolve(this.config.localFileUploadPath);
|
|
@@ -24,7 +52,7 @@ export class LocalContent {
|
|
|
24
52
|
return `${bucket}/${key}`;
|
|
25
53
|
}
|
|
26
54
|
async init() { }
|
|
27
|
-
async signParams(dateLessThan, dateGreaterThan) {
|
|
55
|
+
async signParams(url, dateLessThan, dateGreaterThan) {
|
|
28
56
|
const signedAt = Date.now();
|
|
29
57
|
const expiresAt = dateLessThan.getTime();
|
|
30
58
|
const params = new URLSearchParams({
|
|
@@ -34,22 +62,21 @@ export class LocalContent {
|
|
|
34
62
|
if (dateGreaterThan) {
|
|
35
63
|
params.set('notBefore', String(dateGreaterThan.getTime()));
|
|
36
64
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
const signature = await this.jwt.encode({ value: expiresInSeconds, unit: 'second' }, payload);
|
|
47
|
-
params.set('signature', signature);
|
|
65
|
+
const expiresInSeconds = Math.max(1, Math.floor((expiresAt - signedAt) / 1000));
|
|
66
|
+
const payload = {
|
|
67
|
+
signedAt,
|
|
68
|
+
expiresAt,
|
|
69
|
+
path: signedContentPath(url),
|
|
70
|
+
};
|
|
71
|
+
if (dateGreaterThan) {
|
|
72
|
+
payload.notBefore = dateGreaterThan.getTime();
|
|
48
73
|
}
|
|
74
|
+
const signature = await this.jwt.encode({ value: expiresInSeconds, unit: 'second' }, payload);
|
|
75
|
+
params.set('signature', signature);
|
|
49
76
|
return params.toString();
|
|
50
77
|
}
|
|
51
78
|
async signURL(args) {
|
|
52
|
-
const params = await this.signParams(args.dateLessThan, args.dateGreaterThan);
|
|
79
|
+
const params = await this.signParams(args.url, args.dateLessThan, args.dateGreaterThan);
|
|
53
80
|
return `${args.url}?${params}`;
|
|
54
81
|
}
|
|
55
82
|
async signContentKey(args) {
|
|
@@ -1,20 +1,4 @@
|
|
|
1
1
|
import type { GatewayService } from './gateway-service.js';
|
|
2
|
-
/**
|
|
3
|
-
* Local GatewayService implementation.
|
|
4
|
-
*
|
|
5
|
-
* Starts all registered listener gateways unconditionally (single-process).
|
|
6
|
-
* For distributed deployments, implement `GatewayService` with leader
|
|
7
|
-
* election or similar coordination.
|
|
8
|
-
*
|
|
9
|
-
* @example
|
|
10
|
-
* ```typescript
|
|
11
|
-
* const gatewayService = new LocalGatewayService()
|
|
12
|
-
* await gatewayService.start()
|
|
13
|
-
*
|
|
14
|
-
* // On shutdown
|
|
15
|
-
* await gatewayService.stop()
|
|
16
|
-
* ```
|
|
17
|
-
*/
|
|
18
2
|
export declare class LocalGatewayService implements GatewayService {
|
|
19
3
|
private activeAdapters;
|
|
20
4
|
start(): Promise<void>;
|
|
@@ -1,21 +1,6 @@
|
|
|
1
1
|
import { pikkuState, getSingletonServices } from '../pikku-state.js';
|
|
2
2
|
import { createListenerMessageHandler, resolveGatewayAdapter, } from '../wirings/gateway/gateway-runner.js';
|
|
3
|
-
|
|
4
|
-
* Local GatewayService implementation.
|
|
5
|
-
*
|
|
6
|
-
* Starts all registered listener gateways unconditionally (single-process).
|
|
7
|
-
* For distributed deployments, implement `GatewayService` with leader
|
|
8
|
-
* election or similar coordination.
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```typescript
|
|
12
|
-
* const gatewayService = new LocalGatewayService()
|
|
13
|
-
* await gatewayService.start()
|
|
14
|
-
*
|
|
15
|
-
* // On shutdown
|
|
16
|
-
* await gatewayService.stop()
|
|
17
|
-
* ```
|
|
18
|
-
*/
|
|
3
|
+
// knowledge: decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md
|
|
19
4
|
export class LocalGatewayService {
|
|
20
5
|
activeAdapters = new Map();
|
|
21
6
|
async start() {
|
|
@@ -43,7 +28,7 @@ export class LocalGatewayService {
|
|
|
43
28
|
getSingletonServices().logger.error(`Error closing listener gateway '${name}':`, e);
|
|
44
29
|
}
|
|
45
30
|
catch {
|
|
46
|
-
// logger may
|
|
31
|
+
// The logger may already be gone during shutdown.
|
|
47
32
|
}
|
|
48
33
|
}
|
|
49
34
|
}
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import type { SecretService } from './secret-service.js';
|
|
2
2
|
import type { VariablesService } from './variables-service.js';
|
|
3
|
-
/**
|
|
4
|
-
* Service for retrieving secrets from environment variables.
|
|
5
|
-
* Supports storing secrets locally in memory for CLI operations.
|
|
6
|
-
*/
|
|
7
3
|
export declare class LocalSecretService implements SecretService {
|
|
8
4
|
private variables;
|
|
9
5
|
private localSecrets;
|
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
import { LocalVariablesService } from './local-variables.js';
|
|
2
|
-
/**
|
|
3
|
-
* Service for retrieving secrets from environment variables.
|
|
4
|
-
* Supports storing secrets locally in memory for CLI operations.
|
|
5
|
-
*/
|
|
6
2
|
export class LocalSecretService {
|
|
7
3
|
variables;
|
|
8
4
|
localSecrets = new Map();
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import type { Logger } from './logger.js';
|
|
2
2
|
import { LogLevel } from './logger.js';
|
|
3
|
-
/**
|
|
4
|
-
* Text-mode console logger.
|
|
5
|
-
* Output: `INFO: message` or `[traceId] INFO: message`
|
|
6
|
-
*/
|
|
3
|
+
/** Emits `INFO: message`, or `[traceId] INFO: message` when scoped. */
|
|
7
4
|
export declare class ConsoleLogger implements Logger {
|
|
8
5
|
private level;
|
|
9
6
|
private prefix;
|
|
@@ -19,9 +16,8 @@ export declare class ConsoleLogger implements Logger {
|
|
|
19
16
|
log(level: string, message: string, ...meta: any[]): void;
|
|
20
17
|
}
|
|
21
18
|
/**
|
|
22
|
-
* JSON
|
|
23
|
-
*
|
|
24
|
-
* CF Workers Logs auto-indexes JSON keys for filtering.
|
|
19
|
+
* Emits `{"level":"info","message":"...","traceId":"..."}` — one JSON object per
|
|
20
|
+
* line, because Cloudflare Workers Logs auto-indexes JSON keys for filtering.
|
|
25
21
|
*/
|
|
26
22
|
export declare class JsonConsoleLogger implements Logger {
|
|
27
23
|
private level;
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { LogLevel } from './logger.js';
|
|
2
|
-
/**
|
|
3
|
-
* Text-mode console logger.
|
|
4
|
-
* Output: `INFO: message` or `[traceId] INFO: message`
|
|
5
|
-
*/
|
|
2
|
+
/** Emits `INFO: message`, or `[traceId] INFO: message` when scoped. */
|
|
6
3
|
export class ConsoleLogger {
|
|
7
4
|
level = LogLevel.info;
|
|
8
5
|
prefix;
|
|
@@ -61,9 +58,8 @@ export class ConsoleLogger {
|
|
|
61
58
|
}
|
|
62
59
|
}
|
|
63
60
|
/**
|
|
64
|
-
* JSON
|
|
65
|
-
*
|
|
66
|
-
* CF Workers Logs auto-indexes JSON keys for filtering.
|
|
61
|
+
* Emits `{"level":"info","message":"...","traceId":"..."}` — one JSON object per
|
|
62
|
+
* line, because Cloudflare Workers Logs auto-indexes JSON keys for filtering.
|
|
67
63
|
*/
|
|
68
64
|
export class JsonConsoleLogger {
|
|
69
65
|
level = LogLevel.info;
|
|
@@ -1,53 +1,18 @@
|
|
|
1
1
|
export declare enum LogLevel {
|
|
2
|
-
'trace' = 0
|
|
2
|
+
'trace' = 0,
|
|
3
3
|
'debug' = 1,
|
|
4
4
|
'info' = 2,
|
|
5
5
|
'warn' = 3,
|
|
6
6
|
'error' = 4,
|
|
7
7
|
'critical' = 5
|
|
8
8
|
}
|
|
9
|
-
/**
|
|
10
|
-
* Interface for logging messages at various levels.
|
|
11
|
-
*/
|
|
12
9
|
export interface Logger {
|
|
13
|
-
/**
|
|
14
|
-
* Logs an informational message.
|
|
15
|
-
* @param messageOrObj - The message or object to log.
|
|
16
|
-
* @param meta - Additional metadata to log.
|
|
17
|
-
*/
|
|
18
10
|
info(messageOrObj: string | Record<string, any>, ...meta: any[]): void;
|
|
19
|
-
/**
|
|
20
|
-
* Logs a warning message.
|
|
21
|
-
* @param messageOrObj - The message or object to log.
|
|
22
|
-
* @param meta - Additional metadata to log.
|
|
23
|
-
*/
|
|
24
11
|
warn(messageOrObj: string | Record<string, any>, ...meta: any[]): void;
|
|
25
|
-
/**
|
|
26
|
-
* Logs an error message.
|
|
27
|
-
* @param messageOrObj - The message, object, or error to log.
|
|
28
|
-
* @param meta - Additional metadata to log.
|
|
29
|
-
*/
|
|
30
12
|
error(messageOrObj: string | Record<string, any> | Error, ...meta: any[]): void;
|
|
31
|
-
/**
|
|
32
|
-
* Logs a debug message.
|
|
33
|
-
* @param message - The message to log.
|
|
34
|
-
* @param meta - Additional metadata to log.
|
|
35
|
-
*/
|
|
36
13
|
debug(message: string, ...meta: any[]): void;
|
|
37
|
-
/**
|
|
38
|
-
* Logs a trace message.
|
|
39
|
-
* @param message - The message to log.
|
|
40
|
-
* @param meta - Additional metadata to log.
|
|
41
|
-
*/
|
|
42
14
|
trace?(message: string, ...meta: any[]): void;
|
|
43
|
-
/**
|
|
44
|
-
* Sets the logging level.
|
|
45
|
-
* @param level - The logging level to set.
|
|
46
|
-
*/
|
|
47
15
|
setLevel(level: LogLevel): void;
|
|
48
|
-
/**
|
|
49
|
-
* Creates a scoped logger with a traceId included in every log entry.
|
|
50
|
-
* Used per-request to correlate logs across function calls.
|
|
51
|
-
*/
|
|
16
|
+
/** A logger carrying a traceId on every entry, taken per-request to correlate calls. */
|
|
52
17
|
scope?(traceId: string): Logger;
|
|
53
18
|
}
|
|
@@ -6,7 +6,8 @@ import type { QueueWorkersMeta } from '../wirings/queue/queue.types.js';
|
|
|
6
6
|
import type { CLIMeta } from '../wirings/cli/cli.types.js';
|
|
7
7
|
import type { MCPResourceMeta, MCPToolMeta, MCPPromptMeta } from '../wirings/mcp/mcp.types.js';
|
|
8
8
|
import type { FeaturesMeta, WorkflowsMeta } from '../wirings/workflow/workflow.types.js';
|
|
9
|
-
import type {
|
|
9
|
+
import type { ResolvedPersona } from './personas-service.js';
|
|
10
|
+
import type { SystemRoleDefinitionsMeta } from '../wirings/role/role.types.js';
|
|
10
11
|
import type { TriggerMeta, TriggerSourceMeta } from '../wirings/trigger/trigger.types.js';
|
|
11
12
|
import type { SecretDefinitionsMeta } from '../wirings/secret/secret.types.js';
|
|
12
13
|
import type { CredentialDefinitionsMeta } from '../wirings/credential/credential.types.js';
|
|
@@ -114,32 +115,21 @@ export interface EmailTemplateAssets {
|
|
|
114
115
|
text: string;
|
|
115
116
|
missing: string[];
|
|
116
117
|
}
|
|
117
|
-
/**
|
|
118
|
-
* Abstraction over .pikku metadata file access.
|
|
119
|
-
* All paths are relative to the .pikku root directory.
|
|
120
|
-
*
|
|
121
|
-
* Node.js uses LocalMetaService (filesystem).
|
|
122
|
-
* Cloudflare uses an R2/KV implementation.
|
|
123
|
-
*/
|
|
118
|
+
/** Every `relativePath` below is relative to the `.pikku` root directory. */
|
|
124
119
|
export interface MetaService {
|
|
125
|
-
/**
|
|
120
|
+
/** Undefined for remote/non-local implementations. */
|
|
126
121
|
readonly basePath?: string;
|
|
127
|
-
/** Read a file's content by relative path. Returns null if not found. */
|
|
128
122
|
readFile(relativePath: string): Promise<string | null>;
|
|
129
|
-
/** List files in a directory by relative path. Returns empty array if not found. */
|
|
130
123
|
readDir(relativePath: string): Promise<string[]>;
|
|
131
|
-
/**
|
|
124
|
+
/** Relative to the project root, one level above `.pikku`. */
|
|
132
125
|
readProjectFile(relativePath: string): Promise<string | null>;
|
|
133
126
|
/**
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
* absent. Only local/Node implementations resolve packages; remote impls omit
|
|
139
|
-
* this and callers guard with `?.`.
|
|
127
|
+
* Reads an *installed addon package's* own `.pikku`, not the app's, with
|
|
128
|
+
* `relativePath` rooted there (`../README.md` reaches the package root).
|
|
129
|
+
* Optional because only local/Node implementations resolve packages — remote
|
|
130
|
+
* ones omit it and callers guard with `?.`.
|
|
140
131
|
*/
|
|
141
132
|
readPackageFile?(packageName: string, relativePath: string): Promise<string | null>;
|
|
142
|
-
/** List a directory inside an installed addon package's `.pikku`. */
|
|
143
133
|
readPackageDir?(packageName: string, relativePath: string): Promise<string[]>;
|
|
144
134
|
getHttpMeta(): Promise<HTTPWiringsMeta>;
|
|
145
135
|
getChannelsMeta(): Promise<ChannelsMeta>;
|
|
@@ -150,7 +140,16 @@ export interface MetaService {
|
|
|
150
140
|
getGatewayMeta(): Promise<GatewaysMeta>;
|
|
151
141
|
getRpcMeta(): Promise<RPCMetaRecord>;
|
|
152
142
|
getWorkflowMeta(): Promise<WorkflowsMeta>;
|
|
153
|
-
|
|
143
|
+
getPersonasMeta(): Promise<Record<string, ResolvedPersona>>;
|
|
144
|
+
/**
|
|
145
|
+
* The roles declared with `defineSystemRole`, keyed by name.
|
|
146
|
+
*
|
|
147
|
+
* A persona declares roles; a function checks scopes. Anything showing what a
|
|
148
|
+
* persona can reach — the console's persona page, a run's catalogue — needs
|
|
149
|
+
* this to get from one to the other, and needs it to be the same expansion the
|
|
150
|
+
* seed granted from rather than a second one.
|
|
151
|
+
*/
|
|
152
|
+
getSystemRolesMeta(): Promise<SystemRoleDefinitionsMeta>;
|
|
154
153
|
getFeaturesMeta(): Promise<FeaturesMeta>;
|
|
155
154
|
getTriggerMeta(): Promise<TriggerMeta>;
|
|
156
155
|
getTriggerSourceMeta(): Promise<TriggerSourceMeta>;
|
|
@@ -168,10 +167,6 @@ export interface MetaService {
|
|
|
168
167
|
getSchemas(schemaNames: string[]): Promise<Record<string, JSONSchema7 | null>>;
|
|
169
168
|
clearCache(): void;
|
|
170
169
|
}
|
|
171
|
-
/**
|
|
172
|
-
* Node.js filesystem implementation of MetaService.
|
|
173
|
-
* Reads .gen.json files from a local .pikku directory.
|
|
174
|
-
*/
|
|
175
170
|
export declare class LocalMetaService implements MetaService {
|
|
176
171
|
readonly basePath: string;
|
|
177
172
|
private httpMetaCache;
|
|
@@ -183,7 +178,8 @@ export declare class LocalMetaService implements MetaService {
|
|
|
183
178
|
private gatewayMetaCache;
|
|
184
179
|
private rpcMetaCache;
|
|
185
180
|
private workflowMetaCache;
|
|
186
|
-
private
|
|
181
|
+
private personasMetaCache;
|
|
182
|
+
private systemRolesMetaCache;
|
|
187
183
|
private featuresMetaCache;
|
|
188
184
|
private triggerMetaCache;
|
|
189
185
|
private triggerSourceMetaCache;
|
|
@@ -216,7 +212,8 @@ export declare class LocalMetaService implements MetaService {
|
|
|
216
212
|
getRpcMeta(): Promise<RPCMetaRecord>;
|
|
217
213
|
private readWorkflowMetaDir;
|
|
218
214
|
getWorkflowMeta(): Promise<WorkflowsMeta>;
|
|
219
|
-
|
|
215
|
+
getPersonasMeta(): Promise<Record<string, ResolvedPersona>>;
|
|
216
|
+
getSystemRolesMeta(): Promise<SystemRoleDefinitionsMeta>;
|
|
220
217
|
getFeaturesMeta(): Promise<FeaturesMeta>;
|
|
221
218
|
getTriggerMeta(): Promise<TriggerMeta>;
|
|
222
219
|
getTriggerSourceMeta(): Promise<TriggerSourceMeta>;
|
|
@@ -2,10 +2,6 @@ import { readFile, readdir } from 'node:fs/promises';
|
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
3
|
import { createRequire } from 'node:module';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
|
-
/**
|
|
6
|
-
* Node.js filesystem implementation of MetaService.
|
|
7
|
-
* Reads .gen.json files from a local .pikku directory.
|
|
8
|
-
*/
|
|
9
5
|
export class LocalMetaService {
|
|
10
6
|
basePath;
|
|
11
7
|
httpMetaCache = null;
|
|
@@ -17,7 +13,8 @@ export class LocalMetaService {
|
|
|
17
13
|
gatewayMetaCache = null;
|
|
18
14
|
rpcMetaCache = null;
|
|
19
15
|
workflowMetaCache = null;
|
|
20
|
-
|
|
16
|
+
personasMetaCache = null;
|
|
17
|
+
systemRolesMetaCache = null;
|
|
21
18
|
featuresMetaCache = null;
|
|
22
19
|
triggerMetaCache = null;
|
|
23
20
|
triggerSourceMetaCache = null;
|
|
@@ -57,10 +54,7 @@ export class LocalMetaService {
|
|
|
57
54
|
return null;
|
|
58
55
|
}
|
|
59
56
|
}
|
|
60
|
-
//
|
|
61
|
-
// The addon packages have no main `exports` entry, so `require.resolve(pkg)`
|
|
62
|
-
// throws; instead we walk the node_modules search paths (anchored at the app
|
|
63
|
-
// root, one level above `.pikku`) and pick the first that contains the package.
|
|
57
|
+
// knowledge: decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md
|
|
64
58
|
packageRootCache = new Map();
|
|
65
59
|
resolvePackageRoot(packageName) {
|
|
66
60
|
const cached = this.packageRootCache.get(packageName);
|
|
@@ -115,7 +109,8 @@ export class LocalMetaService {
|
|
|
115
109
|
this.gatewayMetaCache = null;
|
|
116
110
|
this.rpcMetaCache = null;
|
|
117
111
|
this.workflowMetaCache = null;
|
|
118
|
-
this.
|
|
112
|
+
this.personasMetaCache = null;
|
|
113
|
+
this.systemRolesMetaCache = null;
|
|
119
114
|
this.featuresMetaCache = null;
|
|
120
115
|
this.triggerMetaCache = null;
|
|
121
116
|
this.triggerSourceMetaCache = null;
|
|
@@ -129,7 +124,6 @@ export class LocalMetaService {
|
|
|
129
124
|
this.agentsMetaCache = null;
|
|
130
125
|
this.schemaCache.clear();
|
|
131
126
|
}
|
|
132
|
-
// -- Private helpers --
|
|
133
127
|
async readMetaJson(dir, baseName) {
|
|
134
128
|
const verbose = await this.readFile(`${dir}/${baseName}-verbose.gen.json`);
|
|
135
129
|
if (verbose)
|
|
@@ -139,7 +133,6 @@ export class LocalMetaService {
|
|
|
139
133
|
return minimal;
|
|
140
134
|
return null;
|
|
141
135
|
}
|
|
142
|
-
// -- Typed metadata accessors --
|
|
143
136
|
async getHttpMeta() {
|
|
144
137
|
if (this.httpMetaCache)
|
|
145
138
|
return this.httpMetaCache;
|
|
@@ -248,9 +241,7 @@ export class LocalMetaService {
|
|
|
248
241
|
return this.workflowMetaCache;
|
|
249
242
|
try {
|
|
250
243
|
const result = {};
|
|
251
|
-
//
|
|
252
|
-
// imports them, but they are still workflows to anything reading meta off
|
|
253
|
-
// disk — the console's scenario list among them.
|
|
244
|
+
// knowledge: decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md
|
|
254
245
|
await Promise.all([
|
|
255
246
|
this.readWorkflowMetaDir('workflow/meta', result),
|
|
256
247
|
this.readWorkflowMetaDir('scenarios/meta', result),
|
|
@@ -264,12 +255,20 @@ export class LocalMetaService {
|
|
|
264
255
|
return this.workflowMetaCache;
|
|
265
256
|
}
|
|
266
257
|
}
|
|
267
|
-
async
|
|
268
|
-
if (this.
|
|
269
|
-
return this.
|
|
270
|
-
const content = await this.readFile('workflow/
|
|
271
|
-
this.
|
|
272
|
-
return this.
|
|
258
|
+
async getPersonasMeta() {
|
|
259
|
+
if (this.personasMetaCache)
|
|
260
|
+
return this.personasMetaCache;
|
|
261
|
+
const content = await this.readFile('workflow/personas.gen.json');
|
|
262
|
+
this.personasMetaCache = content ? JSON.parse(content) : {};
|
|
263
|
+
return this.personasMetaCache;
|
|
264
|
+
}
|
|
265
|
+
async getSystemRolesMeta() {
|
|
266
|
+
if (this.systemRolesMetaCache)
|
|
267
|
+
return this.systemRolesMetaCache;
|
|
268
|
+
// Beside the scopes it is composed from, which is where codegen writes it.
|
|
269
|
+
const content = await this.readFile('scopes/pikku-roles-meta.gen.json');
|
|
270
|
+
this.systemRolesMetaCache = content ? JSON.parse(content) : {};
|
|
271
|
+
return this.systemRolesMetaCache;
|
|
273
272
|
}
|
|
274
273
|
async getFeaturesMeta() {
|
|
275
274
|
if (this.featuresMetaCache)
|
|
@@ -297,8 +296,6 @@ export class LocalMetaService {
|
|
|
297
296
|
return this.functionsMetaCache;
|
|
298
297
|
const [content, scenarioContent] = await Promise.all([
|
|
299
298
|
this.readMetaJson('function', 'pikku-functions-meta'),
|
|
300
|
-
// Scenario steps register only into the scenario bootstrap, but they are
|
|
301
|
-
// still functions to anything reading meta off disk.
|
|
302
299
|
this.readMetaJson('scenarios', 'pikku-scenario-functions-meta'),
|
|
303
300
|
]);
|
|
304
301
|
this.functionsMetaCache = {
|
|
@@ -360,12 +357,7 @@ export class LocalMetaService {
|
|
|
360
357
|
return this.variablesMetaCache;
|
|
361
358
|
}
|
|
362
359
|
async getEmailMeta() {
|
|
363
|
-
//
|
|
364
|
-
// `pikku all`/`pikku emails generate` and is regenerated DURING a long-lived
|
|
365
|
-
// session (sandbox boots the orchestrator before the user project's codegen
|
|
366
|
-
// has written it). Caching here once returned an empty {templates:{}} that
|
|
367
|
-
// then stuck for the whole session, leaving the console emails screen blank
|
|
368
|
-
// even after the file appeared. A local JSON read is essentially free.
|
|
360
|
+
// knowledge: decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md
|
|
369
361
|
const content = await this.readFile('email/pikku-emails-meta.gen.json');
|
|
370
362
|
return content
|
|
371
363
|
? JSON.parse(content)
|
|
@@ -380,9 +372,7 @@ export class LocalMetaService {
|
|
|
380
372
|
if (!emailsMeta.src) {
|
|
381
373
|
throw new Error('No generated email metadata found. Run `pikku emails generate`.');
|
|
382
374
|
}
|
|
383
|
-
//
|
|
384
|
-
// Read directly rather than through readProjectFile (which prepends the project
|
|
385
|
-
// root and produces a wrong compound path when baseDir is absolute).
|
|
375
|
+
// knowledge: decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md
|
|
386
376
|
const baseDir = emailsMeta.src;
|
|
387
377
|
const readEmailFile = async (rel) => {
|
|
388
378
|
try {
|
|
@@ -409,10 +399,6 @@ export class LocalMetaService {
|
|
|
409
399
|
...(templateText ? [] : ['text']),
|
|
410
400
|
];
|
|
411
401
|
if (missing.length > 0) {
|
|
412
|
-
// Diagnostic for the intermittent "Missing source files" report: logs which
|
|
413
|
-
// process and which resolved baseDir saw the gap. Different pids across
|
|
414
|
-
// failures => multiple runtime workers with divergent cached `src`; same pid
|
|
415
|
-
// + transient absence => files being rewritten under us (e.g. regeneration).
|
|
416
402
|
console.warn(`[email-assets] pid=${process.pid} template=${templateName} locale=${locale} baseDir=${baseDir} missing=${missing.join(',')}`);
|
|
417
403
|
}
|
|
418
404
|
return {
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import type { ConverseOptions, ActorFlowVerdict } from '../wirings/actor-flow/actor-flow.types.js';
|
|
2
|
+
import type { PersonaMeta } from '../wirings/persona/persona.types.js';
|
|
3
|
+
/**
|
|
4
|
+
* What the transport answered, for a step that treats the status as data.
|
|
5
|
+
*
|
|
6
|
+
* An HTTP response with its body already drained: the stream can only be read
|
|
7
|
+
* once, and a step's return value crosses into the run record, so the response
|
|
8
|
+
* object itself cannot travel. This is the shape every caller ends up with.
|
|
9
|
+
*/
|
|
10
|
+
export interface ScenarioHttpResponse<T = unknown> {
|
|
11
|
+
status: number;
|
|
12
|
+
ok: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* The parsed JSON body — or, when the body was not JSON, the raw text it was
|
|
15
|
+
* parsed from, so an HTML error page is still readable rather than lost.
|
|
16
|
+
* `undefined` for an empty response.
|
|
17
|
+
*
|
|
18
|
+
* `T` is a claim the caller makes, not one the transport checked: a step that
|
|
19
|
+
* knows the route's payload names it here instead of casting at every use.
|
|
20
|
+
*/
|
|
21
|
+
body: T;
|
|
22
|
+
/**
|
|
23
|
+
* The whole body as text, so an assertion can search it without knowing the
|
|
24
|
+
* payload's shape — and so an error body that is HTML rather than JSON still
|
|
25
|
+
* says what went wrong.
|
|
26
|
+
*/
|
|
27
|
+
serialized: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Drain a response into the shape a step can carry: the parsed body (an empty
|
|
31
|
+
* one counting as no body at all) alongside the text it was parsed from.
|
|
32
|
+
*
|
|
33
|
+
* `invokeRaw` returns this, and a step that has to reach past a persona — a
|
|
34
|
+
* route with no RPC, an identity no persona can hold — reaches for this rather
|
|
35
|
+
* than writing the same record by hand.
|
|
36
|
+
*/
|
|
37
|
+
export declare const readScenarioHttpResponse: <T = unknown>(res: Response) => Promise<ScenarioHttpResponse<T>>;
|
|
38
|
+
/** How to send one JSON request, for `postScenarioJson`. */
|
|
39
|
+
export interface ScenarioJsonRequest {
|
|
40
|
+
/** Serialised as the JSON body. Omit for a request that carries none. */
|
|
41
|
+
body?: unknown;
|
|
42
|
+
/** Sent alongside `content-type: application/json`, and may override it. */
|
|
43
|
+
headers?: Record<string, string>;
|
|
44
|
+
/** Defaults to `POST` — the method every scenario route here answers. */
|
|
45
|
+
method?: string;
|
|
46
|
+
/**
|
|
47
|
+
* The `fetch` to send it with. Pass a `ScenarioCookieJar`'s to keep the
|
|
48
|
+
* session; the global `fetch` otherwise, which is what a step asserting on a
|
|
49
|
+
* sessionless call wants.
|
|
50
|
+
*/
|
|
51
|
+
fetch?: typeof fetch;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* POST JSON somewhere and report what came back, without throwing on a 4xx/5xx.
|
|
55
|
+
*
|
|
56
|
+
* Every scenario that reaches past a persona was writing this by hand — the same
|
|
57
|
+
* `content-type`, the same `JSON.stringify`, the same drain — and the copies had
|
|
58
|
+
* drifted: some returned `res.json()`, which loses the status and throws
|
|
59
|
+
* outright when the target answers an empty body or an HTML error page. A
|
|
60
|
+
* refusal is the expected outcome of a permissions scenario, so it has to
|
|
61
|
+
* survive as data.
|
|
62
|
+
*/
|
|
63
|
+
export declare const postScenarioJson: <T = unknown>(url: string, { body, headers, method, fetch: send, }?: ScenarioJsonRequest) => Promise<ScenarioHttpResponse<T>>;
|
|
64
|
+
/** Per-call transport options. */
|
|
65
|
+
export interface ScenarioInvokeOptions {
|
|
66
|
+
/**
|
|
67
|
+
* Headers to send alongside the persona's own session. This is how a step
|
|
68
|
+
* expresses an identity no declared persona can — an impersonation header, or
|
|
69
|
+
* one of the header-shim principals a credential scenario invents.
|
|
70
|
+
*/
|
|
71
|
+
headers?: Record<string, string>;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* The RPC surface a persona can reach, as name → input/output. A project binds
|
|
75
|
+
* its generated exposed RPC map here; the default leaves every name open, which
|
|
76
|
+
* is what a persona built by hand (or by a third-party driver) gets.
|
|
77
|
+
*/
|
|
78
|
+
export type ScenarioRpcMap = Record<string, {
|
|
79
|
+
input: any;
|
|
80
|
+
output: any;
|
|
81
|
+
}>;
|
|
82
|
+
/**
|
|
83
|
+
* The persona a step's `actor` slot carries, for a project whose personas are
|
|
84
|
+
* known. No declared personas keeps the open type rather than collapsing to
|
|
85
|
+
* `never` — a project may still build one itself.
|
|
86
|
+
*/
|
|
87
|
+
export type ScenarioPersonaOf<TPersonas> = [keyof TPersonas] extends [never] ? ScenarioPersona : TPersonas[keyof TPersonas];
|
|
88
|
+
/**
|
|
89
|
+
* A declared person, signed in and acting over the real transport.
|
|
90
|
+
*
|
|
91
|
+
* The runtime half of `definePersonas()`: sign-in materialises a user row
|
|
92
|
+
* flagged `actor: true`, and everything a step or a virtual user does goes
|
|
93
|
+
* through here.
|
|
94
|
+
*/
|
|
95
|
+
export interface ScenarioPersona<TAgentName extends string = string, TRpcMap extends ScenarioRpcMap = ScenarioRpcMap> {
|
|
96
|
+
/** The id it was declared under — what a step's `actor` slot names. */
|
|
97
|
+
readonly name: string;
|
|
98
|
+
/** Their address, computed from the id. Flows use it for invites/lookups. */
|
|
99
|
+
readonly email: string;
|
|
100
|
+
/** Invoke an exposed RPC as this person over the real transport. */
|
|
101
|
+
invoke<TName extends keyof TRpcMap & string>(rpcName: TName, data: TRpcMap[TName]['input']): Promise<TRpcMap[TName]['output']>;
|
|
102
|
+
/**
|
|
103
|
+
* The same call, reporting what the transport answered rather than throwing.
|
|
104
|
+
* A refusal is the expected outcome of a permissions or scopes scenario, and
|
|
105
|
+
* `invoke`'s error truncates the body that names which scope was missing.
|
|
106
|
+
*/
|
|
107
|
+
invokeRaw<TName extends keyof TRpcMap & string>(rpcName: TName, data: TRpcMap[TName]['input'], options?: ScenarioInvokeOptions): Promise<ScenarioHttpResponse>;
|
|
108
|
+
/** Converse with a Pikku AI agent in character and return its verdict. */
|
|
109
|
+
converse(options: ConverseOptions<TAgentName>): Promise<ActorFlowVerdict>;
|
|
110
|
+
/**
|
|
111
|
+
* The roles this person actually holds on the stage, read back after signing
|
|
112
|
+
* in — what a run compares against the declaration before its first step.
|
|
113
|
+
*
|
|
114
|
+
* `null` when the target does not say. That is not the same as "no roles": a
|
|
115
|
+
* run that treats silence as an empty list refuses to start against every
|
|
116
|
+
* stage whose auth reports roles somewhere else, so the caller must decide
|
|
117
|
+
* whether it can verify at all.
|
|
118
|
+
*/
|
|
119
|
+
sessionRoles(): Promise<string[] | null>;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* A declared persona with its address filled in — what codegen writes and what
|
|
123
|
+
* a seed, a scenario run and a virtual-user run all read.
|
|
124
|
+
*
|
|
125
|
+
* The address is not declared. It is derived from the persona's id and the
|
|
126
|
+
* project's persona domain, so two people can never accidentally share one and
|
|
127
|
+
* sign in as the same user row — which would silently collapse exactly the
|
|
128
|
+
* isolation scenarios a second person exists for.
|
|
129
|
+
*/
|
|
130
|
+
export type ResolvedPersona = PersonaMeta & {
|
|
131
|
+
email: string;
|
|
132
|
+
};
|
|
133
|
+
/** The injected `personas` service: persona id → persona. */
|
|
134
|
+
export type ScenarioPersonas = Record<string, ScenarioPersona>;
|