@pikku/core 0.12.84 → 0.12.88
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 +503 -0
- package/dist/bootstrap-compat/root.d.ts +20 -0
- package/dist/classification/column-form.d.ts +32 -0
- package/dist/classification/column-form.js +42 -0
- package/dist/classification/data-classification.d.ts +64 -0
- package/dist/classification/index.d.ts +13 -0
- package/dist/classification/index.js +2 -0
- package/dist/classification/secret-value.d.ts +56 -0
- package/dist/classification/secret-value.js +46 -0
- package/dist/crypto-utils.d.ts +1 -1
- package/dist/dev/hot-reload.d.ts +1 -1
- package/dist/dev/hot-reload.js +1 -1
- package/dist/ecosystem/agent-scorer.d.ts +1 -1
- package/dist/ecosystem/agent.d.ts +4 -1
- package/dist/ecosystem/channel/local.d.ts +2 -0
- package/dist/ecosystem/channel/local.js +2 -0
- package/dist/ecosystem/channel/serverless.d.ts +9 -0
- package/dist/ecosystem/channel/serverless.js +1 -0
- package/dist/ecosystem/channel.d.ts +3 -0
- package/dist/ecosystem/channel.js +1 -0
- package/dist/ecosystem/cli.d.ts +1 -1
- package/dist/ecosystem/cli.js +1 -1
- package/dist/ecosystem/credential.d.ts +1 -0
- package/dist/ecosystem/crypto-utils.d.ts +8 -0
- package/dist/ecosystem/crypto-utils.js +1 -0
- package/dist/ecosystem/dev.d.ts +1 -0
- package/dist/ecosystem/dev.js +1 -0
- package/{src/ecosystem/testing.ts → dist/ecosystem/errors.d.ts} +3 -3
- package/dist/ecosystem/errors.js +2 -0
- package/dist/ecosystem/function.d.ts +1 -1
- package/dist/ecosystem/function.js +1 -1
- package/dist/ecosystem/http.d.ts +3 -1
- package/dist/ecosystem/http.js +3 -1
- package/dist/ecosystem/mcp.d.ts +1 -1
- package/dist/ecosystem/mcp.js +1 -1
- package/dist/ecosystem/middleware.d.ts +2 -1
- package/dist/ecosystem/middleware.js +2 -1
- package/dist/ecosystem/persona.d.ts +4 -2
- package/dist/ecosystem/persona.js +2 -1
- package/dist/ecosystem/queue.d.ts +4 -2
- package/dist/ecosystem/queue.js +3 -1
- package/dist/ecosystem/role.d.ts +1 -0
- package/dist/ecosystem/rpc.d.ts +2 -0
- package/dist/ecosystem/rpc.js +1 -0
- package/dist/ecosystem/scenario.d.ts +8 -2
- package/dist/ecosystem/scenario.js +5 -1
- package/dist/ecosystem/scheduler.d.ts +2 -1
- package/dist/ecosystem/scheduler.js +2 -1
- package/dist/ecosystem/schema.d.ts +2 -1
- package/dist/ecosystem/schema.js +1 -1
- package/dist/ecosystem/scope.d.ts +2 -0
- package/dist/ecosystem/scope.js +1 -0
- package/dist/ecosystem/secret.d.ts +2 -0
- package/dist/ecosystem/secret.js +1 -0
- package/dist/ecosystem/services/local-content.d.ts +2 -1
- package/dist/ecosystem/services/local-content.js +1 -1
- package/dist/ecosystem/services/local-meta.d.ts +1 -0
- package/dist/ecosystem/services/local-meta.js +1 -0
- package/dist/ecosystem/services.d.ts +11 -3
- package/dist/ecosystem/services.js +7 -1
- package/dist/ecosystem/trigger.d.ts +1 -0
- package/dist/ecosystem/trigger.js +1 -1
- package/dist/ecosystem/types.d.ts +6 -3
- package/dist/ecosystem/types.js +3 -2
- package/dist/ecosystem/variable.d.ts +1 -0
- package/dist/ecosystem/virtual-user.d.ts +3 -0
- package/dist/ecosystem/virtual-user.js +3 -0
- package/dist/ecosystem/workflow.d.ts +2 -0
- package/dist/ecosystem/workflow.js +2 -0
- package/dist/errors/index.d.ts +8 -0
- package/dist/errors/index.js +1 -0
- package/dist/errors/serialized-error.d.ts +7 -0
- package/dist/function/function-meta.types.d.ts +139 -0
- package/dist/function/function-runner.d.ts +3 -2
- package/dist/function/function-runner.js +31 -11
- package/dist/function/functions.types.d.ts +10 -2
- package/dist/function/index.d.ts +8 -2
- package/dist/function/index.js +4 -1
- package/dist/function/pikku-request.d.ts +8 -0
- package/dist/function/pikku-request.js +15 -0
- package/dist/middleware/auth-apikey.d.ts +2 -10
- package/dist/middleware/auth-apikey.js +1 -1
- package/dist/middleware/auth-bearer.d.ts +2 -10
- package/dist/middleware/auth-bearer.js +1 -1
- package/dist/middleware/auth-cookie.d.ts +2 -10
- package/dist/middleware/auth-cookie.js +1 -1
- package/dist/middleware/cors.d.ts +5 -11
- package/dist/middleware/cors.js +13 -6
- package/dist/middleware/index.d.ts +3 -0
- package/dist/middleware/index.js +1 -0
- package/dist/middleware/middleware-factories.d.ts +9 -0
- package/dist/middleware/middleware-factories.js +19 -0
- package/dist/middleware/middleware.types.d.ts +27 -0
- package/dist/middleware/middleware.types.js +1 -0
- package/dist/middleware/remote-auth.d.ts +2 -2
- package/dist/middleware/remote-auth.js +1 -1
- package/dist/middleware/telemetry.d.ts +4 -20
- package/dist/middleware/telemetry.js +1 -1
- package/dist/middleware-runner.d.ts +2 -1
- package/dist/pikku-state.d.ts +2 -1
- package/dist/services/audit-service.d.ts +1 -1
- package/dist/services/credential-wire-service.js +1 -1
- package/dist/services/email-service.d.ts +1 -1
- package/dist/services/file-scenario-run-store.d.ts +58 -0
- package/dist/services/file-scenario-run-store.js +214 -0
- package/dist/services/in-memory-workflow-service.d.ts +1 -1
- package/dist/services/index.d.ts +5 -1
- package/dist/services/index.js +3 -0
- package/dist/services/local-secrets.d.ts +1 -1
- package/dist/services/local-secrets.js +1 -1
- package/dist/services/logger.d.ts +7 -7
- package/dist/services/meta-service.d.ts +2 -1
- package/dist/services/scoped-secret-service.d.ts +1 -1
- package/dist/services/secret-service.d.ts +1 -1
- package/dist/services/typed-secret-service.d.ts +16 -2
- package/dist/services/typed-secret-service.js +5 -0
- package/dist/services/webhook-service.d.ts +1 -1
- package/dist/services/workflow-service.d.ts +2 -1
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.js +1 -0
- package/dist/types/core.types.d.ts +30 -180
- package/dist/types/core.types.js +1 -19
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +1 -0
- package/dist/types/state.types.d.ts +3 -1
- package/dist/utils.d.ts +13 -0
- package/dist/utils.js +2 -0
- package/dist/wirings/addon/addon-runner.d.ts +17 -0
- package/dist/wirings/addon/addon-runner.js +150 -0
- package/dist/wirings/addon/index.d.ts +6 -0
- package/dist/wirings/addon/index.js +3 -0
- package/dist/wirings/addon/remote-addon-auth.d.ts +16 -0
- package/dist/wirings/addon/remote-addon-auth.js +39 -0
- package/dist/wirings/addon/wire-addon.d.ts +80 -0
- package/dist/wirings/addon/wire-addon.js +120 -0
- package/dist/wirings/addon/wire-remote-addon.d.ts +22 -0
- package/dist/wirings/addon/wire-remote-addon.js +11 -0
- package/dist/wirings/agent/agent-memory.d.ts +11 -0
- package/dist/wirings/agent/agent-memory.js +17 -2
- package/dist/wirings/agent/agent-prepare.d.ts +3 -3
- package/dist/wirings/agent/agent-prepare.js +1 -1
- package/dist/wirings/agent/agent-runner.js +2 -3
- package/dist/wirings/agent/agent-stream.js +117 -93
- package/dist/wirings/agent/agent-utils.d.ts +13 -0
- package/dist/wirings/agent/agent-utils.js +16 -0
- package/dist/wirings/agent/agent.types.d.ts +12 -10
- package/dist/wirings/agent/index.d.ts +1 -1
- package/dist/wirings/agent/voice-input.js +1 -1
- package/dist/wirings/agent/voice-output.js +1 -1
- package/dist/wirings/agent-scorer/agent-scorer-judge.d.ts +13 -0
- package/dist/wirings/agent-scorer/agent-scorer-judge.js +52 -0
- package/dist/wirings/agent-scorer/agent-scorer.d.ts +7 -1
- package/dist/wirings/agent-scorer/agent-scorer.js +1 -0
- package/dist/wirings/agent-scorer/agent-scorer.types.d.ts +20 -0
- package/dist/wirings/agent-scorer/index.d.ts +1 -1
- package/dist/wirings/channel/channel-common.d.ts +2 -1
- package/dist/wirings/channel/channel-middleware-runner.d.ts +2 -1
- package/dist/wirings/channel/channel.types.d.ts +1 -1
- package/dist/wirings/channel/serverless/index.d.ts +1 -0
- package/dist/wirings/cli/channel/index.d.ts +1 -1
- package/dist/wirings/cli/cli-runner.d.ts +2 -1
- package/dist/wirings/cli/cli-runner.js +4 -1
- package/dist/wirings/cli/cli.types.d.ts +21 -2
- package/dist/wirings/cli/command-parser.js +157 -23
- package/dist/wirings/gateway/gateway.types.d.ts +2 -1
- package/dist/wirings/http/http-runner.d.ts +1 -1
- package/dist/wirings/http/http-runner.js +1 -1
- package/dist/wirings/http/http.types.d.ts +2 -2
- package/dist/wirings/http/index.d.ts +1 -0
- package/dist/wirings/http/index.js +1 -0
- package/dist/wirings/http/pikku-fetch-http-request.js +1 -1
- package/dist/wirings/http/pikku-fetch-http-response.js +2 -2
- package/dist/wirings/mcp/mcp.types.d.ts +1 -1
- package/dist/wirings/persona/index.d.ts +1 -1
- package/dist/wirings/persona/index.js +1 -1
- package/dist/wirings/persona/persona.types.d.ts +14 -0
- package/dist/wirings/queue/queue.types.d.ts +1 -1
- package/dist/wirings/queue/signed-queue-service.d.ts +1 -1
- package/dist/wirings/rpc/index.d.ts +0 -6
- package/dist/wirings/rpc/index.js +0 -3
- package/dist/wirings/rpc/remote-addon-auth.d.ts +1 -1
- package/dist/wirings/rpc/remote-addon-auth.js +1 -1
- package/dist/wirings/rpc/rpc-runner.js +2 -2
- package/dist/wirings/rpc/wire-addon.d.ts +1 -1
- package/dist/wirings/scheduler/scheduler.types.d.ts +2 -1
- package/dist/wirings/scope/index.d.ts +1 -0
- package/dist/wirings/scope/index.js +1 -0
- package/dist/wirings/secret/secret.types.d.ts +10 -0
- package/dist/wirings/secret/validate-secret-definitions.js +2 -0
- package/dist/wirings/variable/validate-variable-definitions.js +2 -0
- package/dist/wirings/variable/variable.types.d.ts +15 -0
- package/dist/wirings/virtual-user/index.d.ts +1 -1
- package/dist/wirings/virtual-user/index.js +1 -1
- package/dist/wirings/virtual-user/prepare-virtual-user-run.d.ts +1 -1
- package/dist/wirings/virtual-user/virtual-user-derive.d.ts +1 -1
- package/dist/wirings/workflow/graph/graph-node.d.ts +9 -2
- package/dist/wirings/workflow/graph/graph-node.js +2 -0
- package/dist/wirings/workflow/graph/graph-runner.d.ts +1 -0
- package/dist/wirings/workflow/graph/graph-runner.js +283 -31
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +16 -1
- package/dist/wirings/workflow/index.d.ts +2 -0
- package/dist/wirings/workflow/index.js +1 -0
- package/dist/wirings/workflow/pikku-scenario-service.d.ts +15 -5
- package/dist/wirings/workflow/pikku-scenario-service.js +44 -16
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +22 -7
- package/dist/wirings/workflow/pikku-workflow-service.js +28 -29
- package/dist/wirings/workflow/run-timeline.d.ts +1 -1
- package/dist/wirings/workflow/scenario-run.types.d.ts +171 -0
- package/dist/wirings/workflow/scenario-run.types.js +1 -0
- package/dist/wirings/workflow/scenario-step-guards.d.ts +1 -2
- package/dist/wirings/workflow/scenario-step-guards.js +0 -8
- package/dist/wirings/workflow/scenario-step.types.d.ts +27 -12
- package/dist/wirings/workflow/workflow-approval.js +2 -1
- package/dist/wirings/workflow/workflow-run-engine.types.d.ts +2 -1
- package/dist/wirings/workflow/workflow-step-claim.d.ts +16 -0
- package/dist/wirings/workflow/workflow-step-claim.js +27 -0
- package/dist/wirings/workflow/workflow.types.d.ts +2 -1
- package/knowledge/decisions/index.md +2 -0
- package/knowledge/decisions/internals/a-scenario-step-template-is-offered-unfilled.md +1 -1
- package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +1 -1
- package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-and-not-a-queued-job.md +2 -2
- package/knowledge/decisions/internals/a-wall-clock-threshold-is-a-load-test-in-disguise.md +6 -6
- package/knowledge/decisions/internals/a-workflow-wire-is-built-from-the-run-not-from-the-rpc-service.md +1 -1
- package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +1 -1
- package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +1 -1
- package/knowledge/decisions/internals/an-addon-scope-root-loses-to-a-root-the-host-already-declares.md +1 -1
- package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +1 -1
- package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +1 -1
- package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +1 -1
- package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +1 -1
- package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +1 -1
- package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +1 -1
- package/knowledge/decisions/internals/core-column-form-is-an-axis-of-its-own.md +4 -4
- package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +1 -1
- package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +3 -3
- package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +2 -2
- package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +2 -2
- package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +1 -1
- package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +1 -1
- package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +3 -3
- package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +1 -1
- package/knowledge/decisions/internals/gateway-listener-middleware-runs-without-an-rpc-on-the-wire.md +4 -4
- package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +1 -1
- package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +1 -1
- package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +1 -1
- package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +1 -1
- package/knowledge/decisions/internals/index.md +4 -2
- package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +1 -1
- package/knowledge/decisions/internals/one-project-shape-check-two-validators.md +1 -1
- package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +1 -1
- package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +1 -1
- package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +1 -1
- package/knowledge/decisions/internals/scenario-given-and-when-are-sugar-but-then-is-not.md +2 -2
- package/knowledge/decisions/internals/scenarios-live-in-files-named-for-them.md +5 -5
- package/knowledge/decisions/internals/the-actor-prompt-says-json-because-of-json-object-mode.md +1 -1
- package/knowledge/decisions/internals/the-api-report-pins-members-not-just-names.md +1 -1
- package/knowledge/decisions/internals/the-ecosystem-entry-point-carries-the-adapter-surface.md +43 -19
- package/knowledge/decisions/internals/the-persona-runtime-is-exported-from-the-persona-entry-point.md +1 -1
- package/knowledge/decisions/internals/the-worker-disposition-is-the-one-that-is-not-testing.md +1 -1
- package/knowledge/decisions/internals/validate-runs-checks-by-precondition.md +3 -3
- package/knowledge/decisions/internals/virtual-user-step-order-comes-from-insertion-order.md +1 -1
- package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +1 -1
- package/knowledge/decisions/internals/wiring-registries-erase-the-generics-their-wire-functions-capture.md +1 -1
- package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +1 -1
- package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +1 -1
- package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +1 -1
- package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +1 -1
- package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +1 -1
- package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +1 -1
- package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +9 -5
- package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +1 -1
- package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +2 -2
- package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +1 -1
- package/knowledge/decisions/security/a-function-never-receives-the-secret-service.md +1 -1
- package/knowledge/decisions/security/a-scaffold-flag-says-a-surface-exists-not-who-may-call-it.md +47 -0
- package/knowledge/decisions/security/a-step-runs-the-function-the-workflow-dispatched-it-with.md +1 -1
- package/knowledge/decisions/security/a-virtual-user-is-never-offered-a-step-that-would-forge-its-own-oracle.md +2 -3
- package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +1 -1
- package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +1 -1
- package/knowledge/decisions/security/agent-gate-requires-a-session-only-when-auth-is-true.md +1 -1
- package/knowledge/decisions/security/an-approval-answer-outlives-the-run-it-answered.md +3 -3
- package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +4 -3
- package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +1 -1
- package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +2 -2
- package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +1 -1
- package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +2 -2
- package/knowledge/decisions/security/index.md +4 -1
- package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +1 -1
- package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +3 -3
- package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +1 -1
- package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +8 -2
- package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +1 -1
- package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +2 -2
- package/knowledge/index.md +3 -1
- package/knowledge/questions/channel-middleware-accepts-bare-factories-that-nothing-resolves.md +1 -1
- package/knowledge/questions/index.md +2 -0
- package/package.json +14 -13
- package/run-tests.sh +0 -0
- package/scripts/generate-api-report.d.mts +1 -1
- package/scripts/generate-api-report.mjs +67 -60
- package/scripts/generate-api-report.mts +11 -45
- package/src/api-report.test.ts +70 -1
- package/src/app-alias-surface.test.ts +179 -0
- package/src/app-leaf-surface.test.ts +217 -0
- package/src/bootstrap-compat/root.ts +20 -0
- package/src/{column-form.test.ts → classification/column-form.test.ts} +2 -2
- package/src/{data-classification.ts → classification/data-classification.ts} +1 -5
- package/src/classification/index.ts +38 -0
- package/src/{secret-value.test.ts → classification/secret-value.test.ts} +2 -2
- package/src/{secret-value.ts → classification/secret-value.ts} +1 -6
- package/src/crypto-utils.ts +1 -1
- package/src/dev/hot-reload.ts +1 -1
- package/src/dev/reload-meta.test.ts +1 -1
- package/src/errors/index.ts +9 -0
- package/src/errors/serialized-error.ts +9 -0
- package/src/factory-functions.test.ts +4 -2
- package/src/function/function-meta.types.ts +151 -0
- package/src/function/function-runner.test.ts +4 -2
- package/src/function/function-runner.ts +47 -14
- package/src/function/functions.types.ts +11 -7
- package/src/function/index.ts +24 -5
- package/src/function/list.types.ts +1 -3
- package/src/middleware/auth-apikey.ts +4 -2
- package/src/middleware/auth-bearer.test.ts +1 -1
- package/src/middleware/auth-bearer.ts +4 -2
- package/src/middleware/auth-cookie.ts +4 -1
- package/src/middleware/cors.test.ts +126 -5
- package/src/middleware/cors.ts +19 -8
- package/src/middleware/index.ts +16 -0
- package/src/middleware/middleware-factories.ts +62 -0
- package/src/middleware/middleware.types.ts +61 -0
- package/src/middleware/remote-auth.test.ts +1 -1
- package/src/middleware/remote-auth.ts +1 -1
- package/src/middleware/telemetry.ts +4 -2
- package/src/middleware-runner.test.ts +2 -3
- package/src/middleware-runner.ts +2 -2
- package/src/no-root-barrel.test.ts +114 -0
- package/src/permissions.ts +2 -4
- package/src/pikku-state.ts +3 -1
- package/src/public-surface.json +56 -241
- package/src/public-surface.json.README +3 -3
- package/src/public-surface.test.ts +5 -5
- package/src/remote.test.ts +1 -1
- package/src/removed-legacy-exports.test.ts +5 -1
- package/src/services/audit-service.ts +1 -1
- package/src/services/credential-wire-service.ts +1 -1
- package/src/services/email-service.ts +2 -4
- package/src/services/file-scenario-run-store.test.ts +349 -0
- package/src/services/file-scenario-run-store.ts +282 -0
- package/src/services/in-memory-workflow-service.ts +1 -1
- package/src/services/index.ts +13 -1
- package/src/services/local-content-request-handler.ts +1 -2
- package/src/services/local-secrets.ts +1 -1
- package/src/services/logger.ts +7 -7
- package/src/services/meta-service.ts +2 -2
- package/src/services/queue-webhook-service.test.ts +1 -1
- package/src/services/scoped-secret-service.ts +1 -1
- package/src/services/secret-service.ts +1 -1
- package/src/services/typed-secret-service.test.ts +52 -0
- package/src/services/typed-secret-service.ts +26 -2
- package/src/services/webhook-service.ts +1 -1
- package/src/services/workflow-service.ts +2 -1
- package/src/template-alias-surface.test.ts +240 -0
- package/src/testing/index.ts +1 -0
- package/src/types/core.types.ts +33 -285
- package/src/types/index.ts +25 -0
- package/src/types/state.types.ts +6 -5
- package/src/types/typed-credentials.test.ts +72 -0
- package/src/utils.ts +34 -0
- package/src/wirings/{rpc → addon}/addon-scopes.test.ts +1 -1
- package/src/wirings/addon/index.ts +12 -0
- package/src/wirings/{rpc → addon}/remote-addon-auth.ts +4 -1
- package/src/wirings/{rpc → addon}/wire-addon.ts +37 -2
- package/src/wirings/agent/agent-memory.test.ts +73 -0
- package/src/wirings/agent/agent-memory.ts +16 -2
- package/src/wirings/agent/agent-middleware.types.test.ts +41 -0
- package/src/wirings/agent/agent-prepare.ts +8 -5
- package/src/wirings/agent/agent-runner.ts +2 -3
- package/src/wirings/agent/agent-stream-delegate.test.ts +381 -0
- package/src/wirings/agent/agent-stream.ts +160 -81
- package/src/wirings/agent/agent-utils.ts +19 -0
- package/src/wirings/agent/agent.types.ts +12 -11
- package/src/wirings/agent/index.ts +1 -0
- package/src/wirings/agent/voice-input.ts +1 -1
- package/src/wirings/agent/voice-output.test.ts +2 -4
- package/src/wirings/agent/voice-output.ts +1 -1
- package/src/wirings/agent-scorer/agent-scorer-judge.test.ts +145 -0
- package/src/wirings/agent-scorer/agent-scorer-judge.ts +60 -0
- package/src/wirings/agent-scorer/agent-scorer.ts +8 -0
- package/src/wirings/agent-scorer/agent-scorer.types.ts +21 -0
- package/src/wirings/agent-scorer/index.ts +1 -0
- package/src/wirings/channel/channel-common.ts +4 -2
- package/src/wirings/channel/channel-handler.ts +2 -5
- package/src/wirings/channel/channel-middleware-runner.ts +1 -1
- package/src/wirings/channel/channel-rpc.types.ts +1 -5
- package/src/wirings/channel/channel.types.ts +1 -2
- package/src/wirings/channel/local/local-channel-runner.test.ts +1 -2
- package/src/wirings/channel/serverless/index.ts +1 -0
- package/src/wirings/cli/channel/cli-raw-channel-runner.ts +2 -2
- package/src/wirings/cli/channel/index.ts +1 -3
- package/src/wirings/cli/cli-runner.test.ts +1 -1
- package/src/wirings/cli/cli-runner.ts +11 -7
- package/src/wirings/cli/cli.types.ts +24 -3
- package/src/wirings/cli/command-parser.test.ts +388 -1
- package/src/wirings/cli/command-parser.ts +189 -29
- package/src/wirings/gateway/gateway-runner.test.ts +1 -2
- package/src/wirings/gateway/gateway-runner.ts +3 -6
- package/src/wirings/gateway/gateway.types.ts +5 -4
- package/src/wirings/http/http-routes.test.ts +1 -2
- package/src/wirings/http/http-runner-addon-ref.test.ts +238 -0
- package/src/wirings/http/http-runner.test.ts +3 -8
- package/src/wirings/http/http-runner.ts +9 -3
- package/src/wirings/http/http.types.ts +3 -12
- package/src/wirings/http/index.ts +1 -0
- package/src/wirings/http/pikku-fetch-http-request.ts +1 -1
- package/src/wirings/http/pikku-fetch-http-response.ts +3 -2
- package/src/wirings/mcp/mcp-runner.test.ts +1 -1
- package/src/wirings/mcp/mcp.types.ts +1 -2
- package/src/wirings/persona/index.ts +1 -4
- package/src/wirings/persona/persona.types.ts +14 -0
- package/src/wirings/queue/queue-identity.test.ts +1 -1
- package/src/wirings/queue/queue.types.ts +2 -6
- package/src/wirings/queue/signed-queue-service.ts +1 -1
- package/src/wirings/rpc/index.ts +0 -12
- package/src/wirings/rpc/rpc-runner.test.ts +4 -4
- package/src/wirings/rpc/rpc-runner.ts +3 -3
- package/src/wirings/scheduler/scheduler.types.ts +2 -5
- package/src/wirings/scope/index.ts +1 -0
- package/src/wirings/secret/secret.types.ts +10 -0
- package/src/wirings/secret/validate-secret-definitions.test.ts +23 -0
- package/src/wirings/secret/validate-secret-definitions.ts +2 -0
- package/src/wirings/variable/validate-variable-definitions.test.ts +24 -0
- package/src/wirings/variable/validate-variable-definitions.ts +2 -0
- package/src/wirings/variable/variable.types.ts +15 -0
- package/src/wirings/virtual-user/index.ts +1 -4
- package/src/wirings/virtual-user/prepare-virtual-user-run.ts +1 -1
- package/src/wirings/virtual-user/virtual-user-derive.test.ts +1 -1
- package/src/wirings/virtual-user/virtual-user-derive.ts +1 -1
- package/src/wirings/virtual-user/virtual-user.types.ts +1 -5
- package/src/wirings/workflow/graph/graph-foreach-queued.test.ts +569 -0
- package/src/wirings/workflow/graph/graph-foreach.test.ts +626 -0
- package/src/wirings/workflow/graph/graph-node.ts +16 -1
- package/src/wirings/workflow/graph/graph-runner.ts +387 -61
- package/src/wirings/workflow/graph/workflow-graph.types.ts +28 -3
- package/src/wirings/workflow/index.ts +8 -0
- package/src/wirings/workflow/pikku-scenario-service.ts +83 -20
- package/src/wirings/workflow/pikku-workflow-service.ts +37 -35
- package/src/wirings/workflow/run-timeline.ts +1 -1
- package/src/wirings/workflow/scenario-expectations.test.ts +28 -13
- package/src/wirings/workflow/scenario-run.types.ts +186 -0
- package/src/wirings/workflow/scenario-step-guards.ts +1 -14
- package/src/wirings/workflow/scenario-step.test.ts +32 -7
- package/src/wirings/workflow/scenario-step.types.ts +27 -12
- package/src/wirings/workflow/workflow-approval-policy.test.ts +117 -47
- package/src/wirings/workflow/workflow-approval.ts +2 -1
- package/src/wirings/workflow/workflow-run-engine.types.ts +2 -1
- package/src/wirings/workflow/workflow-step-claim.ts +46 -0
- package/src/wirings/workflow/workflow.types.ts +4 -12
- package/src/wirings-stay-decoupled.test.ts +6 -3
- package/tsconfig.tsbuildinfo +1 -1
- package/tsconfig.type-tests.json +4 -2
- package/dist/ecosystem/ai-agent.d.ts +0 -18
- package/dist/ecosystem/ai-agent.js +0 -6
- package/dist/ecosystem/ai-scorer.d.ts +0 -12
- package/dist/ecosystem/ai-scorer.js +0 -5
- package/dist/services/ai-agent-runner-service.d.ts +0 -220
- package/dist/services/ai-run-state-service.d.ts +0 -29
- package/dist/services/ai-storage-service.d.ts +0 -18
- package/dist/services/in-memory-ai-run-state-service.d.ts +0 -19
- package/dist/services/in-memory-ai-run-state-service.js +0 -54
- package/dist/testing/service-tests/ai-storage-service-tests.d.ts +0 -3
- package/dist/testing/service-tests/ai-storage-service-tests.js +0 -302
- package/dist/wirings/ai-agent/agent-rpc.d.ts +0 -15
- package/dist/wirings/ai-agent/agent-rpc.js +0 -53
- package/dist/wirings/ai-agent/ai-agent-agui.d.ts +0 -79
- package/dist/wirings/ai-agent/ai-agent-agui.js +0 -327
- package/dist/wirings/ai-agent/ai-agent-finalize.d.ts +0 -58
- package/dist/wirings/ai-agent/ai-agent-finalize.js +0 -138
- package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +0 -35
- package/dist/wirings/ai-agent/ai-agent-helpers.js +0 -47
- package/dist/wirings/ai-agent/ai-agent-interrupt.d.ts +0 -153
- package/dist/wirings/ai-agent/ai-agent-interrupt.js +0 -257
- package/dist/wirings/ai-agent/ai-agent-memory.d.ts +0 -42
- package/dist/wirings/ai-agent/ai-agent-memory.js +0 -333
- package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +0 -16
- package/dist/wirings/ai-agent/ai-agent-model-config.js +0 -51
- package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +0 -117
- package/dist/wirings/ai-agent/ai-agent-prepare.js +0 -728
- package/dist/wirings/ai-agent/ai-agent-registry.d.ts +0 -16
- package/dist/wirings/ai-agent/ai-agent-registry.js +0 -51
- package/dist/wirings/ai-agent/ai-agent-runner.d.ts +0 -7
- package/dist/wirings/ai-agent/ai-agent-runner.js +0 -580
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +0 -41
- package/dist/wirings/ai-agent/ai-agent-stream.js +0 -1029
- package/dist/wirings/ai-agent/ai-agent-turn.d.ts +0 -57
- package/dist/wirings/ai-agent/ai-agent-turn.js +0 -82
- package/dist/wirings/ai-agent/ai-agent-utils.d.ts +0 -1
- package/dist/wirings/ai-agent/ai-agent-utils.js +0 -1
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +0 -625
- package/dist/wirings/ai-agent/index.d.ts +0 -12
- package/dist/wirings/ai-agent/index.js +0 -10
- package/dist/wirings/ai-agent/voice-input.d.ts +0 -69
- package/dist/wirings/ai-agent/voice-input.js +0 -150
- package/dist/wirings/ai-agent/voice-output.d.ts +0 -85
- package/dist/wirings/ai-agent/voice-output.js +0 -196
- package/dist/wirings/ai-scorer/ai-scorer-grade.d.ts +0 -26
- package/dist/wirings/ai-scorer/ai-scorer-grade.js +0 -33
- package/dist/wirings/ai-scorer/ai-scorer-judge.d.ts +0 -17
- package/dist/wirings/ai-scorer/ai-scorer-judge.js +0 -92
- package/dist/wirings/ai-scorer/ai-scorer-live.d.ts +0 -15
- package/dist/wirings/ai-scorer/ai-scorer-live.js +0 -38
- package/dist/wirings/ai-scorer/ai-scorer-registry.d.ts +0 -18
- package/dist/wirings/ai-scorer/ai-scorer-registry.js +0 -46
- package/dist/wirings/ai-scorer/ai-scorer-sampling.d.ts +0 -8
- package/dist/wirings/ai-scorer/ai-scorer-sampling.js +0 -31
- package/dist/wirings/ai-scorer/ai-scorer-snapshots.d.ts +0 -10
- package/dist/wirings/ai-scorer/ai-scorer-snapshots.js +0 -40
- package/dist/wirings/ai-scorer/ai-scorer-worker.d.ts +0 -15
- package/dist/wirings/ai-scorer/ai-scorer-worker.js +0 -58
- package/dist/wirings/ai-scorer/ai-scorer.d.ts +0 -39
- package/dist/wirings/ai-scorer/ai-scorer.js +0 -40
- package/dist/wirings/ai-scorer/ai-scorer.types.d.ts +0 -90
- package/dist/wirings/ai-scorer/ai-scorer.types.js +0 -4
- package/dist/wirings/ai-scorer/index.d.ts +0 -6
- package/dist/wirings/ai-scorer/index.js +0 -5
- package/src/ecosystem/agent-scorer.ts +0 -24
- package/src/ecosystem/agent.ts +0 -42
- package/src/ecosystem/channel/local.ts +0 -1
- package/src/ecosystem/channel.ts +0 -22
- package/src/ecosystem/cli/channel.ts +0 -25
- package/src/ecosystem/cli.ts +0 -21
- package/src/ecosystem/credential.ts +0 -10
- package/src/ecosystem/dev.ts +0 -12
- package/src/ecosystem/function.ts +0 -28
- package/src/ecosystem/gateway.ts +0 -4
- package/src/ecosystem/hmac.ts +0 -1
- package/src/ecosystem/http.ts +0 -22
- package/src/ecosystem/mcp.ts +0 -17
- package/src/ecosystem/middleware.ts +0 -27
- package/src/ecosystem/node-host-resolver.ts +0 -1
- package/src/ecosystem/node.ts +0 -5
- package/src/ecosystem/oauth2.ts +0 -4
- package/src/ecosystem/persona.ts +0 -30
- package/src/ecosystem/queue.ts +0 -23
- package/src/ecosystem/remote.ts +0 -9
- package/src/ecosystem/role.ts +0 -13
- package/src/ecosystem/rpc.ts +0 -7
- package/src/ecosystem/safe-fetch.ts +0 -8
- package/src/ecosystem/scenario.ts +0 -32
- package/src/ecosystem/scheduler.ts +0 -5
- package/src/ecosystem/schema.ts +0 -1
- package/src/ecosystem/scope.ts +0 -14
- package/src/ecosystem/secret.ts +0 -15
- package/src/ecosystem/services/istanbul-coverage.ts +0 -1
- package/src/ecosystem/services/local-content-request-handler.ts +0 -16
- package/src/ecosystem/services/local-content.ts +0 -1
- package/src/ecosystem/services/v8-coverage.ts +0 -1
- package/src/ecosystem/services.ts +0 -82
- package/src/ecosystem/trigger.ts +0 -7
- package/src/ecosystem/types.ts +0 -34
- package/src/ecosystem/variable.ts +0 -14
- package/src/ecosystem/virtual-user.ts +0 -48
- package/src/ecosystem/workflow.ts +0 -68
- package/src/ecosystem.ts +0 -40
- package/src/index.ts +0 -244
- /package/dist/{services/ai-agent-runner-service.js → bootstrap-compat/root.js} +0 -0
- /package/dist/{services/ai-run-state-service.js → classification/data-classification.js} +0 -0
- /package/dist/{services/ai-storage-service.js → errors/serialized-error.js} +0 -0
- /package/dist/{wirings/ai-agent/ai-agent.types.js → function/function-meta.types.js} +0 -0
- /package/src/{column-form.ts → classification/column-form.ts} +0 -0
- /package/src/{pikku-request.test.ts → function/pikku-request.test.ts} +0 -0
- /package/src/{pikku-request.ts → function/pikku-request.ts} +0 -0
- /package/src/wirings/{rpc → addon}/addon-auth-tags.test.ts +0 -0
- /package/src/wirings/{rpc → addon}/addon-runner.ts +0 -0
- /package/src/wirings/{rpc → addon}/addon-secrets.test.ts +0 -0
- /package/src/wirings/{rpc → addon}/wire-addon.test.ts +0 -0
- /package/src/wirings/{rpc → addon}/wire-remote-addon.ts +0 -0
|
@@ -4,7 +4,7 @@ import type { SecretService } from '../services/secret-service.js';
|
|
|
4
4
|
import type { SchemaService } from '../services/schema-service.js';
|
|
5
5
|
import type { JWTService } from '../services/jwt-service.js';
|
|
6
6
|
import type { PikkuHTTP } from '../wirings/http/http.types.js';
|
|
7
|
-
import type { PikkuChannel
|
|
7
|
+
import type { PikkuChannel } from '../wirings/channel/channel.types.js';
|
|
8
8
|
import type { EventHubService } from '../wirings/channel/eventhub-service.js';
|
|
9
9
|
import type { PikkuRPC } from '../wirings/rpc/rpc-types.js';
|
|
10
10
|
import type { PikkuMCP } from '../wirings/mcp/mcp.types.js';
|
|
@@ -13,7 +13,7 @@ import type { PikkuQueue, QueueService } from '../wirings/queue/queue.types.js';
|
|
|
13
13
|
import type { PikkuCLI } from '../wirings/cli/cli.types.js';
|
|
14
14
|
import type { PikkuWorkflowWire, WorkflowService, WorkflowServiceConfig, WorkflowStepWire } from '../wirings/workflow/workflow.types.js';
|
|
15
15
|
import type { PikkuScenarioWire } from '../wirings/workflow/scenario.types.js';
|
|
16
|
-
import type { PikkuBrowserWire, PikkuScenarioStepWire
|
|
16
|
+
import type { PikkuBrowserWire, PikkuScenarioStepWire } from '../wirings/workflow/scenario-step.types.js';
|
|
17
17
|
import type { PikkuGraphWire } from '../wirings/workflow/graph/workflow-graph.types.js';
|
|
18
18
|
import type { PikkuTrigger } from '../wirings/trigger/trigger.types.js';
|
|
19
19
|
import type { PikkuGateway } from '../wirings/gateway/gateway.types.js';
|
|
@@ -26,8 +26,9 @@ import type { AgentRunnerService } from '../services/agent-runner-service.js';
|
|
|
26
26
|
import type { AIEmbeddingService } from '../services/ai-embedding-service.js';
|
|
27
27
|
import type { AgentRunStateService } from '../services/agent-run-state-service.js';
|
|
28
28
|
import type { AgentRunService } from '../wirings/agent/agent.types.js';
|
|
29
|
+
import type { MiddlewareMetadata } from '../middleware/middleware.types.js';
|
|
30
|
+
import type { PermissionMetadata } from '../function/function-meta.types.js';
|
|
29
31
|
import type { VirtualUserRunStore } from '../wirings/virtual-user/virtual-user-run-store.js';
|
|
30
|
-
import type { PikkuAgentMiddlewareHooks } from '../wirings/agent/agent.types.js';
|
|
31
32
|
import type { WorkflowRunService } from '../wirings/workflow/workflow.types.js';
|
|
32
33
|
import type { CredentialService } from '../services/credential-service.js';
|
|
33
34
|
import type { EmailService } from '../services/email-service.js';
|
|
@@ -38,152 +39,6 @@ import type { SessionStore } from '../services/session-store.js';
|
|
|
38
39
|
import type { ScopeService } from '../services/scope-service.js';
|
|
39
40
|
import type { AuditDurability, AuditLog, AuditService } from '../services/audit-service.js';
|
|
40
41
|
export type PikkuWiringTypes = 'http' | 'scheduler' | 'trigger' | 'channel' | 'rpc' | 'queue' | 'mcp' | 'cli' | 'workflow' | 'agent' | 'gateway';
|
|
41
|
-
export interface FunctionServicesMeta {
|
|
42
|
-
optimized: boolean;
|
|
43
|
-
services: string[];
|
|
44
|
-
}
|
|
45
|
-
export interface FunctionWiresMeta {
|
|
46
|
-
optimized: boolean;
|
|
47
|
-
wires: string[];
|
|
48
|
-
}
|
|
49
|
-
export type MiddlewareMetadata = {
|
|
50
|
-
type: 'http';
|
|
51
|
-
route: string;
|
|
52
|
-
} | {
|
|
53
|
-
type: 'tag';
|
|
54
|
-
tag: string;
|
|
55
|
-
} | {
|
|
56
|
-
type: 'wire';
|
|
57
|
-
name: string;
|
|
58
|
-
inline?: boolean;
|
|
59
|
-
};
|
|
60
|
-
/**
|
|
61
|
-
* A reference to a permission function, resolved by name. Function-scoped
|
|
62
|
-
* only: there are no wire- or tag-level permission references.
|
|
63
|
-
*/
|
|
64
|
-
export type PermissionMetadata = {
|
|
65
|
-
type: 'wire';
|
|
66
|
-
name: string;
|
|
67
|
-
inline?: boolean;
|
|
68
|
-
};
|
|
69
|
-
export type FunctionRuntimeMeta = {
|
|
70
|
-
pikkuFuncId: string;
|
|
71
|
-
inputSchemaName: string | null;
|
|
72
|
-
outputSchemaName: string | null;
|
|
73
|
-
/** Scopes the session must hold to run this function. All are required (AND). */
|
|
74
|
-
scopes?: string[];
|
|
75
|
-
expose?: boolean;
|
|
76
|
-
/**
|
|
77
|
-
* A sessionless function's own `auth: true`. `sessionless` carries the
|
|
78
|
-
* baseline — a `pikkuFunc` always requires a session — and this carries the
|
|
79
|
-
* tightening a `pikkuSessionlessFunc` applies to itself. Both are needed to
|
|
80
|
-
* know whether a function is gated without running it.
|
|
81
|
-
*/
|
|
82
|
-
auth?: boolean;
|
|
83
|
-
/**
|
|
84
|
-
* The author's declaration that this function's permission check lives in its
|
|
85
|
-
* own body. Carries no runtime effect — it records a gate codegen cannot see,
|
|
86
|
-
* so an audit is not left to guess whether a sessionless function is open.
|
|
87
|
-
* Refused unless `allow.permissionsInBody` is set in `pikku.config.json`.
|
|
88
|
-
*/
|
|
89
|
-
permissionsInBody?: boolean;
|
|
90
|
-
remote?: boolean;
|
|
91
|
-
/**
|
|
92
|
-
* A step RPC: invoked by name only from a scenario run and refused
|
|
93
|
-
* everywhere else, so it is never network-callable.
|
|
94
|
-
*/
|
|
95
|
-
scenarioStep?: boolean;
|
|
96
|
-
/**
|
|
97
|
-
* The body of a `pikkuScenario(...)`. Only ever run by `pikku scenario run`,
|
|
98
|
-
* so it is held back from the app bootstrap and from every deployed unit.
|
|
99
|
-
*/
|
|
100
|
-
scenario?: boolean;
|
|
101
|
-
mcp?: boolean;
|
|
102
|
-
readonly?: boolean;
|
|
103
|
-
deploy?: 'serverless' | 'server' | 'auto';
|
|
104
|
-
sessionless?: boolean;
|
|
105
|
-
/** When true, workflow steps calling this function are dispatched via the queue. No queue service configured is a hard error. */
|
|
106
|
-
workflowQueued?: boolean;
|
|
107
|
-
/** Retry count when this function is used as a workflow step. */
|
|
108
|
-
workflowRetries?: number;
|
|
109
|
-
/** Timeout when this function is used as a workflow step (e.g. '30s', '5m'). */
|
|
110
|
-
workflowTimeout?: string;
|
|
111
|
-
/**
|
|
112
|
-
* Scenario steps only: which surfaces this step declares a binding for.
|
|
113
|
-
*
|
|
114
|
-
* The reporter derives coverage from this — a `then` with no binding for the
|
|
115
|
-
* surface the run targeted was never actually witnessed there, which is a gap
|
|
116
|
-
* worth counting rather than excusing.
|
|
117
|
-
*/
|
|
118
|
-
scenarioStepSurfaces?: ScenarioSurface[];
|
|
119
|
-
/**
|
|
120
|
-
* Scenario steps only: who acts. Absent means `persona` — the ordinary step,
|
|
121
|
-
* and the only kind that existed before the other two.
|
|
122
|
-
*
|
|
123
|
-
* A `platform` or `addon` step is the app or a third-party system acting, and
|
|
124
|
-
* it must never reach a virtual user's catalogue. That is not tidiness: a
|
|
125
|
-
* virtual user that can invoke "Stripe's webhook arrives" can forge its own
|
|
126
|
-
* payment success, and every finding downstream of that is worthless.
|
|
127
|
-
*/
|
|
128
|
-
scenarioStepKind?: ScenarioStepKind;
|
|
129
|
-
/** Addon steps only: the addon whose system acts — `wireAddon`'s `name`. */
|
|
130
|
-
scenarioStepAddon?: string;
|
|
131
|
-
/** Scenario steps only: the prose a reporter renders, with `{placeholders}` filled from the step's recorded input. */
|
|
132
|
-
scenarioStepTemplate?: string;
|
|
133
|
-
/**
|
|
134
|
-
* The function's `audit` config, resolved — `audit: true` reads as
|
|
135
|
-
* `{ durability: 'best-effort' }`. Absent means the function records nothing:
|
|
136
|
-
* `auditLog.write()` from an unmarked function is dropped with a warning, so
|
|
137
|
-
* this is the only place a reader can see which functions have a trail at all
|
|
138
|
-
* without running them.
|
|
139
|
-
*
|
|
140
|
-
* Informational. The runner resolves audit from the live function config, not
|
|
141
|
-
* from here, so meta and runtime cannot disagree about whether audit is on.
|
|
142
|
-
*/
|
|
143
|
-
audit?: {
|
|
144
|
-
durability: AuditDurability;
|
|
145
|
-
};
|
|
146
|
-
version?: number;
|
|
147
|
-
approvalRequired?: boolean;
|
|
148
|
-
approvalDescription?: string;
|
|
149
|
-
implementationHash?: string;
|
|
150
|
-
contractHash?: string;
|
|
151
|
-
inputHash?: string;
|
|
152
|
-
outputHash?: string;
|
|
153
|
-
};
|
|
154
|
-
export type FunctionMeta = FunctionRuntimeMeta & Partial<{
|
|
155
|
-
name: string;
|
|
156
|
-
/** `remote`: a contract with no local body, answered by a connected client. */
|
|
157
|
-
functionType: 'user' | 'inline' | 'helper' | 'remote';
|
|
158
|
-
funcWrapper: string;
|
|
159
|
-
services: FunctionServicesMeta;
|
|
160
|
-
wires: FunctionWiresMeta;
|
|
161
|
-
inputs: string[] | null;
|
|
162
|
-
outputs: string[] | null;
|
|
163
|
-
middleware: MiddlewareMetadata[];
|
|
164
|
-
permissions: PermissionMetadata[];
|
|
165
|
-
isDirectFunction: boolean;
|
|
166
|
-
sourceFile: string;
|
|
167
|
-
exportedName: string;
|
|
168
|
-
/** File containing the handler body when it differs from sourceFile (imported handlers) */
|
|
169
|
-
bodySourceFile?: string;
|
|
170
|
-
/** 1-indexed first line of the handler body (verbose meta; coverage mapping) */
|
|
171
|
-
bodyStart: number;
|
|
172
|
-
/** 1-indexed last line of the handler body (verbose meta; coverage mapping) */
|
|
173
|
-
bodyEnd: number;
|
|
174
|
-
} & CommonWireMeta>;
|
|
175
|
-
export type FunctionsRuntimeMeta = Record<string, FunctionRuntimeMeta>;
|
|
176
|
-
export type FunctionsMeta = Record<string, FunctionMeta>;
|
|
177
|
-
export type MakeRequired<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>;
|
|
178
|
-
export type JSONPrimitive = string | number | boolean | null | undefined;
|
|
179
|
-
export type JSONValue = JSONPrimitive | JSONValue[] | {
|
|
180
|
-
[key: string]: JSONValue;
|
|
181
|
-
};
|
|
182
|
-
export type PickRequired<T, K extends keyof T> = T & Required<Pick<T, K>>;
|
|
183
|
-
export type PickOptional<T, K extends keyof T> = Partial<T> & Pick<T, K>;
|
|
184
|
-
export type RequireAtLeastOne<T> = {
|
|
185
|
-
[K in keyof T]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<keyof T, K>>>;
|
|
186
|
-
}[keyof T];
|
|
187
42
|
/**
|
|
188
43
|
* Runtime pool tuning for the Postgres adapter. The connection string stays
|
|
189
44
|
* the flat `postgresUrl` config field — the contract the CLI's db commands read.
|
|
@@ -303,7 +158,20 @@ export interface CoreSingletonServices<Config extends CoreConfig = CoreConfig> {
|
|
|
303
158
|
*/
|
|
304
159
|
auth?: () => Promise<AuthInstance>;
|
|
305
160
|
}
|
|
306
|
-
|
|
161
|
+
/**
|
|
162
|
+
* Reads a single credential. The first signature resolves the value type from
|
|
163
|
+
* the project's generated `CredentialsMap`; the second keeps a name the map
|
|
164
|
+
* does not know callable with an explicit type.
|
|
165
|
+
*
|
|
166
|
+
* `TCredentials` is unconstrained because the generated map is an interface,
|
|
167
|
+
* which has no implicit index signature and so cannot satisfy
|
|
168
|
+
* `Record<string, unknown>`.
|
|
169
|
+
*/
|
|
170
|
+
export type GetCredential<TCredentials = Record<string, unknown>> = {
|
|
171
|
+
<K extends keyof TCredentials & string>(name: K): TCredentials[K] | null | Promise<TCredentials[K] | null>;
|
|
172
|
+
<T = unknown>(name: string): T | null | Promise<T | null>;
|
|
173
|
+
};
|
|
174
|
+
export type PikkuWire<In = unknown, Out = unknown, HasInitialSession extends boolean = false, UserSession extends CoreUserSession = CoreUserSession, TypedRPC extends PikkuRPC = PikkuRPC, IsChannel extends true | null = null, MCPTools extends string | never = never, TypedWorkflow extends PikkuWorkflowWire | never = PikkuWorkflowWire, TriggerOutput = unknown, TypedScenario extends PikkuScenarioWire<any> | never = PikkuScenarioWire<any>, TypedActors extends ScenarioPersonas = ScenarioPersonas, TypedCredentials = Record<string, unknown>> = {
|
|
307
175
|
/** Always present — lazily initialised on first access for every function invocation */
|
|
308
176
|
rpc: TypedRPC;
|
|
309
177
|
} & Partial<{
|
|
@@ -327,8 +195,18 @@ export type PikkuWire<In = unknown, Out = unknown, HasInitialSession extends boo
|
|
|
327
195
|
workflow: TypedWorkflow;
|
|
328
196
|
scenario: TypedScenario;
|
|
329
197
|
actors: TypedActors;
|
|
198
|
+
/**
|
|
199
|
+
* The persona this step runs as, injected by the runner.
|
|
200
|
+
*
|
|
201
|
+
* Required on a `browser` binding, which cannot be provisioned without one,
|
|
202
|
+
* and on any binding whose step declares `actor: true`. A step that declares
|
|
203
|
+
* neither has no `actor` on its wire at all rather than an optional one —
|
|
204
|
+
* a pure assertion has nobody to be, and `attemptsSignIn` deliberately posts
|
|
205
|
+
* credentials instead of reusing an actor's session.
|
|
206
|
+
*/
|
|
207
|
+
actor: ScenarioPersonaOf<TypedActors>;
|
|
330
208
|
/** Present on every scenario step invocation */
|
|
331
|
-
scenarioStep: PikkuScenarioStepWire
|
|
209
|
+
scenarioStep: PikkuScenarioStepWire;
|
|
332
210
|
/** Present only when the runner provisioned a browser for this step */
|
|
333
211
|
browser: PikkuBrowserWire;
|
|
334
212
|
workflowStep: WorkflowStepWire;
|
|
@@ -345,7 +223,7 @@ export type PikkuWire<In = unknown, Out = unknown, HasInitialSession extends boo
|
|
|
345
223
|
/** Set a credential value (available in middleware) */
|
|
346
224
|
setCredential: (name: string, value: unknown) => void;
|
|
347
225
|
/** Get a single credential by name — lazy-loads from CredentialService on first call, sync thereafter */
|
|
348
|
-
getCredential: <
|
|
226
|
+
getCredential: GetCredential<TypedCredentials>;
|
|
349
227
|
/** Get all resolved credentials — lazy-loads from CredentialService on first call, sync thereafter */
|
|
350
228
|
getCredentials: () => Record<string, unknown> | Promise<Record<string, unknown>>;
|
|
351
229
|
audit: {
|
|
@@ -368,27 +246,6 @@ export type PikkuWire<In = unknown, Out = unknown, HasInitialSession extends boo
|
|
|
368
246
|
}>;
|
|
369
247
|
/** Wire as constructed by runners, before the function runner lazily adds `rpc`. */
|
|
370
248
|
export type PikkuRawWire = Omit<PikkuWire, 'rpc'>;
|
|
371
|
-
export type CorePikkuMiddleware<SingletonServices extends CoreSingletonServices = CoreSingletonServices, UserSession extends CoreUserSession = CoreUserSession> = (services: SingletonServices, wires: PikkuWire, next: () => Promise<void>) => Promise<void>;
|
|
372
|
-
/**
|
|
373
|
-
* Execution order: `highest` runs first (outermost in the onion), `lowest`
|
|
374
|
-
* runs last, closest to the function.
|
|
375
|
-
*/
|
|
376
|
-
export type MiddlewarePriority = 'highest' | 'high' | 'medium' | 'low' | 'lowest';
|
|
377
|
-
export type CorePikkuMiddlewareConfig<SingletonServices extends CoreSingletonServices = CoreSingletonServices, UserSession extends CoreUserSession = CoreUserSession> = {
|
|
378
|
-
func: CorePikkuMiddleware<SingletonServices, UserSession>;
|
|
379
|
-
name?: string;
|
|
380
|
-
description?: string;
|
|
381
|
-
/** Execution priority. Lower runs first (outermost). Defaults to 'medium'. */
|
|
382
|
-
priority?: MiddlewarePriority;
|
|
383
|
-
};
|
|
384
|
-
export type CorePikkuMiddlewareFactory<In = any, SingletonServices extends CoreSingletonServices = CoreSingletonServices, UserSession extends CoreUserSession = CoreUserSession> = (input: In) => CorePikkuMiddleware<SingletonServices, UserSession>;
|
|
385
|
-
export type CorePikkuMiddlewareGroup<SingletonServices extends CoreSingletonServices = CoreSingletonServices, UserSession extends CoreUserSession = CoreUserSession> = Array<CorePikkuMiddleware<SingletonServices, UserSession> | CorePikkuMiddlewareFactory<any, SingletonServices, UserSession>>;
|
|
386
|
-
export declare const pikkuMiddleware: <SingletonServices extends CoreSingletonServices = CoreSingletonServices, UserSession extends CoreUserSession = CoreUserSession>(middleware: CorePikkuMiddleware<SingletonServices, UserSession> | CorePikkuMiddlewareConfig<SingletonServices, UserSession>) => CorePikkuMiddleware<SingletonServices, UserSession>;
|
|
387
|
-
export declare const pikkuMiddlewareFactory: <In = any>(factory: CorePikkuMiddlewareFactory<In>) => CorePikkuMiddlewareFactory<In>;
|
|
388
|
-
export declare const pikkuChannelMiddleware: <SingletonServices extends CoreSingletonServices = CoreSingletonServices, Event = unknown>(middleware: CorePikkuChannelMiddleware<SingletonServices, Event>) => CorePikkuChannelMiddleware<SingletonServices, Event>;
|
|
389
|
-
export declare const pikkuChannelMiddlewareFactory: <In = any>(factory: CorePikkuChannelMiddlewareFactory<In>) => CorePikkuChannelMiddlewareFactory<In>;
|
|
390
|
-
export type { PikkuAgentMiddlewareHooks } from '../wirings/agent/agent.types.js';
|
|
391
|
-
export declare const pikkuAgentMiddleware: <State extends Record<string, unknown> = Record<string, unknown>, SingletonServices extends CoreSingletonServices = CoreSingletonServices>(hooks: PikkuAgentMiddlewareHooks<State, SingletonServices>) => PikkuAgentMiddlewareHooks<State, SingletonServices>;
|
|
392
249
|
export type CoreServices<SingletonServices = CoreSingletonServices> = SingletonServices;
|
|
393
250
|
/** Strips `secrets` from a services type. */
|
|
394
251
|
export type SecretlessServices<Services> = Omit<Services, 'secrets'>;
|
|
@@ -458,13 +315,6 @@ export interface SecurityAuditReport {
|
|
|
458
315
|
updates: SecurityAuditUpdate[];
|
|
459
316
|
summary: SecurityAuditSummary;
|
|
460
317
|
}
|
|
461
|
-
export interface SerializedError {
|
|
462
|
-
message: string;
|
|
463
|
-
stack?: string;
|
|
464
|
-
code?: string;
|
|
465
|
-
expected?: boolean;
|
|
466
|
-
[key: string]: any;
|
|
467
|
-
}
|
|
468
318
|
/**
|
|
469
319
|
* A generated schema's declaration site, used by the credential/secret/variable
|
|
470
320
|
* definition validators to point conflicting definitions at their source.
|
package/dist/types/core.types.js
CHANGED
|
@@ -1,19 +1 @@
|
|
|
1
|
-
export
|
|
2
|
-
if (typeof middleware === 'function')
|
|
3
|
-
return middleware;
|
|
4
|
-
const func = middleware.func;
|
|
5
|
-
if (middleware.priority) {
|
|
6
|
-
func.__priority = middleware.priority;
|
|
7
|
-
}
|
|
8
|
-
return func;
|
|
9
|
-
};
|
|
10
|
-
export const pikkuMiddlewareFactory = (factory) => {
|
|
11
|
-
return factory;
|
|
12
|
-
};
|
|
13
|
-
export const pikkuChannelMiddleware = (middleware) => {
|
|
14
|
-
return middleware;
|
|
15
|
-
};
|
|
16
|
-
export const pikkuChannelMiddlewareFactory = (factory) => {
|
|
17
|
-
return factory;
|
|
18
|
-
};
|
|
19
|
-
export const pikkuAgentMiddleware = (hooks) => hooks;
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export type { AuthInstance, CommonWireMeta, CoreConfig, CoreServices, CoreSingletonServices, CoreUserSession, CreateConfig, CreateSingletonServices, CreateWireServices, GetCredential, PikkuWire, PikkuWiringTypes, PostgresConfig, SecretlessServices, SecurityAuditIssue, SecurityAuditReport, SecurityAuditSummary, SecurityAuditUpdate, SecuritySeverity, SecurityUpdateLevel, ServerLifecycle, WireServices, } from './core.types.js';
|
|
2
|
+
export type * from './state.types.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -13,7 +13,9 @@ import type { CoreScheduledTask, ScheduledTasksMeta } from '../wirings/scheduler
|
|
|
13
13
|
import type { CoreWorkflow, WorkflowsRuntimeMeta } from '../wirings/workflow/workflow.types.js';
|
|
14
14
|
import type { CoreFeature } from '../wirings/workflow/scenario.types.js';
|
|
15
15
|
import type { CoreTrigger, CoreTriggerSource, TriggerMeta, TriggerSourceMeta } from '../wirings/trigger/trigger.types.js';
|
|
16
|
-
import type {
|
|
16
|
+
import type { CreateConfig, CreateSingletonServices, CreateWireServices, CoreConfig, CoreSingletonServices, CoreServices, CoreUserSession } from './core.types.js';
|
|
17
|
+
import type { FunctionsMeta } from '../function/function-meta.types.js';
|
|
18
|
+
import type { CorePikkuMiddleware, CorePikkuMiddlewareGroup } from '../middleware/middleware.types.js';
|
|
17
19
|
import type { CorePikkuChannelMiddleware } from '../wirings/channel/channel.types.js';
|
|
18
20
|
export interface PikkuPackageState {
|
|
19
21
|
function: {
|
package/dist/utils.d.ts
CHANGED
|
@@ -9,3 +9,16 @@ export declare const freezeDedupe: <T>(arr?: readonly T[] | T[] | undefined) =>
|
|
|
9
9
|
export declare const stopSingletonServices: () => Promise<void>;
|
|
10
10
|
/** Wrap server lifecycle hooks so the inspector can discover them. */
|
|
11
11
|
export declare const pikkuServerLifecycle: <SS extends CoreSingletonServices = CoreSingletonServices>(lifecycle: ServerLifecycle<SS>) => ServerLifecycle<SS>;
|
|
12
|
+
export type MakeRequired<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>;
|
|
13
|
+
export type JSONPrimitive = string | number | boolean | null | undefined;
|
|
14
|
+
export type JSONValue = JSONPrimitive | JSONValue[] | {
|
|
15
|
+
[key: string]: JSONValue;
|
|
16
|
+
};
|
|
17
|
+
export type PickRequired<T, K extends keyof T> = T & Required<Pick<T, K>>;
|
|
18
|
+
export type PickOptional<T, K extends keyof T> = Partial<T> & Pick<T, K>;
|
|
19
|
+
export type RequireAtLeastOne<T> = {
|
|
20
|
+
[K in keyof T]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<keyof T, K>>>;
|
|
21
|
+
}[keyof T];
|
|
22
|
+
export { getDurationInMilliseconds, getRelativeTimeOffset, getRelativeTimeOffsetFromNow, parseDurationString, } from './time-utils.js';
|
|
23
|
+
export type { RelativeTimeInput } from './time-utils.js';
|
|
24
|
+
export { formatVersionedId, isVersionedId, parseVersionedId, } from './version.js';
|
package/dist/utils.js
CHANGED
|
@@ -98,3 +98,5 @@ export const stopSingletonServices = async () => {
|
|
|
98
98
|
};
|
|
99
99
|
/** Wrap server lifecycle hooks so the inspector can discover them. */
|
|
100
100
|
export const pikkuServerLifecycle = (lifecycle) => lifecycle;
|
|
101
|
+
export { getDurationInMilliseconds, getRelativeTimeOffset, getRelativeTimeOffsetFromNow, parseDurationString, } from './time-utils.js';
|
|
102
|
+
export { formatVersionedId, isVersionedId, parseVersionedId, } from './version.js';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { CoreSingletonServices } from '../../types/core.types.js';
|
|
2
|
+
export type AddonInstance = {
|
|
3
|
+
namespace: string;
|
|
4
|
+
secretOverrides?: Record<string, string>;
|
|
5
|
+
variableOverrides?: Record<string, string>;
|
|
6
|
+
credentialOverrides?: Record<string, string>;
|
|
7
|
+
/** Set by the consuming app: secrets it lends this instance, as the addon names them. */
|
|
8
|
+
secretGrants?: string[];
|
|
9
|
+
/** Set by the consuming app: credentials it lends this instance, as the addon names them. */
|
|
10
|
+
credentialGrants?: string[];
|
|
11
|
+
/** Set by the consuming app to opt this instance out of secret scoping. */
|
|
12
|
+
globalSecrets?: string;
|
|
13
|
+
/** Set by the consuming app to opt this instance out of credential scoping. */
|
|
14
|
+
globalCredentials?: string;
|
|
15
|
+
};
|
|
16
|
+
export declare const getOrCreatePackageSingletonServices: (packageName: string, parentServices: CoreSingletonServices, addonInstance?: AddonInstance) => Promise<CoreSingletonServices>;
|
|
17
|
+
export declare const addonInstanceForNamespace: (namespace: string | undefined, expectedPackage: string) => AddonInstance | undefined;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { pikkuState } from '../../pikku-state.js';
|
|
2
|
+
import { ScopedSecretService } from '../../services/scoped-secret-service.js';
|
|
3
|
+
import { ScopedCredentialService } from '../../services/scoped-credential-service.js';
|
|
4
|
+
/**
|
|
5
|
+
* What the addon declared, plus what the host lent it. Scoping runs outside the
|
|
6
|
+
* aliaser, so every name here is the one the addon reads — which is why an
|
|
7
|
+
* override's *key* grants, and its value does not.
|
|
8
|
+
*/
|
|
9
|
+
const allowedNames = (declared, grants, overrides) => new Set([
|
|
10
|
+
...(declared ?? []),
|
|
11
|
+
...(grants ?? []),
|
|
12
|
+
...Object.keys(overrides ?? {}),
|
|
13
|
+
]);
|
|
14
|
+
const aliasSecretService = (secrets, overrides) => {
|
|
15
|
+
const map = (key) => overrides[key] ?? key;
|
|
16
|
+
return {
|
|
17
|
+
getSecret: (key) => secrets.getSecret(map(key)),
|
|
18
|
+
hasSecret: (key) => secrets.hasSecret(map(key)),
|
|
19
|
+
setSecret: (key, value) => secrets.setSecret(map(key), value),
|
|
20
|
+
deleteSecret: (key) => secrets.deleteSecret(map(key)),
|
|
21
|
+
getSecrets: async (keys) => {
|
|
22
|
+
const result = await secrets.getSecrets(keys.map(map));
|
|
23
|
+
const out = {};
|
|
24
|
+
for (const logical of keys) {
|
|
25
|
+
const real = map(logical);
|
|
26
|
+
if (real in result)
|
|
27
|
+
out[logical] = result[real];
|
|
28
|
+
}
|
|
29
|
+
return out;
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
const aliasVariablesService = (variables, overrides) => {
|
|
34
|
+
const map = (name) => overrides[name] ?? name;
|
|
35
|
+
return {
|
|
36
|
+
get: (name) => variables.get(map(name)),
|
|
37
|
+
getVariables: (names) => {
|
|
38
|
+
const result = variables.getVariables(names.map(map));
|
|
39
|
+
const remap = (r) => {
|
|
40
|
+
const out = {};
|
|
41
|
+
for (const logical of names) {
|
|
42
|
+
const real = map(logical);
|
|
43
|
+
if (real in r)
|
|
44
|
+
out[logical] = r[real];
|
|
45
|
+
}
|
|
46
|
+
return out;
|
|
47
|
+
};
|
|
48
|
+
return result instanceof Promise
|
|
49
|
+
? result.then(remap)
|
|
50
|
+
: remap(result);
|
|
51
|
+
},
|
|
52
|
+
getAll: () => variables.getAll(),
|
|
53
|
+
set: (name, value) => variables.set(map(name), value),
|
|
54
|
+
has: (name) => variables.has(map(name)),
|
|
55
|
+
delete: (name) => variables.delete(map(name)),
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
const findAddonNamespaceForPackage = (packageName) => {
|
|
59
|
+
const addons = pikkuState(null, 'addons', 'packages');
|
|
60
|
+
if (!addons)
|
|
61
|
+
return null;
|
|
62
|
+
for (const [namespace, cfg] of addons.entries()) {
|
|
63
|
+
if (cfg?.package === packageName)
|
|
64
|
+
return namespace;
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
};
|
|
68
|
+
const wrapWorkflowServiceForPackage = (service, packageName, namespace) => {
|
|
69
|
+
return new Proxy(service, {
|
|
70
|
+
get(target, prop, receiver) {
|
|
71
|
+
if (prop === 'startWorkflow' || prop === 'runToCompletion') {
|
|
72
|
+
const original = Reflect.get(target, prop, receiver);
|
|
73
|
+
return function (name, ...rest) {
|
|
74
|
+
if (typeof name === 'string' && !name.includes(':')) {
|
|
75
|
+
const ns = namespace ?? findAddonNamespaceForPackage(packageName);
|
|
76
|
+
if (ns) {
|
|
77
|
+
name = `${ns}:${name}`;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return original.call(this, name, ...rest);
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
return Reflect.get(target, prop, receiver);
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
export const getOrCreatePackageSingletonServices = async (packageName, parentServices, addonInstance) => {
|
|
88
|
+
const cacheKey = addonInstance?.namespace ?? packageName;
|
|
89
|
+
const cachedServices = pikkuState(cacheKey, 'package', 'singletonServices');
|
|
90
|
+
if (cachedServices) {
|
|
91
|
+
return cachedServices;
|
|
92
|
+
}
|
|
93
|
+
const factories = pikkuState(packageName, 'package', 'factories');
|
|
94
|
+
let existingServices = parentServices;
|
|
95
|
+
if (addonInstance?.secretOverrides && parentServices.secrets) {
|
|
96
|
+
existingServices = {
|
|
97
|
+
...existingServices,
|
|
98
|
+
secrets: aliasSecretService(parentServices.secrets, addonInstance.secretOverrides),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
if (addonInstance?.variableOverrides && parentServices.variables) {
|
|
102
|
+
existingServices = {
|
|
103
|
+
...existingServices,
|
|
104
|
+
variables: aliasVariablesService(parentServices.variables, addonInstance.variableOverrides),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
if (!addonInstance?.globalSecrets && existingServices.secrets) {
|
|
108
|
+
existingServices = {
|
|
109
|
+
...existingServices,
|
|
110
|
+
secrets: new ScopedSecretService(existingServices.secrets, allowedNames(pikkuState(packageName, 'package', 'declaredSecrets'), addonInstance?.secretGrants, addonInstance?.secretOverrides)),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
if (!addonInstance?.globalCredentials && existingServices.credentialService) {
|
|
114
|
+
existingServices = {
|
|
115
|
+
...existingServices,
|
|
116
|
+
credentialService: new ScopedCredentialService(existingServices.credentialService, allowedNames(Object.keys(pikkuState(packageName, 'package', 'credentialsMeta') ?? {}), addonInstance?.credentialGrants, addonInstance?.credentialOverrides)),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
if (!factories || !factories.createSingletonServices) {
|
|
120
|
+
return existingServices;
|
|
121
|
+
}
|
|
122
|
+
let config = existingServices.config;
|
|
123
|
+
if (factories.createConfig) {
|
|
124
|
+
config = await factories.createConfig(existingServices.variables);
|
|
125
|
+
}
|
|
126
|
+
const packageServices = await factories.createSingletonServices(config, existingServices);
|
|
127
|
+
if (packageServices.workflowService &&
|
|
128
|
+
typeof packageServices.workflowService === 'object') {
|
|
129
|
+
packageServices.workflowService = wrapWorkflowServiceForPackage(packageServices.workflowService, packageName, addonInstance?.namespace ?? null);
|
|
130
|
+
}
|
|
131
|
+
pikkuState(cacheKey, 'package', 'singletonServices', packageServices);
|
|
132
|
+
return packageServices;
|
|
133
|
+
};
|
|
134
|
+
export const addonInstanceForNamespace = (namespace, expectedPackage) => {
|
|
135
|
+
if (!namespace)
|
|
136
|
+
return undefined;
|
|
137
|
+
const cfg = pikkuState(null, 'addons', 'packages').get(namespace);
|
|
138
|
+
if (!cfg || cfg.package !== expectedPackage)
|
|
139
|
+
return undefined;
|
|
140
|
+
return {
|
|
141
|
+
namespace,
|
|
142
|
+
secretOverrides: cfg.secretOverrides,
|
|
143
|
+
variableOverrides: cfg.variableOverrides,
|
|
144
|
+
credentialOverrides: cfg.credentialOverrides,
|
|
145
|
+
secretGrants: cfg.secretGrants,
|
|
146
|
+
credentialGrants: cfg.credentialGrants,
|
|
147
|
+
globalSecrets: cfg.globalSecrets,
|
|
148
|
+
globalCredentials: cfg.globalCredentials,
|
|
149
|
+
};
|
|
150
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { wireAddon } from './wire-addon.js';
|
|
2
|
+
export type { WireAddonConfig } from './wire-addon.js';
|
|
3
|
+
export { wireRemoteAddon } from './wire-remote-addon.js';
|
|
4
|
+
export type { WireRemoteAddonConfig, RemoteAddonAuth, } from './wire-remote-addon.js';
|
|
5
|
+
export { resolveRemoteAddonToken, RemoteAddonAuthError, } from './remote-addon-auth.js';
|
|
6
|
+
export type { RemoteAddonAuthBinding } from './remote-addon-auth.js';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { CoreServices, PikkuRawWire } from '../../types/core.types.js';
|
|
2
|
+
import { PikkuError } from '../../errors/error-handler.js';
|
|
3
|
+
import { type SecretValue } from '../../classification/secret-value.js';
|
|
4
|
+
export type RemoteAddonAuthBinding = {
|
|
5
|
+
credentialId: string;
|
|
6
|
+
} | {
|
|
7
|
+
secretId: string;
|
|
8
|
+
} | {
|
|
9
|
+
resolve: (services: CoreServices, wire: PikkuRawWire) => string | SecretValue<string> | Promise<string | SecretValue<string>>;
|
|
10
|
+
};
|
|
11
|
+
export declare class RemoteAddonAuthError extends PikkuError {
|
|
12
|
+
readonly namespace: string;
|
|
13
|
+
constructor(namespace: string, detail: string);
|
|
14
|
+
}
|
|
15
|
+
/** Returns `null` only when no auth is bound; an empty resolved token throws. */
|
|
16
|
+
export declare function resolveRemoteAddonToken(auth: RemoteAddonAuthBinding | undefined, services: CoreServices, wire: PikkuRawWire, namespace: string): Promise<string | null>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { PikkuError, addError } from '../../errors/error-handler.js';
|
|
2
|
+
import { isSecretValue, } from '../../classification/secret-value.js';
|
|
3
|
+
export class RemoteAddonAuthError extends PikkuError {
|
|
4
|
+
namespace;
|
|
5
|
+
constructor(namespace, detail) {
|
|
6
|
+
super(`Remote addon '${namespace}' auth could not be resolved: ${detail}`);
|
|
7
|
+
this.namespace = namespace;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
addError(RemoteAddonAuthError, {
|
|
11
|
+
status: 401,
|
|
12
|
+
message: 'Remote addon authentication could not be resolved.',
|
|
13
|
+
});
|
|
14
|
+
/** Returns `null` only when no auth is bound; an empty resolved token throws. */
|
|
15
|
+
export async function resolveRemoteAddonToken(auth, services, wire, namespace) {
|
|
16
|
+
if (!auth) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
let token;
|
|
20
|
+
if ('credentialId' in auth) {
|
|
21
|
+
if (typeof wire.getCredential !== 'function') {
|
|
22
|
+
throw new RemoteAddonAuthError(namespace, `credentialId '${auth.credentialId}' requires a wire with credential access`);
|
|
23
|
+
}
|
|
24
|
+
token = await wire.getCredential(auth.credentialId);
|
|
25
|
+
}
|
|
26
|
+
else if ('secretId' in auth) {
|
|
27
|
+
token = await services.secrets.getSecret(auth.secretId);
|
|
28
|
+
}
|
|
29
|
+
else if (typeof auth.resolve === 'function') {
|
|
30
|
+
token = await auth.resolve(services, wire);
|
|
31
|
+
}
|
|
32
|
+
// The wire is where a secret is meant to end up, so unwrap it here rather
|
|
33
|
+
// than at each branch — `resolve` and `getCredential` may hand one back too.
|
|
34
|
+
const resolved = isSecretValue(token) ? token.reveal() : token;
|
|
35
|
+
if (resolved === null || resolved === undefined || resolved === '') {
|
|
36
|
+
throw new RemoteAddonAuthError(namespace, 'resolved token was empty');
|
|
37
|
+
}
|
|
38
|
+
return String(resolved);
|
|
39
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { CorePikkuMiddleware } from '../../middleware/middleware.types.js';
|
|
2
|
+
export type WireAddonConfig = {
|
|
3
|
+
name: string;
|
|
4
|
+
package: string;
|
|
5
|
+
rpcEndpoint?: string;
|
|
6
|
+
auth?: boolean;
|
|
7
|
+
mcp?: boolean;
|
|
8
|
+
tags?: string[];
|
|
9
|
+
/** Required of every function in the addon, on top of the function's own. */
|
|
10
|
+
scopes?: string[];
|
|
11
|
+
secretOverrides?: Record<string, string>;
|
|
12
|
+
variableOverrides?: Record<string, string>;
|
|
13
|
+
credentialOverrides?: Record<string, string>;
|
|
14
|
+
/**
|
|
15
|
+
* Secrets this instance may read on top of the ones it declared, named as the
|
|
16
|
+
* addon reads them — the scope check runs before `secretOverrides` renames
|
|
17
|
+
* them, so an overridden secret is named here by its addon-side key. Listing
|
|
18
|
+
* one in `secretOverrides` grants it too.
|
|
19
|
+
*
|
|
20
|
+
* For an addon whose secret names come off its input rather than its own
|
|
21
|
+
* source, this is how the host lends names the addon could not declare.
|
|
22
|
+
*/
|
|
23
|
+
secretGrants?: string[];
|
|
24
|
+
/** Credentials this instance may read on top of the ones it declared. */
|
|
25
|
+
credentialGrants?: string[];
|
|
26
|
+
/**
|
|
27
|
+
* Hands this instance the whole `SecretService` instead of one scoped to the
|
|
28
|
+
* secrets it declared. The value is the reason, recorded in the deploy
|
|
29
|
+
* manifest — an addon that names secrets at runtime cannot be scoped, and
|
|
30
|
+
* only the consuming app, never the addon, can grant it.
|
|
31
|
+
*/
|
|
32
|
+
globalSecrets?: string;
|
|
33
|
+
/**
|
|
34
|
+
* Hands this instance the whole `CredentialService` instead of one narrowed
|
|
35
|
+
* to the credentials it declared. The value is the reason, recorded in the
|
|
36
|
+
* deploy manifest, and only the consuming app can grant it.
|
|
37
|
+
*/
|
|
38
|
+
globalCredentials?: string;
|
|
39
|
+
};
|
|
40
|
+
export declare const wireAddon: (config: WireAddonConfig) => void;
|
|
41
|
+
/**
|
|
42
|
+
* knowledge: decisions/security/addon-scopes-are-resolved-where-the-function-runs.md
|
|
43
|
+
*/
|
|
44
|
+
export declare const resolveAddonScopes: (packageName: string | null, namespace?: string) => string[];
|
|
45
|
+
/**
|
|
46
|
+
* knowledge: decisions/security/addon-auth-and-tags-only-tighten.md
|
|
47
|
+
*/
|
|
48
|
+
export declare const resolveAddonTags: (packageName: string | null, namespace?: string) => string[];
|
|
49
|
+
/**
|
|
50
|
+
* True when any governing instance requires a session. `auth: false` is not
|
|
51
|
+
* honoured here — on a direct wiring it would weaken the wiring's own gate.
|
|
52
|
+
*
|
|
53
|
+
* knowledge: decisions/security/addon-auth-and-tags-only-tighten.md
|
|
54
|
+
*/
|
|
55
|
+
export declare const resolveAddonAuth: (packageName: string | null, namespace?: string) => boolean;
|
|
56
|
+
/**
|
|
57
|
+
* The package a namespaced function id belongs to, and the name that package
|
|
58
|
+
* publishes it under.
|
|
59
|
+
*
|
|
60
|
+
* A wiring that points at an addon function through `ref('ns:fn')` records
|
|
61
|
+
* `ns:fn` as its own function id — the same id every other wire type records —
|
|
62
|
+
* but the addon publishes its metadata under the bare `fn`, in its own package
|
|
63
|
+
* state. Without this the wire finds the function it registered and no metadata
|
|
64
|
+
* to run it by.
|
|
65
|
+
*
|
|
66
|
+
* The wiring itself stays the consuming app's, so `packageName` is the package
|
|
67
|
+
* the *wire* runs in, not the target's: it is null for a `ref()` the app wired,
|
|
68
|
+
* and only narrows the lookup when a wire really does run inside the addon.
|
|
69
|
+
*/
|
|
70
|
+
export declare const resolveAddonFunctionTarget: (funcName: string, packageName: string | null) => {
|
|
71
|
+
packageName: string;
|
|
72
|
+
localName: string;
|
|
73
|
+
} | null;
|
|
74
|
+
/**
|
|
75
|
+
* Addon tags name middleware the *consuming app* registered, so they resolve
|
|
76
|
+
* against the root tag groups rather than the addon package's own.
|
|
77
|
+
*
|
|
78
|
+
* knowledge: decisions/security/addon-auth-and-tags-only-tighten.md
|
|
79
|
+
*/
|
|
80
|
+
export declare const resolveAddonTagMiddleware: (packageName: string | null, namespace?: string) => CorePikkuMiddleware[];
|