@pikku/core 0.12.72 → 0.12.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1171 -0
- package/dist/column-form.d.ts +32 -0
- package/dist/column-form.js +42 -0
- package/dist/crypto-utils.d.ts +43 -7
- package/dist/crypto-utils.js +163 -42
- package/dist/data-classification.d.ts +44 -0
- package/dist/dev/hot-reload.js +11 -30
- package/dist/dev/module-runner.d.ts +3 -7
- package/dist/dev/module-runner.js +4 -10
- package/dist/dev/reload-meta.d.ts +8 -20
- package/dist/dev/reload-meta.js +9 -29
- package/dist/errors/error-handler.d.ts +5 -30
- package/dist/errors/error-handler.js +16 -32
- package/dist/errors/errors.d.ts +32 -151
- package/dist/errors/errors.js +55 -157
- package/dist/function/abort-scope.d.ts +47 -0
- package/dist/function/abort-scope.js +63 -0
- package/dist/function/function-runner.js +37 -32
- package/dist/function/functions.types.d.ts +57 -136
- package/dist/function/functions.types.js +0 -58
- package/dist/function/index.d.ts +1 -1
- package/dist/function/list.types.d.ts +12 -62
- package/dist/function/list.types.js +4 -25
- package/dist/handle-error.d.ts +0 -13
- package/dist/handle-error.js +0 -18
- package/dist/index.d.ts +11 -5
- package/dist/index.js +7 -2
- package/dist/middleware/auth-apikey.d.ts +3 -18
- package/dist/middleware/auth-apikey.js +0 -17
- package/dist/middleware/auth-bearer.d.ts +6 -41
- package/dist/middleware/auth-bearer.js +5 -41
- package/dist/middleware/auth-cookie.d.ts +5 -27
- package/dist/middleware/auth-cookie.js +2 -26
- package/dist/middleware/cors.d.ts +7 -34
- package/dist/middleware/cors.js +7 -34
- package/dist/middleware/remote-auth.d.ts +3 -1
- package/dist/middleware/remote-auth.js +4 -3
- package/dist/middleware/telemetry.d.ts +8 -33
- package/dist/middleware/telemetry.js +2 -31
- package/dist/middleware-runner.d.ts +4 -55
- package/dist/middleware-runner.js +5 -74
- package/dist/permissions.d.ts +3 -44
- package/dist/permissions.js +19 -71
- package/dist/pikku-request.d.ts +0 -6
- package/dist/pikku-request.js +0 -6
- package/dist/pikku-state.d.ts +0 -26
- package/dist/pikku-state.js +2 -30
- package/dist/remote.d.ts +3 -5
- package/dist/remote.js +9 -8
- package/dist/schema.d.ts +5 -39
- package/dist/schema.js +5 -39
- package/dist/scopes.d.ts +4 -23
- package/dist/scopes.js +7 -48
- package/dist/secret-value.d.ts +56 -0
- package/dist/secret-value.js +46 -0
- package/dist/services/ai-agent-runner-service.d.ts +20 -0
- package/dist/services/ai-embedding-service.d.ts +2 -25
- package/dist/services/audit-service.d.ts +74 -4
- package/dist/services/audit-service.js +8 -7
- package/dist/services/content-service.d.ts +1 -46
- package/dist/services/credential-service.d.ts +3 -40
- package/dist/services/credential-wire-service.d.ts +5 -0
- package/dist/services/credential-wire-service.js +9 -1
- package/dist/services/deployment-service.d.ts +3 -9
- package/dist/services/email-service.d.ts +2 -1
- package/dist/services/gateway-service.d.ts +0 -15
- package/dist/services/http-personas.d.ts +80 -0
- package/dist/services/http-personas.js +233 -0
- package/dist/services/in-memory-queue-service.d.ts +0 -14
- package/dist/services/in-memory-queue-service.js +1 -15
- package/dist/services/in-memory-trigger-service.d.ts +0 -18
- package/dist/services/in-memory-trigger-service.js +1 -18
- package/dist/services/in-memory-workflow-service.d.ts +0 -16
- package/dist/services/in-memory-workflow-service.js +4 -33
- package/dist/services/index.d.ts +8 -9
- package/dist/services/index.js +3 -6
- package/dist/services/istanbul-coverage-service.d.ts +1 -5
- package/dist/services/istanbul-coverage-service.js +2 -8
- package/dist/services/jwt-service.d.ts +1 -16
- package/dist/services/local-content-request-handler.d.ts +29 -0
- package/dist/services/local-content-request-handler.js +176 -0
- package/dist/services/local-content.d.ts +13 -2
- package/dist/services/local-content.js +40 -13
- package/dist/services/local-gateway-service.d.ts +0 -16
- package/dist/services/local-gateway-service.js +2 -17
- package/dist/services/local-secrets.d.ts +4 -7
- package/dist/services/local-secrets.js +7 -7
- package/dist/services/logger-console.d.ts +3 -7
- package/dist/services/logger-console.js +3 -7
- package/dist/services/logger.d.ts +22 -40
- package/dist/services/meta-service.d.ts +23 -26
- package/dist/services/meta-service.js +22 -36
- package/dist/services/personas-service.d.ts +134 -0
- package/dist/services/personas-service.js +40 -0
- package/dist/services/pikku-user-id.js +0 -4
- package/dist/services/queue-webhook-service.d.ts +2 -36
- package/dist/services/queue-webhook-service.js +10 -42
- package/dist/services/scheduler-service.d.ts +1 -50
- package/dist/services/scheduler-service.js +0 -10
- package/dist/services/schema-service.d.ts +1 -24
- package/dist/services/scope-service.d.ts +49 -34
- package/dist/services/scoped-secret-service.d.ts +4 -7
- package/dist/services/scoped-secret-service.js +0 -4
- package/dist/services/secret-host-binding.d.ts +8 -0
- package/dist/services/secret-host-binding.js +36 -0
- package/dist/services/secret-service.d.ts +12 -35
- package/dist/services/secretless.d.ts +6 -0
- package/dist/services/secretless.js +21 -0
- package/dist/services/stub-tracker.d.ts +7 -18
- package/dist/services/stub-tracker.js +8 -18
- package/dist/services/system-role-guard.d.ts +33 -0
- package/dist/services/system-role-guard.js +38 -0
- package/dist/services/trigger-service.d.ts +0 -12
- package/dist/services/typed-secret-service.d.ts +5 -11
- package/dist/services/typed-secret-service.js +1 -7
- package/dist/services/v8-coverage-service.d.ts +2 -3
- package/dist/services/v8-coverage-service.js +1 -2
- package/dist/services/variables-service.d.ts +1 -8
- package/dist/services/webhook-service.d.ts +21 -64
- package/dist/services/webhook-service.js +6 -20
- package/dist/services/workflow-service.d.ts +3 -15
- package/dist/testing/service-tests.js +6 -23
- package/dist/time-utils.d.ts +0 -16
- package/dist/time-utils.js +1 -19
- package/dist/types/core.types.d.ts +120 -219
- package/dist/types/core.types.js +0 -42
- package/dist/types/state.types.d.ts +4 -9
- package/dist/utils/hmac.d.ts +4 -10
- package/dist/utils/hmac.js +4 -10
- package/dist/utils/safe-fetch.d.ts +7 -35
- package/dist/utils/safe-fetch.js +13 -53
- package/dist/utils.d.ts +1 -6
- package/dist/utils.js +6 -15
- package/dist/wirings/actor-flow/actor-flow.types.d.ts +1 -34
- package/dist/wirings/actor-flow/index.d.ts +0 -9
- package/dist/wirings/actor-flow/run-conversation.d.ts +5 -5
- package/dist/wirings/actor-flow/run-conversation.js +14 -7
- package/dist/wirings/ai-agent/ai-agent-agui.d.ts +0 -5
- package/dist/wirings/ai-agent/ai-agent-agui.js +46 -12
- package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +7 -0
- package/dist/wirings/ai-agent/ai-agent-helpers.js +7 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.d.ts +153 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.js +256 -0
- package/dist/wirings/ai-agent/ai-agent-memory.js +0 -2
- package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +0 -9
- package/dist/wirings/ai-agent/ai-agent-model-config.js +1 -9
- package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +10 -99
- package/dist/wirings/ai-agent/ai-agent-prepare.js +65 -132
- package/dist/wirings/ai-agent/ai-agent-registry.d.ts +2 -1
- package/dist/wirings/ai-agent/ai-agent-registry.js +5 -1
- package/dist/wirings/ai-agent/ai-agent-runner.js +63 -22
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +25 -2
- package/dist/wirings/ai-agent/ai-agent-stream.js +180 -64
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +124 -4
- package/dist/wirings/ai-agent/index.d.ts +6 -4
- package/dist/wirings/ai-agent/index.js +5 -4
- package/dist/wirings/ai-agent/voice-input.d.ts +59 -1
- package/dist/wirings/ai-agent/voice-input.js +90 -12
- package/dist/wirings/ai-agent/voice-output.d.ts +69 -1
- package/dist/wirings/ai-agent/voice-output.js +162 -50
- package/dist/wirings/channel/channel-common.d.ts +7 -20
- package/dist/wirings/channel/channel-common.js +7 -21
- package/dist/wirings/channel/channel-handler.js +25 -6
- package/dist/wirings/channel/channel-host-rpc.d.ts +25 -0
- package/dist/wirings/channel/channel-host-rpc.js +38 -0
- package/dist/wirings/channel/channel-middleware-runner.d.ts +0 -12
- package/dist/wirings/channel/channel-middleware-runner.js +0 -12
- package/dist/wirings/channel/channel-rpc-registry.d.ts +31 -0
- package/dist/wirings/channel/channel-rpc-registry.js +89 -0
- package/dist/wirings/channel/channel-rpc-responder.d.ts +15 -0
- package/dist/wirings/channel/channel-rpc-responder.js +71 -0
- package/dist/wirings/channel/channel-rpc-service.d.ts +40 -0
- package/dist/wirings/channel/channel-rpc-service.js +106 -0
- package/dist/wirings/channel/channel-rpc-validators.d.ts +14 -0
- package/dist/wirings/channel/channel-rpc-validators.js +30 -0
- package/dist/wirings/channel/channel-rpc.d.ts +5 -0
- package/dist/wirings/channel/channel-rpc.js +5 -0
- package/dist/wirings/channel/channel-rpc.types.d.ts +90 -0
- package/dist/wirings/channel/channel-rpc.types.js +50 -0
- package/dist/wirings/channel/channel-runner.d.ts +0 -4
- package/dist/wirings/channel/channel-runner.js +0 -14
- package/dist/wirings/channel/channel-store.d.ts +0 -10
- package/dist/wirings/channel/channel.types.d.ts +12 -1
- package/dist/wirings/channel/define-channel-routes.d.ts +0 -20
- package/dist/wirings/channel/define-channel-routes.js +0 -20
- package/dist/wirings/channel/eventhub-service.d.ts +0 -18
- package/dist/wirings/channel/index.d.ts +4 -1
- package/dist/wirings/channel/index.js +2 -0
- package/dist/wirings/channel/local/local-channel-runner.js +3 -1
- package/dist/wirings/channel/local/local-eventhub-service.d.ts +0 -33
- package/dist/wirings/channel/local/local-eventhub-service.js +2 -36
- package/dist/wirings/channel/log-channels.d.ts +0 -4
- package/dist/wirings/channel/log-channels.js +0 -4
- package/dist/wirings/channel/pikku-abstract-channel-handler.js +6 -0
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +2 -5
- package/dist/wirings/cli/channel/cli-approval.d.ts +41 -0
- package/dist/wirings/cli/channel/cli-approval.js +81 -0
- package/dist/wirings/cli/channel/cli-channel-runner.d.ts +0 -4
- package/dist/wirings/cli/channel/cli-channel-runner.js +3 -25
- package/dist/wirings/cli/channel/cli-raw-channel-runner.d.ts +47 -9
- package/dist/wirings/cli/channel/cli-raw-channel-runner.js +24 -16
- package/dist/wirings/cli/channel/cli-raw-client-runner.d.ts +38 -0
- package/dist/wirings/cli/channel/cli-raw-client-runner.js +129 -0
- package/dist/wirings/cli/channel/index.d.ts +5 -0
- package/dist/wirings/cli/channel/index.js +2 -0
- package/dist/wirings/cli/cli-runner.d.ts +20 -20
- package/dist/wirings/cli/cli-runner.js +28 -89
- package/dist/wirings/cli/cli.types.d.ts +14 -3
- package/dist/wirings/cli/command-parser.d.ts +1 -10
- package/dist/wirings/cli/command-parser.js +10 -87
- package/dist/wirings/cli/define-cli-commands.d.ts +1 -17
- package/dist/wirings/cli/define-cli-commands.js +1 -17
- package/dist/wirings/credential/credential.types.d.ts +0 -12
- package/dist/wirings/credential/define-credential.d.ts +48 -0
- package/dist/wirings/credential/define-credential.js +47 -0
- package/dist/wirings/credential/index.d.ts +1 -1
- package/dist/wirings/credential/index.js +1 -1
- package/dist/wirings/credential/validate-credential-definitions.d.ts +2 -4
- package/dist/wirings/gateway/gateway-runner.d.ts +1 -20
- package/dist/wirings/gateway/gateway-runner.js +8 -105
- package/dist/wirings/gateway/gateway.types.d.ts +7 -80
- package/dist/wirings/http/http-routes.d.ts +0 -63
- package/dist/wirings/http/http-routes.js +0 -63
- package/dist/wirings/http/http-runner.d.ts +0 -99
- package/dist/wirings/http/http-runner.js +9 -165
- package/dist/wirings/http/http.types.d.ts +14 -55
- package/dist/wirings/http/log-http-routes.d.ts +0 -4
- package/dist/wirings/http/log-http-routes.js +0 -4
- package/dist/wirings/http/pikku-fetch-http-request.d.ts +0 -40
- package/dist/wirings/http/pikku-fetch-http-request.js +0 -58
- package/dist/wirings/http/pikku-fetch-http-response.js +0 -3
- package/dist/wirings/http/routers/path-to-regex.js +2 -13
- package/dist/wirings/http/web-request.d.ts +0 -8
- package/dist/wirings/http/web-request.js +25 -17
- package/dist/wirings/mcp/mcp-runner.d.ts +1 -4
- package/dist/wirings/mcp/mcp-runner.js +1 -14
- package/dist/wirings/mcp/mcp.types.d.ts +2 -35
- package/dist/wirings/oauth2/oauth2.types.d.ts +0 -28
- package/dist/wirings/oauth2/oauth2.types.js +0 -3
- package/dist/wirings/persona/define-personas.d.ts +32 -0
- package/dist/wirings/persona/define-personas.js +31 -0
- package/dist/wirings/persona/index.d.ts +21 -0
- package/dist/wirings/persona/index.js +17 -0
- package/dist/wirings/persona/persona-email.d.ts +37 -0
- package/dist/wirings/persona/persona-email.js +69 -0
- package/dist/wirings/persona/persona-environments.d.ts +45 -0
- package/dist/wirings/persona/persona-environments.js +81 -0
- package/dist/wirings/persona/persona-mailbox.d.ts +101 -0
- package/dist/wirings/persona/persona-mailbox.js +53 -0
- package/dist/wirings/persona/persona.types.d.ts +136 -0
- package/dist/wirings/persona/persona.types.js +1 -0
- package/dist/wirings/persona/validate-personas.d.ts +53 -0
- package/dist/wirings/persona/validate-personas.js +94 -0
- package/dist/wirings/queue/index.d.ts +3 -0
- package/dist/wirings/queue/index.js +2 -3
- package/dist/wirings/queue/queue-identity.d.ts +28 -0
- package/dist/wirings/queue/queue-identity.js +103 -0
- package/dist/wirings/queue/queue-runner.d.ts +0 -19
- package/dist/wirings/queue/queue-runner.js +9 -30
- package/dist/wirings/queue/queue.types.d.ts +20 -90
- package/dist/wirings/queue/register-queue-helper.d.ts +0 -12
- package/dist/wirings/queue/register-queue-helper.js +0 -11
- package/dist/wirings/queue/signed-queue-service.d.ts +17 -0
- package/dist/wirings/queue/signed-queue-service.js +42 -0
- package/dist/wirings/queue/validate-worker-config.d.ts +2 -23
- package/dist/wirings/queue/validate-worker-config.js +0 -14
- package/dist/wirings/role/define-system-role.d.ts +32 -0
- package/dist/wirings/role/define-system-role.js +31 -0
- package/dist/wirings/role/index.d.ts +3 -0
- package/dist/wirings/role/index.js +2 -0
- package/dist/wirings/role/role.types.d.ts +43 -0
- package/dist/wirings/role/role.types.js +1 -0
- package/dist/wirings/role/validate-role-definitions.d.ts +21 -0
- package/dist/wirings/role/validate-role-definitions.js +71 -0
- package/dist/wirings/rpc/addon-runner.d.ts +0 -19
- package/dist/wirings/rpc/addon-runner.js +0 -51
- package/dist/wirings/rpc/remote-addon-auth.d.ts +3 -13
- package/dist/wirings/rpc/remote-addon-auth.js +7 -11
- package/dist/wirings/rpc/rpc-runner.d.ts +11 -18
- package/dist/wirings/rpc/rpc-runner.js +88 -105
- package/dist/wirings/rpc/rpc-types.d.ts +7 -6
- package/dist/wirings/rpc/wire-addon.d.ts +25 -0
- package/dist/wirings/rpc/wire-addon.js +62 -0
- package/dist/wirings/rpc/wire-remote-addon.d.ts +3 -28
- package/dist/wirings/rpc/wire-remote-addon.js +0 -8
- package/dist/wirings/scheduler/log-schedulers.d.ts +0 -4
- package/dist/wirings/scheduler/log-schedulers.js +0 -4
- package/dist/wirings/scheduler/scheduler-runner.d.ts +0 -1
- package/dist/wirings/scheduler/scheduler-runner.js +0 -1
- package/dist/wirings/scheduler/scheduler.types.d.ts +1 -14
- package/dist/wirings/scope/define-scope.d.ts +32 -0
- package/dist/wirings/scope/define-scope.js +31 -0
- package/dist/wirings/scope/index.d.ts +1 -1
- package/dist/wirings/scope/index.js +1 -1
- package/dist/wirings/scope/scope.types.d.ts +7 -9
- package/dist/wirings/scope/validate-scope-definitions.d.ts +2 -21
- package/dist/wirings/scope/validate-scope-definitions.js +3 -21
- package/dist/wirings/secret/index.d.ts +1 -1
- package/dist/wirings/secret/index.js +1 -1
- package/dist/wirings/secret/secret.types.d.ts +19 -15
- package/dist/wirings/secret/secret.types.js +1 -1
- package/dist/wirings/secret/validate-secret-definitions.d.ts +2 -4
- package/dist/wirings/trigger/trigger-runner.d.ts +0 -27
- package/dist/wirings/trigger/trigger-runner.js +1 -24
- package/dist/wirings/trigger/trigger.types.d.ts +1 -82
- package/dist/wirings/trigger/trigger.types.js +0 -34
- package/dist/wirings/variable/index.d.ts +1 -1
- package/dist/wirings/variable/index.js +1 -1
- package/dist/wirings/variable/validate-variable-definitions.d.ts +2 -4
- package/dist/wirings/variable/variable.types.d.ts +1 -13
- package/dist/wirings/variable/variable.types.js +1 -1
- package/dist/wirings/virtual-user/index.d.ts +30 -0
- package/dist/wirings/virtual-user/index.js +10 -0
- package/dist/wirings/virtual-user/prepare-virtual-user-run.d.ts +54 -0
- package/dist/wirings/virtual-user/prepare-virtual-user-run.js +49 -0
- package/dist/wirings/virtual-user/run-virtual-user.d.ts +92 -0
- package/dist/wirings/virtual-user/run-virtual-user.js +478 -0
- package/dist/wirings/virtual-user/virtual-user-agents.d.ts +38 -0
- package/dist/wirings/virtual-user/virtual-user-agents.js +24 -0
- package/dist/wirings/virtual-user/virtual-user-catalogue.d.ts +92 -0
- package/dist/wirings/virtual-user/virtual-user-catalogue.js +134 -0
- package/dist/wirings/virtual-user/virtual-user-derive.d.ts +26 -0
- package/dist/wirings/virtual-user/virtual-user-derive.js +137 -0
- package/dist/wirings/virtual-user/virtual-user-dispositions.d.ts +79 -0
- package/dist/wirings/virtual-user/virtual-user-dispositions.js +128 -0
- package/dist/wirings/virtual-user/virtual-user-intents.d.ts +78 -0
- package/dist/wirings/virtual-user/virtual-user-intents.js +142 -0
- package/dist/wirings/virtual-user/virtual-user-rng.d.ts +24 -0
- package/dist/wirings/virtual-user/virtual-user-rng.js +44 -0
- package/dist/wirings/virtual-user/virtual-user-run-store.d.ts +90 -0
- package/dist/wirings/virtual-user/virtual-user-run-store.js +1 -0
- package/dist/wirings/virtual-user/virtual-user-target.d.ts +21 -0
- package/dist/wirings/virtual-user/virtual-user-target.js +34 -0
- package/dist/wirings/virtual-user/virtual-user.types.d.ts +199 -0
- package/dist/wirings/virtual-user/virtual-user.types.js +8 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +19 -15
- package/dist/wirings/workflow/dsl/workflow-runner.d.ts +0 -4
- package/dist/wirings/workflow/dsl/workflow-runner.js +0 -4
- package/dist/wirings/workflow/feature.d.ts +0 -19
- package/dist/wirings/workflow/feature.js +0 -19
- package/dist/wirings/workflow/graph/graph-node.d.ts +0 -98
- package/dist/wirings/workflow/graph/graph-node.js +0 -34
- package/dist/wirings/workflow/graph/graph-runner.js +6 -41
- package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +0 -4
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -58
- package/dist/wirings/workflow/graph/workflow-graph.types.js +0 -6
- package/dist/wirings/workflow/index.d.ts +5 -7
- package/dist/wirings/workflow/index.js +3 -17
- package/dist/wirings/workflow/pikku-scenario-service.d.ts +87 -5
- package/dist/wirings/workflow/pikku-scenario-service.js +204 -43
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +7 -459
- package/dist/wirings/workflow/pikku-workflow-service.js +58 -551
- package/dist/wirings/workflow/run-timeline.d.ts +0 -47
- package/dist/wirings/workflow/run-timeline.js +0 -22
- package/dist/wirings/workflow/scenario-cookie-jar.d.ts +0 -23
- package/dist/wirings/workflow/scenario-cookie-jar.js +0 -16
- package/dist/wirings/workflow/scenario-poll.d.ts +0 -15
- package/dist/wirings/workflow/scenario-poll.js +0 -12
- package/dist/wirings/workflow/scenario-prose.d.ts +0 -28
- package/dist/wirings/workflow/scenario-prose.js +1 -19
- package/dist/wirings/workflow/scenario-step-guards.d.ts +0 -13
- package/dist/wirings/workflow/scenario-step-guards.js +1 -14
- package/dist/wirings/workflow/scenario-step.types.d.ts +84 -12
- package/dist/wirings/workflow/scenario-step.types.js +5 -1
- package/dist/wirings/workflow/scenario-surface.d.ts +16 -0
- package/dist/wirings/workflow/scenario-surface.js +56 -0
- package/dist/wirings/workflow/workflow-invocation-id.d.ts +0 -18
- package/dist/wirings/workflow/workflow-invocation-id.js +2 -22
- package/dist/wirings/workflow/workflow-queue-workers.d.ts +0 -20
- package/dist/wirings/workflow/workflow-queue-workers.js +0 -19
- package/dist/wirings/workflow/workflow.types.d.ts +5 -195
- package/knowledge/decisions/index.md +19 -0
- package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +49 -0
- package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-and-not-a-queued-job.md +48 -0
- package/knowledge/decisions/internals/actor-flow-conversations-seed-a-hidden-kickoff-message.md +23 -0
- package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md +24 -0
- package/knowledge/decisions/internals/actor-flow-verdicts-are-llm-self-evaluations.md +25 -0
- package/knowledge/decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md +26 -0
- package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +33 -0
- package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +28 -0
- package/knowledge/decisions/internals/ai-agent-agui-bridge-obeys-the-client-ordering-contract.md +29 -0
- package/knowledge/decisions/internals/ai-agent-audio-chunks-carry-the-format-the-provider-returned.md +20 -0
- package/knowledge/decisions/internals/ai-agent-credential-suspensions-hide-the-tool-result.md +26 -0
- package/knowledge/decisions/internals/ai-agent-delegate-and-supervise-hide-different-text.md +26 -0
- package/knowledge/decisions/internals/ai-agent-llm-tool-arguments-have-nulls-stripped.md +23 -0
- package/knowledge/decisions/internals/ai-agent-model-config-stays-a-single-resolution-seam.md +25 -0
- package/knowledge/decisions/internals/ai-agent-onerror-hooks-cannot-change-the-failure.md +22 -0
- package/knowledge/decisions/internals/ai-agent-runner-methods-must-keep-their-receiver.md +22 -0
- package/knowledge/decisions/internals/ai-agent-stream-persistence-is-best-effort.md +27 -0
- package/knowledge/decisions/internals/ai-agent-sub-agents-inherit-the-parent-context-block.md +26 -0
- package/knowledge/decisions/internals/ai-agent-tool-execute-failures-are-logged-unconditionally.md +25 -0
- package/knowledge/decisions/internals/ai-agent-voice-input-transcribes-audio-parts-in-place.md +22 -0
- package/knowledge/decisions/internals/ai-agent-working-memory-is-persisted-only-when-valid.md +25 -0
- package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +30 -0
- package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +31 -0
- package/knowledge/decisions/internals/channel-state-is-per-socket-session-state-is-per-user.md +29 -0
- package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +28 -0
- package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +27 -0
- package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +28 -0
- package/knowledge/decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md +34 -0
- package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +29 -0
- package/knowledge/decisions/internals/core-column-form-is-an-axis-of-its-own.md +84 -0
- package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +41 -0
- package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +44 -0
- package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +39 -0
- package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +42 -0
- package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +39 -0
- package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +43 -0
- package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +38 -0
- package/knowledge/decisions/internals/core-state-is-a-global-map-written-only-at-registration-time.md +44 -0
- package/knowledge/decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md +27 -0
- package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +32 -0
- package/knowledge/decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md +28 -0
- package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +31 -0
- package/knowledge/decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md +26 -0
- package/knowledge/decisions/internals/http-request-bodies-are-read-once-and-shared.md +32 -0
- package/knowledge/decisions/internals/http-route-groups-cascade-config-in-a-fixed-order.md +28 -0
- package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +30 -0
- package/knowledge/decisions/internals/http-runner-logs-through-a-trace-scoped-logger-functions-do-not.md +26 -0
- package/knowledge/decisions/internals/http-set-cookie-headers-are-appended-never-joined.md +28 -0
- package/knowledge/decisions/internals/http-sse-streams-flush-headers-only-after-middleware.md +32 -0
- package/knowledge/decisions/internals/http-wiring-without-metadata-is-skipped-not-fatal.md +26 -0
- package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +25 -0
- package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +26 -0
- package/knowledge/decisions/internals/index.md +117 -0
- package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +25 -0
- package/knowledge/decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md +26 -0
- package/knowledge/decisions/internals/node-only-builtins-are-imported-dynamically.md +24 -0
- package/knowledge/decisions/internals/one-project-shape-check-two-validators.md +53 -0
- package/knowledge/decisions/internals/queue-group-concurrency-keeps-one-shared-queue-fair.md +28 -0
- package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +27 -0
- package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +31 -0
- package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +32 -0
- package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +27 -0
- package/knowledge/decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md +26 -0
- package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +27 -0
- package/knowledge/decisions/internals/scenarios-live-in-files-named-for-them.md +48 -0
- package/knowledge/decisions/internals/scope-roots-may-be-co-declared-by-an-addon-and-its-host-app.md +30 -0
- package/knowledge/decisions/internals/serverless-channel-disconnect-must-tolerate-a-missing-channel.md +28 -0
- package/knowledge/decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md +30 -0
- package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +29 -0
- package/knowledge/decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md +27 -0
- package/knowledge/decisions/internals/the-kek-salt-is-scoped-to-the-key-version.md +40 -0
- package/knowledge/decisions/internals/the-schema-service-is-never-stubbed.md +26 -0
- package/knowledge/decisions/internals/trigger-declaration-is-split-from-trigger-source.md +33 -0
- package/knowledge/decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md +26 -0
- package/knowledge/decisions/internals/validate-checks-personas-through-a-shared-module.md +43 -0
- package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +26 -0
- package/knowledge/decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md +25 -0
- package/knowledge/decisions/internals/whether-a-run-is-inline-is-read-from-the-run-record.md +58 -0
- package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +34 -0
- package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +42 -0
- package/knowledge/decisions/internals/workflow-dsl-meta-separates-runtime-expressions-from-literals.md +38 -0
- package/knowledge/decisions/internals/workflow-features-resolve-scenarios-by-object-identity.md +29 -0
- package/knowledge/decisions/internals/workflow-graph-inline-and-queued-runs-share-one-planner.md +42 -0
- package/knowledge/decisions/internals/workflow-graph-node-notes-are-excluded-from-the-graph-hash.md +25 -0
- package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +29 -0
- package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +43 -0
- package/knowledge/decisions/internals/workflow-queued-step-dispatch-requires-an-explicit-opt-in.md +29 -0
- package/knowledge/decisions/internals/workflow-queues-are-per-workflow-by-default.md +42 -0
- package/knowledge/decisions/internals/workflow-repeated-step-names-get-an-ordinal-suffix.md +33 -0
- package/knowledge/decisions/internals/workflow-replay-reads-its-steps-once-and-caches-only-the-immutable-half.md +32 -0
- package/knowledge/decisions/internals/workflow-retries-are-owned-by-the-workflow-not-the-queue.md +31 -0
- package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +39 -0
- package/knowledge/decisions/internals/workflow-run-mirror-is-never-a-source-of-truth.md +29 -0
- package/knowledge/decisions/internals/workflow-run-polling-backs-off-to-the-callers-ceiling.md +33 -0
- package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +37 -0
- package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +50 -0
- package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +43 -0
- package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +32 -0
- package/knowledge/decisions/internals/workflow-scenario-quarantine-reason-lives-in-code.md +18 -0
- package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +34 -0
- package/knowledge/decisions/internals/workflow-step-compensation-runs-as-its-own-durable-step.md +26 -0
- package/knowledge/decisions/internals/workflow-step-dispatch-failure-is-transient-not-a-run-failure.md +33 -0
- package/knowledge/decisions/internals/workflow-step-lock-is-held-only-to-claim-the-step.md +27 -0
- package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +34 -0
- package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +38 -0
- package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +30 -0
- package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +26 -0
- package/knowledge/decisions/security/actor-flow-missing-approval-decisions-default-to-denied.md +22 -0
- package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +27 -0
- package/knowledge/decisions/security/actor-sign-in-only-works-for-actor-flagged-users.md +27 -0
- package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +43 -0
- package/knowledge/decisions/security/addon-config-gates-apply-only-at-the-namespaced-rpc-boundary.md +52 -0
- package/knowledge/decisions/security/addon-scopes-are-resolved-where-the-function-runs.md +46 -0
- package/knowledge/decisions/security/ai-agent-approval-forwarding-requires-a-symbol-brand.md +27 -0
- package/knowledge/decisions/security/ai-agent-credential-requests-are-symbol-branded.md +37 -0
- package/knowledge/decisions/security/ai-agent-gate-requires-a-session-only-when-auth-is-true.md +31 -0
- package/knowledge/decisions/security/ai-agent-ownership-failures-never-echo-the-resource.md +23 -0
- package/knowledge/decisions/security/ai-agent-resume-re-runs-the-authorization-gate.md +22 -0
- package/knowledge/decisions/security/ai-agent-sessionless-deployments-have-no-thread-ownership.md +39 -0
- package/knowledge/decisions/security/ai-agent-thread-ownership-composes-the-session-principal.md +30 -0
- package/knowledge/decisions/security/ai-agent-tool-filtering-reads-the-live-function-config.md +24 -0
- package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +30 -0
- package/knowledge/decisions/security/an-exposed-ungated-function-is-a-codegen-warning.md +49 -0
- package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +76 -0
- package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +39 -0
- package/knowledge/decisions/security/core-secrets-use-a-per-secret-dek-wrapped-by-a-kek.md +37 -0
- package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +31 -0
- package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +30 -0
- package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +40 -0
- package/knowledge/decisions/security/http-error-detail-is-withheld-from-clients-in-production.md +33 -0
- package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +46 -0
- package/knowledge/decisions/security/index.md +55 -0
- package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +27 -0
- package/knowledge/decisions/security/passphrases-are-stretched-key-material-is-expanded.md +40 -0
- package/knowledge/decisions/security/permission-auth-filtering-requires-live-permission-functions.md +31 -0
- package/knowledge/decisions/security/pikku-carries-actor-scopes-as-data-and-the-app-grants-them.md +26 -0
- package/knowledge/decisions/security/queue-job-identities-are-signed-at-enqueue.md +69 -0
- package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +39 -0
- package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +34 -0
- package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +49 -0
- package/knowledge/decisions/security/scenario-step-functions-are-never-externally-invocable.md +30 -0
- package/knowledge/decisions/security/scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md +28 -0
- package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +34 -0
- package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +37 -0
- package/knowledge/decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md +25 -0
- package/knowledge/decisions/security/workflow-actor-steps-always-use-the-real-transport.md +34 -0
- package/knowledge/decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md +40 -0
- package/knowledge/decisions/security/workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md +32 -0
- package/knowledge/decisions/security/workflow-scenario-sessions-are-isolated-per-actor-and-per-scenario.md +32 -0
- package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +31 -0
- package/knowledge/index.md +24 -0
- package/knowledge/questions/index.md +15 -0
- package/package.json +6 -2
- package/run-tests.sh +0 -0
- package/src/column-form.test.ts +97 -0
- package/src/column-form.ts +58 -0
- package/src/crypto-utils.test.ts +460 -19
- package/src/crypto-utils.ts +306 -59
- package/src/data-classification.ts +45 -7
- package/src/dev/hot-reload.test.ts +0 -4
- package/src/dev/hot-reload.ts +11 -30
- package/src/dev/module-runner.ts +7 -32
- package/src/dev/reload-meta.ts +9 -29
- package/src/errors/error-handler.ts +20 -35
- package/src/errors/error.test.ts +30 -1
- package/src/errors/errors.ts +73 -157
- package/src/function/abort-scope.test.ts +97 -0
- package/src/function/abort-scope.ts +80 -0
- package/src/function/function-runner.test.ts +0 -7
- package/src/function/function-runner.ts +62 -32
- package/src/function/functions.types.ts +95 -138
- package/src/function/index.ts +1 -0
- package/src/function/list.types.test.ts +3 -25
- package/src/function/list.types.ts +12 -62
- package/src/handle-error.ts +0 -18
- package/src/index.ts +84 -3
- package/src/middleware/auth-apikey.test.ts +0 -1
- package/src/middleware/auth-apikey.ts +0 -17
- package/src/middleware/auth-bearer.test.ts +3 -5
- package/src/middleware/auth-bearer.ts +5 -41
- package/src/middleware/auth-cookie.test.ts +0 -6
- package/src/middleware/auth-cookie.ts +2 -26
- package/src/middleware/cors.test.ts +34 -0
- package/src/middleware/cors.ts +12 -33
- package/src/middleware/remote-auth.test.ts +26 -10
- package/src/middleware/remote-auth.ts +11 -3
- package/src/middleware/telemetry.ts +2 -31
- package/src/middleware-runner.test.ts +0 -2
- package/src/middleware-runner.ts +5 -74
- package/src/permissions.test.ts +30 -0
- package/src/permissions.ts +24 -74
- package/src/pikku-request.ts +0 -6
- package/src/pikku-state.ts +2 -30
- package/src/production-barrels-stay-lean.test.ts +110 -0
- package/src/remote.test.ts +173 -0
- package/src/remote.ts +18 -8
- package/src/schema.ts +5 -39
- package/src/scopes.ts +7 -48
- package/src/secret-value.test.ts +204 -0
- package/src/secret-value.ts +111 -0
- package/src/services/ai-agent-runner-service.ts +20 -0
- package/src/services/ai-embedding-service.ts +3 -25
- package/src/services/audit-service.ts +88 -11
- package/src/services/content-service.ts +1 -46
- package/src/services/credential-service.ts +3 -40
- package/src/services/credential-wire-service.test.ts +0 -2
- package/src/services/credential-wire-service.ts +9 -1
- package/src/services/deployment-service.ts +3 -9
- package/src/services/email-service.ts +3 -1
- package/src/services/gateway-service.ts +0 -15
- package/src/services/{http-scenario-actors-converse.test.ts → http-personas-converse.test.ts} +38 -9
- package/src/services/{http-scenario-actors.test.ts → http-personas.test.ts} +39 -22
- package/src/services/{http-scenario-actors.ts → http-personas.ts} +85 -45
- package/src/services/in-memory-queue-service.ts +1 -15
- package/src/services/in-memory-trigger-service.ts +1 -18
- package/src/services/in-memory-workflow-service.test.ts +0 -13
- package/src/services/in-memory-workflow-service.ts +4 -38
- package/src/services/index.ts +23 -18
- package/src/services/istanbul-coverage-service.ts +2 -8
- package/src/services/jwt-service.ts +1 -16
- package/src/services/local-content-request-handler.test.ts +202 -0
- package/src/services/local-content-request-handler.ts +267 -0
- package/src/services/local-content.test.ts +159 -27
- package/src/services/local-content.ts +55 -23
- package/src/services/local-gateway-service.ts +2 -17
- package/src/services/local-secrets.test.ts +20 -5
- package/src/services/local-secrets.ts +15 -11
- package/src/services/logger-console.test.ts +0 -1
- package/src/services/logger-console.ts +3 -7
- package/src/services/logger.ts +31 -46
- package/src/services/meta-service.test.ts +1 -5
- package/src/services/meta-service.ts +41 -61
- package/src/services/{scenario-actors-service.ts → personas-service.ts} +48 -43
- package/src/services/pikku-user-id.ts +0 -4
- package/src/services/queue-webhook-service.test.ts +2 -1
- package/src/services/queue-webhook-service.ts +10 -42
- package/src/services/scheduler-service.ts +1 -50
- package/src/services/schema-service.ts +1 -24
- package/src/services/scope-service.ts +50 -34
- package/src/services/scoped-secret-service.ts +4 -7
- package/src/services/secret-host-binding.test.ts +138 -0
- package/src/services/secret-host-binding.ts +51 -0
- package/src/services/secret-service.ts +12 -35
- package/src/services/secretless.test.ts +54 -0
- package/src/services/secretless.ts +29 -0
- package/src/services/stub-tracker.ts +8 -18
- package/src/services/system-role-guard.test.ts +93 -0
- package/src/services/system-role-guard.ts +71 -0
- package/src/services/trigger-service.ts +0 -12
- package/src/services/typed-secret-service.ts +12 -14
- package/src/services/v8-coverage-service.ts +3 -6
- package/src/services/variables-service.ts +1 -8
- package/src/services/webhook-service.ts +23 -64
- package/src/services/workflow-service.ts +3 -20
- package/src/testing/service-tests.ts +6 -32
- package/src/time-utils.ts +1 -19
- package/src/types/core.types.ts +137 -229
- package/src/types/state.types.ts +7 -9
- package/src/utils/hmac.ts +4 -10
- package/src/utils/safe-fetch.ts +13 -54
- package/src/utils.test.ts +11 -2
- package/src/utils.ts +6 -15
- package/src/wirings/actor-flow/actor-flow.types.ts +1 -34
- package/src/wirings/actor-flow/index.ts +0 -9
- package/src/wirings/actor-flow/run-conversation.test.ts +11 -6
- package/src/wirings/actor-flow/run-conversation.ts +19 -12
- package/src/wirings/ai-agent/ai-agent-agui.test.ts +91 -10
- package/src/wirings/ai-agent/ai-agent-agui.ts +49 -17
- package/src/wirings/ai-agent/ai-agent-helpers.ts +20 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.test.ts +842 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.ts +399 -0
- package/src/wirings/ai-agent/ai-agent-memory.ts +0 -2
- package/src/wirings/ai-agent/ai-agent-model-config.ts +1 -9
- package/src/wirings/ai-agent/ai-agent-prepare.test.ts +202 -31
- package/src/wirings/ai-agent/ai-agent-prepare.ts +89 -139
- package/src/wirings/ai-agent/ai-agent-registry.test.ts +191 -6
- package/src/wirings/ai-agent/ai-agent-registry.ts +18 -1
- package/src/wirings/ai-agent/ai-agent-resume-authorization.test.ts +0 -2
- package/src/wirings/ai-agent/ai-agent-runner.test.ts +11 -9
- package/src/wirings/ai-agent/ai-agent-runner.ts +85 -35
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +205 -103
- package/src/wirings/ai-agent/ai-agent-stream.ts +224 -76
- package/src/wirings/ai-agent/ai-agent-thread-ownership.test.ts +301 -0
- package/src/wirings/ai-agent/ai-agent.types.ts +130 -5
- package/src/wirings/ai-agent/index.ts +37 -3
- package/src/wirings/ai-agent/voice-input.test.ts +137 -7
- package/src/wirings/ai-agent/voice-input.ts +96 -12
- package/src/wirings/ai-agent/voice-output.test.ts +512 -0
- package/src/wirings/ai-agent/voice-output.ts +243 -56
- package/src/wirings/channel/channel-common.ts +15 -20
- package/src/wirings/channel/channel-handler.test.ts +50 -0
- package/src/wirings/channel/channel-handler.ts +32 -11
- package/src/wirings/channel/channel-host-rpc.test.ts +150 -0
- package/src/wirings/channel/channel-host-rpc.ts +69 -0
- package/src/wirings/channel/channel-middleware-runner.test.ts +0 -1
- package/src/wirings/channel/channel-middleware-runner.ts +0 -12
- package/src/wirings/channel/channel-rpc-registry.ts +116 -0
- package/src/wirings/channel/channel-rpc-responder.ts +117 -0
- package/src/wirings/channel/channel-rpc-service.ts +146 -0
- package/src/wirings/channel/channel-rpc-validators.ts +65 -0
- package/src/wirings/channel/channel-rpc.test.ts +820 -0
- package/src/wirings/channel/channel-rpc.ts +5 -0
- package/src/wirings/channel/channel-rpc.types.ts +150 -0
- package/src/wirings/channel/channel-runner.ts +0 -14
- package/src/wirings/channel/channel-store.ts +0 -10
- package/src/wirings/channel/channel.types.ts +19 -8
- package/src/wirings/channel/define-channel-routes.ts +0 -20
- package/src/wirings/channel/eventhub-service.ts +0 -18
- package/src/wirings/channel/index.ts +35 -0
- package/src/wirings/channel/local/local-channel-handler.ts +3 -1
- package/src/wirings/channel/local/local-channel-runner.test.ts +0 -10
- package/src/wirings/channel/local/local-channel-runner.ts +3 -1
- package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -13
- package/src/wirings/channel/local/local-eventhub-service.ts +2 -37
- package/src/wirings/channel/log-channels.ts +0 -4
- package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +83 -2
- package/src/wirings/channel/pikku-abstract-channel-handler.ts +7 -0
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +2 -5
- package/src/wirings/cli/channel/cli-approval.test.ts +177 -0
- package/src/wirings/cli/channel/cli-approval.ts +135 -0
- package/src/wirings/cli/channel/cli-channel-runner.ts +4 -26
- package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +169 -0
- package/src/wirings/cli/channel/cli-raw-channel-runner.ts +59 -16
- package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +480 -0
- package/src/wirings/cli/channel/cli-raw-client-runner.ts +185 -0
- package/src/wirings/cli/channel/index.ts +13 -0
- package/src/wirings/cli/cli-runner.test.ts +0 -1
- package/src/wirings/cli/cli-runner.ts +46 -88
- package/src/wirings/cli/cli.types.ts +14 -3
- package/src/wirings/cli/command-parser.test.ts +0 -4
- package/src/wirings/cli/command-parser.ts +11 -91
- package/src/wirings/cli/define-cli-commands.ts +1 -17
- package/src/wirings/credential/credential.types.ts +0 -12
- package/src/wirings/credential/{wire-credential.ts → define-credential.ts} +7 -7
- package/src/wirings/credential/index.ts +1 -1
- package/src/wirings/credential/validate-credential-definitions.ts +2 -4
- package/src/wirings/gateway/gateway-runner.test.ts +1 -21
- package/src/wirings/gateway/gateway-runner.ts +8 -110
- package/src/wirings/gateway/gateway.types.ts +7 -80
- package/src/wirings/http/http-routes.test.ts +0 -3
- package/src/wirings/http/http-routes.ts +0 -86
- package/src/wirings/http/http-runner.test.ts +0 -1
- package/src/wirings/http/http-runner.ts +8 -167
- package/src/wirings/http/http.types.ts +15 -62
- package/src/wirings/http/log-http-routes.ts +0 -4
- package/src/wirings/http/pikku-fetch-http-request.test.ts +2 -10
- package/src/wirings/http/pikku-fetch-http-request.ts +0 -58
- package/src/wirings/http/pikku-fetch-http-response.test.ts +1 -1
- package/src/wirings/http/pikku-fetch-http-response.ts +0 -3
- package/src/wirings/http/routers/path-to-regex.test.ts +4 -17
- package/src/wirings/http/routers/path-to-regex.ts +2 -13
- package/src/wirings/http/web-request.test.ts +33 -2
- package/src/wirings/http/web-request.ts +30 -17
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -1
- package/src/wirings/mcp/mcp-runner.ts +2 -17
- package/src/wirings/mcp/mcp.types.ts +7 -42
- package/src/wirings/oauth2/oauth2.types.ts +0 -30
- package/src/wirings/persona/define-personas.ts +33 -0
- package/src/wirings/persona/index.ts +62 -0
- package/src/wirings/persona/persona-email.ts +87 -0
- package/src/wirings/persona/persona-environments.test.ts +183 -0
- package/src/wirings/persona/persona-environments.ts +138 -0
- package/src/wirings/persona/persona-mailbox.ts +156 -0
- package/src/wirings/persona/persona.test.ts +220 -0
- package/src/wirings/persona/persona.types.ts +142 -0
- package/src/wirings/persona/validate-personas.ts +133 -0
- package/src/wirings/queue/index.ts +13 -3
- package/src/wirings/queue/queue-identity.test.ts +454 -0
- package/src/wirings/queue/queue-identity.ts +176 -0
- package/src/wirings/queue/queue-runner.ts +12 -31
- package/src/wirings/queue/queue.types.ts +25 -90
- package/src/wirings/queue/register-queue-helper.ts +0 -14
- package/src/wirings/queue/signed-queue-service.ts +60 -0
- package/src/wirings/queue/validate-worker-config.ts +2 -28
- package/src/wirings/role/define-system-role.ts +33 -0
- package/src/wirings/role/index.ts +13 -0
- package/src/wirings/role/role.test.ts +104 -0
- package/src/wirings/role/role.types.ts +47 -0
- package/src/wirings/role/validate-role-definitions.ts +93 -0
- package/src/wirings/rpc/addon-auth-tags.test.ts +223 -0
- package/src/wirings/rpc/addon-runner.ts +0 -56
- package/src/wirings/rpc/addon-scopes.test.ts +225 -0
- package/src/wirings/rpc/remote-addon-auth.ts +9 -16
- package/src/wirings/rpc/rpc-runner.test.ts +192 -6
- package/src/wirings/rpc/rpc-runner.ts +145 -127
- package/src/wirings/rpc/rpc-types.ts +11 -6
- package/src/wirings/rpc/wire-addon.test.ts +43 -1
- package/src/wirings/rpc/wire-addon.ts +99 -0
- package/src/wirings/rpc/wire-remote-addon.ts +9 -29
- package/src/wirings/scheduler/log-schedulers.ts +0 -4
- package/src/wirings/scheduler/scheduler-runner.test.ts +1 -8
- package/src/wirings/scheduler/scheduler-runner.ts +0 -2
- package/src/wirings/scheduler/scheduler.types.ts +1 -14
- package/src/wirings/scope/{wire-scope.ts → define-scope.ts} +5 -6
- package/src/wirings/scope/index.ts +1 -1
- package/src/wirings/scope/scope.test.ts +1 -2
- package/src/wirings/scope/scope.types.ts +7 -9
- package/src/wirings/scope/validate-scope-definitions.ts +3 -21
- package/src/wirings/secret/index.ts +1 -1
- package/src/wirings/secret/secret.types.ts +19 -15
- package/src/wirings/secret/validate-secret-definitions.ts +2 -4
- package/src/wirings/trigger/trigger-runner.ts +1 -27
- package/src/wirings/trigger/trigger.types.ts +1 -82
- package/src/wirings/variable/index.ts +1 -1
- package/src/wirings/variable/validate-variable-definitions.ts +2 -4
- package/src/wirings/variable/variable.types.ts +1 -13
- package/src/wirings/virtual-user/index.ts +88 -0
- package/src/wirings/virtual-user/prepare-virtual-user-run.test.ts +115 -0
- package/src/wirings/virtual-user/prepare-virtual-user-run.ts +95 -0
- package/src/wirings/virtual-user/run-virtual-user.test.ts +765 -0
- package/src/wirings/virtual-user/run-virtual-user.ts +671 -0
- package/src/wirings/virtual-user/virtual-user-agents.test.ts +65 -0
- package/src/wirings/virtual-user/virtual-user-agents.ts +57 -0
- package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +215 -0
- package/src/wirings/virtual-user/virtual-user-catalogue.ts +184 -0
- package/src/wirings/virtual-user/virtual-user-derive.test.ts +398 -0
- package/src/wirings/virtual-user/virtual-user-derive.ts +173 -0
- package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +63 -0
- package/src/wirings/virtual-user/virtual-user-dispositions.ts +213 -0
- package/src/wirings/virtual-user/virtual-user-intents.test.ts +208 -0
- package/src/wirings/virtual-user/virtual-user-intents.ts +185 -0
- package/src/wirings/virtual-user/virtual-user-rng.test.ts +72 -0
- package/src/wirings/virtual-user/virtual-user-rng.ts +50 -0
- package/src/wirings/virtual-user/virtual-user-run-store.ts +98 -0
- package/src/wirings/virtual-user/virtual-user-target.ts +47 -0
- package/src/wirings/virtual-user/virtual-user.types.ts +219 -0
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +19 -20
- package/src/wirings/workflow/dsl/workflow-runner.ts +0 -4
- package/src/wirings/workflow/feature.ts +0 -19
- package/src/wirings/workflow/graph/graph-node.ts +0 -136
- package/src/wirings/workflow/graph/graph-runner.test.ts +20 -19
- package/src/wirings/workflow/graph/graph-runner.ts +6 -41
- package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -4
- package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -58
- package/src/wirings/workflow/index.ts +10 -44
- package/src/wirings/workflow/pikku-scenario-service.ts +235 -61
- package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -39
- package/src/wirings/workflow/pikku-workflow-service.ts +77 -674
- package/src/wirings/workflow/run-timeline.test.ts +7 -19
- package/src/wirings/workflow/run-timeline.ts +0 -56
- package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -1
- package/src/wirings/workflow/scenario-cookie-jar.ts +0 -25
- package/src/wirings/workflow/scenario-expectations.test.ts +2 -7
- package/src/wirings/workflow/scenario-hooks.test.ts +2 -7
- package/src/wirings/workflow/scenario-poll.test.ts +0 -2
- package/src/wirings/workflow/scenario-poll.ts +0 -15
- package/src/wirings/workflow/scenario-prose.test.ts +5 -7
- package/src/wirings/workflow/scenario-prose.ts +1 -29
- package/src/wirings/workflow/scenario-service.test.ts +2 -10
- package/src/wirings/workflow/scenario-step-guards.ts +1 -14
- package/src/wirings/workflow/scenario-step.test.ts +163 -19
- package/src/wirings/workflow/scenario-step.types.ts +94 -12
- package/src/wirings/workflow/scenario-surface.test.ts +146 -0
- package/src/wirings/workflow/scenario-surface.ts +71 -0
- package/src/wirings/workflow/workflow-dispatch-durability.test.ts +14 -15
- package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -4
- package/src/wirings/workflow/workflow-inline-authority.test.ts +169 -0
- package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -2
- package/src/wirings/workflow/workflow-invocation-id.ts +2 -22
- package/src/wirings/workflow/workflow-mirror.test.ts +0 -7
- package/src/wirings/workflow/workflow-on-error.test.ts +0 -9
- package/src/wirings/workflow/workflow-queue-workers.ts +0 -21
- package/src/wirings/workflow/workflow-replay-snapshot.test.ts +8 -7
- package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -5
- package/src/wirings/workflow/workflow-run-context.test.ts +5 -10
- package/src/wirings/workflow/workflow-run-polling.test.ts +0 -5
- package/src/wirings/workflow/workflow-step-ordinal.test.ts +19 -4
- package/src/wirings/workflow/workflow-step-session.test.ts +0 -7
- package/src/wirings/workflow/workflow.types.ts +5 -201
- package/tsconfig.tsbuildinfo +1 -1
- package/tsconfig.type-tests.json +12 -0
- package/src/middleware/timeout.ts +0 -22
- package/src/pikku-response.ts +0 -5
- package/src/wirings/mcp/mcp-endpoint-registry.test.d.ts +0 -1
- package/src/wirings/workflow/dsl/index.ts +0 -36
- package/src/wirings/workflow/graph/index.ts +0 -15
|
@@ -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>;
|
|
@@ -2,46 +2,47 @@ import { pikkuState } from '../../../pikku-state.js';
|
|
|
2
2
|
import { parseCLIArguments, generateCommandHelp } from '../command-parser.js';
|
|
3
3
|
import { runCLICommand } from '../cli-runner.js';
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* The client sends argv untouched and this side owns parsing, so the command
|
|
6
|
+
* tree lives with the server and a client binary never needs to know it.
|
|
7
7
|
*/
|
|
8
|
-
export async function handleRawCLI({ programName, args, singletonServices, createWireServices, }) {
|
|
8
|
+
export async function handleRawCLI({ programName, args, singletonServices, createWireServices, onOutput, session, transport, }) {
|
|
9
9
|
const allCLIMeta = pikkuState(null, 'cli', 'meta');
|
|
10
10
|
if (!allCLIMeta) {
|
|
11
|
-
return { error: 'CLI metadata not found' };
|
|
11
|
+
return { error: 'CLI metadata not found', exitCode: 1 };
|
|
12
12
|
}
|
|
13
13
|
const programMeta = allCLIMeta.programs[programName];
|
|
14
14
|
if (!programMeta) {
|
|
15
|
-
return { error: `Program "${programName}" not found
|
|
15
|
+
return { error: `Program "${programName}" not found`, exitCode: 1 };
|
|
16
16
|
}
|
|
17
|
-
// Handle empty input or explicit help
|
|
18
17
|
if (args.length === 0 ||
|
|
19
18
|
args.includes('--help') ||
|
|
20
19
|
args.includes('-h') ||
|
|
21
20
|
args[0] === 'help') {
|
|
22
21
|
const helpArgs = args.filter((a) => a !== 'help' && a !== '--help' && a !== '-h');
|
|
23
22
|
const helpText = generateCommandHelp(programName, allCLIMeta, helpArgs);
|
|
24
|
-
return { help: helpText };
|
|
23
|
+
return { help: helpText, exitCode: 0 };
|
|
25
24
|
}
|
|
26
|
-
// Parse the args
|
|
27
25
|
const parsed = parseCLIArguments(args, programName, allCLIMeta);
|
|
28
|
-
// If there are errors or the command resolves to a group (no function), show help
|
|
29
26
|
if (parsed.errors.length > 0 || parsed.commandPath.length === 0) {
|
|
30
27
|
const helpText = generateCommandHelp(programName, allCLIMeta, parsed.commandPath);
|
|
31
|
-
|
|
28
|
+
// Help says what is available, not what they got wrong — so the parser's
|
|
29
|
+
// reason rides alongside it.
|
|
30
|
+
return {
|
|
31
|
+
help: helpText,
|
|
32
|
+
error: parsed.errors.length > 0 ? parsed.errors.join('\n') : undefined,
|
|
33
|
+
exitCode: 1,
|
|
34
|
+
};
|
|
32
35
|
}
|
|
33
|
-
// Check if the resolved command has a pikkuFuncId (is executable)
|
|
34
36
|
let current = programMeta.commands[parsed.commandPath[0]];
|
|
35
37
|
for (let i = 1; i < parsed.commandPath.length; i++) {
|
|
36
38
|
current = current?.subcommands?.[parsed.commandPath[i]];
|
|
37
39
|
}
|
|
38
40
|
if (!current?.pikkuFuncId) {
|
|
39
|
-
// It's a group command — show help scoped to that group
|
|
40
41
|
const helpText = generateCommandHelp(programName, allCLIMeta, parsed.commandPath);
|
|
41
|
-
return { help: helpText };
|
|
42
|
+
return { help: helpText, exitCode: 0 };
|
|
42
43
|
}
|
|
43
|
-
// Execute the command
|
|
44
44
|
const data = { ...parsed.positionals, ...parsed.options };
|
|
45
|
+
const commandId = parsed.commandPath.join('.');
|
|
45
46
|
try {
|
|
46
47
|
const result = await runCLICommand({
|
|
47
48
|
program: programName,
|
|
@@ -49,10 +50,17 @@ export async function handleRawCLI({ programName, args, singletonServices, creat
|
|
|
49
50
|
data,
|
|
50
51
|
singletonServices,
|
|
51
52
|
createWireServices,
|
|
53
|
+
session,
|
|
54
|
+
// Not known until parsing finishes here, so it is supplied per-frame.
|
|
55
|
+
onOutput: onOutput && ((data) => onOutput(data, commandId)),
|
|
56
|
+
transport,
|
|
52
57
|
});
|
|
53
|
-
return { result };
|
|
58
|
+
return { result, exitCode: 0, commandId };
|
|
54
59
|
}
|
|
55
60
|
catch (e) {
|
|
56
|
-
|
|
61
|
+
// A command can throw anything; `.message` off a string is undefined, and
|
|
62
|
+
// the run would then exit 1 saying nothing at all.
|
|
63
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
64
|
+
return { error: message || 'Command failed', exitCode: 1, commandId };
|
|
57
65
|
}
|
|
58
66
|
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ApprovalRequester, Capabilities } from '../../channel/channel-rpc.js';
|
|
2
|
+
import type { Logger } from '../../../services/logger.js';
|
|
3
|
+
/**
|
|
4
|
+
* Everything a renderer gets when the command ran on the server: a logger, and
|
|
5
|
+
* nothing else. There is no container on this side of the socket to resolve a
|
|
6
|
+
* service from, so this is the whole of it rather than a subset of
|
|
7
|
+
* `CoreSingletonServices` — which requires `config`, `variables` and `secrets`
|
|
8
|
+
* the client does not have and cannot invent.
|
|
9
|
+
*/
|
|
10
|
+
export type ClientCLIRenderServices = {
|
|
11
|
+
logger: Logger;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* A renderer that runs on the client of a CLI-over-channel connection.
|
|
15
|
+
*
|
|
16
|
+
* Deliberately not `CorePikkuCLIRender`: that type's `Services` parameter is
|
|
17
|
+
* constrained to `CoreSingletonServices`, so the honest logger-only shape
|
|
18
|
+
* cannot be spelled through it.
|
|
19
|
+
*/
|
|
20
|
+
export type CorePikkuCLIClientRender<Data> = (services: ClientCLIRenderServices, data: Data, session?: undefined) => void | Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Runs a CLI command entirely on the server. Unlike `executeCLIViaChannel`,
|
|
23
|
+
* argv is forwarded untouched and never parsed here, so the client carries no
|
|
24
|
+
* command metadata and its version may drift from the server's.
|
|
25
|
+
*
|
|
26
|
+
* `capabilities` are the functions this client agrees to run on the server's
|
|
27
|
+
* behalf: the map says what *can* run, and approval whether a call *should*.
|
|
28
|
+
* `approve` overrides the mode otherwise read from argv and from whether there
|
|
29
|
+
* is a terminal to ask at.
|
|
30
|
+
*/
|
|
31
|
+
export declare function executeRawCLIViaChannel({ pikkuWS, args, renderers, defaultRenderer, capabilities, approve, }: {
|
|
32
|
+
pikkuWS: any;
|
|
33
|
+
args?: string[];
|
|
34
|
+
renderers?: Record<string, CorePikkuCLIClientRender<any>>;
|
|
35
|
+
defaultRenderer?: CorePikkuCLIClientRender<any>;
|
|
36
|
+
capabilities?: Capabilities;
|
|
37
|
+
approve?: ApprovalRequester;
|
|
38
|
+
}): Promise<number>;
|