@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
|
@@ -69,7 +69,12 @@ export type CoreChannel<ChannelData, Channel extends string, ChannelConnect = Co
|
|
|
69
69
|
onBinaryMessage?: (services: any, data: BinaryData, channel: PikkuChannel<ChannelData, any>) => Promise<BinaryData | void> | BinaryData | void;
|
|
70
70
|
tags?: string[];
|
|
71
71
|
};
|
|
72
|
-
|
|
72
|
+
/**
|
|
73
|
+
* The shape of `channel.remote` before generated types narrow it to the app's
|
|
74
|
+
* own functions. Loose on purpose: core cannot know the names.
|
|
75
|
+
*/
|
|
76
|
+
export type ChannelRemote = (funcName: string, data?: any) => Promise<any>;
|
|
77
|
+
export interface PikkuChannel<OpeningData, out Out, Remote extends (...args: any[]) => any = ChannelRemote> {
|
|
73
78
|
channelId: string;
|
|
74
79
|
openingData: OpeningData;
|
|
75
80
|
send(data: Out, isBinary?: boolean): Promise<void> | void;
|
|
@@ -79,6 +84,12 @@ export interface PikkuChannel<OpeningData, out Out> {
|
|
|
79
84
|
setState<T>(state: T): Promise<void> | void;
|
|
80
85
|
getState<T>(): Promise<T | undefined> | T | undefined;
|
|
81
86
|
clearState(): Promise<void> | void;
|
|
87
|
+
/**
|
|
88
|
+
* Calls a function on the peer at the other end of this connection and waits
|
|
89
|
+
* for its answer — the only way to reach a peer with no address of its own.
|
|
90
|
+
* The peer decides what it answers to; an unregistered name is refused.
|
|
91
|
+
*/
|
|
92
|
+
remote: Remote;
|
|
82
93
|
}
|
|
83
94
|
export interface PikkuChannelHandler<OpeningData = unknown, Out = unknown> {
|
|
84
95
|
send(message: Out, isBinary?: boolean): Promise<void> | void;
|
|
@@ -1,21 +1 @@
|
|
|
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 declare function defineChannelRoutes<T extends Record<string, any>>(routes: T): T;
|
|
@@ -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(routes) {
|
|
22
2
|
return routes;
|
|
23
3
|
}
|
|
@@ -1,23 +1,5 @@
|
|
|
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>(topic: T, channelId: string): Promise<void> | void;
|
|
11
|
-
/**
|
|
12
|
-
* Unsubscribes a connection from a specific topic.
|
|
13
|
-
* @param topic - The topic to unsubscribe from.
|
|
14
|
-
* @param channelId - The unique ID of the connection to unsubscribe.
|
|
15
|
-
*/
|
|
16
3
|
unsubscribe<T extends keyof Topics>(topic: T, channelId: string): Promise<void> | void;
|
|
17
|
-
/**
|
|
18
|
-
* Sends data to all connections subscribed to a topic.
|
|
19
|
-
* @param topic - The topic to send data to.
|
|
20
|
-
* @param data - The data to send to the subscribers.
|
|
21
|
-
*/
|
|
22
4
|
publish<T extends keyof Topics>(topic: T, channelId: string | null, data: Topics[T], isBinary?: boolean): Promise<void> | void;
|
|
23
5
|
}
|
|
@@ -6,5 +6,8 @@ export type { EventHubService } from './eventhub-service.js';
|
|
|
6
6
|
export { ChannelStore } from './channel-store.js';
|
|
7
7
|
export type { Channel } from './channel-store.js';
|
|
8
8
|
export { EventHubStore } from './eventhub-store.js';
|
|
9
|
-
export type { BinaryData, ChannelsMeta, CoreChannel, CorePikkuChannelMiddleware, CorePikkuChannelMiddlewareFactory, ChannelMessageMeta, ChannelMeta, PikkuChannel, PikkuChannelHandlerFactory, } from './channel.types.js';
|
|
9
|
+
export type { BinaryData, ChannelsMeta, CoreChannel, CorePikkuChannelMiddleware, CorePikkuChannelMiddlewareFactory, ChannelMessageMeta, ChannelMeta, ChannelRemote, PikkuChannel, PikkuChannelHandlerFactory, } from './channel.types.js';
|
|
10
10
|
export { defineChannelRoutes } from './define-channel-routes.js';
|
|
11
|
+
export { CHANNEL_RPC_PENDING, CHANNEL_RPC_REQUEST, CHANNEL_RPC_RESPONSE, ChannelDeploymentService, ChannelRPCError, ChannelRPCRegistry, createChannelRPCResponder, createChannelRPCInputValidator, createChannelRPCResultValidator, isChannelRPCPending, isChannelRPCRequest, isChannelRPCResponse, resolveCapability, unsupportedChannelRemote, } from './channel-rpc.js';
|
|
12
|
+
export type { ApprovalPolicy, ApprovalRequester, Capabilities, Capability, CapabilityDef, CapabilityHandler, ChannelRPCPending, ChannelRPCRequest, ChannelRPCResponse, ChannelRPCValidator, } from './channel-rpc.js';
|
|
13
|
+
export { channelRemote, getChannelHostRPC, handleChannelRPCResponse, releaseChannelHostRPC, } from './channel-host-rpc.js';
|
|
@@ -5,3 +5,5 @@ export { PikkuAbstractChannelHandler } from './pikku-abstract-channel-handler.js
|
|
|
5
5
|
export { ChannelStore } from './channel-store.js';
|
|
6
6
|
export { EventHubStore } from './eventhub-store.js';
|
|
7
7
|
export { defineChannelRoutes } from './define-channel-routes.js';
|
|
8
|
+
export { CHANNEL_RPC_PENDING, CHANNEL_RPC_REQUEST, CHANNEL_RPC_RESPONSE, ChannelDeploymentService, ChannelRPCError, ChannelRPCRegistry, createChannelRPCResponder, createChannelRPCInputValidator, createChannelRPCResultValidator, isChannelRPCPending, isChannelRPCRequest, isChannelRPCResponse, resolveCapability, unsupportedChannelRemote, } from './channel-rpc.js';
|
|
9
|
+
export { channelRemote, getChannelHostRPC, handleChannelRPCResponse, releaseChannelHostRPC, } from './channel-host-rpc.js';
|
|
@@ -16,7 +16,7 @@ const runUpgradeMiddleware = async (singletonServices, request, response, userSe
|
|
|
16
16
|
const wireInheritedMiddleware = httpGroups['*']
|
|
17
17
|
? [{ type: 'http', route: '*' }]
|
|
18
18
|
: undefined;
|
|
19
|
-
const middleware = combineMiddleware('channel',
|
|
19
|
+
const middleware = combineMiddleware('channel', 'upgrade', {
|
|
20
20
|
wireInheritedMiddleware,
|
|
21
21
|
});
|
|
22
22
|
if (middleware.length > 0) {
|
|
@@ -88,6 +88,7 @@ export const runLocalChannel = async ({ channelId, request, response, route, ski
|
|
|
88
88
|
channel,
|
|
89
89
|
data: openingData,
|
|
90
90
|
channelMiddlewareMeta: meta.channelMiddleware,
|
|
91
|
+
userSession,
|
|
91
92
|
});
|
|
92
93
|
if (result !== undefined) {
|
|
93
94
|
await channel.send(result);
|
|
@@ -115,6 +116,7 @@ export const runLocalChannel = async ({ channelId, request, response, route, ski
|
|
|
115
116
|
services,
|
|
116
117
|
channel,
|
|
117
118
|
channelMiddlewareMeta: meta.channelMiddleware,
|
|
119
|
+
userSession,
|
|
118
120
|
});
|
|
119
121
|
}
|
|
120
122
|
catch (e) {
|
|
@@ -1,44 +1,11 @@
|
|
|
1
1
|
import type { PikkuChannelHandler } from '../channel.types.js';
|
|
2
2
|
import type { EventHubService } from '../eventhub-service.js';
|
|
3
|
-
/**
|
|
4
|
-
* Implementation of the SubscriptionService interface.
|
|
5
|
-
* Manages subscriptions and publishes messages to subscribers.
|
|
6
|
-
*/
|
|
7
3
|
export declare class LocalEventHubService<Data extends Record<string, any> = {}> implements EventHubService<Data> {
|
|
8
4
|
private channels;
|
|
9
|
-
/**
|
|
10
|
-
* A map storing topics and their associated connection IDs.
|
|
11
|
-
*/
|
|
12
5
|
private subscriptions;
|
|
13
|
-
/**
|
|
14
|
-
* Subscribes a connection to a specific topic.
|
|
15
|
-
* Creates the topic if it does not already exist.
|
|
16
|
-
* @param topic - The topic to subscribe to.
|
|
17
|
-
* @param channelId - The unique ID of the connection to subscribe.
|
|
18
|
-
*/
|
|
19
6
|
subscribe<T extends keyof Data>(topic: T, channelId: string): void | Promise<void>;
|
|
20
|
-
/**
|
|
21
|
-
* Unsubscribes a connection from a specific topic.
|
|
22
|
-
* Removes the topic if it has no more subscribers.
|
|
23
|
-
* @param topic - The topic to unsubscribe from.
|
|
24
|
-
* @param channelId - The unique ID of the connection to unsubscribe.
|
|
25
|
-
*/
|
|
26
7
|
unsubscribe<T extends keyof Data>(topic: T, channelId: string): void | Promise<void>;
|
|
27
|
-
/**
|
|
28
|
-
* Sends data to all connections subscribed to a topic.
|
|
29
|
-
* @param topic - The topic to send data to.
|
|
30
|
-
* @param data - The data to send to the subscribers.
|
|
31
|
-
*/
|
|
32
8
|
publish<T extends keyof Data>(topic: T, channelId: string | null, data: Data[T], isBinary?: boolean): void | Promise<void>;
|
|
33
|
-
/**
|
|
34
|
-
* Registers a channel on open
|
|
35
|
-
*/
|
|
36
9
|
onChannelOpened(channelHandler: PikkuChannelHandler): void;
|
|
37
|
-
/**
|
|
38
|
-
* Handles cleanup when a channel is closed.
|
|
39
|
-
* Removes the channel from all topics it is subscribed to.
|
|
40
|
-
* Deletes the topic if no more channels are subscribed to it.
|
|
41
|
-
* @param channelId - The ID of the channel that was closed.
|
|
42
|
-
*/
|
|
43
10
|
onChannelClosed(channelId: string): void;
|
|
44
11
|
}
|
|
@@ -1,31 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Implementation of the SubscriptionService interface.
|
|
3
|
-
* Manages subscriptions and publishes messages to subscribers.
|
|
4
|
-
*/
|
|
5
1
|
export class LocalEventHubService {
|
|
6
2
|
channels = new Map();
|
|
7
|
-
/**
|
|
8
|
-
* A map storing topics and their associated connection IDs.
|
|
9
|
-
*/
|
|
10
3
|
subscriptions = new Map();
|
|
11
|
-
/**
|
|
12
|
-
* Subscribes a connection to a specific topic.
|
|
13
|
-
* Creates the topic if it does not already exist.
|
|
14
|
-
* @param topic - The topic to subscribe to.
|
|
15
|
-
* @param channelId - The unique ID of the connection to subscribe.
|
|
16
|
-
*/
|
|
17
4
|
subscribe(topic, channelId) {
|
|
18
5
|
if (!this.subscriptions.has(topic)) {
|
|
19
6
|
this.subscriptions.set(topic, new Set());
|
|
20
7
|
}
|
|
21
8
|
this.subscriptions.get(topic).add(channelId);
|
|
22
9
|
}
|
|
23
|
-
/**
|
|
24
|
-
* Unsubscribes a connection from a specific topic.
|
|
25
|
-
* Removes the topic if it has no more subscribers.
|
|
26
|
-
* @param topic - The topic to unsubscribe from.
|
|
27
|
-
* @param channelId - The unique ID of the connection to unsubscribe.
|
|
28
|
-
*/
|
|
29
10
|
unsubscribe(topic, channelId) {
|
|
30
11
|
const topicSubscriptions = this.subscriptions.get(topic);
|
|
31
12
|
if (topicSubscriptions) {
|
|
@@ -35,11 +16,6 @@ export class LocalEventHubService {
|
|
|
35
16
|
}
|
|
36
17
|
}
|
|
37
18
|
}
|
|
38
|
-
/**
|
|
39
|
-
* Sends data to all connections subscribed to a topic.
|
|
40
|
-
* @param topic - The topic to send data to.
|
|
41
|
-
* @param data - The data to send to the subscribers.
|
|
42
|
-
*/
|
|
43
19
|
publish(topic, channelId, data, isBinary) {
|
|
44
20
|
const subscribedChannelIds = this.subscriptions.get(topic);
|
|
45
21
|
if (!subscribedChannelIds) {
|
|
@@ -47,36 +23,26 @@ export class LocalEventHubService {
|
|
|
47
23
|
}
|
|
48
24
|
for (const toChannelId of subscribedChannelIds) {
|
|
49
25
|
if (channelId === toChannelId)
|
|
50
|
-
continue;
|
|
26
|
+
continue;
|
|
51
27
|
const channel = this.channels.get(toChannelId);
|
|
52
28
|
if (channel) {
|
|
53
29
|
try {
|
|
54
30
|
channel.send(data, isBinary);
|
|
55
31
|
}
|
|
56
32
|
catch {
|
|
57
|
-
// Channel closed (e.g. SSE ReadableStream controller already closed on browser disconnect) — clean up
|
|
58
33
|
this.onChannelClosed(toChannelId);
|
|
59
34
|
}
|
|
60
35
|
}
|
|
61
36
|
}
|
|
62
37
|
}
|
|
63
|
-
/**
|
|
64
|
-
* Registers a channel on open
|
|
65
|
-
*/
|
|
66
38
|
onChannelOpened(channelHandler) {
|
|
67
39
|
this.channels.set(channelHandler.getChannel().channelId, channelHandler);
|
|
68
40
|
}
|
|
69
|
-
/**
|
|
70
|
-
* Handles cleanup when a channel is closed.
|
|
71
|
-
* Removes the channel from all topics it is subscribed to.
|
|
72
|
-
* Deletes the topic if no more channels are subscribed to it.
|
|
73
|
-
* @param channelId - The ID of the channel that was closed.
|
|
74
|
-
*/
|
|
75
41
|
onChannelClosed(channelId) {
|
|
76
42
|
for (const [topic, channelIds] of this.subscriptions.entries()) {
|
|
77
43
|
channelIds.delete(channelId);
|
|
78
44
|
if (channelIds.size === 0) {
|
|
79
|
-
this.subscriptions.delete(topic);
|
|
45
|
+
this.subscriptions.delete(topic);
|
|
80
46
|
}
|
|
81
47
|
}
|
|
82
48
|
this.channels.delete(channelId);
|
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
import { pikkuState } from '../../pikku-state.js';
|
|
2
|
-
/**
|
|
3
|
-
* Logs all the loaded channels.
|
|
4
|
-
* @param logger - A logger for logging information.
|
|
5
|
-
*/
|
|
6
2
|
export const logChannels = (logger) => {
|
|
7
3
|
const channels = pikkuState(null, 'channel', 'channels');
|
|
8
4
|
if (channels.size === 0) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { channelRemote, releaseChannelHostRPC } from './channel-host-rpc.js';
|
|
1
2
|
export class PikkuAbstractChannelHandler {
|
|
2
3
|
channelId;
|
|
3
4
|
channelName;
|
|
@@ -25,6 +26,7 @@ export class PikkuAbstractChannelHandler {
|
|
|
25
26
|
clearState: () => {
|
|
26
27
|
channelState = undefined;
|
|
27
28
|
},
|
|
29
|
+
remote: (funcName, data) => channelRemote(this.getChannel(), funcName, data),
|
|
28
30
|
};
|
|
29
31
|
}
|
|
30
32
|
return this.channel;
|
|
@@ -34,5 +36,9 @@ export class PikkuAbstractChannelHandler {
|
|
|
34
36
|
}
|
|
35
37
|
close() {
|
|
36
38
|
this.getChannel().state = 'closed';
|
|
39
|
+
// Fails anything the departing peer still owed an answer to. Not awaited:
|
|
40
|
+
// `close` is on every runtime's synchronous path, and nothing here can fail
|
|
41
|
+
// in a way a closing channel could act on.
|
|
42
|
+
void releaseChannelHostRPC(this.channelId);
|
|
37
43
|
}
|
|
38
44
|
}
|
|
@@ -78,9 +78,9 @@ export const runChannelConnect = async ({ channelId, channelObject, request, res
|
|
|
78
78
|
channel,
|
|
79
79
|
data: openingData,
|
|
80
80
|
channelMiddlewareMeta: meta.channelMiddleware,
|
|
81
|
+
userSession,
|
|
81
82
|
});
|
|
82
83
|
}
|
|
83
|
-
// Store the pikkuUserId mapping after auth middleware has run
|
|
84
84
|
const pikkuUserId = userSession.getPikkuUserId();
|
|
85
85
|
if (pikkuUserId) {
|
|
86
86
|
await channelStore.setPikkuUserId(channelId, pikkuUserId);
|
|
@@ -100,10 +100,6 @@ export const runChannelDisconnect = async ({ channelId, channelStore, channelHan
|
|
|
100
100
|
const singletonServices = getSingletonServices();
|
|
101
101
|
const createWireServices = getCreateWireServices();
|
|
102
102
|
let wireServices;
|
|
103
|
-
// Try to get channel from store. In serverless environments (especially with
|
|
104
|
-
// serverless-offline or worker threads), disconnect can be called multiple times
|
|
105
|
-
// or after the channel has already been cleaned up. If channel doesn't exist,
|
|
106
|
-
// there's nothing to disconnect, so we can return early.
|
|
107
103
|
let channelData;
|
|
108
104
|
try {
|
|
109
105
|
channelData = await channelStore.getChannel(channelId);
|
|
@@ -151,6 +147,7 @@ export const runChannelDisconnect = async ({ channelId, channelStore, channelHan
|
|
|
151
147
|
services,
|
|
152
148
|
channel,
|
|
153
149
|
channelMiddlewareMeta: meta.channelMiddleware,
|
|
150
|
+
userSession,
|
|
154
151
|
});
|
|
155
152
|
}
|
|
156
153
|
catch (e) {
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { ApprovalRequester } from '../../channel/channel-rpc.js';
|
|
2
|
+
/**
|
|
3
|
+
* - `prompt` — ask about anything not classified `needsApproval: false`.
|
|
4
|
+
* - `auto` — run the classified-safe set, refuse the rest without asking.
|
|
5
|
+
* - `dangerous`— run everything.
|
|
6
|
+
*/
|
|
7
|
+
export type ApprovalMode = 'prompt' | 'auto' | 'dangerous';
|
|
8
|
+
export declare const APPROVAL_FLAGS: {
|
|
9
|
+
readonly auto: "--auto-approve";
|
|
10
|
+
readonly dangerous: "--dangerously-auto-approve";
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Stripped from argv, not just read: the server owns the command tree and has
|
|
14
|
+
* never heard of these, and a flag the server can see is one it could act on.
|
|
15
|
+
*/
|
|
16
|
+
export declare const takeApprovalFlags: (args: string[], env?: Record<string, string | undefined>) => {
|
|
17
|
+
mode: ApprovalMode;
|
|
18
|
+
args: string[];
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* `a` is scoped to the one capability and to this run: widening it to every
|
|
22
|
+
* capability would quietly turn an interactive run into
|
|
23
|
+
* `--dangerously-auto-approve`, and persisting it would outlive anyone's memory
|
|
24
|
+
* of agreeing.
|
|
25
|
+
*/
|
|
26
|
+
export declare const createTerminalApprover: ({ input, output, signal, }?: {
|
|
27
|
+
input?: NodeJS.ReadStream;
|
|
28
|
+
output?: NodeJS.WritableStream;
|
|
29
|
+
/** Aborted when the run ends, so a prompt nobody can answer stops waiting. */
|
|
30
|
+
signal?: AbortSignal;
|
|
31
|
+
}) => ApprovalRequester;
|
|
32
|
+
/**
|
|
33
|
+
* Undefined reads as "nobody to ask", which refuses rather than runs. That is
|
|
34
|
+
* what a non-interactive run gets: CI is exactly where an unattended push would
|
|
35
|
+
* otherwise happen.
|
|
36
|
+
*/
|
|
37
|
+
export declare const approverForMode: (mode: ApprovalMode, { isTTY, warn, signal, }?: {
|
|
38
|
+
isTTY?: boolean;
|
|
39
|
+
warn?: (message: string) => void;
|
|
40
|
+
signal?: AbortSignal;
|
|
41
|
+
}) => ApprovalRequester | undefined;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
export const APPROVAL_FLAGS = {
|
|
2
|
+
auto: '--auto-approve',
|
|
3
|
+
dangerous: '--dangerously-auto-approve',
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Stripped from argv, not just read: the server owns the command tree and has
|
|
7
|
+
* never heard of these, and a flag the server can see is one it could act on.
|
|
8
|
+
*/
|
|
9
|
+
export const takeApprovalFlags = (args, env = process.env) => {
|
|
10
|
+
const remaining = args.filter((arg) => arg !== APPROVAL_FLAGS.auto && arg !== APPROVAL_FLAGS.dangerous);
|
|
11
|
+
const dangerous = args.includes(APPROVAL_FLAGS.dangerous) ||
|
|
12
|
+
env.PIKKU_DANGEROUSLY_AUTO_APPROVE === '1';
|
|
13
|
+
const auto = args.includes(APPROVAL_FLAGS.auto) || env.PIKKU_AUTO_APPROVE === '1';
|
|
14
|
+
return {
|
|
15
|
+
mode: dangerous ? 'dangerous' : auto ? 'auto' : 'prompt',
|
|
16
|
+
args: remaining,
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* `a` is scoped to the one capability and to this run: widening it to every
|
|
21
|
+
* capability would quietly turn an interactive run into
|
|
22
|
+
* `--dangerously-auto-approve`, and persisting it would outlive anyone's memory
|
|
23
|
+
* of agreeing.
|
|
24
|
+
*/
|
|
25
|
+
export const createTerminalApprover = ({ input = process.stdin, output = process.stderr, signal, } = {}) => {
|
|
26
|
+
const allowed = new Set();
|
|
27
|
+
const ask = async ({ funcName, description }) => {
|
|
28
|
+
if (allowed.has(funcName) || signal?.aborted) {
|
|
29
|
+
return allowed.has(funcName);
|
|
30
|
+
}
|
|
31
|
+
// stderr, so a command whose stdout is piped still shows the prompt rather
|
|
32
|
+
// than corrupting the stream it is asking about.
|
|
33
|
+
output.write(`\nThe server is asking to run "${funcName}" on this machine.\n` +
|
|
34
|
+
(description ? ` ${description}\n` : '') +
|
|
35
|
+
`Allow? [y]es / [n]o / [a]lways for "${funcName}": `);
|
|
36
|
+
const answer = await new Promise((resolve) => {
|
|
37
|
+
const done = (value) => {
|
|
38
|
+
input.off('data', onData);
|
|
39
|
+
signal?.removeEventListener('abort', onAbort);
|
|
40
|
+
// Reading resumed stdin, which holds the event loop open.
|
|
41
|
+
input.pause?.();
|
|
42
|
+
resolve(value);
|
|
43
|
+
};
|
|
44
|
+
const onData = (chunk) => done(String(chunk).trim().toLowerCase());
|
|
45
|
+
// An aborted prompt is a refusal: its command is already over.
|
|
46
|
+
const onAbort = () => done('n');
|
|
47
|
+
input.on('data', onData);
|
|
48
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
49
|
+
});
|
|
50
|
+
if (answer === 'a' || answer === 'always') {
|
|
51
|
+
allowed.add(funcName);
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
return answer === 'y' || answer === 'yes';
|
|
55
|
+
};
|
|
56
|
+
// Requests are dispatched without awaiting, so two can be in flight at once.
|
|
57
|
+
// Unserialized, both prompts print interleaved and the first keystroke
|
|
58
|
+
// answers both — approving something the user never read.
|
|
59
|
+
let queue = Promise.resolve();
|
|
60
|
+
return (request) => {
|
|
61
|
+
const answered = queue.then(() => ask(request));
|
|
62
|
+
queue = answered.catch(() => { });
|
|
63
|
+
return answered;
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Undefined reads as "nobody to ask", which refuses rather than runs. That is
|
|
68
|
+
* what a non-interactive run gets: CI is exactly where an unattended push would
|
|
69
|
+
* otherwise happen.
|
|
70
|
+
*/
|
|
71
|
+
export const approverForMode = (mode, { isTTY = process.stdin.isTTY, warn = console.error, signal, } = {}) => {
|
|
72
|
+
if (mode === 'dangerous') {
|
|
73
|
+
// Once, on stderr, so the log of a run that went wrong records it.
|
|
74
|
+
warn(`${APPROVAL_FLAGS.dangerous}: every capability this client exposes will run without asking.`);
|
|
75
|
+
return () => true;
|
|
76
|
+
}
|
|
77
|
+
if (mode === 'auto' || !isTTY) {
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
return createTerminalApprover({ signal });
|
|
81
|
+
};
|
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
import type { CorePikkuCLIRender } from '../cli.types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Execute a CLI program via WebSocket channel
|
|
4
|
-
* This is the main entry point for CLI-over-Channel clients
|
|
5
|
-
*/
|
|
6
2
|
export declare function executeCLIViaChannel({ programName, pikkuWS, args, renderers, defaultRenderer, }: {
|
|
7
3
|
programName: string;
|
|
8
4
|
pikkuWS: any;
|
|
@@ -1,19 +1,10 @@
|
|
|
1
1
|
import { pikkuState } from '../../../pikku-state.js';
|
|
2
2
|
import { generateCommandHelp, parseCLIArguments } from '../command-parser.js';
|
|
3
|
-
|
|
4
|
-
* Default JSON renderer for CLI output. Emits single-line NDJSON so
|
|
5
|
-
* the output stays machine-parseable when the CLI is run with
|
|
6
|
-
* `--output json`; pretty-printing here would break NDJSON consumers.
|
|
7
|
-
*/
|
|
3
|
+
// knowledge: decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md
|
|
8
4
|
const defaultJSONRenderer = (_services, data) => {
|
|
9
5
|
console.log(JSON.stringify(data));
|
|
10
6
|
};
|
|
11
|
-
/**
|
|
12
|
-
* Execute a CLI program via WebSocket channel
|
|
13
|
-
* This is the main entry point for CLI-over-Channel clients
|
|
14
|
-
*/
|
|
15
7
|
export async function executeCLIViaChannel({ programName, pikkuWS, args = process.argv.slice(2), renderers = {}, defaultRenderer, }) {
|
|
16
|
-
// Get CLI metadata from state
|
|
17
8
|
const cliMeta = pikkuState(null, 'cli', 'meta');
|
|
18
9
|
if (!cliMeta || !('programs' in cliMeta)) {
|
|
19
10
|
throw new Error('[PKU342] CLI metadata not found. No CLI wirings were registered. See https://pikku.dev/docs/pikku-cli/errors/pku342 for more information.');
|
|
@@ -24,54 +15,44 @@ export async function executeCLIViaChannel({ programName, pikkuWS, args = proces
|
|
|
24
15
|
console.error(`Error: CLI program "${programName}" not found`);
|
|
25
16
|
process.exit(1);
|
|
26
17
|
}
|
|
27
|
-
// Parse arguments for this specific program
|
|
28
18
|
const parsed = parseCLIArguments(args, programName, allCLIMeta);
|
|
29
|
-
//
|
|
19
|
+
// Parsed first so that `<command> --help` resolves to that command's help.
|
|
30
20
|
if (args.includes('--help') || args.includes('-h') || args.length === 0) {
|
|
31
21
|
const helpText = generateCommandHelp(programName, allCLIMeta, parsed.commandPath);
|
|
32
22
|
console.log(helpText);
|
|
33
23
|
return;
|
|
34
24
|
}
|
|
35
25
|
if (parsed.errors.length > 0) {
|
|
36
|
-
//
|
|
26
|
+
// knowledge: decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md
|
|
37
27
|
const hasUnknownCommand = parsed.errors.some((error) => error.startsWith('Unknown command:') ||
|
|
38
28
|
error.startsWith('Command not found:'));
|
|
39
29
|
if (hasUnknownCommand) {
|
|
40
|
-
// Show help instead of error for unknown commands
|
|
41
30
|
const helpText = generateCommandHelp(programName, allCLIMeta, parsed.commandPath);
|
|
42
31
|
console.log(helpText);
|
|
43
32
|
process.exit(1);
|
|
44
33
|
}
|
|
45
34
|
else {
|
|
46
|
-
// Show errors for other types of errors
|
|
47
35
|
console.error('Errors:');
|
|
48
36
|
parsed.errors.forEach((error) => console.error(` ${error}`));
|
|
49
37
|
process.exit(1);
|
|
50
38
|
}
|
|
51
39
|
}
|
|
52
|
-
// Merge positionals and options into single data object
|
|
53
40
|
const data = { ...parsed.positionals, ...parsed.options };
|
|
54
|
-
// Get the renderer for this command
|
|
55
41
|
const commandId = parsed.commandPath.join('.');
|
|
56
42
|
const renderer = renderers[commandId] || defaultRenderer || defaultJSONRenderer;
|
|
57
43
|
return new Promise((resolve, reject) => {
|
|
58
|
-
// Subscribe to responses for this command
|
|
59
44
|
const commandRoute = pikkuWS.getRoute('command');
|
|
60
45
|
const responseHandler = (response) => {
|
|
61
|
-
// Check if this is a control message
|
|
62
46
|
if (response?.action === 'cli-control' &&
|
|
63
47
|
response?.event === 'complete') {
|
|
64
|
-
// Server signals command is complete, close the connection client-side
|
|
65
48
|
commandRoute.unsubscribe(commandId, responseHandler);
|
|
66
49
|
pikkuWS.ws.close();
|
|
67
50
|
resolve(undefined);
|
|
68
51
|
return;
|
|
69
52
|
}
|
|
70
|
-
// Call renderer for any output
|
|
71
53
|
renderer(null, response, undefined);
|
|
72
54
|
};
|
|
73
55
|
commandRoute.subscribe(commandId, responseHandler);
|
|
74
|
-
// Handle connection close
|
|
75
56
|
pikkuWS.ws.addEventListener('close', () => {
|
|
76
57
|
commandRoute.unsubscribe(commandId, responseHandler);
|
|
77
58
|
resolve(undefined);
|
|
@@ -80,13 +61,10 @@ export async function executeCLIViaChannel({ programName, pikkuWS, args = proces
|
|
|
80
61
|
commandRoute.unsubscribe(commandId, responseHandler);
|
|
81
62
|
reject(error);
|
|
82
63
|
});
|
|
83
|
-
// Send the command once connected
|
|
84
64
|
if (pikkuWS.ws.readyState === 1) {
|
|
85
|
-
// Already open
|
|
86
65
|
commandRoute.send(commandId, data);
|
|
87
66
|
}
|
|
88
67
|
else {
|
|
89
|
-
// Wait for open
|
|
90
68
|
pikkuWS.ws.addEventListener('open', () => {
|
|
91
69
|
commandRoute.send(commandId, data);
|
|
92
70
|
});
|
|
@@ -1,15 +1,53 @@
|
|
|
1
|
-
import type { CoreSingletonServices, CreateWireServices } from '../../../types/core.types.js';
|
|
1
|
+
import type { CoreSingletonServices, CoreUserSession, CreateWireServices } from '../../../types/core.types.js';
|
|
2
|
+
import type { PikkuChannel } from '../../channel/channel.types.js';
|
|
2
3
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
4
|
+
* A frame sent from the server to a raw CLI client. `output` carries command
|
|
5
|
+
* data to render; `complete` terminates the command and carries the exit code
|
|
6
|
+
* so the client process can exit non-zero on failure.
|
|
5
7
|
*/
|
|
6
|
-
export
|
|
8
|
+
export type RawCLIFrame = {
|
|
9
|
+
action: 'cli-output';
|
|
10
|
+
commandId?: string;
|
|
11
|
+
data: unknown;
|
|
12
|
+
} | {
|
|
13
|
+
action: 'cli-result';
|
|
14
|
+
commandId?: string;
|
|
15
|
+
result: unknown;
|
|
16
|
+
} | {
|
|
17
|
+
action: 'cli-help';
|
|
18
|
+
help: string;
|
|
19
|
+
} | {
|
|
20
|
+
action: 'cli-error';
|
|
21
|
+
error: string;
|
|
22
|
+
} | {
|
|
23
|
+
action: 'cli-control';
|
|
24
|
+
event: 'complete';
|
|
25
|
+
exitCode: number;
|
|
26
|
+
};
|
|
27
|
+
export interface RawCLIResult {
|
|
28
|
+
help?: string;
|
|
29
|
+
result?: unknown;
|
|
30
|
+
error?: string;
|
|
31
|
+
/** 0 on success, 1 on any parse or execution failure. */
|
|
32
|
+
exitCode: number;
|
|
33
|
+
/** The command the server resolved, so a client can pick a renderer. */
|
|
34
|
+
commandId?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The client sends argv untouched and this side owns parsing, so the command
|
|
38
|
+
* tree lives with the server and a client binary never needs to know it.
|
|
39
|
+
*/
|
|
40
|
+
export declare function handleRawCLI({ programName, args, singletonServices, createWireServices, onOutput, session, transport, }: {
|
|
7
41
|
programName: string;
|
|
8
42
|
args: string[];
|
|
9
43
|
singletonServices: CoreSingletonServices;
|
|
10
44
|
createWireServices?: CreateWireServices;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
45
|
+
/** Established during the upgrade; commands run as that user. */
|
|
46
|
+
session?: CoreUserSession;
|
|
47
|
+
onOutput?: (data: unknown, commandId: string) => Promise<void> | void;
|
|
48
|
+
/**
|
|
49
|
+
* The channel the command arrived on, so `channel.remote(...)` reaches the
|
|
50
|
+
* calling client rather than being refused as a one-way stream.
|
|
51
|
+
*/
|
|
52
|
+
transport?: PikkuChannel<unknown, any, any>;
|
|
53
|
+
}): Promise<RawCLIResult>;
|