@pikku/core 0.12.106 → 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 +358 -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/rpc/rpc-runner.js +3 -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 -566
- 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,120 +0,0 @@
|
|
|
1
|
-
import type { CoreUserSession } from '../types/core.types.js'
|
|
2
|
-
import type { SerializedError } from '../errors/serialized-error.js'
|
|
3
|
-
import type {
|
|
4
|
-
WorkflowRun,
|
|
5
|
-
WorkflowPlannedStep,
|
|
6
|
-
WorkflowRunWire,
|
|
7
|
-
WorkflowRunStatus,
|
|
8
|
-
StepState,
|
|
9
|
-
WorkflowStatus,
|
|
10
|
-
WorkflowVersionStatus,
|
|
11
|
-
} from '../wirings/workflow/workflow.types.js'
|
|
12
|
-
import type {
|
|
13
|
-
RunTimeline,
|
|
14
|
-
ReconstructedRunState,
|
|
15
|
-
} from '../wirings/workflow/run-timeline.js'
|
|
16
|
-
|
|
17
|
-
export interface WorkflowService {
|
|
18
|
-
wireQueueWorkers?(): void
|
|
19
|
-
createRun(
|
|
20
|
-
workflowName: string,
|
|
21
|
-
input: any,
|
|
22
|
-
inline: boolean,
|
|
23
|
-
graphHash: string,
|
|
24
|
-
wire: WorkflowRunWire,
|
|
25
|
-
options?: {
|
|
26
|
-
deterministic?: boolean
|
|
27
|
-
plannedSteps?: WorkflowPlannedStep[]
|
|
28
|
-
}
|
|
29
|
-
): Promise<string>
|
|
30
|
-
getRun(id: string): Promise<WorkflowRun | null>
|
|
31
|
-
getRunStatus(id: string): Promise<WorkflowRunStatus | null>
|
|
32
|
-
getRunHistory(runId: string): Promise<Array<StepState & { stepName: string }>>
|
|
33
|
-
getRunTimeline(id: string): Promise<RunTimeline | null>
|
|
34
|
-
reconstructRunStateAt(
|
|
35
|
-
id: string,
|
|
36
|
-
at?: number | Date
|
|
37
|
-
): Promise<ReconstructedRunState | null>
|
|
38
|
-
updateRunStatus(
|
|
39
|
-
id: string,
|
|
40
|
-
status: WorkflowStatus,
|
|
41
|
-
output?: any,
|
|
42
|
-
error?: SerializedError
|
|
43
|
-
): Promise<void>
|
|
44
|
-
withRunLock<T>(id: string, fn: () => Promise<T>): Promise<T>
|
|
45
|
-
close(): Promise<void>
|
|
46
|
-
|
|
47
|
-
resumeWorkflow(runId: string): Promise<void>
|
|
48
|
-
/**
|
|
49
|
-
* The payload is stored as given and validated on replay inside the workflow
|
|
50
|
-
* body, so an invalid one re-closes the gate rather than failing the run.
|
|
51
|
-
*
|
|
52
|
-
* The session must belong to the run's owner — see `assertWorkflowRunOwner`.
|
|
53
|
-
*/
|
|
54
|
-
approveStep(
|
|
55
|
-
runId: string,
|
|
56
|
-
reason: string,
|
|
57
|
-
decision: unknown,
|
|
58
|
-
session?: CoreUserSession
|
|
59
|
-
): Promise<void>
|
|
60
|
-
startWorkflow<I>(
|
|
61
|
-
name: string,
|
|
62
|
-
input: I,
|
|
63
|
-
wire: WorkflowRunWire,
|
|
64
|
-
rpcService: any,
|
|
65
|
-
options?: { inline?: boolean; startNode?: string }
|
|
66
|
-
): Promise<{ runId: string }>
|
|
67
|
-
/** `pollIntervalMs` is a CEILING on the wait between reads, not a cadence. */
|
|
68
|
-
runToCompletion<I>(
|
|
69
|
-
name: string,
|
|
70
|
-
input: I,
|
|
71
|
-
rpcService: any,
|
|
72
|
-
options?: { pollIntervalMs?: number; wire?: WorkflowRunWire }
|
|
73
|
-
): Promise<unknown>
|
|
74
|
-
runWorkflowJob(runId: string, rpcService: any): Promise<void>
|
|
75
|
-
orchestrateWorkflow(runId: string, rpcService: any): Promise<void>
|
|
76
|
-
executeWorkflowSleepCompleted(runId: string, stepId: string): Promise<void>
|
|
77
|
-
|
|
78
|
-
insertStepState(
|
|
79
|
-
runId: string,
|
|
80
|
-
stepName: string,
|
|
81
|
-
rpcName: string,
|
|
82
|
-
data: any,
|
|
83
|
-
stepOptions?: { retries?: number; retryDelay?: string | number }
|
|
84
|
-
): Promise<StepState>
|
|
85
|
-
getStepState(runId: string, stepName: string): Promise<StepState>
|
|
86
|
-
setStepRunning(stepId: string): Promise<void>
|
|
87
|
-
setStepScheduled(stepId: string): Promise<void>
|
|
88
|
-
setStepResult(stepId: string, result: any): Promise<void>
|
|
89
|
-
setStepChildRunId(stepId: string, childRunId: string): Promise<void>
|
|
90
|
-
setStepError(stepId: string, error: Error): Promise<void>
|
|
91
|
-
createRetryAttempt(
|
|
92
|
-
stepId: string,
|
|
93
|
-
status: 'pending' | 'running'
|
|
94
|
-
): Promise<StepState>
|
|
95
|
-
|
|
96
|
-
executeWorkflowStep(
|
|
97
|
-
runId: string,
|
|
98
|
-
stepName: string,
|
|
99
|
-
rpcName: string | null,
|
|
100
|
-
data: any,
|
|
101
|
-
rpcService: any
|
|
102
|
-
): Promise<void>
|
|
103
|
-
|
|
104
|
-
upsertWorkflowVersion(
|
|
105
|
-
name: string,
|
|
106
|
-
graphHash: string,
|
|
107
|
-
graph: any,
|
|
108
|
-
source: string,
|
|
109
|
-
status?: WorkflowVersionStatus
|
|
110
|
-
): Promise<void>
|
|
111
|
-
updateWorkflowVersionStatus(
|
|
112
|
-
name: string,
|
|
113
|
-
graphHash: string,
|
|
114
|
-
status: WorkflowVersionStatus
|
|
115
|
-
): Promise<void>
|
|
116
|
-
getWorkflowVersion(
|
|
117
|
-
name: string,
|
|
118
|
-
graphHash: string
|
|
119
|
-
): Promise<{ graph: any; source: string } | null>
|
|
120
|
-
}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { describe, test } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
import { readFileSync, readdirSync } from 'node:fs'
|
|
4
|
-
import { fileURLToPath } from 'node:url'
|
|
5
|
-
import { join, dirname, relative } from 'node:path'
|
|
6
|
-
|
|
7
|
-
const srcRoot = dirname(fileURLToPath(import.meta.url))
|
|
8
|
-
const packageRoot = join(srcRoot, '..')
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* A statement that runs when the module is imported, rather than when
|
|
12
|
-
* something in it is called. Today every one is an `addError(...)` registering
|
|
13
|
-
* an error class in the runtime registry.
|
|
14
|
-
*/
|
|
15
|
-
const TOP_LEVEL_CALL = /^[a-zA-Z_$][\w.$]*\(/
|
|
16
|
-
|
|
17
|
-
const collectSourceFiles = (directory: string): string[] =>
|
|
18
|
-
readdirSync(directory, { withFileTypes: true }).flatMap((entry) => {
|
|
19
|
-
const entryPath = join(directory, entry.name)
|
|
20
|
-
if (entry.isDirectory()) {
|
|
21
|
-
return entry.name === 'dist' ? [] : collectSourceFiles(entryPath)
|
|
22
|
-
}
|
|
23
|
-
return entry.name.endsWith('.ts') && !entry.name.endsWith('.test.ts')
|
|
24
|
-
? [entryPath]
|
|
25
|
-
: []
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
/** Source modules that do something merely by being imported. */
|
|
29
|
-
const modulesWithSideEffects = (): string[] =>
|
|
30
|
-
collectSourceFiles(srcRoot)
|
|
31
|
-
.filter((file) =>
|
|
32
|
-
readFileSync(file, 'utf-8')
|
|
33
|
-
.split('\n')
|
|
34
|
-
.some((line) => TOP_LEVEL_CALL.test(line))
|
|
35
|
-
)
|
|
36
|
-
.map((file) => `./dist/${relative(srcRoot, file).replace(/\.ts$/, '.js')}`)
|
|
37
|
-
.sort()
|
|
38
|
-
|
|
39
|
-
const declared = (): string[] => {
|
|
40
|
-
const pkg = JSON.parse(
|
|
41
|
-
readFileSync(join(packageRoot, 'package.json'), 'utf-8')
|
|
42
|
-
)
|
|
43
|
-
return [...(pkg.sideEffects ?? [])].sort()
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* `sideEffects` tells a bundler which modules it may not drop. Claiming
|
|
48
|
-
* `false` outright would be untrue — the error registry is built by
|
|
49
|
-
* `addError(...)` calls that run on import, and a bundler that dropped
|
|
50
|
-
* `errors/errors.js` would leave `getErrorResponse` unable to find any of
|
|
51
|
-
* them. Naming the modules exactly lets everything else be tree-shaken.
|
|
52
|
-
*
|
|
53
|
-
* knowledge: decisions/internals/side-effects-are-an-allowlist-not-a-boolean.md
|
|
54
|
-
*/
|
|
55
|
-
describe('every module with import-time side effects is declared', () => {
|
|
56
|
-
test('the allowlist matches the modules that actually have them', () => {
|
|
57
|
-
const actual = modulesWithSideEffects()
|
|
58
|
-
const listed = declared()
|
|
59
|
-
|
|
60
|
-
assert.deepEqual(
|
|
61
|
-
{ missing: actual.filter((m) => !listed.includes(m)) },
|
|
62
|
-
{ missing: [] },
|
|
63
|
-
'a module runs code on import but is not in package.json sideEffects. ' +
|
|
64
|
-
'A bundler may drop it, and whatever it registered will be absent at ' +
|
|
65
|
-
'runtime.'
|
|
66
|
-
)
|
|
67
|
-
|
|
68
|
-
assert.deepEqual(
|
|
69
|
-
{ stale: listed.filter((m) => !actual.includes(m)) },
|
|
70
|
-
{ stale: [] },
|
|
71
|
-
'package.json sideEffects names a module that no longer has any — ' +
|
|
72
|
-
'remove it so bundlers can tree-shake it.'
|
|
73
|
-
)
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
test('the detector finds a known side effect', () => {
|
|
77
|
-
// Guards the test above: a detector matching nothing would pass whatever
|
|
78
|
-
// package.json claimed.
|
|
79
|
-
assert.ok(
|
|
80
|
-
modulesWithSideEffects().includes('./dist/errors/errors.js'),
|
|
81
|
-
'errors/errors.js registers every error class at import and must match'
|
|
82
|
-
)
|
|
83
|
-
})
|
|
84
|
-
})
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { describe, test } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
import { readFileSync, readdirSync } from 'node:fs'
|
|
4
|
-
import { fileURLToPath } from 'node:url'
|
|
5
|
-
import { join, dirname, relative } from 'node:path'
|
|
6
|
-
|
|
7
|
-
const srcRoot = dirname(fileURLToPath(import.meta.url))
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* The ceiling a single module may reach before it has to be composed out of
|
|
11
|
-
* smaller ones.
|
|
12
|
-
*/
|
|
13
|
-
const MAX_LINES = 2000
|
|
14
|
-
|
|
15
|
-
const collectSourceFiles = (directory: string): string[] =>
|
|
16
|
-
readdirSync(directory, { withFileTypes: true }).flatMap((entry) => {
|
|
17
|
-
const entryPath = join(directory, entry.name)
|
|
18
|
-
if (entry.isDirectory()) {
|
|
19
|
-
return entry.name === 'dist' ? [] : collectSourceFiles(entryPath)
|
|
20
|
-
}
|
|
21
|
-
return entry.name.endsWith('.ts') ? [entryPath] : []
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
describe('source files stay composable', () => {
|
|
25
|
-
test(`no module in @pikku/core exceeds ${MAX_LINES} lines`, () => {
|
|
26
|
-
const offenders = collectSourceFiles(srcRoot)
|
|
27
|
-
.map((file) => ({
|
|
28
|
-
file: relative(srcRoot, file),
|
|
29
|
-
lines: readFileSync(file, 'utf-8').split('\n').length,
|
|
30
|
-
}))
|
|
31
|
-
.filter(({ lines }) => lines > MAX_LINES)
|
|
32
|
-
.sort((a, b) => b.lines - a.lines)
|
|
33
|
-
|
|
34
|
-
assert.deepEqual(
|
|
35
|
-
offenders,
|
|
36
|
-
[],
|
|
37
|
-
`modules over ${MAX_LINES} lines:\n` +
|
|
38
|
-
offenders.map(({ file, lines }) => ` ${lines} ${file}`).join('\n')
|
|
39
|
-
)
|
|
40
|
-
})
|
|
41
|
-
})
|
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
import { test, describe } from 'node:test'
|
|
2
|
-
import * as assert from 'assert'
|
|
3
|
-
import ts from 'typescript'
|
|
4
|
-
import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs'
|
|
5
|
-
import { dirname, join, relative } from 'node:path'
|
|
6
|
-
import { fileURLToPath } from 'node:url'
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Templates are the one tree that is copied verbatim into a user's project, so
|
|
10
|
-
* whatever they import is what every new Pikku app starts life importing. The
|
|
11
|
-
* app-developer surface is the generated `#pikku` alias; a relative path into
|
|
12
|
-
* `.pikku` reaches the same file but teaches the wrong habit, and it breaks the
|
|
13
|
-
* moment `create-pikku` moves the directory — which it does for StackBlitz,
|
|
14
|
-
* where `.pikku` becomes `pikku-gen`.
|
|
15
|
-
*/
|
|
16
|
-
const repoRoot = join(dirname(fileURLToPath(import.meta.url)), '../../..')
|
|
17
|
-
const templatesDir = join(repoRoot, 'templates')
|
|
18
|
-
const skipped = new Set(['node_modules', 'dist', '.pikku', '.next', 'build'])
|
|
19
|
-
|
|
20
|
-
const walk = (dir: string, out: string[] = []): string[] => {
|
|
21
|
-
for (const entry of readdirSync(dir)) {
|
|
22
|
-
if (skipped.has(entry)) continue
|
|
23
|
-
const path = join(dir, entry)
|
|
24
|
-
if (statSync(path).isDirectory()) walk(path, out)
|
|
25
|
-
else if (path.endsWith('.ts') || path.endsWith('.tsx')) out.push(path)
|
|
26
|
-
}
|
|
27
|
-
return out
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* `.gen.*` and `.d.ts` files are CLI output rather than template source: what
|
|
32
|
-
* they import is decided by the codegen serializers, not by the template.
|
|
33
|
-
*/
|
|
34
|
-
const isGenerated = (path: string) =>
|
|
35
|
-
path.includes('.gen.') || path.endsWith('.d.ts')
|
|
36
|
-
|
|
37
|
-
const templateNames = () =>
|
|
38
|
-
readdirSync(templatesDir).filter((name) =>
|
|
39
|
-
existsSync(join(templatesDir, name, 'package.json'))
|
|
40
|
-
)
|
|
41
|
-
|
|
42
|
-
const templateSourceFiles = (template: string) => {
|
|
43
|
-
const dir = join(templatesDir, template)
|
|
44
|
-
return walk(dir).filter((file) => !isGenerated(file))
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Parsed rather than grepped, so a `.pikku` path quoted inside a string
|
|
49
|
-
* literal — a config default, a doc comment, a codegen fixture — is not
|
|
50
|
-
* mistaken for an import the template actually makes.
|
|
51
|
-
*/
|
|
52
|
-
const generatedImports = (file: string) => {
|
|
53
|
-
const source = ts.createSourceFile(
|
|
54
|
-
file,
|
|
55
|
-
readFileSync(file, 'utf8'),
|
|
56
|
-
ts.ScriptTarget.Latest,
|
|
57
|
-
true
|
|
58
|
-
)
|
|
59
|
-
const found: { specifier: string; line: number }[] = []
|
|
60
|
-
for (const statement of source.statements) {
|
|
61
|
-
if (
|
|
62
|
-
!ts.isImportDeclaration(statement) &&
|
|
63
|
-
!ts.isExportDeclaration(statement)
|
|
64
|
-
) {
|
|
65
|
-
continue
|
|
66
|
-
}
|
|
67
|
-
const moduleSpecifier = statement.moduleSpecifier
|
|
68
|
-
if (!moduleSpecifier || !ts.isStringLiteral(moduleSpecifier)) continue
|
|
69
|
-
const specifier = moduleSpecifier.text
|
|
70
|
-
if (!specifier.startsWith('.')) continue
|
|
71
|
-
if (!/(^|\/)\.pikku\//.test(specifier)) continue
|
|
72
|
-
const { line } = source.getLineAndCharacterOfPosition(
|
|
73
|
-
statement.getStart(source)
|
|
74
|
-
)
|
|
75
|
-
found.push({ specifier, line: line + 1 })
|
|
76
|
-
}
|
|
77
|
-
return found
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Bun resolves a '#'-prefixed specifier as a Node subpath import and does not
|
|
82
|
-
* apply tsconfig `paths` to it, so neither half of the alias reaches the
|
|
83
|
-
* functions template next door: Node rejects the '../' imports target, and
|
|
84
|
-
* `paths` is never consulted. Until the bun template takes a workspace
|
|
85
|
-
* dependency on the functions template — which makes a bare specifier a legal
|
|
86
|
-
* imports target — it has no alias mechanism and keeps the relative path.
|
|
87
|
-
*/
|
|
88
|
-
const withoutAlias = new Set(['bun'])
|
|
89
|
-
|
|
90
|
-
describe('templates ship the #pikku alias', () => {
|
|
91
|
-
test('no template reaches generated output through a relative path', () => {
|
|
92
|
-
const offenders: string[] = []
|
|
93
|
-
|
|
94
|
-
for (const template of templateNames()) {
|
|
95
|
-
if (withoutAlias.has(template)) continue
|
|
96
|
-
for (const file of templateSourceFiles(template)) {
|
|
97
|
-
for (const { specifier, line } of generatedImports(file)) {
|
|
98
|
-
offenders.push(`${relative(repoRoot, file)}:${line} ${specifier}`)
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
assert.deepStrictEqual(
|
|
104
|
-
offenders,
|
|
105
|
-
[],
|
|
106
|
-
`Templates must reach generated output through the '#pikku' alias.\n` +
|
|
107
|
-
`A relative path into '.pikku' is the specifier every scaffolded app ` +
|
|
108
|
-
`would inherit, and it breaks when create-pikku relocates the ` +
|
|
109
|
-
`directory.\n\n` +
|
|
110
|
-
offenders.join('\n')
|
|
111
|
-
)
|
|
112
|
-
})
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* `paths` is what actually resolves the alias in a runtime template: it
|
|
116
|
-
* points at the functions template next door, and tsx, tsc and the
|
|
117
|
-
* inspector all consult it. The inspector in particular builds its own
|
|
118
|
-
* program and inherits only baseUrl, paths, rootDirs and pathsBasePath —
|
|
119
|
-
* it never sees an imports map.
|
|
120
|
-
*/
|
|
121
|
-
test('every template using #pikku declares it in tsconfig paths', () => {
|
|
122
|
-
const offenders: string[] = []
|
|
123
|
-
|
|
124
|
-
for (const template of templateNames()) {
|
|
125
|
-
const usesAlias = templateSourceFiles(template).some((file) =>
|
|
126
|
-
/['"]#pikku\//.test(readFileSync(file, 'utf8'))
|
|
127
|
-
)
|
|
128
|
-
if (!usesAlias) continue
|
|
129
|
-
|
|
130
|
-
const tsconfigPath = join(templatesDir, template, 'tsconfig.json')
|
|
131
|
-
if (!existsSync(tsconfigPath)) {
|
|
132
|
-
offenders.push(`templates/${template}/tsconfig.json missing`)
|
|
133
|
-
continue
|
|
134
|
-
}
|
|
135
|
-
const tsconfig = JSON.parse(readFileSync(tsconfigPath, 'utf8'))
|
|
136
|
-
if (!tsconfig.compilerOptions?.paths?.['#pikku/*']) {
|
|
137
|
-
offenders.push(`templates/${template}/tsconfig.json missing paths`)
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
assert.deepStrictEqual(
|
|
142
|
-
offenders,
|
|
143
|
-
[],
|
|
144
|
-
`A template that imports '#pikku/…' has to declare it in tsconfig ` +
|
|
145
|
-
`'paths', which is what resolves it.\n\n` +
|
|
146
|
-
offenders.join('\n')
|
|
147
|
-
)
|
|
148
|
-
})
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Every `#pikku/…` pattern shares the prefix `#pikku/`, and TypeScript picks
|
|
152
|
-
* the matching pattern with the longest prefix, ignoring the suffix and
|
|
153
|
-
* breaking the tie in favour of the first key. So a suffix-specific pattern
|
|
154
|
-
* such as `#pikku/*.json` only ever wins by being listed before the bare one
|
|
155
|
-
* — an ordering that does not survive `create-pikku` deep-merging the runtime
|
|
156
|
-
* template's tsconfig with the functions template's.
|
|
157
|
-
*
|
|
158
|
-
* The bare pattern therefore has to resolve a file as well as a directory
|
|
159
|
-
* index, which a target list does: `#pikku/mcp/mcp.gen.json` misses
|
|
160
|
-
* `.pikku/mcp/mcp.gen.json/index.ts` and lands on the file behind it.
|
|
161
|
-
*/
|
|
162
|
-
test('the bare #pikku pattern resolves a file, not only a directory index', () => {
|
|
163
|
-
const offenders: string[] = []
|
|
164
|
-
|
|
165
|
-
for (const template of templateNames()) {
|
|
166
|
-
const declare = (
|
|
167
|
-
source: string,
|
|
168
|
-
targets: string | string[] | undefined
|
|
169
|
-
) => {
|
|
170
|
-
if (targets === undefined) return
|
|
171
|
-
const list = Array.isArray(targets) ? targets : [targets]
|
|
172
|
-
// A directory-index target ends in the index file; anything else names
|
|
173
|
-
// whatever the alias was pointed at, which is what a file needs.
|
|
174
|
-
if (list.every((target) => /\/index\.[cm]?[jt]s$/.test(target))) {
|
|
175
|
-
offenders.push(`${source} ${list.join(', ')}`)
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
const tsconfigPath = join(templatesDir, template, 'tsconfig.json')
|
|
180
|
-
if (existsSync(tsconfigPath)) {
|
|
181
|
-
const tsconfig = JSON.parse(readFileSync(tsconfigPath, 'utf8'))
|
|
182
|
-
declare(
|
|
183
|
-
`templates/${template}/tsconfig.json`,
|
|
184
|
-
tsconfig.compilerOptions?.paths?.['#pikku/*']
|
|
185
|
-
)
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
const pkg = JSON.parse(
|
|
189
|
-
readFileSync(join(templatesDir, template, 'package.json'), 'utf8')
|
|
190
|
-
)
|
|
191
|
-
declare(
|
|
192
|
-
`templates/${template}/package.json`,
|
|
193
|
-
pkg.imports?.['#pikku/*'] as string | string[] | undefined
|
|
194
|
-
)
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
assert.deepStrictEqual(
|
|
198
|
-
offenders,
|
|
199
|
-
[],
|
|
200
|
-
`The bare '#pikku/*' pattern must list a file target alongside the ` +
|
|
201
|
-
`directory index, because a suffix-specific pattern like ` +
|
|
202
|
-
`'#pikku/*.json' loses to it whenever it is not listed first — and ` +
|
|
203
|
-
`create-pikku's merge decides that order.\n\n` +
|
|
204
|
-
offenders.join('\n')
|
|
205
|
-
)
|
|
206
|
-
})
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* Node rejects an internal-imports target that is not './'-relative or a
|
|
210
|
-
* bare package specifier, so a '../' target throws ERR_INVALID_PACKAGE_TARGET
|
|
211
|
-
* rather than resolving. A runtime template reaching the functions template
|
|
212
|
-
* next door cannot express that as an imports map at all — it resolves
|
|
213
|
-
* through `paths`, and declaring the map anyway only looks like it works,
|
|
214
|
-
* because `paths` answers first.
|
|
215
|
-
*/
|
|
216
|
-
test('no template declares an imports target Node will reject', () => {
|
|
217
|
-
const offenders: string[] = []
|
|
218
|
-
|
|
219
|
-
for (const template of templateNames()) {
|
|
220
|
-
const pkg = JSON.parse(
|
|
221
|
-
readFileSync(join(templatesDir, template, 'package.json'), 'utf8')
|
|
222
|
-
)
|
|
223
|
-
for (const [specifier, target] of Object.entries(pkg.imports ?? {})) {
|
|
224
|
-
if (typeof target === 'string' && target.startsWith('../')) {
|
|
225
|
-
offenders.push(
|
|
226
|
-
`templates/${template}/package.json ${specifier} -> ${target}`
|
|
227
|
-
)
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
assert.deepStrictEqual(
|
|
233
|
-
offenders,
|
|
234
|
-
[],
|
|
235
|
-
`An 'imports' target must start with './' or be a bare package ` +
|
|
236
|
-
`specifier; '../' throws ERR_INVALID_PACKAGE_TARGET.\n\n` +
|
|
237
|
-
offenders.join('\n')
|
|
238
|
-
)
|
|
239
|
-
})
|
|
240
|
-
})
|
package/src/test-utils.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { getAllPackageStates } from './pikku-state.js'
|
|
2
|
-
import { clearMiddlewareCache } from './middleware-runner.js'
|
|
3
|
-
import { clearPermissionsCache } from './permissions.js'
|
|
4
|
-
import { clearChannelMiddlewareCache } from './wirings/channel/channel-middleware-runner.js'
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Clears all runtime caches between test scenarios without touching registered
|
|
8
|
-
* routes, functions, or middleware groups (which are set at module load time
|
|
9
|
-
* and must persist for the whole test run).
|
|
10
|
-
*
|
|
11
|
-
* Call this alongside your DB snapshot restore in your Before hook:
|
|
12
|
-
*
|
|
13
|
-
* ```typescript
|
|
14
|
-
* Before(async function() {
|
|
15
|
-
* await restoreSnapshot()
|
|
16
|
-
* clearPikkuRuntimeState()
|
|
17
|
-
* setSingletonServices(bundle.services)
|
|
18
|
-
* })
|
|
19
|
-
* ```
|
|
20
|
-
*
|
|
21
|
-
* Only works when NODE_ENV === 'test'. Logs an error and returns otherwise.
|
|
22
|
-
*/
|
|
23
|
-
export const clearPikkuRuntimeState = (): void => {
|
|
24
|
-
if (process.env.NODE_ENV !== 'test') {
|
|
25
|
-
console.error(
|
|
26
|
-
'[pikku] clearPikkuRuntimeState() must only be called in test environments. Ignoring.'
|
|
27
|
-
)
|
|
28
|
-
return
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
clearMiddlewareCache()
|
|
32
|
-
clearPermissionsCache()
|
|
33
|
-
clearChannelMiddlewareCache()
|
|
34
|
-
|
|
35
|
-
for (const packageState of getAllPackageStates().values()) {
|
|
36
|
-
packageState.package.singletonServices = null
|
|
37
|
-
}
|
|
38
|
-
}
|
package/src/testing/index.ts
DELETED
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import { describe, test, before } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import type { AgentRunService } from '../../wirings/agent/agent.types.js'
|
|
5
|
-
import type { ServiceTestConfig } from '../service-tests.js'
|
|
6
|
-
|
|
7
|
-
/** Conformance suite for `agentRunService`. Runs only when a backend supplies one. */
|
|
8
|
-
export const defineAgentRunServiceTests = (
|
|
9
|
-
name: string,
|
|
10
|
-
agentRunService: NonNullable<
|
|
11
|
-
ServiceTestConfig['services']['agentRunService']
|
|
12
|
-
>,
|
|
13
|
-
/**
|
|
14
|
-
* Thread-ownership is a property of the two services together — the run
|
|
15
|
-
* service lists what the storage service owns — so that half of the suite
|
|
16
|
-
* only runs when a backend supplies both. Passed explicitly rather than
|
|
17
|
-
* closed over, so the dependency is visible in the signature.
|
|
18
|
-
*/
|
|
19
|
-
agentStorageService?: ServiceTestConfig['services']['agentStorageService']
|
|
20
|
-
): void => {
|
|
21
|
-
const factory = agentRunService
|
|
22
|
-
describe(`AgentRunService [${name}]`, () => {
|
|
23
|
-
let agentService: AgentRunService
|
|
24
|
-
|
|
25
|
-
before(async () => {
|
|
26
|
-
agentService = await factory()
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
test('listThreads', async () => {
|
|
30
|
-
const threads = await agentService.listThreads()
|
|
31
|
-
assert.ok(Array.isArray(threads))
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
if (agentStorageService) {
|
|
35
|
-
const storageFactory = agentStorageService
|
|
36
|
-
|
|
37
|
-
// The `owners` constraint is what keeps the generated thread-management
|
|
38
|
-
// functions from leaking across tenants: a caller may only list threads
|
|
39
|
-
// owned by one of their session principals, matching the
|
|
40
|
-
// `principal:sub-partition` composition resolveOwnerResourceId writes.
|
|
41
|
-
test('listThreads scopes to the given owners, including sub-partitions', async () => {
|
|
42
|
-
const storage = await storageFactory()
|
|
43
|
-
await storage.createThread('owner-alice')
|
|
44
|
-
await storage.createThread('owner-alice:project-1')
|
|
45
|
-
await storage.createThread('owner-bob:secret')
|
|
46
|
-
|
|
47
|
-
const threads = await agentService.listThreads({
|
|
48
|
-
owners: ['owner-alice'],
|
|
49
|
-
})
|
|
50
|
-
const ids = threads.map((t) => t.resourceId)
|
|
51
|
-
|
|
52
|
-
assert.ok(ids.includes('owner-alice'))
|
|
53
|
-
assert.ok(ids.includes('owner-alice:project-1'))
|
|
54
|
-
assert.ok(
|
|
55
|
-
!ids.some((id) => id.startsWith('owner-bob')),
|
|
56
|
-
"another owner's threads must not be listed"
|
|
57
|
-
)
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
test('listThreads with an owner does not match a lookalike prefix', async () => {
|
|
61
|
-
const storage = await storageFactory()
|
|
62
|
-
await storage.createThread('owner-al')
|
|
63
|
-
await storage.createThread('owner-alice-evil:p')
|
|
64
|
-
|
|
65
|
-
const threads = await agentService.listThreads({
|
|
66
|
-
owners: ['owner-al'],
|
|
67
|
-
})
|
|
68
|
-
const ids = threads.map((t) => t.resourceId)
|
|
69
|
-
|
|
70
|
-
assert.ok(ids.includes('owner-al'))
|
|
71
|
-
assert.ok(!ids.includes('owner-alice-evil:p'))
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
test('listThreads with an empty owners list returns nothing', async () => {
|
|
75
|
-
const storage = await storageFactory()
|
|
76
|
-
await storage.createThread('owner-empty-check')
|
|
77
|
-
|
|
78
|
-
const threads = await agentService.listThreads({ owners: [] })
|
|
79
|
-
assert.deepEqual(threads, [])
|
|
80
|
-
})
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
test('getThread returns null for missing', async () => {
|
|
84
|
-
const thread = await agentService.getThread('missing-thread')
|
|
85
|
-
assert.equal(thread, null)
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
test('getDistinctAgentNames', async () => {
|
|
89
|
-
const names = await agentService.getDistinctAgentNames()
|
|
90
|
-
assert.ok(Array.isArray(names))
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
test('deleteThread returns false for missing', async () => {
|
|
94
|
-
const result = await agentService.deleteThread('missing-thread')
|
|
95
|
-
assert.equal(result, false)
|
|
96
|
-
})
|
|
97
|
-
})
|
|
98
|
-
}
|