@pikku/core 0.12.71 → 0.12.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +848 -0
- package/dist/crypto-utils.d.ts +30 -5
- package/dist/crypto-utils.js +146 -41
- package/dist/dev/hot-reload.js +11 -30
- package/dist/dev/module-runner.d.ts +3 -7
- package/dist/dev/module-runner.js +4 -10
- package/dist/dev/reload-meta.d.ts +8 -20
- package/dist/dev/reload-meta.js +9 -29
- package/dist/errors/error-handler.d.ts +5 -30
- package/dist/errors/error-handler.js +16 -32
- package/dist/errors/errors.d.ts +32 -151
- package/dist/errors/errors.js +55 -157
- package/dist/function/abort-scope.d.ts +47 -0
- package/dist/function/abort-scope.js +63 -0
- package/dist/function/function-runner.js +40 -30
- package/dist/function/functions.types.d.ts +44 -136
- package/dist/function/functions.types.js +0 -58
- package/dist/function/list.types.d.ts +12 -62
- package/dist/function/list.types.js +4 -25
- package/dist/handle-error.d.ts +0 -11
- package/dist/handle-error.js +6 -18
- package/dist/index.d.ts +5 -2
- package/dist/index.js +4 -1
- package/dist/middleware/auth-apikey.d.ts +3 -18
- package/dist/middleware/auth-apikey.js +0 -17
- package/dist/middleware/auth-bearer.d.ts +6 -41
- package/dist/middleware/auth-bearer.js +3 -40
- package/dist/middleware/auth-cookie.d.ts +5 -27
- package/dist/middleware/auth-cookie.js +2 -26
- package/dist/middleware/cors.d.ts +7 -34
- package/dist/middleware/cors.js +7 -34
- package/dist/middleware/remote-auth.d.ts +3 -1
- package/dist/middleware/remote-auth.js +3 -2
- package/dist/middleware/telemetry.d.ts +8 -33
- package/dist/middleware/telemetry.js +2 -31
- package/dist/middleware-runner.d.ts +4 -55
- package/dist/middleware-runner.js +5 -74
- package/dist/permissions.d.ts +3 -44
- package/dist/permissions.js +19 -71
- package/dist/pikku-request.d.ts +0 -6
- package/dist/pikku-request.js +0 -6
- package/dist/pikku-state.d.ts +0 -26
- package/dist/pikku-state.js +2 -30
- package/dist/remote.d.ts +3 -5
- package/dist/remote.js +8 -7
- package/dist/schema.d.ts +7 -17
- package/dist/schema.js +30 -18
- package/dist/scopes.d.ts +4 -23
- package/dist/scopes.js +7 -48
- package/dist/services/ai-agent-runner-service.d.ts +20 -0
- package/dist/services/ai-embedding-service.d.ts +2 -25
- package/dist/services/audit-service.js +1 -2
- package/dist/services/content-service.d.ts +1 -46
- package/dist/services/credential-service.d.ts +3 -40
- package/dist/services/deployment-service.d.ts +3 -9
- package/dist/services/gateway-service.d.ts +0 -15
- package/dist/services/http-personas.d.ts +80 -0
- package/dist/services/http-personas.js +233 -0
- package/dist/services/in-memory-queue-service.d.ts +0 -14
- package/dist/services/in-memory-queue-service.js +1 -15
- package/dist/services/in-memory-trigger-service.d.ts +0 -18
- package/dist/services/in-memory-trigger-service.js +1 -18
- package/dist/services/in-memory-workflow-service.d.ts +0 -16
- package/dist/services/in-memory-workflow-service.js +4 -33
- package/dist/services/index.d.ts +5 -6
- package/dist/services/index.js +2 -5
- package/dist/services/istanbul-coverage-service.d.ts +1 -5
- package/dist/services/istanbul-coverage-service.js +2 -8
- package/dist/services/jwt-service.d.ts +1 -16
- package/dist/services/local-content.d.ts +13 -2
- package/dist/services/local-content.js +40 -13
- package/dist/services/local-gateway-service.d.ts +0 -16
- package/dist/services/local-gateway-service.js +2 -17
- package/dist/services/local-secrets.d.ts +0 -4
- package/dist/services/local-secrets.js +0 -4
- package/dist/services/logger-console.d.ts +3 -7
- package/dist/services/logger-console.js +3 -7
- package/dist/services/logger.d.ts +2 -37
- package/dist/services/meta-service.d.ts +23 -26
- package/dist/services/meta-service.js +22 -36
- package/dist/services/personas-service.d.ts +134 -0
- package/dist/services/personas-service.js +40 -0
- package/dist/services/pikku-user-id.js +0 -4
- package/dist/services/queue-webhook-service.d.ts +2 -36
- package/dist/services/queue-webhook-service.js +9 -41
- package/dist/services/scheduler-service.d.ts +1 -50
- package/dist/services/scheduler-service.js +0 -10
- package/dist/services/schema-service.d.ts +1 -24
- package/dist/services/scope-service.d.ts +49 -34
- package/dist/services/scoped-secret-service.d.ts +0 -4
- package/dist/services/scoped-secret-service.js +0 -4
- package/dist/services/secret-host-binding.d.ts +8 -0
- package/dist/services/secret-host-binding.js +36 -0
- package/dist/services/secret-service.d.ts +5 -33
- package/dist/services/secretless.d.ts +6 -0
- package/dist/services/secretless.js +21 -0
- package/dist/services/stub-tracker.d.ts +7 -18
- package/dist/services/stub-tracker.js +8 -18
- package/dist/services/system-role-guard.d.ts +33 -0
- package/dist/services/system-role-guard.js +38 -0
- package/dist/services/trigger-service.d.ts +0 -12
- package/dist/services/typed-secret-service.d.ts +0 -7
- package/dist/services/typed-secret-service.js +1 -7
- package/dist/services/v8-coverage-service.d.ts +2 -3
- package/dist/services/v8-coverage-service.js +1 -2
- package/dist/services/variables-service.d.ts +1 -8
- package/dist/services/webhook-service.d.ts +19 -63
- package/dist/services/webhook-service.js +6 -20
- package/dist/services/workflow-service.d.ts +3 -15
- package/dist/testing/service-tests.js +0 -17
- package/dist/time-utils.d.ts +0 -16
- package/dist/time-utils.js +1 -19
- package/dist/types/core.types.d.ts +99 -219
- package/dist/types/core.types.js +0 -42
- package/dist/types/state.types.d.ts +4 -9
- package/dist/utils/hmac.d.ts +4 -10
- package/dist/utils/hmac.js +4 -10
- package/dist/utils/safe-fetch.d.ts +7 -35
- package/dist/utils/safe-fetch.js +13 -53
- package/dist/utils.d.ts +1 -6
- package/dist/utils.js +6 -15
- package/dist/wirings/actor-flow/actor-flow.types.d.ts +1 -34
- package/dist/wirings/actor-flow/index.d.ts +0 -9
- package/dist/wirings/actor-flow/run-conversation.d.ts +5 -5
- package/dist/wirings/actor-flow/run-conversation.js +14 -7
- package/dist/wirings/ai-agent/ai-agent-agui.d.ts +0 -5
- package/dist/wirings/ai-agent/ai-agent-agui.js +34 -12
- package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +7 -0
- package/dist/wirings/ai-agent/ai-agent-helpers.js +7 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.d.ts +153 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.js +256 -0
- package/dist/wirings/ai-agent/ai-agent-memory.js +0 -2
- package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +0 -9
- package/dist/wirings/ai-agent/ai-agent-model-config.js +1 -9
- package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +10 -99
- package/dist/wirings/ai-agent/ai-agent-prepare.js +58 -131
- package/dist/wirings/ai-agent/ai-agent-registry.d.ts +2 -1
- package/dist/wirings/ai-agent/ai-agent-registry.js +5 -1
- package/dist/wirings/ai-agent/ai-agent-runner.js +49 -20
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +25 -2
- package/dist/wirings/ai-agent/ai-agent-stream.js +153 -63
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +84 -4
- package/dist/wirings/ai-agent/index.d.ts +6 -4
- package/dist/wirings/ai-agent/index.js +5 -4
- package/dist/wirings/ai-agent/voice-input.d.ts +39 -1
- package/dist/wirings/ai-agent/voice-input.js +46 -3
- package/dist/wirings/ai-agent/voice-output.d.ts +54 -1
- package/dist/wirings/ai-agent/voice-output.js +153 -50
- package/dist/wirings/channel/channel-common.d.ts +7 -20
- package/dist/wirings/channel/channel-common.js +7 -21
- package/dist/wirings/channel/channel-handler.js +25 -6
- package/dist/wirings/channel/channel-host-rpc.d.ts +25 -0
- package/dist/wirings/channel/channel-host-rpc.js +38 -0
- package/dist/wirings/channel/channel-middleware-runner.d.ts +0 -12
- package/dist/wirings/channel/channel-middleware-runner.js +0 -12
- package/dist/wirings/channel/channel-rpc-registry.d.ts +31 -0
- package/dist/wirings/channel/channel-rpc-registry.js +89 -0
- package/dist/wirings/channel/channel-rpc-responder.d.ts +15 -0
- package/dist/wirings/channel/channel-rpc-responder.js +71 -0
- package/dist/wirings/channel/channel-rpc-service.d.ts +40 -0
- package/dist/wirings/channel/channel-rpc-service.js +106 -0
- package/dist/wirings/channel/channel-rpc-validators.d.ts +14 -0
- package/dist/wirings/channel/channel-rpc-validators.js +30 -0
- package/dist/wirings/channel/channel-rpc.d.ts +5 -0
- package/dist/wirings/channel/channel-rpc.js +5 -0
- package/dist/wirings/channel/channel-rpc.types.d.ts +90 -0
- package/dist/wirings/channel/channel-rpc.types.js +50 -0
- package/dist/wirings/channel/channel-runner.d.ts +0 -4
- package/dist/wirings/channel/channel-runner.js +0 -14
- package/dist/wirings/channel/channel-store.d.ts +0 -10
- package/dist/wirings/channel/channel.types.d.ts +12 -1
- package/dist/wirings/channel/define-channel-routes.d.ts +0 -20
- package/dist/wirings/channel/define-channel-routes.js +0 -20
- package/dist/wirings/channel/eventhub-service.d.ts +0 -18
- package/dist/wirings/channel/index.d.ts +4 -1
- package/dist/wirings/channel/index.js +2 -0
- package/dist/wirings/channel/local/local-channel-runner.js +3 -1
- package/dist/wirings/channel/local/local-eventhub-service.d.ts +0 -33
- package/dist/wirings/channel/local/local-eventhub-service.js +2 -36
- package/dist/wirings/channel/log-channels.d.ts +0 -4
- package/dist/wirings/channel/log-channels.js +0 -4
- package/dist/wirings/channel/pikku-abstract-channel-handler.js +6 -0
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +2 -5
- package/dist/wirings/cli/channel/cli-approval.d.ts +41 -0
- package/dist/wirings/cli/channel/cli-approval.js +81 -0
- package/dist/wirings/cli/channel/cli-channel-runner.d.ts +0 -4
- package/dist/wirings/cli/channel/cli-channel-runner.js +3 -25
- package/dist/wirings/cli/channel/cli-raw-channel-runner.d.ts +47 -9
- package/dist/wirings/cli/channel/cli-raw-channel-runner.js +24 -16
- package/dist/wirings/cli/channel/cli-raw-client-runner.d.ts +20 -0
- package/dist/wirings/cli/channel/cli-raw-client-runner.js +121 -0
- package/dist/wirings/cli/channel/index.d.ts +4 -0
- package/dist/wirings/cli/channel/index.js +2 -0
- package/dist/wirings/cli/cli-runner.d.ts +20 -20
- package/dist/wirings/cli/cli-runner.js +28 -89
- package/dist/wirings/cli/cli.types.d.ts +14 -3
- package/dist/wirings/cli/command-parser.d.ts +1 -10
- package/dist/wirings/cli/command-parser.js +10 -87
- package/dist/wirings/cli/define-cli-commands.d.ts +1 -17
- package/dist/wirings/cli/define-cli-commands.js +1 -17
- package/dist/wirings/credential/credential.types.d.ts +0 -12
- package/dist/wirings/credential/define-credential.d.ts +48 -0
- package/dist/wirings/credential/define-credential.js +47 -0
- package/dist/wirings/credential/index.d.ts +1 -1
- package/dist/wirings/credential/index.js +1 -1
- package/dist/wirings/credential/validate-credential-definitions.d.ts +2 -4
- package/dist/wirings/gateway/gateway-runner.d.ts +1 -20
- package/dist/wirings/gateway/gateway-runner.js +8 -105
- package/dist/wirings/gateway/gateway.types.d.ts +7 -80
- package/dist/wirings/http/http-routes.d.ts +0 -63
- package/dist/wirings/http/http-routes.js +0 -63
- package/dist/wirings/http/http-runner.d.ts +1 -100
- package/dist/wirings/http/http-runner.js +12 -166
- package/dist/wirings/http/http.types.d.ts +16 -55
- package/dist/wirings/http/index.d.ts +2 -1
- package/dist/wirings/http/index.js +1 -1
- package/dist/wirings/http/log-http-routes.d.ts +0 -4
- package/dist/wirings/http/log-http-routes.js +0 -4
- package/dist/wirings/http/pikku-fetch-http-request.d.ts +6 -36
- package/dist/wirings/http/pikku-fetch-http-request.js +56 -50
- package/dist/wirings/http/pikku-fetch-http-response.js +0 -3
- package/dist/wirings/http/routers/path-to-regex.js +2 -13
- package/dist/wirings/http/web-request.d.ts +0 -8
- package/dist/wirings/http/web-request.js +25 -17
- package/dist/wirings/mcp/mcp-runner.d.ts +2 -0
- package/dist/wirings/mcp/mcp-runner.js +6 -16
- package/dist/wirings/mcp/mcp.types.d.ts +2 -35
- package/dist/wirings/oauth2/oauth2.types.d.ts +0 -28
- package/dist/wirings/oauth2/oauth2.types.js +0 -3
- package/dist/wirings/persona/define-personas.d.ts +28 -0
- package/dist/wirings/persona/define-personas.js +27 -0
- package/dist/wirings/persona/index.d.ts +21 -0
- package/dist/wirings/persona/index.js +17 -0
- package/dist/wirings/persona/persona-email.d.ts +37 -0
- package/dist/wirings/persona/persona-email.js +69 -0
- package/dist/wirings/persona/persona-environments.d.ts +45 -0
- package/dist/wirings/persona/persona-environments.js +81 -0
- package/dist/wirings/persona/persona-mailbox.d.ts +101 -0
- package/dist/wirings/persona/persona-mailbox.js +53 -0
- package/dist/wirings/persona/persona.types.d.ts +125 -0
- package/dist/wirings/persona/persona.types.js +1 -0
- package/dist/wirings/persona/validate-personas.d.ts +53 -0
- package/dist/wirings/persona/validate-personas.js +94 -0
- package/dist/wirings/queue/index.d.ts +3 -0
- package/dist/wirings/queue/index.js +2 -3
- package/dist/wirings/queue/queue-identity.d.ts +28 -0
- package/dist/wirings/queue/queue-identity.js +102 -0
- package/dist/wirings/queue/queue-runner.d.ts +0 -19
- package/dist/wirings/queue/queue-runner.js +9 -30
- package/dist/wirings/queue/queue.types.d.ts +18 -89
- package/dist/wirings/queue/register-queue-helper.d.ts +0 -12
- package/dist/wirings/queue/register-queue-helper.js +0 -11
- package/dist/wirings/queue/signed-queue-service.d.ts +16 -0
- package/dist/wirings/queue/signed-queue-service.js +42 -0
- package/dist/wirings/queue/validate-worker-config.d.ts +2 -23
- package/dist/wirings/queue/validate-worker-config.js +0 -14
- package/dist/wirings/role/define-system-role.d.ts +32 -0
- package/dist/wirings/role/define-system-role.js +31 -0
- package/dist/wirings/role/index.d.ts +3 -0
- package/dist/wirings/role/index.js +2 -0
- package/dist/wirings/role/role.types.d.ts +43 -0
- package/dist/wirings/role/role.types.js +1 -0
- package/dist/wirings/role/validate-role-definitions.d.ts +21 -0
- package/dist/wirings/role/validate-role-definitions.js +71 -0
- package/dist/wirings/rpc/addon-runner.d.ts +0 -19
- package/dist/wirings/rpc/addon-runner.js +0 -51
- package/dist/wirings/rpc/remote-addon-auth.d.ts +1 -12
- package/dist/wirings/rpc/remote-addon-auth.js +1 -9
- package/dist/wirings/rpc/rpc-runner.d.ts +11 -18
- package/dist/wirings/rpc/rpc-runner.js +88 -105
- package/dist/wirings/rpc/rpc-types.d.ts +7 -6
- package/dist/wirings/rpc/wire-addon.d.ts +25 -0
- package/dist/wirings/rpc/wire-addon.js +62 -0
- package/dist/wirings/rpc/wire-remote-addon.d.ts +3 -28
- package/dist/wirings/rpc/wire-remote-addon.js +0 -8
- package/dist/wirings/scheduler/log-schedulers.d.ts +0 -4
- package/dist/wirings/scheduler/log-schedulers.js +0 -4
- package/dist/wirings/scheduler/scheduler-runner.d.ts +0 -1
- package/dist/wirings/scheduler/scheduler-runner.js +0 -1
- package/dist/wirings/scheduler/scheduler.types.d.ts +1 -14
- package/dist/wirings/scope/define-scope.d.ts +32 -0
- package/dist/wirings/scope/define-scope.js +31 -0
- package/dist/wirings/scope/index.d.ts +1 -1
- package/dist/wirings/scope/index.js +1 -1
- package/dist/wirings/scope/scope.types.d.ts +7 -9
- package/dist/wirings/scope/validate-scope-definitions.d.ts +2 -21
- package/dist/wirings/scope/validate-scope-definitions.js +3 -21
- package/dist/wirings/secret/index.d.ts +1 -1
- package/dist/wirings/secret/index.js +1 -1
- package/dist/wirings/secret/secret.types.d.ts +19 -15
- package/dist/wirings/secret/secret.types.js +1 -1
- package/dist/wirings/secret/validate-secret-definitions.d.ts +2 -4
- package/dist/wirings/trigger/trigger-runner.d.ts +0 -27
- package/dist/wirings/trigger/trigger-runner.js +1 -24
- package/dist/wirings/trigger/trigger.types.d.ts +1 -82
- package/dist/wirings/trigger/trigger.types.js +0 -34
- package/dist/wirings/variable/index.d.ts +1 -1
- package/dist/wirings/variable/index.js +1 -1
- package/dist/wirings/variable/validate-variable-definitions.d.ts +2 -4
- package/dist/wirings/variable/variable.types.d.ts +1 -13
- package/dist/wirings/variable/variable.types.js +1 -1
- package/dist/wirings/virtual-user/index.d.ts +27 -0
- package/dist/wirings/virtual-user/index.js +8 -0
- package/dist/wirings/virtual-user/run-virtual-user.d.ts +92 -0
- package/dist/wirings/virtual-user/run-virtual-user.js +478 -0
- package/dist/wirings/virtual-user/virtual-user-agents.d.ts +38 -0
- package/dist/wirings/virtual-user/virtual-user-agents.js +24 -0
- package/dist/wirings/virtual-user/virtual-user-catalogue.d.ts +92 -0
- package/dist/wirings/virtual-user/virtual-user-catalogue.js +134 -0
- package/dist/wirings/virtual-user/virtual-user-derive.d.ts +26 -0
- package/dist/wirings/virtual-user/virtual-user-derive.js +137 -0
- package/dist/wirings/virtual-user/virtual-user-dispositions.d.ts +79 -0
- package/dist/wirings/virtual-user/virtual-user-dispositions.js +128 -0
- package/dist/wirings/virtual-user/virtual-user-intents.d.ts +78 -0
- package/dist/wirings/virtual-user/virtual-user-intents.js +142 -0
- package/dist/wirings/virtual-user/virtual-user-rng.d.ts +24 -0
- package/dist/wirings/virtual-user/virtual-user-rng.js +44 -0
- package/dist/wirings/virtual-user/virtual-user-target.d.ts +21 -0
- package/dist/wirings/virtual-user/virtual-user-target.js +34 -0
- package/dist/wirings/virtual-user/virtual-user.types.d.ts +199 -0
- package/dist/wirings/virtual-user/virtual-user.types.js +8 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +5 -5
- package/dist/wirings/workflow/dsl/workflow-runner.d.ts +0 -4
- package/dist/wirings/workflow/dsl/workflow-runner.js +0 -4
- package/dist/wirings/workflow/feature.d.ts +0 -19
- package/dist/wirings/workflow/feature.js +0 -19
- package/dist/wirings/workflow/graph/graph-node.d.ts +0 -98
- package/dist/wirings/workflow/graph/graph-node.js +0 -34
- package/dist/wirings/workflow/graph/graph-runner.js +6 -41
- package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +0 -4
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -58
- package/dist/wirings/workflow/graph/workflow-graph.types.js +0 -6
- package/dist/wirings/workflow/index.d.ts +5 -7
- package/dist/wirings/workflow/index.js +3 -17
- package/dist/wirings/workflow/pikku-scenario-service.d.ts +87 -5
- package/dist/wirings/workflow/pikku-scenario-service.js +204 -42
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +7 -459
- package/dist/wirings/workflow/pikku-workflow-service.js +58 -551
- package/dist/wirings/workflow/run-timeline.d.ts +0 -47
- package/dist/wirings/workflow/run-timeline.js +0 -22
- package/dist/wirings/workflow/scenario-cookie-jar.d.ts +0 -23
- package/dist/wirings/workflow/scenario-cookie-jar.js +0 -16
- package/dist/wirings/workflow/scenario-poll.d.ts +0 -15
- package/dist/wirings/workflow/scenario-poll.js +0 -12
- package/dist/wirings/workflow/scenario-prose.d.ts +0 -28
- package/dist/wirings/workflow/scenario-prose.js +0 -18
- package/dist/wirings/workflow/scenario-step-guards.d.ts +0 -13
- package/dist/wirings/workflow/scenario-step-guards.js +1 -14
- package/dist/wirings/workflow/scenario-step.types.d.ts +72 -6
- package/dist/wirings/workflow/scenario-step.types.js +5 -1
- package/dist/wirings/workflow/scenario-surface.d.ts +16 -0
- package/dist/wirings/workflow/scenario-surface.js +56 -0
- package/dist/wirings/workflow/workflow-invocation-id.d.ts +0 -18
- package/dist/wirings/workflow/workflow-invocation-id.js +2 -22
- package/dist/wirings/workflow/workflow-queue-workers.d.ts +0 -20
- package/dist/wirings/workflow/workflow-queue-workers.js +0 -19
- package/dist/wirings/workflow/workflow.types.d.ts +0 -197
- package/knowledge/decisions/index.md +19 -0
- package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +49 -0
- package/knowledge/decisions/internals/actor-flow-conversations-seed-a-hidden-kickoff-message.md +23 -0
- package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md +24 -0
- package/knowledge/decisions/internals/actor-flow-verdicts-are-llm-self-evaluations.md +25 -0
- package/knowledge/decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md +26 -0
- package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +33 -0
- package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +28 -0
- package/knowledge/decisions/internals/ai-agent-agui-bridge-obeys-the-client-ordering-contract.md +29 -0
- package/knowledge/decisions/internals/ai-agent-audio-chunks-carry-the-format-the-provider-returned.md +20 -0
- package/knowledge/decisions/internals/ai-agent-credential-suspensions-hide-the-tool-result.md +26 -0
- package/knowledge/decisions/internals/ai-agent-delegate-and-supervise-hide-different-text.md +26 -0
- package/knowledge/decisions/internals/ai-agent-llm-tool-arguments-have-nulls-stripped.md +23 -0
- package/knowledge/decisions/internals/ai-agent-model-config-stays-a-single-resolution-seam.md +25 -0
- package/knowledge/decisions/internals/ai-agent-onerror-hooks-cannot-change-the-failure.md +22 -0
- package/knowledge/decisions/internals/ai-agent-runner-methods-must-keep-their-receiver.md +22 -0
- package/knowledge/decisions/internals/ai-agent-stream-persistence-is-best-effort.md +27 -0
- package/knowledge/decisions/internals/ai-agent-sub-agents-inherit-the-parent-context-block.md +26 -0
- package/knowledge/decisions/internals/ai-agent-tool-execute-failures-are-logged-unconditionally.md +25 -0
- package/knowledge/decisions/internals/ai-agent-voice-input-transcribes-audio-parts-in-place.md +22 -0
- package/knowledge/decisions/internals/ai-agent-working-memory-is-persisted-only-when-valid.md +25 -0
- package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +30 -0
- package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +31 -0
- package/knowledge/decisions/internals/channel-state-is-per-socket-session-state-is-per-user.md +29 -0
- package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +28 -0
- package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +27 -0
- package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +28 -0
- package/knowledge/decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md +34 -0
- package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +29 -0
- package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +34 -0
- package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +44 -0
- package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +39 -0
- package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +42 -0
- package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +39 -0
- package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +43 -0
- package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +38 -0
- package/knowledge/decisions/internals/core-state-is-a-global-map-written-only-at-registration-time.md +44 -0
- package/knowledge/decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md +27 -0
- package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +32 -0
- package/knowledge/decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md +28 -0
- package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +31 -0
- package/knowledge/decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md +26 -0
- package/knowledge/decisions/internals/http-request-bodies-are-read-once-and-shared.md +32 -0
- package/knowledge/decisions/internals/http-route-groups-cascade-config-in-a-fixed-order.md +28 -0
- package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +30 -0
- package/knowledge/decisions/internals/http-runner-logs-through-a-trace-scoped-logger-functions-do-not.md +26 -0
- package/knowledge/decisions/internals/http-set-cookie-headers-are-appended-never-joined.md +28 -0
- package/knowledge/decisions/internals/http-sse-streams-flush-headers-only-after-middleware.md +32 -0
- package/knowledge/decisions/internals/http-wiring-without-metadata-is-skipped-not-fatal.md +26 -0
- package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +25 -0
- package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +26 -0
- package/knowledge/decisions/internals/index.md +113 -0
- package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +25 -0
- package/knowledge/decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md +26 -0
- package/knowledge/decisions/internals/node-only-builtins-are-imported-dynamically.md +24 -0
- package/knowledge/decisions/internals/queue-group-concurrency-keeps-one-shared-queue-fair.md +28 -0
- package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +27 -0
- package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +31 -0
- package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +32 -0
- package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +27 -0
- package/knowledge/decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md +26 -0
- package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +27 -0
- package/knowledge/decisions/internals/scope-roots-may-be-co-declared-by-an-addon-and-its-host-app.md +30 -0
- package/knowledge/decisions/internals/serverless-channel-disconnect-must-tolerate-a-missing-channel.md +28 -0
- package/knowledge/decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md +30 -0
- package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +29 -0
- package/knowledge/decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md +27 -0
- package/knowledge/decisions/internals/the-kek-salt-is-scoped-to-the-key-version.md +40 -0
- package/knowledge/decisions/internals/the-schema-service-is-never-stubbed.md +26 -0
- package/knowledge/decisions/internals/trigger-declaration-is-split-from-trigger-source.md +33 -0
- package/knowledge/decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md +26 -0
- package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +26 -0
- package/knowledge/decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md +25 -0
- package/knowledge/decisions/internals/whether-a-run-is-inline-is-read-from-the-run-record.md +58 -0
- package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +34 -0
- package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +42 -0
- package/knowledge/decisions/internals/workflow-dsl-meta-separates-runtime-expressions-from-literals.md +38 -0
- package/knowledge/decisions/internals/workflow-features-resolve-scenarios-by-object-identity.md +29 -0
- package/knowledge/decisions/internals/workflow-graph-inline-and-queued-runs-share-one-planner.md +42 -0
- package/knowledge/decisions/internals/workflow-graph-node-notes-are-excluded-from-the-graph-hash.md +25 -0
- package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +29 -0
- package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +43 -0
- package/knowledge/decisions/internals/workflow-queued-step-dispatch-requires-an-explicit-opt-in.md +29 -0
- package/knowledge/decisions/internals/workflow-queues-are-per-workflow-by-default.md +42 -0
- package/knowledge/decisions/internals/workflow-repeated-step-names-get-an-ordinal-suffix.md +33 -0
- package/knowledge/decisions/internals/workflow-replay-reads-its-steps-once-and-caches-only-the-immutable-half.md +32 -0
- package/knowledge/decisions/internals/workflow-retries-are-owned-by-the-workflow-not-the-queue.md +31 -0
- package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +39 -0
- package/knowledge/decisions/internals/workflow-run-mirror-is-never-a-source-of-truth.md +29 -0
- package/knowledge/decisions/internals/workflow-run-polling-backs-off-to-the-callers-ceiling.md +33 -0
- package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +37 -0
- package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +50 -0
- package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +43 -0
- package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +32 -0
- package/knowledge/decisions/internals/workflow-scenario-quarantine-reason-lives-in-code.md +18 -0
- package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +34 -0
- package/knowledge/decisions/internals/workflow-step-compensation-runs-as-its-own-durable-step.md +26 -0
- package/knowledge/decisions/internals/workflow-step-dispatch-failure-is-transient-not-a-run-failure.md +33 -0
- package/knowledge/decisions/internals/workflow-step-lock-is-held-only-to-claim-the-step.md +27 -0
- package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +34 -0
- package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +38 -0
- package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +30 -0
- package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +26 -0
- package/knowledge/decisions/security/actor-flow-missing-approval-decisions-default-to-denied.md +22 -0
- package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +27 -0
- package/knowledge/decisions/security/actor-sign-in-only-works-for-actor-flagged-users.md +27 -0
- package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +43 -0
- package/knowledge/decisions/security/addon-config-gates-apply-only-at-the-namespaced-rpc-boundary.md +52 -0
- package/knowledge/decisions/security/addon-scopes-are-resolved-where-the-function-runs.md +46 -0
- package/knowledge/decisions/security/ai-agent-approval-forwarding-requires-a-symbol-brand.md +27 -0
- package/knowledge/decisions/security/ai-agent-credential-requests-are-symbol-branded.md +37 -0
- package/knowledge/decisions/security/ai-agent-gate-requires-a-session-only-when-auth-is-true.md +31 -0
- package/knowledge/decisions/security/ai-agent-ownership-failures-never-echo-the-resource.md +23 -0
- package/knowledge/decisions/security/ai-agent-resume-re-runs-the-authorization-gate.md +22 -0
- package/knowledge/decisions/security/ai-agent-sessionless-deployments-have-no-thread-ownership.md +39 -0
- package/knowledge/decisions/security/ai-agent-thread-ownership-composes-the-session-principal.md +30 -0
- package/knowledge/decisions/security/ai-agent-tool-filtering-reads-the-live-function-config.md +24 -0
- package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +30 -0
- package/knowledge/decisions/security/an-exposed-ungated-function-is-a-codegen-warning.md +49 -0
- package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +76 -0
- package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +39 -0
- package/knowledge/decisions/security/core-secrets-use-a-per-secret-dek-wrapped-by-a-kek.md +37 -0
- package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +31 -0
- package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +30 -0
- package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +40 -0
- package/knowledge/decisions/security/http-error-detail-is-withheld-from-clients-in-production.md +33 -0
- package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +46 -0
- package/knowledge/decisions/security/index.md +55 -0
- package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +27 -0
- package/knowledge/decisions/security/passphrases-are-stretched-key-material-is-expanded.md +40 -0
- package/knowledge/decisions/security/permission-auth-filtering-requires-live-permission-functions.md +31 -0
- package/knowledge/decisions/security/pikku-carries-actor-scopes-as-data-and-the-app-grants-them.md +26 -0
- package/knowledge/decisions/security/queue-job-identities-are-signed-at-enqueue.md +69 -0
- package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +39 -0
- package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +34 -0
- package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +49 -0
- package/knowledge/decisions/security/scenario-step-functions-are-never-externally-invocable.md +30 -0
- package/knowledge/decisions/security/scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md +28 -0
- package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +34 -0
- package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +37 -0
- package/knowledge/decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md +25 -0
- package/knowledge/decisions/security/workflow-actor-steps-always-use-the-real-transport.md +34 -0
- package/knowledge/decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md +40 -0
- package/knowledge/decisions/security/workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md +32 -0
- package/knowledge/decisions/security/workflow-scenario-sessions-are-isolated-per-actor-and-per-scenario.md +32 -0
- package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +31 -0
- package/knowledge/index.md +24 -0
- package/knowledge/questions/index.md +15 -0
- package/package.json +4 -2
- package/run-tests.sh +0 -0
- package/src/crypto-utils.test.ts +460 -19
- package/src/crypto-utils.ts +283 -55
- package/src/data-classification.ts +1 -7
- package/src/dev/hot-reload.test.ts +0 -4
- package/src/dev/hot-reload.ts +11 -30
- package/src/dev/module-runner.ts +7 -32
- package/src/dev/reload-meta.ts +9 -29
- package/src/errors/error-handler.ts +20 -35
- package/src/errors/error.test.ts +30 -1
- package/src/errors/errors.ts +73 -157
- package/src/function/abort-scope.test.ts +97 -0
- package/src/function/abort-scope.ts +80 -0
- package/src/function/function-runner.test.ts +75 -7
- package/src/function/function-runner.ts +73 -30
- package/src/function/functions.types.ts +56 -136
- package/src/function/list.types.test.ts +3 -25
- package/src/function/list.types.ts +12 -62
- package/src/gopass-secrets-removed.test.ts +51 -0
- package/src/handle-error.test.ts +108 -1
- package/src/handle-error.ts +8 -18
- package/src/index.ts +60 -1
- package/src/middleware/auth-apikey.test.ts +0 -1
- package/src/middleware/auth-apikey.ts +0 -17
- package/src/middleware/auth-bearer.test.ts +0 -3
- package/src/middleware/auth-bearer.ts +3 -40
- package/src/middleware/auth-cookie.test.ts +0 -6
- package/src/middleware/auth-cookie.ts +2 -26
- package/src/middleware/cors.test.ts +34 -0
- package/src/middleware/cors.ts +12 -33
- package/src/middleware/remote-auth.test.ts +24 -9
- package/src/middleware/remote-auth.ts +10 -2
- package/src/middleware/telemetry.ts +2 -31
- package/src/middleware-runner.test.ts +0 -2
- package/src/middleware-runner.ts +5 -74
- package/src/permissions.test.ts +30 -0
- package/src/permissions.ts +24 -74
- package/src/pikku-request.ts +0 -6
- package/src/pikku-state.ts +2 -30
- package/src/production-barrels-stay-lean.test.ts +110 -0
- package/src/remote.test.ts +172 -0
- package/src/remote.ts +17 -7
- package/src/schema.test.ts +103 -0
- package/src/schema.ts +35 -18
- package/src/scopes.ts +7 -48
- package/src/services/ai-agent-runner-service.ts +20 -0
- package/src/services/ai-embedding-service.ts +3 -25
- package/src/services/audit-service.ts +1 -2
- package/src/services/content-service.ts +1 -46
- package/src/services/credential-service.ts +3 -40
- package/src/services/credential-wire-service.test.ts +0 -2
- package/src/services/deployment-service.ts +3 -9
- package/src/services/gateway-service.ts +0 -15
- package/src/services/{http-scenario-actors-converse.test.ts → http-personas-converse.test.ts} +38 -9
- package/src/services/{http-scenario-actors.test.ts → http-personas.test.ts} +39 -22
- package/src/services/{http-scenario-actors.ts → http-personas.ts} +85 -45
- package/src/services/in-memory-queue-service.ts +1 -15
- package/src/services/in-memory-trigger-service.ts +1 -18
- package/src/services/in-memory-workflow-service.test.ts +0 -13
- package/src/services/in-memory-workflow-service.ts +4 -38
- package/src/services/index.ts +20 -15
- package/src/services/istanbul-coverage-service.ts +2 -8
- package/src/services/jwt-service.ts +1 -16
- package/src/services/local-content.test.ts +159 -27
- package/src/services/local-content.ts +55 -23
- package/src/services/local-gateway-service.ts +2 -17
- package/src/services/local-secrets.ts +0 -4
- package/src/services/logger-console.test.ts +0 -1
- package/src/services/logger-console.ts +3 -7
- package/src/services/logger.ts +2 -37
- package/src/services/meta-service.test.ts +1 -5
- package/src/services/meta-service.ts +41 -61
- package/src/services/{scenario-actors-service.ts → personas-service.ts} +48 -43
- package/src/services/pikku-user-id.ts +0 -4
- package/src/services/queue-webhook-service.ts +9 -41
- package/src/services/scheduler-service.ts +1 -50
- package/src/services/schema-service.ts +1 -24
- package/src/services/scope-service.ts +50 -34
- package/src/services/scoped-secret-service.ts +0 -4
- package/src/services/secret-host-binding.test.ts +138 -0
- package/src/services/secret-host-binding.ts +51 -0
- package/src/services/secret-service.ts +5 -33
- package/src/services/secretless.test.ts +54 -0
- package/src/services/secretless.ts +29 -0
- package/src/services/stub-tracker.ts +8 -18
- package/src/services/system-role-guard.test.ts +93 -0
- package/src/services/system-role-guard.ts +71 -0
- package/src/services/trigger-service.ts +0 -12
- package/src/services/typed-secret-service.ts +1 -7
- package/src/services/v8-coverage-service.ts +3 -6
- package/src/services/variables-service.ts +1 -8
- package/src/services/webhook-service.ts +19 -63
- package/src/services/workflow-service.ts +3 -20
- package/src/testing/service-tests.ts +0 -26
- package/src/time-utils.ts +1 -19
- package/src/types/core.types.ts +116 -229
- package/src/types/state.types.ts +7 -9
- package/src/utils/hmac.ts +4 -10
- package/src/utils/safe-fetch.ts +13 -54
- package/src/utils.test.ts +11 -2
- package/src/utils.ts +6 -15
- package/src/wirings/actor-flow/actor-flow.types.ts +1 -34
- package/src/wirings/actor-flow/index.ts +0 -9
- package/src/wirings/actor-flow/run-conversation.test.ts +11 -6
- package/src/wirings/actor-flow/run-conversation.ts +19 -12
- package/src/wirings/ai-agent/ai-agent-agui.test.ts +75 -10
- package/src/wirings/ai-agent/ai-agent-agui.ts +36 -17
- package/src/wirings/ai-agent/ai-agent-helpers.ts +20 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.test.ts +842 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.ts +399 -0
- package/src/wirings/ai-agent/ai-agent-memory.ts +0 -2
- package/src/wirings/ai-agent/ai-agent-model-config.ts +1 -9
- package/src/wirings/ai-agent/ai-agent-prepare.test.ts +202 -31
- package/src/wirings/ai-agent/ai-agent-prepare.ts +82 -138
- package/src/wirings/ai-agent/ai-agent-registry.test.ts +191 -6
- package/src/wirings/ai-agent/ai-agent-registry.ts +18 -1
- package/src/wirings/ai-agent/ai-agent-resume-authorization.test.ts +0 -2
- package/src/wirings/ai-agent/ai-agent-runner.test.ts +11 -9
- package/src/wirings/ai-agent/ai-agent-runner.ts +67 -33
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +205 -103
- package/src/wirings/ai-agent/ai-agent-stream.ts +192 -75
- package/src/wirings/ai-agent/ai-agent-thread-ownership.test.ts +301 -0
- package/src/wirings/ai-agent/ai-agent.types.ts +85 -4
- package/src/wirings/ai-agent/index.ts +35 -3
- package/src/wirings/ai-agent/voice-input.test.ts +72 -7
- package/src/wirings/ai-agent/voice-input.ts +48 -3
- package/src/wirings/ai-agent/voice-output.test.ts +422 -0
- package/src/wirings/ai-agent/voice-output.ts +216 -56
- package/src/wirings/channel/channel-common.ts +15 -20
- package/src/wirings/channel/channel-handler.test.ts +50 -0
- package/src/wirings/channel/channel-handler.ts +32 -11
- package/src/wirings/channel/channel-host-rpc.test.ts +150 -0
- package/src/wirings/channel/channel-host-rpc.ts +69 -0
- package/src/wirings/channel/channel-middleware-runner.test.ts +0 -1
- package/src/wirings/channel/channel-middleware-runner.ts +0 -12
- package/src/wirings/channel/channel-rpc-registry.ts +116 -0
- package/src/wirings/channel/channel-rpc-responder.ts +117 -0
- package/src/wirings/channel/channel-rpc-service.ts +146 -0
- package/src/wirings/channel/channel-rpc-validators.ts +65 -0
- package/src/wirings/channel/channel-rpc.test.ts +820 -0
- package/src/wirings/channel/channel-rpc.ts +5 -0
- package/src/wirings/channel/channel-rpc.types.ts +150 -0
- package/src/wirings/channel/channel-runner.ts +0 -14
- package/src/wirings/channel/channel-store.ts +0 -10
- package/src/wirings/channel/channel.types.ts +19 -8
- package/src/wirings/channel/define-channel-routes.ts +0 -20
- package/src/wirings/channel/eventhub-service.ts +0 -18
- package/src/wirings/channel/index.ts +35 -0
- package/src/wirings/channel/local/local-channel-handler.ts +3 -1
- package/src/wirings/channel/local/local-channel-runner.test.ts +0 -10
- package/src/wirings/channel/local/local-channel-runner.ts +3 -1
- package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -13
- package/src/wirings/channel/local/local-eventhub-service.ts +2 -37
- package/src/wirings/channel/log-channels.ts +0 -4
- package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +83 -2
- package/src/wirings/channel/pikku-abstract-channel-handler.ts +7 -0
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +2 -5
- package/src/wirings/cli/channel/cli-approval.test.ts +177 -0
- package/src/wirings/cli/channel/cli-approval.ts +135 -0
- package/src/wirings/cli/channel/cli-channel-runner.ts +4 -26
- package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +169 -0
- package/src/wirings/cli/channel/cli-raw-channel-runner.ts +59 -16
- package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +480 -0
- package/src/wirings/cli/channel/cli-raw-client-runner.ts +155 -0
- package/src/wirings/cli/channel/index.ts +9 -0
- package/src/wirings/cli/cli-runner.test.ts +0 -1
- package/src/wirings/cli/cli-runner.ts +46 -88
- package/src/wirings/cli/cli.types.ts +14 -3
- package/src/wirings/cli/command-parser.test.ts +0 -4
- package/src/wirings/cli/command-parser.ts +11 -91
- package/src/wirings/cli/define-cli-commands.ts +1 -17
- package/src/wirings/credential/credential.types.ts +0 -12
- package/src/wirings/credential/{wire-credential.ts → define-credential.ts} +7 -7
- package/src/wirings/credential/index.ts +1 -1
- package/src/wirings/credential/validate-credential-definitions.ts +2 -4
- package/src/wirings/gateway/gateway-runner.test.ts +1 -21
- package/src/wirings/gateway/gateway-runner.ts +8 -110
- package/src/wirings/gateway/gateway.types.ts +7 -80
- package/src/wirings/http/http-routes.test.ts +0 -3
- package/src/wirings/http/http-routes.ts +0 -86
- package/src/wirings/http/http-runner.test.ts +0 -1
- package/src/wirings/http/http-runner.ts +12 -168
- package/src/wirings/http/http.types.ts +17 -62
- package/src/wirings/http/index.ts +5 -1
- package/src/wirings/http/log-http-routes.ts +0 -4
- package/src/wirings/http/pikku-fetch-http-request.test.ts +88 -7
- package/src/wirings/http/pikku-fetch-http-request.ts +74 -50
- package/src/wirings/http/pikku-fetch-http-response.test.ts +1 -1
- package/src/wirings/http/pikku-fetch-http-response.ts +0 -3
- package/src/wirings/http/routers/path-to-regex.test.ts +4 -17
- package/src/wirings/http/routers/path-to-regex.ts +2 -13
- package/src/wirings/http/web-request.test.ts +33 -2
- package/src/wirings/http/web-request.ts +30 -17
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -1
- package/src/wirings/mcp/mcp-runner.test.ts +40 -0
- package/src/wirings/mcp/mcp-runner.ts +9 -15
- package/src/wirings/mcp/mcp.types.ts +7 -42
- package/src/wirings/oauth2/oauth2.types.ts +0 -30
- package/src/wirings/persona/define-personas.ts +29 -0
- package/src/wirings/persona/index.ts +62 -0
- package/src/wirings/persona/persona-email.ts +87 -0
- package/src/wirings/persona/persona-environments.test.ts +183 -0
- package/src/wirings/persona/persona-environments.ts +138 -0
- package/src/wirings/persona/persona-mailbox.ts +156 -0
- package/src/wirings/persona/persona.test.ts +220 -0
- package/src/wirings/persona/persona.types.ts +131 -0
- package/src/wirings/persona/validate-personas.ts +133 -0
- package/src/wirings/queue/index.ts +13 -3
- package/src/wirings/queue/queue-identity.test.ts +453 -0
- package/src/wirings/queue/queue-identity.ts +173 -0
- package/src/wirings/queue/queue-runner.ts +12 -31
- package/src/wirings/queue/queue.types.ts +19 -89
- package/src/wirings/queue/register-queue-helper.ts +0 -14
- package/src/wirings/queue/signed-queue-service.ts +59 -0
- package/src/wirings/queue/validate-worker-config.ts +2 -28
- package/src/wirings/role/define-system-role.ts +33 -0
- package/src/wirings/role/index.ts +13 -0
- package/src/wirings/role/role.test.ts +104 -0
- package/src/wirings/role/role.types.ts +47 -0
- package/src/wirings/role/validate-role-definitions.ts +93 -0
- package/src/wirings/rpc/addon-auth-tags.test.ts +223 -0
- package/src/wirings/rpc/addon-runner.ts +0 -56
- package/src/wirings/rpc/addon-scopes.test.ts +225 -0
- package/src/wirings/rpc/remote-addon-auth.ts +1 -13
- package/src/wirings/rpc/rpc-runner.test.ts +186 -2
- package/src/wirings/rpc/rpc-runner.ts +145 -127
- package/src/wirings/rpc/rpc-types.ts +11 -6
- package/src/wirings/rpc/wire-addon.test.ts +43 -1
- package/src/wirings/rpc/wire-addon.ts +99 -0
- package/src/wirings/rpc/wire-remote-addon.ts +9 -29
- package/src/wirings/scheduler/log-schedulers.ts +0 -4
- package/src/wirings/scheduler/scheduler-runner.test.ts +1 -8
- package/src/wirings/scheduler/scheduler-runner.ts +0 -2
- package/src/wirings/scheduler/scheduler.types.ts +1 -14
- package/src/wirings/scope/{wire-scope.ts → define-scope.ts} +5 -6
- package/src/wirings/scope/index.ts +1 -1
- package/src/wirings/scope/scope.test.ts +1 -2
- package/src/wirings/scope/scope.types.ts +7 -9
- package/src/wirings/scope/validate-scope-definitions.ts +3 -21
- package/src/wirings/secret/index.ts +1 -1
- package/src/wirings/secret/secret.types.ts +19 -15
- package/src/wirings/secret/validate-secret-definitions.ts +2 -4
- package/src/wirings/trigger/trigger-runner.ts +1 -27
- package/src/wirings/trigger/trigger.types.ts +1 -82
- package/src/wirings/variable/index.ts +1 -1
- package/src/wirings/variable/validate-variable-definitions.ts +2 -4
- package/src/wirings/variable/variable.types.ts +1 -13
- package/src/wirings/virtual-user/index.ts +76 -0
- package/src/wirings/virtual-user/run-virtual-user.test.ts +765 -0
- package/src/wirings/virtual-user/run-virtual-user.ts +671 -0
- package/src/wirings/virtual-user/virtual-user-agents.test.ts +65 -0
- package/src/wirings/virtual-user/virtual-user-agents.ts +57 -0
- package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +215 -0
- package/src/wirings/virtual-user/virtual-user-catalogue.ts +184 -0
- package/src/wirings/virtual-user/virtual-user-derive.test.ts +398 -0
- package/src/wirings/virtual-user/virtual-user-derive.ts +173 -0
- package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +63 -0
- package/src/wirings/virtual-user/virtual-user-dispositions.ts +213 -0
- package/src/wirings/virtual-user/virtual-user-intents.test.ts +208 -0
- package/src/wirings/virtual-user/virtual-user-intents.ts +185 -0
- package/src/wirings/virtual-user/virtual-user-rng.test.ts +72 -0
- package/src/wirings/virtual-user/virtual-user-rng.ts +50 -0
- package/src/wirings/virtual-user/virtual-user-target.ts +47 -0
- package/src/wirings/virtual-user/virtual-user.types.ts +219 -0
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +5 -4
- package/src/wirings/workflow/dsl/workflow-runner.ts +0 -4
- package/src/wirings/workflow/feature.ts +0 -19
- package/src/wirings/workflow/graph/graph-node.ts +0 -136
- package/src/wirings/workflow/graph/graph-runner.test.ts +20 -19
- package/src/wirings/workflow/graph/graph-runner.ts +6 -41
- package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -4
- package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -58
- package/src/wirings/workflow/index.ts +10 -44
- package/src/wirings/workflow/pikku-scenario-service.ts +235 -52
- package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -39
- package/src/wirings/workflow/pikku-workflow-service.ts +77 -674
- package/src/wirings/workflow/run-timeline.test.ts +7 -19
- package/src/wirings/workflow/run-timeline.ts +0 -56
- package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -1
- package/src/wirings/workflow/scenario-cookie-jar.ts +0 -25
- package/src/wirings/workflow/scenario-expectations.test.ts +2 -7
- package/src/wirings/workflow/scenario-hooks.test.ts +2 -7
- package/src/wirings/workflow/scenario-poll.test.ts +0 -2
- package/src/wirings/workflow/scenario-poll.ts +0 -15
- package/src/wirings/workflow/scenario-prose.ts +0 -28
- package/src/wirings/workflow/scenario-service.test.ts +2 -9
- package/src/wirings/workflow/scenario-step-guards.ts +1 -14
- package/src/wirings/workflow/scenario-step.test.ts +159 -14
- package/src/wirings/workflow/scenario-step.types.ts +82 -6
- package/src/wirings/workflow/scenario-surface.test.ts +145 -0
- package/src/wirings/workflow/scenario-surface.ts +71 -0
- package/src/wirings/workflow/workflow-dispatch-durability.test.ts +14 -15
- package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -4
- package/src/wirings/workflow/workflow-inline-authority.test.ts +169 -0
- package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -2
- package/src/wirings/workflow/workflow-invocation-id.ts +2 -22
- package/src/wirings/workflow/workflow-mirror.test.ts +0 -7
- package/src/wirings/workflow/workflow-on-error.test.ts +0 -9
- package/src/wirings/workflow/workflow-queue-workers.ts +0 -21
- package/src/wirings/workflow/workflow-replay-snapshot.test.ts +8 -7
- package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -5
- package/src/wirings/workflow/workflow-run-context.test.ts +5 -10
- package/src/wirings/workflow/workflow-run-polling.test.ts +0 -5
- package/src/wirings/workflow/workflow-step-ordinal.test.ts +19 -4
- package/src/wirings/workflow/workflow-step-session.test.ts +0 -7
- package/src/wirings/workflow/workflow.types.ts +0 -203
- package/tsconfig.tsbuildinfo +1 -1
- package/src/middleware/timeout.ts +0 -22
- package/src/pikku-response.ts +0 -5
- package/src/services/gopass-secrets.ts +0 -78
- package/src/wirings/mcp/mcp-endpoint-registry.test.d.ts +0 -1
- package/src/wirings/workflow/dsl/index.ts +0 -36
- package/src/wirings/workflow/graph/index.ts +0 -15
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { CorePikkuMiddleware, CoreSingletonServices, CoreUserSession, CoreServices, MiddlewareMetadata } from '../../types/core.types.js';
|
|
2
2
|
import type { CorePikkuFunctionConfig, CorePikkuPermission, CorePikkuFunction, CorePikkuFunctionSessionless } from '../../function/functions.types.js';
|
|
3
|
-
import type { PikkuChannel } from '../channel/channel.types.js';
|
|
3
|
+
import type { ChannelRemote, PikkuChannel } from '../channel/channel.types.js';
|
|
4
4
|
/**
|
|
5
5
|
* CLI option definition
|
|
6
6
|
*/
|
|
@@ -29,11 +29,11 @@ export interface CLIPositional {
|
|
|
29
29
|
/**
|
|
30
30
|
* CLI wire context
|
|
31
31
|
*/
|
|
32
|
-
export type PikkuCLI = {
|
|
32
|
+
export type PikkuCLI<Remote extends (...args: any[]) => any = ChannelRemote> = {
|
|
33
33
|
program: string;
|
|
34
34
|
command: string[];
|
|
35
35
|
data: Record<string, any>;
|
|
36
|
-
channel: PikkuChannel<unknown, unknown>;
|
|
36
|
+
channel: PikkuChannel<unknown, unknown, Remote>;
|
|
37
37
|
};
|
|
38
38
|
/**
|
|
39
39
|
* Runtime CLI program state
|
|
@@ -72,6 +72,12 @@ export type CLIProgramMeta = {
|
|
|
72
72
|
commands: Record<string, CLICommandMeta>;
|
|
73
73
|
options: Record<string, CLIOption>;
|
|
74
74
|
defaultRenderName?: string;
|
|
75
|
+
/**
|
|
76
|
+
* Whether the channel serving this program over a websocket requires a
|
|
77
|
+
* session. Only meaningful for the generated channel backend — a locally
|
|
78
|
+
* executed CLI has no connection to authenticate.
|
|
79
|
+
*/
|
|
80
|
+
auth?: boolean;
|
|
75
81
|
};
|
|
76
82
|
/**
|
|
77
83
|
* Renderer metadata for CLI commands
|
|
@@ -195,6 +201,11 @@ export interface CoreCLI<Commands extends Record<string, CoreCLICommandConfig<an
|
|
|
195
201
|
summary?: string;
|
|
196
202
|
errors?: string[];
|
|
197
203
|
tags?: string[];
|
|
204
|
+
/**
|
|
205
|
+
* Requires a session on the websocket serving this program remotely. Has no
|
|
206
|
+
* effect on local execution, where there is no connection to authenticate.
|
|
207
|
+
*/
|
|
208
|
+
auth?: boolean;
|
|
198
209
|
}
|
|
199
210
|
/**
|
|
200
211
|
* Generic renderer type that can transform data into any output format.
|
|
@@ -1,21 +1,12 @@
|
|
|
1
1
|
import type { CLIMeta } from './cli.types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Result of parsing CLI arguments
|
|
4
|
-
*/
|
|
5
2
|
export interface ParsedCommand {
|
|
6
3
|
program: string;
|
|
7
4
|
commandPath: string[];
|
|
8
5
|
positionals: Record<string, any>;
|
|
9
6
|
options: Record<string, any>;
|
|
10
7
|
errors: string[];
|
|
11
|
-
/** Non-fatal
|
|
8
|
+
/** Non-fatal: the command still runs. */
|
|
12
9
|
warnings: string[];
|
|
13
10
|
}
|
|
14
|
-
/**
|
|
15
|
-
* Parses raw CLI arguments into structured data for a specific program
|
|
16
|
-
*/
|
|
17
11
|
export declare function parseCLIArguments(args: string[], programName: string, allMeta: CLIMeta): ParsedCommand;
|
|
18
|
-
/**
|
|
19
|
-
* Generates help text for a command in a specific program
|
|
20
|
-
*/
|
|
21
12
|
export declare function generateCommandHelp(programName: string, allMeta: CLIMeta, commandPath?: string[]): string;
|
|
@@ -1,17 +1,13 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/** "from-plan" → "fromPlan"; the parser accepts either spelling. */
|
|
2
2
|
function toCamelCase(str) {
|
|
3
3
|
return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
|
4
4
|
}
|
|
5
|
-
/** Convert camelCase to kebab-case for display: "autoApply" → "auto-apply".
|
|
6
|
-
* Flags are stored camelCase (matching the function input field) but shown
|
|
7
|
-
* kebab; the parser accepts both forms via toCamelCase. */
|
|
8
5
|
function toKebabCase(str) {
|
|
9
6
|
return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();
|
|
10
7
|
}
|
|
11
8
|
/** Options the runner handles itself — never reported as unknown. */
|
|
12
9
|
const RESERVED_OPTIONS = new Set(['help']);
|
|
13
|
-
/**
|
|
14
|
-
* a near-miss option name, so the naive O(n*m) implementation is fine. */
|
|
10
|
+
/** Naive O(n*m); only ever used to suggest a near-miss option name. */
|
|
15
11
|
function levenshtein(a, b) {
|
|
16
12
|
if (a === b)
|
|
17
13
|
return 0;
|
|
@@ -30,8 +26,7 @@ function levenshtein(a, b) {
|
|
|
30
26
|
}
|
|
31
27
|
return prev[b.length];
|
|
32
28
|
}
|
|
33
|
-
/**
|
|
34
|
-
* Compares against the kebab-case rendering, since that is what is typed. */
|
|
29
|
+
/** Returns null beyond a distance of 2. */
|
|
35
30
|
function suggestOption(typed, availableOptions) {
|
|
36
31
|
let best = null;
|
|
37
32
|
let bestDistance = 3;
|
|
@@ -45,9 +40,7 @@ function suggestOption(typed, availableOptions) {
|
|
|
45
40
|
}
|
|
46
41
|
return best;
|
|
47
42
|
}
|
|
48
|
-
|
|
49
|
-
* Unknown options stay non-fatal for forward compatibility (a newer command
|
|
50
|
-
* version may understand them) — they are just no longer silent. */
|
|
43
|
+
// knowledge: decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md
|
|
51
44
|
function warnUnknownOption(typed, availableOptions, result) {
|
|
52
45
|
if (RESERVED_OPTIONS.has(toCamelCase(typed))) {
|
|
53
46
|
return;
|
|
@@ -56,9 +49,6 @@ function warnUnknownOption(typed, availableOptions, result) {
|
|
|
56
49
|
result.warnings.push(`Unknown option: --${typed} (ignored)` +
|
|
57
50
|
(suggestion ? ` Did you mean --${suggestion}?` : ''));
|
|
58
51
|
}
|
|
59
|
-
/**
|
|
60
|
-
* Parses raw CLI arguments into structured data for a specific program
|
|
61
|
-
*/
|
|
62
52
|
export function parseCLIArguments(args, programName, allMeta) {
|
|
63
53
|
const result = {
|
|
64
54
|
program: programName,
|
|
@@ -75,10 +65,8 @@ export function parseCLIArguments(args, programName, allMeta) {
|
|
|
75
65
|
}
|
|
76
66
|
let currentIndex = 0;
|
|
77
67
|
let currentMeta = meta;
|
|
78
|
-
// Parse command path (non-flag arguments at the beginning)
|
|
79
68
|
while (currentIndex < args.length && !args[currentIndex].startsWith('-')) {
|
|
80
69
|
const arg = args[currentIndex];
|
|
81
|
-
// Check if this is a known subcommand
|
|
82
70
|
if (currentMeta.commands && currentMeta.commands[arg]) {
|
|
83
71
|
result.commandPath.push(arg);
|
|
84
72
|
currentMeta = {
|
|
@@ -93,12 +81,10 @@ export function parseCLIArguments(args, programName, allMeta) {
|
|
|
93
81
|
currentIndex++;
|
|
94
82
|
}
|
|
95
83
|
else {
|
|
96
|
-
// Not a subcommand, must be a positional argument
|
|
97
84
|
break;
|
|
98
85
|
}
|
|
99
86
|
}
|
|
100
|
-
//
|
|
101
|
-
// Only use default if user didn't provide any non-flag arguments
|
|
87
|
+
// A default command only applies when the user named no command at all.
|
|
102
88
|
const hasNonFlagArgs = args.some((arg, idx) => idx >= currentIndex && !arg.startsWith('-'));
|
|
103
89
|
if (result.commandPath.length === 0 && meta.commands && !hasNonFlagArgs) {
|
|
104
90
|
for (const [name, cmd] of Object.entries(meta.commands)) {
|
|
@@ -117,10 +103,8 @@ export function parseCLIArguments(args, programName, allMeta) {
|
|
|
117
103
|
}
|
|
118
104
|
}
|
|
119
105
|
}
|
|
120
|
-
// Get the final command metadata
|
|
121
106
|
const commandMeta = getCommandMeta(meta, result.commandPath);
|
|
122
107
|
if (!commandMeta) {
|
|
123
|
-
// If we have no command path but there are non-flag args, the first arg is likely an unknown command
|
|
124
108
|
if (result.commandPath.length === 0 &&
|
|
125
109
|
hasNonFlagArgs &&
|
|
126
110
|
args.length > 0 &&
|
|
@@ -132,41 +116,32 @@ export function parseCLIArguments(args, programName, allMeta) {
|
|
|
132
116
|
}
|
|
133
117
|
return result;
|
|
134
118
|
}
|
|
135
|
-
//
|
|
136
|
-
// own — cannot be executed directly. Surface a routable error so the runner
|
|
137
|
-
// shows its subcommand help instead of attempting to run a missing function.
|
|
119
|
+
// knowledge: decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md
|
|
138
120
|
if (!commandMeta.pikkuFuncId &&
|
|
139
121
|
commandMeta.subcommands &&
|
|
140
122
|
Object.keys(commandMeta.subcommands).length > 0) {
|
|
141
123
|
result.errors.push(`Missing subcommand: ${result.commandPath.join(' ')}`);
|
|
142
124
|
return result;
|
|
143
125
|
}
|
|
144
|
-
// Collect all available options (global + inherited)
|
|
145
126
|
const availableOptions = collectAvailableOptions(meta, result.commandPath);
|
|
146
|
-
// Parse remaining arguments as positionals and options
|
|
147
127
|
const positionalArgs = [];
|
|
148
128
|
const optionArgs = {};
|
|
149
129
|
while (currentIndex < args.length) {
|
|
150
130
|
const arg = args[currentIndex];
|
|
151
131
|
if (arg.startsWith('--')) {
|
|
152
|
-
// Long option (--from-plan → fromPlan)
|
|
153
132
|
const negatedKey = arg.startsWith('--no-')
|
|
154
133
|
? toCamelCase(arg.slice(5))
|
|
155
134
|
: undefined;
|
|
156
135
|
const equalIndex = arg.indexOf('=');
|
|
157
136
|
if (negatedKey &&
|
|
158
137
|
typeof availableOptions[negatedKey]?.default === 'boolean') {
|
|
159
|
-
//
|
|
160
|
-
//
|
|
161
|
-
// name still parses as itself.
|
|
138
|
+
// Requiring a boolean default keeps a literal `--no-something` option
|
|
139
|
+
// name parsing as itself rather than as a negation.
|
|
162
140
|
optionArgs[negatedKey] = false;
|
|
163
141
|
}
|
|
164
142
|
else if (equalIndex > 0) {
|
|
165
|
-
// --option=value format
|
|
166
143
|
const key = toCamelCase(arg.slice(2, equalIndex));
|
|
167
144
|
const optionDef = availableOptions[key];
|
|
168
|
-
// Unknown options are allowed for forward compatibility, but warned
|
|
169
|
-
// about so they are not silently dropped by the input schema.
|
|
170
145
|
if (!optionDef) {
|
|
171
146
|
warnUnknownOption(arg.slice(2, equalIndex), availableOptions, result);
|
|
172
147
|
}
|
|
@@ -174,16 +149,12 @@ export function parseCLIArguments(args, programName, allMeta) {
|
|
|
174
149
|
optionArgs[key] = parseOptionValue(value, optionDef);
|
|
175
150
|
}
|
|
176
151
|
else {
|
|
177
|
-
// --option value format
|
|
178
152
|
const key = toCamelCase(arg.slice(2));
|
|
179
153
|
const optionDef = availableOptions[key];
|
|
180
|
-
// Unknown options are allowed for forward compatibility, but warned
|
|
181
|
-
// about so they are not silently dropped by the input schema.
|
|
182
154
|
if (!optionDef) {
|
|
183
155
|
warnUnknownOption(arg.slice(2), availableOptions, result);
|
|
184
156
|
}
|
|
185
157
|
if (optionDef && optionDef.array) {
|
|
186
|
-
// Array option - collect all following non-flag values
|
|
187
158
|
currentIndex++;
|
|
188
159
|
const values = [];
|
|
189
160
|
while (currentIndex < args.length &&
|
|
@@ -196,24 +167,20 @@ export function parseCLIArguments(args, programName, allMeta) {
|
|
|
196
167
|
}
|
|
197
168
|
else if (currentIndex + 1 < args.length &&
|
|
198
169
|
!args[currentIndex + 1].startsWith('-')) {
|
|
199
|
-
// Next arg is the value
|
|
200
170
|
currentIndex++;
|
|
201
171
|
optionArgs[key] = parseOptionValue(args[currentIndex], optionDef);
|
|
202
172
|
}
|
|
203
173
|
else {
|
|
204
|
-
// Boolean flag
|
|
205
174
|
optionArgs[key] = true;
|
|
206
175
|
}
|
|
207
176
|
}
|
|
208
177
|
}
|
|
209
178
|
else if (arg.startsWith('-') && arg.length > 1) {
|
|
210
|
-
// Short option(s)
|
|
211
179
|
for (let i = 1; i < arg.length; i++) {
|
|
212
180
|
const shortFlag = arg[i];
|
|
213
|
-
// Find the corresponding long option
|
|
214
181
|
const longOption = findLongOption(shortFlag, availableOptions);
|
|
215
182
|
if (longOption) {
|
|
216
|
-
//
|
|
183
|
+
// Only the last flag in a cluster can take a value.
|
|
217
184
|
if (i === arg.length - 1 &&
|
|
218
185
|
currentIndex + 1 < args.length &&
|
|
219
186
|
!args[currentIndex + 1].startsWith('-')) {
|
|
@@ -221,7 +188,6 @@ export function parseCLIArguments(args, programName, allMeta) {
|
|
|
221
188
|
optionArgs[longOption] = parseOptionValue(args[currentIndex], availableOptions[longOption]);
|
|
222
189
|
}
|
|
223
190
|
else {
|
|
224
|
-
// Boolean flag
|
|
225
191
|
optionArgs[longOption] = true;
|
|
226
192
|
}
|
|
227
193
|
}
|
|
@@ -231,21 +197,15 @@ export function parseCLIArguments(args, programName, allMeta) {
|
|
|
231
197
|
}
|
|
232
198
|
}
|
|
233
199
|
else {
|
|
234
|
-
// Positional argument
|
|
235
200
|
positionalArgs.push(arg);
|
|
236
201
|
}
|
|
237
202
|
currentIndex++;
|
|
238
203
|
}
|
|
239
|
-
// Map positional arguments to named parameters
|
|
240
204
|
mapPositionalArguments(commandMeta.positionals, positionalArgs, result);
|
|
241
|
-
// Apply option defaults and validation
|
|
242
205
|
applyOptionDefaults(availableOptions, optionArgs, result);
|
|
243
206
|
result.options = optionArgs;
|
|
244
207
|
return result;
|
|
245
208
|
}
|
|
246
|
-
/**
|
|
247
|
-
* Gets the command metadata for a given path
|
|
248
|
-
*/
|
|
249
209
|
function getCommandMeta(meta, path) {
|
|
250
210
|
if (path.length === 0) {
|
|
251
211
|
return null;
|
|
@@ -262,15 +222,11 @@ function getCommandMeta(meta, path) {
|
|
|
262
222
|
}
|
|
263
223
|
return current;
|
|
264
224
|
}
|
|
265
|
-
/**
|
|
266
|
-
* Collects all available options through the inheritance chain
|
|
267
|
-
*/
|
|
268
225
|
function collectAvailableOptions(meta, path) {
|
|
269
226
|
let options = { ...meta.options };
|
|
270
227
|
if (path.length === 0) {
|
|
271
228
|
return options;
|
|
272
229
|
}
|
|
273
|
-
// Walk through the command path, merging options
|
|
274
230
|
let current = meta.commands[path[0]];
|
|
275
231
|
if (current) {
|
|
276
232
|
options = { ...options, ...current.options };
|
|
@@ -283,9 +239,6 @@ function collectAvailableOptions(meta, path) {
|
|
|
283
239
|
}
|
|
284
240
|
return options;
|
|
285
241
|
}
|
|
286
|
-
/**
|
|
287
|
-
* Finds the long option name for a short flag
|
|
288
|
-
*/
|
|
289
242
|
function findLongOption(shortFlag, options) {
|
|
290
243
|
for (const [name, option] of Object.entries(options)) {
|
|
291
244
|
if (option.short === shortFlag) {
|
|
@@ -294,12 +247,8 @@ function findLongOption(shortFlag, options) {
|
|
|
294
247
|
}
|
|
295
248
|
return null;
|
|
296
249
|
}
|
|
297
|
-
/**
|
|
298
|
-
* Parses an option value based on its definition
|
|
299
|
-
*/
|
|
300
250
|
function parseOptionValue(value, optionDef) {
|
|
301
251
|
if (!optionDef) {
|
|
302
|
-
// No definition, try to infer type
|
|
303
252
|
if (value === 'true')
|
|
304
253
|
return true;
|
|
305
254
|
if (value === 'false')
|
|
@@ -310,7 +259,6 @@ function parseOptionValue(value, optionDef) {
|
|
|
310
259
|
return parseFloat(value);
|
|
311
260
|
return value;
|
|
312
261
|
}
|
|
313
|
-
// Use default type from option definition
|
|
314
262
|
const defaultValue = optionDef.default;
|
|
315
263
|
if (typeof defaultValue === 'boolean') {
|
|
316
264
|
return value === 'true' || value === '1' || value === 'yes';
|
|
@@ -318,21 +266,16 @@ function parseOptionValue(value, optionDef) {
|
|
|
318
266
|
if (typeof defaultValue === 'number') {
|
|
319
267
|
return parseFloat(value);
|
|
320
268
|
}
|
|
321
|
-
// Check choices
|
|
322
269
|
if (optionDef.choices && !optionDef.choices.includes(value)) {
|
|
323
|
-
//
|
|
270
|
+
// Deliberately not an error here — applyOptionDefaults reports bad choices.
|
|
324
271
|
return value;
|
|
325
272
|
}
|
|
326
273
|
return value;
|
|
327
274
|
}
|
|
328
|
-
/**
|
|
329
|
-
* Maps positional arguments to named parameters
|
|
330
|
-
*/
|
|
331
275
|
function mapPositionalArguments(positionalDefs, args, result) {
|
|
332
276
|
let argIndex = 0;
|
|
333
277
|
for (const def of positionalDefs) {
|
|
334
278
|
if (def.variadic) {
|
|
335
|
-
// Collect all remaining arguments
|
|
336
279
|
if (argIndex < args.length) {
|
|
337
280
|
result.positionals[def.name] = args.slice(argIndex);
|
|
338
281
|
argIndex = args.length;
|
|
@@ -345,7 +288,6 @@ function mapPositionalArguments(positionalDefs, args, result) {
|
|
|
345
288
|
}
|
|
346
289
|
}
|
|
347
290
|
else {
|
|
348
|
-
// Single argument
|
|
349
291
|
if (argIndex < args.length) {
|
|
350
292
|
result.positionals[def.name] = args[argIndex];
|
|
351
293
|
argIndex++;
|
|
@@ -355,25 +297,18 @@ function mapPositionalArguments(positionalDefs, args, result) {
|
|
|
355
297
|
}
|
|
356
298
|
}
|
|
357
299
|
}
|
|
358
|
-
// Check for extra positional arguments
|
|
359
300
|
if (argIndex < args.length) {
|
|
360
301
|
result.errors.push(`Unexpected arguments: ${args.slice(argIndex).join(' ')}`);
|
|
361
302
|
}
|
|
362
303
|
}
|
|
363
|
-
/**
|
|
364
|
-
* Applies option defaults and validates choices
|
|
365
|
-
*/
|
|
366
304
|
function applyOptionDefaults(optionDefs, options, result) {
|
|
367
305
|
for (const [name, def] of Object.entries(optionDefs)) {
|
|
368
|
-
// Apply default if not provided
|
|
369
306
|
if (!(name in options) && def.default !== undefined) {
|
|
370
307
|
options[name] = def.default;
|
|
371
308
|
}
|
|
372
|
-
// Check required
|
|
373
309
|
if (def.required && !(name in options)) {
|
|
374
310
|
result.errors.push(`Missing required option: --${toKebabCase(name)}`);
|
|
375
311
|
}
|
|
376
|
-
// Validate choices
|
|
377
312
|
if (def.choices && name in options) {
|
|
378
313
|
const value = options[name];
|
|
379
314
|
if (Array.isArray(value)) {
|
|
@@ -389,9 +324,6 @@ function applyOptionDefaults(optionDefs, options, result) {
|
|
|
389
324
|
}
|
|
390
325
|
}
|
|
391
326
|
}
|
|
392
|
-
/**
|
|
393
|
-
* Generates help text for a command in a specific program
|
|
394
|
-
*/
|
|
395
327
|
export function generateCommandHelp(programName, allMeta, commandPath = []) {
|
|
396
328
|
const lines = [];
|
|
397
329
|
const meta = allMeta.programs[programName];
|
|
@@ -399,7 +331,6 @@ export function generateCommandHelp(programName, allMeta, commandPath = []) {
|
|
|
399
331
|
return `Program not found: ${programName}`;
|
|
400
332
|
}
|
|
401
333
|
if (commandPath.length === 0) {
|
|
402
|
-
// Root help for the program
|
|
403
334
|
lines.push(`Usage: ${programName} <command> [options]`);
|
|
404
335
|
lines.push('');
|
|
405
336
|
lines.push('Commands:');
|
|
@@ -415,12 +346,10 @@ export function generateCommandHelp(programName, allMeta, commandPath = []) {
|
|
|
415
346
|
}
|
|
416
347
|
}
|
|
417
348
|
else {
|
|
418
|
-
// Command-specific help
|
|
419
349
|
const commandMeta = getCommandMeta(meta, commandPath);
|
|
420
350
|
if (!commandMeta) {
|
|
421
351
|
return `Unknown command: ${commandPath.join(' ')}`;
|
|
422
352
|
}
|
|
423
|
-
// Usage line
|
|
424
353
|
let usage = `${programName} ${commandPath.join(' ')}`;
|
|
425
354
|
if (commandMeta.parameters) {
|
|
426
355
|
usage += ' ' + commandMeta.parameters;
|
|
@@ -430,7 +359,6 @@ export function generateCommandHelp(programName, allMeta, commandPath = []) {
|
|
|
430
359
|
lines.push('');
|
|
431
360
|
lines.push(commandMeta.description);
|
|
432
361
|
}
|
|
433
|
-
// Positional arguments
|
|
434
362
|
if (commandMeta.positionals.length > 0) {
|
|
435
363
|
lines.push('');
|
|
436
364
|
lines.push('Arguments:');
|
|
@@ -440,7 +368,6 @@ export function generateCommandHelp(programName, allMeta, commandPath = []) {
|
|
|
440
368
|
lines.push(` ${pos.name}${variadic} ${marker}`);
|
|
441
369
|
}
|
|
442
370
|
}
|
|
443
|
-
// Subcommands
|
|
444
371
|
if (commandMeta.subcommands &&
|
|
445
372
|
Object.keys(commandMeta.subcommands).length > 0) {
|
|
446
373
|
lines.push('');
|
|
@@ -450,7 +377,6 @@ export function generateCommandHelp(programName, allMeta, commandPath = []) {
|
|
|
450
377
|
lines.push(` ${name.padEnd(20)} ${desc}`);
|
|
451
378
|
}
|
|
452
379
|
}
|
|
453
|
-
// Options
|
|
454
380
|
const availableOptions = collectAvailableOptions(meta, commandPath);
|
|
455
381
|
if (Object.keys(availableOptions).length > 0) {
|
|
456
382
|
lines.push('');
|
|
@@ -460,9 +386,6 @@ export function generateCommandHelp(programName, allMeta, commandPath = []) {
|
|
|
460
386
|
}
|
|
461
387
|
return lines.join('\n');
|
|
462
388
|
}
|
|
463
|
-
/**
|
|
464
|
-
* Formats options for help text
|
|
465
|
-
*/
|
|
466
389
|
function formatOptions(options, lines) {
|
|
467
390
|
for (const [name, opt] of Object.entries(options)) {
|
|
468
391
|
let line = ' ';
|
|
@@ -1,19 +1,3 @@
|
|
|
1
1
|
import type { CoreCLICommandConfig } from './cli.types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Type-safe helper for defining CLI commands that can be composed.
|
|
4
|
-
* Returns the commands record as-is (identity function) for use with `wireCLI`.
|
|
5
|
-
*
|
|
6
|
-
* @example
|
|
7
|
-
* ```typescript
|
|
8
|
-
* export const chatCommands = defineCLICommands({
|
|
9
|
-
* chat: pikkuCLICommand({ func: chatFunc }),
|
|
10
|
-
* 'chat:history': pikkuCLICommand({ func: historyFunc }),
|
|
11
|
-
* })
|
|
12
|
-
*
|
|
13
|
-
* wireCLI({
|
|
14
|
-
* program: 'my-app',
|
|
15
|
-
* commands: { ...chatCommands, other: pikkuCLICommand({ func: otherFunc }) }
|
|
16
|
-
* })
|
|
17
|
-
* ```
|
|
18
|
-
*/
|
|
2
|
+
/** Identity at runtime; exists so a commands record can be typed and composed before `wireCLI`. */
|
|
19
3
|
export declare function defineCLICommands<T extends Record<string, CoreCLICommandConfig<any, any, any, any>>>(commands: T): T;
|
|
@@ -1,20 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Type-safe helper for defining CLI commands that can be composed.
|
|
3
|
-
* Returns the commands record as-is (identity function) for use with `wireCLI`.
|
|
4
|
-
*
|
|
5
|
-
* @example
|
|
6
|
-
* ```typescript
|
|
7
|
-
* export const chatCommands = defineCLICommands({
|
|
8
|
-
* chat: pikkuCLICommand({ func: chatFunc }),
|
|
9
|
-
* 'chat:history': pikkuCLICommand({ func: historyFunc }),
|
|
10
|
-
* })
|
|
11
|
-
*
|
|
12
|
-
* wireCLI({
|
|
13
|
-
* program: 'my-app',
|
|
14
|
-
* commands: { ...chatCommands, other: pikkuCLICommand({ func: otherFunc }) }
|
|
15
|
-
* })
|
|
16
|
-
* ```
|
|
17
|
-
*/
|
|
1
|
+
/** Identity at runtime; exists so a commands record can be typed and composed before `wireCLI`. */
|
|
18
2
|
export function defineCLICommands(commands) {
|
|
19
3
|
return commands;
|
|
20
4
|
}
|
|
@@ -5,12 +5,6 @@ export type CoreCredential<T = unknown> = {
|
|
|
5
5
|
description?: string;
|
|
6
6
|
type: 'singleton' | 'wire';
|
|
7
7
|
schema: T;
|
|
8
|
-
/**
|
|
9
|
-
* Link to documentation explaining how to obtain this value — a provider's
|
|
10
|
-
* API-key page, a setup guide, an internal runbook. Surfaced by consoles and
|
|
11
|
-
* deploy UIs so a user facing a missing value has somewhere to go instead of
|
|
12
|
-
* an opaque identifier.
|
|
13
|
-
*/
|
|
14
8
|
docsUrl?: string;
|
|
15
9
|
oauth2?: OAuth2CredentialConfig & {
|
|
16
10
|
appCredentialSecretId: string;
|
|
@@ -22,12 +16,6 @@ export type CredentialDefinitionMeta = {
|
|
|
22
16
|
description?: string;
|
|
23
17
|
type: 'singleton' | 'wire';
|
|
24
18
|
schema?: Record<string, unknown> | string;
|
|
25
|
-
/**
|
|
26
|
-
* Link to documentation explaining how to obtain this value — a provider's
|
|
27
|
-
* API-key page, a setup guide, an internal runbook. Surfaced by consoles and
|
|
28
|
-
* deploy UIs so a user facing a missing value has somewhere to go instead of
|
|
29
|
-
* an opaque identifier.
|
|
30
|
-
*/
|
|
31
19
|
docsUrl?: string;
|
|
32
20
|
oauth2?: OAuth2CredentialConfig & {
|
|
33
21
|
appCredentialSecretId: string;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { CoreCredential } from './credential.types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Declares a credential. The body is a no-op that tree-shakes away — the CLI
|
|
4
|
+
* reads the call by AST, so the declaration must be a top-level literal.
|
|
5
|
+
* `type: 'wire'` is per-user, `type: 'singleton'` is platform-wide.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // Per-user API key
|
|
10
|
+
* defineCredential({
|
|
11
|
+
* name: 'stripe',
|
|
12
|
+
* displayName: 'Stripe API Key',
|
|
13
|
+
* type: 'wire',
|
|
14
|
+
* schema: z.object({ apiKey: z.string() }),
|
|
15
|
+
* })
|
|
16
|
+
*
|
|
17
|
+
* // Per-user OAuth
|
|
18
|
+
* defineCredential({
|
|
19
|
+
* name: 'google-sheets',
|
|
20
|
+
* displayName: 'Google Sheets',
|
|
21
|
+
* type: 'wire',
|
|
22
|
+
* schema: z.object({ accessToken: z.string(), refreshToken: z.string() }),
|
|
23
|
+
* oauth2: {
|
|
24
|
+
* appCredentialSecretId: 'GOOGLE_OAUTH_APP',
|
|
25
|
+
* authorizationUrl: 'https://accounts.google.com/o/oauth2/v2/auth',
|
|
26
|
+
* tokenUrl: 'https://oauth2.googleapis.com/token',
|
|
27
|
+
* scopes: ['https://www.googleapis.com/auth/spreadsheets'],
|
|
28
|
+
* tokenSecretId: 'GOOGLE_OAUTH_TOKENS',
|
|
29
|
+
* }
|
|
30
|
+
* })
|
|
31
|
+
*
|
|
32
|
+
* // Platform-level OAuth (singleton)
|
|
33
|
+
* defineCredential({
|
|
34
|
+
* name: 'slack',
|
|
35
|
+
* displayName: 'Slack',
|
|
36
|
+
* type: 'singleton',
|
|
37
|
+
* schema: z.object({ accessToken: z.string(), refreshToken: z.string() }),
|
|
38
|
+
* oauth2: {
|
|
39
|
+
* appCredentialSecretId: 'SLACK_OAUTH_APP',
|
|
40
|
+
* authorizationUrl: 'https://slack.com/oauth/v2/authorize',
|
|
41
|
+
* tokenUrl: 'https://slack.com/api/oauth.v2.access',
|
|
42
|
+
* scopes: ['chat:write', 'channels:read'],
|
|
43
|
+
* tokenSecretId: 'SLACK_OAUTH_TOKENS',
|
|
44
|
+
* }
|
|
45
|
+
* })
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare const defineCredential: <T>(_config: CoreCredential<T>) => void;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Declares a credential. The body is a no-op that tree-shakes away — the CLI
|
|
3
|
+
* reads the call by AST, so the declaration must be a top-level literal.
|
|
4
|
+
* `type: 'wire'` is per-user, `type: 'singleton'` is platform-wide.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* // Per-user API key
|
|
9
|
+
* defineCredential({
|
|
10
|
+
* name: 'stripe',
|
|
11
|
+
* displayName: 'Stripe API Key',
|
|
12
|
+
* type: 'wire',
|
|
13
|
+
* schema: z.object({ apiKey: z.string() }),
|
|
14
|
+
* })
|
|
15
|
+
*
|
|
16
|
+
* // Per-user OAuth
|
|
17
|
+
* defineCredential({
|
|
18
|
+
* name: 'google-sheets',
|
|
19
|
+
* displayName: 'Google Sheets',
|
|
20
|
+
* type: 'wire',
|
|
21
|
+
* schema: z.object({ accessToken: z.string(), refreshToken: z.string() }),
|
|
22
|
+
* oauth2: {
|
|
23
|
+
* appCredentialSecretId: 'GOOGLE_OAUTH_APP',
|
|
24
|
+
* authorizationUrl: 'https://accounts.google.com/o/oauth2/v2/auth',
|
|
25
|
+
* tokenUrl: 'https://oauth2.googleapis.com/token',
|
|
26
|
+
* scopes: ['https://www.googleapis.com/auth/spreadsheets'],
|
|
27
|
+
* tokenSecretId: 'GOOGLE_OAUTH_TOKENS',
|
|
28
|
+
* }
|
|
29
|
+
* })
|
|
30
|
+
*
|
|
31
|
+
* // Platform-level OAuth (singleton)
|
|
32
|
+
* defineCredential({
|
|
33
|
+
* name: 'slack',
|
|
34
|
+
* displayName: 'Slack',
|
|
35
|
+
* type: 'singleton',
|
|
36
|
+
* schema: z.object({ accessToken: z.string(), refreshToken: z.string() }),
|
|
37
|
+
* oauth2: {
|
|
38
|
+
* appCredentialSecretId: 'SLACK_OAUTH_APP',
|
|
39
|
+
* authorizationUrl: 'https://slack.com/oauth/v2/authorize',
|
|
40
|
+
* tokenUrl: 'https://slack.com/api/oauth.v2.access',
|
|
41
|
+
* scopes: ['chat:write', 'channels:read'],
|
|
42
|
+
* tokenSecretId: 'SLACK_OAUTH_TOKENS',
|
|
43
|
+
* }
|
|
44
|
+
* })
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export const defineCredential = (_config) => { };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { defineCredential } from './define-credential.js';
|
|
2
2
|
export { validateAndBuildCredentialDefinitionsMeta } from './validate-credential-definitions.js';
|
|
3
3
|
export type { CoreCredential, CredentialDefinitionMeta, CredentialDefinitionsMeta, CredentialDefinitions, } from './credential.types.js';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { defineCredential } from './define-credential.js';
|
|
2
2
|
export { validateAndBuildCredentialDefinitionsMeta } from './validate-credential-definitions.js';
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import type { CredentialDefinitions, CredentialDefinitionsMeta } from './credential.types.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
sourceFile: string;
|
|
5
|
-
}
|
|
2
|
+
import type { SchemaRefLike } from '../../types/core.types.js';
|
|
3
|
+
export type { SchemaRefLike };
|
|
6
4
|
export declare function validateAndBuildCredentialDefinitionsMeta(definitions: CredentialDefinitions, schemaLookup: Map<string, SchemaRefLike>): CredentialDefinitionsMeta;
|
|
@@ -1,25 +1,6 @@
|
|
|
1
1
|
import type { CoreGateway, GatewayAdapter } from './gateway.types.js';
|
|
2
2
|
export declare const resolveGatewayAdapter: (config: CoreGateway, services: CoreSingletonServices) => Promise<GatewayAdapter>;
|
|
3
3
|
import type { CoreSingletonServices } from '../../types/core.types.js';
|
|
4
|
-
/**
|
|
5
|
-
* Register a messaging gateway.
|
|
6
|
-
*
|
|
7
|
-
* `wireGateway` is a meta-wiring that composes existing primitives
|
|
8
|
-
* (`wireHTTP`, `wireChannel`) under the hood. It does not replace them;
|
|
9
|
-
* it layers on top.
|
|
10
|
-
*
|
|
11
|
-
* @param config - Gateway configuration (name, type, adapter, func, middleware, etc.)
|
|
12
|
-
*/
|
|
13
4
|
export declare const wireGateway: (config: CoreGateway) => void;
|
|
14
|
-
/**
|
|
15
|
-
* Create the message handler callback for a listener gateway.
|
|
16
|
-
*
|
|
17
|
-
* Returns a function `(rawData: unknown) => Promise<void>` that can be
|
|
18
|
-
* passed to `adapter.init()`. Used by `LocalGatewayService` (and any
|
|
19
|
-
* other GatewayService implementation) to wire up listener gateways.
|
|
20
|
-
*
|
|
21
|
-
* @param name - Gateway name (for wire.gateway metadata)
|
|
22
|
-
* @param config - The gateway configuration (adapter, func, middleware)
|
|
23
|
-
* @param singletonServices - Singleton services to pass to handler/middleware
|
|
24
|
-
*/
|
|
5
|
+
/** The returned callback is what a GatewayService passes to `adapter.init()`. */
|
|
25
6
|
export declare const createListenerMessageHandler: (name: string, config: CoreGateway, singletonServices: CoreSingletonServices) => ((rawData: unknown) => Promise<void>);
|