@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
|
@@ -6,14 +6,11 @@ import type {
|
|
|
6
6
|
CLIOption,
|
|
7
7
|
} from './cli.types.js'
|
|
8
8
|
|
|
9
|
-
/**
|
|
9
|
+
/** "from-plan" → "fromPlan"; the parser accepts either spelling. */
|
|
10
10
|
function toCamelCase(str: string): string {
|
|
11
11
|
return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase())
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
/** Convert camelCase to kebab-case for display: "autoApply" → "auto-apply".
|
|
15
|
-
* Flags are stored camelCase (matching the function input field) but shown
|
|
16
|
-
* kebab; the parser accepts both forms via toCamelCase. */
|
|
17
14
|
function toKebabCase(str: string): string {
|
|
18
15
|
return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase()
|
|
19
16
|
}
|
|
@@ -21,8 +18,7 @@ function toKebabCase(str: string): string {
|
|
|
21
18
|
/** Options the runner handles itself — never reported as unknown. */
|
|
22
19
|
const RESERVED_OPTIONS = new Set(['help'])
|
|
23
20
|
|
|
24
|
-
/**
|
|
25
|
-
* a near-miss option name, so the naive O(n*m) implementation is fine. */
|
|
21
|
+
/** Naive O(n*m); only ever used to suggest a near-miss option name. */
|
|
26
22
|
function levenshtein(a: string, b: string): number {
|
|
27
23
|
if (a === b) return 0
|
|
28
24
|
if (a.length === 0) return b.length
|
|
@@ -40,8 +36,7 @@ function levenshtein(a: string, b: string): number {
|
|
|
40
36
|
return prev[b.length]
|
|
41
37
|
}
|
|
42
38
|
|
|
43
|
-
/**
|
|
44
|
-
* Compares against the kebab-case rendering, since that is what is typed. */
|
|
39
|
+
/** Returns null beyond a distance of 2. */
|
|
45
40
|
function suggestOption(
|
|
46
41
|
typed: string,
|
|
47
42
|
availableOptions: Record<string, CLIOption>
|
|
@@ -64,9 +59,7 @@ function suggestOption(
|
|
|
64
59
|
return best
|
|
65
60
|
}
|
|
66
61
|
|
|
67
|
-
|
|
68
|
-
* Unknown options stay non-fatal for forward compatibility (a newer command
|
|
69
|
-
* version may understand them) — they are just no longer silent. */
|
|
62
|
+
// knowledge: decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md
|
|
70
63
|
function warnUnknownOption(
|
|
71
64
|
typed: string,
|
|
72
65
|
availableOptions: Record<string, CLIOption>,
|
|
@@ -83,22 +76,16 @@ function warnUnknownOption(
|
|
|
83
76
|
)
|
|
84
77
|
}
|
|
85
78
|
|
|
86
|
-
/**
|
|
87
|
-
* Result of parsing CLI arguments
|
|
88
|
-
*/
|
|
89
79
|
export interface ParsedCommand {
|
|
90
80
|
program: string
|
|
91
81
|
commandPath: string[]
|
|
92
82
|
positionals: Record<string, any>
|
|
93
83
|
options: Record<string, any>
|
|
94
84
|
errors: string[]
|
|
95
|
-
/** Non-fatal
|
|
85
|
+
/** Non-fatal: the command still runs. */
|
|
96
86
|
warnings: string[]
|
|
97
87
|
}
|
|
98
88
|
|
|
99
|
-
/**
|
|
100
|
-
* Parses raw CLI arguments into structured data for a specific program
|
|
101
|
-
*/
|
|
102
89
|
export function parseCLIArguments(
|
|
103
90
|
args: string[],
|
|
104
91
|
programName: string,
|
|
@@ -122,11 +109,9 @@ export function parseCLIArguments(
|
|
|
122
109
|
let currentIndex = 0
|
|
123
110
|
let currentMeta = meta
|
|
124
111
|
|
|
125
|
-
// Parse command path (non-flag arguments at the beginning)
|
|
126
112
|
while (currentIndex < args.length && !args[currentIndex].startsWith('-')) {
|
|
127
113
|
const arg = args[currentIndex]
|
|
128
114
|
|
|
129
|
-
// Check if this is a known subcommand
|
|
130
115
|
if (currentMeta.commands && currentMeta.commands[arg]) {
|
|
131
116
|
result.commandPath.push(arg)
|
|
132
117
|
currentMeta = {
|
|
@@ -141,13 +126,11 @@ export function parseCLIArguments(
|
|
|
141
126
|
}
|
|
142
127
|
currentIndex++
|
|
143
128
|
} else {
|
|
144
|
-
// Not a subcommand, must be a positional argument
|
|
145
129
|
break
|
|
146
130
|
}
|
|
147
131
|
}
|
|
148
132
|
|
|
149
|
-
//
|
|
150
|
-
// Only use default if user didn't provide any non-flag arguments
|
|
133
|
+
// A default command only applies when the user named no command at all.
|
|
151
134
|
const hasNonFlagArgs = args.some(
|
|
152
135
|
(arg, idx) => idx >= currentIndex && !arg.startsWith('-')
|
|
153
136
|
)
|
|
@@ -169,10 +152,8 @@ export function parseCLIArguments(
|
|
|
169
152
|
}
|
|
170
153
|
}
|
|
171
154
|
|
|
172
|
-
// Get the final command metadata
|
|
173
155
|
const commandMeta = getCommandMeta(meta, result.commandPath)
|
|
174
156
|
if (!commandMeta) {
|
|
175
|
-
// If we have no command path but there are non-flag args, the first arg is likely an unknown command
|
|
176
157
|
if (
|
|
177
158
|
result.commandPath.length === 0 &&
|
|
178
159
|
hasNonFlagArgs &&
|
|
@@ -186,9 +167,7 @@ export function parseCLIArguments(
|
|
|
186
167
|
return result
|
|
187
168
|
}
|
|
188
169
|
|
|
189
|
-
//
|
|
190
|
-
// own — cannot be executed directly. Surface a routable error so the runner
|
|
191
|
-
// shows its subcommand help instead of attempting to run a missing function.
|
|
170
|
+
// knowledge: decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md
|
|
192
171
|
if (
|
|
193
172
|
!commandMeta.pikkuFuncId &&
|
|
194
173
|
commandMeta.subcommands &&
|
|
@@ -198,10 +177,8 @@ export function parseCLIArguments(
|
|
|
198
177
|
return result
|
|
199
178
|
}
|
|
200
179
|
|
|
201
|
-
// Collect all available options (global + inherited)
|
|
202
180
|
const availableOptions = collectAvailableOptions(meta, result.commandPath)
|
|
203
181
|
|
|
204
|
-
// Parse remaining arguments as positionals and options
|
|
205
182
|
const positionalArgs: string[] = []
|
|
206
183
|
const optionArgs: Record<string, any> = {}
|
|
207
184
|
|
|
@@ -209,7 +186,6 @@ export function parseCLIArguments(
|
|
|
209
186
|
const arg = args[currentIndex]
|
|
210
187
|
|
|
211
188
|
if (arg.startsWith('--')) {
|
|
212
|
-
// Long option (--from-plan → fromPlan)
|
|
213
189
|
const negatedKey = arg.startsWith('--no-')
|
|
214
190
|
? toCamelCase(arg.slice(5))
|
|
215
191
|
: undefined
|
|
@@ -218,17 +194,13 @@ export function parseCLIArguments(
|
|
|
218
194
|
negatedKey &&
|
|
219
195
|
typeof availableOptions[negatedKey]?.default === 'boolean'
|
|
220
196
|
) {
|
|
221
|
-
//
|
|
222
|
-
//
|
|
223
|
-
// name still parses as itself.
|
|
197
|
+
// Requiring a boolean default keeps a literal `--no-something` option
|
|
198
|
+
// name parsing as itself rather than as a negation.
|
|
224
199
|
optionArgs[negatedKey] = false
|
|
225
200
|
} else if (equalIndex > 0) {
|
|
226
|
-
// --option=value format
|
|
227
201
|
const key = toCamelCase(arg.slice(2, equalIndex))
|
|
228
202
|
const optionDef = availableOptions[key]
|
|
229
203
|
|
|
230
|
-
// Unknown options are allowed for forward compatibility, but warned
|
|
231
|
-
// about so they are not silently dropped by the input schema.
|
|
232
204
|
if (!optionDef) {
|
|
233
205
|
warnUnknownOption(arg.slice(2, equalIndex), availableOptions, result)
|
|
234
206
|
}
|
|
@@ -236,18 +208,14 @@ export function parseCLIArguments(
|
|
|
236
208
|
const value = arg.slice(equalIndex + 1)
|
|
237
209
|
optionArgs[key] = parseOptionValue(value, optionDef)
|
|
238
210
|
} else {
|
|
239
|
-
// --option value format
|
|
240
211
|
const key = toCamelCase(arg.slice(2))
|
|
241
212
|
const optionDef = availableOptions[key]
|
|
242
213
|
|
|
243
|
-
// Unknown options are allowed for forward compatibility, but warned
|
|
244
|
-
// about so they are not silently dropped by the input schema.
|
|
245
214
|
if (!optionDef) {
|
|
246
215
|
warnUnknownOption(arg.slice(2), availableOptions, result)
|
|
247
216
|
}
|
|
248
217
|
|
|
249
218
|
if (optionDef && optionDef.array) {
|
|
250
|
-
// Array option - collect all following non-flag values
|
|
251
219
|
currentIndex++
|
|
252
220
|
const values: any[] = []
|
|
253
221
|
while (
|
|
@@ -263,23 +231,19 @@ export function parseCLIArguments(
|
|
|
263
231
|
currentIndex + 1 < args.length &&
|
|
264
232
|
!args[currentIndex + 1].startsWith('-')
|
|
265
233
|
) {
|
|
266
|
-
// Next arg is the value
|
|
267
234
|
currentIndex++
|
|
268
235
|
optionArgs[key] = parseOptionValue(args[currentIndex], optionDef)
|
|
269
236
|
} else {
|
|
270
|
-
// Boolean flag
|
|
271
237
|
optionArgs[key] = true
|
|
272
238
|
}
|
|
273
239
|
}
|
|
274
240
|
} else if (arg.startsWith('-') && arg.length > 1) {
|
|
275
|
-
// Short option(s)
|
|
276
241
|
for (let i = 1; i < arg.length; i++) {
|
|
277
242
|
const shortFlag = arg[i]
|
|
278
243
|
|
|
279
|
-
// Find the corresponding long option
|
|
280
244
|
const longOption = findLongOption(shortFlag, availableOptions)
|
|
281
245
|
if (longOption) {
|
|
282
|
-
//
|
|
246
|
+
// Only the last flag in a cluster can take a value.
|
|
283
247
|
if (
|
|
284
248
|
i === arg.length - 1 &&
|
|
285
249
|
currentIndex + 1 < args.length &&
|
|
@@ -291,7 +255,6 @@ export function parseCLIArguments(
|
|
|
291
255
|
availableOptions[longOption]
|
|
292
256
|
)
|
|
293
257
|
} else {
|
|
294
|
-
// Boolean flag
|
|
295
258
|
optionArgs[longOption] = true
|
|
296
259
|
}
|
|
297
260
|
} else {
|
|
@@ -299,17 +262,14 @@ export function parseCLIArguments(
|
|
|
299
262
|
}
|
|
300
263
|
}
|
|
301
264
|
} else {
|
|
302
|
-
// Positional argument
|
|
303
265
|
positionalArgs.push(arg)
|
|
304
266
|
}
|
|
305
267
|
|
|
306
268
|
currentIndex++
|
|
307
269
|
}
|
|
308
270
|
|
|
309
|
-
// Map positional arguments to named parameters
|
|
310
271
|
mapPositionalArguments(commandMeta.positionals, positionalArgs, result)
|
|
311
272
|
|
|
312
|
-
// Apply option defaults and validation
|
|
313
273
|
applyOptionDefaults(availableOptions, optionArgs, result)
|
|
314
274
|
|
|
315
275
|
result.options = optionArgs
|
|
@@ -317,9 +277,6 @@ export function parseCLIArguments(
|
|
|
317
277
|
return result
|
|
318
278
|
}
|
|
319
279
|
|
|
320
|
-
/**
|
|
321
|
-
* Gets the command metadata for a given path
|
|
322
|
-
*/
|
|
323
280
|
function getCommandMeta(
|
|
324
281
|
meta: CLIProgramMeta,
|
|
325
282
|
path: string[]
|
|
@@ -343,9 +300,6 @@ function getCommandMeta(
|
|
|
343
300
|
return current
|
|
344
301
|
}
|
|
345
302
|
|
|
346
|
-
/**
|
|
347
|
-
* Collects all available options through the inheritance chain
|
|
348
|
-
*/
|
|
349
303
|
function collectAvailableOptions(
|
|
350
304
|
meta: CLIProgramMeta,
|
|
351
305
|
path: string[]
|
|
@@ -356,7 +310,6 @@ function collectAvailableOptions(
|
|
|
356
310
|
return options
|
|
357
311
|
}
|
|
358
312
|
|
|
359
|
-
// Walk through the command path, merging options
|
|
360
313
|
let current = meta.commands[path[0]]
|
|
361
314
|
if (current) {
|
|
362
315
|
options = { ...options, ...current.options }
|
|
@@ -372,9 +325,6 @@ function collectAvailableOptions(
|
|
|
372
325
|
return options
|
|
373
326
|
}
|
|
374
327
|
|
|
375
|
-
/**
|
|
376
|
-
* Finds the long option name for a short flag
|
|
377
|
-
*/
|
|
378
328
|
function findLongOption(
|
|
379
329
|
shortFlag: string,
|
|
380
330
|
options: Record<string, CLIOption>
|
|
@@ -387,12 +337,8 @@ function findLongOption(
|
|
|
387
337
|
return null
|
|
388
338
|
}
|
|
389
339
|
|
|
390
|
-
/**
|
|
391
|
-
* Parses an option value based on its definition
|
|
392
|
-
*/
|
|
393
340
|
function parseOptionValue(value: string, optionDef?: CLIOption): any {
|
|
394
341
|
if (!optionDef) {
|
|
395
|
-
// No definition, try to infer type
|
|
396
342
|
if (value === 'true') return true
|
|
397
343
|
if (value === 'false') return false
|
|
398
344
|
if (/^\d+$/.test(value)) return parseInt(value, 10)
|
|
@@ -400,7 +346,6 @@ function parseOptionValue(value: string, optionDef?: CLIOption): any {
|
|
|
400
346
|
return value
|
|
401
347
|
}
|
|
402
348
|
|
|
403
|
-
// Use default type from option definition
|
|
404
349
|
const defaultValue = optionDef.default
|
|
405
350
|
if (typeof defaultValue === 'boolean') {
|
|
406
351
|
return value === 'true' || value === '1' || value === 'yes'
|
|
@@ -409,18 +354,14 @@ function parseOptionValue(value: string, optionDef?: CLIOption): any {
|
|
|
409
354
|
return parseFloat(value)
|
|
410
355
|
}
|
|
411
356
|
|
|
412
|
-
// Check choices
|
|
413
357
|
if (optionDef.choices && !optionDef.choices.includes(value as any)) {
|
|
414
|
-
//
|
|
358
|
+
// Deliberately not an error here — applyOptionDefaults reports bad choices.
|
|
415
359
|
return value
|
|
416
360
|
}
|
|
417
361
|
|
|
418
362
|
return value
|
|
419
363
|
}
|
|
420
364
|
|
|
421
|
-
/**
|
|
422
|
-
* Maps positional arguments to named parameters
|
|
423
|
-
*/
|
|
424
365
|
function mapPositionalArguments(
|
|
425
366
|
positionalDefs: CLIPositional[],
|
|
426
367
|
args: string[],
|
|
@@ -430,7 +371,6 @@ function mapPositionalArguments(
|
|
|
430
371
|
|
|
431
372
|
for (const def of positionalDefs) {
|
|
432
373
|
if (def.variadic) {
|
|
433
|
-
// Collect all remaining arguments
|
|
434
374
|
if (argIndex < args.length) {
|
|
435
375
|
result.positionals[def.name] = args.slice(argIndex)
|
|
436
376
|
argIndex = args.length
|
|
@@ -440,7 +380,6 @@ function mapPositionalArguments(
|
|
|
440
380
|
result.positionals[def.name] = []
|
|
441
381
|
}
|
|
442
382
|
} else {
|
|
443
|
-
// Single argument
|
|
444
383
|
if (argIndex < args.length) {
|
|
445
384
|
result.positionals[def.name] = args[argIndex]
|
|
446
385
|
argIndex++
|
|
@@ -450,7 +389,6 @@ function mapPositionalArguments(
|
|
|
450
389
|
}
|
|
451
390
|
}
|
|
452
391
|
|
|
453
|
-
// Check for extra positional arguments
|
|
454
392
|
if (argIndex < args.length) {
|
|
455
393
|
result.errors.push(
|
|
456
394
|
`Unexpected arguments: ${args.slice(argIndex).join(' ')}`
|
|
@@ -458,26 +396,20 @@ function mapPositionalArguments(
|
|
|
458
396
|
}
|
|
459
397
|
}
|
|
460
398
|
|
|
461
|
-
/**
|
|
462
|
-
* Applies option defaults and validates choices
|
|
463
|
-
*/
|
|
464
399
|
function applyOptionDefaults(
|
|
465
400
|
optionDefs: Record<string, CLIOption>,
|
|
466
401
|
options: Record<string, any>,
|
|
467
402
|
result: ParsedCommand
|
|
468
403
|
) {
|
|
469
404
|
for (const [name, def] of Object.entries(optionDefs)) {
|
|
470
|
-
// Apply default if not provided
|
|
471
405
|
if (!(name in options) && def.default !== undefined) {
|
|
472
406
|
options[name] = def.default
|
|
473
407
|
}
|
|
474
408
|
|
|
475
|
-
// Check required
|
|
476
409
|
if (def.required && !(name in options)) {
|
|
477
410
|
result.errors.push(`Missing required option: --${toKebabCase(name)}`)
|
|
478
411
|
}
|
|
479
412
|
|
|
480
|
-
// Validate choices
|
|
481
413
|
if (def.choices && name in options) {
|
|
482
414
|
const value = options[name]
|
|
483
415
|
if (Array.isArray(value)) {
|
|
@@ -497,9 +429,6 @@ function applyOptionDefaults(
|
|
|
497
429
|
}
|
|
498
430
|
}
|
|
499
431
|
|
|
500
|
-
/**
|
|
501
|
-
* Generates help text for a command in a specific program
|
|
502
|
-
*/
|
|
503
432
|
export function generateCommandHelp(
|
|
504
433
|
programName: string,
|
|
505
434
|
allMeta: CLIMeta,
|
|
@@ -513,7 +442,6 @@ export function generateCommandHelp(
|
|
|
513
442
|
}
|
|
514
443
|
|
|
515
444
|
if (commandPath.length === 0) {
|
|
516
|
-
// Root help for the program
|
|
517
445
|
lines.push(`Usage: ${programName} <command> [options]`)
|
|
518
446
|
lines.push('')
|
|
519
447
|
lines.push('Commands:')
|
|
@@ -530,13 +458,11 @@ export function generateCommandHelp(
|
|
|
530
458
|
formatOptions(meta.options, lines)
|
|
531
459
|
}
|
|
532
460
|
} else {
|
|
533
|
-
// Command-specific help
|
|
534
461
|
const commandMeta = getCommandMeta(meta, commandPath)
|
|
535
462
|
if (!commandMeta) {
|
|
536
463
|
return `Unknown command: ${commandPath.join(' ')}`
|
|
537
464
|
}
|
|
538
465
|
|
|
539
|
-
// Usage line
|
|
540
466
|
let usage = `${programName} ${commandPath.join(' ')}`
|
|
541
467
|
if (commandMeta.parameters) {
|
|
542
468
|
usage += ' ' + commandMeta.parameters
|
|
@@ -548,7 +474,6 @@ export function generateCommandHelp(
|
|
|
548
474
|
lines.push(commandMeta.description)
|
|
549
475
|
}
|
|
550
476
|
|
|
551
|
-
// Positional arguments
|
|
552
477
|
if (commandMeta.positionals.length > 0) {
|
|
553
478
|
lines.push('')
|
|
554
479
|
lines.push('Arguments:')
|
|
@@ -559,7 +484,6 @@ export function generateCommandHelp(
|
|
|
559
484
|
}
|
|
560
485
|
}
|
|
561
486
|
|
|
562
|
-
// Subcommands
|
|
563
487
|
if (
|
|
564
488
|
commandMeta.subcommands &&
|
|
565
489
|
Object.keys(commandMeta.subcommands).length > 0
|
|
@@ -572,7 +496,6 @@ export function generateCommandHelp(
|
|
|
572
496
|
}
|
|
573
497
|
}
|
|
574
498
|
|
|
575
|
-
// Options
|
|
576
499
|
const availableOptions = collectAvailableOptions(meta, commandPath)
|
|
577
500
|
if (Object.keys(availableOptions).length > 0) {
|
|
578
501
|
lines.push('')
|
|
@@ -584,9 +507,6 @@ export function generateCommandHelp(
|
|
|
584
507
|
return lines.join('\n')
|
|
585
508
|
}
|
|
586
509
|
|
|
587
|
-
/**
|
|
588
|
-
* Formats options for help text
|
|
589
|
-
*/
|
|
590
510
|
function formatOptions(options: Record<string, CLIOption>, lines: string[]) {
|
|
591
511
|
for (const [name, opt] of Object.entries(options)) {
|
|
592
512
|
let line = ' '
|
|
@@ -1,22 +1,6 @@
|
|
|
1
1
|
import type { CoreCLICommandConfig } from './cli.types.js'
|
|
2
2
|
|
|
3
|
-
/**
|
|
4
|
-
* Type-safe helper for defining CLI commands that can be composed.
|
|
5
|
-
* Returns the commands record as-is (identity function) for use with `wireCLI`.
|
|
6
|
-
*
|
|
7
|
-
* @example
|
|
8
|
-
* ```typescript
|
|
9
|
-
* export const chatCommands = defineCLICommands({
|
|
10
|
-
* chat: pikkuCLICommand({ func: chatFunc }),
|
|
11
|
-
* 'chat:history': pikkuCLICommand({ func: historyFunc }),
|
|
12
|
-
* })
|
|
13
|
-
*
|
|
14
|
-
* wireCLI({
|
|
15
|
-
* program: 'my-app',
|
|
16
|
-
* commands: { ...chatCommands, other: pikkuCLICommand({ func: otherFunc }) }
|
|
17
|
-
* })
|
|
18
|
-
* ```
|
|
19
|
-
*/
|
|
3
|
+
/** Identity at runtime; exists so a commands record can be typed and composed before `wireCLI`. */
|
|
20
4
|
export function defineCLICommands<
|
|
21
5
|
T extends Record<string, CoreCLICommandConfig<any, any, any, any>>,
|
|
22
6
|
>(commands: T): T {
|
|
@@ -6,12 +6,6 @@ export type CoreCredential<T = unknown> = {
|
|
|
6
6
|
description?: string
|
|
7
7
|
type: 'singleton' | 'wire'
|
|
8
8
|
schema: T
|
|
9
|
-
/**
|
|
10
|
-
* Link to documentation explaining how to obtain this value — a provider's
|
|
11
|
-
* API-key page, a setup guide, an internal runbook. Surfaced by consoles and
|
|
12
|
-
* deploy UIs so a user facing a missing value has somewhere to go instead of
|
|
13
|
-
* an opaque identifier.
|
|
14
|
-
*/
|
|
15
9
|
docsUrl?: string
|
|
16
10
|
oauth2?: OAuth2CredentialConfig & {
|
|
17
11
|
appCredentialSecretId: string
|
|
@@ -24,12 +18,6 @@ export type CredentialDefinitionMeta = {
|
|
|
24
18
|
description?: string
|
|
25
19
|
type: 'singleton' | 'wire'
|
|
26
20
|
schema?: Record<string, unknown> | string
|
|
27
|
-
/**
|
|
28
|
-
* Link to documentation explaining how to obtain this value — a provider's
|
|
29
|
-
* API-key page, a setup guide, an internal runbook. Surfaced by consoles and
|
|
30
|
-
* deploy UIs so a user facing a missing value has somewhere to go instead of
|
|
31
|
-
* an opaque identifier.
|
|
32
|
-
*/
|
|
33
21
|
docsUrl?: string
|
|
34
22
|
oauth2?: OAuth2CredentialConfig & {
|
|
35
23
|
appCredentialSecretId: string
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import type { CoreCredential } from './credential.types.js'
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Declares a credential. The body is a no-op that tree-shakes away — the CLI
|
|
5
|
+
* reads the call by AST, so the declaration must be a top-level literal.
|
|
6
|
+
* `type: 'wire'` is per-user, `type: 'singleton'` is platform-wide.
|
|
7
7
|
*
|
|
8
8
|
* @example
|
|
9
9
|
* ```typescript
|
|
10
10
|
* // Per-user API key
|
|
11
|
-
*
|
|
11
|
+
* defineCredential({
|
|
12
12
|
* name: 'stripe',
|
|
13
13
|
* displayName: 'Stripe API Key',
|
|
14
14
|
* type: 'wire',
|
|
@@ -16,7 +16,7 @@ import type { CoreCredential } from './credential.types.js'
|
|
|
16
16
|
* })
|
|
17
17
|
*
|
|
18
18
|
* // Per-user OAuth
|
|
19
|
-
*
|
|
19
|
+
* defineCredential({
|
|
20
20
|
* name: 'google-sheets',
|
|
21
21
|
* displayName: 'Google Sheets',
|
|
22
22
|
* type: 'wire',
|
|
@@ -31,7 +31,7 @@ import type { CoreCredential } from './credential.types.js'
|
|
|
31
31
|
* })
|
|
32
32
|
*
|
|
33
33
|
* // Platform-level OAuth (singleton)
|
|
34
|
-
*
|
|
34
|
+
* defineCredential({
|
|
35
35
|
* name: 'slack',
|
|
36
36
|
* displayName: 'Slack',
|
|
37
37
|
* type: 'singleton',
|
|
@@ -46,4 +46,4 @@ import type { CoreCredential } from './credential.types.js'
|
|
|
46
46
|
* })
|
|
47
47
|
* ```
|
|
48
48
|
*/
|
|
49
|
-
export const
|
|
49
|
+
export const defineCredential = <T>(_config: CoreCredential<T>): void => {}
|
|
@@ -2,11 +2,9 @@ import type {
|
|
|
2
2
|
CredentialDefinitions,
|
|
3
3
|
CredentialDefinitionsMeta,
|
|
4
4
|
} from './credential.types.js'
|
|
5
|
+
import type { SchemaRefLike } from '../../types/core.types.js'
|
|
5
6
|
|
|
6
|
-
export
|
|
7
|
-
variableName: string
|
|
8
|
-
sourceFile: string
|
|
9
|
-
}
|
|
7
|
+
export type { SchemaRefLike }
|
|
10
8
|
|
|
11
9
|
export function validateAndBuildCredentialDefinitionsMeta(
|
|
12
10
|
definitions: CredentialDefinitions,
|
|
@@ -11,8 +11,6 @@ import type {
|
|
|
11
11
|
} from './gateway.types.js'
|
|
12
12
|
import type { CorePikkuMiddleware } from '../../types/core.types.js'
|
|
13
13
|
|
|
14
|
-
// --- Mock adapter ----------------------------------------------------------
|
|
15
|
-
|
|
16
14
|
const createMockAdapter = (
|
|
17
15
|
opts: {
|
|
18
16
|
name?: string
|
|
@@ -63,8 +61,6 @@ const createMockAdapter = (
|
|
|
63
61
|
}
|
|
64
62
|
}
|
|
65
63
|
|
|
66
|
-
// --- Test helpers -----------------------------------------------------------
|
|
67
|
-
|
|
68
64
|
const setupState = () => {
|
|
69
65
|
resetPikkuState()
|
|
70
66
|
httpRouter.reset()
|
|
@@ -86,7 +82,7 @@ const setupState = () => {
|
|
|
86
82
|
} as any)
|
|
87
83
|
}
|
|
88
84
|
|
|
89
|
-
// Mirrors the inspector
|
|
85
|
+
// Mirrors what the inspector compiles for a wireGateway call.
|
|
90
86
|
const seedCompiledMeta = () => {
|
|
91
87
|
const httpMeta = pikkuState(null, 'http', 'meta') as any
|
|
92
88
|
const funcMeta = pikkuState(null, 'function', 'meta') as any
|
|
@@ -111,8 +107,6 @@ const seedCompiledMeta = () => {
|
|
|
111
107
|
}
|
|
112
108
|
}
|
|
113
109
|
|
|
114
|
-
// --- Tests ------------------------------------------------------------------
|
|
115
|
-
|
|
116
110
|
describe('wireGateway', () => {
|
|
117
111
|
beforeEach(() => {
|
|
118
112
|
setupState()
|
|
@@ -148,18 +142,15 @@ describe('wireGateway', () => {
|
|
|
148
142
|
const response = await fetch(request)
|
|
149
143
|
assert.equal(response.status, 200)
|
|
150
144
|
|
|
151
|
-
// Verify func was called with parsed message
|
|
152
145
|
assert.equal(funcCalls.length, 1)
|
|
153
146
|
assert.equal(funcCalls[0].data.senderId, 'user-1')
|
|
154
147
|
assert.equal(funcCalls[0].data.text, 'hello')
|
|
155
148
|
|
|
156
|
-
// Verify wire.gateway was populated
|
|
157
149
|
assert.equal(funcCalls[0].gateway.gatewayName, 'test-webhook')
|
|
158
150
|
assert.equal(funcCalls[0].gateway.senderId, 'user-1')
|
|
159
151
|
assert.equal(funcCalls[0].gateway.platform, 'mock')
|
|
160
152
|
assert.equal(typeof funcCalls[0].gateway.send, 'function')
|
|
161
153
|
|
|
162
|
-
// Verify auto-send of response
|
|
163
154
|
assert.equal(adapter.sentMessages.length, 1)
|
|
164
155
|
assert.equal(adapter.sentMessages[0].senderId, 'user-1')
|
|
165
156
|
assert.equal(adapter.sentMessages[0].message.text, 'reply')
|
|
@@ -185,7 +176,6 @@ describe('wireGateway', () => {
|
|
|
185
176
|
seedCompiledMeta()
|
|
186
177
|
httpRouter.initialize()
|
|
187
178
|
|
|
188
|
-
// Factory must NOT run at wiring time
|
|
189
179
|
assert.equal(factoryCalls.length, 0)
|
|
190
180
|
|
|
191
181
|
const makeRequest = () =>
|
|
@@ -202,11 +192,9 @@ describe('wireGateway', () => {
|
|
|
202
192
|
const second = await makeRequest()
|
|
203
193
|
assert.equal(second.status, 200)
|
|
204
194
|
|
|
205
|
-
// Factory ran exactly once, with the singleton services
|
|
206
195
|
assert.equal(factoryCalls.length, 1)
|
|
207
196
|
assert.equal(typeof factoryCalls[0].logger.info, 'function')
|
|
208
197
|
|
|
209
|
-
// Messages flowed through the resolved adapter (auto-send reply)
|
|
210
198
|
assert.equal(adapter.sentMessages.length, 2)
|
|
211
199
|
assert.equal(adapter.sentMessages[0].message.text, 'pong')
|
|
212
200
|
})
|
|
@@ -265,7 +253,6 @@ describe('wireGateway', () => {
|
|
|
265
253
|
const response = await fetch(request)
|
|
266
254
|
assert.equal(response.status, 200)
|
|
267
255
|
|
|
268
|
-
// Func should NOT be called
|
|
269
256
|
assert.equal(funcCalls.length, 0)
|
|
270
257
|
})
|
|
271
258
|
|
|
@@ -310,9 +297,7 @@ describe('wireGateway', () => {
|
|
|
310
297
|
|
|
311
298
|
await fetch(request)
|
|
312
299
|
|
|
313
|
-
// Middleware should have run
|
|
314
300
|
assert.equal(middlewareCalls.length, 1)
|
|
315
|
-
// Middleware should see wire.gateway
|
|
316
301
|
assert.equal(middlewareCalls[0].gateway.senderId, 'user-2')
|
|
317
302
|
assert.equal(middlewareCalls[0].gateway.platform, 'mock')
|
|
318
303
|
})
|
|
@@ -418,9 +403,7 @@ describe('wireGateway', () => {
|
|
|
418
403
|
func: {
|
|
419
404
|
func: async (_services: any, _data: any, wire: any) => {
|
|
420
405
|
capturedGateway = wire.gateway
|
|
421
|
-
// Send a proactive message via gateway
|
|
422
406
|
await wire.gateway.send({ text: 'proactive msg' })
|
|
423
|
-
// Don't return a response (no auto-send)
|
|
424
407
|
},
|
|
425
408
|
},
|
|
426
409
|
})
|
|
@@ -436,7 +419,6 @@ describe('wireGateway', () => {
|
|
|
436
419
|
|
|
437
420
|
await fetch(request)
|
|
438
421
|
|
|
439
|
-
// Proactive message was sent
|
|
440
422
|
assert.equal(adapter.sentMessages.length, 1)
|
|
441
423
|
assert.equal(adapter.sentMessages[0].message.text, 'proactive msg')
|
|
442
424
|
})
|
|
@@ -502,7 +484,6 @@ describe('wireGateway', () => {
|
|
|
502
484
|
singletonServices
|
|
503
485
|
)
|
|
504
486
|
|
|
505
|
-
// Simulate incoming message
|
|
506
487
|
await handleMessage({
|
|
507
488
|
senderId: 'listener-user',
|
|
508
489
|
text: 'hello from listener',
|
|
@@ -513,7 +494,6 @@ describe('wireGateway', () => {
|
|
|
513
494
|
assert.equal(funcCalls[0].data.text, 'hello from listener')
|
|
514
495
|
assert.equal(funcCalls[0].gateway.platform, 'mock')
|
|
515
496
|
|
|
516
|
-
// Auto-send response
|
|
517
497
|
assert.equal(adapter.sentMessages.length, 1)
|
|
518
498
|
assert.equal(adapter.sentMessages[0].message.text, 'listener-reply')
|
|
519
499
|
})
|