@pikku/core 0.12.84 → 0.12.86
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 +424 -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/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-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 +2 -2
- 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 +3 -2
- 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 +9 -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 +14 -4
- package/dist/wirings/workflow/pikku-scenario-service.js +44 -16
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +2 -1
- package/dist/wirings/workflow/pikku-workflow-service.js +3 -4
- 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.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-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 +2 -0
- 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 +2 -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/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 +2 -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-prepare.ts +8 -5
- package/src/wirings/agent/agent-runner.ts +2 -3
- package/src/wirings/agent/agent-stream.ts +2 -3
- package/src/wirings/agent/agent-utils.ts +19 -0
- package/src/wirings/agent/agent.types.ts +3 -3
- 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 +23 -0
- package/src/wirings/variable/validate-variable-definitions.ts +2 -0
- package/src/wirings/variable/variable.types.ts +9 -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 +59 -19
- package/src/wirings/workflow/pikku-workflow-service.ts +6 -8
- 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.types.ts +4 -12
- package/src/wirings-stay-decoupled.test.ts +6 -3
- package/tsconfig.tsbuildinfo +1 -1
- package/tsconfig.type-tests.json +3 -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
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { pikkuState } from '../../pikku-state.js';
|
|
2
|
+
import { getTagGroups } from '../../utils.js';
|
|
3
|
+
export const wireAddon = (config) => {
|
|
4
|
+
pikkuState(null, 'addons', 'packages').set(config.name, {
|
|
5
|
+
package: config.package,
|
|
6
|
+
rpcEndpoint: config.rpcEndpoint,
|
|
7
|
+
auth: config.auth,
|
|
8
|
+
tags: config.tags,
|
|
9
|
+
...(config.scopes ? { scopes: config.scopes } : {}),
|
|
10
|
+
...(config.secretOverrides
|
|
11
|
+
? { secretOverrides: config.secretOverrides }
|
|
12
|
+
: {}),
|
|
13
|
+
...(config.variableOverrides
|
|
14
|
+
? { variableOverrides: config.variableOverrides }
|
|
15
|
+
: {}),
|
|
16
|
+
...(config.credentialOverrides
|
|
17
|
+
? { credentialOverrides: config.credentialOverrides }
|
|
18
|
+
: {}),
|
|
19
|
+
...(config.secretGrants ? { secretGrants: config.secretGrants } : {}),
|
|
20
|
+
...(config.credentialGrants
|
|
21
|
+
? { credentialGrants: config.credentialGrants }
|
|
22
|
+
: {}),
|
|
23
|
+
...(config.globalSecrets ? { globalSecrets: config.globalSecrets } : {}),
|
|
24
|
+
...(config.globalCredentials
|
|
25
|
+
? { globalCredentials: config.globalCredentials }
|
|
26
|
+
: {}),
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* The addon configs a running function is governed by: the named instance when
|
|
31
|
+
* the caller resolved one, every instance of the package otherwise.
|
|
32
|
+
*
|
|
33
|
+
* knowledge: decisions/security/addon-scopes-are-resolved-where-the-function-runs.md
|
|
34
|
+
*/
|
|
35
|
+
const governingAddonConfigs = (packageName, namespace) => {
|
|
36
|
+
if (!packageName) {
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
const addons = pikkuState(null, 'addons', 'packages');
|
|
40
|
+
if (!addons) {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
if (namespace) {
|
|
44
|
+
const config = addons.get(namespace);
|
|
45
|
+
if (config?.package === packageName) {
|
|
46
|
+
return [config];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return [...addons.values()].filter((config) => config?.package === packageName);
|
|
50
|
+
};
|
|
51
|
+
const unionOf = (packageName, namespace, field) => {
|
|
52
|
+
const values = new Set();
|
|
53
|
+
for (const config of governingAddonConfigs(packageName, namespace)) {
|
|
54
|
+
for (const value of config[field] ?? []) {
|
|
55
|
+
values.add(value);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return [...values];
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* knowledge: decisions/security/addon-scopes-are-resolved-where-the-function-runs.md
|
|
62
|
+
*/
|
|
63
|
+
export const resolveAddonScopes = (packageName, namespace) => unionOf(packageName, namespace, 'scopes');
|
|
64
|
+
/**
|
|
65
|
+
* knowledge: decisions/security/addon-auth-and-tags-only-tighten.md
|
|
66
|
+
*/
|
|
67
|
+
export const resolveAddonTags = (packageName, namespace) => unionOf(packageName, namespace, 'tags');
|
|
68
|
+
/**
|
|
69
|
+
* True when any governing instance requires a session. `auth: false` is not
|
|
70
|
+
* honoured here — on a direct wiring it would weaken the wiring's own gate.
|
|
71
|
+
*
|
|
72
|
+
* knowledge: decisions/security/addon-auth-and-tags-only-tighten.md
|
|
73
|
+
*/
|
|
74
|
+
export const resolveAddonAuth = (packageName, namespace) => governingAddonConfigs(packageName, namespace).some((config) => config.auth === true);
|
|
75
|
+
/**
|
|
76
|
+
* The package a namespaced function id belongs to, and the name that package
|
|
77
|
+
* publishes it under.
|
|
78
|
+
*
|
|
79
|
+
* A wiring that points at an addon function through `ref('ns:fn')` records
|
|
80
|
+
* `ns:fn` as its own function id — the same id every other wire type records —
|
|
81
|
+
* but the addon publishes its metadata under the bare `fn`, in its own package
|
|
82
|
+
* state. Without this the wire finds the function it registered and no metadata
|
|
83
|
+
* to run it by.
|
|
84
|
+
*
|
|
85
|
+
* The wiring itself stays the consuming app's, so `packageName` is the package
|
|
86
|
+
* the *wire* runs in, not the target's: it is null for a `ref()` the app wired,
|
|
87
|
+
* and only narrows the lookup when a wire really does run inside the addon.
|
|
88
|
+
*/
|
|
89
|
+
export const resolveAddonFunctionTarget = (funcName, packageName) => {
|
|
90
|
+
const separator = funcName.indexOf(':');
|
|
91
|
+
if (separator === -1) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
const namespace = funcName.slice(0, separator);
|
|
95
|
+
const config = pikkuState(null, 'addons', 'packages').get(namespace);
|
|
96
|
+
if (!config) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
if (packageName && config.package !== packageName) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
packageName: config.package,
|
|
104
|
+
localName: funcName.slice(separator + 1),
|
|
105
|
+
};
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Addon tags name middleware the *consuming app* registered, so they resolve
|
|
109
|
+
* against the root tag groups rather than the addon package's own.
|
|
110
|
+
*
|
|
111
|
+
* knowledge: decisions/security/addon-auth-and-tags-only-tighten.md
|
|
112
|
+
*/
|
|
113
|
+
export const resolveAddonTagMiddleware = (packageName, namespace) => {
|
|
114
|
+
const tags = resolveAddonTags(packageName, namespace);
|
|
115
|
+
if (tags.length === 0) {
|
|
116
|
+
return [];
|
|
117
|
+
}
|
|
118
|
+
const tagGroups = pikkuState(null, 'middleware', 'tagGroup');
|
|
119
|
+
return tags.flatMap((tag) => getTagGroups(tagGroups, tag).flat());
|
|
120
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { CoreServices, PikkuWire } from '../../types/core.types.js';
|
|
2
|
+
/** Sent as `Authorization: Bearer <token>`; a non-default header is declared by the addon. */
|
|
3
|
+
export type RemoteAddonAuth = {
|
|
4
|
+
credentialId: string;
|
|
5
|
+
} | {
|
|
6
|
+
secretId: string;
|
|
7
|
+
} | {
|
|
8
|
+
resolve: (services: CoreServices, wire: PikkuWire) => string | Promise<string>;
|
|
9
|
+
};
|
|
10
|
+
export type WireRemoteAddonConfig = {
|
|
11
|
+
/** Consumer-facing namespace, e.g. `registry` → `rpc('registry:getOpenApi')` */
|
|
12
|
+
name: string;
|
|
13
|
+
/** Must be installed as a devDependency — `pikku verify` enforces this. */
|
|
14
|
+
package: string;
|
|
15
|
+
serverUrl: string | ((services: CoreServices) => string | Promise<string>);
|
|
16
|
+
/** Omit when the addon declares its remote surface public. */
|
|
17
|
+
auth?: RemoteAddonAuth;
|
|
18
|
+
/** Map a consumer-facing fn name → the remote fn name, when they differ (rare). */
|
|
19
|
+
remoteName?: (fn: string) => string;
|
|
20
|
+
tags?: string[];
|
|
21
|
+
};
|
|
22
|
+
export declare const wireRemoteAddon: (config: WireRemoteAddonConfig) => void;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { pikkuState } from '../../pikku-state.js';
|
|
2
|
+
export const wireRemoteAddon = (config) => {
|
|
3
|
+
pikkuState(null, 'addons', 'packages').set(config.name, {
|
|
4
|
+
package: config.package,
|
|
5
|
+
tags: config.tags,
|
|
6
|
+
remote: true,
|
|
7
|
+
serverUrl: config.serverUrl,
|
|
8
|
+
...(config.auth ? { remoteAuth: config.auth } : {}),
|
|
9
|
+
...(config.remoteName ? { remoteName: config.remoteName } : {}),
|
|
10
|
+
});
|
|
11
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CoreUserSession } from '../../types/core.types.js';
|
|
1
|
+
import type { CoreUserSession, GetCredential } from '../../types/core.types.js';
|
|
2
2
|
import type { CoreAgent, AgentInput, AgentToolDef, AgentMessage, AgentStreamChannel, PikkuAgentMiddlewareHooks, SessionScope } from './agent.types.js';
|
|
3
3
|
import type { AgentRunnerParams } from '../../services/agent-runner-service.js';
|
|
4
4
|
import { PikkuError } from '../../errors/error-handler.js';
|
|
@@ -6,7 +6,7 @@ import type { SessionService } from '../../services/user-session-service.js';
|
|
|
6
6
|
export type RunAgentParams = {
|
|
7
7
|
sessionService?: SessionService<CoreUserSession>;
|
|
8
8
|
/** Credential accessor for the current request — used to read per-user overrides (e.g. AI_API_KEY). */
|
|
9
|
-
getCredential?:
|
|
9
|
+
getCredential?: GetCredential;
|
|
10
10
|
/** Ephemeral owner identity minted for a sessionless request; never client-supplied, never reused across requests. */
|
|
11
11
|
anonymousOwnerResourceId?: string;
|
|
12
12
|
};
|
|
@@ -105,7 +105,7 @@ export declare function prepareAgentRun(agentName: string, input: AgentInput, pa
|
|
|
105
105
|
packageName: string | null;
|
|
106
106
|
resolvedName: string;
|
|
107
107
|
agentRunner: import("../../services/agent-runner-service.js").AgentRunnerService;
|
|
108
|
-
storage: import("../../
|
|
108
|
+
storage: import("../../services/agent-storage-service.js").AgentStorageService | undefined;
|
|
109
109
|
memoryConfig: import("./agent.types.js").AgentMemoryConfig | undefined;
|
|
110
110
|
threadId: string;
|
|
111
111
|
userMessage: AgentMessage;
|
|
@@ -10,7 +10,7 @@ import { awaitPendingInterruptNote } from './agent-interrupt.js';
|
|
|
10
10
|
import { streamAgent } from './agent-stream.js';
|
|
11
11
|
import { runAgent } from './agent-runner.js';
|
|
12
12
|
import { resolveNamespace, ContextAwareRPCService, } from '../../wirings/rpc/rpc-runner.js';
|
|
13
|
-
import { getOrCreatePackageSingletonServices } from '../../wirings/
|
|
13
|
+
import { getOrCreatePackageSingletonServices } from '../../wirings/addon/addon-runner.js';
|
|
14
14
|
import { resolveMemoryServices, loadContextMessages, trimMessages, } from './agent-memory.js';
|
|
15
15
|
import { resolveModelConfig } from './agent-model-config.js';
|
|
16
16
|
export function resolveSessionPrincipal(params, sessionScope) {
|
|
@@ -7,7 +7,7 @@ import { applyInputMiddleware, describeApprovals, notifyAfterStep, toAccumulated
|
|
|
7
7
|
import { applyOutputMiddleware, finalizeAgentRun, lastUserMessageText, } from './agent-finalize.js';
|
|
8
8
|
import { resolveModelConfig } from './agent-model-config.js';
|
|
9
9
|
import { AIProviderNotConfiguredError } from '../../errors/errors.js';
|
|
10
|
-
import { randomUUID } from './agent-utils.js';
|
|
10
|
+
import { deniedToolResult, randomUUID } from './agent-utils.js';
|
|
11
11
|
function stripNulls(obj) {
|
|
12
12
|
if (obj === null)
|
|
13
13
|
return undefined;
|
|
@@ -306,8 +306,7 @@ export async function resumeAgentSync(runId, approvals, params, expectedAgentNam
|
|
|
306
306
|
let resultStr;
|
|
307
307
|
let toolError;
|
|
308
308
|
if (rejectedIds.has(toolCallId)) {
|
|
309
|
-
resultStr =
|
|
310
|
-
'The user explicitly declined this action. Inform them that it was declined and do not retry.';
|
|
309
|
+
resultStr = deniedToolResult();
|
|
311
310
|
}
|
|
312
311
|
else if (approvedIds.has(toolCallId)) {
|
|
313
312
|
const matchingTool = tools.find((t) => t.name === pending.toolName);
|
|
@@ -2,7 +2,7 @@ import { finalizeAgentRun, lastUserMessageText } from './agent-finalize.js';
|
|
|
2
2
|
import { pikkuState, getSingletonServices } from '../../pikku-state.js';
|
|
3
3
|
import { applyInputMiddleware } from './agent-turn.js';
|
|
4
4
|
import { AIProviderNotConfiguredError } from '../../errors/errors.js';
|
|
5
|
-
import { randomUUID } from './agent-utils.js';
|
|
5
|
+
import { deniedToolResult, randomUUID } from './agent-utils.js';
|
|
6
6
|
import { SPOKEN_TRANSCRIPT } from './voice-input.js';
|
|
7
7
|
import { combineChannelMiddleware, wrapChannelWithMiddleware, } from '../channel/channel-middleware-runner.js';
|
|
8
8
|
import { resolveMemoryServices, loadContextMessages, trimMessages, getWorkingMemoryMiddleware, } from './agent-memory.js';
|
|
@@ -717,7 +717,7 @@ export async function resumeAgent(input, channel, params, options) {
|
|
|
717
717
|
if (pending.type === 'agent-call') {
|
|
718
718
|
await agentRunState.updateRun(pending.agentRunId, { status: 'failed' });
|
|
719
719
|
}
|
|
720
|
-
const denialResult =
|
|
720
|
+
const denialResult = deniedToolResult();
|
|
721
721
|
if (storage) {
|
|
722
722
|
await storage.saveMessages(run.threadId, [
|
|
723
723
|
{
|
|
@@ -1 +1,14 @@
|
|
|
1
1
|
export declare const randomUUID: () => string;
|
|
2
|
+
/**
|
|
3
|
+
* The tool result stored and streamed when a user denies an approval.
|
|
4
|
+
*
|
|
5
|
+
* Two readers, one string. The model needs the sentence — it has to tell the
|
|
6
|
+
* user the action was declined and not retry it. A client needs to know a
|
|
7
|
+
* denial when it sees one, so it can render the call as denied rather than as
|
|
8
|
+
* a successful call that happened to return prose; that is what `approved`
|
|
9
|
+
* carries, and it is the same flag a client sets optimistically the moment the
|
|
10
|
+
* deny button is clicked. Emitting only the sentence made the two disagree:
|
|
11
|
+
* live the call showed denied, and on any re-render from storage the same call
|
|
12
|
+
* came back green.
|
|
13
|
+
*/
|
|
14
|
+
export declare const deniedToolResult: () => string;
|
|
@@ -1 +1,17 @@
|
|
|
1
1
|
export const randomUUID = () => globalThis.crypto.randomUUID();
|
|
2
|
+
/**
|
|
3
|
+
* The tool result stored and streamed when a user denies an approval.
|
|
4
|
+
*
|
|
5
|
+
* Two readers, one string. The model needs the sentence — it has to tell the
|
|
6
|
+
* user the action was declined and not retry it. A client needs to know a
|
|
7
|
+
* denial when it sees one, so it can render the call as denied rather than as
|
|
8
|
+
* a successful call that happened to return prose; that is what `approved`
|
|
9
|
+
* carries, and it is the same flag a client sets optimistically the moment the
|
|
10
|
+
* deny button is clicked. Emitting only the sentence made the two disagree:
|
|
11
|
+
* live the call showed denied, and on any re-render from storage the same call
|
|
12
|
+
* came back green.
|
|
13
|
+
*/
|
|
14
|
+
export const deniedToolResult = () => JSON.stringify({
|
|
15
|
+
approved: false,
|
|
16
|
+
message: 'The user explicitly declined this action. Inform them that it was declined and do not retry.',
|
|
17
|
+
});
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { CorePermissionGroup, CorePikkuPermission } from '../../function/functions.types.js';
|
|
2
|
-
import type { CorePikkuMiddleware, MiddlewareMetadata
|
|
2
|
+
import type { CorePikkuMiddleware, MiddlewareMetadata } from '../../middleware/middleware.types.js';
|
|
3
|
+
import type { PermissionMetadata } from '../../function/function-meta.types.js';
|
|
3
4
|
import type { AIProviderOptions } from '../../services/agent-runner-service.js';
|
|
4
5
|
import type { PikkuChannel } from '../channel/channel.types.js';
|
|
5
6
|
import type { CorePikkuChannelMiddleware } from '../channel/channel.types.js';
|
|
@@ -389,7 +390,7 @@ export type CoreAgent<PikkuPermission = CorePikkuPermission<any, any>, PikkuMidd
|
|
|
389
390
|
* which OR together, a scope can only narrow access.
|
|
390
391
|
*
|
|
391
392
|
* Narrowed to the generated `ScopeId` union in a project's own
|
|
392
|
-
*
|
|
393
|
+
* `#pikku/scopes`, so an undeclared scope is a compile error.
|
|
393
394
|
*/
|
|
394
395
|
scopes?: Scope[];
|
|
395
396
|
permissions?: CorePermissionGroup<PikkuPermission>;
|
|
@@ -4,7 +4,7 @@ export { runAgent, resumeAgentSync } from './agent-runner.js';
|
|
|
4
4
|
export { resolveModelAlias } from './agent-model-config.js';
|
|
5
5
|
export { streamAgent, resumeAgent, interruptAgent } from './agent-stream.js';
|
|
6
6
|
export { voiceInput, NoSpeechDetectedError, SPOKEN_TURN, SPOKEN_TRANSCRIPT, } from './voice-input.js';
|
|
7
|
-
export { voiceOutput, unspeakableScripts, voiceForText, type SpeakableScripts, } from './voice-output.js';
|
|
7
|
+
export { voiceOutput, unspeakableScripts, voiceForText, type SpeakableScripts, type VoiceOutputState, } from './voice-output.js';
|
|
8
8
|
export { AgentInterruptedError, signalRunInterrupt } from './agent-interrupt.js';
|
|
9
9
|
export type { AgentInterruption, AgentInterruptResult, InterruptibleRunHandle, } from './agent-interrupt.js';
|
|
10
10
|
export { type RunAgentParams, type StreamAgentOptions, ToolApprovalRequired, ToolCredentialRequired, canAccessThread, isOwnedByPrincipal, threadOwnerConstraint, } from './agent-prepare.js';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { pikkuAgentMiddleware } from '../../
|
|
1
|
+
import { pikkuAgentMiddleware } from '../../middleware/middleware-factories.js';
|
|
2
2
|
import { safeFetch } from '../../utils/safe-fetch.js';
|
|
3
3
|
function base64ToUint8Array(base64) {
|
|
4
4
|
const binary = atob(base64);
|
|
@@ -5,6 +5,19 @@ import type { PikkuAgentScorer, ScorerInput, ScorerJudgeConfig, ScorerOutput } f
|
|
|
5
5
|
*
|
|
6
6
|
* A reference-based judge is shown the answer key; a reference-free one is not,
|
|
7
7
|
* and grades the answer on its own merits.
|
|
8
|
+
*
|
|
9
|
+
* The tool calls are shown because without them a judge cannot tell a fact from
|
|
10
|
+
* a fabrication. Grading a todo agent that had just listed the user's todos
|
|
11
|
+
* correctly, a judge given only the answer called it "a plausible-looking list"
|
|
12
|
+
* that "offers no real access to your actual list, making it effectively a
|
|
13
|
+
* guess", and scored 0.2 what it scored 1 on other runs — right by its rubric,
|
|
14
|
+
* on the evidence it was given, and wrong about the run. An agent that answers
|
|
15
|
+
* from a tool and one that invents the same sentence are indistinguishable in
|
|
16
|
+
* the output alone; they differ only in what the run did to get there.
|
|
17
|
+
*
|
|
18
|
+
* How much of that to show is `judge.toolCalls`, and the default stops at the
|
|
19
|
+
* names: the 0.2 was the judge doubting the run had any access, and a name
|
|
20
|
+
* settles that without handing a third-party model the rows.
|
|
8
21
|
*/
|
|
9
22
|
export declare const buildJudgePrompt: (judge: ScorerJudgeConfig, input: ScorerInput) => string;
|
|
10
23
|
/**
|
|
@@ -16,11 +16,59 @@ const JUDGE_OUTPUT_SCHEMA = {
|
|
|
16
16
|
required: ['score', 'reason'],
|
|
17
17
|
additionalProperties: false,
|
|
18
18
|
};
|
|
19
|
+
/**
|
|
20
|
+
* The default disclosure: which tools ran and which failed, and nothing about
|
|
21
|
+
* what went in or came back. A judge that can see a run reached `listTodos`
|
|
22
|
+
* can tell a retrieved list from an invented one, which is the whole of what
|
|
23
|
+
* the trajectory is needed for — the rows themselves it does not need, and an
|
|
24
|
+
* error string is a tool's own words about the caller's data, so it is
|
|
25
|
+
* summarised rather than quoted.
|
|
26
|
+
*/
|
|
27
|
+
const describeToolCallName = (call) => `- ${call.name}${call.error ? ' (failed)' : ''}`;
|
|
28
|
+
/** Everything about a call, for a judge that grades against what came back. */
|
|
29
|
+
const describeToolCall = (call) => {
|
|
30
|
+
const outcome = call.error
|
|
31
|
+
? `failed: ${call.error}`
|
|
32
|
+
: `returned ${formatToolValue(call.result)}`;
|
|
33
|
+
return `- ${call.name}(${formatToolValue(call.args)}) ${outcome}`;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* A tool's arguments and result are arbitrary JSON, and some of it is large —
|
|
37
|
+
* a listing, a document, a page of search results. Truncating keeps a single
|
|
38
|
+
* fat call from crowding the answer out of the judge's context; what survives
|
|
39
|
+
* is the head, which is where the shape of a value is.
|
|
40
|
+
*/
|
|
41
|
+
const TOOL_VALUE_LIMIT = 500;
|
|
42
|
+
const formatToolValue = (value) => {
|
|
43
|
+
if (value === undefined) {
|
|
44
|
+
return 'nothing';
|
|
45
|
+
}
|
|
46
|
+
const text = typeof value === 'string' ? value : JSON.stringify(value);
|
|
47
|
+
if (text === undefined) {
|
|
48
|
+
return 'nothing';
|
|
49
|
+
}
|
|
50
|
+
return text.length > TOOL_VALUE_LIMIT
|
|
51
|
+
? `${text.slice(0, TOOL_VALUE_LIMIT)}… (truncated)`
|
|
52
|
+
: text;
|
|
53
|
+
};
|
|
19
54
|
/**
|
|
20
55
|
* The message a judge grades when its scorer supplies no `prompt`.
|
|
21
56
|
*
|
|
22
57
|
* A reference-based judge is shown the answer key; a reference-free one is not,
|
|
23
58
|
* and grades the answer on its own merits.
|
|
59
|
+
*
|
|
60
|
+
* The tool calls are shown because without them a judge cannot tell a fact from
|
|
61
|
+
* a fabrication. Grading a todo agent that had just listed the user's todos
|
|
62
|
+
* correctly, a judge given only the answer called it "a plausible-looking list"
|
|
63
|
+
* that "offers no real access to your actual list, making it effectively a
|
|
64
|
+
* guess", and scored 0.2 what it scored 1 on other runs — right by its rubric,
|
|
65
|
+
* on the evidence it was given, and wrong about the run. An agent that answers
|
|
66
|
+
* from a tool and one that invents the same sentence are indistinguishable in
|
|
67
|
+
* the output alone; they differ only in what the run did to get there.
|
|
68
|
+
*
|
|
69
|
+
* How much of that to show is `judge.toolCalls`, and the default stops at the
|
|
70
|
+
* names: the 0.2 was the judge doubting the run had any access, and a name
|
|
71
|
+
* settles that without handing a third-party model the rows.
|
|
24
72
|
*/
|
|
25
73
|
export const buildJudgePrompt = (judge, input) => {
|
|
26
74
|
if (judge.prompt)
|
|
@@ -30,6 +78,10 @@ export const buildJudgePrompt = (judge, input) => {
|
|
|
30
78
|
sections.push(`Reference answer:\n${input.reference}`);
|
|
31
79
|
}
|
|
32
80
|
sections.push(`Assistant answered:\n${input.output}`);
|
|
81
|
+
if (judge.toolCalls !== 'off' && input.toolCalls.length > 0) {
|
|
82
|
+
const describe = judge.toolCalls === 'full' ? describeToolCall : describeToolCallName;
|
|
83
|
+
sections.push(`Tools the assistant ran:\n${input.toolCalls.map(describe).join('\n')}`);
|
|
84
|
+
}
|
|
33
85
|
sections.push(judge.goal);
|
|
34
86
|
sections.push('Respond with a score 0..1 and a brief reason.');
|
|
35
87
|
return sections.join('\n\n');
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { PikkuAgentScorer, ScorerInput, ScorerOutput } from './agent-scorer.types.js';
|
|
1
|
+
import type { JudgeToolCallDisclosure, PikkuAgentScorer, ScorerInput, ScorerOutput } from './agent-scorer.types.js';
|
|
2
2
|
/**
|
|
3
3
|
* A heuristic scorer: pure code over the finished run, no model call, so it
|
|
4
4
|
* grades on the fast lane.
|
|
@@ -35,5 +35,11 @@ export declare const pikkuAgentJudge: <Services = any>(config: {
|
|
|
35
35
|
requiresReference?: boolean;
|
|
36
36
|
model: string;
|
|
37
37
|
goal: string;
|
|
38
|
+
/**
|
|
39
|
+
* How much of the run's trajectory to disclose to the judge. Defaults to
|
|
40
|
+
* `names`: enough to tell a tool-backed answer from an invented one, without
|
|
41
|
+
* sending a third-party model the rows the tools returned.
|
|
42
|
+
*/
|
|
43
|
+
toolCalls?: JudgeToolCallDisclosure;
|
|
38
44
|
prompt?: (input: ScorerInput) => string;
|
|
39
45
|
}) => PikkuAgentScorer<Services>;
|
|
@@ -43,6 +43,24 @@ export interface ScorerOutput {
|
|
|
43
43
|
*/
|
|
44
44
|
export type ScorerLane = 'fast' | 'slow';
|
|
45
45
|
export declare const SCORER_LANE_QUEUES: Record<ScorerLane, string>;
|
|
46
|
+
/**
|
|
47
|
+
* How much of the run's trajectory the default judge prompt discloses.
|
|
48
|
+
*
|
|
49
|
+
* A judge is a third-party model, and a tool's arguments and results are the
|
|
50
|
+
* most sensitive thing a run touches — the row it read, the address it looked
|
|
51
|
+
* up, the message it sent. Output middleware has already had its pass by the
|
|
52
|
+
* time a scorer sees any of this, so what a judge is shown is what was stored;
|
|
53
|
+
* this is the second gate, for a judge that should be told less than the
|
|
54
|
+
* database was.
|
|
55
|
+
*
|
|
56
|
+
* - `names` — which tools ran, and whether each failed. No arguments, no
|
|
57
|
+
* results. Enough to tell an answer backed by a tool from an invented one,
|
|
58
|
+
* which is the failure this exists to catch, while disclosing no row data.
|
|
59
|
+
* - `full` — names, arguments and results, truncated. For a judge that must
|
|
60
|
+
* check the answer *against* what the tool returned.
|
|
61
|
+
* - `off` — no trajectory at all. The judge grades the answer alone.
|
|
62
|
+
*/
|
|
63
|
+
export type JudgeToolCallDisclosure = 'off' | 'names' | 'full';
|
|
46
64
|
/**
|
|
47
65
|
* A judge's model call. Present only on a scorer built with `pikkuAgentJudge`;
|
|
48
66
|
* `score` is present only on one built with `pikkuAgentScorer`. Exactly one of the
|
|
@@ -51,6 +69,8 @@ export declare const SCORER_LANE_QUEUES: Record<ScorerLane, string>;
|
|
|
51
69
|
export type ScorerJudgeConfig = {
|
|
52
70
|
model: string;
|
|
53
71
|
goal: string;
|
|
72
|
+
/** Always set: `pikkuAgentJudge` resolves the default. */
|
|
73
|
+
toolCalls: JudgeToolCallDisclosure;
|
|
54
74
|
prompt?: (input: ScorerInput) => string;
|
|
55
75
|
};
|
|
56
76
|
export type PikkuAgentScorer<Services = any> = {
|
|
@@ -3,4 +3,4 @@ export { addAgentScorer, getAgentScorers, getAgentScorersMeta, } from './agent-s
|
|
|
3
3
|
export { gradeRun } from './agent-scorer-grade.js';
|
|
4
4
|
export { enableScoreSnapshots, getScoreSnapshot, } from './agent-scorer-snapshots.js';
|
|
5
5
|
export { wireAgentScorerQueueWorkers } from './agent-scorer-worker.js';
|
|
6
|
-
export type { AgentRunScore, PikkuAgentScorer, ScoreJob, ScorerInput, ScorerJudgeConfig, ScorerLane, ScorerMeta, ScorerOutput, } from './agent-scorer.types.js';
|
|
6
|
+
export type { AgentRunScore, JudgeToolCallDisclosure, PikkuAgentScorer, ScoreJob, ScorerInput, ScorerJudgeConfig, ScorerLane, ScorerMeta, ScorerOutput, } from './agent-scorer.types.js';
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { CoreSingletonServices
|
|
1
|
+
import type { CoreSingletonServices } from '../../types/core.types.js';
|
|
2
|
+
import type { MiddlewareMetadata } from '../../middleware/middleware.types.js';
|
|
2
3
|
import type { CoreChannel, ChannelMessageMeta } from './channel.types.js';
|
|
3
4
|
import { type PikkuSessionService } from '../../services/user-session-service.js';
|
|
4
5
|
export declare const runChannelLifecycleWithMiddleware: ({ channelConfig, meta, lifecycleConfig, lifecycleType, services, channel, data, channelMiddlewareMeta, userSession, }: {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { CoreSingletonServices,
|
|
1
|
+
import type { CoreSingletonServices, PikkuRawWire } from '../../types/core.types.js';
|
|
2
|
+
import type { MiddlewareMetadata } from '../../middleware/middleware.types.js';
|
|
2
3
|
import type { CorePikkuChannelMiddleware } from './channel.types.js';
|
|
3
4
|
export declare const addChannelMiddleware: (tag: string, middleware: CorePikkuChannelMiddleware[], packageName?: string | null) => CorePikkuChannelMiddleware[];
|
|
4
5
|
export declare const clearChannelMiddlewareCache: () => void;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { HTTPFunctionMetaInputTypes, PikkuHTTPRequest, PikkuHTTPResponse } from '../http/http.types.js';
|
|
2
|
-
import type { CorePikkuMiddleware, MiddlewareMetadata } from '../../
|
|
2
|
+
import type { CorePikkuMiddleware, MiddlewareMetadata } from '../../middleware/middleware.types.js';
|
|
3
3
|
export type BinaryData = ArrayBuffer | Uint8Array;
|
|
4
4
|
export type CorePikkuChannelMiddleware<Services = any, Event = unknown> = (services: Services, event: Event, next: (event: Event | Event[] | null) => Promise<void> | void) => Promise<void> | void;
|
|
5
5
|
export type CorePikkuChannelMiddlewareFactory<In = any, Services = any, Event = unknown> = (input: In) => CorePikkuChannelMiddleware<Services, Event>;
|
|
@@ -2,5 +2,5 @@ export { executeCLIViaChannel } from './cli-channel-runner.js';
|
|
|
2
2
|
export { handleRawCLI } from './cli-raw-channel-runner.js';
|
|
3
3
|
export type { RawCLIFrame, RawCLIResult } from './cli-raw-channel-runner.js';
|
|
4
4
|
export { executeRawCLIViaChannel } from './cli-raw-client-runner.js';
|
|
5
|
-
export type { CorePikkuCLIClientRender
|
|
5
|
+
export type { CorePikkuCLIClientRender } from './cli-raw-client-runner.js';
|
|
6
6
|
export type { ApprovalMode } from './cli-approval.js';
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CoreUserSession } from '../../types/core.types.js';
|
|
2
|
+
import type { CorePikkuMiddleware } from '../../middleware/middleware.types.js';
|
|
2
3
|
import type { CoreCLI, CorePikkuCLIRender, CoreCLICommandConfig } from './cli.types.js';
|
|
3
4
|
import type { CoreSingletonServices, CoreServices, CreateWireServices, CreateConfig, CreateSingletonServices } from '../../types/core.types.js';
|
|
4
5
|
import type { PikkuChannel } from '../channel/channel.types.js';
|
|
@@ -303,8 +303,11 @@ export async function executeCLI({ programName, args, createConfig, createSingle
|
|
|
303
303
|
}
|
|
304
304
|
}
|
|
305
305
|
const data = { ...parsed.positionals, ...parsed.options };
|
|
306
|
+
// The command path is passed through so a config factory can tell which
|
|
307
|
+
// command is about to run. Some commands are meant to work outside a
|
|
308
|
+
// project, and cannot be gated behind loading that project's config.
|
|
306
309
|
const config = createConfig
|
|
307
|
-
? await createConfig(new LocalVariablesService(), data)
|
|
310
|
+
? await createConfig(new LocalVariablesService(), data, parsed.commandPath)
|
|
308
311
|
: {};
|
|
309
312
|
const singletonServices = await createSingletonServices(config);
|
|
310
313
|
pikkuState(null, 'package', 'singletonServices', singletonServices);
|
|
@@ -1,15 +1,27 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CoreSingletonServices, CoreUserSession, CoreServices } from '../../types/core.types.js';
|
|
2
|
+
import type { CorePikkuMiddleware, MiddlewareMetadata } from '../../middleware/middleware.types.js';
|
|
2
3
|
import type { CorePikkuFunctionConfig, CorePikkuPermission, CorePikkuFunction, CorePikkuFunctionSessionless } from '../../function/functions.types.js';
|
|
3
4
|
import type { ChannelRemote, PikkuChannel } from '../channel/channel.types.js';
|
|
5
|
+
/**
|
|
6
|
+
* The shape an option's value is parsed into. `'string[]'` splits a single
|
|
7
|
+
* value on commas; `'boolean'` is a flag that consumes the next token only
|
|
8
|
+
* when it is an explicit literal (`true`/`false`/`1`/`0`/`yes`/`no`); every
|
|
9
|
+
* other type consumes one token verbatim, so a value may start with `-`. Left
|
|
10
|
+
* unset — which is the usual case — it is read from the command function's
|
|
11
|
+
* input schema, then from `default`, and otherwise falls back to `'string'`.
|
|
12
|
+
* Declare it only where neither can say: an option belonging to no function
|
|
13
|
+
* input, such as one the config factory reads straight off the CLI data.
|
|
14
|
+
*/
|
|
15
|
+
export type CLIOptionType = 'string' | 'number' | 'boolean' | 'string[]';
|
|
4
16
|
/**
|
|
5
17
|
* CLI option definition
|
|
6
18
|
*/
|
|
7
19
|
export interface CLIOption<T = any> {
|
|
8
20
|
description: string;
|
|
9
21
|
short?: string;
|
|
22
|
+
type?: CLIOptionType;
|
|
10
23
|
default?: T;
|
|
11
24
|
choices?: T[];
|
|
12
|
-
array?: boolean;
|
|
13
25
|
required?: boolean;
|
|
14
26
|
}
|
|
15
27
|
/**
|
|
@@ -149,7 +161,14 @@ export type CoreCLICommandConfig<FuncConfig, PikkuMiddleware extends CorePikkuMi
|
|
|
149
161
|
[K in keyof ExtractFunctionInput<FuncConfig>]?: {
|
|
150
162
|
description?: string;
|
|
151
163
|
short?: string;
|
|
164
|
+
type?: CLIOptionType;
|
|
152
165
|
default?: ExtractFunctionInput<FuncConfig>[K];
|
|
166
|
+
/**
|
|
167
|
+
* The values this option accepts. Rejected by the parser and listed in
|
|
168
|
+
* `--help`, so a flag with a fixed vocabulary says so once rather than
|
|
169
|
+
* repeating itself in its description.
|
|
170
|
+
*/
|
|
171
|
+
choices?: ReadonlyArray<ExtractFunctionInput<FuncConfig>[K]>;
|
|
153
172
|
};
|
|
154
173
|
};
|
|
155
174
|
middleware?: PikkuMiddleware[];
|