@pikku/core 0.12.107 → 0.12.111
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 +344 -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/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/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,242 +0,0 @@
|
|
|
1
|
-
import { createReadStream, createWriteStream, promises } from 'fs'
|
|
2
|
-
import { mkdir, readFile } from 'fs/promises'
|
|
3
|
-
import { resolve, normalize } from 'path'
|
|
4
|
-
import type {
|
|
5
|
-
BucketKeyArgs,
|
|
6
|
-
ContentService,
|
|
7
|
-
CopyFileArgs,
|
|
8
|
-
GetUploadURLArgs,
|
|
9
|
-
JWTService,
|
|
10
|
-
Logger,
|
|
11
|
-
SignContentKeyArgs,
|
|
12
|
-
SignURLArgs,
|
|
13
|
-
UploadURLResult,
|
|
14
|
-
WriteFileArgs,
|
|
15
|
-
} from '@pikku/core/services'
|
|
16
|
-
import { pipeline } from 'stream/promises'
|
|
17
|
-
import type { Readable } from 'stream'
|
|
18
|
-
|
|
19
|
-
export interface LocalContentConfig {
|
|
20
|
-
localFileUploadPath: string
|
|
21
|
-
uploadUrlPrefix: string
|
|
22
|
-
assetUrlPrefix: string
|
|
23
|
-
server?: string
|
|
24
|
-
sizeLimit?: string
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* The representation of an asset that gets bound into a signed URL's
|
|
29
|
-
* signature, and that a server can reconstruct from an incoming request:
|
|
30
|
-
* the decoded path, without origin or query string.
|
|
31
|
-
*
|
|
32
|
-
* Both sides must derive it the same way, so signer and verifier share this
|
|
33
|
-
* function. Percent escapes are decoded so that a client re-encoding an
|
|
34
|
-
* optional character still matches; a malformed escape is left verbatim
|
|
35
|
-
* rather than throwing, which keeps both sides in agreement.
|
|
36
|
-
*/
|
|
37
|
-
export const signedContentPath = (urlOrPath: string): string => {
|
|
38
|
-
let pathname: string
|
|
39
|
-
try {
|
|
40
|
-
pathname = new URL(urlOrPath, 'http://pikku.local').pathname
|
|
41
|
-
} catch {
|
|
42
|
-
pathname = urlOrPath
|
|
43
|
-
}
|
|
44
|
-
try {
|
|
45
|
-
return decodeURIComponent(pathname)
|
|
46
|
-
} catch {
|
|
47
|
-
return pathname
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/** How long a presigned upload URL stays valid. Short, like an S3 PUT URL. */
|
|
52
|
-
const UPLOAD_URL_TTL_MS = 15 * 60 * 1000
|
|
53
|
-
|
|
54
|
-
export class LocalContent implements ContentService {
|
|
55
|
-
constructor(
|
|
56
|
-
private config: LocalContentConfig,
|
|
57
|
-
private logger: Logger,
|
|
58
|
-
private jwt: JWTService
|
|
59
|
-
) {
|
|
60
|
-
if (!jwt) {
|
|
61
|
-
throw new Error(
|
|
62
|
-
'LocalContent requires a JWTService: without one it cannot sign asset URLs, and unsigned URLs cannot be verified.'
|
|
63
|
-
)
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
private safePath(bucket: string, key: string): string {
|
|
68
|
-
const base = resolve(this.config.localFileUploadPath)
|
|
69
|
-
const scoped = resolve(base, normalize(bucket))
|
|
70
|
-
const target = resolve(scoped, normalize(key))
|
|
71
|
-
if (!target.startsWith(base + '/') && target !== base) {
|
|
72
|
-
throw new Error('Invalid asset key')
|
|
73
|
-
}
|
|
74
|
-
return target
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
private joinKey(bucket: string, key: string): string {
|
|
78
|
-
return `${bucket}/${key}`
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
public async init() {}
|
|
82
|
-
|
|
83
|
-
private async signParams(
|
|
84
|
-
url: string,
|
|
85
|
-
dateLessThan: Date,
|
|
86
|
-
dateGreaterThan?: Date
|
|
87
|
-
): Promise<string> {
|
|
88
|
-
const signedAt = Date.now()
|
|
89
|
-
const expiresAt = dateLessThan.getTime()
|
|
90
|
-
const params = new URLSearchParams({
|
|
91
|
-
signedAt: String(signedAt),
|
|
92
|
-
expiresAt: String(expiresAt),
|
|
93
|
-
})
|
|
94
|
-
if (dateGreaterThan) {
|
|
95
|
-
params.set('notBefore', String(dateGreaterThan.getTime()))
|
|
96
|
-
}
|
|
97
|
-
const expiresInSeconds = Math.max(
|
|
98
|
-
1,
|
|
99
|
-
Math.floor((expiresAt - signedAt) / 1000)
|
|
100
|
-
)
|
|
101
|
-
const payload: {
|
|
102
|
-
signedAt: number
|
|
103
|
-
expiresAt: number
|
|
104
|
-
notBefore?: number
|
|
105
|
-
path: string
|
|
106
|
-
} = {
|
|
107
|
-
signedAt,
|
|
108
|
-
expiresAt,
|
|
109
|
-
path: signedContentPath(url),
|
|
110
|
-
}
|
|
111
|
-
if (dateGreaterThan) {
|
|
112
|
-
payload.notBefore = dateGreaterThan.getTime()
|
|
113
|
-
}
|
|
114
|
-
const signature = await this.jwt.encode(
|
|
115
|
-
{ value: expiresInSeconds, unit: 'second' },
|
|
116
|
-
payload
|
|
117
|
-
)
|
|
118
|
-
params.set('signature', signature)
|
|
119
|
-
return params.toString()
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
public async signURL(args: SignURLArgs): Promise<string> {
|
|
123
|
-
const params = await this.signParams(
|
|
124
|
-
args.url,
|
|
125
|
-
args.dateLessThan,
|
|
126
|
-
args.dateGreaterThan
|
|
127
|
-
)
|
|
128
|
-
return `${args.url}?${params}`
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
public async signContentKey(args: SignContentKeyArgs): Promise<string> {
|
|
132
|
-
const fullKey = this.joinKey(args.bucket, args.contentKey)
|
|
133
|
-
const base = this.config.server
|
|
134
|
-
? `${this.config.server}${this.config.assetUrlPrefix}/${fullKey}`
|
|
135
|
-
: `${this.config.assetUrlPrefix}/${fullKey}`
|
|
136
|
-
return this.signURL({
|
|
137
|
-
url: base,
|
|
138
|
-
dateLessThan: args.dateLessThan,
|
|
139
|
-
dateGreaterThan: args.dateGreaterThan,
|
|
140
|
-
})
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Presigned upload, mirroring the read side: the URL carries a short-lived,
|
|
145
|
-
* path-bound signature that {@link createLocalContentRequestHandler} verifies
|
|
146
|
-
* before writing. An unsigned upload URL cannot be verified, and the handler
|
|
147
|
-
* now refuses one — so this must sign, or every upload 403s.
|
|
148
|
-
*/
|
|
149
|
-
public async getUploadURL(args: GetUploadURLArgs): Promise<UploadURLResult> {
|
|
150
|
-
void args.visibility
|
|
151
|
-
const fullKey = this.joinKey(args.bucket, args.fileKey)
|
|
152
|
-
this.logger.debug(`Going to upload with key: ${fullKey}`)
|
|
153
|
-
const uploadUrl = await this.signURL({
|
|
154
|
-
url: `${this.config.uploadUrlPrefix}/${fullKey}`,
|
|
155
|
-
dateLessThan: new Date(Date.now() + UPLOAD_URL_TTL_MS),
|
|
156
|
-
})
|
|
157
|
-
return {
|
|
158
|
-
uploadUrl,
|
|
159
|
-
assetKey: fullKey,
|
|
160
|
-
uploadMethod: 'PUT',
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
public async writeFile(args: WriteFileArgs): Promise<boolean> {
|
|
165
|
-
this.logger.debug(`Writing file: ${args.bucket}/${args.key}`)
|
|
166
|
-
|
|
167
|
-
const path = this.safePath(args.bucket, args.key)
|
|
168
|
-
|
|
169
|
-
try {
|
|
170
|
-
await this.createDirectoryForFile(path)
|
|
171
|
-
const fileStream = createWriteStream(path)
|
|
172
|
-
await pipeline(args.stream as Readable, fileStream)
|
|
173
|
-
return true
|
|
174
|
-
} catch (e) {
|
|
175
|
-
console.error(e)
|
|
176
|
-
this.logger.error(`Error writing content ${args.bucket}/${args.key}`, e)
|
|
177
|
-
return false
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
public async copyFile(args: CopyFileArgs): Promise<boolean> {
|
|
182
|
-
this.logger.debug(`Writing file: ${args.bucket}/${args.key}`)
|
|
183
|
-
try {
|
|
184
|
-
const path = this.safePath(args.bucket, args.key)
|
|
185
|
-
await this.createDirectoryForFile(path)
|
|
186
|
-
await promises.copyFile(args.fromAbsolutePath, path)
|
|
187
|
-
return true
|
|
188
|
-
} catch (e) {
|
|
189
|
-
console.error(e)
|
|
190
|
-
this.logger.error(`Error inserting content ${args.bucket}/${args.key}`, e)
|
|
191
|
-
}
|
|
192
|
-
return false
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
public async readFile(
|
|
196
|
-
args: BucketKeyArgs
|
|
197
|
-
): Promise<ReadableStream | NodeJS.ReadableStream> {
|
|
198
|
-
this.logger.debug(`Getting key: ${args.bucket}/${args.key}`)
|
|
199
|
-
|
|
200
|
-
const filePath = this.safePath(args.bucket, args.key)
|
|
201
|
-
|
|
202
|
-
try {
|
|
203
|
-
const stream = createReadStream(filePath)
|
|
204
|
-
stream.on('error', (err) => {
|
|
205
|
-
this.logger.error(
|
|
206
|
-
`Error getting content ${args.bucket}/${args.key}`,
|
|
207
|
-
err
|
|
208
|
-
)
|
|
209
|
-
})
|
|
210
|
-
|
|
211
|
-
return stream
|
|
212
|
-
} catch (e) {
|
|
213
|
-
this.logger.error(
|
|
214
|
-
`Error setting up stream for ${args.bucket}/${args.key}`,
|
|
215
|
-
e
|
|
216
|
-
)
|
|
217
|
-
throw e
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
public async readFileAsBuffer(args: BucketKeyArgs): Promise<Buffer> {
|
|
222
|
-
const filePath = this.safePath(args.bucket, args.key)
|
|
223
|
-
this.logger.debug(`Reading file as buffer: ${args.bucket}/${args.key}`)
|
|
224
|
-
return readFile(filePath)
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
public async deleteFile(args: BucketKeyArgs): Promise<boolean> {
|
|
228
|
-
this.logger.debug(`deleting key: ${args.bucket}/${args.key}`)
|
|
229
|
-
try {
|
|
230
|
-
await promises.unlink(this.safePath(args.bucket, args.key))
|
|
231
|
-
return true
|
|
232
|
-
} catch (e: any) {
|
|
233
|
-
this.logger.error(`Error deleting content ${args.bucket}/${args.key}`, e)
|
|
234
|
-
}
|
|
235
|
-
return false
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
private async createDirectoryForFile(path: string): Promise<void> {
|
|
239
|
-
const dir = path.split('/').slice(0, -1).join('/')
|
|
240
|
-
await mkdir(dir, { recursive: true })
|
|
241
|
-
}
|
|
242
|
-
}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import type { CredentialService } from './credential-service.js'
|
|
2
|
-
|
|
3
|
-
export class LocalCredentialService implements CredentialService {
|
|
4
|
-
private store: Map<string, unknown> = new Map()
|
|
5
|
-
|
|
6
|
-
private makeKey(name: string, userId?: string): string {
|
|
7
|
-
return userId ? `${userId}:${name}` : name
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
async get<T = unknown>(name: string, userId?: string): Promise<T | null> {
|
|
11
|
-
const key = this.makeKey(name, userId)
|
|
12
|
-
const value = this.store.get(key)
|
|
13
|
-
return (value as T) ?? null
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
async set(name: string, value: unknown, userId?: string): Promise<void> {
|
|
17
|
-
const key = this.makeKey(name, userId)
|
|
18
|
-
this.store.set(key, value)
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
async delete(name: string, userId?: string): Promise<void> {
|
|
22
|
-
const key = this.makeKey(name, userId)
|
|
23
|
-
this.store.delete(key)
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
async has(name: string, userId?: string): Promise<boolean> {
|
|
27
|
-
const key = this.makeKey(name, userId)
|
|
28
|
-
return this.store.has(key)
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
async getAll(userId: string): Promise<Record<string, unknown>> {
|
|
32
|
-
const prefix = `${userId}:`
|
|
33
|
-
const result: Record<string, unknown> = {}
|
|
34
|
-
for (const [key, value] of this.store) {
|
|
35
|
-
if (key.startsWith(prefix)) {
|
|
36
|
-
result[key.slice(prefix.length)] = value
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return result
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
async getUsersWithCredential(name: string): Promise<string[]> {
|
|
43
|
-
const suffix = `:${name}`
|
|
44
|
-
const users: string[] = []
|
|
45
|
-
for (const key of this.store.keys()) {
|
|
46
|
-
if (key.endsWith(suffix)) {
|
|
47
|
-
users.push(key.slice(0, -suffix.length))
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return users
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
async getAllUsers(): Promise<string[]> {
|
|
54
|
-
const users = new Set<string>()
|
|
55
|
-
for (const key of this.store.keys()) {
|
|
56
|
-
const colonIndex = key.indexOf(':')
|
|
57
|
-
if (colonIndex > 0) {
|
|
58
|
-
users.add(key.slice(0, colonIndex))
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return [...users]
|
|
62
|
-
}
|
|
63
|
-
}
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict'
|
|
2
|
-
import { test } from 'node:test'
|
|
3
|
-
|
|
4
|
-
import { LocalEmailService } from './local-email-service.js'
|
|
5
|
-
|
|
6
|
-
test('LocalEmailService logs sent email metadata as JSON', async () => {
|
|
7
|
-
const service = new LocalEmailService()
|
|
8
|
-
const writes: string[] = []
|
|
9
|
-
const originalInfo = console.info
|
|
10
|
-
console.info = (value?: unknown) => {
|
|
11
|
-
writes.push(String(value))
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
try {
|
|
15
|
-
await service.send({
|
|
16
|
-
to: 'user@example.com',
|
|
17
|
-
from: 'hello@example.com',
|
|
18
|
-
subject: 'Welcome',
|
|
19
|
-
template: {
|
|
20
|
-
name: 'welcome',
|
|
21
|
-
locale: 'en',
|
|
22
|
-
data: { userName: 'Yasser' },
|
|
23
|
-
},
|
|
24
|
-
})
|
|
25
|
-
} finally {
|
|
26
|
-
console.info = originalInfo
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
assert.equal(writes.length, 1)
|
|
30
|
-
const payload = JSON.parse(writes[0])
|
|
31
|
-
assert.equal(payload.type, 'email')
|
|
32
|
-
assert.equal(payload.message, 'this email was sent')
|
|
33
|
-
assert.equal(payload.to, 'user@example.com')
|
|
34
|
-
assert.equal(payload.from, 'hello@example.com')
|
|
35
|
-
assert.equal(payload.subject, 'Welcome')
|
|
36
|
-
assert.deepEqual(payload.template, {
|
|
37
|
-
name: 'welcome',
|
|
38
|
-
locale: 'en',
|
|
39
|
-
data: { userName: 'Yasser' },
|
|
40
|
-
})
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
test('LocalEmailService logs htmlLength and textLength for HTML email', async () => {
|
|
44
|
-
const service = new LocalEmailService()
|
|
45
|
-
const writes: string[] = []
|
|
46
|
-
const originalInfo = console.info
|
|
47
|
-
console.info = (value?: unknown) => {
|
|
48
|
-
writes.push(String(value))
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
try {
|
|
52
|
-
await service.send({
|
|
53
|
-
to: 'user@example.com',
|
|
54
|
-
html: '<p>Hello</p>',
|
|
55
|
-
text: 'Hello',
|
|
56
|
-
})
|
|
57
|
-
} finally {
|
|
58
|
-
console.info = originalInfo
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const payload = JSON.parse(writes[0])
|
|
62
|
-
assert.equal(payload.htmlLength, '<p>Hello</p>'.length)
|
|
63
|
-
assert.equal(payload.textLength, 'Hello'.length)
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
test('LocalEmailService logs textLength only for plain text email', async () => {
|
|
67
|
-
const service = new LocalEmailService()
|
|
68
|
-
const writes: string[] = []
|
|
69
|
-
const originalInfo = console.info
|
|
70
|
-
console.info = (value?: unknown) => {
|
|
71
|
-
writes.push(String(value))
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
try {
|
|
75
|
-
await service.send({
|
|
76
|
-
to: 'user@example.com',
|
|
77
|
-
text: 'Plain text body',
|
|
78
|
-
})
|
|
79
|
-
} finally {
|
|
80
|
-
console.info = originalInfo
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const payload = JSON.parse(writes[0])
|
|
84
|
-
assert.equal(payload.textLength, 'Plain text body'.length)
|
|
85
|
-
assert.equal(payload.htmlLength, undefined)
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
test('LocalEmailService logs null textLength for HTML email without plain text', async () => {
|
|
89
|
-
const service = new LocalEmailService()
|
|
90
|
-
const writes: string[] = []
|
|
91
|
-
const originalInfo = console.info
|
|
92
|
-
console.info = (value?: unknown) => {
|
|
93
|
-
writes.push(String(value))
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
try {
|
|
97
|
-
await service.send({
|
|
98
|
-
to: 'user@example.com',
|
|
99
|
-
html: '<p>Hello</p>',
|
|
100
|
-
})
|
|
101
|
-
} finally {
|
|
102
|
-
console.info = originalInfo
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
const payload = JSON.parse(writes[0])
|
|
106
|
-
assert.equal(payload.htmlLength, '<p>Hello</p>'.length)
|
|
107
|
-
assert.equal(payload.textLength, null)
|
|
108
|
-
})
|
|
109
|
-
|
|
110
|
-
test('LocalEmailService logs attachment metadata without the content', async () => {
|
|
111
|
-
const service = new LocalEmailService()
|
|
112
|
-
const writes: string[] = []
|
|
113
|
-
const originalInfo = console.info
|
|
114
|
-
console.info = (value?: unknown) => {
|
|
115
|
-
writes.push(String(value))
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
try {
|
|
119
|
-
await service.send({
|
|
120
|
-
to: 'user@example.com',
|
|
121
|
-
html: '<img src="cid:logo" />',
|
|
122
|
-
attachments: [
|
|
123
|
-
{
|
|
124
|
-
filename: 'receipt.pdf',
|
|
125
|
-
content: new Uint8Array([1, 2, 3, 4]),
|
|
126
|
-
contentType: 'application/pdf',
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
filename: 'logo.png',
|
|
130
|
-
content: 'aGVsbG8=',
|
|
131
|
-
contentType: 'image/png',
|
|
132
|
-
contentId: 'logo',
|
|
133
|
-
disposition: 'inline',
|
|
134
|
-
},
|
|
135
|
-
],
|
|
136
|
-
})
|
|
137
|
-
} finally {
|
|
138
|
-
console.info = originalInfo
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
const payload = JSON.parse(writes[0])
|
|
142
|
-
assert.deepEqual(payload.attachments, [
|
|
143
|
-
{
|
|
144
|
-
filename: 'receipt.pdf',
|
|
145
|
-
contentType: 'application/pdf',
|
|
146
|
-
contentId: null,
|
|
147
|
-
disposition: 'attachment',
|
|
148
|
-
contentLength: 4,
|
|
149
|
-
},
|
|
150
|
-
{
|
|
151
|
-
filename: 'logo.png',
|
|
152
|
-
contentType: 'image/png',
|
|
153
|
-
contentId: 'logo',
|
|
154
|
-
disposition: 'inline',
|
|
155
|
-
contentLength: 8,
|
|
156
|
-
},
|
|
157
|
-
])
|
|
158
|
-
assert.equal(writes[0].includes('aGVsbG8='), false)
|
|
159
|
-
})
|
|
160
|
-
|
|
161
|
-
test('LocalEmailService omits attachments when there are none', async () => {
|
|
162
|
-
const service = new LocalEmailService()
|
|
163
|
-
const writes: string[] = []
|
|
164
|
-
const originalInfo = console.info
|
|
165
|
-
console.info = (value?: unknown) => {
|
|
166
|
-
writes.push(String(value))
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
try {
|
|
170
|
-
await service.send({ to: 'user@example.com', text: 'no files' })
|
|
171
|
-
await service.send({
|
|
172
|
-
to: 'user@example.com',
|
|
173
|
-
text: 'no files',
|
|
174
|
-
attachments: [],
|
|
175
|
-
})
|
|
176
|
-
} finally {
|
|
177
|
-
console.info = originalInfo
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
assert.equal(JSON.parse(writes[0]).attachments, undefined)
|
|
181
|
-
assert.equal(JSON.parse(writes[1]).attachments, undefined)
|
|
182
|
-
})
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
EmailService,
|
|
3
|
-
SendEmailInput,
|
|
4
|
-
SendEmailResult,
|
|
5
|
-
} from './email-service.js'
|
|
6
|
-
|
|
7
|
-
export class LocalEmailService implements EmailService {
|
|
8
|
-
async send(input: SendEmailInput): Promise<SendEmailResult> {
|
|
9
|
-
const payload: Record<string, unknown> = {
|
|
10
|
-
type: 'email',
|
|
11
|
-
message: 'this email was sent',
|
|
12
|
-
to: input.to,
|
|
13
|
-
from: input.from ?? null,
|
|
14
|
-
cc: input.cc ?? null,
|
|
15
|
-
bcc: input.bcc ?? null,
|
|
16
|
-
replyTo: input.replyTo ?? null,
|
|
17
|
-
subject: input.subject ?? null,
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
if ('template' in input && input.template) {
|
|
21
|
-
payload.template = input.template
|
|
22
|
-
}
|
|
23
|
-
if ('html' in input && typeof input.html === 'string') {
|
|
24
|
-
payload.htmlLength = input.html.length
|
|
25
|
-
payload.textLength = input.text?.length ?? null
|
|
26
|
-
}
|
|
27
|
-
if ('text' in input && typeof input.text === 'string') {
|
|
28
|
-
payload.textLength = input.text.length
|
|
29
|
-
}
|
|
30
|
-
if (input.attachments?.length) {
|
|
31
|
-
payload.attachments = input.attachments.map((attachment) => ({
|
|
32
|
-
filename: attachment.filename,
|
|
33
|
-
contentType: attachment.contentType ?? null,
|
|
34
|
-
contentId: attachment.contentId ?? null,
|
|
35
|
-
disposition: attachment.disposition ?? 'attachment',
|
|
36
|
-
contentLength: attachment.content.length,
|
|
37
|
-
}))
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
console.info(JSON.stringify(payload))
|
|
41
|
-
return {}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import type { GatewayService } from './gateway-service.js'
|
|
2
|
-
import type { GatewayAdapter } from '../wirings/gateway/gateway.types.js'
|
|
3
|
-
import { pikkuState, getSingletonServices } from '../pikku-state.js'
|
|
4
|
-
import {
|
|
5
|
-
createListenerMessageHandler,
|
|
6
|
-
resolveGatewayAdapter,
|
|
7
|
-
} from '../wirings/gateway/gateway-runner.js'
|
|
8
|
-
|
|
9
|
-
// knowledge: decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md
|
|
10
|
-
export class LocalGatewayService implements GatewayService {
|
|
11
|
-
private activeAdapters = new Map<string, GatewayAdapter>()
|
|
12
|
-
|
|
13
|
-
async start(): Promise<void> {
|
|
14
|
-
const singletonServices = getSingletonServices()
|
|
15
|
-
const gateways = pikkuState(null, 'gateway', 'gateways')
|
|
16
|
-
|
|
17
|
-
for (const [name, config] of gateways) {
|
|
18
|
-
if (config.type !== 'listener') continue
|
|
19
|
-
if (this.activeAdapters.has(name)) continue
|
|
20
|
-
|
|
21
|
-
const handleMessage = createListenerMessageHandler(
|
|
22
|
-
name,
|
|
23
|
-
config,
|
|
24
|
-
singletonServices
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
const adapter = await resolveGatewayAdapter(config, singletonServices)
|
|
28
|
-
await adapter.init(handleMessage)
|
|
29
|
-
this.activeAdapters.set(name, adapter)
|
|
30
|
-
singletonServices.logger.info(`Started listener gateway: ${name}`)
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
async stop(): Promise<void> {
|
|
35
|
-
for (const [name, adapter] of this.activeAdapters) {
|
|
36
|
-
try {
|
|
37
|
-
await adapter.close()
|
|
38
|
-
} catch (e: any) {
|
|
39
|
-
try {
|
|
40
|
-
getSingletonServices().logger.error(
|
|
41
|
-
`Error closing listener gateway '${name}':`,
|
|
42
|
-
e
|
|
43
|
-
)
|
|
44
|
-
} catch {
|
|
45
|
-
// The logger may already be gone during shutdown.
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
this.activeAdapters.clear()
|
|
50
|
-
}
|
|
51
|
-
}
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { describe, test } from 'node:test'
|
|
2
|
-
import assert from 'node:assert'
|
|
3
|
-
import { LocalSecretService } from './local-secrets.js'
|
|
4
|
-
import { LocalVariablesService } from './local-variables.js'
|
|
5
|
-
|
|
6
|
-
describe('LocalSecretService', () => {
|
|
7
|
-
test('should get secret from local storage', async () => {
|
|
8
|
-
const service = new LocalSecretService()
|
|
9
|
-
await service.setSecret('MY_KEY', { token: 'abc' })
|
|
10
|
-
const result = (await service.getSecret('MY_KEY')).reveal()
|
|
11
|
-
assert.deepStrictEqual(result, { token: 'abc' })
|
|
12
|
-
})
|
|
13
|
-
|
|
14
|
-
test('should get secret from environment variables', async () => {
|
|
15
|
-
const vars = new LocalVariablesService({ MY_SECRET: 'secret-value' })
|
|
16
|
-
const service = new LocalSecretService(vars)
|
|
17
|
-
const result = (await service.getSecret('MY_SECRET')).reveal()
|
|
18
|
-
assert.strictEqual(result, 'secret-value')
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
test('should throw when secret not found', async () => {
|
|
22
|
-
const vars = new LocalVariablesService({})
|
|
23
|
-
const service = new LocalSecretService(vars)
|
|
24
|
-
await assert.rejects(() => service.getSecret('MISSING'), {
|
|
25
|
-
message: 'Requested secret not found: MISSING',
|
|
26
|
-
})
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
test('should get JSON secret from local storage', async () => {
|
|
30
|
-
const service = new LocalSecretService()
|
|
31
|
-
await service.setSecret('JSON_KEY', { data: 42 })
|
|
32
|
-
const result = (await service.getSecret('JSON_KEY')).reveal()
|
|
33
|
-
assert.deepStrictEqual(result, { data: 42 })
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
test('should get JSON secret from environment variables', async () => {
|
|
37
|
-
const vars = new LocalVariablesService({ CONFIG: '{"port":3000}' })
|
|
38
|
-
const service = new LocalSecretService(vars)
|
|
39
|
-
const result = (await service.getSecret('CONFIG')).reveal()
|
|
40
|
-
assert.deepStrictEqual(result, { port: 3000 })
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
test('should throw when JSON secret not found', async () => {
|
|
44
|
-
const vars = new LocalVariablesService({})
|
|
45
|
-
const service = new LocalSecretService(vars)
|
|
46
|
-
await assert.rejects(() => service.getSecret('MISSING'), {
|
|
47
|
-
message: 'Requested secret not found: MISSING',
|
|
48
|
-
})
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
test('should prefer local storage over env variables', async () => {
|
|
52
|
-
const vars = new LocalVariablesService({ KEY: 'env-value' })
|
|
53
|
-
const service = new LocalSecretService(vars)
|
|
54
|
-
await service.setSecret('KEY', 'local-value')
|
|
55
|
-
const result = (await service.getSecret('KEY')).reveal()
|
|
56
|
-
assert.strictEqual(result, 'local-value')
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
test('should check hasSecret in local storage', async () => {
|
|
60
|
-
const vars = new LocalVariablesService({})
|
|
61
|
-
const service = new LocalSecretService(vars)
|
|
62
|
-
await service.setSecret('EXISTS', 'yes')
|
|
63
|
-
assert.strictEqual(await service.hasSecret('EXISTS'), true)
|
|
64
|
-
assert.strictEqual(await service.hasSecret('NOPE'), false)
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
test('should check hasSecret in environment', async () => {
|
|
68
|
-
const vars = new LocalVariablesService({ ENV_KEY: 'val' })
|
|
69
|
-
const service = new LocalSecretService(vars)
|
|
70
|
-
assert.strictEqual(await service.hasSecret('ENV_KEY'), true)
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
test('should delete secret from local storage', async () => {
|
|
74
|
-
const service = new LocalSecretService()
|
|
75
|
-
await service.setSecret('DEL_KEY', 'value')
|
|
76
|
-
assert.strictEqual(await service.hasSecret('DEL_KEY'), true)
|
|
77
|
-
await service.deleteSecret('DEL_KEY')
|
|
78
|
-
assert.strictEqual(await service.hasSecret('DEL_KEY'), false)
|
|
79
|
-
})
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
describe('LocalSecretService round-trips a wrapped secret', () => {
|
|
83
|
-
test('setSecret unwraps rather than storing the redaction', async () => {
|
|
84
|
-
const service = new LocalSecretService()
|
|
85
|
-
await service.setSecret('SOURCE', 'sk-live-DEADBEEF')
|
|
86
|
-
const read = await service.getSecret('SOURCE')
|
|
87
|
-
|
|
88
|
-
await service.setSecret('COPY', read)
|
|
89
|
-
|
|
90
|
-
assert.strictEqual(
|
|
91
|
-
(await service.getSecret('COPY')).reveal(),
|
|
92
|
-
'sk-live-DEADBEEF'
|
|
93
|
-
)
|
|
94
|
-
})
|
|
95
|
-
})
|