@pikku/core 0.12.72 → 0.12.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1171 -0
- package/dist/column-form.d.ts +32 -0
- package/dist/column-form.js +42 -0
- package/dist/crypto-utils.d.ts +43 -7
- package/dist/crypto-utils.js +163 -42
- package/dist/data-classification.d.ts +44 -0
- package/dist/dev/hot-reload.js +11 -30
- package/dist/dev/module-runner.d.ts +3 -7
- package/dist/dev/module-runner.js +4 -10
- package/dist/dev/reload-meta.d.ts +8 -20
- package/dist/dev/reload-meta.js +9 -29
- package/dist/errors/error-handler.d.ts +5 -30
- package/dist/errors/error-handler.js +16 -32
- package/dist/errors/errors.d.ts +32 -151
- package/dist/errors/errors.js +55 -157
- package/dist/function/abort-scope.d.ts +47 -0
- package/dist/function/abort-scope.js +63 -0
- package/dist/function/function-runner.js +37 -32
- package/dist/function/functions.types.d.ts +57 -136
- package/dist/function/functions.types.js +0 -58
- package/dist/function/index.d.ts +1 -1
- package/dist/function/list.types.d.ts +12 -62
- package/dist/function/list.types.js +4 -25
- package/dist/handle-error.d.ts +0 -13
- package/dist/handle-error.js +0 -18
- package/dist/index.d.ts +11 -5
- package/dist/index.js +7 -2
- package/dist/middleware/auth-apikey.d.ts +3 -18
- package/dist/middleware/auth-apikey.js +0 -17
- package/dist/middleware/auth-bearer.d.ts +6 -41
- package/dist/middleware/auth-bearer.js +5 -41
- package/dist/middleware/auth-cookie.d.ts +5 -27
- package/dist/middleware/auth-cookie.js +2 -26
- package/dist/middleware/cors.d.ts +7 -34
- package/dist/middleware/cors.js +7 -34
- package/dist/middleware/remote-auth.d.ts +3 -1
- package/dist/middleware/remote-auth.js +4 -3
- package/dist/middleware/telemetry.d.ts +8 -33
- package/dist/middleware/telemetry.js +2 -31
- package/dist/middleware-runner.d.ts +4 -55
- package/dist/middleware-runner.js +5 -74
- package/dist/permissions.d.ts +3 -44
- package/dist/permissions.js +19 -71
- package/dist/pikku-request.d.ts +0 -6
- package/dist/pikku-request.js +0 -6
- package/dist/pikku-state.d.ts +0 -26
- package/dist/pikku-state.js +2 -30
- package/dist/remote.d.ts +3 -5
- package/dist/remote.js +9 -8
- package/dist/schema.d.ts +5 -39
- package/dist/schema.js +5 -39
- package/dist/scopes.d.ts +4 -23
- package/dist/scopes.js +7 -48
- package/dist/secret-value.d.ts +56 -0
- package/dist/secret-value.js +46 -0
- package/dist/services/ai-agent-runner-service.d.ts +20 -0
- package/dist/services/ai-embedding-service.d.ts +2 -25
- package/dist/services/audit-service.d.ts +74 -4
- package/dist/services/audit-service.js +8 -7
- package/dist/services/content-service.d.ts +1 -46
- package/dist/services/credential-service.d.ts +3 -40
- package/dist/services/credential-wire-service.d.ts +5 -0
- package/dist/services/credential-wire-service.js +9 -1
- package/dist/services/deployment-service.d.ts +3 -9
- package/dist/services/email-service.d.ts +2 -1
- package/dist/services/gateway-service.d.ts +0 -15
- package/dist/services/http-personas.d.ts +80 -0
- package/dist/services/http-personas.js +233 -0
- package/dist/services/in-memory-queue-service.d.ts +0 -14
- package/dist/services/in-memory-queue-service.js +1 -15
- package/dist/services/in-memory-trigger-service.d.ts +0 -18
- package/dist/services/in-memory-trigger-service.js +1 -18
- package/dist/services/in-memory-workflow-service.d.ts +0 -16
- package/dist/services/in-memory-workflow-service.js +4 -33
- package/dist/services/index.d.ts +8 -9
- package/dist/services/index.js +3 -6
- package/dist/services/istanbul-coverage-service.d.ts +1 -5
- package/dist/services/istanbul-coverage-service.js +2 -8
- package/dist/services/jwt-service.d.ts +1 -16
- package/dist/services/local-content-request-handler.d.ts +29 -0
- package/dist/services/local-content-request-handler.js +176 -0
- package/dist/services/local-content.d.ts +13 -2
- package/dist/services/local-content.js +40 -13
- package/dist/services/local-gateway-service.d.ts +0 -16
- package/dist/services/local-gateway-service.js +2 -17
- package/dist/services/local-secrets.d.ts +4 -7
- package/dist/services/local-secrets.js +7 -7
- package/dist/services/logger-console.d.ts +3 -7
- package/dist/services/logger-console.js +3 -7
- package/dist/services/logger.d.ts +22 -40
- package/dist/services/meta-service.d.ts +23 -26
- package/dist/services/meta-service.js +22 -36
- package/dist/services/personas-service.d.ts +134 -0
- package/dist/services/personas-service.js +40 -0
- package/dist/services/pikku-user-id.js +0 -4
- package/dist/services/queue-webhook-service.d.ts +2 -36
- package/dist/services/queue-webhook-service.js +10 -42
- package/dist/services/scheduler-service.d.ts +1 -50
- package/dist/services/scheduler-service.js +0 -10
- package/dist/services/schema-service.d.ts +1 -24
- package/dist/services/scope-service.d.ts +49 -34
- package/dist/services/scoped-secret-service.d.ts +4 -7
- package/dist/services/scoped-secret-service.js +0 -4
- package/dist/services/secret-host-binding.d.ts +8 -0
- package/dist/services/secret-host-binding.js +36 -0
- package/dist/services/secret-service.d.ts +12 -35
- package/dist/services/secretless.d.ts +6 -0
- package/dist/services/secretless.js +21 -0
- package/dist/services/stub-tracker.d.ts +7 -18
- package/dist/services/stub-tracker.js +8 -18
- package/dist/services/system-role-guard.d.ts +33 -0
- package/dist/services/system-role-guard.js +38 -0
- package/dist/services/trigger-service.d.ts +0 -12
- package/dist/services/typed-secret-service.d.ts +5 -11
- package/dist/services/typed-secret-service.js +1 -7
- package/dist/services/v8-coverage-service.d.ts +2 -3
- package/dist/services/v8-coverage-service.js +1 -2
- package/dist/services/variables-service.d.ts +1 -8
- package/dist/services/webhook-service.d.ts +21 -64
- package/dist/services/webhook-service.js +6 -20
- package/dist/services/workflow-service.d.ts +3 -15
- package/dist/testing/service-tests.js +6 -23
- package/dist/time-utils.d.ts +0 -16
- package/dist/time-utils.js +1 -19
- package/dist/types/core.types.d.ts +120 -219
- package/dist/types/core.types.js +0 -42
- package/dist/types/state.types.d.ts +4 -9
- package/dist/utils/hmac.d.ts +4 -10
- package/dist/utils/hmac.js +4 -10
- package/dist/utils/safe-fetch.d.ts +7 -35
- package/dist/utils/safe-fetch.js +13 -53
- package/dist/utils.d.ts +1 -6
- package/dist/utils.js +6 -15
- package/dist/wirings/actor-flow/actor-flow.types.d.ts +1 -34
- package/dist/wirings/actor-flow/index.d.ts +0 -9
- package/dist/wirings/actor-flow/run-conversation.d.ts +5 -5
- package/dist/wirings/actor-flow/run-conversation.js +14 -7
- package/dist/wirings/ai-agent/ai-agent-agui.d.ts +0 -5
- package/dist/wirings/ai-agent/ai-agent-agui.js +46 -12
- package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +7 -0
- package/dist/wirings/ai-agent/ai-agent-helpers.js +7 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.d.ts +153 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.js +256 -0
- package/dist/wirings/ai-agent/ai-agent-memory.js +0 -2
- package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +0 -9
- package/dist/wirings/ai-agent/ai-agent-model-config.js +1 -9
- package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +10 -99
- package/dist/wirings/ai-agent/ai-agent-prepare.js +65 -132
- package/dist/wirings/ai-agent/ai-agent-registry.d.ts +2 -1
- package/dist/wirings/ai-agent/ai-agent-registry.js +5 -1
- package/dist/wirings/ai-agent/ai-agent-runner.js +63 -22
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +25 -2
- package/dist/wirings/ai-agent/ai-agent-stream.js +180 -64
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +124 -4
- package/dist/wirings/ai-agent/index.d.ts +6 -4
- package/dist/wirings/ai-agent/index.js +5 -4
- package/dist/wirings/ai-agent/voice-input.d.ts +59 -1
- package/dist/wirings/ai-agent/voice-input.js +90 -12
- package/dist/wirings/ai-agent/voice-output.d.ts +69 -1
- package/dist/wirings/ai-agent/voice-output.js +162 -50
- package/dist/wirings/channel/channel-common.d.ts +7 -20
- package/dist/wirings/channel/channel-common.js +7 -21
- package/dist/wirings/channel/channel-handler.js +25 -6
- package/dist/wirings/channel/channel-host-rpc.d.ts +25 -0
- package/dist/wirings/channel/channel-host-rpc.js +38 -0
- package/dist/wirings/channel/channel-middleware-runner.d.ts +0 -12
- package/dist/wirings/channel/channel-middleware-runner.js +0 -12
- package/dist/wirings/channel/channel-rpc-registry.d.ts +31 -0
- package/dist/wirings/channel/channel-rpc-registry.js +89 -0
- package/dist/wirings/channel/channel-rpc-responder.d.ts +15 -0
- package/dist/wirings/channel/channel-rpc-responder.js +71 -0
- package/dist/wirings/channel/channel-rpc-service.d.ts +40 -0
- package/dist/wirings/channel/channel-rpc-service.js +106 -0
- package/dist/wirings/channel/channel-rpc-validators.d.ts +14 -0
- package/dist/wirings/channel/channel-rpc-validators.js +30 -0
- package/dist/wirings/channel/channel-rpc.d.ts +5 -0
- package/dist/wirings/channel/channel-rpc.js +5 -0
- package/dist/wirings/channel/channel-rpc.types.d.ts +90 -0
- package/dist/wirings/channel/channel-rpc.types.js +50 -0
- package/dist/wirings/channel/channel-runner.d.ts +0 -4
- package/dist/wirings/channel/channel-runner.js +0 -14
- package/dist/wirings/channel/channel-store.d.ts +0 -10
- package/dist/wirings/channel/channel.types.d.ts +12 -1
- package/dist/wirings/channel/define-channel-routes.d.ts +0 -20
- package/dist/wirings/channel/define-channel-routes.js +0 -20
- package/dist/wirings/channel/eventhub-service.d.ts +0 -18
- package/dist/wirings/channel/index.d.ts +4 -1
- package/dist/wirings/channel/index.js +2 -0
- package/dist/wirings/channel/local/local-channel-runner.js +3 -1
- package/dist/wirings/channel/local/local-eventhub-service.d.ts +0 -33
- package/dist/wirings/channel/local/local-eventhub-service.js +2 -36
- package/dist/wirings/channel/log-channels.d.ts +0 -4
- package/dist/wirings/channel/log-channels.js +0 -4
- package/dist/wirings/channel/pikku-abstract-channel-handler.js +6 -0
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +2 -5
- package/dist/wirings/cli/channel/cli-approval.d.ts +41 -0
- package/dist/wirings/cli/channel/cli-approval.js +81 -0
- package/dist/wirings/cli/channel/cli-channel-runner.d.ts +0 -4
- package/dist/wirings/cli/channel/cli-channel-runner.js +3 -25
- package/dist/wirings/cli/channel/cli-raw-channel-runner.d.ts +47 -9
- package/dist/wirings/cli/channel/cli-raw-channel-runner.js +24 -16
- package/dist/wirings/cli/channel/cli-raw-client-runner.d.ts +38 -0
- package/dist/wirings/cli/channel/cli-raw-client-runner.js +129 -0
- package/dist/wirings/cli/channel/index.d.ts +5 -0
- package/dist/wirings/cli/channel/index.js +2 -0
- package/dist/wirings/cli/cli-runner.d.ts +20 -20
- package/dist/wirings/cli/cli-runner.js +28 -89
- package/dist/wirings/cli/cli.types.d.ts +14 -3
- package/dist/wirings/cli/command-parser.d.ts +1 -10
- package/dist/wirings/cli/command-parser.js +10 -87
- package/dist/wirings/cli/define-cli-commands.d.ts +1 -17
- package/dist/wirings/cli/define-cli-commands.js +1 -17
- package/dist/wirings/credential/credential.types.d.ts +0 -12
- package/dist/wirings/credential/define-credential.d.ts +48 -0
- package/dist/wirings/credential/define-credential.js +47 -0
- package/dist/wirings/credential/index.d.ts +1 -1
- package/dist/wirings/credential/index.js +1 -1
- package/dist/wirings/credential/validate-credential-definitions.d.ts +2 -4
- package/dist/wirings/gateway/gateway-runner.d.ts +1 -20
- package/dist/wirings/gateway/gateway-runner.js +8 -105
- package/dist/wirings/gateway/gateway.types.d.ts +7 -80
- package/dist/wirings/http/http-routes.d.ts +0 -63
- package/dist/wirings/http/http-routes.js +0 -63
- package/dist/wirings/http/http-runner.d.ts +0 -99
- package/dist/wirings/http/http-runner.js +9 -165
- package/dist/wirings/http/http.types.d.ts +14 -55
- package/dist/wirings/http/log-http-routes.d.ts +0 -4
- package/dist/wirings/http/log-http-routes.js +0 -4
- package/dist/wirings/http/pikku-fetch-http-request.d.ts +0 -40
- package/dist/wirings/http/pikku-fetch-http-request.js +0 -58
- package/dist/wirings/http/pikku-fetch-http-response.js +0 -3
- package/dist/wirings/http/routers/path-to-regex.js +2 -13
- package/dist/wirings/http/web-request.d.ts +0 -8
- package/dist/wirings/http/web-request.js +25 -17
- package/dist/wirings/mcp/mcp-runner.d.ts +1 -4
- package/dist/wirings/mcp/mcp-runner.js +1 -14
- package/dist/wirings/mcp/mcp.types.d.ts +2 -35
- package/dist/wirings/oauth2/oauth2.types.d.ts +0 -28
- package/dist/wirings/oauth2/oauth2.types.js +0 -3
- package/dist/wirings/persona/define-personas.d.ts +32 -0
- package/dist/wirings/persona/define-personas.js +31 -0
- package/dist/wirings/persona/index.d.ts +21 -0
- package/dist/wirings/persona/index.js +17 -0
- package/dist/wirings/persona/persona-email.d.ts +37 -0
- package/dist/wirings/persona/persona-email.js +69 -0
- package/dist/wirings/persona/persona-environments.d.ts +45 -0
- package/dist/wirings/persona/persona-environments.js +81 -0
- package/dist/wirings/persona/persona-mailbox.d.ts +101 -0
- package/dist/wirings/persona/persona-mailbox.js +53 -0
- package/dist/wirings/persona/persona.types.d.ts +136 -0
- package/dist/wirings/persona/persona.types.js +1 -0
- package/dist/wirings/persona/validate-personas.d.ts +53 -0
- package/dist/wirings/persona/validate-personas.js +94 -0
- package/dist/wirings/queue/index.d.ts +3 -0
- package/dist/wirings/queue/index.js +2 -3
- package/dist/wirings/queue/queue-identity.d.ts +28 -0
- package/dist/wirings/queue/queue-identity.js +103 -0
- package/dist/wirings/queue/queue-runner.d.ts +0 -19
- package/dist/wirings/queue/queue-runner.js +9 -30
- package/dist/wirings/queue/queue.types.d.ts +20 -90
- package/dist/wirings/queue/register-queue-helper.d.ts +0 -12
- package/dist/wirings/queue/register-queue-helper.js +0 -11
- package/dist/wirings/queue/signed-queue-service.d.ts +17 -0
- package/dist/wirings/queue/signed-queue-service.js +42 -0
- package/dist/wirings/queue/validate-worker-config.d.ts +2 -23
- package/dist/wirings/queue/validate-worker-config.js +0 -14
- package/dist/wirings/role/define-system-role.d.ts +32 -0
- package/dist/wirings/role/define-system-role.js +31 -0
- package/dist/wirings/role/index.d.ts +3 -0
- package/dist/wirings/role/index.js +2 -0
- package/dist/wirings/role/role.types.d.ts +43 -0
- package/dist/wirings/role/role.types.js +1 -0
- package/dist/wirings/role/validate-role-definitions.d.ts +21 -0
- package/dist/wirings/role/validate-role-definitions.js +71 -0
- package/dist/wirings/rpc/addon-runner.d.ts +0 -19
- package/dist/wirings/rpc/addon-runner.js +0 -51
- package/dist/wirings/rpc/remote-addon-auth.d.ts +3 -13
- package/dist/wirings/rpc/remote-addon-auth.js +7 -11
- package/dist/wirings/rpc/rpc-runner.d.ts +11 -18
- package/dist/wirings/rpc/rpc-runner.js +88 -105
- package/dist/wirings/rpc/rpc-types.d.ts +7 -6
- package/dist/wirings/rpc/wire-addon.d.ts +25 -0
- package/dist/wirings/rpc/wire-addon.js +62 -0
- package/dist/wirings/rpc/wire-remote-addon.d.ts +3 -28
- package/dist/wirings/rpc/wire-remote-addon.js +0 -8
- package/dist/wirings/scheduler/log-schedulers.d.ts +0 -4
- package/dist/wirings/scheduler/log-schedulers.js +0 -4
- package/dist/wirings/scheduler/scheduler-runner.d.ts +0 -1
- package/dist/wirings/scheduler/scheduler-runner.js +0 -1
- package/dist/wirings/scheduler/scheduler.types.d.ts +1 -14
- package/dist/wirings/scope/define-scope.d.ts +32 -0
- package/dist/wirings/scope/define-scope.js +31 -0
- package/dist/wirings/scope/index.d.ts +1 -1
- package/dist/wirings/scope/index.js +1 -1
- package/dist/wirings/scope/scope.types.d.ts +7 -9
- package/dist/wirings/scope/validate-scope-definitions.d.ts +2 -21
- package/dist/wirings/scope/validate-scope-definitions.js +3 -21
- package/dist/wirings/secret/index.d.ts +1 -1
- package/dist/wirings/secret/index.js +1 -1
- package/dist/wirings/secret/secret.types.d.ts +19 -15
- package/dist/wirings/secret/secret.types.js +1 -1
- package/dist/wirings/secret/validate-secret-definitions.d.ts +2 -4
- package/dist/wirings/trigger/trigger-runner.d.ts +0 -27
- package/dist/wirings/trigger/trigger-runner.js +1 -24
- package/dist/wirings/trigger/trigger.types.d.ts +1 -82
- package/dist/wirings/trigger/trigger.types.js +0 -34
- package/dist/wirings/variable/index.d.ts +1 -1
- package/dist/wirings/variable/index.js +1 -1
- package/dist/wirings/variable/validate-variable-definitions.d.ts +2 -4
- package/dist/wirings/variable/variable.types.d.ts +1 -13
- package/dist/wirings/variable/variable.types.js +1 -1
- package/dist/wirings/virtual-user/index.d.ts +30 -0
- package/dist/wirings/virtual-user/index.js +10 -0
- package/dist/wirings/virtual-user/prepare-virtual-user-run.d.ts +54 -0
- package/dist/wirings/virtual-user/prepare-virtual-user-run.js +49 -0
- package/dist/wirings/virtual-user/run-virtual-user.d.ts +92 -0
- package/dist/wirings/virtual-user/run-virtual-user.js +478 -0
- package/dist/wirings/virtual-user/virtual-user-agents.d.ts +38 -0
- package/dist/wirings/virtual-user/virtual-user-agents.js +24 -0
- package/dist/wirings/virtual-user/virtual-user-catalogue.d.ts +92 -0
- package/dist/wirings/virtual-user/virtual-user-catalogue.js +134 -0
- package/dist/wirings/virtual-user/virtual-user-derive.d.ts +26 -0
- package/dist/wirings/virtual-user/virtual-user-derive.js +137 -0
- package/dist/wirings/virtual-user/virtual-user-dispositions.d.ts +79 -0
- package/dist/wirings/virtual-user/virtual-user-dispositions.js +128 -0
- package/dist/wirings/virtual-user/virtual-user-intents.d.ts +78 -0
- package/dist/wirings/virtual-user/virtual-user-intents.js +142 -0
- package/dist/wirings/virtual-user/virtual-user-rng.d.ts +24 -0
- package/dist/wirings/virtual-user/virtual-user-rng.js +44 -0
- package/dist/wirings/virtual-user/virtual-user-run-store.d.ts +90 -0
- package/dist/wirings/virtual-user/virtual-user-run-store.js +1 -0
- package/dist/wirings/virtual-user/virtual-user-target.d.ts +21 -0
- package/dist/wirings/virtual-user/virtual-user-target.js +34 -0
- package/dist/wirings/virtual-user/virtual-user.types.d.ts +199 -0
- package/dist/wirings/virtual-user/virtual-user.types.js +8 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +19 -15
- package/dist/wirings/workflow/dsl/workflow-runner.d.ts +0 -4
- package/dist/wirings/workflow/dsl/workflow-runner.js +0 -4
- package/dist/wirings/workflow/feature.d.ts +0 -19
- package/dist/wirings/workflow/feature.js +0 -19
- package/dist/wirings/workflow/graph/graph-node.d.ts +0 -98
- package/dist/wirings/workflow/graph/graph-node.js +0 -34
- package/dist/wirings/workflow/graph/graph-runner.js +6 -41
- package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +0 -4
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -58
- package/dist/wirings/workflow/graph/workflow-graph.types.js +0 -6
- package/dist/wirings/workflow/index.d.ts +5 -7
- package/dist/wirings/workflow/index.js +3 -17
- package/dist/wirings/workflow/pikku-scenario-service.d.ts +87 -5
- package/dist/wirings/workflow/pikku-scenario-service.js +204 -43
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +7 -459
- package/dist/wirings/workflow/pikku-workflow-service.js +58 -551
- package/dist/wirings/workflow/run-timeline.d.ts +0 -47
- package/dist/wirings/workflow/run-timeline.js +0 -22
- package/dist/wirings/workflow/scenario-cookie-jar.d.ts +0 -23
- package/dist/wirings/workflow/scenario-cookie-jar.js +0 -16
- package/dist/wirings/workflow/scenario-poll.d.ts +0 -15
- package/dist/wirings/workflow/scenario-poll.js +0 -12
- package/dist/wirings/workflow/scenario-prose.d.ts +0 -28
- package/dist/wirings/workflow/scenario-prose.js +1 -19
- package/dist/wirings/workflow/scenario-step-guards.d.ts +0 -13
- package/dist/wirings/workflow/scenario-step-guards.js +1 -14
- package/dist/wirings/workflow/scenario-step.types.d.ts +84 -12
- package/dist/wirings/workflow/scenario-step.types.js +5 -1
- package/dist/wirings/workflow/scenario-surface.d.ts +16 -0
- package/dist/wirings/workflow/scenario-surface.js +56 -0
- package/dist/wirings/workflow/workflow-invocation-id.d.ts +0 -18
- package/dist/wirings/workflow/workflow-invocation-id.js +2 -22
- package/dist/wirings/workflow/workflow-queue-workers.d.ts +0 -20
- package/dist/wirings/workflow/workflow-queue-workers.js +0 -19
- package/dist/wirings/workflow/workflow.types.d.ts +5 -195
- package/knowledge/decisions/index.md +19 -0
- package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +49 -0
- package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-and-not-a-queued-job.md +48 -0
- package/knowledge/decisions/internals/actor-flow-conversations-seed-a-hidden-kickoff-message.md +23 -0
- package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md +24 -0
- package/knowledge/decisions/internals/actor-flow-verdicts-are-llm-self-evaluations.md +25 -0
- package/knowledge/decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md +26 -0
- package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +33 -0
- package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +28 -0
- package/knowledge/decisions/internals/ai-agent-agui-bridge-obeys-the-client-ordering-contract.md +29 -0
- package/knowledge/decisions/internals/ai-agent-audio-chunks-carry-the-format-the-provider-returned.md +20 -0
- package/knowledge/decisions/internals/ai-agent-credential-suspensions-hide-the-tool-result.md +26 -0
- package/knowledge/decisions/internals/ai-agent-delegate-and-supervise-hide-different-text.md +26 -0
- package/knowledge/decisions/internals/ai-agent-llm-tool-arguments-have-nulls-stripped.md +23 -0
- package/knowledge/decisions/internals/ai-agent-model-config-stays-a-single-resolution-seam.md +25 -0
- package/knowledge/decisions/internals/ai-agent-onerror-hooks-cannot-change-the-failure.md +22 -0
- package/knowledge/decisions/internals/ai-agent-runner-methods-must-keep-their-receiver.md +22 -0
- package/knowledge/decisions/internals/ai-agent-stream-persistence-is-best-effort.md +27 -0
- package/knowledge/decisions/internals/ai-agent-sub-agents-inherit-the-parent-context-block.md +26 -0
- package/knowledge/decisions/internals/ai-agent-tool-execute-failures-are-logged-unconditionally.md +25 -0
- package/knowledge/decisions/internals/ai-agent-voice-input-transcribes-audio-parts-in-place.md +22 -0
- package/knowledge/decisions/internals/ai-agent-working-memory-is-persisted-only-when-valid.md +25 -0
- package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +30 -0
- package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +31 -0
- package/knowledge/decisions/internals/channel-state-is-per-socket-session-state-is-per-user.md +29 -0
- package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +28 -0
- package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +27 -0
- package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +28 -0
- package/knowledge/decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md +34 -0
- package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +29 -0
- package/knowledge/decisions/internals/core-column-form-is-an-axis-of-its-own.md +84 -0
- package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +41 -0
- package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +44 -0
- package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +39 -0
- package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +42 -0
- package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +39 -0
- package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +43 -0
- package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +38 -0
- package/knowledge/decisions/internals/core-state-is-a-global-map-written-only-at-registration-time.md +44 -0
- package/knowledge/decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md +27 -0
- package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +32 -0
- package/knowledge/decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md +28 -0
- package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +31 -0
- package/knowledge/decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md +26 -0
- package/knowledge/decisions/internals/http-request-bodies-are-read-once-and-shared.md +32 -0
- package/knowledge/decisions/internals/http-route-groups-cascade-config-in-a-fixed-order.md +28 -0
- package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +30 -0
- package/knowledge/decisions/internals/http-runner-logs-through-a-trace-scoped-logger-functions-do-not.md +26 -0
- package/knowledge/decisions/internals/http-set-cookie-headers-are-appended-never-joined.md +28 -0
- package/knowledge/decisions/internals/http-sse-streams-flush-headers-only-after-middleware.md +32 -0
- package/knowledge/decisions/internals/http-wiring-without-metadata-is-skipped-not-fatal.md +26 -0
- package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +25 -0
- package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +26 -0
- package/knowledge/decisions/internals/index.md +117 -0
- package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +25 -0
- package/knowledge/decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md +26 -0
- package/knowledge/decisions/internals/node-only-builtins-are-imported-dynamically.md +24 -0
- package/knowledge/decisions/internals/one-project-shape-check-two-validators.md +53 -0
- package/knowledge/decisions/internals/queue-group-concurrency-keeps-one-shared-queue-fair.md +28 -0
- package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +27 -0
- package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +31 -0
- package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +32 -0
- package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +27 -0
- package/knowledge/decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md +26 -0
- package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +27 -0
- package/knowledge/decisions/internals/scenarios-live-in-files-named-for-them.md +48 -0
- package/knowledge/decisions/internals/scope-roots-may-be-co-declared-by-an-addon-and-its-host-app.md +30 -0
- package/knowledge/decisions/internals/serverless-channel-disconnect-must-tolerate-a-missing-channel.md +28 -0
- package/knowledge/decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md +30 -0
- package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +29 -0
- package/knowledge/decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md +27 -0
- package/knowledge/decisions/internals/the-kek-salt-is-scoped-to-the-key-version.md +40 -0
- package/knowledge/decisions/internals/the-schema-service-is-never-stubbed.md +26 -0
- package/knowledge/decisions/internals/trigger-declaration-is-split-from-trigger-source.md +33 -0
- package/knowledge/decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md +26 -0
- package/knowledge/decisions/internals/validate-checks-personas-through-a-shared-module.md +43 -0
- package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +26 -0
- package/knowledge/decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md +25 -0
- package/knowledge/decisions/internals/whether-a-run-is-inline-is-read-from-the-run-record.md +58 -0
- package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +34 -0
- package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +42 -0
- package/knowledge/decisions/internals/workflow-dsl-meta-separates-runtime-expressions-from-literals.md +38 -0
- package/knowledge/decisions/internals/workflow-features-resolve-scenarios-by-object-identity.md +29 -0
- package/knowledge/decisions/internals/workflow-graph-inline-and-queued-runs-share-one-planner.md +42 -0
- package/knowledge/decisions/internals/workflow-graph-node-notes-are-excluded-from-the-graph-hash.md +25 -0
- package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +29 -0
- package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +43 -0
- package/knowledge/decisions/internals/workflow-queued-step-dispatch-requires-an-explicit-opt-in.md +29 -0
- package/knowledge/decisions/internals/workflow-queues-are-per-workflow-by-default.md +42 -0
- package/knowledge/decisions/internals/workflow-repeated-step-names-get-an-ordinal-suffix.md +33 -0
- package/knowledge/decisions/internals/workflow-replay-reads-its-steps-once-and-caches-only-the-immutable-half.md +32 -0
- package/knowledge/decisions/internals/workflow-retries-are-owned-by-the-workflow-not-the-queue.md +31 -0
- package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +39 -0
- package/knowledge/decisions/internals/workflow-run-mirror-is-never-a-source-of-truth.md +29 -0
- package/knowledge/decisions/internals/workflow-run-polling-backs-off-to-the-callers-ceiling.md +33 -0
- package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +37 -0
- package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +50 -0
- package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +43 -0
- package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +32 -0
- package/knowledge/decisions/internals/workflow-scenario-quarantine-reason-lives-in-code.md +18 -0
- package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +34 -0
- package/knowledge/decisions/internals/workflow-step-compensation-runs-as-its-own-durable-step.md +26 -0
- package/knowledge/decisions/internals/workflow-step-dispatch-failure-is-transient-not-a-run-failure.md +33 -0
- package/knowledge/decisions/internals/workflow-step-lock-is-held-only-to-claim-the-step.md +27 -0
- package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +34 -0
- package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +38 -0
- package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +30 -0
- package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +26 -0
- package/knowledge/decisions/security/actor-flow-missing-approval-decisions-default-to-denied.md +22 -0
- package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +27 -0
- package/knowledge/decisions/security/actor-sign-in-only-works-for-actor-flagged-users.md +27 -0
- package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +43 -0
- package/knowledge/decisions/security/addon-config-gates-apply-only-at-the-namespaced-rpc-boundary.md +52 -0
- package/knowledge/decisions/security/addon-scopes-are-resolved-where-the-function-runs.md +46 -0
- package/knowledge/decisions/security/ai-agent-approval-forwarding-requires-a-symbol-brand.md +27 -0
- package/knowledge/decisions/security/ai-agent-credential-requests-are-symbol-branded.md +37 -0
- package/knowledge/decisions/security/ai-agent-gate-requires-a-session-only-when-auth-is-true.md +31 -0
- package/knowledge/decisions/security/ai-agent-ownership-failures-never-echo-the-resource.md +23 -0
- package/knowledge/decisions/security/ai-agent-resume-re-runs-the-authorization-gate.md +22 -0
- package/knowledge/decisions/security/ai-agent-sessionless-deployments-have-no-thread-ownership.md +39 -0
- package/knowledge/decisions/security/ai-agent-thread-ownership-composes-the-session-principal.md +30 -0
- package/knowledge/decisions/security/ai-agent-tool-filtering-reads-the-live-function-config.md +24 -0
- package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +30 -0
- package/knowledge/decisions/security/an-exposed-ungated-function-is-a-codegen-warning.md +49 -0
- package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +76 -0
- package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +39 -0
- package/knowledge/decisions/security/core-secrets-use-a-per-secret-dek-wrapped-by-a-kek.md +37 -0
- package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +31 -0
- package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +30 -0
- package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +40 -0
- package/knowledge/decisions/security/http-error-detail-is-withheld-from-clients-in-production.md +33 -0
- package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +46 -0
- package/knowledge/decisions/security/index.md +55 -0
- package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +27 -0
- package/knowledge/decisions/security/passphrases-are-stretched-key-material-is-expanded.md +40 -0
- package/knowledge/decisions/security/permission-auth-filtering-requires-live-permission-functions.md +31 -0
- package/knowledge/decisions/security/pikku-carries-actor-scopes-as-data-and-the-app-grants-them.md +26 -0
- package/knowledge/decisions/security/queue-job-identities-are-signed-at-enqueue.md +69 -0
- package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +39 -0
- package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +34 -0
- package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +49 -0
- package/knowledge/decisions/security/scenario-step-functions-are-never-externally-invocable.md +30 -0
- package/knowledge/decisions/security/scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md +28 -0
- package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +34 -0
- package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +37 -0
- package/knowledge/decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md +25 -0
- package/knowledge/decisions/security/workflow-actor-steps-always-use-the-real-transport.md +34 -0
- package/knowledge/decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md +40 -0
- package/knowledge/decisions/security/workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md +32 -0
- package/knowledge/decisions/security/workflow-scenario-sessions-are-isolated-per-actor-and-per-scenario.md +32 -0
- package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +31 -0
- package/knowledge/index.md +24 -0
- package/knowledge/questions/index.md +15 -0
- package/package.json +6 -2
- package/run-tests.sh +0 -0
- package/src/column-form.test.ts +97 -0
- package/src/column-form.ts +58 -0
- package/src/crypto-utils.test.ts +460 -19
- package/src/crypto-utils.ts +306 -59
- package/src/data-classification.ts +45 -7
- package/src/dev/hot-reload.test.ts +0 -4
- package/src/dev/hot-reload.ts +11 -30
- package/src/dev/module-runner.ts +7 -32
- package/src/dev/reload-meta.ts +9 -29
- package/src/errors/error-handler.ts +20 -35
- package/src/errors/error.test.ts +30 -1
- package/src/errors/errors.ts +73 -157
- package/src/function/abort-scope.test.ts +97 -0
- package/src/function/abort-scope.ts +80 -0
- package/src/function/function-runner.test.ts +0 -7
- package/src/function/function-runner.ts +62 -32
- package/src/function/functions.types.ts +95 -138
- package/src/function/index.ts +1 -0
- package/src/function/list.types.test.ts +3 -25
- package/src/function/list.types.ts +12 -62
- package/src/handle-error.ts +0 -18
- package/src/index.ts +84 -3
- package/src/middleware/auth-apikey.test.ts +0 -1
- package/src/middleware/auth-apikey.ts +0 -17
- package/src/middleware/auth-bearer.test.ts +3 -5
- package/src/middleware/auth-bearer.ts +5 -41
- package/src/middleware/auth-cookie.test.ts +0 -6
- package/src/middleware/auth-cookie.ts +2 -26
- package/src/middleware/cors.test.ts +34 -0
- package/src/middleware/cors.ts +12 -33
- package/src/middleware/remote-auth.test.ts +26 -10
- package/src/middleware/remote-auth.ts +11 -3
- package/src/middleware/telemetry.ts +2 -31
- package/src/middleware-runner.test.ts +0 -2
- package/src/middleware-runner.ts +5 -74
- package/src/permissions.test.ts +30 -0
- package/src/permissions.ts +24 -74
- package/src/pikku-request.ts +0 -6
- package/src/pikku-state.ts +2 -30
- package/src/production-barrels-stay-lean.test.ts +110 -0
- package/src/remote.test.ts +173 -0
- package/src/remote.ts +18 -8
- package/src/schema.ts +5 -39
- package/src/scopes.ts +7 -48
- package/src/secret-value.test.ts +204 -0
- package/src/secret-value.ts +111 -0
- package/src/services/ai-agent-runner-service.ts +20 -0
- package/src/services/ai-embedding-service.ts +3 -25
- package/src/services/audit-service.ts +88 -11
- package/src/services/content-service.ts +1 -46
- package/src/services/credential-service.ts +3 -40
- package/src/services/credential-wire-service.test.ts +0 -2
- package/src/services/credential-wire-service.ts +9 -1
- package/src/services/deployment-service.ts +3 -9
- package/src/services/email-service.ts +3 -1
- package/src/services/gateway-service.ts +0 -15
- package/src/services/{http-scenario-actors-converse.test.ts → http-personas-converse.test.ts} +38 -9
- package/src/services/{http-scenario-actors.test.ts → http-personas.test.ts} +39 -22
- package/src/services/{http-scenario-actors.ts → http-personas.ts} +85 -45
- package/src/services/in-memory-queue-service.ts +1 -15
- package/src/services/in-memory-trigger-service.ts +1 -18
- package/src/services/in-memory-workflow-service.test.ts +0 -13
- package/src/services/in-memory-workflow-service.ts +4 -38
- package/src/services/index.ts +23 -18
- package/src/services/istanbul-coverage-service.ts +2 -8
- package/src/services/jwt-service.ts +1 -16
- package/src/services/local-content-request-handler.test.ts +202 -0
- package/src/services/local-content-request-handler.ts +267 -0
- package/src/services/local-content.test.ts +159 -27
- package/src/services/local-content.ts +55 -23
- package/src/services/local-gateway-service.ts +2 -17
- package/src/services/local-secrets.test.ts +20 -5
- package/src/services/local-secrets.ts +15 -11
- package/src/services/logger-console.test.ts +0 -1
- package/src/services/logger-console.ts +3 -7
- package/src/services/logger.ts +31 -46
- package/src/services/meta-service.test.ts +1 -5
- package/src/services/meta-service.ts +41 -61
- package/src/services/{scenario-actors-service.ts → personas-service.ts} +48 -43
- package/src/services/pikku-user-id.ts +0 -4
- package/src/services/queue-webhook-service.test.ts +2 -1
- package/src/services/queue-webhook-service.ts +10 -42
- package/src/services/scheduler-service.ts +1 -50
- package/src/services/schema-service.ts +1 -24
- package/src/services/scope-service.ts +50 -34
- package/src/services/scoped-secret-service.ts +4 -7
- package/src/services/secret-host-binding.test.ts +138 -0
- package/src/services/secret-host-binding.ts +51 -0
- package/src/services/secret-service.ts +12 -35
- package/src/services/secretless.test.ts +54 -0
- package/src/services/secretless.ts +29 -0
- package/src/services/stub-tracker.ts +8 -18
- package/src/services/system-role-guard.test.ts +93 -0
- package/src/services/system-role-guard.ts +71 -0
- package/src/services/trigger-service.ts +0 -12
- package/src/services/typed-secret-service.ts +12 -14
- package/src/services/v8-coverage-service.ts +3 -6
- package/src/services/variables-service.ts +1 -8
- package/src/services/webhook-service.ts +23 -64
- package/src/services/workflow-service.ts +3 -20
- package/src/testing/service-tests.ts +6 -32
- package/src/time-utils.ts +1 -19
- package/src/types/core.types.ts +137 -229
- package/src/types/state.types.ts +7 -9
- package/src/utils/hmac.ts +4 -10
- package/src/utils/safe-fetch.ts +13 -54
- package/src/utils.test.ts +11 -2
- package/src/utils.ts +6 -15
- package/src/wirings/actor-flow/actor-flow.types.ts +1 -34
- package/src/wirings/actor-flow/index.ts +0 -9
- package/src/wirings/actor-flow/run-conversation.test.ts +11 -6
- package/src/wirings/actor-flow/run-conversation.ts +19 -12
- package/src/wirings/ai-agent/ai-agent-agui.test.ts +91 -10
- package/src/wirings/ai-agent/ai-agent-agui.ts +49 -17
- package/src/wirings/ai-agent/ai-agent-helpers.ts +20 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.test.ts +842 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.ts +399 -0
- package/src/wirings/ai-agent/ai-agent-memory.ts +0 -2
- package/src/wirings/ai-agent/ai-agent-model-config.ts +1 -9
- package/src/wirings/ai-agent/ai-agent-prepare.test.ts +202 -31
- package/src/wirings/ai-agent/ai-agent-prepare.ts +89 -139
- package/src/wirings/ai-agent/ai-agent-registry.test.ts +191 -6
- package/src/wirings/ai-agent/ai-agent-registry.ts +18 -1
- package/src/wirings/ai-agent/ai-agent-resume-authorization.test.ts +0 -2
- package/src/wirings/ai-agent/ai-agent-runner.test.ts +11 -9
- package/src/wirings/ai-agent/ai-agent-runner.ts +85 -35
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +205 -103
- package/src/wirings/ai-agent/ai-agent-stream.ts +224 -76
- package/src/wirings/ai-agent/ai-agent-thread-ownership.test.ts +301 -0
- package/src/wirings/ai-agent/ai-agent.types.ts +130 -5
- package/src/wirings/ai-agent/index.ts +37 -3
- package/src/wirings/ai-agent/voice-input.test.ts +137 -7
- package/src/wirings/ai-agent/voice-input.ts +96 -12
- package/src/wirings/ai-agent/voice-output.test.ts +512 -0
- package/src/wirings/ai-agent/voice-output.ts +243 -56
- package/src/wirings/channel/channel-common.ts +15 -20
- package/src/wirings/channel/channel-handler.test.ts +50 -0
- package/src/wirings/channel/channel-handler.ts +32 -11
- package/src/wirings/channel/channel-host-rpc.test.ts +150 -0
- package/src/wirings/channel/channel-host-rpc.ts +69 -0
- package/src/wirings/channel/channel-middleware-runner.test.ts +0 -1
- package/src/wirings/channel/channel-middleware-runner.ts +0 -12
- package/src/wirings/channel/channel-rpc-registry.ts +116 -0
- package/src/wirings/channel/channel-rpc-responder.ts +117 -0
- package/src/wirings/channel/channel-rpc-service.ts +146 -0
- package/src/wirings/channel/channel-rpc-validators.ts +65 -0
- package/src/wirings/channel/channel-rpc.test.ts +820 -0
- package/src/wirings/channel/channel-rpc.ts +5 -0
- package/src/wirings/channel/channel-rpc.types.ts +150 -0
- package/src/wirings/channel/channel-runner.ts +0 -14
- package/src/wirings/channel/channel-store.ts +0 -10
- package/src/wirings/channel/channel.types.ts +19 -8
- package/src/wirings/channel/define-channel-routes.ts +0 -20
- package/src/wirings/channel/eventhub-service.ts +0 -18
- package/src/wirings/channel/index.ts +35 -0
- package/src/wirings/channel/local/local-channel-handler.ts +3 -1
- package/src/wirings/channel/local/local-channel-runner.test.ts +0 -10
- package/src/wirings/channel/local/local-channel-runner.ts +3 -1
- package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -13
- package/src/wirings/channel/local/local-eventhub-service.ts +2 -37
- package/src/wirings/channel/log-channels.ts +0 -4
- package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +83 -2
- package/src/wirings/channel/pikku-abstract-channel-handler.ts +7 -0
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +2 -5
- package/src/wirings/cli/channel/cli-approval.test.ts +177 -0
- package/src/wirings/cli/channel/cli-approval.ts +135 -0
- package/src/wirings/cli/channel/cli-channel-runner.ts +4 -26
- package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +169 -0
- package/src/wirings/cli/channel/cli-raw-channel-runner.ts +59 -16
- package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +480 -0
- package/src/wirings/cli/channel/cli-raw-client-runner.ts +185 -0
- package/src/wirings/cli/channel/index.ts +13 -0
- package/src/wirings/cli/cli-runner.test.ts +0 -1
- package/src/wirings/cli/cli-runner.ts +46 -88
- package/src/wirings/cli/cli.types.ts +14 -3
- package/src/wirings/cli/command-parser.test.ts +0 -4
- package/src/wirings/cli/command-parser.ts +11 -91
- package/src/wirings/cli/define-cli-commands.ts +1 -17
- package/src/wirings/credential/credential.types.ts +0 -12
- package/src/wirings/credential/{wire-credential.ts → define-credential.ts} +7 -7
- package/src/wirings/credential/index.ts +1 -1
- package/src/wirings/credential/validate-credential-definitions.ts +2 -4
- package/src/wirings/gateway/gateway-runner.test.ts +1 -21
- package/src/wirings/gateway/gateway-runner.ts +8 -110
- package/src/wirings/gateway/gateway.types.ts +7 -80
- package/src/wirings/http/http-routes.test.ts +0 -3
- package/src/wirings/http/http-routes.ts +0 -86
- package/src/wirings/http/http-runner.test.ts +0 -1
- package/src/wirings/http/http-runner.ts +8 -167
- package/src/wirings/http/http.types.ts +15 -62
- package/src/wirings/http/log-http-routes.ts +0 -4
- package/src/wirings/http/pikku-fetch-http-request.test.ts +2 -10
- package/src/wirings/http/pikku-fetch-http-request.ts +0 -58
- package/src/wirings/http/pikku-fetch-http-response.test.ts +1 -1
- package/src/wirings/http/pikku-fetch-http-response.ts +0 -3
- package/src/wirings/http/routers/path-to-regex.test.ts +4 -17
- package/src/wirings/http/routers/path-to-regex.ts +2 -13
- package/src/wirings/http/web-request.test.ts +33 -2
- package/src/wirings/http/web-request.ts +30 -17
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -1
- package/src/wirings/mcp/mcp-runner.ts +2 -17
- package/src/wirings/mcp/mcp.types.ts +7 -42
- package/src/wirings/oauth2/oauth2.types.ts +0 -30
- package/src/wirings/persona/define-personas.ts +33 -0
- package/src/wirings/persona/index.ts +62 -0
- package/src/wirings/persona/persona-email.ts +87 -0
- package/src/wirings/persona/persona-environments.test.ts +183 -0
- package/src/wirings/persona/persona-environments.ts +138 -0
- package/src/wirings/persona/persona-mailbox.ts +156 -0
- package/src/wirings/persona/persona.test.ts +220 -0
- package/src/wirings/persona/persona.types.ts +142 -0
- package/src/wirings/persona/validate-personas.ts +133 -0
- package/src/wirings/queue/index.ts +13 -3
- package/src/wirings/queue/queue-identity.test.ts +454 -0
- package/src/wirings/queue/queue-identity.ts +176 -0
- package/src/wirings/queue/queue-runner.ts +12 -31
- package/src/wirings/queue/queue.types.ts +25 -90
- package/src/wirings/queue/register-queue-helper.ts +0 -14
- package/src/wirings/queue/signed-queue-service.ts +60 -0
- package/src/wirings/queue/validate-worker-config.ts +2 -28
- package/src/wirings/role/define-system-role.ts +33 -0
- package/src/wirings/role/index.ts +13 -0
- package/src/wirings/role/role.test.ts +104 -0
- package/src/wirings/role/role.types.ts +47 -0
- package/src/wirings/role/validate-role-definitions.ts +93 -0
- package/src/wirings/rpc/addon-auth-tags.test.ts +223 -0
- package/src/wirings/rpc/addon-runner.ts +0 -56
- package/src/wirings/rpc/addon-scopes.test.ts +225 -0
- package/src/wirings/rpc/remote-addon-auth.ts +9 -16
- package/src/wirings/rpc/rpc-runner.test.ts +192 -6
- package/src/wirings/rpc/rpc-runner.ts +145 -127
- package/src/wirings/rpc/rpc-types.ts +11 -6
- package/src/wirings/rpc/wire-addon.test.ts +43 -1
- package/src/wirings/rpc/wire-addon.ts +99 -0
- package/src/wirings/rpc/wire-remote-addon.ts +9 -29
- package/src/wirings/scheduler/log-schedulers.ts +0 -4
- package/src/wirings/scheduler/scheduler-runner.test.ts +1 -8
- package/src/wirings/scheduler/scheduler-runner.ts +0 -2
- package/src/wirings/scheduler/scheduler.types.ts +1 -14
- package/src/wirings/scope/{wire-scope.ts → define-scope.ts} +5 -6
- package/src/wirings/scope/index.ts +1 -1
- package/src/wirings/scope/scope.test.ts +1 -2
- package/src/wirings/scope/scope.types.ts +7 -9
- package/src/wirings/scope/validate-scope-definitions.ts +3 -21
- package/src/wirings/secret/index.ts +1 -1
- package/src/wirings/secret/secret.types.ts +19 -15
- package/src/wirings/secret/validate-secret-definitions.ts +2 -4
- package/src/wirings/trigger/trigger-runner.ts +1 -27
- package/src/wirings/trigger/trigger.types.ts +1 -82
- package/src/wirings/variable/index.ts +1 -1
- package/src/wirings/variable/validate-variable-definitions.ts +2 -4
- package/src/wirings/variable/variable.types.ts +1 -13
- package/src/wirings/virtual-user/index.ts +88 -0
- package/src/wirings/virtual-user/prepare-virtual-user-run.test.ts +115 -0
- package/src/wirings/virtual-user/prepare-virtual-user-run.ts +95 -0
- package/src/wirings/virtual-user/run-virtual-user.test.ts +765 -0
- package/src/wirings/virtual-user/run-virtual-user.ts +671 -0
- package/src/wirings/virtual-user/virtual-user-agents.test.ts +65 -0
- package/src/wirings/virtual-user/virtual-user-agents.ts +57 -0
- package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +215 -0
- package/src/wirings/virtual-user/virtual-user-catalogue.ts +184 -0
- package/src/wirings/virtual-user/virtual-user-derive.test.ts +398 -0
- package/src/wirings/virtual-user/virtual-user-derive.ts +173 -0
- package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +63 -0
- package/src/wirings/virtual-user/virtual-user-dispositions.ts +213 -0
- package/src/wirings/virtual-user/virtual-user-intents.test.ts +208 -0
- package/src/wirings/virtual-user/virtual-user-intents.ts +185 -0
- package/src/wirings/virtual-user/virtual-user-rng.test.ts +72 -0
- package/src/wirings/virtual-user/virtual-user-rng.ts +50 -0
- package/src/wirings/virtual-user/virtual-user-run-store.ts +98 -0
- package/src/wirings/virtual-user/virtual-user-target.ts +47 -0
- package/src/wirings/virtual-user/virtual-user.types.ts +219 -0
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +19 -20
- package/src/wirings/workflow/dsl/workflow-runner.ts +0 -4
- package/src/wirings/workflow/feature.ts +0 -19
- package/src/wirings/workflow/graph/graph-node.ts +0 -136
- package/src/wirings/workflow/graph/graph-runner.test.ts +20 -19
- package/src/wirings/workflow/graph/graph-runner.ts +6 -41
- package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -4
- package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -58
- package/src/wirings/workflow/index.ts +10 -44
- package/src/wirings/workflow/pikku-scenario-service.ts +235 -61
- package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -39
- package/src/wirings/workflow/pikku-workflow-service.ts +77 -674
- package/src/wirings/workflow/run-timeline.test.ts +7 -19
- package/src/wirings/workflow/run-timeline.ts +0 -56
- package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -1
- package/src/wirings/workflow/scenario-cookie-jar.ts +0 -25
- package/src/wirings/workflow/scenario-expectations.test.ts +2 -7
- package/src/wirings/workflow/scenario-hooks.test.ts +2 -7
- package/src/wirings/workflow/scenario-poll.test.ts +0 -2
- package/src/wirings/workflow/scenario-poll.ts +0 -15
- package/src/wirings/workflow/scenario-prose.test.ts +5 -7
- package/src/wirings/workflow/scenario-prose.ts +1 -29
- package/src/wirings/workflow/scenario-service.test.ts +2 -10
- package/src/wirings/workflow/scenario-step-guards.ts +1 -14
- package/src/wirings/workflow/scenario-step.test.ts +163 -19
- package/src/wirings/workflow/scenario-step.types.ts +94 -12
- package/src/wirings/workflow/scenario-surface.test.ts +146 -0
- package/src/wirings/workflow/scenario-surface.ts +71 -0
- package/src/wirings/workflow/workflow-dispatch-durability.test.ts +14 -15
- package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -4
- package/src/wirings/workflow/workflow-inline-authority.test.ts +169 -0
- package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -2
- package/src/wirings/workflow/workflow-invocation-id.ts +2 -22
- package/src/wirings/workflow/workflow-mirror.test.ts +0 -7
- package/src/wirings/workflow/workflow-on-error.test.ts +0 -9
- package/src/wirings/workflow/workflow-queue-workers.ts +0 -21
- package/src/wirings/workflow/workflow-replay-snapshot.test.ts +8 -7
- package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -5
- package/src/wirings/workflow/workflow-run-context.test.ts +5 -10
- package/src/wirings/workflow/workflow-run-polling.test.ts +0 -5
- package/src/wirings/workflow/workflow-step-ordinal.test.ts +19 -4
- package/src/wirings/workflow/workflow-step-session.test.ts +0 -7
- package/src/wirings/workflow/workflow.types.ts +5 -201
- package/tsconfig.tsbuildinfo +1 -1
- package/tsconfig.type-tests.json +12 -0
- package/src/middleware/timeout.ts +0 -22
- package/src/pikku-response.ts +0 -5
- package/src/wirings/mcp/mcp-endpoint-registry.test.d.ts +0 -1
- package/src/wirings/workflow/dsl/index.ts +0 -36
- package/src/wirings/workflow/graph/index.ts +0 -15
|
@@ -1,17 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Queue worker functions for workflow orchestration.
|
|
3
|
-
*
|
|
4
|
-
* These are registered as queue consumers by the codegen pipeline
|
|
5
|
-
* (injected into queue meta when workflows exist). They provide
|
|
6
|
-
* the runtime implementations that process queued workflow jobs.
|
|
7
|
-
*/
|
|
8
1
|
import type { PikkuRPC } from '../rpc/rpc-types.js';
|
|
9
2
|
export interface WorkflowStepInput {
|
|
10
3
|
runId: string;
|
|
11
4
|
stepName: string;
|
|
12
5
|
rpcName: string;
|
|
13
6
|
data: unknown;
|
|
14
|
-
/** Predecessor step name (the walked transition); undefined for entry steps. */
|
|
15
7
|
fromStepName?: string;
|
|
16
8
|
}
|
|
17
9
|
export interface PikkuWorkflowOrchestratorInput {
|
|
@@ -21,22 +13,10 @@ export interface PikkuWorkflowSleeperInput {
|
|
|
21
13
|
runId: string;
|
|
22
14
|
stepId: string;
|
|
23
15
|
}
|
|
24
|
-
/**
|
|
25
|
-
* Step worker — executes individual workflow steps dispatched via queue.
|
|
26
|
-
* The orchestrator queues steps here when they're async (not inline).
|
|
27
|
-
*/
|
|
28
16
|
export declare function pikkuWorkflowWorkerFunc(_services: Record<string, unknown>, { runId, stepName, rpcName, data }: WorkflowStepInput, { rpc }: {
|
|
29
17
|
rpc: PikkuRPC;
|
|
30
18
|
}): Promise<void>;
|
|
31
|
-
/**
|
|
32
|
-
* Orchestrator — resumes workflow execution after an async step completes.
|
|
33
|
-
* Called when a step worker finishes and the workflow needs to continue.
|
|
34
|
-
*/
|
|
35
19
|
export declare function pikkuWorkflowOrchestratorFunc(_services: Record<string, unknown>, { runId }: PikkuWorkflowOrchestratorInput, { rpc }: {
|
|
36
20
|
rpc: PikkuRPC;
|
|
37
21
|
}): Promise<void>;
|
|
38
|
-
/**
|
|
39
|
-
* Sleeper — wakes a workflow after a workflow.sleep() duration expires.
|
|
40
|
-
* Triggered by a delayed queue message or scheduler callback.
|
|
41
|
-
*/
|
|
42
22
|
export declare function pikkuWorkflowSleeperFunc(_services: Record<string, unknown>, { runId, stepId }: PikkuWorkflowSleeperInput): Promise<void>;
|
|
@@ -1,15 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Queue worker functions for workflow orchestration.
|
|
3
|
-
*
|
|
4
|
-
* These are registered as queue consumers by the codegen pipeline
|
|
5
|
-
* (injected into queue meta when workflows exist). They provide
|
|
6
|
-
* the runtime implementations that process queued workflow jobs.
|
|
7
|
-
*/
|
|
8
1
|
import { getSingletonServices } from '../../pikku-state.js';
|
|
9
|
-
/**
|
|
10
|
-
* Step worker — executes individual workflow steps dispatched via queue.
|
|
11
|
-
* The orchestrator queues steps here when they're async (not inline).
|
|
12
|
-
*/
|
|
13
2
|
export async function pikkuWorkflowWorkerFunc(_services, { runId, stepName, rpcName, data }, { rpc }) {
|
|
14
3
|
const services = getSingletonServices();
|
|
15
4
|
if (!services?.workflowService) {
|
|
@@ -17,10 +6,6 @@ export async function pikkuWorkflowWorkerFunc(_services, { runId, stepName, rpcN
|
|
|
17
6
|
}
|
|
18
7
|
await services.workflowService.executeWorkflowStep(runId, stepName, rpcName, data, rpc);
|
|
19
8
|
}
|
|
20
|
-
/**
|
|
21
|
-
* Orchestrator — resumes workflow execution after an async step completes.
|
|
22
|
-
* Called when a step worker finishes and the workflow needs to continue.
|
|
23
|
-
*/
|
|
24
9
|
export async function pikkuWorkflowOrchestratorFunc(_services, { runId }, { rpc }) {
|
|
25
10
|
const services = getSingletonServices();
|
|
26
11
|
if (!services?.workflowService) {
|
|
@@ -28,10 +13,6 @@ export async function pikkuWorkflowOrchestratorFunc(_services, { runId }, { rpc
|
|
|
28
13
|
}
|
|
29
14
|
await services.workflowService.orchestrateWorkflow(runId, rpc);
|
|
30
15
|
}
|
|
31
|
-
/**
|
|
32
|
-
* Sleeper — wakes a workflow after a workflow.sleep() duration expires.
|
|
33
|
-
* Triggered by a delayed queue message or scheduler callback.
|
|
34
|
-
*/
|
|
35
16
|
export async function pikkuWorkflowSleeperFunc(_services, { runId, stepId }) {
|
|
36
17
|
const services = getSingletonServices();
|
|
37
18
|
if (!services?.workflowService) {
|
|
@@ -10,7 +10,6 @@ export interface WorkflowRunWire {
|
|
|
10
10
|
id?: string;
|
|
11
11
|
parentRunId?: string;
|
|
12
12
|
parentStepId?: string;
|
|
13
|
-
/** Pikku user ID propagated from the originating request for credential resolution */
|
|
14
13
|
pikkuUserId?: string;
|
|
15
14
|
}
|
|
16
15
|
export interface WorkflowServiceConfig {
|
|
@@ -20,126 +19,48 @@ export interface WorkflowServiceConfig {
|
|
|
20
19
|
stepWorkerQueueName: string;
|
|
21
20
|
sleeperRPCName: string;
|
|
22
21
|
}
|
|
23
|
-
/**
|
|
24
|
-
* How a workflow service spreads its jobs across queues.
|
|
25
|
-
*
|
|
26
|
-
* Passed to the service constructor rather than read from `config.workflow`:
|
|
27
|
-
* the queues are wired during construction, before singleton services (and so
|
|
28
|
-
* before `config`) exist.
|
|
29
|
-
*/
|
|
30
22
|
export interface WorkflowQueueOptions {
|
|
31
|
-
/**
|
|
32
|
-
* - `'per-workflow'` (default) — each workflow gets its own
|
|
33
|
-
* `wf-orchestrator-*` / `wf-step-*` queue. Complete isolation, and it's
|
|
34
|
-
* what lets serverless providers deploy one unit per workflow. Costs one
|
|
35
|
-
* set of pollers per queue, which adds up on pull-based backends.
|
|
36
|
-
* - `'shared-groups'` — every workflow shares the orchestrator/step-worker
|
|
37
|
-
* queues and stays isolated via {@link queueGroupConcurrency}, so no
|
|
38
|
-
* workflow can occupy more than its share. One set of pollers total.
|
|
39
|
-
* Only for single-process (monolith) runtimes; a per-unit serverless
|
|
40
|
-
* deploy needs the per-workflow queues to route to its units.
|
|
41
|
-
*/
|
|
42
23
|
queueStrategy?: 'per-workflow' | 'shared-groups';
|
|
43
|
-
/**
|
|
44
|
-
* Total concurrent workflow jobs per node under `'shared-groups'`.
|
|
45
|
-
* Defaults to 20.
|
|
46
|
-
*/
|
|
47
24
|
queueConcurrency?: number;
|
|
48
|
-
/**
|
|
49
|
-
* How many jobs of one workflow may run at once under `'shared-groups'`.
|
|
50
|
-
* Defaults to 2. Tiers are keyed by workflow name, so a specific workflow
|
|
51
|
-
* can be given its own limit without any extra wiring.
|
|
52
|
-
*
|
|
53
|
-
* Note tiers can only lower a workflow's limit, not raise it above
|
|
54
|
-
* `default`: the backend's pre-fetch exclusion is applied per group using
|
|
55
|
-
* `default` alone. To give one workflow more room, raise `default` and
|
|
56
|
-
* restrict the others by tier.
|
|
57
|
-
*/
|
|
58
25
|
queueGroupConcurrency?: number | GroupConcurrencyConfig;
|
|
59
26
|
}
|
|
60
27
|
export interface WorkflowPlannedStep {
|
|
61
|
-
/** Durable step key — matches the runtime step name stored in the DB */
|
|
62
28
|
stepName: string;
|
|
63
|
-
/** Optional human-readable label for the UI timeline (falls back to stepName) */
|
|
64
29
|
displayName?: string;
|
|
65
30
|
}
|
|
66
|
-
/**
|
|
67
|
-
* Workflow run status
|
|
68
|
-
*/
|
|
69
31
|
export type WorkflowStatus = 'running' | 'suspended' | 'completed' | 'failed' | 'cancelled';
|
|
70
|
-
/**
|
|
71
|
-
* Workflow version status (for AI-generated workflows)
|
|
72
|
-
*/
|
|
73
32
|
export type WorkflowVersionStatus = 'draft' | 'active' | 'declined';
|
|
74
|
-
/**
|
|
75
|
-
* Workflow step status
|
|
76
|
-
*/
|
|
77
33
|
export type StepStatus = 'pending' | 'running' | 'scheduled' | 'succeeded' | 'failed' | 'suspended';
|
|
78
|
-
/**
|
|
79
|
-
* Workflow run representation
|
|
80
|
-
*/
|
|
81
34
|
export interface WorkflowRun {
|
|
82
|
-
/** Unique run ID */
|
|
83
35
|
id: string;
|
|
84
|
-
/** Workflow name */
|
|
85
36
|
workflow: string;
|
|
86
|
-
/** Current status */
|
|
87
37
|
status: WorkflowStatus;
|
|
88
|
-
/** Input data */
|
|
89
38
|
input: any;
|
|
90
|
-
/** Output data (if completed) */
|
|
91
39
|
output?: any;
|
|
92
|
-
/** Error (if failed) */
|
|
93
40
|
error?: SerializedError;
|
|
94
|
-
/** If true, workflow executes inline without queues */
|
|
95
41
|
inline?: boolean;
|
|
96
|
-
/** Graph hash of the workflow definition at run creation time */
|
|
97
42
|
graphHash?: string;
|
|
98
|
-
/** True when the workflow has a static, pre-computable step timeline */
|
|
99
43
|
deterministic?: boolean;
|
|
100
|
-
/** Static planned steps snapshot captured at run start */
|
|
101
44
|
plannedSteps?: WorkflowPlannedStep[];
|
|
102
|
-
/** Wire origin info (how this run was started) */
|
|
103
45
|
wire: WorkflowRunWire;
|
|
104
|
-
/** Creation timestamp */
|
|
105
46
|
createdAt: Date;
|
|
106
|
-
/** Last update timestamp */
|
|
107
47
|
updatedAt: Date;
|
|
108
48
|
}
|
|
109
|
-
/**
|
|
110
|
-
* Step state representation
|
|
111
|
-
*/
|
|
112
49
|
export interface StepState {
|
|
113
|
-
/** Unique step ID */
|
|
114
50
|
stepId: string;
|
|
115
|
-
/** Step status */
|
|
116
51
|
status: StepStatus;
|
|
117
|
-
/** Step result (if done) */
|
|
118
52
|
result?: any;
|
|
119
|
-
/** Step error (if error) */
|
|
120
53
|
error?: SerializedError;
|
|
121
|
-
/** Number of attempts made (starts at 1) */
|
|
122
54
|
attemptCount: number;
|
|
123
|
-
/** Maximum retry attempts allowed */
|
|
124
55
|
retries?: number;
|
|
125
|
-
/** Delay between retries */
|
|
126
56
|
retryDelay?: string | number;
|
|
127
|
-
/** Step name of the predecessor that scheduled this step (the transition/edge
|
|
128
|
-
* walked to reach it); undefined for entry steps. Reconstructs the path. */
|
|
129
57
|
fromStepName?: string;
|
|
130
|
-
/** Creation timestamp */
|
|
131
58
|
createdAt: Date;
|
|
132
|
-
/** Last update timestamp */
|
|
133
59
|
updatedAt: Date;
|
|
134
|
-
/** Child workflow run ID (if this step spawned a sub-workflow) */
|
|
135
60
|
childRunId?: string;
|
|
136
|
-
/** Timestamp when step started running */
|
|
137
61
|
runningAt?: Date;
|
|
138
|
-
/** Timestamp when step was scheduled */
|
|
139
62
|
scheduledAt?: Date;
|
|
140
|
-
/** Timestamp when step succeeded */
|
|
141
63
|
succeededAt?: Date;
|
|
142
|
-
/** Timestamp when step failed */
|
|
143
64
|
failedAt?: Date;
|
|
144
65
|
}
|
|
145
66
|
export interface WorkflowRunStatus {
|
|
@@ -153,7 +74,6 @@ export interface WorkflowRunStatus {
|
|
|
153
74
|
name: string;
|
|
154
75
|
status: StepStatus;
|
|
155
76
|
duration?: number;
|
|
156
|
-
/** Number of attempts for this step (1 = first try; > 1 means it retried). */
|
|
157
77
|
attempts?: number;
|
|
158
78
|
}>;
|
|
159
79
|
output?: unknown;
|
|
@@ -184,16 +104,6 @@ export interface WorkflowRunService {
|
|
|
184
104
|
} | null>;
|
|
185
105
|
deleteRun(id: string): Promise<boolean>;
|
|
186
106
|
}
|
|
187
|
-
/**
|
|
188
|
-
* Write-only companion to `WorkflowRunService`. An executor (a
|
|
189
|
-
* `PikkuWorkflowService` subclass) can be given a mirror; every write
|
|
190
|
-
* the executor makes to its own canonical store is then forwarded here,
|
|
191
|
-
* so an external read store (e.g. a DB queried by the console UI) stays
|
|
192
|
-
* in sync with DO/Redis/etc-driven runs.
|
|
193
|
-
*
|
|
194
|
-
* Mirror failures are logged but never fail the workflow — the mirror is
|
|
195
|
-
* an index, not the source of truth.
|
|
196
|
-
*/
|
|
197
107
|
export interface WorkflowRunMirror {
|
|
198
108
|
createRun(runId: string, workflowName: string, input: any, inline: boolean, graphHash: string, wire: WorkflowRunWire, options?: {
|
|
199
109
|
deterministic?: boolean;
|
|
@@ -218,187 +128,87 @@ export interface WorkflowRunMirror {
|
|
|
218
128
|
upsertWorkflowVersion(name: string, graphHash: string, graph: any, source: string, status?: WorkflowVersionStatus): Promise<void>;
|
|
219
129
|
updateWorkflowVersionStatus(name: string, graphHash: string, status: WorkflowVersionStatus): Promise<void>;
|
|
220
130
|
}
|
|
221
|
-
/**
|
|
222
|
-
* Core workflow definition
|
|
223
|
-
*/
|
|
224
131
|
export type CoreWorkflow<PikkuFunctionConfig extends CorePikkuFunctionConfig<any, any, any> = CorePikkuFunctionConfig<any, any, any>> = {
|
|
225
|
-
/** Unique workflow name */
|
|
226
132
|
name: string;
|
|
227
|
-
/** The workflow function */
|
|
228
133
|
func: PikkuFunctionConfig;
|
|
229
|
-
/** Middleware chain for this workflow */
|
|
230
134
|
middleware?: PikkuFunctionConfig['middleware'];
|
|
231
|
-
/** Tags for organization and filtering */
|
|
232
135
|
tags?: string[];
|
|
233
136
|
};
|
|
234
|
-
/**
|
|
235
|
-
* A scenario as a feature references it: either the scenario itself, or the
|
|
236
|
-
* scenario paired with the input to run it with. The paired form is gherkin's
|
|
237
|
-
* `Examples:` — the same scenario run once per row, written as an ordinary
|
|
238
|
-
* loop rather than a table.
|
|
239
|
-
*/
|
|
240
137
|
export type CoreFeatureScenario = CorePikkuFunctionConfig<any, any, any> | {
|
|
241
138
|
scenario: CorePikkuFunctionConfig<any, any, any>;
|
|
242
139
|
data: unknown;
|
|
243
140
|
};
|
|
244
|
-
/**
|
|
245
|
-
* A feature: an ordered group of scenarios, mirroring gherkin's Feature ↔
|
|
246
|
-
* Scenario structure. Scenarios are referenced by imported identifier, so a
|
|
247
|
-
* renamed or deleted scenario is a compile error rather than a silent skip.
|
|
248
|
-
*
|
|
249
|
-
* Hooks run **once around the whole group** (`before → a → b → c → after`),
|
|
250
|
-
* not per scenario — per-scenario setup is the scenario's own `before`. That
|
|
251
|
-
* is the one thing a feature deliberately cannot express: gherkin's
|
|
252
|
-
* `Background:` runs per scenario.
|
|
253
|
-
*/
|
|
254
141
|
export type CoreFeature = {
|
|
255
|
-
/** Human-readable name. The export identifier is the id. */
|
|
256
142
|
name: string;
|
|
257
143
|
description?: string;
|
|
258
144
|
tags?: string[];
|
|
259
|
-
/** Readonly because `pikkuFeature`'s `const` generic infers a readonly tuple. */
|
|
260
145
|
scenarios: readonly CoreFeatureScenario[];
|
|
261
146
|
before?: CorePikkuFunctionHook;
|
|
262
147
|
after?: CorePikkuFunctionHook;
|
|
263
148
|
};
|
|
264
|
-
/** One entry of a feature's scenario list, as extracted from the source. */
|
|
265
149
|
export type FeatureMetaEntry = {
|
|
266
|
-
/** The scenario's declared export name — its key in `WorkflowsMeta`. */
|
|
267
150
|
scenario: string;
|
|
268
|
-
/** The input this entry runs the scenario with — gherkin's `Examples:`. */
|
|
269
151
|
data?: unknown;
|
|
270
152
|
};
|
|
271
|
-
/**
|
|
272
|
-
* A feature as the console reads it: the document structure around a group of
|
|
273
|
-
* scenarios. Generated to `scenarios/features.gen.json` and read off disk, so
|
|
274
|
-
* nothing app-facing has to import the scenario bootstrap to describe one.
|
|
275
|
-
*/
|
|
276
153
|
export type FeatureMeta = {
|
|
277
|
-
/** The export identifier. */
|
|
278
154
|
id: string;
|
|
279
155
|
name: string;
|
|
280
156
|
description?: string;
|
|
281
157
|
tags: string[];
|
|
282
|
-
/** In declared order — a feature's reading order is its declaration order. */
|
|
283
158
|
entries: FeatureMetaEntry[];
|
|
284
|
-
/**
|
|
285
|
-
* Entries that could not be read statically (a spread, a `.map()`). Their
|
|
286
|
-
* membership is only known once the scenario bootstrap has been evaluated,
|
|
287
|
-
* so a non-zero count means this listing is partial.
|
|
288
|
-
*/
|
|
289
159
|
unresolvedEntries: number;
|
|
290
|
-
/** Hooks are runtime-only; only their presence is knowable from meta. */
|
|
291
160
|
hasBefore: boolean;
|
|
292
161
|
hasAfter: boolean;
|
|
293
162
|
};
|
|
294
163
|
export type FeaturesMeta = Record<string, FeatureMeta>;
|
|
295
|
-
/** One planned scenario run, resolved from a feature's scenario list. */
|
|
296
164
|
export type FeaturePlanEntry = {
|
|
297
165
|
featureId: string;
|
|
298
166
|
featureName: string;
|
|
299
167
|
scenarioName: string;
|
|
300
|
-
/** The input this entry runs the scenario with, if the feature supplied one. */
|
|
301
168
|
data?: unknown;
|
|
302
|
-
/** The scenario's own tags unioned with the containing feature's. */
|
|
303
169
|
tags: string[];
|
|
304
170
|
};
|
|
305
|
-
/**
|
|
306
|
-
* Workflow client interface
|
|
307
|
-
*/
|
|
308
171
|
export interface PikkuWorkflow {
|
|
309
|
-
/** Start a new workflow run */
|
|
310
172
|
start: <I>(input: I) => Promise<{
|
|
311
173
|
runId: string;
|
|
312
174
|
}>;
|
|
313
|
-
/** Get a workflow run by ID */
|
|
314
175
|
getRun: (runId: string) => Promise<WorkflowRun>;
|
|
315
|
-
/** Cancel a running workflow */
|
|
316
176
|
cancelRun: (runId: string) => Promise<void>;
|
|
317
177
|
}
|
|
318
|
-
/**
|
|
319
|
-
* Context variable definition (serialized from Zod schema or type inference)
|
|
320
|
-
*/
|
|
321
178
|
export interface ContextVariable {
|
|
322
|
-
/** Variable type */
|
|
323
179
|
type: 'string' | 'number' | 'boolean' | 'object' | 'array';
|
|
324
|
-
/** Default value */
|
|
325
180
|
default?: unknown;
|
|
326
|
-
/** Description for UI/docs */
|
|
327
181
|
description?: string;
|
|
328
182
|
}
|
|
329
|
-
/**
|
|
330
|
-
* Workflow context - state variables with defaults and types
|
|
331
|
-
*/
|
|
332
183
|
export type WorkflowContext = Record<string, ContextVariable>;
|
|
333
|
-
/**
|
|
334
|
-
* Workflows metadata for inspector/CLI (DSL step-based format)
|
|
335
|
-
*/
|
|
336
184
|
export type WorkflowsMeta = Record<string, CommonWireMeta & {
|
|
337
185
|
name: string;
|
|
338
186
|
steps: WorkflowStepMeta[];
|
|
339
187
|
context?: WorkflowContext;
|
|
340
188
|
dsl?: boolean;
|
|
341
189
|
expose?: boolean;
|
|
342
|
-
/** True for pikkuScenario workflows (complex + actor steps). */
|
|
343
190
|
scenario?: boolean;
|
|
344
191
|
/**
|
|
345
|
-
*
|
|
346
|
-
*
|
|
347
|
-
*
|
|
348
|
-
*
|
|
192
|
+
* The flow asserts through an expectation helper — `expectService`,
|
|
193
|
+
* `expectError`, `expectEventually` — rather than a `then` step. Those are
|
|
194
|
+
* inline steps and carry no phase, so without this PKU680 reads a scenario
|
|
195
|
+
* whose only witness is a recorded service call as asserting nothing.
|
|
349
196
|
*/
|
|
197
|
+
asserts?: boolean;
|
|
350
198
|
skip?: string;
|
|
351
|
-
/** Actor names a scenario declares (personas it runs steps as). */
|
|
352
199
|
actors?: string[];
|
|
353
200
|
}>;
|
|
354
|
-
/**
|
|
355
|
-
* Unified workflow runtime meta (used by runtime to execute workflows)
|
|
356
|
-
* This is the format stored in pikkuState('workflows', 'meta')
|
|
357
|
-
* Both DSL and graph-based workflows are converted to this format
|
|
358
|
-
*/
|
|
359
201
|
export interface WorkflowRuntimeMeta {
|
|
360
|
-
/** Workflow name (used as key in registrations) */
|
|
361
202
|
name: string;
|
|
362
|
-
/** Pikku function name (for execution) */
|
|
363
203
|
pikkuFuncId: string;
|
|
364
|
-
/** Source type: 'dsl' (serializable), 'complex' (has inline steps), 'graph', 'scenario' (complex + actor steps) */
|
|
365
204
|
source: 'dsl' | 'complex' | 'graph' | 'scenario';
|
|
366
|
-
/** Optional description */
|
|
367
205
|
description?: string;
|
|
368
|
-
/** Tags for organization */
|
|
369
206
|
tags?: string[];
|
|
370
|
-
/** Actor names a scenario declares (personas it runs steps as). */
|
|
371
207
|
actors?: string[];
|
|
372
|
-
/** Serialized nodes */
|
|
373
208
|
nodes?: Record<string, any>;
|
|
374
|
-
/** Entry node IDs for graph workflows (computed at build time) */
|
|
375
209
|
entryNodeIds?: string[];
|
|
376
|
-
/** Hash of graph topology (nodes, edges, input mappings) */
|
|
377
210
|
graphHash?: string;
|
|
378
|
-
/** True when the workflow has a static, pre-computable step timeline */
|
|
379
211
|
deterministic?: boolean;
|
|
380
|
-
/** Static planned steps metadata for deterministic workflows */
|
|
381
212
|
plannedSteps?: WorkflowPlannedStep[];
|
|
382
213
|
}
|
|
383
|
-
/**
|
|
384
|
-
* Unified workflow runtime metadata map
|
|
385
|
-
*/
|
|
386
214
|
export type WorkflowsRuntimeMeta = Record<string, WorkflowRuntimeMeta>;
|
|
387
|
-
/**
|
|
388
|
-
* Worker input types for generated queue workers
|
|
389
|
-
*/
|
|
390
|
-
export type WorkflowStepInput = {
|
|
391
|
-
runId: string;
|
|
392
|
-
stepName: string;
|
|
393
|
-
rpcName: string;
|
|
394
|
-
data: any;
|
|
395
|
-
/** Predecessor step name (the walked transition); undefined for entry steps. */
|
|
396
|
-
fromStepName?: string;
|
|
397
|
-
};
|
|
398
|
-
export type WorkflowOrchestratorInput = {
|
|
399
|
-
runId: string;
|
|
400
|
-
};
|
|
401
|
-
export type WorkflowSleeperInput = {
|
|
402
|
-
runId: string;
|
|
403
|
-
stepId: string;
|
|
404
|
-
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: overview
|
|
3
|
+
title: Decisions
|
|
4
|
+
description: Rules chosen in @pikku/core, and what each one rules out
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Decisions
|
|
8
|
+
|
|
9
|
+
A rule that was chosen, and what it rules out.
|
|
10
|
+
|
|
11
|
+
Each note here replaces a comment that was carrying reasoning inside the source.
|
|
12
|
+
If you are about to "clean up" something in core that looks pointless, search
|
|
13
|
+
here first — several of these exist because the obvious simplification was tried
|
|
14
|
+
and broke something.
|
|
15
|
+
|
|
16
|
+
<!-- pikku:knowledge-index -->
|
|
17
|
+
- [internals](internals/index.md) — a rule about how it works under the hood, and why
|
|
18
|
+
- [security](security/index.md) — a rule about who may do what
|
|
19
|
+
<!-- /pikku:knowledge-index -->
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: decision
|
|
3
|
+
title: A secret that fails to decrypt fails the whole read
|
|
4
|
+
description: getSecrets throws naming the key and its key_version rather than omitting the row, because a silent omission surfaces as an unrelated failure much later
|
|
5
|
+
tags: crypto, storage
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# A secret that fails to decrypt fails the whole read
|
|
9
|
+
|
|
10
|
+
Every store's bulk read — `getSecrets` in the kysely, mongodb and redis secret
|
|
11
|
+
services — wraps the `getKEK` + `envelopeDecrypt` pair in a try/catch that
|
|
12
|
+
rethrows:
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
Failed to decrypt secret "<key>" (key_version <n>): the configured KEK does not
|
|
16
|
+
match the key it was wrapped under
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
with the original crypto error as `cause`. A key that has no row at all is still
|
|
20
|
+
simply absent from the returned object; only a row that exists and will not
|
|
21
|
+
decrypt is fatal.
|
|
22
|
+
|
|
23
|
+
Those two cases look similar and are not. A missing key is an ordinary, callable
|
|
24
|
+
state — the caller asked for something that was never stored, and the typed
|
|
25
|
+
secret layer above already decides what to do about an absent value. A stored
|
|
26
|
+
row that will not decrypt means the service is holding ciphertext it cannot
|
|
27
|
+
read: a `PIKKU_SECRET_KEK` that does not match what the value was wrapped under,
|
|
28
|
+
a `previousKey` missing for an older `keyVersion`, or a change to the derivation
|
|
29
|
+
itself. Nothing the caller can do downstream makes that better.
|
|
30
|
+
|
|
31
|
+
Dropping the row instead hands back a partial map, and the failure re-emerges
|
|
32
|
+
somewhere with no connection to secrets — an auth middleware reading an
|
|
33
|
+
undefined signing key and answering "server configuration error", a provider
|
|
34
|
+
client constructed with `undefined` credentials and 401-ing. The name of the
|
|
35
|
+
secret and the `key_version` it was wrapped under are precisely the two facts
|
|
36
|
+
that turn that into a one-line fix, and they are known at the catch site and
|
|
37
|
+
nowhere after it.
|
|
38
|
+
|
|
39
|
+
This matters most at exactly the moment it is least convenient: a change to
|
|
40
|
+
`deriveKEK` makes *every* previously stored secret undecryptable at once. Loud
|
|
41
|
+
failure names the first one; silence produces an empty map and a support ticket.
|
|
42
|
+
|
|
43
|
+
**What this rules out:** a `getSecrets` that skips unreadable rows; returning
|
|
44
|
+
`undefined` for a row that exists; collecting failures and returning them
|
|
45
|
+
alongside the successes, which just moves the ignoring one level up; and
|
|
46
|
+
treating a missing key as an error, which would break callers that legitimately
|
|
47
|
+
probe for optional secrets.
|
|
48
|
+
|
|
49
|
+
See [[the-kek-salt-is-scoped-to-the-key-version]].
|
package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-and-not-a-queued-job.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: decision
|
|
3
|
+
title: A virtual user run is not a workflow and not a queued job
|
|
4
|
+
description: runVirtualUser writes its record, dispatches the run without awaiting it, and returns the id — because an exploratory run has nothing to replay and the record already carries what a queue would be holding
|
|
5
|
+
tags: virtual-user, storage
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# A virtual user run is not a workflow and not a queued job
|
|
9
|
+
|
|
10
|
+
`runVirtualUser` — the RPC `scaffold.virtualUser` generates — does three things
|
|
11
|
+
in order: writes a `VirtualUserRunStore` record, dispatches
|
|
12
|
+
`executeVirtualUserRun` **without awaiting it**, and returns the `runId`. There
|
|
13
|
+
is no workflow, no queue, and no worker.
|
|
14
|
+
|
|
15
|
+
Both of the alternatives are the obvious ones, and both are wrong for this.
|
|
16
|
+
|
|
17
|
+
**A workflow** is a replayable step graph: its value is that a run can be
|
|
18
|
+
resumed at the step it died on, and that the same input reaches the same step.
|
|
19
|
+
A virtual user is the opposite by construction — it is an LLM deciding what to
|
|
20
|
+
try next, so no two attempts take the same steps, and there is no step to resume
|
|
21
|
+
*to*. Recording a run as a workflow puts entries in the workflow store that can
|
|
22
|
+
never be replayed, and gives every operator reading that store a row that lies
|
|
23
|
+
about what it is. The seed makes a run *reproducible* — run it again and it
|
|
24
|
+
explores the same way — which is a different property from resumable, and one
|
|
25
|
+
the record already carries.
|
|
26
|
+
|
|
27
|
+
**A queue** buys durability across a restart and a retry on failure. It costs a
|
|
28
|
+
broker dependency in every application that turns the scaffold on, plus a worker
|
|
29
|
+
whose progress cannot be read anyway: the run's state lives in the store, not in
|
|
30
|
+
the queue entry. The queue would be holding a copy of what the record already
|
|
31
|
+
has, on the way to the same place.
|
|
32
|
+
|
|
33
|
+
So the record is the run's only trace, and that is what `VirtualUserRunStore`
|
|
34
|
+
exists for. It is also why `fail()` is a method rather than an absence: a run
|
|
35
|
+
that crashed and a run that found nothing are different answers, and a record
|
|
36
|
+
left at `running` is neither.
|
|
37
|
+
|
|
38
|
+
The cost is real and is stated on the type: **a restart mid-run strands a record
|
|
39
|
+
at `running` with nothing left to finish it.** A run older than its budget
|
|
40
|
+
window and still `running` is dead, not working — that is a read-side rule, and
|
|
41
|
+
it is cheaper than the two dependencies avoided. Nothing retries; a stranded run
|
|
42
|
+
is started again, with its seed if the caller wants the same exploration.
|
|
43
|
+
|
|
44
|
+
**What this rules out:** dispatching the run through `startWorkflow`; a
|
|
45
|
+
scaffolded queue worker; awaiting the engine inside the request (a run takes
|
|
46
|
+
minutes and survives neither a rollout nor a proxy timeout); and inferring
|
|
47
|
+
`status` from `finishedAt` being unset, which cannot separate a crash from a run
|
|
48
|
+
still going.
|
package/knowledge/decisions/internals/actor-flow-conversations-seed-a-hidden-kickoff-message.md
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: decision
|
|
3
|
+
title: An actor conversation starts from a seeded kickoff message
|
|
4
|
+
description: The actor's first turn needs a non-empty message list because providers reject an empty prompt; the seed is an instruction and stays out of the transcript
|
|
5
|
+
tags: actor-flow
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# An actor conversation starts from a seeded kickoff message
|
|
9
|
+
|
|
10
|
+
`runConversation` in
|
|
11
|
+
`packages/core/src/wirings/actor-flow/run-conversation.ts` primes
|
|
12
|
+
`actorMessages` with a single user message telling the persona to begin, before
|
|
13
|
+
the first turn is generated.
|
|
14
|
+
|
|
15
|
+
The actor speaks first, so at that point there is nothing for it to reply to —
|
|
16
|
+
and LLM providers reject a completion request with no messages. The seed is
|
|
17
|
+
addressed to the actor rather than to the target agent, which is why it is never
|
|
18
|
+
pushed onto `transcript`: it is scaffolding, not something the simulated user
|
|
19
|
+
said, and including it would corrupt the transcript the final evaluation reads.
|
|
20
|
+
|
|
21
|
+
**What this rules out:** starting from an empty `actorMessages` array, folding
|
|
22
|
+
the kickoff into the persona instructions where a provider may weight it
|
|
23
|
+
differently, and pushing the seed into the transcript for symmetry.
|
package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: decision
|
|
3
|
+
title: The actor-flow conversation engine only sees a transport-agnostic target driver
|
|
4
|
+
description: The engine never imports the agent runner; the target is injected as run/approve, so scenarios exercise the real wire path
|
|
5
|
+
tags: actor-flow
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# The actor-flow conversation engine only sees a transport-agnostic target driver
|
|
9
|
+
|
|
10
|
+
`runConversation` reaches the target agent exclusively through the injected
|
|
11
|
+
`TargetAgentDriver` — `run(message)` and `approve(runId, decisions)` — declared
|
|
12
|
+
in `packages/core/src/wirings/actor-flow/actor-flow.types.ts`. In production that
|
|
13
|
+
driver is HTTP-backed, issuing the actor's `agentRun` and `agentApprove` calls as
|
|
14
|
+
the signed-in actor.
|
|
15
|
+
|
|
16
|
+
Keeping the seam transport-agnostic is what makes the conversation a real test:
|
|
17
|
+
the agent is exercised through the same authenticated wire path a user takes,
|
|
18
|
+
including middleware, permissions and session handling, rather than through an
|
|
19
|
+
in-process call that skips all of it. It also lets the engine be unit-tested
|
|
20
|
+
against scripted targets with no server at all.
|
|
21
|
+
|
|
22
|
+
**What this rules out:** calling `runAIAgent` / `streamAIAgent` directly from the
|
|
23
|
+
conversation engine, and widening `TargetAgentDriver` with transport details
|
|
24
|
+
(headers, cookies, channels) that would tie the engine to HTTP.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: decision
|
|
3
|
+
title: An actor-flow verdict is the persona's self-evaluation, not an assertion
|
|
4
|
+
description: The engine returns what the actor judged plus the transcript; deterministic checks stay with the caller
|
|
5
|
+
tags: actor-flow
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# An actor-flow verdict is the persona's self-evaluation, not an assertion
|
|
9
|
+
|
|
10
|
+
`runConversation` ends by asking the persona LLM whether the `evaluate`
|
|
11
|
+
criterion was met and returns that as `ActorFlowVerdict` — `passed`, `reasoning`
|
|
12
|
+
and the full `transcript`
|
|
13
|
+
(`packages/core/src/wirings/actor-flow/`). Nothing in the engine inspects the
|
|
14
|
+
system the agent acted on.
|
|
15
|
+
|
|
16
|
+
The verdict is deliberately soft because the thing it judges is soft: whether a
|
|
17
|
+
conversation accomplished a natural-language task. Deterministic checks — that a
|
|
18
|
+
row was written, that an email went out — belong to the caller, which already
|
|
19
|
+
holds the actor and can `actor.invoke(...)` after the conversation returns. The
|
|
20
|
+
`reasoning` and `transcript` fields exist so a soft failure is debuggable rather
|
|
21
|
+
than merely red.
|
|
22
|
+
|
|
23
|
+
**What this rules out:** having `runConversation` assert or throw on a failed
|
|
24
|
+
verdict, and adding deterministic post-conditions to `ConverseOptions` instead of
|
|
25
|
+
running them at the call site.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: decision
|
|
3
|
+
title: Addon package roots resolve by walking node module search paths
|
|
4
|
+
description: LocalMetaService finds an addon's directory by scanning resolve.paths, not by require.resolve, because addon packages expose no main entry
|
|
5
|
+
tags: services
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Addon package roots resolve by walking node module search paths
|
|
9
|
+
|
|
10
|
+
`LocalMetaService.resolvePackageRoot` (`packages/core/src/services/meta-service.ts`)
|
|
11
|
+
builds a `createRequire` anchored one level above `.pikku` — the app root — then
|
|
12
|
+
walks `require.resolve.paths(packageName)` and takes the first candidate
|
|
13
|
+
directory that contains a `package.json`. The result is memoised in
|
|
14
|
+
`packageRootCache`.
|
|
15
|
+
|
|
16
|
+
The obvious call, `require.resolve(packageName)`, throws for these packages:
|
|
17
|
+
Pikku addon packages ship a `.pikku` directory and subpath exports but no main
|
|
18
|
+
`exports` entry, so there is nothing for Node to resolve to. Walking the search
|
|
19
|
+
paths asks the same question Node would ask — where would this package be
|
|
20
|
+
found from the app root — without requiring the package to be importable.
|
|
21
|
+
|
|
22
|
+
**What this rules out:** replacing the loop with `require.resolve(pkg)`,
|
|
23
|
+
`import.meta.resolve`, or `createRequire(import.meta.url)`. The first two fail on
|
|
24
|
+
every addon; the third anchors resolution at `@pikku/core`'s own location rather
|
|
25
|
+
than the app's, so an addon installed only in the app's `node_modules` becomes
|
|
26
|
+
invisible.
|