@pikku/core 0.12.72 → 0.12.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +793 -0
- package/dist/crypto-utils.d.ts +30 -5
- package/dist/crypto-utils.js +146 -41
- package/dist/dev/hot-reload.js +11 -30
- package/dist/dev/module-runner.d.ts +3 -7
- package/dist/dev/module-runner.js +4 -10
- package/dist/dev/reload-meta.d.ts +8 -20
- package/dist/dev/reload-meta.js +9 -29
- package/dist/errors/error-handler.d.ts +5 -30
- package/dist/errors/error-handler.js +16 -32
- package/dist/errors/errors.d.ts +32 -151
- package/dist/errors/errors.js +55 -157
- package/dist/function/abort-scope.d.ts +47 -0
- package/dist/function/abort-scope.js +63 -0
- package/dist/function/function-runner.js +37 -32
- package/dist/function/functions.types.d.ts +44 -136
- package/dist/function/functions.types.js +0 -58
- package/dist/function/list.types.d.ts +12 -62
- package/dist/function/list.types.js +4 -25
- package/dist/handle-error.d.ts +0 -13
- package/dist/handle-error.js +0 -18
- package/dist/index.d.ts +5 -2
- package/dist/index.js +4 -1
- package/dist/middleware/auth-apikey.d.ts +3 -18
- package/dist/middleware/auth-apikey.js +0 -17
- package/dist/middleware/auth-bearer.d.ts +6 -41
- package/dist/middleware/auth-bearer.js +3 -40
- package/dist/middleware/auth-cookie.d.ts +5 -27
- package/dist/middleware/auth-cookie.js +2 -26
- package/dist/middleware/cors.d.ts +7 -34
- package/dist/middleware/cors.js +7 -34
- package/dist/middleware/remote-auth.d.ts +3 -1
- package/dist/middleware/remote-auth.js +3 -2
- package/dist/middleware/telemetry.d.ts +8 -33
- package/dist/middleware/telemetry.js +2 -31
- package/dist/middleware-runner.d.ts +4 -55
- package/dist/middleware-runner.js +5 -74
- package/dist/permissions.d.ts +3 -44
- package/dist/permissions.js +19 -71
- package/dist/pikku-request.d.ts +0 -6
- package/dist/pikku-request.js +0 -6
- package/dist/pikku-state.d.ts +0 -26
- package/dist/pikku-state.js +2 -30
- package/dist/remote.d.ts +3 -5
- package/dist/remote.js +8 -7
- package/dist/schema.d.ts +5 -39
- package/dist/schema.js +5 -39
- package/dist/scopes.d.ts +4 -23
- package/dist/scopes.js +7 -48
- package/dist/services/ai-agent-runner-service.d.ts +20 -0
- package/dist/services/ai-embedding-service.d.ts +2 -25
- package/dist/services/audit-service.js +1 -2
- package/dist/services/content-service.d.ts +1 -46
- package/dist/services/credential-service.d.ts +3 -40
- package/dist/services/deployment-service.d.ts +3 -9
- package/dist/services/gateway-service.d.ts +0 -15
- package/dist/services/http-personas.d.ts +80 -0
- package/dist/services/http-personas.js +233 -0
- package/dist/services/in-memory-queue-service.d.ts +0 -14
- package/dist/services/in-memory-queue-service.js +1 -15
- package/dist/services/in-memory-trigger-service.d.ts +0 -18
- package/dist/services/in-memory-trigger-service.js +1 -18
- package/dist/services/in-memory-workflow-service.d.ts +0 -16
- package/dist/services/in-memory-workflow-service.js +4 -33
- package/dist/services/index.d.ts +5 -6
- package/dist/services/index.js +2 -5
- package/dist/services/istanbul-coverage-service.d.ts +1 -5
- package/dist/services/istanbul-coverage-service.js +2 -8
- package/dist/services/jwt-service.d.ts +1 -16
- package/dist/services/local-content.d.ts +13 -2
- package/dist/services/local-content.js +40 -13
- package/dist/services/local-gateway-service.d.ts +0 -16
- package/dist/services/local-gateway-service.js +2 -17
- package/dist/services/local-secrets.d.ts +0 -4
- package/dist/services/local-secrets.js +0 -4
- package/dist/services/logger-console.d.ts +3 -7
- package/dist/services/logger-console.js +3 -7
- package/dist/services/logger.d.ts +2 -37
- package/dist/services/meta-service.d.ts +23 -26
- package/dist/services/meta-service.js +22 -36
- package/dist/services/personas-service.d.ts +134 -0
- package/dist/services/personas-service.js +40 -0
- package/dist/services/pikku-user-id.js +0 -4
- package/dist/services/queue-webhook-service.d.ts +2 -36
- package/dist/services/queue-webhook-service.js +9 -41
- package/dist/services/scheduler-service.d.ts +1 -50
- package/dist/services/scheduler-service.js +0 -10
- package/dist/services/schema-service.d.ts +1 -24
- package/dist/services/scope-service.d.ts +49 -34
- package/dist/services/scoped-secret-service.d.ts +0 -4
- package/dist/services/scoped-secret-service.js +0 -4
- package/dist/services/secret-host-binding.d.ts +8 -0
- package/dist/services/secret-host-binding.js +36 -0
- package/dist/services/secret-service.d.ts +5 -33
- package/dist/services/secretless.d.ts +6 -0
- package/dist/services/secretless.js +21 -0
- package/dist/services/stub-tracker.d.ts +7 -18
- package/dist/services/stub-tracker.js +8 -18
- package/dist/services/system-role-guard.d.ts +33 -0
- package/dist/services/system-role-guard.js +38 -0
- package/dist/services/trigger-service.d.ts +0 -12
- package/dist/services/typed-secret-service.d.ts +0 -7
- package/dist/services/typed-secret-service.js +1 -7
- package/dist/services/v8-coverage-service.d.ts +2 -3
- package/dist/services/v8-coverage-service.js +1 -2
- package/dist/services/variables-service.d.ts +1 -8
- package/dist/services/webhook-service.d.ts +19 -63
- package/dist/services/webhook-service.js +6 -20
- package/dist/services/workflow-service.d.ts +3 -15
- package/dist/testing/service-tests.js +0 -17
- package/dist/time-utils.d.ts +0 -16
- package/dist/time-utils.js +1 -19
- package/dist/types/core.types.d.ts +99 -219
- package/dist/types/core.types.js +0 -42
- package/dist/types/state.types.d.ts +4 -9
- package/dist/utils/hmac.d.ts +4 -10
- package/dist/utils/hmac.js +4 -10
- package/dist/utils/safe-fetch.d.ts +7 -35
- package/dist/utils/safe-fetch.js +13 -53
- package/dist/utils.d.ts +1 -6
- package/dist/utils.js +6 -15
- package/dist/wirings/actor-flow/actor-flow.types.d.ts +1 -34
- package/dist/wirings/actor-flow/index.d.ts +0 -9
- package/dist/wirings/actor-flow/run-conversation.d.ts +5 -5
- package/dist/wirings/actor-flow/run-conversation.js +14 -7
- package/dist/wirings/ai-agent/ai-agent-agui.d.ts +0 -5
- package/dist/wirings/ai-agent/ai-agent-agui.js +34 -12
- package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +7 -0
- package/dist/wirings/ai-agent/ai-agent-helpers.js +7 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.d.ts +153 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.js +256 -0
- package/dist/wirings/ai-agent/ai-agent-memory.js +0 -2
- package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +0 -9
- package/dist/wirings/ai-agent/ai-agent-model-config.js +1 -9
- package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +10 -99
- package/dist/wirings/ai-agent/ai-agent-prepare.js +58 -131
- package/dist/wirings/ai-agent/ai-agent-registry.d.ts +2 -1
- package/dist/wirings/ai-agent/ai-agent-registry.js +5 -1
- package/dist/wirings/ai-agent/ai-agent-runner.js +49 -20
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +25 -2
- package/dist/wirings/ai-agent/ai-agent-stream.js +153 -63
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +84 -4
- package/dist/wirings/ai-agent/index.d.ts +6 -4
- package/dist/wirings/ai-agent/index.js +5 -4
- package/dist/wirings/ai-agent/voice-input.d.ts +39 -1
- package/dist/wirings/ai-agent/voice-input.js +46 -3
- package/dist/wirings/ai-agent/voice-output.d.ts +54 -1
- package/dist/wirings/ai-agent/voice-output.js +153 -50
- package/dist/wirings/channel/channel-common.d.ts +7 -20
- package/dist/wirings/channel/channel-common.js +7 -21
- package/dist/wirings/channel/channel-handler.js +25 -6
- package/dist/wirings/channel/channel-host-rpc.d.ts +25 -0
- package/dist/wirings/channel/channel-host-rpc.js +38 -0
- package/dist/wirings/channel/channel-middleware-runner.d.ts +0 -12
- package/dist/wirings/channel/channel-middleware-runner.js +0 -12
- package/dist/wirings/channel/channel-rpc-registry.d.ts +31 -0
- package/dist/wirings/channel/channel-rpc-registry.js +89 -0
- package/dist/wirings/channel/channel-rpc-responder.d.ts +15 -0
- package/dist/wirings/channel/channel-rpc-responder.js +71 -0
- package/dist/wirings/channel/channel-rpc-service.d.ts +40 -0
- package/dist/wirings/channel/channel-rpc-service.js +106 -0
- package/dist/wirings/channel/channel-rpc-validators.d.ts +14 -0
- package/dist/wirings/channel/channel-rpc-validators.js +30 -0
- package/dist/wirings/channel/channel-rpc.d.ts +5 -0
- package/dist/wirings/channel/channel-rpc.js +5 -0
- package/dist/wirings/channel/channel-rpc.types.d.ts +90 -0
- package/dist/wirings/channel/channel-rpc.types.js +50 -0
- package/dist/wirings/channel/channel-runner.d.ts +0 -4
- package/dist/wirings/channel/channel-runner.js +0 -14
- package/dist/wirings/channel/channel-store.d.ts +0 -10
- package/dist/wirings/channel/channel.types.d.ts +12 -1
- package/dist/wirings/channel/define-channel-routes.d.ts +0 -20
- package/dist/wirings/channel/define-channel-routes.js +0 -20
- package/dist/wirings/channel/eventhub-service.d.ts +0 -18
- package/dist/wirings/channel/index.d.ts +4 -1
- package/dist/wirings/channel/index.js +2 -0
- package/dist/wirings/channel/local/local-channel-runner.js +3 -1
- package/dist/wirings/channel/local/local-eventhub-service.d.ts +0 -33
- package/dist/wirings/channel/local/local-eventhub-service.js +2 -36
- package/dist/wirings/channel/log-channels.d.ts +0 -4
- package/dist/wirings/channel/log-channels.js +0 -4
- package/dist/wirings/channel/pikku-abstract-channel-handler.js +6 -0
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +2 -5
- package/dist/wirings/cli/channel/cli-approval.d.ts +41 -0
- package/dist/wirings/cli/channel/cli-approval.js +81 -0
- package/dist/wirings/cli/channel/cli-channel-runner.d.ts +0 -4
- package/dist/wirings/cli/channel/cli-channel-runner.js +3 -25
- package/dist/wirings/cli/channel/cli-raw-channel-runner.d.ts +47 -9
- package/dist/wirings/cli/channel/cli-raw-channel-runner.js +24 -16
- package/dist/wirings/cli/channel/cli-raw-client-runner.d.ts +20 -0
- package/dist/wirings/cli/channel/cli-raw-client-runner.js +121 -0
- package/dist/wirings/cli/channel/index.d.ts +4 -0
- package/dist/wirings/cli/channel/index.js +2 -0
- package/dist/wirings/cli/cli-runner.d.ts +20 -20
- package/dist/wirings/cli/cli-runner.js +28 -89
- package/dist/wirings/cli/cli.types.d.ts +14 -3
- package/dist/wirings/cli/command-parser.d.ts +1 -10
- package/dist/wirings/cli/command-parser.js +10 -87
- package/dist/wirings/cli/define-cli-commands.d.ts +1 -17
- package/dist/wirings/cli/define-cli-commands.js +1 -17
- package/dist/wirings/credential/credential.types.d.ts +0 -12
- package/dist/wirings/credential/define-credential.d.ts +48 -0
- package/dist/wirings/credential/define-credential.js +47 -0
- package/dist/wirings/credential/index.d.ts +1 -1
- package/dist/wirings/credential/index.js +1 -1
- package/dist/wirings/credential/validate-credential-definitions.d.ts +2 -4
- package/dist/wirings/gateway/gateway-runner.d.ts +1 -20
- package/dist/wirings/gateway/gateway-runner.js +8 -105
- package/dist/wirings/gateway/gateway.types.d.ts +7 -80
- package/dist/wirings/http/http-routes.d.ts +0 -63
- package/dist/wirings/http/http-routes.js +0 -63
- package/dist/wirings/http/http-runner.d.ts +0 -99
- package/dist/wirings/http/http-runner.js +9 -165
- package/dist/wirings/http/http.types.d.ts +14 -55
- package/dist/wirings/http/log-http-routes.d.ts +0 -4
- package/dist/wirings/http/log-http-routes.js +0 -4
- package/dist/wirings/http/pikku-fetch-http-request.d.ts +0 -40
- package/dist/wirings/http/pikku-fetch-http-request.js +0 -58
- package/dist/wirings/http/pikku-fetch-http-response.js +0 -3
- package/dist/wirings/http/routers/path-to-regex.js +2 -13
- package/dist/wirings/http/web-request.d.ts +0 -8
- package/dist/wirings/http/web-request.js +25 -17
- package/dist/wirings/mcp/mcp-runner.d.ts +1 -4
- package/dist/wirings/mcp/mcp-runner.js +1 -14
- package/dist/wirings/mcp/mcp.types.d.ts +2 -35
- package/dist/wirings/oauth2/oauth2.types.d.ts +0 -28
- package/dist/wirings/oauth2/oauth2.types.js +0 -3
- package/dist/wirings/persona/define-personas.d.ts +28 -0
- package/dist/wirings/persona/define-personas.js +27 -0
- package/dist/wirings/persona/index.d.ts +21 -0
- package/dist/wirings/persona/index.js +17 -0
- package/dist/wirings/persona/persona-email.d.ts +37 -0
- package/dist/wirings/persona/persona-email.js +69 -0
- package/dist/wirings/persona/persona-environments.d.ts +45 -0
- package/dist/wirings/persona/persona-environments.js +81 -0
- package/dist/wirings/persona/persona-mailbox.d.ts +101 -0
- package/dist/wirings/persona/persona-mailbox.js +53 -0
- package/dist/wirings/persona/persona.types.d.ts +125 -0
- package/dist/wirings/persona/persona.types.js +1 -0
- package/dist/wirings/persona/validate-personas.d.ts +53 -0
- package/dist/wirings/persona/validate-personas.js +94 -0
- package/dist/wirings/queue/index.d.ts +3 -0
- package/dist/wirings/queue/index.js +2 -3
- package/dist/wirings/queue/queue-identity.d.ts +28 -0
- package/dist/wirings/queue/queue-identity.js +102 -0
- package/dist/wirings/queue/queue-runner.d.ts +0 -19
- package/dist/wirings/queue/queue-runner.js +9 -30
- package/dist/wirings/queue/queue.types.d.ts +18 -89
- package/dist/wirings/queue/register-queue-helper.d.ts +0 -12
- package/dist/wirings/queue/register-queue-helper.js +0 -11
- package/dist/wirings/queue/signed-queue-service.d.ts +16 -0
- package/dist/wirings/queue/signed-queue-service.js +42 -0
- package/dist/wirings/queue/validate-worker-config.d.ts +2 -23
- package/dist/wirings/queue/validate-worker-config.js +0 -14
- package/dist/wirings/role/define-system-role.d.ts +32 -0
- package/dist/wirings/role/define-system-role.js +31 -0
- package/dist/wirings/role/index.d.ts +3 -0
- package/dist/wirings/role/index.js +2 -0
- package/dist/wirings/role/role.types.d.ts +43 -0
- package/dist/wirings/role/role.types.js +1 -0
- package/dist/wirings/role/validate-role-definitions.d.ts +21 -0
- package/dist/wirings/role/validate-role-definitions.js +71 -0
- package/dist/wirings/rpc/addon-runner.d.ts +0 -19
- package/dist/wirings/rpc/addon-runner.js +0 -51
- package/dist/wirings/rpc/remote-addon-auth.d.ts +1 -12
- package/dist/wirings/rpc/remote-addon-auth.js +1 -9
- package/dist/wirings/rpc/rpc-runner.d.ts +11 -18
- package/dist/wirings/rpc/rpc-runner.js +88 -105
- package/dist/wirings/rpc/rpc-types.d.ts +7 -6
- package/dist/wirings/rpc/wire-addon.d.ts +25 -0
- package/dist/wirings/rpc/wire-addon.js +62 -0
- package/dist/wirings/rpc/wire-remote-addon.d.ts +3 -28
- package/dist/wirings/rpc/wire-remote-addon.js +0 -8
- package/dist/wirings/scheduler/log-schedulers.d.ts +0 -4
- package/dist/wirings/scheduler/log-schedulers.js +0 -4
- package/dist/wirings/scheduler/scheduler-runner.d.ts +0 -1
- package/dist/wirings/scheduler/scheduler-runner.js +0 -1
- package/dist/wirings/scheduler/scheduler.types.d.ts +1 -14
- package/dist/wirings/scope/define-scope.d.ts +32 -0
- package/dist/wirings/scope/define-scope.js +31 -0
- package/dist/wirings/scope/index.d.ts +1 -1
- package/dist/wirings/scope/index.js +1 -1
- package/dist/wirings/scope/scope.types.d.ts +7 -9
- package/dist/wirings/scope/validate-scope-definitions.d.ts +2 -21
- package/dist/wirings/scope/validate-scope-definitions.js +3 -21
- package/dist/wirings/secret/index.d.ts +1 -1
- package/dist/wirings/secret/index.js +1 -1
- package/dist/wirings/secret/secret.types.d.ts +19 -15
- package/dist/wirings/secret/secret.types.js +1 -1
- package/dist/wirings/secret/validate-secret-definitions.d.ts +2 -4
- package/dist/wirings/trigger/trigger-runner.d.ts +0 -27
- package/dist/wirings/trigger/trigger-runner.js +1 -24
- package/dist/wirings/trigger/trigger.types.d.ts +1 -82
- package/dist/wirings/trigger/trigger.types.js +0 -34
- package/dist/wirings/variable/index.d.ts +1 -1
- package/dist/wirings/variable/index.js +1 -1
- package/dist/wirings/variable/validate-variable-definitions.d.ts +2 -4
- package/dist/wirings/variable/variable.types.d.ts +1 -13
- package/dist/wirings/variable/variable.types.js +1 -1
- package/dist/wirings/virtual-user/index.d.ts +27 -0
- package/dist/wirings/virtual-user/index.js +8 -0
- package/dist/wirings/virtual-user/run-virtual-user.d.ts +92 -0
- package/dist/wirings/virtual-user/run-virtual-user.js +478 -0
- package/dist/wirings/virtual-user/virtual-user-agents.d.ts +38 -0
- package/dist/wirings/virtual-user/virtual-user-agents.js +24 -0
- package/dist/wirings/virtual-user/virtual-user-catalogue.d.ts +92 -0
- package/dist/wirings/virtual-user/virtual-user-catalogue.js +134 -0
- package/dist/wirings/virtual-user/virtual-user-derive.d.ts +26 -0
- package/dist/wirings/virtual-user/virtual-user-derive.js +137 -0
- package/dist/wirings/virtual-user/virtual-user-dispositions.d.ts +79 -0
- package/dist/wirings/virtual-user/virtual-user-dispositions.js +128 -0
- package/dist/wirings/virtual-user/virtual-user-intents.d.ts +78 -0
- package/dist/wirings/virtual-user/virtual-user-intents.js +142 -0
- package/dist/wirings/virtual-user/virtual-user-rng.d.ts +24 -0
- package/dist/wirings/virtual-user/virtual-user-rng.js +44 -0
- package/dist/wirings/virtual-user/virtual-user-target.d.ts +21 -0
- package/dist/wirings/virtual-user/virtual-user-target.js +34 -0
- package/dist/wirings/virtual-user/virtual-user.types.d.ts +199 -0
- package/dist/wirings/virtual-user/virtual-user.types.js +8 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +5 -5
- package/dist/wirings/workflow/dsl/workflow-runner.d.ts +0 -4
- package/dist/wirings/workflow/dsl/workflow-runner.js +0 -4
- package/dist/wirings/workflow/feature.d.ts +0 -19
- package/dist/wirings/workflow/feature.js +0 -19
- package/dist/wirings/workflow/graph/graph-node.d.ts +0 -98
- package/dist/wirings/workflow/graph/graph-node.js +0 -34
- package/dist/wirings/workflow/graph/graph-runner.js +6 -41
- package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +0 -4
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -58
- package/dist/wirings/workflow/graph/workflow-graph.types.js +0 -6
- package/dist/wirings/workflow/index.d.ts +5 -7
- package/dist/wirings/workflow/index.js +3 -17
- package/dist/wirings/workflow/pikku-scenario-service.d.ts +87 -5
- package/dist/wirings/workflow/pikku-scenario-service.js +204 -42
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +7 -459
- package/dist/wirings/workflow/pikku-workflow-service.js +58 -551
- package/dist/wirings/workflow/run-timeline.d.ts +0 -47
- package/dist/wirings/workflow/run-timeline.js +0 -22
- package/dist/wirings/workflow/scenario-cookie-jar.d.ts +0 -23
- package/dist/wirings/workflow/scenario-cookie-jar.js +0 -16
- package/dist/wirings/workflow/scenario-poll.d.ts +0 -15
- package/dist/wirings/workflow/scenario-poll.js +0 -12
- package/dist/wirings/workflow/scenario-prose.d.ts +0 -28
- package/dist/wirings/workflow/scenario-prose.js +0 -18
- package/dist/wirings/workflow/scenario-step-guards.d.ts +0 -13
- package/dist/wirings/workflow/scenario-step-guards.js +1 -14
- package/dist/wirings/workflow/scenario-step.types.d.ts +72 -6
- package/dist/wirings/workflow/scenario-step.types.js +5 -1
- package/dist/wirings/workflow/scenario-surface.d.ts +16 -0
- package/dist/wirings/workflow/scenario-surface.js +56 -0
- package/dist/wirings/workflow/workflow-invocation-id.d.ts +0 -18
- package/dist/wirings/workflow/workflow-invocation-id.js +2 -22
- package/dist/wirings/workflow/workflow-queue-workers.d.ts +0 -20
- package/dist/wirings/workflow/workflow-queue-workers.js +0 -19
- package/dist/wirings/workflow/workflow.types.d.ts +0 -197
- package/knowledge/decisions/index.md +19 -0
- package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +49 -0
- package/knowledge/decisions/internals/actor-flow-conversations-seed-a-hidden-kickoff-message.md +23 -0
- package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md +24 -0
- package/knowledge/decisions/internals/actor-flow-verdicts-are-llm-self-evaluations.md +25 -0
- package/knowledge/decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md +26 -0
- package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +33 -0
- package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +28 -0
- package/knowledge/decisions/internals/ai-agent-agui-bridge-obeys-the-client-ordering-contract.md +29 -0
- package/knowledge/decisions/internals/ai-agent-audio-chunks-carry-the-format-the-provider-returned.md +20 -0
- package/knowledge/decisions/internals/ai-agent-credential-suspensions-hide-the-tool-result.md +26 -0
- package/knowledge/decisions/internals/ai-agent-delegate-and-supervise-hide-different-text.md +26 -0
- package/knowledge/decisions/internals/ai-agent-llm-tool-arguments-have-nulls-stripped.md +23 -0
- package/knowledge/decisions/internals/ai-agent-model-config-stays-a-single-resolution-seam.md +25 -0
- package/knowledge/decisions/internals/ai-agent-onerror-hooks-cannot-change-the-failure.md +22 -0
- package/knowledge/decisions/internals/ai-agent-runner-methods-must-keep-their-receiver.md +22 -0
- package/knowledge/decisions/internals/ai-agent-stream-persistence-is-best-effort.md +27 -0
- package/knowledge/decisions/internals/ai-agent-sub-agents-inherit-the-parent-context-block.md +26 -0
- package/knowledge/decisions/internals/ai-agent-tool-execute-failures-are-logged-unconditionally.md +25 -0
- package/knowledge/decisions/internals/ai-agent-voice-input-transcribes-audio-parts-in-place.md +22 -0
- package/knowledge/decisions/internals/ai-agent-working-memory-is-persisted-only-when-valid.md +25 -0
- package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +30 -0
- package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +31 -0
- package/knowledge/decisions/internals/channel-state-is-per-socket-session-state-is-per-user.md +29 -0
- package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +28 -0
- package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +27 -0
- package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +28 -0
- package/knowledge/decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md +34 -0
- package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +29 -0
- package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +34 -0
- package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +44 -0
- package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +39 -0
- package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +42 -0
- package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +39 -0
- package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +43 -0
- package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +38 -0
- package/knowledge/decisions/internals/core-state-is-a-global-map-written-only-at-registration-time.md +44 -0
- package/knowledge/decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md +27 -0
- package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +32 -0
- package/knowledge/decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md +28 -0
- package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +31 -0
- package/knowledge/decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md +26 -0
- package/knowledge/decisions/internals/http-request-bodies-are-read-once-and-shared.md +32 -0
- package/knowledge/decisions/internals/http-route-groups-cascade-config-in-a-fixed-order.md +28 -0
- package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +30 -0
- package/knowledge/decisions/internals/http-runner-logs-through-a-trace-scoped-logger-functions-do-not.md +26 -0
- package/knowledge/decisions/internals/http-set-cookie-headers-are-appended-never-joined.md +28 -0
- package/knowledge/decisions/internals/http-sse-streams-flush-headers-only-after-middleware.md +32 -0
- package/knowledge/decisions/internals/http-wiring-without-metadata-is-skipped-not-fatal.md +26 -0
- package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +25 -0
- package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +26 -0
- package/knowledge/decisions/internals/index.md +113 -0
- package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +25 -0
- package/knowledge/decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md +26 -0
- package/knowledge/decisions/internals/node-only-builtins-are-imported-dynamically.md +24 -0
- package/knowledge/decisions/internals/queue-group-concurrency-keeps-one-shared-queue-fair.md +28 -0
- package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +27 -0
- package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +31 -0
- package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +32 -0
- package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +27 -0
- package/knowledge/decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md +26 -0
- package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +27 -0
- package/knowledge/decisions/internals/scope-roots-may-be-co-declared-by-an-addon-and-its-host-app.md +30 -0
- package/knowledge/decisions/internals/serverless-channel-disconnect-must-tolerate-a-missing-channel.md +28 -0
- package/knowledge/decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md +30 -0
- package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +29 -0
- package/knowledge/decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md +27 -0
- package/knowledge/decisions/internals/the-kek-salt-is-scoped-to-the-key-version.md +40 -0
- package/knowledge/decisions/internals/the-schema-service-is-never-stubbed.md +26 -0
- package/knowledge/decisions/internals/trigger-declaration-is-split-from-trigger-source.md +33 -0
- package/knowledge/decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md +26 -0
- package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +26 -0
- package/knowledge/decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md +25 -0
- package/knowledge/decisions/internals/whether-a-run-is-inline-is-read-from-the-run-record.md +58 -0
- package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +34 -0
- package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +42 -0
- package/knowledge/decisions/internals/workflow-dsl-meta-separates-runtime-expressions-from-literals.md +38 -0
- package/knowledge/decisions/internals/workflow-features-resolve-scenarios-by-object-identity.md +29 -0
- package/knowledge/decisions/internals/workflow-graph-inline-and-queued-runs-share-one-planner.md +42 -0
- package/knowledge/decisions/internals/workflow-graph-node-notes-are-excluded-from-the-graph-hash.md +25 -0
- package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +29 -0
- package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +43 -0
- package/knowledge/decisions/internals/workflow-queued-step-dispatch-requires-an-explicit-opt-in.md +29 -0
- package/knowledge/decisions/internals/workflow-queues-are-per-workflow-by-default.md +42 -0
- package/knowledge/decisions/internals/workflow-repeated-step-names-get-an-ordinal-suffix.md +33 -0
- package/knowledge/decisions/internals/workflow-replay-reads-its-steps-once-and-caches-only-the-immutable-half.md +32 -0
- package/knowledge/decisions/internals/workflow-retries-are-owned-by-the-workflow-not-the-queue.md +31 -0
- package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +39 -0
- package/knowledge/decisions/internals/workflow-run-mirror-is-never-a-source-of-truth.md +29 -0
- package/knowledge/decisions/internals/workflow-run-polling-backs-off-to-the-callers-ceiling.md +33 -0
- package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +37 -0
- package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +50 -0
- package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +43 -0
- package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +32 -0
- package/knowledge/decisions/internals/workflow-scenario-quarantine-reason-lives-in-code.md +18 -0
- package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +34 -0
- package/knowledge/decisions/internals/workflow-step-compensation-runs-as-its-own-durable-step.md +26 -0
- package/knowledge/decisions/internals/workflow-step-dispatch-failure-is-transient-not-a-run-failure.md +33 -0
- package/knowledge/decisions/internals/workflow-step-lock-is-held-only-to-claim-the-step.md +27 -0
- package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +34 -0
- package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +38 -0
- package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +30 -0
- package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +26 -0
- package/knowledge/decisions/security/actor-flow-missing-approval-decisions-default-to-denied.md +22 -0
- package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +27 -0
- package/knowledge/decisions/security/actor-sign-in-only-works-for-actor-flagged-users.md +27 -0
- package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +43 -0
- package/knowledge/decisions/security/addon-config-gates-apply-only-at-the-namespaced-rpc-boundary.md +52 -0
- package/knowledge/decisions/security/addon-scopes-are-resolved-where-the-function-runs.md +46 -0
- package/knowledge/decisions/security/ai-agent-approval-forwarding-requires-a-symbol-brand.md +27 -0
- package/knowledge/decisions/security/ai-agent-credential-requests-are-symbol-branded.md +37 -0
- package/knowledge/decisions/security/ai-agent-gate-requires-a-session-only-when-auth-is-true.md +31 -0
- package/knowledge/decisions/security/ai-agent-ownership-failures-never-echo-the-resource.md +23 -0
- package/knowledge/decisions/security/ai-agent-resume-re-runs-the-authorization-gate.md +22 -0
- package/knowledge/decisions/security/ai-agent-sessionless-deployments-have-no-thread-ownership.md +39 -0
- package/knowledge/decisions/security/ai-agent-thread-ownership-composes-the-session-principal.md +30 -0
- package/knowledge/decisions/security/ai-agent-tool-filtering-reads-the-live-function-config.md +24 -0
- package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +30 -0
- package/knowledge/decisions/security/an-exposed-ungated-function-is-a-codegen-warning.md +49 -0
- package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +76 -0
- package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +39 -0
- package/knowledge/decisions/security/core-secrets-use-a-per-secret-dek-wrapped-by-a-kek.md +37 -0
- package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +31 -0
- package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +30 -0
- package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +40 -0
- package/knowledge/decisions/security/http-error-detail-is-withheld-from-clients-in-production.md +33 -0
- package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +46 -0
- package/knowledge/decisions/security/index.md +55 -0
- package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +27 -0
- package/knowledge/decisions/security/passphrases-are-stretched-key-material-is-expanded.md +40 -0
- package/knowledge/decisions/security/permission-auth-filtering-requires-live-permission-functions.md +31 -0
- package/knowledge/decisions/security/pikku-carries-actor-scopes-as-data-and-the-app-grants-them.md +26 -0
- package/knowledge/decisions/security/queue-job-identities-are-signed-at-enqueue.md +69 -0
- package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +39 -0
- package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +34 -0
- package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +49 -0
- package/knowledge/decisions/security/scenario-step-functions-are-never-externally-invocable.md +30 -0
- package/knowledge/decisions/security/scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md +28 -0
- package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +34 -0
- package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +37 -0
- package/knowledge/decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md +25 -0
- package/knowledge/decisions/security/workflow-actor-steps-always-use-the-real-transport.md +34 -0
- package/knowledge/decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md +40 -0
- package/knowledge/decisions/security/workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md +32 -0
- package/knowledge/decisions/security/workflow-scenario-sessions-are-isolated-per-actor-and-per-scenario.md +32 -0
- package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +31 -0
- package/knowledge/index.md +24 -0
- package/knowledge/questions/index.md +15 -0
- package/package.json +4 -1
- package/run-tests.sh +0 -0
- package/src/crypto-utils.test.ts +460 -19
- package/src/crypto-utils.ts +283 -55
- package/src/data-classification.ts +1 -7
- package/src/dev/hot-reload.test.ts +0 -4
- package/src/dev/hot-reload.ts +11 -30
- package/src/dev/module-runner.ts +7 -32
- package/src/dev/reload-meta.ts +9 -29
- package/src/errors/error-handler.ts +20 -35
- package/src/errors/error.test.ts +30 -1
- package/src/errors/errors.ts +73 -157
- package/src/function/abort-scope.test.ts +97 -0
- package/src/function/abort-scope.ts +80 -0
- package/src/function/function-runner.test.ts +0 -7
- package/src/function/function-runner.ts +62 -32
- package/src/function/functions.types.ts +56 -136
- package/src/function/list.types.test.ts +3 -25
- package/src/function/list.types.ts +12 -62
- package/src/handle-error.ts +0 -18
- package/src/index.ts +60 -1
- package/src/middleware/auth-apikey.test.ts +0 -1
- package/src/middleware/auth-apikey.ts +0 -17
- package/src/middleware/auth-bearer.test.ts +0 -3
- package/src/middleware/auth-bearer.ts +3 -40
- package/src/middleware/auth-cookie.test.ts +0 -6
- package/src/middleware/auth-cookie.ts +2 -26
- package/src/middleware/cors.test.ts +34 -0
- package/src/middleware/cors.ts +12 -33
- package/src/middleware/remote-auth.test.ts +24 -9
- package/src/middleware/remote-auth.ts +10 -2
- package/src/middleware/telemetry.ts +2 -31
- package/src/middleware-runner.test.ts +0 -2
- package/src/middleware-runner.ts +5 -74
- package/src/permissions.test.ts +30 -0
- package/src/permissions.ts +24 -74
- package/src/pikku-request.ts +0 -6
- package/src/pikku-state.ts +2 -30
- package/src/production-barrels-stay-lean.test.ts +110 -0
- package/src/remote.test.ts +172 -0
- package/src/remote.ts +17 -7
- package/src/schema.ts +5 -39
- package/src/scopes.ts +7 -48
- package/src/services/ai-agent-runner-service.ts +20 -0
- package/src/services/ai-embedding-service.ts +3 -25
- package/src/services/audit-service.ts +1 -2
- package/src/services/content-service.ts +1 -46
- package/src/services/credential-service.ts +3 -40
- package/src/services/credential-wire-service.test.ts +0 -2
- package/src/services/deployment-service.ts +3 -9
- package/src/services/gateway-service.ts +0 -15
- package/src/services/{http-scenario-actors-converse.test.ts → http-personas-converse.test.ts} +38 -9
- package/src/services/{http-scenario-actors.test.ts → http-personas.test.ts} +39 -22
- package/src/services/{http-scenario-actors.ts → http-personas.ts} +85 -45
- package/src/services/in-memory-queue-service.ts +1 -15
- package/src/services/in-memory-trigger-service.ts +1 -18
- package/src/services/in-memory-workflow-service.test.ts +0 -13
- package/src/services/in-memory-workflow-service.ts +4 -38
- package/src/services/index.ts +20 -15
- package/src/services/istanbul-coverage-service.ts +2 -8
- package/src/services/jwt-service.ts +1 -16
- package/src/services/local-content.test.ts +159 -27
- package/src/services/local-content.ts +55 -23
- package/src/services/local-gateway-service.ts +2 -17
- package/src/services/local-secrets.ts +0 -4
- package/src/services/logger-console.test.ts +0 -1
- package/src/services/logger-console.ts +3 -7
- package/src/services/logger.ts +2 -37
- package/src/services/meta-service.test.ts +1 -5
- package/src/services/meta-service.ts +41 -61
- package/src/services/{scenario-actors-service.ts → personas-service.ts} +48 -43
- package/src/services/pikku-user-id.ts +0 -4
- package/src/services/queue-webhook-service.ts +9 -41
- package/src/services/scheduler-service.ts +1 -50
- package/src/services/schema-service.ts +1 -24
- package/src/services/scope-service.ts +50 -34
- package/src/services/scoped-secret-service.ts +0 -4
- package/src/services/secret-host-binding.test.ts +138 -0
- package/src/services/secret-host-binding.ts +51 -0
- package/src/services/secret-service.ts +5 -33
- package/src/services/secretless.test.ts +54 -0
- package/src/services/secretless.ts +29 -0
- package/src/services/stub-tracker.ts +8 -18
- package/src/services/system-role-guard.test.ts +93 -0
- package/src/services/system-role-guard.ts +71 -0
- package/src/services/trigger-service.ts +0 -12
- package/src/services/typed-secret-service.ts +1 -7
- package/src/services/v8-coverage-service.ts +3 -6
- package/src/services/variables-service.ts +1 -8
- package/src/services/webhook-service.ts +19 -63
- package/src/services/workflow-service.ts +3 -20
- package/src/testing/service-tests.ts +0 -26
- package/src/time-utils.ts +1 -19
- package/src/types/core.types.ts +116 -229
- package/src/types/state.types.ts +7 -9
- package/src/utils/hmac.ts +4 -10
- package/src/utils/safe-fetch.ts +13 -54
- package/src/utils.test.ts +11 -2
- package/src/utils.ts +6 -15
- package/src/wirings/actor-flow/actor-flow.types.ts +1 -34
- package/src/wirings/actor-flow/index.ts +0 -9
- package/src/wirings/actor-flow/run-conversation.test.ts +11 -6
- package/src/wirings/actor-flow/run-conversation.ts +19 -12
- package/src/wirings/ai-agent/ai-agent-agui.test.ts +75 -10
- package/src/wirings/ai-agent/ai-agent-agui.ts +36 -17
- package/src/wirings/ai-agent/ai-agent-helpers.ts +20 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.test.ts +842 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.ts +399 -0
- package/src/wirings/ai-agent/ai-agent-memory.ts +0 -2
- package/src/wirings/ai-agent/ai-agent-model-config.ts +1 -9
- package/src/wirings/ai-agent/ai-agent-prepare.test.ts +202 -31
- package/src/wirings/ai-agent/ai-agent-prepare.ts +82 -138
- package/src/wirings/ai-agent/ai-agent-registry.test.ts +191 -6
- package/src/wirings/ai-agent/ai-agent-registry.ts +18 -1
- package/src/wirings/ai-agent/ai-agent-resume-authorization.test.ts +0 -2
- package/src/wirings/ai-agent/ai-agent-runner.test.ts +11 -9
- package/src/wirings/ai-agent/ai-agent-runner.ts +67 -33
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +205 -103
- package/src/wirings/ai-agent/ai-agent-stream.ts +192 -75
- package/src/wirings/ai-agent/ai-agent-thread-ownership.test.ts +301 -0
- package/src/wirings/ai-agent/ai-agent.types.ts +85 -4
- package/src/wirings/ai-agent/index.ts +35 -3
- package/src/wirings/ai-agent/voice-input.test.ts +72 -7
- package/src/wirings/ai-agent/voice-input.ts +48 -3
- package/src/wirings/ai-agent/voice-output.test.ts +422 -0
- package/src/wirings/ai-agent/voice-output.ts +216 -56
- package/src/wirings/channel/channel-common.ts +15 -20
- package/src/wirings/channel/channel-handler.test.ts +50 -0
- package/src/wirings/channel/channel-handler.ts +32 -11
- package/src/wirings/channel/channel-host-rpc.test.ts +150 -0
- package/src/wirings/channel/channel-host-rpc.ts +69 -0
- package/src/wirings/channel/channel-middleware-runner.test.ts +0 -1
- package/src/wirings/channel/channel-middleware-runner.ts +0 -12
- package/src/wirings/channel/channel-rpc-registry.ts +116 -0
- package/src/wirings/channel/channel-rpc-responder.ts +117 -0
- package/src/wirings/channel/channel-rpc-service.ts +146 -0
- package/src/wirings/channel/channel-rpc-validators.ts +65 -0
- package/src/wirings/channel/channel-rpc.test.ts +820 -0
- package/src/wirings/channel/channel-rpc.ts +5 -0
- package/src/wirings/channel/channel-rpc.types.ts +150 -0
- package/src/wirings/channel/channel-runner.ts +0 -14
- package/src/wirings/channel/channel-store.ts +0 -10
- package/src/wirings/channel/channel.types.ts +19 -8
- package/src/wirings/channel/define-channel-routes.ts +0 -20
- package/src/wirings/channel/eventhub-service.ts +0 -18
- package/src/wirings/channel/index.ts +35 -0
- package/src/wirings/channel/local/local-channel-handler.ts +3 -1
- package/src/wirings/channel/local/local-channel-runner.test.ts +0 -10
- package/src/wirings/channel/local/local-channel-runner.ts +3 -1
- package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -13
- package/src/wirings/channel/local/local-eventhub-service.ts +2 -37
- package/src/wirings/channel/log-channels.ts +0 -4
- package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +83 -2
- package/src/wirings/channel/pikku-abstract-channel-handler.ts +7 -0
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +2 -5
- package/src/wirings/cli/channel/cli-approval.test.ts +177 -0
- package/src/wirings/cli/channel/cli-approval.ts +135 -0
- package/src/wirings/cli/channel/cli-channel-runner.ts +4 -26
- package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +169 -0
- package/src/wirings/cli/channel/cli-raw-channel-runner.ts +59 -16
- package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +480 -0
- package/src/wirings/cli/channel/cli-raw-client-runner.ts +155 -0
- package/src/wirings/cli/channel/index.ts +9 -0
- package/src/wirings/cli/cli-runner.test.ts +0 -1
- package/src/wirings/cli/cli-runner.ts +46 -88
- package/src/wirings/cli/cli.types.ts +14 -3
- package/src/wirings/cli/command-parser.test.ts +0 -4
- package/src/wirings/cli/command-parser.ts +11 -91
- package/src/wirings/cli/define-cli-commands.ts +1 -17
- package/src/wirings/credential/credential.types.ts +0 -12
- package/src/wirings/credential/{wire-credential.ts → define-credential.ts} +7 -7
- package/src/wirings/credential/index.ts +1 -1
- package/src/wirings/credential/validate-credential-definitions.ts +2 -4
- package/src/wirings/gateway/gateway-runner.test.ts +1 -21
- package/src/wirings/gateway/gateway-runner.ts +8 -110
- package/src/wirings/gateway/gateway.types.ts +7 -80
- package/src/wirings/http/http-routes.test.ts +0 -3
- package/src/wirings/http/http-routes.ts +0 -86
- package/src/wirings/http/http-runner.test.ts +0 -1
- package/src/wirings/http/http-runner.ts +8 -167
- package/src/wirings/http/http.types.ts +15 -62
- package/src/wirings/http/log-http-routes.ts +0 -4
- package/src/wirings/http/pikku-fetch-http-request.test.ts +2 -10
- package/src/wirings/http/pikku-fetch-http-request.ts +0 -58
- package/src/wirings/http/pikku-fetch-http-response.test.ts +1 -1
- package/src/wirings/http/pikku-fetch-http-response.ts +0 -3
- package/src/wirings/http/routers/path-to-regex.test.ts +4 -17
- package/src/wirings/http/routers/path-to-regex.ts +2 -13
- package/src/wirings/http/web-request.test.ts +33 -2
- package/src/wirings/http/web-request.ts +30 -17
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -1
- package/src/wirings/mcp/mcp-runner.ts +2 -17
- package/src/wirings/mcp/mcp.types.ts +7 -42
- package/src/wirings/oauth2/oauth2.types.ts +0 -30
- package/src/wirings/persona/define-personas.ts +29 -0
- package/src/wirings/persona/index.ts +62 -0
- package/src/wirings/persona/persona-email.ts +87 -0
- package/src/wirings/persona/persona-environments.test.ts +183 -0
- package/src/wirings/persona/persona-environments.ts +138 -0
- package/src/wirings/persona/persona-mailbox.ts +156 -0
- package/src/wirings/persona/persona.test.ts +220 -0
- package/src/wirings/persona/persona.types.ts +131 -0
- package/src/wirings/persona/validate-personas.ts +133 -0
- package/src/wirings/queue/index.ts +13 -3
- package/src/wirings/queue/queue-identity.test.ts +453 -0
- package/src/wirings/queue/queue-identity.ts +173 -0
- package/src/wirings/queue/queue-runner.ts +12 -31
- package/src/wirings/queue/queue.types.ts +19 -89
- package/src/wirings/queue/register-queue-helper.ts +0 -14
- package/src/wirings/queue/signed-queue-service.ts +59 -0
- package/src/wirings/queue/validate-worker-config.ts +2 -28
- package/src/wirings/role/define-system-role.ts +33 -0
- package/src/wirings/role/index.ts +13 -0
- package/src/wirings/role/role.test.ts +104 -0
- package/src/wirings/role/role.types.ts +47 -0
- package/src/wirings/role/validate-role-definitions.ts +93 -0
- package/src/wirings/rpc/addon-auth-tags.test.ts +223 -0
- package/src/wirings/rpc/addon-runner.ts +0 -56
- package/src/wirings/rpc/addon-scopes.test.ts +225 -0
- package/src/wirings/rpc/remote-addon-auth.ts +1 -13
- package/src/wirings/rpc/rpc-runner.test.ts +186 -2
- package/src/wirings/rpc/rpc-runner.ts +145 -127
- package/src/wirings/rpc/rpc-types.ts +11 -6
- package/src/wirings/rpc/wire-addon.test.ts +43 -1
- package/src/wirings/rpc/wire-addon.ts +99 -0
- package/src/wirings/rpc/wire-remote-addon.ts +9 -29
- package/src/wirings/scheduler/log-schedulers.ts +0 -4
- package/src/wirings/scheduler/scheduler-runner.test.ts +1 -8
- package/src/wirings/scheduler/scheduler-runner.ts +0 -2
- package/src/wirings/scheduler/scheduler.types.ts +1 -14
- package/src/wirings/scope/{wire-scope.ts → define-scope.ts} +5 -6
- package/src/wirings/scope/index.ts +1 -1
- package/src/wirings/scope/scope.test.ts +1 -2
- package/src/wirings/scope/scope.types.ts +7 -9
- package/src/wirings/scope/validate-scope-definitions.ts +3 -21
- package/src/wirings/secret/index.ts +1 -1
- package/src/wirings/secret/secret.types.ts +19 -15
- package/src/wirings/secret/validate-secret-definitions.ts +2 -4
- package/src/wirings/trigger/trigger-runner.ts +1 -27
- package/src/wirings/trigger/trigger.types.ts +1 -82
- package/src/wirings/variable/index.ts +1 -1
- package/src/wirings/variable/validate-variable-definitions.ts +2 -4
- package/src/wirings/variable/variable.types.ts +1 -13
- package/src/wirings/virtual-user/index.ts +76 -0
- package/src/wirings/virtual-user/run-virtual-user.test.ts +765 -0
- package/src/wirings/virtual-user/run-virtual-user.ts +671 -0
- package/src/wirings/virtual-user/virtual-user-agents.test.ts +65 -0
- package/src/wirings/virtual-user/virtual-user-agents.ts +57 -0
- package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +215 -0
- package/src/wirings/virtual-user/virtual-user-catalogue.ts +184 -0
- package/src/wirings/virtual-user/virtual-user-derive.test.ts +398 -0
- package/src/wirings/virtual-user/virtual-user-derive.ts +173 -0
- package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +63 -0
- package/src/wirings/virtual-user/virtual-user-dispositions.ts +213 -0
- package/src/wirings/virtual-user/virtual-user-intents.test.ts +208 -0
- package/src/wirings/virtual-user/virtual-user-intents.ts +185 -0
- package/src/wirings/virtual-user/virtual-user-rng.test.ts +72 -0
- package/src/wirings/virtual-user/virtual-user-rng.ts +50 -0
- package/src/wirings/virtual-user/virtual-user-target.ts +47 -0
- package/src/wirings/virtual-user/virtual-user.types.ts +219 -0
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +5 -4
- package/src/wirings/workflow/dsl/workflow-runner.ts +0 -4
- package/src/wirings/workflow/feature.ts +0 -19
- package/src/wirings/workflow/graph/graph-node.ts +0 -136
- package/src/wirings/workflow/graph/graph-runner.test.ts +20 -19
- package/src/wirings/workflow/graph/graph-runner.ts +6 -41
- package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -4
- package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -58
- package/src/wirings/workflow/index.ts +10 -44
- package/src/wirings/workflow/pikku-scenario-service.ts +235 -52
- package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -39
- package/src/wirings/workflow/pikku-workflow-service.ts +77 -674
- package/src/wirings/workflow/run-timeline.test.ts +7 -19
- package/src/wirings/workflow/run-timeline.ts +0 -56
- package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -1
- package/src/wirings/workflow/scenario-cookie-jar.ts +0 -25
- package/src/wirings/workflow/scenario-expectations.test.ts +2 -7
- package/src/wirings/workflow/scenario-hooks.test.ts +2 -7
- package/src/wirings/workflow/scenario-poll.test.ts +0 -2
- package/src/wirings/workflow/scenario-poll.ts +0 -15
- package/src/wirings/workflow/scenario-prose.ts +0 -28
- package/src/wirings/workflow/scenario-service.test.ts +2 -9
- package/src/wirings/workflow/scenario-step-guards.ts +1 -14
- package/src/wirings/workflow/scenario-step.test.ts +159 -14
- package/src/wirings/workflow/scenario-step.types.ts +82 -6
- package/src/wirings/workflow/scenario-surface.test.ts +145 -0
- package/src/wirings/workflow/scenario-surface.ts +71 -0
- package/src/wirings/workflow/workflow-dispatch-durability.test.ts +14 -15
- package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -4
- package/src/wirings/workflow/workflow-inline-authority.test.ts +169 -0
- package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -2
- package/src/wirings/workflow/workflow-invocation-id.ts +2 -22
- package/src/wirings/workflow/workflow-mirror.test.ts +0 -7
- package/src/wirings/workflow/workflow-on-error.test.ts +0 -9
- package/src/wirings/workflow/workflow-queue-workers.ts +0 -21
- package/src/wirings/workflow/workflow-replay-snapshot.test.ts +8 -7
- package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -5
- package/src/wirings/workflow/workflow-run-context.test.ts +5 -10
- package/src/wirings/workflow/workflow-run-polling.test.ts +0 -5
- package/src/wirings/workflow/workflow-step-ordinal.test.ts +19 -4
- package/src/wirings/workflow/workflow-step-session.test.ts +0 -7
- package/src/wirings/workflow/workflow.types.ts +0 -203
- package/tsconfig.tsbuildinfo +1 -1
- package/src/middleware/timeout.ts +0 -22
- package/src/pikku-response.ts +0 -5
- package/src/wirings/mcp/mcp-endpoint-registry.test.d.ts +0 -1
- package/src/wirings/workflow/dsl/index.ts +0 -36
- package/src/wirings/workflow/graph/index.ts +0 -15
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Envelope actions for request/response RPC carried over an already-open
|
|
3
|
+
* channel. Both directions share one socket, so every frame is tagged and
|
|
4
|
+
* correlated by `id`.
|
|
5
|
+
*/
|
|
6
|
+
export const CHANNEL_RPC_REQUEST = 'pikku-rpc-request'
|
|
7
|
+
export const CHANNEL_RPC_RESPONSE = 'pikku-rpc-response'
|
|
8
|
+
export const CHANNEL_RPC_PENDING = 'pikku-rpc-pending'
|
|
9
|
+
|
|
10
|
+
export interface ChannelRPCRequest {
|
|
11
|
+
action: typeof CHANNEL_RPC_REQUEST
|
|
12
|
+
id: string
|
|
13
|
+
funcName: string
|
|
14
|
+
data: unknown
|
|
15
|
+
traceId?: string
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface ChannelRPCResponse {
|
|
19
|
+
action: typeof CHANNEL_RPC_RESPONSE
|
|
20
|
+
id: string
|
|
21
|
+
ok: boolean
|
|
22
|
+
result?: unknown
|
|
23
|
+
error?: { name: string; message: string }
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* "Still working on it — a human is being asked." Stops the caller's timeout,
|
|
28
|
+
* which otherwise fails any approval slower than it and then discards the
|
|
29
|
+
* answer when it arrives. Grants nothing: a peer that sends it dishonestly can
|
|
30
|
+
* only keep its own call waiting.
|
|
31
|
+
*/
|
|
32
|
+
export interface ChannelRPCPending {
|
|
33
|
+
action: typeof CHANNEL_RPC_PENDING
|
|
34
|
+
id: string
|
|
35
|
+
reason?: string
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const isRecord = (message: unknown): message is Record<string, unknown> =>
|
|
39
|
+
typeof message === 'object' && message !== null
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The guards check the whole envelope, not just the action tag: `id` is peer
|
|
43
|
+
* input and is used as a map key, so a frame carrying one of the wrong type
|
|
44
|
+
* must not reach `settle`.
|
|
45
|
+
*/
|
|
46
|
+
export const isChannelRPCRequest = (
|
|
47
|
+
message: unknown
|
|
48
|
+
): message is ChannelRPCRequest =>
|
|
49
|
+
isRecord(message) &&
|
|
50
|
+
message.action === CHANNEL_RPC_REQUEST &&
|
|
51
|
+
typeof message.id === 'string' &&
|
|
52
|
+
message.id.length > 0 &&
|
|
53
|
+
typeof message.funcName === 'string' &&
|
|
54
|
+
message.funcName.length > 0 &&
|
|
55
|
+
(message.traceId === undefined || typeof message.traceId === 'string')
|
|
56
|
+
|
|
57
|
+
export const isChannelRPCResponse = (
|
|
58
|
+
message: unknown
|
|
59
|
+
): message is ChannelRPCResponse =>
|
|
60
|
+
isRecord(message) &&
|
|
61
|
+
message.action === CHANNEL_RPC_RESPONSE &&
|
|
62
|
+
typeof message.id === 'string' &&
|
|
63
|
+
message.id.length > 0 &&
|
|
64
|
+
typeof message.ok === 'boolean'
|
|
65
|
+
|
|
66
|
+
export const isChannelRPCPending = (
|
|
67
|
+
message: unknown
|
|
68
|
+
): message is ChannelRPCPending =>
|
|
69
|
+
isRecord(message) &&
|
|
70
|
+
message.action === CHANNEL_RPC_PENDING &&
|
|
71
|
+
typeof message.id === 'string' &&
|
|
72
|
+
message.id.length > 0 &&
|
|
73
|
+
(message.reason === undefined || typeof message.reason === 'string')
|
|
74
|
+
|
|
75
|
+
/** `reason` exists so a dropped socket cannot look like a resolved call. */
|
|
76
|
+
export class ChannelRPCError extends Error {
|
|
77
|
+
constructor(
|
|
78
|
+
message: string,
|
|
79
|
+
public readonly reason:
|
|
80
|
+
| 'timeout'
|
|
81
|
+
| 'closed'
|
|
82
|
+
| 'remote'
|
|
83
|
+
| 'invalid'
|
|
84
|
+
| 'unsupported'
|
|
85
|
+
) {
|
|
86
|
+
super(message)
|
|
87
|
+
this.name = 'ChannelRPCError'
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Whether a callable exposed to a remote decider needs a human to agree before
|
|
93
|
+
* it runs, and how to describe the invocation while asking.
|
|
94
|
+
*
|
|
95
|
+
* Shared with `AIAgentToolDef`: both are an allowlist of named callables
|
|
96
|
+
* invoked by something other than the code that wrote them. The runtime around
|
|
97
|
+
* them is not shared — an agent suspends and resumes, a reverse call is a live
|
|
98
|
+
* await.
|
|
99
|
+
*/
|
|
100
|
+
export interface ApprovalPolicy {
|
|
101
|
+
needsApproval: boolean
|
|
102
|
+
approvalDescriptionFn?: (input: unknown) => Promise<string> | string
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export type CapabilityHandler = (data: any) => Promise<unknown> | unknown
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* `needsApproval` is required here on purpose. On `AIAgentToolDef` the same
|
|
109
|
+
* field is optional and absence means "do not ask"; here absence means the
|
|
110
|
+
* opposite, so it must not be expressible — a bare function is the
|
|
111
|
+
* unclassified form.
|
|
112
|
+
*/
|
|
113
|
+
export interface CapabilityDef extends ApprovalPolicy {
|
|
114
|
+
execute: CapabilityHandler
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export type Capability = CapabilityHandler | CapabilityDef
|
|
118
|
+
|
|
119
|
+
export type Capabilities = Record<string, Capability>
|
|
120
|
+
|
|
121
|
+
export const isCapabilityDef = (
|
|
122
|
+
capability: Capability
|
|
123
|
+
): capability is CapabilityDef =>
|
|
124
|
+
typeof capability === 'object' &&
|
|
125
|
+
capability !== null &&
|
|
126
|
+
typeof (capability as CapabilityDef).execute === 'function'
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* A bare function is unclassified, which resolves to needing approval:
|
|
130
|
+
* forgetting the annotation costs a prompt rather than costing a key.
|
|
131
|
+
*/
|
|
132
|
+
export const resolveCapability = (
|
|
133
|
+
capability: Capability
|
|
134
|
+
): { execute: CapabilityHandler } & ApprovalPolicy =>
|
|
135
|
+
isCapabilityDef(capability)
|
|
136
|
+
? capability
|
|
137
|
+
: { execute: capability, needsApproval: true }
|
|
138
|
+
|
|
139
|
+
/** Returning false refuses the call, and the peer is told so. */
|
|
140
|
+
export type ApprovalRequester = (request: {
|
|
141
|
+
funcName: string
|
|
142
|
+
data: unknown
|
|
143
|
+
description?: string
|
|
144
|
+
}) => Promise<boolean> | boolean
|
|
145
|
+
|
|
146
|
+
/** Checks one end of a call — arguments going out, or the answer coming back. */
|
|
147
|
+
export type ChannelRPCValidator = (
|
|
148
|
+
funcName: string,
|
|
149
|
+
value: unknown
|
|
150
|
+
) => Promise<void> | void
|
|
@@ -13,10 +13,6 @@ import type {
|
|
|
13
13
|
RunChannelParams,
|
|
14
14
|
} from './channel.types.js'
|
|
15
15
|
|
|
16
|
-
/**
|
|
17
|
-
* Adds a channel and registers all functions referenced in it using the
|
|
18
|
-
* function names already stored in the channel metadata
|
|
19
|
-
*/
|
|
20
16
|
export const wireChannel = <
|
|
21
17
|
In,
|
|
22
18
|
Channel extends string,
|
|
@@ -32,7 +28,6 @@ export const wireChannel = <
|
|
|
32
28
|
ChannelFunction
|
|
33
29
|
>
|
|
34
30
|
) => {
|
|
35
|
-
// Get the channel metadata
|
|
36
31
|
const channelsMeta = pikkuState(null, 'channel', 'meta')
|
|
37
32
|
const channelMeta = channelsMeta[channel.name]
|
|
38
33
|
if (!channelMeta) {
|
|
@@ -42,17 +37,14 @@ export const wireChannel = <
|
|
|
42
37
|
return
|
|
43
38
|
}
|
|
44
39
|
|
|
45
|
-
// Register onConnect function if provided
|
|
46
40
|
if (channel.onConnect && channelMeta.connect) {
|
|
47
41
|
addFunction(channelMeta.connect.pikkuFuncId, channel.onConnect as any)
|
|
48
42
|
}
|
|
49
43
|
|
|
50
|
-
// Register onDisconnect function if provided
|
|
51
44
|
if (channel.onDisconnect && channelMeta.disconnect) {
|
|
52
45
|
addFunction(channelMeta.disconnect.pikkuFuncId, channel.onDisconnect as any)
|
|
53
46
|
}
|
|
54
47
|
|
|
55
|
-
// Register onMessage function if provided
|
|
56
48
|
if (channel.onMessage && channelMeta.message?.pikkuFuncId) {
|
|
57
49
|
addFunction(
|
|
58
50
|
channelMeta.message.pikkuFuncId,
|
|
@@ -62,20 +54,15 @@ export const wireChannel = <
|
|
|
62
54
|
)
|
|
63
55
|
}
|
|
64
56
|
|
|
65
|
-
// Register functions in onMessageWiring
|
|
66
57
|
if (channel.onMessageWiring && channelMeta.messageWirings) {
|
|
67
|
-
// Iterate through each channel in onMessageWiring
|
|
68
58
|
Object.entries(channel.onMessageWiring).forEach(([channelKey, wirings]) => {
|
|
69
59
|
const channelWirings = channelMeta.messageWirings[channelKey]
|
|
70
60
|
if (!channelWirings) return
|
|
71
61
|
|
|
72
|
-
// Iterate through each wiring in the channel
|
|
73
62
|
Object.entries(wirings).forEach(([wiringKey, handler]) => {
|
|
74
63
|
const wiringMeta = channelWirings[wiringKey]
|
|
75
64
|
if (!wiringMeta) return
|
|
76
65
|
|
|
77
|
-
// Register the function using the pikku name from metadata
|
|
78
|
-
// It could be a FuncConfig or a wiring override with a funcConfig
|
|
79
66
|
addFunction(
|
|
80
67
|
wiringMeta.pikkuFuncId,
|
|
81
68
|
(handler as any).func instanceof Function
|
|
@@ -86,7 +73,6 @@ export const wireChannel = <
|
|
|
86
73
|
})
|
|
87
74
|
}
|
|
88
75
|
|
|
89
|
-
// Store the channel configuration
|
|
90
76
|
pikkuState(null, 'channel', 'channels').set(channel.name, channel as any)
|
|
91
77
|
}
|
|
92
78
|
|
|
@@ -24,16 +24,6 @@ export abstract class ChannelStore<
|
|
|
24
24
|
| Promise<TypedChannel & { pikkuUserId?: string }>
|
|
25
25
|
| (TypedChannel & { pikkuUserId?: string })
|
|
26
26
|
|
|
27
|
-
/**
|
|
28
|
-
* Persist per-socket scratch state scoped to a single channel (keyed by
|
|
29
|
-
* channelId). This is intentionally separate from `SessionStore` (which is
|
|
30
|
-
* keyed by `pikkuUserId` and holds the user session — shared across HTTP
|
|
31
|
-
* and channel transports).
|
|
32
|
-
*
|
|
33
|
-
* Use this for ephemeral, channel-local data: a per-socket subscription
|
|
34
|
-
* filter, a step in a connection-bound state machine, the last command sent
|
|
35
|
-
* on this socket, etc. It is cleared when the channel is removed.
|
|
36
|
-
*/
|
|
37
27
|
public abstract setState(
|
|
38
28
|
channelId: string,
|
|
39
29
|
state: unknown
|
|
@@ -138,23 +138,34 @@ export type CoreChannel<
|
|
|
138
138
|
tags?: string[]
|
|
139
139
|
}
|
|
140
140
|
|
|
141
|
-
|
|
142
|
-
|
|
141
|
+
/**
|
|
142
|
+
* The shape of `channel.remote` before generated types narrow it to the app's
|
|
143
|
+
* own functions. Loose on purpose: core cannot know the names.
|
|
144
|
+
*/
|
|
145
|
+
export type ChannelRemote = (funcName: string, data?: any) => Promise<any>
|
|
146
|
+
|
|
147
|
+
export interface PikkuChannel<
|
|
148
|
+
OpeningData,
|
|
149
|
+
out Out,
|
|
150
|
+
Remote extends (...args: any[]) => any = ChannelRemote,
|
|
151
|
+
> {
|
|
143
152
|
channelId: string
|
|
144
|
-
//
|
|
145
|
-
// or parameters in the url.
|
|
153
|
+
// Query parameters or url parameters the channel was created with.
|
|
146
154
|
openingData: OpeningData
|
|
147
|
-
//
|
|
155
|
+
// Fails once the stream has been closed.
|
|
148
156
|
send(data: Out, isBinary?: boolean): Promise<void> | void
|
|
149
157
|
sendBinary(data: BinaryData): Promise<void> | void
|
|
150
|
-
// This will close the channel.
|
|
151
158
|
close(): Promise<void> | void
|
|
152
|
-
// The current state of the channel
|
|
153
159
|
state: 'initial' | 'open' | 'closed'
|
|
154
|
-
// Per-socket ephemeral state scoped to this channel connection.
|
|
155
160
|
setState<T>(state: T): Promise<void> | void
|
|
156
161
|
getState<T>(): Promise<T | undefined> | T | undefined
|
|
157
162
|
clearState(): Promise<void> | void
|
|
163
|
+
/**
|
|
164
|
+
* Calls a function on the peer at the other end of this connection and waits
|
|
165
|
+
* for its answer — the only way to reach a peer with no address of its own.
|
|
166
|
+
* The peer decides what it answers to; an unregistered name is refused.
|
|
167
|
+
*/
|
|
168
|
+
remote: Remote
|
|
158
169
|
}
|
|
159
170
|
|
|
160
171
|
export interface PikkuChannelHandler<OpeningData = unknown, Out = unknown> {
|
|
@@ -1,23 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Type-safe helper for defining channel message routes that can be composed.
|
|
3
|
-
* Returns the routes record as-is (identity function) for use with `wireChannel`.
|
|
4
|
-
*
|
|
5
|
-
* @example
|
|
6
|
-
* ```typescript
|
|
7
|
-
* export const chatRoutes = defineChannelRoutes({
|
|
8
|
-
* greet: pikkuChannelFunc({ func: greetFunc }),
|
|
9
|
-
* farewell: pikkuChannelFunc({ func: farewellFunc }),
|
|
10
|
-
* })
|
|
11
|
-
*
|
|
12
|
-
* wireChannel({
|
|
13
|
-
* name: 'chat',
|
|
14
|
-
* route: '/ws/chat',
|
|
15
|
-
* onMessageWiring: {
|
|
16
|
-
* command: chatRoutes,
|
|
17
|
-
* }
|
|
18
|
-
* })
|
|
19
|
-
* ```
|
|
20
|
-
*/
|
|
21
1
|
export function defineChannelRoutes<T extends Record<string, any>>(
|
|
22
2
|
routes: T
|
|
23
3
|
): T {
|
|
@@ -1,30 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Interface defining the methods of a EventHub Service.
|
|
3
|
-
*/
|
|
4
1
|
export interface EventHubService<Topics extends Record<string, any>> {
|
|
5
|
-
/**
|
|
6
|
-
* Subscribes a connection to a specific topic.
|
|
7
|
-
* @param topic - The topic to subscribe to.
|
|
8
|
-
* @param channelId - The unique ID of the connection to subscribe.
|
|
9
|
-
*/
|
|
10
2
|
subscribe<T extends keyof Topics>(
|
|
11
3
|
topic: T,
|
|
12
4
|
channelId: string
|
|
13
5
|
): Promise<void> | void
|
|
14
|
-
/**
|
|
15
|
-
* Unsubscribes a connection from a specific topic.
|
|
16
|
-
* @param topic - The topic to unsubscribe from.
|
|
17
|
-
* @param channelId - The unique ID of the connection to unsubscribe.
|
|
18
|
-
*/
|
|
19
6
|
unsubscribe<T extends keyof Topics>(
|
|
20
7
|
topic: T,
|
|
21
8
|
channelId: string
|
|
22
9
|
): Promise<void> | void
|
|
23
|
-
/**
|
|
24
|
-
* Sends data to all connections subscribed to a topic.
|
|
25
|
-
* @param topic - The topic to send data to.
|
|
26
|
-
* @param data - The data to send to the subscribers.
|
|
27
|
-
*/
|
|
28
10
|
publish<T extends keyof Topics>(
|
|
29
11
|
topic: T,
|
|
30
12
|
channelId: string | null,
|
|
@@ -18,7 +18,42 @@ export type {
|
|
|
18
18
|
CorePikkuChannelMiddlewareFactory,
|
|
19
19
|
ChannelMessageMeta,
|
|
20
20
|
ChannelMeta,
|
|
21
|
+
ChannelRemote,
|
|
21
22
|
PikkuChannel,
|
|
22
23
|
PikkuChannelHandlerFactory,
|
|
23
24
|
} from './channel.types.js'
|
|
24
25
|
export { defineChannelRoutes } from './define-channel-routes.js'
|
|
26
|
+
export {
|
|
27
|
+
CHANNEL_RPC_PENDING,
|
|
28
|
+
CHANNEL_RPC_REQUEST,
|
|
29
|
+
CHANNEL_RPC_RESPONSE,
|
|
30
|
+
ChannelDeploymentService,
|
|
31
|
+
ChannelRPCError,
|
|
32
|
+
ChannelRPCRegistry,
|
|
33
|
+
createChannelRPCResponder,
|
|
34
|
+
createChannelRPCInputValidator,
|
|
35
|
+
createChannelRPCResultValidator,
|
|
36
|
+
isChannelRPCPending,
|
|
37
|
+
isChannelRPCRequest,
|
|
38
|
+
isChannelRPCResponse,
|
|
39
|
+
resolveCapability,
|
|
40
|
+
unsupportedChannelRemote,
|
|
41
|
+
} from './channel-rpc.js'
|
|
42
|
+
export type {
|
|
43
|
+
ApprovalPolicy,
|
|
44
|
+
ApprovalRequester,
|
|
45
|
+
Capabilities,
|
|
46
|
+
Capability,
|
|
47
|
+
CapabilityDef,
|
|
48
|
+
CapabilityHandler,
|
|
49
|
+
ChannelRPCPending,
|
|
50
|
+
ChannelRPCRequest,
|
|
51
|
+
ChannelRPCResponse,
|
|
52
|
+
ChannelRPCValidator,
|
|
53
|
+
} from './channel-rpc.js'
|
|
54
|
+
export {
|
|
55
|
+
channelRemote,
|
|
56
|
+
getChannelHostRPC,
|
|
57
|
+
handleChannelRPCResponse,
|
|
58
|
+
releaseChannelHostRPC,
|
|
59
|
+
} from './channel-host-rpc.js'
|
|
@@ -64,7 +64,9 @@ export class PikkuLocalChannelHandler<
|
|
|
64
64
|
return
|
|
65
65
|
}
|
|
66
66
|
super.close()
|
|
67
|
-
const results = await Promise.allSettled(
|
|
67
|
+
const results = await Promise.allSettled(
|
|
68
|
+
this.closeCallbacks.map((cb) => cb())
|
|
69
|
+
)
|
|
68
70
|
for (const result of results) {
|
|
69
71
|
if (result.status === 'rejected') {
|
|
70
72
|
this.logger?.error('Error in channel close callback:', result.reason)
|
|
@@ -14,11 +14,6 @@ import type { SerializeOptions } from 'cookie'
|
|
|
14
14
|
import { httpRouter } from '../../http/routers/http-router.js'
|
|
15
15
|
import { pikkuMiddleware } from '../../../types/core.types.js'
|
|
16
16
|
|
|
17
|
-
/**
|
|
18
|
-
* Minimal stubs for dependencies that runChannel expects.
|
|
19
|
-
* In a real test setup, you may provide more comprehensive mocks
|
|
20
|
-
* or refactor your code to allow dependency injection.
|
|
21
|
-
*/
|
|
22
17
|
const mockLogger = {
|
|
23
18
|
info: () => {},
|
|
24
19
|
error: () => {},
|
|
@@ -30,7 +25,6 @@ const mockSingletonServices = {
|
|
|
30
25
|
logger: mockLogger,
|
|
31
26
|
} as any
|
|
32
27
|
|
|
33
|
-
// Mock request and response objects
|
|
34
28
|
export class PikkuMockRequest implements PikkuHTTPRequest {
|
|
35
29
|
private _params: Record<string, string | string[] | undefined> = {}
|
|
36
30
|
|
|
@@ -93,7 +87,6 @@ export class PikkuMockResponse implements PikkuHTTPResponse {
|
|
|
93
87
|
throw new Error('Method not implemented.')
|
|
94
88
|
}
|
|
95
89
|
json(data: unknown): this {
|
|
96
|
-
// We don't need to implement this for our test
|
|
97
90
|
return this
|
|
98
91
|
}
|
|
99
92
|
redirect(location: string, status?: number): this {
|
|
@@ -134,7 +127,6 @@ test('runChannel should return undefined and 404 if no matching channel is found
|
|
|
134
127
|
'Should return undefined if no channel matches'
|
|
135
128
|
)
|
|
136
129
|
assert.equal(mockResponse._status, 404, 'Should set response status to 404')
|
|
137
|
-
// assert.equal(mockResponse._ended, true, 'Should end the response')
|
|
138
130
|
})
|
|
139
131
|
|
|
140
132
|
test('runChannel should return a channel handler if channel matches and no auth required', async () => {
|
|
@@ -156,7 +148,6 @@ test('runChannel should return a channel handler if channel matches and no auth
|
|
|
156
148
|
auth: false,
|
|
157
149
|
})
|
|
158
150
|
|
|
159
|
-
// Initialize router after adding channel (for tests)
|
|
160
151
|
httpRouter.initialize()
|
|
161
152
|
|
|
162
153
|
const result = await runLocalChannel({
|
|
@@ -168,7 +159,6 @@ test('runChannel should return a channel handler if channel matches and no auth
|
|
|
168
159
|
|
|
169
160
|
assert.ok(result, 'Should return a PikkuChannelHandler instance')
|
|
170
161
|
|
|
171
|
-
// Simulate opening the channel
|
|
172
162
|
result.open()
|
|
173
163
|
})
|
|
174
164
|
|
|
@@ -40,7 +40,7 @@ const runUpgradeMiddleware = async (
|
|
|
40
40
|
const wireInheritedMiddleware = httpGroups['*']
|
|
41
41
|
? [{ type: 'http' as const, route: '*' }]
|
|
42
42
|
: undefined
|
|
43
|
-
const middleware = combineMiddleware('channel',
|
|
43
|
+
const middleware = combineMiddleware('channel', 'upgrade', {
|
|
44
44
|
wireInheritedMiddleware,
|
|
45
45
|
})
|
|
46
46
|
|
|
@@ -158,6 +158,7 @@ export const runLocalChannel = async ({
|
|
|
158
158
|
channel,
|
|
159
159
|
data: openingData,
|
|
160
160
|
channelMiddlewareMeta: meta.channelMiddleware,
|
|
161
|
+
userSession,
|
|
161
162
|
})
|
|
162
163
|
if (result !== undefined) {
|
|
163
164
|
await channel.send(result)
|
|
@@ -186,6 +187,7 @@ export const runLocalChannel = async ({
|
|
|
186
187
|
services,
|
|
187
188
|
channel,
|
|
188
189
|
channelMiddlewareMeta: meta.channelMiddleware,
|
|
190
|
+
userSession,
|
|
189
191
|
})
|
|
190
192
|
} catch (e: any) {
|
|
191
193
|
singletonServices.logger.error(`Error handling onDisconnect: ${e}`)
|
|
@@ -15,7 +15,6 @@ class MockChannelHandler implements PikkuChannelHandler {
|
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
send(data: unknown, isBinary?: boolean) {
|
|
18
|
-
// Mock send functionality
|
|
19
18
|
console.log(`Sent to ${this.channelId}:`, { data, isBinary })
|
|
20
19
|
}
|
|
21
20
|
}
|
|
@@ -23,11 +22,9 @@ class MockChannelHandler implements PikkuChannelHandler {
|
|
|
23
22
|
test('LocalEventHubService: subscribe and unsubscribe', () => {
|
|
24
23
|
const eventHub = new LocalEventHubService()
|
|
25
24
|
|
|
26
|
-
// Subscribe a channel to a topic
|
|
27
25
|
eventHub.subscribe('topic1', 'channel1')
|
|
28
26
|
assert.strictEqual(eventHub['subscriptions'].get('topic1')!.size, 1)
|
|
29
27
|
|
|
30
|
-
// Unsubscribe the channel
|
|
31
28
|
eventHub.unsubscribe('topic1', 'channel1')
|
|
32
29
|
assert.strictEqual(eventHub['subscriptions'].has('topic1'), false)
|
|
33
30
|
})
|
|
@@ -35,17 +32,14 @@ test('LocalEventHubService: subscribe and unsubscribe', () => {
|
|
|
35
32
|
test('LocalEventHubService: publish messages', () => {
|
|
36
33
|
const eventHub = new LocalEventHubService()
|
|
37
34
|
|
|
38
|
-
// Register mock channels
|
|
39
35
|
const channel1 = new MockChannelHandler('channel1')
|
|
40
36
|
const channel2 = new MockChannelHandler('channel2')
|
|
41
37
|
eventHub.onChannelOpened(channel1)
|
|
42
38
|
eventHub.onChannelOpened(channel2)
|
|
43
39
|
|
|
44
|
-
// Subscribe channels to a topic
|
|
45
40
|
eventHub.subscribe('topic1', 'channel1')
|
|
46
41
|
eventHub.subscribe('topic1', 'channel2')
|
|
47
42
|
|
|
48
|
-
// Mock `send` method to track calls
|
|
49
43
|
let sendCallCount = 0
|
|
50
44
|
channel1.send = () => {
|
|
51
45
|
sendCallCount++
|
|
@@ -54,22 +48,18 @@ test('LocalEventHubService: publish messages', () => {
|
|
|
54
48
|
sendCallCount++
|
|
55
49
|
}
|
|
56
50
|
|
|
57
|
-
// Publish a message
|
|
58
51
|
eventHub.publish('topic1', 'channel1', { message: 'Hello!' })
|
|
59
52
|
|
|
60
|
-
// Ensure the message was sent only to channel2
|
|
61
53
|
assert.strictEqual(sendCallCount, 1)
|
|
62
54
|
})
|
|
63
55
|
|
|
64
56
|
test('LocalEventHubService: onChannelOpened and onChannelClosed', () => {
|
|
65
57
|
const eventHub = new LocalEventHubService()
|
|
66
58
|
|
|
67
|
-
// Register and verify channel
|
|
68
59
|
const channel1 = new MockChannelHandler('channel1')
|
|
69
60
|
eventHub.onChannelOpened(channel1)
|
|
70
61
|
assert.strictEqual(eventHub['channels'].has('channel1'), true)
|
|
71
62
|
|
|
72
|
-
// Close and verify removal
|
|
73
63
|
eventHub.onChannelClosed('channel1')
|
|
74
64
|
assert.strictEqual(eventHub['channels'].has('channel1'), false)
|
|
75
65
|
})
|
|
@@ -77,14 +67,11 @@ test('LocalEventHubService: onChannelOpened and onChannelClosed', () => {
|
|
|
77
67
|
test('LocalEventHubService: clean up empty topics on channel close', () => {
|
|
78
68
|
const eventHub = new LocalEventHubService()
|
|
79
69
|
|
|
80
|
-
// Register and subscribe channels
|
|
81
70
|
const channel1 = new MockChannelHandler('channel1')
|
|
82
71
|
eventHub.onChannelOpened(channel1)
|
|
83
72
|
eventHub.subscribe('topic1', 'channel1')
|
|
84
73
|
|
|
85
|
-
// Close channel
|
|
86
74
|
eventHub.onChannelClosed('channel1')
|
|
87
75
|
|
|
88
|
-
// Ensure topic1 is removed
|
|
89
76
|
assert.strictEqual(eventHub['subscriptions'].has('topic1'), false)
|
|
90
77
|
})
|
|
@@ -1,26 +1,12 @@
|
|
|
1
1
|
import type { PikkuChannelHandler } from '../channel.types.js'
|
|
2
2
|
import type { EventHubService } from '../eventhub-service.js'
|
|
3
3
|
|
|
4
|
-
/**
|
|
5
|
-
* Implementation of the SubscriptionService interface.
|
|
6
|
-
* Manages subscriptions and publishes messages to subscribers.
|
|
7
|
-
*/
|
|
8
4
|
export class LocalEventHubService<
|
|
9
5
|
Data extends Record<string, any> = {},
|
|
10
6
|
> implements EventHubService<Data> {
|
|
11
7
|
private channels = new Map<string, PikkuChannelHandler>()
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* A map storing topics and their associated connection IDs.
|
|
15
|
-
*/
|
|
16
8
|
private subscriptions: Map<keyof Data, Set<string>> = new Map()
|
|
17
9
|
|
|
18
|
-
/**
|
|
19
|
-
* Subscribes a connection to a specific topic.
|
|
20
|
-
* Creates the topic if it does not already exist.
|
|
21
|
-
* @param topic - The topic to subscribe to.
|
|
22
|
-
* @param channelId - The unique ID of the connection to subscribe.
|
|
23
|
-
*/
|
|
24
10
|
public subscribe<T extends keyof Data>(
|
|
25
11
|
topic: T,
|
|
26
12
|
channelId: string
|
|
@@ -31,12 +17,6 @@ export class LocalEventHubService<
|
|
|
31
17
|
this.subscriptions.get(topic)!.add(channelId)
|
|
32
18
|
}
|
|
33
19
|
|
|
34
|
-
/**
|
|
35
|
-
* Unsubscribes a connection from a specific topic.
|
|
36
|
-
* Removes the topic if it has no more subscribers.
|
|
37
|
-
* @param topic - The topic to unsubscribe from.
|
|
38
|
-
* @param channelId - The unique ID of the connection to unsubscribe.
|
|
39
|
-
*/
|
|
40
20
|
public unsubscribe<T extends keyof Data>(
|
|
41
21
|
topic: T,
|
|
42
22
|
channelId: string
|
|
@@ -50,11 +30,6 @@ export class LocalEventHubService<
|
|
|
50
30
|
}
|
|
51
31
|
}
|
|
52
32
|
|
|
53
|
-
/**
|
|
54
|
-
* Sends data to all connections subscribed to a topic.
|
|
55
|
-
* @param topic - The topic to send data to.
|
|
56
|
-
* @param data - The data to send to the subscribers.
|
|
57
|
-
*/
|
|
58
33
|
public publish<T extends keyof Data>(
|
|
59
34
|
topic: T,
|
|
60
35
|
channelId: string | null,
|
|
@@ -66,37 +41,27 @@ export class LocalEventHubService<
|
|
|
66
41
|
return
|
|
67
42
|
}
|
|
68
43
|
for (const toChannelId of subscribedChannelIds) {
|
|
69
|
-
if (channelId === toChannelId) continue
|
|
44
|
+
if (channelId === toChannelId) continue
|
|
70
45
|
const channel = this.channels.get(toChannelId)
|
|
71
46
|
if (channel) {
|
|
72
47
|
try {
|
|
73
48
|
channel.send(data, isBinary)
|
|
74
49
|
} catch {
|
|
75
|
-
// Channel closed (e.g. SSE ReadableStream controller already closed on browser disconnect) — clean up
|
|
76
50
|
this.onChannelClosed(toChannelId)
|
|
77
51
|
}
|
|
78
52
|
}
|
|
79
53
|
}
|
|
80
54
|
}
|
|
81
55
|
|
|
82
|
-
/**
|
|
83
|
-
* Registers a channel on open
|
|
84
|
-
*/
|
|
85
56
|
public onChannelOpened(channelHandler: PikkuChannelHandler): void {
|
|
86
57
|
this.channels.set(channelHandler.getChannel().channelId, channelHandler)
|
|
87
58
|
}
|
|
88
59
|
|
|
89
|
-
/**
|
|
90
|
-
* Handles cleanup when a channel is closed.
|
|
91
|
-
* Removes the channel from all topics it is subscribed to.
|
|
92
|
-
* Deletes the topic if no more channels are subscribed to it.
|
|
93
|
-
* @param channelId - The ID of the channel that was closed.
|
|
94
|
-
*/
|
|
95
60
|
public onChannelClosed(channelId: string): void {
|
|
96
61
|
for (const [topic, channelIds] of this.subscriptions.entries()) {
|
|
97
62
|
channelIds.delete(channelId)
|
|
98
63
|
if (channelIds.size === 0) {
|
|
99
|
-
this.subscriptions.delete(topic)
|
|
64
|
+
this.subscriptions.delete(topic)
|
|
100
65
|
}
|
|
101
66
|
}
|
|
102
67
|
this.channels.delete(channelId)
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import { pikkuState } from '../../pikku-state.js'
|
|
2
2
|
import type { Logger } from '../../services/index.js'
|
|
3
3
|
|
|
4
|
-
/**
|
|
5
|
-
* Logs all the loaded channels.
|
|
6
|
-
* @param logger - A logger for logging information.
|
|
7
|
-
*/
|
|
8
4
|
export const logChannels = (logger: Logger) => {
|
|
9
5
|
const channels = pikkuState(null, 'channel', 'channels')
|
|
10
6
|
if (channels.size === 0) {
|