@pikku/core 0.12.107 → 0.12.112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +357 -0
- package/dist/analytics/analytics.d.ts +6 -0
- package/dist/analytics/analytics.js +58 -0
- package/dist/analytics/analytics.types.d.ts +156 -0
- package/dist/analytics/analytics.types.js +1 -0
- package/dist/analytics/anonymous-analytics-identity.d.ts +23 -0
- package/dist/analytics/anonymous-analytics-identity.js +27 -0
- package/dist/analytics/compose-analytics-identity.d.ts +14 -0
- package/dist/analytics/compose-analytics-identity.js +33 -0
- package/dist/analytics/cookie-analytics-identity.d.ts +24 -0
- package/dist/analytics/cookie-analytics-identity.js +37 -0
- package/dist/analytics/define-analytics-events.d.ts +22 -0
- package/dist/analytics/define-analytics-events.js +9 -0
- package/dist/analytics/fan-out-analytics.d.ts +15 -0
- package/dist/analytics/fan-out-analytics.js +36 -0
- package/dist/analytics/index.d.ts +13 -0
- package/dist/analytics/index.js +8 -0
- package/dist/analytics/logger-analytics-service.d.ts +14 -0
- package/dist/analytics/logger-analytics-service.js +23 -0
- package/dist/analytics/mint-cookie.d.ts +44 -0
- package/dist/analytics/mint-cookie.js +55 -0
- package/dist/dev/hot-reload.d.ts +0 -1
- package/dist/dev/hot-reload.js +4 -25
- package/dist/dev/module-runner.js +104 -25
- package/dist/errors/errors.d.ts +7 -0
- package/dist/errors/errors.js +17 -0
- package/dist/function/function-meta.types.d.ts +2 -0
- package/dist/function/function-runner.js +29 -0
- package/dist/function/functions.types.d.ts +22 -3
- package/dist/middleware/auth-apikey.d.ts +1 -1
- package/dist/pikku-state.d.ts +1 -1
- package/dist/scopes.d.ts +11 -0
- package/dist/scopes.js +17 -0
- package/dist/services/credential-wire-service.d.ts +1 -1
- package/dist/services/feature-flag-service.d.ts +100 -0
- package/dist/services/feature-flag-service.js +1 -0
- package/dist/services/index.d.ts +1 -0
- package/dist/services/meta-service.d.ts +16 -0
- package/dist/services/meta-service.js +19 -0
- package/dist/services/webhook-service.d.ts +7 -2
- package/dist/services/webhook-service.js +11 -6
- package/dist/testing/service-tests/agent-run-service-tests.d.ts +2 -2
- package/dist/testing/service-tests/agent-storage-service-tests.d.ts +1 -1
- package/dist/testing/service-tests/channel-store-tests.d.ts +1 -1
- package/dist/testing/service-tests/credential-service-tests.d.ts +1 -1
- package/dist/testing/service-tests/deployment-service-tests.d.ts +1 -1
- package/dist/testing/service-tests/event-hub-store-tests.d.ts +1 -1
- package/dist/testing/service-tests/secret-service-tests.d.ts +1 -1
- package/dist/testing/service-tests/session-store-tests.d.ts +1 -1
- package/dist/testing/service-tests/workflow-run-service-tests.d.ts +1 -1
- package/dist/testing/service-tests/workflow-service-tests.d.ts +1 -1
- package/dist/types/core.types.d.ts +23 -0
- package/dist/wirings/agent/agent-rpc.d.ts +1 -1
- package/dist/wirings/agent/agent-turn.d.ts +1 -1
- package/dist/wirings/agent-scorer/agent-scorer-live.d.ts +1 -1
- package/dist/wirings/channel/channel-common.d.ts +1 -1
- package/dist/wirings/channel/channel-rpc-validators.d.ts +2 -2
- package/dist/wirings/channel/channel-runner.d.ts +1 -1
- package/dist/wirings/channel/local/local-channel-runner.d.ts +1 -1
- package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +1 -1
- package/dist/wirings/cli/channel/cli-approval.d.ts +2 -2
- package/dist/wirings/flag/assert-feature-available.d.ts +15 -0
- package/dist/wirings/flag/assert-feature-available.js +23 -0
- package/dist/wirings/flag/cached-flag-source.d.ts +73 -0
- package/dist/wirings/flag/cached-flag-source.js +96 -0
- package/dist/wirings/flag/define-feature-flags.d.ts +33 -0
- package/dist/wirings/flag/define-feature-flags.js +32 -0
- package/dist/wirings/flag/flag.types.d.ts +97 -0
- package/dist/wirings/flag/flag.types.js +1 -0
- package/dist/wirings/flag/index.d.ts +7 -0
- package/dist/wirings/flag/index.js +5 -0
- package/dist/wirings/flag/resolve-flag.d.ts +52 -0
- package/dist/wirings/flag/resolve-flag.js +90 -0
- package/dist/wirings/flag/validate-flag-definitions.d.ts +26 -0
- package/dist/wirings/flag/validate-flag-definitions.js +103 -0
- package/dist/wirings/virtual-user/virtual-user-scaffold.d.ts +8 -8
- package/dist/wirings/virtual-user/virtual-user-schedule.d.ts +1 -1
- package/dist/wirings/workflow/workflow-queue-routing.d.ts +1 -1
- package/knowledge/decisions/internals/a-reset-suite-makes-the-dev-seed-the-fixture.md +50 -0
- package/knowledge/decisions/internals/hot-reload-reads-the-changed-source-never-a-compiled-copy.md +38 -0
- package/knowledge/decisions/internals/index.md +2 -0
- package/package.json +11 -5
- package/run-tests.sh +17 -9
- package/src/public-surface.json +26 -0
- package/src/agent-naming.test.ts +0 -68
- package/src/api-report.test.ts +0 -138
- package/src/app-alias-surface.test.ts +0 -179
- package/src/app-leaf-surface.test.ts +0 -222
- package/src/bootstrap-compat/root.ts +0 -20
- package/src/classification/column-form.test.ts +0 -97
- package/src/classification/column-form.ts +0 -55
- package/src/classification/data-classification.ts +0 -73
- package/src/classification/index.ts +0 -40
- package/src/classification/key-ids.ts +0 -2
- package/src/classification/secret-value.test.ts +0 -204
- package/src/classification/secret-value.ts +0 -106
- package/src/crypto-utils.test.ts +0 -668
- package/src/crypto-utils.ts +0 -460
- package/src/dev/hot-reload.test.ts +0 -587
- package/src/dev/hot-reload.ts +0 -225
- package/src/dev/module-runner.test.ts +0 -235
- package/src/dev/module-runner.ts +0 -138
- package/src/dev/reload-meta.test.ts +0 -183
- package/src/dev/reload-meta.ts +0 -144
- package/src/ecosystem-tier-removed.test.ts +0 -72
- package/src/env.ts +0 -1
- package/src/errors/error-handler.ts +0 -77
- package/src/errors/error.test.ts +0 -229
- package/src/errors/errors.ts +0 -393
- package/src/errors/index.ts +0 -11
- package/src/errors/serialized-error.ts +0 -12
- package/src/factory-functions.test.ts +0 -111
- package/src/function/abort-scope.test.ts +0 -97
- package/src/function/abort-scope.ts +0 -80
- package/src/function/function-meta.types.ts +0 -151
- package/src/function/function-runner.test.ts +0 -1619
- package/src/function/function-runner.ts +0 -499
- package/src/function/functions.types.ts +0 -319
- package/src/function/index.ts +0 -40
- package/src/function/list.types.test.ts +0 -100
- package/src/function/list.types.ts +0 -69
- package/src/function/pikku-request.test.ts +0 -35
- package/src/function/pikku-request.ts +0 -17
- package/src/gopass-secrets-removed.test.ts +0 -51
- package/src/handle-error.test.ts +0 -532
- package/src/handle-error.ts +0 -64
- package/src/middleware/auth-apikey.test.ts +0 -362
- package/src/middleware/auth-apikey.ts +0 -39
- package/src/middleware/auth-bearer.test.ts +0 -566
- package/src/middleware/auth-bearer.ts +0 -83
- package/src/middleware/auth-cookie.test.ts +0 -572
- package/src/middleware/auth-cookie.ts +0 -107
- package/src/middleware/cors.test.ts +0 -579
- package/src/middleware/cors.ts +0 -103
- package/src/middleware/index.ts +0 -30
- package/src/middleware/middleware-factories.ts +0 -76
- package/src/middleware/middleware.types.ts +0 -61
- package/src/middleware/remote-auth.test.ts +0 -547
- package/src/middleware/remote-auth.ts +0 -95
- package/src/middleware/remote-jobs-secret.ts +0 -35
- package/src/middleware/require-origin.test.ts +0 -115
- package/src/middleware/require-origin.ts +0 -79
- package/src/middleware/telemetry.ts +0 -83
- package/src/middleware-runner.test.ts +0 -578
- package/src/middleware-runner.ts +0 -232
- package/src/no-any-casts.test.ts +0 -57
- package/src/no-root-barrel.test.ts +0 -122
- package/src/permissions.test.ts +0 -256
- package/src/permissions.ts +0 -217
- package/src/pikku-state.test.ts +0 -198
- package/src/pikku-state.ts +0 -206
- package/src/production-barrels-stay-lean.test.ts +0 -110
- package/src/public-surface.test.ts +0 -133
- package/src/remote.test.ts +0 -173
- package/src/remote.ts +0 -56
- package/src/removed-legacy-exports.test.ts +0 -66
- package/src/run-tests-script.test.ts +0 -67
- package/src/schema.test.ts +0 -430
- package/src/schema.ts +0 -204
- package/src/scopes.test.ts +0 -203
- package/src/scopes.ts +0 -67
- package/src/services/agent-run-state-service.ts +0 -37
- package/src/services/agent-runner-service.ts +0 -238
- package/src/services/agent-storage-service.ts +0 -39
- package/src/services/ai-embedding-service.ts +0 -9
- package/src/services/audit-service.test.ts +0 -44
- package/src/services/audit-service.ts +0 -280
- package/src/services/content-service.ts +0 -65
- package/src/services/credential-service.ts +0 -20
- package/src/services/credential-wire-service.test.ts +0 -235
- package/src/services/credential-wire-service.ts +0 -120
- package/src/services/deployment-service.ts +0 -32
- package/src/services/email-service.test.ts +0 -100
- package/src/services/email-service.ts +0 -60
- package/src/services/email-template.test.ts +0 -311
- package/src/services/email-template.ts +0 -254
- package/src/services/file-scenario-run-store.test.ts +0 -349
- package/src/services/file-scenario-run-store.ts +0 -282
- package/src/services/gateway-service.ts +0 -5
- package/src/services/http-personas-converse.test.ts +0 -274
- package/src/services/http-personas.test.ts +0 -379
- package/src/services/http-personas.ts +0 -508
- package/src/services/in-memory-agent-run-state-service.ts +0 -87
- package/src/services/in-memory-queue-service.test.ts +0 -162
- package/src/services/in-memory-queue-service.ts +0 -78
- package/src/services/in-memory-session-store.test.ts +0 -58
- package/src/services/in-memory-session-store.ts +0 -20
- package/src/services/in-memory-trigger-service.ts +0 -47
- package/src/services/in-memory-workflow-service.test.ts +0 -430
- package/src/services/in-memory-workflow-service.ts +0 -595
- package/src/services/index.ts +0 -192
- package/src/services/istanbul-coverage-service.test.ts +0 -66
- package/src/services/istanbul-coverage-service.ts +0 -59
- package/src/services/jwt-service.ts +0 -15
- package/src/services/local-content-request-handler.test.ts +0 -240
- package/src/services/local-content-request-handler.ts +0 -295
- package/src/services/local-content.test.ts +0 -186
- package/src/services/local-content.ts +0 -242
- package/src/services/local-credential-service.ts +0 -63
- package/src/services/local-email-service.test.ts +0 -182
- package/src/services/local-email-service.ts +0 -43
- package/src/services/local-gateway-service.ts +0 -51
- package/src/services/local-secrets.test.ts +0 -95
- package/src/services/local-secrets.ts +0 -71
- package/src/services/local-variables.test.ts +0 -61
- package/src/services/local-variables.ts +0 -45
- package/src/services/logger-console.test.ts +0 -117
- package/src/services/logger-console.ts +0 -174
- package/src/services/logger.ts +0 -48
- package/src/services/meta-service.test.ts +0 -75
- package/src/services/meta-service.ts +0 -767
- package/src/services/persona-actor-secret.test.ts +0 -68
- package/src/services/persona-actor-secret.ts +0 -70
- package/src/services/persona-sign-in.test.ts +0 -219
- package/src/services/persona-sign-in.ts +0 -238
- package/src/services/personas-service.ts +0 -191
- package/src/services/pikku-user-id.test.ts +0 -62
- package/src/services/pikku-user-id.ts +0 -13
- package/src/services/queue-webhook-service.test.ts +0 -409
- package/src/services/queue-webhook-service.ts +0 -150
- package/src/services/remote-jobs.test.ts +0 -106
- package/src/services/remote-jobs.ts +0 -92
- package/src/services/scheduler-service.ts +0 -37
- package/src/services/schema-service.ts +0 -10
- package/src/services/scope-service.ts +0 -91
- package/src/services/scoped-credential-service.test.ts +0 -86
- package/src/services/scoped-credential-service.ts +0 -63
- package/src/services/scoped-secret-service.test.ts +0 -93
- package/src/services/scoped-secret-service.ts +0 -40
- package/src/services/secret-host-binding.test.ts +0 -138
- package/src/services/secret-host-binding.ts +0 -51
- package/src/services/secret-service.ts +0 -25
- package/src/services/secretless.test.ts +0 -54
- package/src/services/secretless.ts +0 -29
- package/src/services/session-store.ts +0 -9
- package/src/services/stub-tracker.test.ts +0 -104
- package/src/services/stub-tracker.ts +0 -175
- package/src/services/system-role-guard.test.ts +0 -96
- package/src/services/system-role-guard.ts +0 -71
- package/src/services/temporary-file-service.ts +0 -76
- package/src/services/trigger-service.ts +0 -5
- package/src/services/typed-credential-service.ts +0 -83
- package/src/services/typed-secret-service.test.ts +0 -204
- package/src/services/typed-secret-service.ts +0 -132
- package/src/services/typed-variables-service.test.ts +0 -166
- package/src/services/typed-variables-service.ts +0 -166
- package/src/services/user-session-service.test.ts +0 -147
- package/src/services/user-session-service.ts +0 -85
- package/src/services/v8-coverage-service.test.ts +0 -69
- package/src/services/v8-coverage-service.ts +0 -163
- package/src/services/variables-service.ts +0 -13
- package/src/services/webhook-service.ts +0 -147
- package/src/services/workflow-service.ts +0 -120
- package/src/side-effects-are-declared.test.ts +0 -84
- package/src/source-files-stay-composable.test.ts +0 -41
- package/src/template-alias-surface.test.ts +0 -240
- package/src/test-utils.ts +0 -38
- package/src/testing/index.ts +0 -3
- package/src/testing/service-tests/agent-run-service-tests.ts +0 -98
- package/src/testing/service-tests/agent-storage-service-tests.ts +0 -379
- package/src/testing/service-tests/channel-store-tests.ts +0 -98
- package/src/testing/service-tests/credential-service-tests.ts +0 -143
- package/src/testing/service-tests/deployment-service-tests.ts +0 -33
- package/src/testing/service-tests/event-hub-store-tests.ts +0 -48
- package/src/testing/service-tests/secret-service-tests.ts +0 -105
- package/src/testing/service-tests/session-store-tests.ts +0 -62
- package/src/testing/service-tests/workflow-run-service-tests.ts +0 -59
- package/src/testing/service-tests/workflow-service-tests.ts +0 -308
- package/src/testing/service-tests.ts +0 -95
- package/src/time-utils.test.ts +0 -56
- package/src/time-utils.ts +0 -89
- package/src/types/core.types.ts +0 -446
- package/src/types/index.ts +0 -25
- package/src/types/state.types.ts +0 -226
- package/src/types/typed-credentials.test.ts +0 -72
- package/src/utils/hash.test.ts +0 -68
- package/src/utils/hash.ts +0 -26
- package/src/utils/hmac.ts +0 -21
- package/src/utils/node-host-resolver.ts +0 -20
- package/src/utils/safe-fetch.test.ts +0 -515
- package/src/utils/safe-fetch.ts +0 -347
- package/src/utils.test.ts +0 -359
- package/src/utils.ts +0 -165
- package/src/version.test.ts +0 -80
- package/src/version.ts +0 -25
- package/src/wirings/actor-flow/actor-flow.types.ts +0 -40
- package/src/wirings/actor-flow/index.ts +0 -10
- package/src/wirings/actor-flow/run-conversation.test.ts +0 -187
- package/src/wirings/actor-flow/run-conversation.ts +0 -280
- package/src/wirings/addon/addon-auth-tags.test.ts +0 -219
- package/src/wirings/addon/addon-runner.ts +0 -236
- package/src/wirings/addon/addon-scopes.test.ts +0 -225
- package/src/wirings/addon/addon-secrets.test.ts +0 -391
- package/src/wirings/addon/index.ts +0 -12
- package/src/wirings/addon/remote-addon-auth.ts +0 -65
- package/src/wirings/addon/wire-addon.test.ts +0 -102
- package/src/wirings/addon/wire-addon.ts +0 -202
- package/src/wirings/addon/wire-remote-addon.ts +0 -41
- package/src/wirings/agent/agent-agui.test.ts +0 -1213
- package/src/wirings/agent/agent-agui.ts +0 -405
- package/src/wirings/agent/agent-authorization.test.ts +0 -208
- package/src/wirings/agent/agent-finalize.test.ts +0 -187
- package/src/wirings/agent/agent-finalize.ts +0 -197
- package/src/wirings/agent/agent-helpers.test.ts +0 -215
- package/src/wirings/agent/agent-helpers.ts +0 -96
- package/src/wirings/agent/agent-interrupt.test.ts +0 -833
- package/src/wirings/agent/agent-interrupt.ts +0 -400
- package/src/wirings/agent/agent-memory.test.ts +0 -397
- package/src/wirings/agent/agent-memory.ts +0 -496
- package/src/wirings/agent/agent-middleware.types.test.ts +0 -41
- package/src/wirings/agent/agent-model-config.test.ts +0 -103
- package/src/wirings/agent/agent-model-config.ts +0 -59
- package/src/wirings/agent/agent-prepare.test.ts +0 -977
- package/src/wirings/agent/agent-prepare.ts +0 -1083
- package/src/wirings/agent/agent-registry.test.ts +0 -455
- package/src/wirings/agent/agent-registry.ts +0 -99
- package/src/wirings/agent/agent-resume-authorization.test.ts +0 -206
- package/src/wirings/agent/agent-rpc.ts +0 -116
- package/src/wirings/agent/agent-runner.test.ts +0 -1229
- package/src/wirings/agent/agent-runner.ts +0 -858
- package/src/wirings/agent/agent-stream-delegate.test.ts +0 -381
- package/src/wirings/agent/agent-stream-output-hooks.test.ts +0 -353
- package/src/wirings/agent/agent-stream.test.ts +0 -1800
- package/src/wirings/agent/agent-stream.ts +0 -1639
- package/src/wirings/agent/agent-thread-ownership.test.ts +0 -297
- package/src/wirings/agent/agent-turn.test.ts +0 -65
- package/src/wirings/agent/agent-turn.ts +0 -122
- package/src/wirings/agent/agent-utils.ts +0 -20
- package/src/wirings/agent/agent.types.ts +0 -676
- package/src/wirings/agent/index.ts +0 -58
- package/src/wirings/agent/voice-input.test.ts +0 -220
- package/src/wirings/agent/voice-input.ts +0 -180
- package/src/wirings/agent/voice-output.test.ts +0 -510
- package/src/wirings/agent/voice-output.ts +0 -311
- package/src/wirings/agent-scorer/agent-scorer-grade.test.ts +0 -106
- package/src/wirings/agent-scorer/agent-scorer-grade.ts +0 -55
- package/src/wirings/agent-scorer/agent-scorer-judge.test.ts +0 -285
- package/src/wirings/agent-scorer/agent-scorer-judge.ts +0 -180
- package/src/wirings/agent-scorer/agent-scorer-live.test.ts +0 -174
- package/src/wirings/agent-scorer/agent-scorer-live.ts +0 -56
- package/src/wirings/agent-scorer/agent-scorer-registry.ts +0 -66
- package/src/wirings/agent-scorer/agent-scorer-sampling.test.ts +0 -34
- package/src/wirings/agent-scorer/agent-scorer-sampling.ts +0 -36
- package/src/wirings/agent-scorer/agent-scorer-snapshots.test.ts +0 -49
- package/src/wirings/agent-scorer/agent-scorer-snapshots.ts +0 -46
- package/src/wirings/agent-scorer/agent-scorer-worker.test.ts +0 -122
- package/src/wirings/agent-scorer/agent-scorer-worker.ts +0 -71
- package/src/wirings/agent-scorer/agent-scorer.ts +0 -102
- package/src/wirings/agent-scorer/agent-scorer.types.ts +0 -128
- package/src/wirings/agent-scorer/index.ts +0 -23
- package/src/wirings/channel/channel-common.ts +0 -102
- package/src/wirings/channel/channel-handler-shapes.test.ts +0 -72
- package/src/wirings/channel/channel-handler.test.ts +0 -322
- package/src/wirings/channel/channel-handler.ts +0 -259
- package/src/wirings/channel/channel-host-rpc.test.ts +0 -150
- package/src/wirings/channel/channel-host-rpc.ts +0 -69
- package/src/wirings/channel/channel-middleware-runner.test.ts +0 -188
- package/src/wirings/channel/channel-middleware-runner.ts +0 -126
- package/src/wirings/channel/channel-rpc-registry.ts +0 -116
- package/src/wirings/channel/channel-rpc-responder.ts +0 -117
- package/src/wirings/channel/channel-rpc-service.ts +0 -132
- package/src/wirings/channel/channel-rpc-validators.ts +0 -65
- package/src/wirings/channel/channel-rpc.test.ts +0 -841
- package/src/wirings/channel/channel-rpc.ts +0 -5
- package/src/wirings/channel/channel-rpc.types.ts +0 -160
- package/src/wirings/channel/channel-runner.ts +0 -164
- package/src/wirings/channel/channel-store.ts +0 -35
- package/src/wirings/channel/channel.types.ts +0 -193
- package/src/wirings/channel/define-channel-routes.ts +0 -5
- package/src/wirings/channel/eventhub-service.ts +0 -16
- package/src/wirings/channel/eventhub-store.ts +0 -13
- package/src/wirings/channel/index.ts +0 -40
- package/src/wirings/channel/local/index.ts +0 -3
- package/src/wirings/channel/local/local-channel-handler.ts +0 -98
- package/src/wirings/channel/local/local-channel-runner.test.ts +0 -339
- package/src/wirings/channel/local/local-channel-runner.ts +0 -271
- package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -77
- package/src/wirings/channel/local/local-eventhub-service.ts +0 -69
- package/src/wirings/channel/log-channels.ts +0 -16
- package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +0 -135
- package/src/wirings/channel/pikku-abstract-channel-handler.ts +0 -60
- package/src/wirings/channel/serverless/index.ts +0 -6
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +0 -328
- package/src/wirings/cli/channel/cli-approval.test.ts +0 -177
- package/src/wirings/cli/channel/cli-approval.ts +0 -135
- package/src/wirings/cli/channel/cli-channel-runner.ts +0 -118
- package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +0 -192
- package/src/wirings/cli/channel/cli-raw-channel-runner.ts +0 -148
- package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +0 -480
- package/src/wirings/cli/channel/cli-raw-client-runner.ts +0 -188
- package/src/wirings/cli/channel/index.ts +0 -6
- package/src/wirings/cli/cli-runner.test.ts +0 -969
- package/src/wirings/cli/cli-runner.ts +0 -538
- package/src/wirings/cli/cli.types.ts +0 -388
- package/src/wirings/cli/command-parser.test.ts +0 -1120
- package/src/wirings/cli/command-parser.ts +0 -713
- package/src/wirings/cli/define-cli-commands.ts +0 -13
- package/src/wirings/cli/format-cli-error.test.ts +0 -91
- package/src/wirings/cli/format-cli-error.ts +0 -96
- package/src/wirings/cli/index.ts +0 -19
- package/src/wirings/credential/credential.types.ts +0 -37
- package/src/wirings/credential/define-credential.ts +0 -49
- package/src/wirings/credential/index.ts +0 -7
- package/src/wirings/credential/validate-credential-definitions.ts +0 -63
- package/src/wirings/gateway/gateway-authorization.test.ts +0 -575
- package/src/wirings/gateway/gateway-channel-meta.test.ts +0 -44
- package/src/wirings/gateway/gateway-runner.test.ts +0 -581
- package/src/wirings/gateway/gateway-runner.ts +0 -411
- package/src/wirings/gateway/gateway.types.ts +0 -137
- package/src/wirings/gateway/index.ts +0 -15
- package/src/wirings/http/http-routes.test.ts +0 -318
- package/src/wirings/http/http-routes.ts +0 -111
- package/src/wirings/http/http-runner-addon-ref.test.ts +0 -238
- package/src/wirings/http/http-runner.test.ts +0 -503
- package/src/wirings/http/http-runner.ts +0 -462
- package/src/wirings/http/http.types.ts +0 -307
- package/src/wirings/http/index.ts +0 -27
- package/src/wirings/http/log-http-routes.ts +0 -18
- package/src/wirings/http/pikku-fetch-http-request.test.ts +0 -318
- package/src/wirings/http/pikku-fetch-http-request.ts +0 -260
- package/src/wirings/http/pikku-fetch-http-response.test.ts +0 -123
- package/src/wirings/http/pikku-fetch-http-response.ts +0 -149
- package/src/wirings/http/routers/http-router.ts +0 -13
- package/src/wirings/http/routers/path-to-regex.test.ts +0 -306
- package/src/wirings/http/routers/path-to-regex.ts +0 -115
- package/src/wirings/http/web-request.test.ts +0 -382
- package/src/wirings/http/web-request.ts +0 -162
- package/src/wirings/mcp/index.ts +0 -26
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -388
- package/src/wirings/mcp/mcp-endpoint-registry.ts +0 -159
- package/src/wirings/mcp/mcp-runner.test.ts +0 -588
- package/src/wirings/mcp/mcp-runner.ts +0 -330
- package/src/wirings/mcp/mcp.types.ts +0 -199
- package/src/wirings/node/index.ts +0 -2
- package/src/wirings/node/node.types.ts +0 -23
- package/src/wirings/oauth2/index.ts +0 -1
- package/src/wirings/oauth2/oauth2.types.ts +0 -12
- package/src/wirings/persona/define-personas.ts +0 -33
- package/src/wirings/persona/index.ts +0 -75
- package/src/wirings/persona/persona-app-scopes.test.ts +0 -47
- package/src/wirings/persona/persona-app-scopes.ts +0 -74
- package/src/wirings/persona/persona-email.ts +0 -87
- package/src/wirings/persona/persona-environments.test.ts +0 -194
- package/src/wirings/persona/persona-environments.ts +0 -138
- package/src/wirings/persona/persona-mailbox.ts +0 -156
- package/src/wirings/persona/persona.test.ts +0 -230
- package/src/wirings/persona/persona.types.ts +0 -156
- package/src/wirings/persona/validate-personas.ts +0 -137
- package/src/wirings/queue/index.ts +0 -29
- package/src/wirings/queue/queue-identity.test.ts +0 -454
- package/src/wirings/queue/queue-identity.ts +0 -176
- package/src/wirings/queue/queue-runner.test.ts +0 -705
- package/src/wirings/queue/queue-runner.ts +0 -181
- package/src/wirings/queue/queue.types.ts +0 -161
- package/src/wirings/queue/register-queue-helper.ts +0 -46
- package/src/wirings/queue/signed-queue-service.ts +0 -60
- package/src/wirings/queue/validate-worker-config.test.ts +0 -108
- package/src/wirings/queue/validate-worker-config.ts +0 -90
- package/src/wirings/role/define-system-role.ts +0 -33
- package/src/wirings/role/index.ts +0 -13
- package/src/wirings/role/role.test.ts +0 -104
- package/src/wirings/role/role.types.ts +0 -47
- package/src/wirings/role/validate-role-definitions.ts +0 -93
- package/src/wirings/rpc/index.ts +0 -8
- package/src/wirings/rpc/rpc-runner.test.ts +0 -1130
- package/src/wirings/rpc/rpc-runner.ts +0 -569
- package/src/wirings/rpc/rpc-types.ts +0 -87
- package/src/wirings/scheduler/index.ts +0 -11
- package/src/wirings/scheduler/log-schedulers.ts +0 -16
- package/src/wirings/scheduler/scheduler-runner.test.ts +0 -835
- package/src/wirings/scheduler/scheduler-runner.ts +0 -138
- package/src/wirings/scheduler/scheduler.types.ts +0 -42
- package/src/wirings/scope/define-scope.ts +0 -33
- package/src/wirings/scope/index.ts +0 -15
- package/src/wirings/scope/scope.test.ts +0 -159
- package/src/wirings/scope/scope.types.ts +0 -42
- package/src/wirings/scope/validate-scope-definitions.ts +0 -107
- package/src/wirings/secret/index.ts +0 -9
- package/src/wirings/secret/secret.types.ts +0 -70
- package/src/wirings/secret/validate-secret-definitions.test.ts +0 -232
- package/src/wirings/secret/validate-secret-definitions.ts +0 -88
- package/src/wirings/trigger/index.ts +0 -9
- package/src/wirings/trigger/pikku-trigger-service.ts +0 -107
- package/src/wirings/trigger/trigger-runner.test.ts +0 -78
- package/src/wirings/trigger/trigger-runner.ts +0 -113
- package/src/wirings/trigger/trigger.types.ts +0 -100
- package/src/wirings/variable/index.ts +0 -8
- package/src/wirings/variable/validate-variable-definitions.test.ts +0 -115
- package/src/wirings/variable/validate-variable-definitions.ts +0 -71
- package/src/wirings/variable/variable.types.ts +0 -40
- package/src/wirings/virtual-user/index.ts +0 -107
- package/src/wirings/virtual-user/prepare-virtual-user-run.test.ts +0 -115
- package/src/wirings/virtual-user/prepare-virtual-user-run.ts +0 -95
- package/src/wirings/virtual-user/run-virtual-user.test.ts +0 -774
- package/src/wirings/virtual-user/run-virtual-user.ts +0 -684
- package/src/wirings/virtual-user/virtual-user-agents.test.ts +0 -72
- package/src/wirings/virtual-user/virtual-user-agents.ts +0 -62
- package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +0 -215
- package/src/wirings/virtual-user/virtual-user-catalogue.ts +0 -184
- package/src/wirings/virtual-user/virtual-user-derive.test.ts +0 -426
- package/src/wirings/virtual-user/virtual-user-derive.ts +0 -161
- package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +0 -68
- package/src/wirings/virtual-user/virtual-user-dispositions.ts +0 -210
- package/src/wirings/virtual-user/virtual-user-intents.test.ts +0 -218
- package/src/wirings/virtual-user/virtual-user-intents.ts +0 -185
- package/src/wirings/virtual-user/virtual-user-rng.test.ts +0 -72
- package/src/wirings/virtual-user/virtual-user-rng.ts +0 -50
- package/src/wirings/virtual-user/virtual-user-run-store.ts +0 -131
- package/src/wirings/virtual-user/virtual-user-scaffold.test.ts +0 -854
- package/src/wirings/virtual-user/virtual-user-scaffold.ts +0 -664
- package/src/wirings/virtual-user/virtual-user-schedule-store.ts +0 -93
- package/src/wirings/virtual-user/virtual-user-schedule.test.ts +0 -280
- package/src/wirings/virtual-user/virtual-user-schedule.ts +0 -156
- package/src/wirings/virtual-user/virtual-user-target.ts +0 -47
- package/src/wirings/virtual-user/virtual-user.types.ts +0 -215
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +0 -709
- package/src/wirings/workflow/dsl/workflow-runner.ts +0 -25
- package/src/wirings/workflow/feature.test.ts +0 -131
- package/src/wirings/workflow/feature.ts +0 -59
- package/src/wirings/workflow/graph/graph-foreach-queued.test.ts +0 -569
- package/src/wirings/workflow/graph/graph-foreach.test.ts +0 -626
- package/src/wirings/workflow/graph/graph-node.ts +0 -115
- package/src/wirings/workflow/graph/graph-runner.test.ts +0 -1049
- package/src/wirings/workflow/graph/graph-runner.ts +0 -1376
- package/src/wirings/workflow/graph/graph-validation.test.ts +0 -27
- package/src/wirings/workflow/graph/graph-validation.ts +0 -41
- package/src/wirings/workflow/graph/template.test.ts +0 -49
- package/src/wirings/workflow/graph/template.ts +0 -42
- package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -39
- package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -75
- package/src/wirings/workflow/index.ts +0 -107
- package/src/wirings/workflow/pikku-scenario-service.ts +0 -1013
- package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -963
- package/src/wirings/workflow/pikku-workflow-service.ts +0 -1993
- package/src/wirings/workflow/run-timeline.test.ts +0 -199
- package/src/wirings/workflow/run-timeline.ts +0 -185
- package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -107
- package/src/wirings/workflow/scenario-cookie-jar.ts +0 -57
- package/src/wirings/workflow/scenario-expectations.test.ts +0 -238
- package/src/wirings/workflow/scenario-hooks.test.ts +0 -259
- package/src/wirings/workflow/scenario-poll.test.ts +0 -64
- package/src/wirings/workflow/scenario-poll.ts +0 -27
- package/src/wirings/workflow/scenario-prose.test.ts +0 -275
- package/src/wirings/workflow/scenario-prose.ts +0 -86
- package/src/wirings/workflow/scenario-run.types.ts +0 -193
- package/src/wirings/workflow/scenario-service.test.ts +0 -147
- package/src/wirings/workflow/scenario-step-guards.ts +0 -23
- package/src/wirings/workflow/scenario-step.test.ts +0 -800
- package/src/wirings/workflow/scenario-step.types.ts +0 -262
- package/src/wirings/workflow/scenario-surface.test.ts +0 -146
- package/src/wirings/workflow/scenario-surface.ts +0 -71
- package/src/wirings/workflow/scenario.types.ts +0 -63
- package/src/wirings/workflow/workflow-approval-audit.ts +0 -47
- package/src/wirings/workflow/workflow-approval-policy.test.ts +0 -594
- package/src/wirings/workflow/workflow-approval-policy.ts +0 -68
- package/src/wirings/workflow/workflow-approval.ts +0 -290
- package/src/wirings/workflow/workflow-child-run-session.test.ts +0 -168
- package/src/wirings/workflow/workflow-constants.ts +0 -66
- package/src/wirings/workflow/workflow-dispatch-durability.test.ts +0 -116
- package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -55
- package/src/wirings/workflow/workflow-dispatch-relay.test.ts +0 -128
- package/src/wirings/workflow/workflow-errors.ts +0 -132
- package/src/wirings/workflow/workflow-inline-authority.test.ts +0 -175
- package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -51
- package/src/wirings/workflow/workflow-invocation-id.ts +0 -28
- package/src/wirings/workflow/workflow-meta-resolver.ts +0 -45
- package/src/wirings/workflow/workflow-mirror.test.ts +0 -171
- package/src/wirings/workflow/workflow-missing-meta.test.ts +0 -92
- package/src/wirings/workflow/workflow-on-error.test.ts +0 -145
- package/src/wirings/workflow/workflow-queue-routing.ts +0 -129
- package/src/wirings/workflow/workflow-queue-wiring.ts +0 -149
- package/src/wirings/workflow/workflow-queue-workers.test.ts +0 -131
- package/src/wirings/workflow/workflow-queue-workers.ts +0 -66
- package/src/wirings/workflow/workflow-recovery.ts +0 -192
- package/src/wirings/workflow/workflow-replay-snapshot.test.ts +0 -140
- package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -113
- package/src/wirings/workflow/workflow-run-authority.test.ts +0 -212
- package/src/wirings/workflow/workflow-run-context.test.ts +0 -172
- package/src/wirings/workflow/workflow-run-engine.types.ts +0 -92
- package/src/wirings/workflow/workflow-run-ownership.ts +0 -37
- package/src/wirings/workflow/workflow-run-polling.test.ts +0 -127
- package/src/wirings/workflow/workflow-stalled-recovery.test.ts +0 -152
- package/src/wirings/workflow/workflow-status-stream.test.ts +0 -354
- package/src/wirings/workflow/workflow-status-stream.ts +0 -144
- package/src/wirings/workflow/workflow-step-claim.ts +0 -46
- package/src/wirings/workflow/workflow-step-ordinal.test.ts +0 -94
- package/src/wirings/workflow/workflow-step-session.test.ts +0 -87
- package/src/wirings/workflow/workflow-suspend.ts +0 -61
- package/src/wirings/workflow/workflow-terminal-run-guard.test.ts +0 -105
- package/src/wirings/workflow/workflow.types.ts +0 -268
- package/src/wirings-stay-decoupled.test.ts +0 -130
- package/tsconfig.json +0 -14
- package/tsconfig.tsbuildinfo +0 -1
- package/tsconfig.type-tests.json +0 -15
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
CoreSingletonServices,
|
|
3
|
-
PikkuRawWire,
|
|
4
|
-
} from '../../types/core.types.js'
|
|
5
|
-
import type { MiddlewareMetadata } from '../../middleware/middleware.types.js'
|
|
6
|
-
import type { CorePikkuChannelMiddleware } from './channel.types.js'
|
|
7
|
-
import { pikkuState } from '../../pikku-state.js'
|
|
8
|
-
import { freezeDedupe, getTagGroups } from '../../utils.js'
|
|
9
|
-
|
|
10
|
-
export const addChannelMiddleware = (
|
|
11
|
-
tag: string,
|
|
12
|
-
middleware: CorePikkuChannelMiddleware[],
|
|
13
|
-
packageName: string | null = null
|
|
14
|
-
): CorePikkuChannelMiddleware[] => {
|
|
15
|
-
const tagGroups = pikkuState(packageName, 'channelMiddleware', 'tagGroup')
|
|
16
|
-
tagGroups[tag] = middleware
|
|
17
|
-
return middleware
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const getChannelMiddlewareByName = (
|
|
21
|
-
name: string
|
|
22
|
-
): CorePikkuChannelMiddleware | undefined => {
|
|
23
|
-
const store = pikkuState(null, 'misc', 'channelMiddleware')
|
|
24
|
-
const middleware = store[name]
|
|
25
|
-
return middleware?.[0]
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const channelMiddlewareCache: Record<
|
|
29
|
-
string,
|
|
30
|
-
readonly CorePikkuChannelMiddleware[]
|
|
31
|
-
> = {}
|
|
32
|
-
|
|
33
|
-
export const clearChannelMiddlewareCache = () => {
|
|
34
|
-
for (const key of Object.keys(channelMiddlewareCache)) {
|
|
35
|
-
delete channelMiddlewareCache[key]
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export const combineChannelMiddleware = (
|
|
40
|
-
wireType: string,
|
|
41
|
-
uid: string,
|
|
42
|
-
{
|
|
43
|
-
wireInheritedChannelMiddleware,
|
|
44
|
-
wireChannelMiddleware,
|
|
45
|
-
packageName = null,
|
|
46
|
-
}: {
|
|
47
|
-
wireInheritedChannelMiddleware?: MiddlewareMetadata[]
|
|
48
|
-
wireChannelMiddleware?: CorePikkuChannelMiddleware[]
|
|
49
|
-
packageName?: string | null
|
|
50
|
-
} = {}
|
|
51
|
-
): readonly CorePikkuChannelMiddleware[] => {
|
|
52
|
-
const cacheKey = `${wireType}:${uid}`
|
|
53
|
-
let inherited = channelMiddlewareCache[cacheKey]
|
|
54
|
-
if (!inherited) {
|
|
55
|
-
const resolved: CorePikkuChannelMiddleware[] = []
|
|
56
|
-
if (wireInheritedChannelMiddleware) {
|
|
57
|
-
for (const meta of wireInheritedChannelMiddleware) {
|
|
58
|
-
if (meta.type === 'tag') {
|
|
59
|
-
const groups = getTagGroups(
|
|
60
|
-
pikkuState(packageName, 'channelMiddleware', 'tagGroup'),
|
|
61
|
-
meta.tag
|
|
62
|
-
)
|
|
63
|
-
for (const group of groups) {
|
|
64
|
-
resolved.push(...group)
|
|
65
|
-
}
|
|
66
|
-
} else if (meta.type === 'wire') {
|
|
67
|
-
const middleware = getChannelMiddlewareByName(meta.name)
|
|
68
|
-
if (middleware) {
|
|
69
|
-
resolved.push(middleware)
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
inherited = channelMiddlewareCache[cacheKey] = freezeDedupe(
|
|
75
|
-
resolved
|
|
76
|
-
) as readonly CorePikkuChannelMiddleware[]
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
if (!wireChannelMiddleware?.length) {
|
|
80
|
-
return inherited
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
return freezeDedupe([
|
|
84
|
-
...inherited,
|
|
85
|
-
...wireChannelMiddleware,
|
|
86
|
-
]) as readonly CorePikkuChannelMiddleware[]
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export function wrapChannelWithMiddleware<Out>(
|
|
90
|
-
wire: PikkuRawWire,
|
|
91
|
-
services: CoreSingletonServices,
|
|
92
|
-
middlewares: readonly CorePikkuChannelMiddleware[]
|
|
93
|
-
): PikkuRawWire {
|
|
94
|
-
if (middlewares.length === 0 || !wire.channel) return wire
|
|
95
|
-
|
|
96
|
-
const channel = wire.channel
|
|
97
|
-
const originalSend = channel.send.bind(channel)
|
|
98
|
-
|
|
99
|
-
const dispatch = async (index: number, event: Out): Promise<void> => {
|
|
100
|
-
if (index >= middlewares.length) {
|
|
101
|
-
await originalSend(event)
|
|
102
|
-
return
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
const middleware = middlewares[index]!
|
|
106
|
-
await middleware(services, event, async (result: any) => {
|
|
107
|
-
if (result === null || result === undefined) return
|
|
108
|
-
if (Array.isArray(result)) {
|
|
109
|
-
for (const item of result) {
|
|
110
|
-
await dispatch(index + 1, item)
|
|
111
|
-
}
|
|
112
|
-
} else {
|
|
113
|
-
await dispatch(index + 1, result)
|
|
114
|
-
}
|
|
115
|
-
})
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
return {
|
|
119
|
-
...wire,
|
|
120
|
-
channel: {
|
|
121
|
-
...channel,
|
|
122
|
-
send: ((data: Out) => dispatch(0, data)) as typeof channel.send,
|
|
123
|
-
sendBinary: channel.sendBinary,
|
|
124
|
-
},
|
|
125
|
-
}
|
|
126
|
-
}
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ChannelRPCError,
|
|
3
|
-
type ChannelRPCResponse,
|
|
4
|
-
} from './channel-rpc.types.js'
|
|
5
|
-
|
|
6
|
-
interface PendingCall {
|
|
7
|
-
resolve: (value: unknown) => void
|
|
8
|
-
reject: (error: Error) => void
|
|
9
|
-
timer?: ReturnType<typeof setTimeout>
|
|
10
|
-
awaitingHuman?: boolean
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Tracks in-flight reverse RPC calls for one channel. One registry per
|
|
15
|
-
* connection: ids are only unique within a socket, and a dropped socket must
|
|
16
|
-
* reject exactly the calls that were riding on it.
|
|
17
|
-
*/
|
|
18
|
-
export class ChannelRPCRegistry {
|
|
19
|
-
private pending = new Map<string, PendingCall>()
|
|
20
|
-
private nextId = 0
|
|
21
|
-
private closed = false
|
|
22
|
-
|
|
23
|
-
constructor(private readonly timeoutMs: number = 30_000) {}
|
|
24
|
-
|
|
25
|
-
public get inFlight(): number {
|
|
26
|
-
return this.pending.size
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
public register(): { id: string; promise: Promise<unknown> } {
|
|
30
|
-
if (this.closed) {
|
|
31
|
-
return {
|
|
32
|
-
id: '',
|
|
33
|
-
promise: Promise.reject(
|
|
34
|
-
new ChannelRPCError('Channel is closed', 'closed')
|
|
35
|
-
),
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const id = `${++this.nextId}`
|
|
40
|
-
const promise = new Promise<unknown>((resolve, reject) => {
|
|
41
|
-
const timer =
|
|
42
|
-
this.timeoutMs > 0
|
|
43
|
-
? setTimeout(() => {
|
|
44
|
-
this.pending.delete(id)
|
|
45
|
-
reject(
|
|
46
|
-
new ChannelRPCError(
|
|
47
|
-
`Channel RPC ${id} timed out after ${this.timeoutMs}ms`,
|
|
48
|
-
'timeout'
|
|
49
|
-
)
|
|
50
|
-
)
|
|
51
|
-
}, this.timeoutMs)
|
|
52
|
-
: undefined
|
|
53
|
-
// Never hold the process open waiting on a peer that may not answer.
|
|
54
|
-
timer?.unref?.()
|
|
55
|
-
this.pending.set(id, { resolve, reject, timer })
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
return { id, promise }
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Stops the clock on a call whose peer is asking a human. The timeout exists
|
|
63
|
-
* to bound a peer that has gone away, and a person reading a prompt is not
|
|
64
|
-
* that; `rejectAll` still fails the call the moment the socket drops.
|
|
65
|
-
*
|
|
66
|
-
* Returns false for an unknown id — a pending frame for a call that already
|
|
67
|
-
* timed out is stale, not an error.
|
|
68
|
-
*/
|
|
69
|
-
public hold(id: string): boolean {
|
|
70
|
-
const call = this.pending.get(id)
|
|
71
|
-
if (!call || call.awaitingHuman) {
|
|
72
|
-
return false
|
|
73
|
-
}
|
|
74
|
-
clearTimeout(call.timer)
|
|
75
|
-
call.timer = undefined
|
|
76
|
-
call.awaitingHuman = true
|
|
77
|
-
return true
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/** Returns false for an unknown id, so a late reply is dropped. */
|
|
81
|
-
public settle(response: ChannelRPCResponse): boolean {
|
|
82
|
-
const call = this.pending.get(response.id)
|
|
83
|
-
if (!call) {
|
|
84
|
-
return false
|
|
85
|
-
}
|
|
86
|
-
this.pending.delete(response.id)
|
|
87
|
-
clearTimeout(call.timer)
|
|
88
|
-
|
|
89
|
-
if (response.ok) {
|
|
90
|
-
call.resolve(response.result)
|
|
91
|
-
} else {
|
|
92
|
-
// Peer input: a non-string name or message falls back rather than being
|
|
93
|
-
// attached to an Error, where it would surface as `[object Object]`.
|
|
94
|
-
const { name, message } = response.error ?? {}
|
|
95
|
-
const error = new ChannelRPCError(
|
|
96
|
-
typeof message === 'string' ? message : 'Remote channel RPC failed',
|
|
97
|
-
'remote'
|
|
98
|
-
)
|
|
99
|
-
if (typeof name === 'string' && name.length > 0) {
|
|
100
|
-
error.name = name
|
|
101
|
-
}
|
|
102
|
-
call.reject(error)
|
|
103
|
-
}
|
|
104
|
-
return true
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/** Without this a caller awaits the full timeout on a connection that is gone. */
|
|
108
|
-
public rejectAll(reason: string = 'Channel closed'): void {
|
|
109
|
-
this.closed = true
|
|
110
|
-
for (const [, call] of this.pending) {
|
|
111
|
-
clearTimeout(call.timer)
|
|
112
|
-
call.reject(new ChannelRPCError(reason, 'closed'))
|
|
113
|
-
}
|
|
114
|
-
this.pending.clear()
|
|
115
|
-
}
|
|
116
|
-
}
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
CHANNEL_RPC_PENDING,
|
|
3
|
-
CHANNEL_RPC_RESPONSE,
|
|
4
|
-
isCapabilityDef,
|
|
5
|
-
isChannelRPCRequest,
|
|
6
|
-
resolveCapability,
|
|
7
|
-
type ApprovalRequester,
|
|
8
|
-
type Capabilities,
|
|
9
|
-
type ChannelRPCPending,
|
|
10
|
-
type ChannelRPCResponse,
|
|
11
|
-
} from './channel-rpc.types.js'
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Answers reverse RPC requests arriving on a channel.
|
|
15
|
-
*
|
|
16
|
-
* `capabilities` is the authorisation boundary, not a convenience: the peer is
|
|
17
|
-
* asking this process to execute code, so only listed names run. An absent
|
|
18
|
-
* name is refused exactly like an unknown one, so the caller cannot probe for
|
|
19
|
-
* what this end can do.
|
|
20
|
-
*/
|
|
21
|
-
export const createChannelRPCResponder = ({
|
|
22
|
-
capabilities,
|
|
23
|
-
send,
|
|
24
|
-
approve,
|
|
25
|
-
}: {
|
|
26
|
-
capabilities: Capabilities
|
|
27
|
-
send: (data: unknown) => Promise<void> | void
|
|
28
|
-
/** Omitted means there is nobody to ask, which refuses rather than runs. */
|
|
29
|
-
approve?: ApprovalRequester
|
|
30
|
-
}) => {
|
|
31
|
-
return async (message: unknown): Promise<boolean> => {
|
|
32
|
-
if (!isChannelRPCRequest(message)) {
|
|
33
|
-
return false
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const refuse = (name: string, why: string): ChannelRPCResponse => ({
|
|
37
|
-
action: CHANNEL_RPC_RESPONSE,
|
|
38
|
-
id: message.id,
|
|
39
|
-
ok: false,
|
|
40
|
-
error: { name, message: why },
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
// Own properties only: an object literal inherits from `Object.prototype`,
|
|
44
|
-
// so a peer asking for `toString` would otherwise resolve a real function.
|
|
45
|
-
const entry = Object.prototype.hasOwnProperty.call(
|
|
46
|
-
capabilities,
|
|
47
|
-
message.funcName
|
|
48
|
-
)
|
|
49
|
-
? capabilities[message.funcName]
|
|
50
|
-
: undefined
|
|
51
|
-
|
|
52
|
-
if (
|
|
53
|
-
entry === undefined ||
|
|
54
|
-
(typeof entry !== 'function' && !isCapabilityDef(entry))
|
|
55
|
-
) {
|
|
56
|
-
await send(
|
|
57
|
-
refuse(
|
|
58
|
-
'RPCNotFoundError',
|
|
59
|
-
`Capability not exposed: ${message.funcName}`
|
|
60
|
-
)
|
|
61
|
-
)
|
|
62
|
-
return true
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const { execute, needsApproval, approvalDescriptionFn } =
|
|
66
|
-
resolveCapability(entry)
|
|
67
|
-
|
|
68
|
-
let response: ChannelRPCResponse
|
|
69
|
-
try {
|
|
70
|
-
if (needsApproval) {
|
|
71
|
-
if (!approve) {
|
|
72
|
-
await send(
|
|
73
|
-
refuse(
|
|
74
|
-
'RPCNotApprovedError',
|
|
75
|
-
`"${message.funcName}" needs approval and there is nobody to ask`
|
|
76
|
-
)
|
|
77
|
-
)
|
|
78
|
-
return true
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Before the asking, not after: an answer arriving past the caller's
|
|
82
|
-
// timeout is dropped, silently discarding the human's decision.
|
|
83
|
-
const description = await approvalDescriptionFn?.(message.data)
|
|
84
|
-
await send({
|
|
85
|
-
action: CHANNEL_RPC_PENDING,
|
|
86
|
-
id: message.id,
|
|
87
|
-
reason: description ?? `approval for ${message.funcName}`,
|
|
88
|
-
} satisfies ChannelRPCPending)
|
|
89
|
-
|
|
90
|
-
const approved = await approve({
|
|
91
|
-
funcName: message.funcName,
|
|
92
|
-
data: message.data,
|
|
93
|
-
description,
|
|
94
|
-
})
|
|
95
|
-
if (!approved) {
|
|
96
|
-
await send(
|
|
97
|
-
refuse('RPCDeniedError', `"${message.funcName}" was not approved`)
|
|
98
|
-
)
|
|
99
|
-
return true
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
response = {
|
|
104
|
-
action: CHANNEL_RPC_RESPONSE,
|
|
105
|
-
id: message.id,
|
|
106
|
-
ok: true,
|
|
107
|
-
result: await execute(message.data),
|
|
108
|
-
}
|
|
109
|
-
} catch (e: unknown) {
|
|
110
|
-
const error = e as Error
|
|
111
|
-
response = refuse(error?.name ?? 'Error', error?.message ?? String(e))
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
await send(response)
|
|
115
|
-
return true
|
|
116
|
-
}
|
|
117
|
-
}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import type { DeploymentService } from '../../services/deployment-service.js'
|
|
2
|
-
import { ChannelRPCRegistry } from './channel-rpc-registry.js'
|
|
3
|
-
import {
|
|
4
|
-
CHANNEL_RPC_REQUEST,
|
|
5
|
-
CHANNEL_RPC_RESPONSE,
|
|
6
|
-
ChannelRPCError,
|
|
7
|
-
isChannelRPCPending,
|
|
8
|
-
isChannelRPCResponse,
|
|
9
|
-
type ChannelRPCRequest,
|
|
10
|
-
type ChannelRPCValidator,
|
|
11
|
-
} from './channel-rpc.types.js'
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* A `DeploymentService` whose transport is an open channel rather than an
|
|
15
|
-
* address, so a server-side function can call back into a peer that has no
|
|
16
|
-
* inbound route of its own.
|
|
17
|
-
*
|
|
18
|
-
* It slots into the existing `services.deploymentService` hole, leaving
|
|
19
|
-
* `rpc.remote` resolution, session propagation and traceId plumbing unchanged.
|
|
20
|
-
*/
|
|
21
|
-
export class ChannelDeploymentService implements DeploymentService {
|
|
22
|
-
public readonly registry: ChannelRPCRegistry
|
|
23
|
-
private readonly validateInput?: ChannelRPCValidator
|
|
24
|
-
private readonly validateResult?: ChannelRPCValidator
|
|
25
|
-
|
|
26
|
-
constructor(
|
|
27
|
-
private readonly send: (data: unknown) => Promise<void> | void,
|
|
28
|
-
options: {
|
|
29
|
-
timeoutMs?: number
|
|
30
|
-
validateInput?: ChannelRPCValidator
|
|
31
|
-
validateResult?: ChannelRPCValidator
|
|
32
|
-
} = {}
|
|
33
|
-
) {
|
|
34
|
-
this.registry = new ChannelRPCRegistry(options.timeoutMs)
|
|
35
|
-
this.validateInput = options.validateInput
|
|
36
|
-
this.validateResult = options.validateResult
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
public async init(): Promise<void> {}
|
|
40
|
-
|
|
41
|
-
public async start(): Promise<void> {}
|
|
42
|
-
|
|
43
|
-
public async stop(): Promise<void> {
|
|
44
|
-
this.registry.rejectAll('Deployment service stopped')
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/** The channel owner must call this — the service has no read side. */
|
|
48
|
-
public handleResponse(message: unknown): boolean {
|
|
49
|
-
if (isChannelRPCPending(message)) {
|
|
50
|
-
return this.registry.hold(message.id)
|
|
51
|
-
}
|
|
52
|
-
return isChannelRPCResponse(message) ? this.registry.settle(message) : false
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* `session` is accepted to satisfy `DeploymentService` and deliberately not
|
|
57
|
-
* sent: the peer runs the capability as itself, on its own machine, so a
|
|
58
|
-
* session on the wire would carry the caller's credentials while authorising
|
|
59
|
-
* nothing.
|
|
60
|
-
*/
|
|
61
|
-
public async invoke(
|
|
62
|
-
funcName: string,
|
|
63
|
-
data: unknown,
|
|
64
|
-
_session?: unknown,
|
|
65
|
-
traceId?: string
|
|
66
|
-
): Promise<unknown> {
|
|
67
|
-
// Not a security control — the peer must check what it is handed, and a
|
|
68
|
-
// hostile caller would send arguments that pass. It catches version drift
|
|
69
|
-
// and fails it here rather than inside the peer's process.
|
|
70
|
-
if (this.validateInput) {
|
|
71
|
-
try {
|
|
72
|
-
await this.validateInput(funcName, data)
|
|
73
|
-
} catch (e: unknown) {
|
|
74
|
-
throw new ChannelRPCError(
|
|
75
|
-
`Invalid arguments for "${funcName}": ${(e as Error)?.message ?? String(e)}`,
|
|
76
|
-
'invalid'
|
|
77
|
-
)
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const { id, promise } = this.registry.register()
|
|
82
|
-
// A closed registry answers with an already-rejected promise and no id.
|
|
83
|
-
// Returning it before the send keeps that rejection from sitting unobserved.
|
|
84
|
-
if (!id) {
|
|
85
|
-
return promise
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const request: ChannelRPCRequest = {
|
|
89
|
-
action: CHANNEL_RPC_REQUEST,
|
|
90
|
-
id,
|
|
91
|
-
funcName,
|
|
92
|
-
data,
|
|
93
|
-
traceId,
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
try {
|
|
97
|
-
await this.send(request)
|
|
98
|
-
} catch (e: unknown) {
|
|
99
|
-
// The call is registered before the request goes out, so a failed send
|
|
100
|
-
// would otherwise leave an entry whose timeout rejects into an unhandled
|
|
101
|
-
// rejection with nobody waiting on it.
|
|
102
|
-
this.registry.settle({
|
|
103
|
-
action: CHANNEL_RPC_RESPONSE,
|
|
104
|
-
id,
|
|
105
|
-
ok: false,
|
|
106
|
-
error: {
|
|
107
|
-
name: (e as Error)?.name ?? 'Error',
|
|
108
|
-
message: (e as Error)?.message ?? String(e),
|
|
109
|
-
},
|
|
110
|
-
})
|
|
111
|
-
promise.catch(() => {})
|
|
112
|
-
throw e
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
const result = await promise
|
|
116
|
-
if (!this.validateResult) {
|
|
117
|
-
return result
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// The peer answers with whatever it likes, so this is where a value that
|
|
121
|
-
// has been through nothing enters a server-side command.
|
|
122
|
-
try {
|
|
123
|
-
await this.validateResult(funcName, result)
|
|
124
|
-
} catch (e: unknown) {
|
|
125
|
-
throw new ChannelRPCError(
|
|
126
|
-
`Invalid result from "${funcName}": ${(e as Error)?.message ?? String(e)}`,
|
|
127
|
-
'invalid'
|
|
128
|
-
)
|
|
129
|
-
}
|
|
130
|
-
return result
|
|
131
|
-
}
|
|
132
|
-
}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import type { CoreSingletonServices } from '../../types/core.types.js'
|
|
2
|
-
import { pikkuState } from '../../pikku-state.js'
|
|
3
|
-
import { validateSchema } from '../../schema.js'
|
|
4
|
-
import type { ChannelRPCValidator } from './channel-rpc.types.js'
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* A name with no function metadata is left alone: it is a capability this app
|
|
8
|
-
* never declared a contract for, and failing it would break callers that
|
|
9
|
-
* deliberately treat the value as opaque.
|
|
10
|
-
*/
|
|
11
|
-
const createChannelRPCSchemaValidator =
|
|
12
|
-
(
|
|
13
|
-
key: 'inputSchemaName' | 'outputSchemaName',
|
|
14
|
-
singletonServices: Pick<CoreSingletonServices, 'logger' | 'schema'>,
|
|
15
|
-
packageName: string | null = null
|
|
16
|
-
): ChannelRPCValidator =>
|
|
17
|
-
async (funcName: string, value: unknown): Promise<void> => {
|
|
18
|
-
const pikkuFuncId = pikkuState(packageName, 'rpc', 'meta')[funcName]
|
|
19
|
-
if (!pikkuFuncId) {
|
|
20
|
-
return
|
|
21
|
-
}
|
|
22
|
-
const schemaName = pikkuState(packageName, 'function', 'meta')[
|
|
23
|
-
pikkuFuncId
|
|
24
|
-
]?.[key]
|
|
25
|
-
if (!schemaName) {
|
|
26
|
-
return
|
|
27
|
-
}
|
|
28
|
-
await validateSchema(
|
|
29
|
-
singletonServices.logger,
|
|
30
|
-
singletonServices.schema,
|
|
31
|
-
schemaName,
|
|
32
|
-
value,
|
|
33
|
-
packageName
|
|
34
|
-
)
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Checks a capability's answer against the schema codegen generated from its
|
|
39
|
-
* declared return type — the same one an agent tool or an HTTP response is
|
|
40
|
-
* checked against.
|
|
41
|
-
*/
|
|
42
|
-
export const createChannelRPCResultValidator = (
|
|
43
|
-
singletonServices: Pick<CoreSingletonServices, 'logger' | 'schema'>,
|
|
44
|
-
packageName: string | null = null
|
|
45
|
-
): ChannelRPCValidator =>
|
|
46
|
-
createChannelRPCSchemaValidator(
|
|
47
|
-
'outputSchemaName',
|
|
48
|
-
singletonServices,
|
|
49
|
-
packageName
|
|
50
|
-
)
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Checks outbound arguments against the declared input type. Unlike the result
|
|
54
|
-
* check this is not a boundary — it catches version drift, where a server built
|
|
55
|
-
* against a newer capability signature calls a client that predates it.
|
|
56
|
-
*/
|
|
57
|
-
export const createChannelRPCInputValidator = (
|
|
58
|
-
singletonServices: Pick<CoreSingletonServices, 'logger' | 'schema'>,
|
|
59
|
-
packageName: string | null = null
|
|
60
|
-
): ChannelRPCValidator =>
|
|
61
|
-
createChannelRPCSchemaValidator(
|
|
62
|
-
'inputSchemaName',
|
|
63
|
-
singletonServices,
|
|
64
|
-
packageName
|
|
65
|
-
)
|