@pikku/core 0.12.107 → 0.12.112
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 +357 -0
- package/dist/analytics/analytics.d.ts +6 -0
- package/dist/analytics/analytics.js +58 -0
- package/dist/analytics/analytics.types.d.ts +156 -0
- package/dist/analytics/analytics.types.js +1 -0
- package/dist/analytics/anonymous-analytics-identity.d.ts +23 -0
- package/dist/analytics/anonymous-analytics-identity.js +27 -0
- package/dist/analytics/compose-analytics-identity.d.ts +14 -0
- package/dist/analytics/compose-analytics-identity.js +33 -0
- package/dist/analytics/cookie-analytics-identity.d.ts +24 -0
- package/dist/analytics/cookie-analytics-identity.js +37 -0
- package/dist/analytics/define-analytics-events.d.ts +22 -0
- package/dist/analytics/define-analytics-events.js +9 -0
- package/dist/analytics/fan-out-analytics.d.ts +15 -0
- package/dist/analytics/fan-out-analytics.js +36 -0
- package/dist/analytics/index.d.ts +13 -0
- package/dist/analytics/index.js +8 -0
- package/dist/analytics/logger-analytics-service.d.ts +14 -0
- package/dist/analytics/logger-analytics-service.js +23 -0
- package/dist/analytics/mint-cookie.d.ts +44 -0
- package/dist/analytics/mint-cookie.js +55 -0
- package/dist/dev/hot-reload.d.ts +0 -1
- package/dist/dev/hot-reload.js +4 -25
- package/dist/dev/module-runner.js +104 -25
- package/dist/errors/errors.d.ts +7 -0
- package/dist/errors/errors.js +17 -0
- package/dist/function/function-meta.types.d.ts +2 -0
- package/dist/function/function-runner.js +29 -0
- package/dist/function/functions.types.d.ts +22 -3
- package/dist/middleware/auth-apikey.d.ts +1 -1
- package/dist/pikku-state.d.ts +1 -1
- package/dist/scopes.d.ts +11 -0
- package/dist/scopes.js +17 -0
- package/dist/services/credential-wire-service.d.ts +1 -1
- package/dist/services/feature-flag-service.d.ts +100 -0
- package/dist/services/feature-flag-service.js +1 -0
- package/dist/services/index.d.ts +1 -0
- package/dist/services/meta-service.d.ts +16 -0
- package/dist/services/meta-service.js +19 -0
- package/dist/services/webhook-service.d.ts +7 -2
- package/dist/services/webhook-service.js +11 -6
- package/dist/testing/service-tests/agent-run-service-tests.d.ts +2 -2
- package/dist/testing/service-tests/agent-storage-service-tests.d.ts +1 -1
- package/dist/testing/service-tests/channel-store-tests.d.ts +1 -1
- package/dist/testing/service-tests/credential-service-tests.d.ts +1 -1
- package/dist/testing/service-tests/deployment-service-tests.d.ts +1 -1
- package/dist/testing/service-tests/event-hub-store-tests.d.ts +1 -1
- package/dist/testing/service-tests/secret-service-tests.d.ts +1 -1
- package/dist/testing/service-tests/session-store-tests.d.ts +1 -1
- package/dist/testing/service-tests/workflow-run-service-tests.d.ts +1 -1
- package/dist/testing/service-tests/workflow-service-tests.d.ts +1 -1
- package/dist/types/core.types.d.ts +23 -0
- package/dist/wirings/agent/agent-rpc.d.ts +1 -1
- package/dist/wirings/agent/agent-turn.d.ts +1 -1
- package/dist/wirings/agent-scorer/agent-scorer-live.d.ts +1 -1
- package/dist/wirings/channel/channel-common.d.ts +1 -1
- package/dist/wirings/channel/channel-rpc-validators.d.ts +2 -2
- package/dist/wirings/channel/channel-runner.d.ts +1 -1
- package/dist/wirings/channel/local/local-channel-runner.d.ts +1 -1
- package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +1 -1
- package/dist/wirings/cli/channel/cli-approval.d.ts +2 -2
- package/dist/wirings/flag/assert-feature-available.d.ts +15 -0
- package/dist/wirings/flag/assert-feature-available.js +23 -0
- package/dist/wirings/flag/cached-flag-source.d.ts +73 -0
- package/dist/wirings/flag/cached-flag-source.js +96 -0
- package/dist/wirings/flag/define-feature-flags.d.ts +33 -0
- package/dist/wirings/flag/define-feature-flags.js +32 -0
- package/dist/wirings/flag/flag.types.d.ts +97 -0
- package/dist/wirings/flag/flag.types.js +1 -0
- package/dist/wirings/flag/index.d.ts +7 -0
- package/dist/wirings/flag/index.js +5 -0
- package/dist/wirings/flag/resolve-flag.d.ts +52 -0
- package/dist/wirings/flag/resolve-flag.js +90 -0
- package/dist/wirings/flag/validate-flag-definitions.d.ts +26 -0
- package/dist/wirings/flag/validate-flag-definitions.js +103 -0
- package/dist/wirings/virtual-user/virtual-user-scaffold.d.ts +8 -8
- package/dist/wirings/virtual-user/virtual-user-schedule.d.ts +1 -1
- package/dist/wirings/workflow/workflow-queue-routing.d.ts +1 -1
- package/knowledge/decisions/internals/a-reset-suite-makes-the-dev-seed-the-fixture.md +50 -0
- package/knowledge/decisions/internals/hot-reload-reads-the-changed-source-never-a-compiled-copy.md +38 -0
- package/knowledge/decisions/internals/index.md +2 -0
- package/package.json +11 -5
- package/run-tests.sh +17 -9
- package/src/public-surface.json +26 -0
- package/src/agent-naming.test.ts +0 -68
- package/src/api-report.test.ts +0 -138
- package/src/app-alias-surface.test.ts +0 -179
- package/src/app-leaf-surface.test.ts +0 -222
- package/src/bootstrap-compat/root.ts +0 -20
- package/src/classification/column-form.test.ts +0 -97
- package/src/classification/column-form.ts +0 -55
- package/src/classification/data-classification.ts +0 -73
- package/src/classification/index.ts +0 -40
- package/src/classification/key-ids.ts +0 -2
- package/src/classification/secret-value.test.ts +0 -204
- package/src/classification/secret-value.ts +0 -106
- package/src/crypto-utils.test.ts +0 -668
- package/src/crypto-utils.ts +0 -460
- package/src/dev/hot-reload.test.ts +0 -587
- package/src/dev/hot-reload.ts +0 -225
- package/src/dev/module-runner.test.ts +0 -235
- package/src/dev/module-runner.ts +0 -138
- package/src/dev/reload-meta.test.ts +0 -183
- package/src/dev/reload-meta.ts +0 -144
- package/src/ecosystem-tier-removed.test.ts +0 -72
- package/src/env.ts +0 -1
- package/src/errors/error-handler.ts +0 -77
- package/src/errors/error.test.ts +0 -229
- package/src/errors/errors.ts +0 -393
- package/src/errors/index.ts +0 -11
- package/src/errors/serialized-error.ts +0 -12
- package/src/factory-functions.test.ts +0 -111
- package/src/function/abort-scope.test.ts +0 -97
- package/src/function/abort-scope.ts +0 -80
- package/src/function/function-meta.types.ts +0 -151
- package/src/function/function-runner.test.ts +0 -1619
- package/src/function/function-runner.ts +0 -499
- package/src/function/functions.types.ts +0 -319
- package/src/function/index.ts +0 -40
- package/src/function/list.types.test.ts +0 -100
- package/src/function/list.types.ts +0 -69
- package/src/function/pikku-request.test.ts +0 -35
- package/src/function/pikku-request.ts +0 -17
- package/src/gopass-secrets-removed.test.ts +0 -51
- package/src/handle-error.test.ts +0 -532
- package/src/handle-error.ts +0 -64
- package/src/middleware/auth-apikey.test.ts +0 -362
- package/src/middleware/auth-apikey.ts +0 -39
- package/src/middleware/auth-bearer.test.ts +0 -566
- package/src/middleware/auth-bearer.ts +0 -83
- package/src/middleware/auth-cookie.test.ts +0 -572
- package/src/middleware/auth-cookie.ts +0 -107
- package/src/middleware/cors.test.ts +0 -579
- package/src/middleware/cors.ts +0 -103
- package/src/middleware/index.ts +0 -30
- package/src/middleware/middleware-factories.ts +0 -76
- package/src/middleware/middleware.types.ts +0 -61
- package/src/middleware/remote-auth.test.ts +0 -547
- package/src/middleware/remote-auth.ts +0 -95
- package/src/middleware/remote-jobs-secret.ts +0 -35
- package/src/middleware/require-origin.test.ts +0 -115
- package/src/middleware/require-origin.ts +0 -79
- package/src/middleware/telemetry.ts +0 -83
- package/src/middleware-runner.test.ts +0 -578
- package/src/middleware-runner.ts +0 -232
- package/src/no-any-casts.test.ts +0 -57
- package/src/no-root-barrel.test.ts +0 -122
- package/src/permissions.test.ts +0 -256
- package/src/permissions.ts +0 -217
- package/src/pikku-state.test.ts +0 -198
- package/src/pikku-state.ts +0 -206
- package/src/production-barrels-stay-lean.test.ts +0 -110
- package/src/public-surface.test.ts +0 -133
- package/src/remote.test.ts +0 -173
- package/src/remote.ts +0 -56
- package/src/removed-legacy-exports.test.ts +0 -66
- package/src/run-tests-script.test.ts +0 -67
- package/src/schema.test.ts +0 -430
- package/src/schema.ts +0 -204
- package/src/scopes.test.ts +0 -203
- package/src/scopes.ts +0 -67
- package/src/services/agent-run-state-service.ts +0 -37
- package/src/services/agent-runner-service.ts +0 -238
- package/src/services/agent-storage-service.ts +0 -39
- package/src/services/ai-embedding-service.ts +0 -9
- package/src/services/audit-service.test.ts +0 -44
- package/src/services/audit-service.ts +0 -280
- package/src/services/content-service.ts +0 -65
- package/src/services/credential-service.ts +0 -20
- package/src/services/credential-wire-service.test.ts +0 -235
- package/src/services/credential-wire-service.ts +0 -120
- package/src/services/deployment-service.ts +0 -32
- package/src/services/email-service.test.ts +0 -100
- package/src/services/email-service.ts +0 -60
- package/src/services/email-template.test.ts +0 -311
- package/src/services/email-template.ts +0 -254
- package/src/services/file-scenario-run-store.test.ts +0 -349
- package/src/services/file-scenario-run-store.ts +0 -282
- package/src/services/gateway-service.ts +0 -5
- package/src/services/http-personas-converse.test.ts +0 -274
- package/src/services/http-personas.test.ts +0 -379
- package/src/services/http-personas.ts +0 -508
- package/src/services/in-memory-agent-run-state-service.ts +0 -87
- package/src/services/in-memory-queue-service.test.ts +0 -162
- package/src/services/in-memory-queue-service.ts +0 -78
- package/src/services/in-memory-session-store.test.ts +0 -58
- package/src/services/in-memory-session-store.ts +0 -20
- package/src/services/in-memory-trigger-service.ts +0 -47
- package/src/services/in-memory-workflow-service.test.ts +0 -430
- package/src/services/in-memory-workflow-service.ts +0 -595
- package/src/services/index.ts +0 -192
- package/src/services/istanbul-coverage-service.test.ts +0 -66
- package/src/services/istanbul-coverage-service.ts +0 -59
- package/src/services/jwt-service.ts +0 -15
- package/src/services/local-content-request-handler.test.ts +0 -240
- package/src/services/local-content-request-handler.ts +0 -295
- package/src/services/local-content.test.ts +0 -186
- package/src/services/local-content.ts +0 -242
- package/src/services/local-credential-service.ts +0 -63
- package/src/services/local-email-service.test.ts +0 -182
- package/src/services/local-email-service.ts +0 -43
- package/src/services/local-gateway-service.ts +0 -51
- package/src/services/local-secrets.test.ts +0 -95
- package/src/services/local-secrets.ts +0 -71
- package/src/services/local-variables.test.ts +0 -61
- package/src/services/local-variables.ts +0 -45
- package/src/services/logger-console.test.ts +0 -117
- package/src/services/logger-console.ts +0 -174
- package/src/services/logger.ts +0 -48
- package/src/services/meta-service.test.ts +0 -75
- package/src/services/meta-service.ts +0 -767
- package/src/services/persona-actor-secret.test.ts +0 -68
- package/src/services/persona-actor-secret.ts +0 -70
- package/src/services/persona-sign-in.test.ts +0 -219
- package/src/services/persona-sign-in.ts +0 -238
- package/src/services/personas-service.ts +0 -191
- package/src/services/pikku-user-id.test.ts +0 -62
- package/src/services/pikku-user-id.ts +0 -13
- package/src/services/queue-webhook-service.test.ts +0 -409
- package/src/services/queue-webhook-service.ts +0 -150
- package/src/services/remote-jobs.test.ts +0 -106
- package/src/services/remote-jobs.ts +0 -92
- package/src/services/scheduler-service.ts +0 -37
- package/src/services/schema-service.ts +0 -10
- package/src/services/scope-service.ts +0 -91
- package/src/services/scoped-credential-service.test.ts +0 -86
- package/src/services/scoped-credential-service.ts +0 -63
- package/src/services/scoped-secret-service.test.ts +0 -93
- package/src/services/scoped-secret-service.ts +0 -40
- package/src/services/secret-host-binding.test.ts +0 -138
- package/src/services/secret-host-binding.ts +0 -51
- package/src/services/secret-service.ts +0 -25
- package/src/services/secretless.test.ts +0 -54
- package/src/services/secretless.ts +0 -29
- package/src/services/session-store.ts +0 -9
- package/src/services/stub-tracker.test.ts +0 -104
- package/src/services/stub-tracker.ts +0 -175
- package/src/services/system-role-guard.test.ts +0 -96
- package/src/services/system-role-guard.ts +0 -71
- package/src/services/temporary-file-service.ts +0 -76
- package/src/services/trigger-service.ts +0 -5
- package/src/services/typed-credential-service.ts +0 -83
- package/src/services/typed-secret-service.test.ts +0 -204
- package/src/services/typed-secret-service.ts +0 -132
- package/src/services/typed-variables-service.test.ts +0 -166
- package/src/services/typed-variables-service.ts +0 -166
- package/src/services/user-session-service.test.ts +0 -147
- package/src/services/user-session-service.ts +0 -85
- package/src/services/v8-coverage-service.test.ts +0 -69
- package/src/services/v8-coverage-service.ts +0 -163
- package/src/services/variables-service.ts +0 -13
- package/src/services/webhook-service.ts +0 -147
- package/src/services/workflow-service.ts +0 -120
- package/src/side-effects-are-declared.test.ts +0 -84
- package/src/source-files-stay-composable.test.ts +0 -41
- package/src/template-alias-surface.test.ts +0 -240
- package/src/test-utils.ts +0 -38
- package/src/testing/index.ts +0 -3
- package/src/testing/service-tests/agent-run-service-tests.ts +0 -98
- package/src/testing/service-tests/agent-storage-service-tests.ts +0 -379
- package/src/testing/service-tests/channel-store-tests.ts +0 -98
- package/src/testing/service-tests/credential-service-tests.ts +0 -143
- package/src/testing/service-tests/deployment-service-tests.ts +0 -33
- package/src/testing/service-tests/event-hub-store-tests.ts +0 -48
- package/src/testing/service-tests/secret-service-tests.ts +0 -105
- package/src/testing/service-tests/session-store-tests.ts +0 -62
- package/src/testing/service-tests/workflow-run-service-tests.ts +0 -59
- package/src/testing/service-tests/workflow-service-tests.ts +0 -308
- package/src/testing/service-tests.ts +0 -95
- package/src/time-utils.test.ts +0 -56
- package/src/time-utils.ts +0 -89
- package/src/types/core.types.ts +0 -446
- package/src/types/index.ts +0 -25
- package/src/types/state.types.ts +0 -226
- package/src/types/typed-credentials.test.ts +0 -72
- package/src/utils/hash.test.ts +0 -68
- package/src/utils/hash.ts +0 -26
- package/src/utils/hmac.ts +0 -21
- package/src/utils/node-host-resolver.ts +0 -20
- package/src/utils/safe-fetch.test.ts +0 -515
- package/src/utils/safe-fetch.ts +0 -347
- package/src/utils.test.ts +0 -359
- package/src/utils.ts +0 -165
- package/src/version.test.ts +0 -80
- package/src/version.ts +0 -25
- package/src/wirings/actor-flow/actor-flow.types.ts +0 -40
- package/src/wirings/actor-flow/index.ts +0 -10
- package/src/wirings/actor-flow/run-conversation.test.ts +0 -187
- package/src/wirings/actor-flow/run-conversation.ts +0 -280
- package/src/wirings/addon/addon-auth-tags.test.ts +0 -219
- package/src/wirings/addon/addon-runner.ts +0 -236
- package/src/wirings/addon/addon-scopes.test.ts +0 -225
- package/src/wirings/addon/addon-secrets.test.ts +0 -391
- package/src/wirings/addon/index.ts +0 -12
- package/src/wirings/addon/remote-addon-auth.ts +0 -65
- package/src/wirings/addon/wire-addon.test.ts +0 -102
- package/src/wirings/addon/wire-addon.ts +0 -202
- package/src/wirings/addon/wire-remote-addon.ts +0 -41
- package/src/wirings/agent/agent-agui.test.ts +0 -1213
- package/src/wirings/agent/agent-agui.ts +0 -405
- package/src/wirings/agent/agent-authorization.test.ts +0 -208
- package/src/wirings/agent/agent-finalize.test.ts +0 -187
- package/src/wirings/agent/agent-finalize.ts +0 -197
- package/src/wirings/agent/agent-helpers.test.ts +0 -215
- package/src/wirings/agent/agent-helpers.ts +0 -96
- package/src/wirings/agent/agent-interrupt.test.ts +0 -833
- package/src/wirings/agent/agent-interrupt.ts +0 -400
- package/src/wirings/agent/agent-memory.test.ts +0 -397
- package/src/wirings/agent/agent-memory.ts +0 -496
- package/src/wirings/agent/agent-middleware.types.test.ts +0 -41
- package/src/wirings/agent/agent-model-config.test.ts +0 -103
- package/src/wirings/agent/agent-model-config.ts +0 -59
- package/src/wirings/agent/agent-prepare.test.ts +0 -977
- package/src/wirings/agent/agent-prepare.ts +0 -1083
- package/src/wirings/agent/agent-registry.test.ts +0 -455
- package/src/wirings/agent/agent-registry.ts +0 -99
- package/src/wirings/agent/agent-resume-authorization.test.ts +0 -206
- package/src/wirings/agent/agent-rpc.ts +0 -116
- package/src/wirings/agent/agent-runner.test.ts +0 -1229
- package/src/wirings/agent/agent-runner.ts +0 -858
- package/src/wirings/agent/agent-stream-delegate.test.ts +0 -381
- package/src/wirings/agent/agent-stream-output-hooks.test.ts +0 -353
- package/src/wirings/agent/agent-stream.test.ts +0 -1800
- package/src/wirings/agent/agent-stream.ts +0 -1639
- package/src/wirings/agent/agent-thread-ownership.test.ts +0 -297
- package/src/wirings/agent/agent-turn.test.ts +0 -65
- package/src/wirings/agent/agent-turn.ts +0 -122
- package/src/wirings/agent/agent-utils.ts +0 -20
- package/src/wirings/agent/agent.types.ts +0 -676
- package/src/wirings/agent/index.ts +0 -58
- package/src/wirings/agent/voice-input.test.ts +0 -220
- package/src/wirings/agent/voice-input.ts +0 -180
- package/src/wirings/agent/voice-output.test.ts +0 -510
- package/src/wirings/agent/voice-output.ts +0 -311
- package/src/wirings/agent-scorer/agent-scorer-grade.test.ts +0 -106
- package/src/wirings/agent-scorer/agent-scorer-grade.ts +0 -55
- package/src/wirings/agent-scorer/agent-scorer-judge.test.ts +0 -285
- package/src/wirings/agent-scorer/agent-scorer-judge.ts +0 -180
- package/src/wirings/agent-scorer/agent-scorer-live.test.ts +0 -174
- package/src/wirings/agent-scorer/agent-scorer-live.ts +0 -56
- package/src/wirings/agent-scorer/agent-scorer-registry.ts +0 -66
- package/src/wirings/agent-scorer/agent-scorer-sampling.test.ts +0 -34
- package/src/wirings/agent-scorer/agent-scorer-sampling.ts +0 -36
- package/src/wirings/agent-scorer/agent-scorer-snapshots.test.ts +0 -49
- package/src/wirings/agent-scorer/agent-scorer-snapshots.ts +0 -46
- package/src/wirings/agent-scorer/agent-scorer-worker.test.ts +0 -122
- package/src/wirings/agent-scorer/agent-scorer-worker.ts +0 -71
- package/src/wirings/agent-scorer/agent-scorer.ts +0 -102
- package/src/wirings/agent-scorer/agent-scorer.types.ts +0 -128
- package/src/wirings/agent-scorer/index.ts +0 -23
- package/src/wirings/channel/channel-common.ts +0 -102
- package/src/wirings/channel/channel-handler-shapes.test.ts +0 -72
- package/src/wirings/channel/channel-handler.test.ts +0 -322
- package/src/wirings/channel/channel-handler.ts +0 -259
- package/src/wirings/channel/channel-host-rpc.test.ts +0 -150
- package/src/wirings/channel/channel-host-rpc.ts +0 -69
- package/src/wirings/channel/channel-middleware-runner.test.ts +0 -188
- package/src/wirings/channel/channel-middleware-runner.ts +0 -126
- package/src/wirings/channel/channel-rpc-registry.ts +0 -116
- package/src/wirings/channel/channel-rpc-responder.ts +0 -117
- package/src/wirings/channel/channel-rpc-service.ts +0 -132
- package/src/wirings/channel/channel-rpc-validators.ts +0 -65
- package/src/wirings/channel/channel-rpc.test.ts +0 -841
- package/src/wirings/channel/channel-rpc.ts +0 -5
- package/src/wirings/channel/channel-rpc.types.ts +0 -160
- package/src/wirings/channel/channel-runner.ts +0 -164
- package/src/wirings/channel/channel-store.ts +0 -35
- package/src/wirings/channel/channel.types.ts +0 -193
- package/src/wirings/channel/define-channel-routes.ts +0 -5
- package/src/wirings/channel/eventhub-service.ts +0 -16
- package/src/wirings/channel/eventhub-store.ts +0 -13
- package/src/wirings/channel/index.ts +0 -40
- package/src/wirings/channel/local/index.ts +0 -3
- package/src/wirings/channel/local/local-channel-handler.ts +0 -98
- package/src/wirings/channel/local/local-channel-runner.test.ts +0 -339
- package/src/wirings/channel/local/local-channel-runner.ts +0 -271
- package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -77
- package/src/wirings/channel/local/local-eventhub-service.ts +0 -69
- package/src/wirings/channel/log-channels.ts +0 -16
- package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +0 -135
- package/src/wirings/channel/pikku-abstract-channel-handler.ts +0 -60
- package/src/wirings/channel/serverless/index.ts +0 -6
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +0 -328
- package/src/wirings/cli/channel/cli-approval.test.ts +0 -177
- package/src/wirings/cli/channel/cli-approval.ts +0 -135
- package/src/wirings/cli/channel/cli-channel-runner.ts +0 -118
- package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +0 -192
- package/src/wirings/cli/channel/cli-raw-channel-runner.ts +0 -148
- package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +0 -480
- package/src/wirings/cli/channel/cli-raw-client-runner.ts +0 -188
- package/src/wirings/cli/channel/index.ts +0 -6
- package/src/wirings/cli/cli-runner.test.ts +0 -969
- package/src/wirings/cli/cli-runner.ts +0 -538
- package/src/wirings/cli/cli.types.ts +0 -388
- package/src/wirings/cli/command-parser.test.ts +0 -1120
- package/src/wirings/cli/command-parser.ts +0 -713
- package/src/wirings/cli/define-cli-commands.ts +0 -13
- package/src/wirings/cli/format-cli-error.test.ts +0 -91
- package/src/wirings/cli/format-cli-error.ts +0 -96
- package/src/wirings/cli/index.ts +0 -19
- package/src/wirings/credential/credential.types.ts +0 -37
- package/src/wirings/credential/define-credential.ts +0 -49
- package/src/wirings/credential/index.ts +0 -7
- package/src/wirings/credential/validate-credential-definitions.ts +0 -63
- package/src/wirings/gateway/gateway-authorization.test.ts +0 -575
- package/src/wirings/gateway/gateway-channel-meta.test.ts +0 -44
- package/src/wirings/gateway/gateway-runner.test.ts +0 -581
- package/src/wirings/gateway/gateway-runner.ts +0 -411
- package/src/wirings/gateway/gateway.types.ts +0 -137
- package/src/wirings/gateway/index.ts +0 -15
- package/src/wirings/http/http-routes.test.ts +0 -318
- package/src/wirings/http/http-routes.ts +0 -111
- package/src/wirings/http/http-runner-addon-ref.test.ts +0 -238
- package/src/wirings/http/http-runner.test.ts +0 -503
- package/src/wirings/http/http-runner.ts +0 -462
- package/src/wirings/http/http.types.ts +0 -307
- package/src/wirings/http/index.ts +0 -27
- package/src/wirings/http/log-http-routes.ts +0 -18
- package/src/wirings/http/pikku-fetch-http-request.test.ts +0 -318
- package/src/wirings/http/pikku-fetch-http-request.ts +0 -260
- package/src/wirings/http/pikku-fetch-http-response.test.ts +0 -123
- package/src/wirings/http/pikku-fetch-http-response.ts +0 -149
- package/src/wirings/http/routers/http-router.ts +0 -13
- package/src/wirings/http/routers/path-to-regex.test.ts +0 -306
- package/src/wirings/http/routers/path-to-regex.ts +0 -115
- package/src/wirings/http/web-request.test.ts +0 -382
- package/src/wirings/http/web-request.ts +0 -162
- package/src/wirings/mcp/index.ts +0 -26
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -388
- package/src/wirings/mcp/mcp-endpoint-registry.ts +0 -159
- package/src/wirings/mcp/mcp-runner.test.ts +0 -588
- package/src/wirings/mcp/mcp-runner.ts +0 -330
- package/src/wirings/mcp/mcp.types.ts +0 -199
- package/src/wirings/node/index.ts +0 -2
- package/src/wirings/node/node.types.ts +0 -23
- package/src/wirings/oauth2/index.ts +0 -1
- package/src/wirings/oauth2/oauth2.types.ts +0 -12
- package/src/wirings/persona/define-personas.ts +0 -33
- package/src/wirings/persona/index.ts +0 -75
- package/src/wirings/persona/persona-app-scopes.test.ts +0 -47
- package/src/wirings/persona/persona-app-scopes.ts +0 -74
- package/src/wirings/persona/persona-email.ts +0 -87
- package/src/wirings/persona/persona-environments.test.ts +0 -194
- package/src/wirings/persona/persona-environments.ts +0 -138
- package/src/wirings/persona/persona-mailbox.ts +0 -156
- package/src/wirings/persona/persona.test.ts +0 -230
- package/src/wirings/persona/persona.types.ts +0 -156
- package/src/wirings/persona/validate-personas.ts +0 -137
- package/src/wirings/queue/index.ts +0 -29
- package/src/wirings/queue/queue-identity.test.ts +0 -454
- package/src/wirings/queue/queue-identity.ts +0 -176
- package/src/wirings/queue/queue-runner.test.ts +0 -705
- package/src/wirings/queue/queue-runner.ts +0 -181
- package/src/wirings/queue/queue.types.ts +0 -161
- package/src/wirings/queue/register-queue-helper.ts +0 -46
- package/src/wirings/queue/signed-queue-service.ts +0 -60
- package/src/wirings/queue/validate-worker-config.test.ts +0 -108
- package/src/wirings/queue/validate-worker-config.ts +0 -90
- package/src/wirings/role/define-system-role.ts +0 -33
- package/src/wirings/role/index.ts +0 -13
- package/src/wirings/role/role.test.ts +0 -104
- package/src/wirings/role/role.types.ts +0 -47
- package/src/wirings/role/validate-role-definitions.ts +0 -93
- package/src/wirings/rpc/index.ts +0 -8
- package/src/wirings/rpc/rpc-runner.test.ts +0 -1130
- package/src/wirings/rpc/rpc-runner.ts +0 -569
- package/src/wirings/rpc/rpc-types.ts +0 -87
- package/src/wirings/scheduler/index.ts +0 -11
- package/src/wirings/scheduler/log-schedulers.ts +0 -16
- package/src/wirings/scheduler/scheduler-runner.test.ts +0 -835
- package/src/wirings/scheduler/scheduler-runner.ts +0 -138
- package/src/wirings/scheduler/scheduler.types.ts +0 -42
- package/src/wirings/scope/define-scope.ts +0 -33
- package/src/wirings/scope/index.ts +0 -15
- package/src/wirings/scope/scope.test.ts +0 -159
- package/src/wirings/scope/scope.types.ts +0 -42
- package/src/wirings/scope/validate-scope-definitions.ts +0 -107
- package/src/wirings/secret/index.ts +0 -9
- package/src/wirings/secret/secret.types.ts +0 -70
- package/src/wirings/secret/validate-secret-definitions.test.ts +0 -232
- package/src/wirings/secret/validate-secret-definitions.ts +0 -88
- package/src/wirings/trigger/index.ts +0 -9
- package/src/wirings/trigger/pikku-trigger-service.ts +0 -107
- package/src/wirings/trigger/trigger-runner.test.ts +0 -78
- package/src/wirings/trigger/trigger-runner.ts +0 -113
- package/src/wirings/trigger/trigger.types.ts +0 -100
- package/src/wirings/variable/index.ts +0 -8
- package/src/wirings/variable/validate-variable-definitions.test.ts +0 -115
- package/src/wirings/variable/validate-variable-definitions.ts +0 -71
- package/src/wirings/variable/variable.types.ts +0 -40
- package/src/wirings/virtual-user/index.ts +0 -107
- package/src/wirings/virtual-user/prepare-virtual-user-run.test.ts +0 -115
- package/src/wirings/virtual-user/prepare-virtual-user-run.ts +0 -95
- package/src/wirings/virtual-user/run-virtual-user.test.ts +0 -774
- package/src/wirings/virtual-user/run-virtual-user.ts +0 -684
- package/src/wirings/virtual-user/virtual-user-agents.test.ts +0 -72
- package/src/wirings/virtual-user/virtual-user-agents.ts +0 -62
- package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +0 -215
- package/src/wirings/virtual-user/virtual-user-catalogue.ts +0 -184
- package/src/wirings/virtual-user/virtual-user-derive.test.ts +0 -426
- package/src/wirings/virtual-user/virtual-user-derive.ts +0 -161
- package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +0 -68
- package/src/wirings/virtual-user/virtual-user-dispositions.ts +0 -210
- package/src/wirings/virtual-user/virtual-user-intents.test.ts +0 -218
- package/src/wirings/virtual-user/virtual-user-intents.ts +0 -185
- package/src/wirings/virtual-user/virtual-user-rng.test.ts +0 -72
- package/src/wirings/virtual-user/virtual-user-rng.ts +0 -50
- package/src/wirings/virtual-user/virtual-user-run-store.ts +0 -131
- package/src/wirings/virtual-user/virtual-user-scaffold.test.ts +0 -854
- package/src/wirings/virtual-user/virtual-user-scaffold.ts +0 -664
- package/src/wirings/virtual-user/virtual-user-schedule-store.ts +0 -93
- package/src/wirings/virtual-user/virtual-user-schedule.test.ts +0 -280
- package/src/wirings/virtual-user/virtual-user-schedule.ts +0 -156
- package/src/wirings/virtual-user/virtual-user-target.ts +0 -47
- package/src/wirings/virtual-user/virtual-user.types.ts +0 -215
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +0 -709
- package/src/wirings/workflow/dsl/workflow-runner.ts +0 -25
- package/src/wirings/workflow/feature.test.ts +0 -131
- package/src/wirings/workflow/feature.ts +0 -59
- package/src/wirings/workflow/graph/graph-foreach-queued.test.ts +0 -569
- package/src/wirings/workflow/graph/graph-foreach.test.ts +0 -626
- package/src/wirings/workflow/graph/graph-node.ts +0 -115
- package/src/wirings/workflow/graph/graph-runner.test.ts +0 -1049
- package/src/wirings/workflow/graph/graph-runner.ts +0 -1376
- package/src/wirings/workflow/graph/graph-validation.test.ts +0 -27
- package/src/wirings/workflow/graph/graph-validation.ts +0 -41
- package/src/wirings/workflow/graph/template.test.ts +0 -49
- package/src/wirings/workflow/graph/template.ts +0 -42
- package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -39
- package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -75
- package/src/wirings/workflow/index.ts +0 -107
- package/src/wirings/workflow/pikku-scenario-service.ts +0 -1013
- package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -963
- package/src/wirings/workflow/pikku-workflow-service.ts +0 -1993
- package/src/wirings/workflow/run-timeline.test.ts +0 -199
- package/src/wirings/workflow/run-timeline.ts +0 -185
- package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -107
- package/src/wirings/workflow/scenario-cookie-jar.ts +0 -57
- package/src/wirings/workflow/scenario-expectations.test.ts +0 -238
- package/src/wirings/workflow/scenario-hooks.test.ts +0 -259
- package/src/wirings/workflow/scenario-poll.test.ts +0 -64
- package/src/wirings/workflow/scenario-poll.ts +0 -27
- package/src/wirings/workflow/scenario-prose.test.ts +0 -275
- package/src/wirings/workflow/scenario-prose.ts +0 -86
- package/src/wirings/workflow/scenario-run.types.ts +0 -193
- package/src/wirings/workflow/scenario-service.test.ts +0 -147
- package/src/wirings/workflow/scenario-step-guards.ts +0 -23
- package/src/wirings/workflow/scenario-step.test.ts +0 -800
- package/src/wirings/workflow/scenario-step.types.ts +0 -262
- package/src/wirings/workflow/scenario-surface.test.ts +0 -146
- package/src/wirings/workflow/scenario-surface.ts +0 -71
- package/src/wirings/workflow/scenario.types.ts +0 -63
- package/src/wirings/workflow/workflow-approval-audit.ts +0 -47
- package/src/wirings/workflow/workflow-approval-policy.test.ts +0 -594
- package/src/wirings/workflow/workflow-approval-policy.ts +0 -68
- package/src/wirings/workflow/workflow-approval.ts +0 -290
- package/src/wirings/workflow/workflow-child-run-session.test.ts +0 -168
- package/src/wirings/workflow/workflow-constants.ts +0 -66
- package/src/wirings/workflow/workflow-dispatch-durability.test.ts +0 -116
- package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -55
- package/src/wirings/workflow/workflow-dispatch-relay.test.ts +0 -128
- package/src/wirings/workflow/workflow-errors.ts +0 -132
- package/src/wirings/workflow/workflow-inline-authority.test.ts +0 -175
- package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -51
- package/src/wirings/workflow/workflow-invocation-id.ts +0 -28
- package/src/wirings/workflow/workflow-meta-resolver.ts +0 -45
- package/src/wirings/workflow/workflow-mirror.test.ts +0 -171
- package/src/wirings/workflow/workflow-missing-meta.test.ts +0 -92
- package/src/wirings/workflow/workflow-on-error.test.ts +0 -145
- package/src/wirings/workflow/workflow-queue-routing.ts +0 -129
- package/src/wirings/workflow/workflow-queue-wiring.ts +0 -149
- package/src/wirings/workflow/workflow-queue-workers.test.ts +0 -131
- package/src/wirings/workflow/workflow-queue-workers.ts +0 -66
- package/src/wirings/workflow/workflow-recovery.ts +0 -192
- package/src/wirings/workflow/workflow-replay-snapshot.test.ts +0 -140
- package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -113
- package/src/wirings/workflow/workflow-run-authority.test.ts +0 -212
- package/src/wirings/workflow/workflow-run-context.test.ts +0 -172
- package/src/wirings/workflow/workflow-run-engine.types.ts +0 -92
- package/src/wirings/workflow/workflow-run-ownership.ts +0 -37
- package/src/wirings/workflow/workflow-run-polling.test.ts +0 -127
- package/src/wirings/workflow/workflow-stalled-recovery.test.ts +0 -152
- package/src/wirings/workflow/workflow-status-stream.test.ts +0 -354
- package/src/wirings/workflow/workflow-status-stream.ts +0 -144
- package/src/wirings/workflow/workflow-step-claim.ts +0 -46
- package/src/wirings/workflow/workflow-step-ordinal.test.ts +0 -94
- package/src/wirings/workflow/workflow-step-session.test.ts +0 -87
- package/src/wirings/workflow/workflow-suspend.ts +0 -61
- package/src/wirings/workflow/workflow-terminal-run-guard.test.ts +0 -105
- package/src/wirings/workflow/workflow.types.ts +0 -268
- package/src/wirings-stay-decoupled.test.ts +0 -130
- package/tsconfig.json +0 -14
- package/tsconfig.tsbuildinfo +0 -1
- package/tsconfig.type-tests.json +0 -15
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import { describe, test } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { InMemoryWorkflowService } from '../../services/in-memory-workflow-service.js'
|
|
5
|
-
import { pikkuState } from '../../pikku-state.js'
|
|
6
|
-
|
|
7
|
-
const silentLogger = { error() {}, info() {}, warn() {}, debug() {} }
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* `relayUndispatchedSteps` re-drives a run by putting it back on the
|
|
11
|
-
* orchestrator queue, so the queue is the observation point.
|
|
12
|
-
*/
|
|
13
|
-
function trackResumes(): { runIds: string[] } {
|
|
14
|
-
const seen: string[] = []
|
|
15
|
-
pikkuState(null, 'package', 'singletonServices', {
|
|
16
|
-
queueService: {
|
|
17
|
-
add: async (_queue: string, data: { runId: string }) => {
|
|
18
|
-
seen.push(data.runId)
|
|
19
|
-
},
|
|
20
|
-
},
|
|
21
|
-
logger: silentLogger,
|
|
22
|
-
} as any)
|
|
23
|
-
return { runIds: seen }
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/** Backdates a step's timestamp so it reads as undispatched. */
|
|
27
|
-
async function backdateSteps(
|
|
28
|
-
ws: InMemoryWorkflowService,
|
|
29
|
-
runId: string,
|
|
30
|
-
ms: number
|
|
31
|
-
): Promise<void> {
|
|
32
|
-
const past = new Date(Date.now() - ms)
|
|
33
|
-
for (const step of await ws.getRunHistory(runId)) {
|
|
34
|
-
;(step as any).updatedAt = past
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
describe('undispatched step relay', () => {
|
|
39
|
-
test('re-dispatches a step whose arming was lost', async () => {
|
|
40
|
-
const resumes = trackResumes()
|
|
41
|
-
const ws = new InMemoryWorkflowService()
|
|
42
|
-
const runId = await ws.createRun('flow', {}, false, 'hash', {
|
|
43
|
-
type: 'test',
|
|
44
|
-
})
|
|
45
|
-
// The row committed; the process died before the timer was armed.
|
|
46
|
-
await ws.insertStepState(runId, 'Wait 15s', null, { duration: 15000 })
|
|
47
|
-
await backdateSteps(ws, runId, 60_000)
|
|
48
|
-
|
|
49
|
-
const { redispatched } = await ws.relayUndispatchedSteps()
|
|
50
|
-
|
|
51
|
-
assert.deepEqual(redispatched, [runId], 'the run is re-dispatched')
|
|
52
|
-
assert.deepEqual(resumes.runIds, [runId], 'it is put back on the queue')
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
test('leaves a freshly written step alone', async () => {
|
|
56
|
-
const resumes = trackResumes()
|
|
57
|
-
const ws = new InMemoryWorkflowService()
|
|
58
|
-
const runId = await ws.createRun('flow', {}, false, 'hash', {
|
|
59
|
-
type: 'test',
|
|
60
|
-
})
|
|
61
|
-
// Written milliseconds ago — its dispatch is almost certainly in flight.
|
|
62
|
-
await ws.insertStepState(runId, 'Wait 15s', null, { duration: 15000 })
|
|
63
|
-
|
|
64
|
-
const { redispatched } = await ws.relayUndispatchedSteps()
|
|
65
|
-
|
|
66
|
-
assert.deepEqual(redispatched, [], 'nothing is re-dispatched')
|
|
67
|
-
assert.deepEqual(resumes.runIds, [], 'nothing is queued')
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
test('backs off rather than re-dispatching the same step every tick', async () => {
|
|
71
|
-
const resumes = trackResumes()
|
|
72
|
-
const ws = new InMemoryWorkflowService()
|
|
73
|
-
const runId = await ws.createRun('flow', {}, false, 'hash', {
|
|
74
|
-
type: 'test',
|
|
75
|
-
})
|
|
76
|
-
await ws.insertStepState(runId, 'Charge card', 'charge', {})
|
|
77
|
-
await backdateSteps(ws, runId, 60_000)
|
|
78
|
-
|
|
79
|
-
const first = await ws.relayUndispatchedSteps()
|
|
80
|
-
// The step is still pending — a real queue backlog looks exactly like this.
|
|
81
|
-
const second = await ws.relayUndispatchedSteps()
|
|
82
|
-
|
|
83
|
-
assert.deepEqual(first.redispatched, [runId], 'the first tick relays it')
|
|
84
|
-
assert.deepEqual(
|
|
85
|
-
second.redispatched,
|
|
86
|
-
[],
|
|
87
|
-
'the next tick is held off by the backoff'
|
|
88
|
-
)
|
|
89
|
-
assert.deepEqual(resumes.runIds, [runId], 'only one queue message')
|
|
90
|
-
})
|
|
91
|
-
|
|
92
|
-
test('ignores steps belonging to a settled run', async () => {
|
|
93
|
-
const resumes = trackResumes()
|
|
94
|
-
const ws = new InMemoryWorkflowService()
|
|
95
|
-
const runId = await ws.createRun('flow', {}, false, 'hash', {
|
|
96
|
-
type: 'test',
|
|
97
|
-
})
|
|
98
|
-
await ws.insertStepState(runId, 'Wait 15s', null, { duration: 15000 })
|
|
99
|
-
await backdateSteps(ws, runId, 60_000)
|
|
100
|
-
await ws.updateRunStatus(runId, 'completed', {})
|
|
101
|
-
|
|
102
|
-
const { redispatched } = await ws.relayUndispatchedSteps()
|
|
103
|
-
|
|
104
|
-
assert.deepEqual(redispatched, [], 'a finished run is not re-dispatched')
|
|
105
|
-
assert.deepEqual(resumes.runIds, [], 'nothing is queued')
|
|
106
|
-
})
|
|
107
|
-
|
|
108
|
-
test('re-dispatches each stuck run once per tick', async () => {
|
|
109
|
-
const resumes = trackResumes()
|
|
110
|
-
const ws = new InMemoryWorkflowService()
|
|
111
|
-
const runIds: string[] = []
|
|
112
|
-
for (const n of [1, 2]) {
|
|
113
|
-
const runId = await ws.createRun('flow', {}, false, 'hash', {
|
|
114
|
-
type: 'test',
|
|
115
|
-
})
|
|
116
|
-
// Two orphaned steps in one run must still produce a single resume.
|
|
117
|
-
await ws.insertStepState(runId, `Wait ${n}a`, null, { duration: 1000 })
|
|
118
|
-
await ws.insertStepState(runId, `Wait ${n}b`, null, { duration: 1000 })
|
|
119
|
-
await backdateSteps(ws, runId, 60_000)
|
|
120
|
-
runIds.push(runId)
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
const { redispatched } = await ws.relayUndispatchedSteps()
|
|
124
|
-
|
|
125
|
-
assert.deepEqual(redispatched.sort(), runIds.sort(), 'both runs relayed')
|
|
126
|
-
assert.equal(resumes.runIds.length, 2, 'one queue message per run')
|
|
127
|
-
})
|
|
128
|
-
})
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import { PikkuError, addError } from '../../errors/error-handler.js'
|
|
2
|
-
import type { ApprovalOutcome } from './workflow.types.js'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Thrown to unwind a run that cannot continue on this tick. Not a failure:
|
|
6
|
-
* the run resumes from its recorded step state.
|
|
7
|
-
*/
|
|
8
|
-
export class WorkflowAsyncException extends Error {
|
|
9
|
-
constructor(
|
|
10
|
-
public readonly runId: string,
|
|
11
|
-
public readonly stepName: string
|
|
12
|
-
) {
|
|
13
|
-
super(`Workflow paused at step: ${stepName}`)
|
|
14
|
-
this.name = 'WorkflowAsyncException'
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Thrown inside a workflow step when the run has been cancelled, so the step
|
|
20
|
-
* stops rather than finishing work nobody wants.
|
|
21
|
-
*/
|
|
22
|
-
export class WorkflowCancelledException extends Error {
|
|
23
|
-
constructor(
|
|
24
|
-
public readonly runId: string,
|
|
25
|
-
public readonly reason?: string
|
|
26
|
-
) {
|
|
27
|
-
super(reason || 'Workflow cancelled')
|
|
28
|
-
this.name = 'WorkflowCancelledException'
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export class WorkflowSuspendedException extends Error {
|
|
33
|
-
constructor(
|
|
34
|
-
public readonly runId: string,
|
|
35
|
-
public readonly reason: string
|
|
36
|
-
) {
|
|
37
|
-
super(reason || 'Workflow suspended')
|
|
38
|
-
this.name = 'WorkflowSuspendedException'
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export class WorkflowDispatchException extends Error {
|
|
43
|
-
constructor(
|
|
44
|
-
public readonly runId: string,
|
|
45
|
-
public readonly stepName: string,
|
|
46
|
-
options?: { cause?: unknown }
|
|
47
|
-
) {
|
|
48
|
-
super(
|
|
49
|
-
`Failed to dispatch workflow step '${stepName}' (run ${runId})`,
|
|
50
|
-
options
|
|
51
|
-
)
|
|
52
|
-
this.name = 'WorkflowDispatchException'
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export class WorkflowNotFoundError extends PikkuError {
|
|
57
|
-
constructor(name: string) {
|
|
58
|
-
super(`Workflow not found: ${name}`)
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
addError(WorkflowNotFoundError, {
|
|
62
|
-
status: 404,
|
|
63
|
-
message: 'Workflow not found.',
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
export class WorkflowRunNotFoundError extends PikkuError {
|
|
67
|
-
constructor(runId: string) {
|
|
68
|
-
super(`Workflow run not found: ${runId}`)
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
addError(WorkflowRunNotFoundError, {
|
|
72
|
-
status: 404,
|
|
73
|
-
message: 'Workflow run not found.',
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
export class WorkflowRunFailedError extends PikkuError {
|
|
77
|
-
public payload: { message?: string }
|
|
78
|
-
constructor(message?: string) {
|
|
79
|
-
super(`Workflow run failed: ${message ?? 'unknown'}`)
|
|
80
|
-
this.payload = { message }
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
addError(WorkflowRunFailedError, {
|
|
84
|
-
status: 422,
|
|
85
|
-
message: 'Workflow run failed.',
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
export class WorkflowRunCancelledError extends PikkuError {
|
|
89
|
-
constructor() {
|
|
90
|
-
super('Workflow was cancelled')
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
addError(WorkflowRunCancelledError, {
|
|
94
|
-
status: 409,
|
|
95
|
-
message: 'Workflow was cancelled.',
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
export class WorkflowApprovalResolvedError extends PikkuError {
|
|
99
|
-
public payload: {
|
|
100
|
-
reason: string
|
|
101
|
-
outcome: ApprovalOutcome<unknown>['status']
|
|
102
|
-
}
|
|
103
|
-
constructor(reason: string, outcome: ApprovalOutcome<unknown>['status']) {
|
|
104
|
-
super(`Approval already ${outcome}: ${reason}`)
|
|
105
|
-
this.payload = { reason, outcome }
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
addError(WorkflowApprovalResolvedError, {
|
|
109
|
-
status: 409,
|
|
110
|
-
message: 'Approval has already been resolved.',
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
export class WorkflowStepFunctionMismatchError extends PikkuError {
|
|
114
|
-
constructor(
|
|
115
|
-
public readonly runId: string,
|
|
116
|
-
public readonly stepName: string
|
|
117
|
-
) {
|
|
118
|
-
super(
|
|
119
|
-
`Workflow step '${stepName}' (run ${runId}) was dispatched with a different function`
|
|
120
|
-
)
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
addError(WorkflowStepFunctionMismatchError, {
|
|
124
|
-
status: 409,
|
|
125
|
-
message: 'Workflow step was dispatched with a different function.',
|
|
126
|
-
})
|
|
127
|
-
|
|
128
|
-
export class WorkflowStepNameNotString extends Error {
|
|
129
|
-
constructor(stepName: unknown) {
|
|
130
|
-
super(`Workflow step name must be a string. Received: ${typeof stepName}`)
|
|
131
|
-
}
|
|
132
|
-
}
|
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
import { describe, test } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { InMemoryWorkflowService } from '../../services/in-memory-workflow-service.js'
|
|
5
|
-
import { pikkuState } from '../../pikku-state.js'
|
|
6
|
-
import type {
|
|
7
|
-
WorkflowPlannedStep,
|
|
8
|
-
WorkflowRun,
|
|
9
|
-
WorkflowRunWire,
|
|
10
|
-
} from './workflow.types.js'
|
|
11
|
-
|
|
12
|
-
const silentLogger = { error() {}, info() {}, warn() {}, debug() {} }
|
|
13
|
-
|
|
14
|
-
const installSingletons = () =>
|
|
15
|
-
pikkuState(null, 'package', 'singletonServices', {
|
|
16
|
-
queueService: { add: async () => {} },
|
|
17
|
-
logger: silentLogger,
|
|
18
|
-
} as any)
|
|
19
|
-
|
|
20
|
-
class SharedStoreWorkflowService extends InMemoryWorkflowService {
|
|
21
|
-
constructor(private readonly runStore: Map<string, WorkflowRun>) {
|
|
22
|
-
super()
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
protected override async createRunImpl(
|
|
26
|
-
workflowName: string,
|
|
27
|
-
input: any,
|
|
28
|
-
inline: boolean,
|
|
29
|
-
graphHash: string,
|
|
30
|
-
wire: WorkflowRunWire,
|
|
31
|
-
options?: {
|
|
32
|
-
deterministic?: boolean
|
|
33
|
-
plannedSteps?: WorkflowPlannedStep[]
|
|
34
|
-
}
|
|
35
|
-
): Promise<string> {
|
|
36
|
-
const runId = await super.createRunImpl(
|
|
37
|
-
workflowName,
|
|
38
|
-
input,
|
|
39
|
-
inline,
|
|
40
|
-
graphHash,
|
|
41
|
-
wire,
|
|
42
|
-
options
|
|
43
|
-
)
|
|
44
|
-
this.runStore.set(runId, (await super.getRun(runId))!)
|
|
45
|
-
return runId
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
override async getRun(id: string): Promise<WorkflowRun | null> {
|
|
49
|
-
return this.runStore.get(id) ?? null
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
describe('whether a run is inline is decided by the run record, not by the process', () => {
|
|
54
|
-
test('an instance that did not start the run still knows it is inline', async () => {
|
|
55
|
-
installSingletons()
|
|
56
|
-
const store = new Map<string, WorkflowRun>()
|
|
57
|
-
const starter = new SharedStoreWorkflowService(store) as any
|
|
58
|
-
const observer = new SharedStoreWorkflowService(store) as any
|
|
59
|
-
|
|
60
|
-
const runId = await starter.createRun('flow', {}, true, 'hash', {
|
|
61
|
-
type: 'test',
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
assert.equal(await starter.isInline(runId), true)
|
|
65
|
-
assert.equal(
|
|
66
|
-
await observer.isInline(runId),
|
|
67
|
-
true,
|
|
68
|
-
'a second instance dispatched a queued job for a run that is already executing in-process'
|
|
69
|
-
)
|
|
70
|
-
})
|
|
71
|
-
|
|
72
|
-
test('an instance that did not start the run still knows it is queued', async () => {
|
|
73
|
-
installSingletons()
|
|
74
|
-
const store = new Map<string, WorkflowRun>()
|
|
75
|
-
const starter = new SharedStoreWorkflowService(store) as any
|
|
76
|
-
const observer = new SharedStoreWorkflowService(store) as any
|
|
77
|
-
|
|
78
|
-
const runId = await starter.createRun('flow', {}, false, 'hash', {
|
|
79
|
-
type: 'test',
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
assert.equal(await starter.isInline(runId), false)
|
|
83
|
-
assert.equal(await observer.isInline(runId), false)
|
|
84
|
-
})
|
|
85
|
-
|
|
86
|
-
test('asking whether an unknown run is inline creates no state', async () => {
|
|
87
|
-
installSingletons()
|
|
88
|
-
const store = new Map<string, WorkflowRun>()
|
|
89
|
-
const ws = new SharedStoreWorkflowService(store) as any
|
|
90
|
-
|
|
91
|
-
assert.equal(await ws.isInline('no-such-run'), false)
|
|
92
|
-
assert.equal(ws.runContexts.size, 0)
|
|
93
|
-
})
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
describe('a run that stops executing here leaves no per-run state behind', () => {
|
|
97
|
-
const service = () => {
|
|
98
|
-
installSingletons()
|
|
99
|
-
return new InMemoryWorkflowService() as any
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
test('an inline run releases its ordinals when it unregisters', async () => {
|
|
103
|
-
const ws = service()
|
|
104
|
-
const before = ws.runContexts.size
|
|
105
|
-
const runId = await ws.createRun('flow', {}, true, 'hash', { type: 'test' })
|
|
106
|
-
|
|
107
|
-
await ws.inlineStep(runId, 'a', async () => 1)
|
|
108
|
-
await ws.inlineStep(runId, 'a', async () => 2)
|
|
109
|
-
ws.unregisterInlineRun(runId)
|
|
110
|
-
|
|
111
|
-
assert.equal(
|
|
112
|
-
ws.runContexts.size,
|
|
113
|
-
before,
|
|
114
|
-
'the ordinals map outlived the run that owned it'
|
|
115
|
-
)
|
|
116
|
-
})
|
|
117
|
-
|
|
118
|
-
test('a completed run releases the ordinals a step left behind', async () => {
|
|
119
|
-
const ws = service()
|
|
120
|
-
const before = ws.runContexts.size
|
|
121
|
-
const runId = await ws.createRun('flow', {}, false, 'hash', {
|
|
122
|
-
type: 'test',
|
|
123
|
-
})
|
|
124
|
-
|
|
125
|
-
await ws.inlineStep(runId, 'a', async () => 1)
|
|
126
|
-
await ws.updateRunStatus(runId, 'completed', 1)
|
|
127
|
-
|
|
128
|
-
assert.equal(
|
|
129
|
-
ws.runContexts.size,
|
|
130
|
-
before,
|
|
131
|
-
'a terminal run still held its replay state'
|
|
132
|
-
)
|
|
133
|
-
})
|
|
134
|
-
|
|
135
|
-
test('a failed run releases the ordinals a step left behind', async () => {
|
|
136
|
-
const ws = service()
|
|
137
|
-
const before = ws.runContexts.size
|
|
138
|
-
const runId = await ws.createRun('flow', {}, false, 'hash', {
|
|
139
|
-
type: 'test',
|
|
140
|
-
})
|
|
141
|
-
|
|
142
|
-
await ws.inlineStep(runId, 'a', async () => 1)
|
|
143
|
-
await ws.updateRunStatus(runId, 'failed', undefined, { message: 'boom' })
|
|
144
|
-
|
|
145
|
-
assert.equal(ws.runContexts.size, before)
|
|
146
|
-
})
|
|
147
|
-
|
|
148
|
-
test('running a queued step releases its context when the step returns', async () => {
|
|
149
|
-
const ws = service()
|
|
150
|
-
const before = ws.runContexts.size
|
|
151
|
-
const runId = await ws.createRun('flow', {}, false, 'hash', {
|
|
152
|
-
type: 'test',
|
|
153
|
-
})
|
|
154
|
-
await ws.insertStepState(runId, 'a', 'someRpc', {})
|
|
155
|
-
|
|
156
|
-
await ws.executeWorkflowStep(
|
|
157
|
-
runId,
|
|
158
|
-
'a',
|
|
159
|
-
'someRpc',
|
|
160
|
-
{},
|
|
161
|
-
{
|
|
162
|
-
rpcWithWire: async () => {
|
|
163
|
-
await ws.inlineStep(runId, 'nested', async () => 'ok')
|
|
164
|
-
return 'ok'
|
|
165
|
-
},
|
|
166
|
-
}
|
|
167
|
-
)
|
|
168
|
-
|
|
169
|
-
assert.equal(
|
|
170
|
-
ws.runContexts.size,
|
|
171
|
-
before,
|
|
172
|
-
'the step worker kept per-run state for a run it no longer executes'
|
|
173
|
-
)
|
|
174
|
-
})
|
|
175
|
-
})
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { describe, test } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { uuidv5, deriveInvocationId } from './workflow-invocation-id.js'
|
|
5
|
-
|
|
6
|
-
const UUID_RE =
|
|
7
|
-
/^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/
|
|
8
|
-
|
|
9
|
-
describe('uuidv5', () => {
|
|
10
|
-
test('matches the canonical RFC 4122 v5 vector', () => {
|
|
11
|
-
const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'
|
|
12
|
-
assert.equal(
|
|
13
|
-
uuidv5('www.example.com', DNS),
|
|
14
|
-
'2ed6657d-e927-568b-95e1-2665a8aea6a2'
|
|
15
|
-
)
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
test('is deterministic and sets version 5 + RFC variant bits', () => {
|
|
19
|
-
const a = uuidv5('hello')
|
|
20
|
-
const b = uuidv5('hello')
|
|
21
|
-
assert.equal(a, b, 'same input → same UUID')
|
|
22
|
-
assert.match(a, UUID_RE, 'version nibble is 5 and variant is 8/9/a/b')
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
test('different names produce different UUIDs', () => {
|
|
26
|
-
assert.notEqual(uuidv5('a'), uuidv5('b'))
|
|
27
|
-
})
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
describe('deriveInvocationId', () => {
|
|
31
|
-
test('is stable across calls for the same run + step (the dedupe key)', () => {
|
|
32
|
-
const id1 = deriveInvocationId('run-1', 'updateUser')
|
|
33
|
-
const id2 = deriveInvocationId('run-1', 'updateUser')
|
|
34
|
-
assert.equal(id1, id2)
|
|
35
|
-
assert.match(id1, UUID_RE)
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
test('differs per step name within a run', () => {
|
|
39
|
-
assert.notEqual(
|
|
40
|
-
deriveInvocationId('run-1', 'updateUser'),
|
|
41
|
-
deriveInvocationId('run-1', 'chargeCard')
|
|
42
|
-
)
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
test('differs per run for the same step name', () => {
|
|
46
|
-
assert.notEqual(
|
|
47
|
-
deriveInvocationId('run-1', 'updateUser'),
|
|
48
|
-
deriveInvocationId('run-2', 'updateUser')
|
|
49
|
-
)
|
|
50
|
-
})
|
|
51
|
-
})
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { createHash } from 'node:crypto'
|
|
2
|
-
|
|
3
|
-
const PIKKU_WORKFLOW_NAMESPACE = '70696b6b-7500-5770-9f6c-6f77000a0001'
|
|
4
|
-
|
|
5
|
-
const parseUuid = (uuid: string): Buffer =>
|
|
6
|
-
Buffer.from(uuid.replace(/-/g, ''), 'hex')
|
|
7
|
-
|
|
8
|
-
const formatUuid = (bytes: Buffer): string => {
|
|
9
|
-
const hex = bytes.toString('hex')
|
|
10
|
-
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export const uuidv5 = (
|
|
14
|
-
name: string,
|
|
15
|
-
namespace: string = PIKKU_WORKFLOW_NAMESPACE
|
|
16
|
-
): string => {
|
|
17
|
-
const hash = createHash('sha1')
|
|
18
|
-
.update(parseUuid(namespace))
|
|
19
|
-
.update(name, 'utf8')
|
|
20
|
-
.digest()
|
|
21
|
-
const bytes = hash.subarray(0, 16)
|
|
22
|
-
bytes[6] = (bytes[6]! & 0x0f) | 0x50
|
|
23
|
-
bytes[8] = (bytes[8]! & 0x3f) | 0x80
|
|
24
|
-
return formatUuid(bytes)
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export const deriveInvocationId = (runId: string, stepName: string): string =>
|
|
28
|
-
uuidv5(`${runId}:${stepName}`)
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { pikkuState } from '../../pikku-state.js'
|
|
2
|
-
import type { WorkflowRuntimeMeta } from './workflow.types.js'
|
|
3
|
-
|
|
4
|
-
export type ResolvedWorkflowMeta = {
|
|
5
|
-
meta: WorkflowRuntimeMeta
|
|
6
|
-
packageName: string | null
|
|
7
|
-
resolvedName: string
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Resolves a workflow name against the root registry, then — for a
|
|
12
|
-
* `namespace:name` form — against the addon package that claims the namespace.
|
|
13
|
-
*/
|
|
14
|
-
export const resolveWorkflowMeta = (
|
|
15
|
-
name: string
|
|
16
|
-
): ResolvedWorkflowMeta | null => {
|
|
17
|
-
const rootMeta = pikkuState(null, 'workflows', 'meta')
|
|
18
|
-
if (rootMeta[name]) {
|
|
19
|
-
return { meta: rootMeta[name], packageName: null, resolvedName: name }
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const colonIndex = name.indexOf(':')
|
|
23
|
-
if (colonIndex === -1) {
|
|
24
|
-
return null
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const namespace = name.substring(0, colonIndex)
|
|
28
|
-
const localName = name.substring(colonIndex + 1)
|
|
29
|
-
const addons = pikkuState(null, 'addons', 'packages')
|
|
30
|
-
const pkgConfig = addons?.get(namespace)
|
|
31
|
-
if (!pkgConfig) {
|
|
32
|
-
return null
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const addonMeta = pikkuState(pkgConfig.package, 'workflows', 'meta')
|
|
36
|
-
if (!addonMeta?.[localName]) {
|
|
37
|
-
return null
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return {
|
|
41
|
-
meta: addonMeta[localName],
|
|
42
|
-
packageName: pkgConfig.package,
|
|
43
|
-
resolvedName: localName,
|
|
44
|
-
}
|
|
45
|
-
}
|