@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
|
@@ -1,5 +1,7 @@
|
|
|
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 { CoreSingletonServices } from '../../types/core.types.js';
|
|
4
|
+
import type { PermissionMetadata } from '../../function/function-meta.types.js';
|
|
3
5
|
import type { AIProviderOptions } from '../../services/agent-runner-service.js';
|
|
4
6
|
import type { PikkuChannel } from '../channel/channel.types.js';
|
|
5
7
|
import type { CorePikkuChannelMiddleware } from '../channel/channel.types.js';
|
|
@@ -168,8 +170,8 @@ export interface AgentToolDef extends Partial<ApprovalPolicy> {
|
|
|
168
170
|
*/
|
|
169
171
|
forwardsApproval?: boolean;
|
|
170
172
|
}
|
|
171
|
-
export interface PikkuAgentMiddlewareHooks<State extends Record<string, unknown> = Record<string, unknown>,
|
|
172
|
-
modifyInput?: (services:
|
|
173
|
+
export interface PikkuAgentMiddlewareHooks<State extends Record<string, unknown> = Record<string, unknown>, SingletonServices extends CoreSingletonServices = CoreSingletonServices> {
|
|
174
|
+
modifyInput?: (services: SingletonServices, ctx: {
|
|
173
175
|
messages: AgentMessage[];
|
|
174
176
|
instructions: string;
|
|
175
177
|
/**
|
|
@@ -196,7 +198,7 @@ export interface PikkuAgentMiddlewareHooks<State extends Record<string, unknown>
|
|
|
196
198
|
messages: AgentMessage[];
|
|
197
199
|
instructions: string;
|
|
198
200
|
};
|
|
199
|
-
modifyOutputStream?: (services:
|
|
201
|
+
modifyOutputStream?: (services: SingletonServices, ctx: {
|
|
200
202
|
event: AgentStreamEvent;
|
|
201
203
|
allEvents: readonly AgentStreamEvent[];
|
|
202
204
|
/** Private to this middleware, for this run. Cross-middleware facts go in `shared`. */
|
|
@@ -240,7 +242,7 @@ export interface PikkuAgentMiddlewareHooks<State extends Record<string, unknown>
|
|
|
240
242
|
* and handed to anything that grades the run, and scrubbing the reply alone
|
|
241
243
|
* leaves them untouched.
|
|
242
244
|
*/
|
|
243
|
-
modifyOutput?: (services:
|
|
245
|
+
modifyOutput?: (services: SingletonServices, ctx: {
|
|
244
246
|
text: string;
|
|
245
247
|
messages: AgentMessage[];
|
|
246
248
|
usage: {
|
|
@@ -257,7 +259,7 @@ export interface PikkuAgentMiddlewareHooks<State extends Record<string, unknown>
|
|
|
257
259
|
messages: AgentMessage[];
|
|
258
260
|
toolCalls?: NonNullable<AgentStep['toolCalls']>;
|
|
259
261
|
};
|
|
260
|
-
beforeToolCall?: (services:
|
|
262
|
+
beforeToolCall?: (services: SingletonServices, ctx: {
|
|
261
263
|
toolName: string;
|
|
262
264
|
toolCallId: string;
|
|
263
265
|
args: Record<string, unknown>;
|
|
@@ -266,7 +268,7 @@ export interface PikkuAgentMiddlewareHooks<State extends Record<string, unknown>
|
|
|
266
268
|
} | void> | {
|
|
267
269
|
args: Record<string, unknown>;
|
|
268
270
|
} | void;
|
|
269
|
-
afterToolCall?: (services:
|
|
271
|
+
afterToolCall?: (services: SingletonServices, ctx: {
|
|
270
272
|
toolName: string;
|
|
271
273
|
toolCallId: string;
|
|
272
274
|
args: Record<string, unknown>;
|
|
@@ -277,7 +279,7 @@ export interface PikkuAgentMiddlewareHooks<State extends Record<string, unknown>
|
|
|
277
279
|
} | void> | {
|
|
278
280
|
result: unknown;
|
|
279
281
|
} | void;
|
|
280
|
-
afterStep?: (services:
|
|
282
|
+
afterStep?: (services: SingletonServices, ctx: {
|
|
281
283
|
stepNumber: number;
|
|
282
284
|
text: string;
|
|
283
285
|
toolCalls: {
|
|
@@ -298,7 +300,7 @@ export interface PikkuAgentMiddlewareHooks<State extends Record<string, unknown>
|
|
|
298
300
|
};
|
|
299
301
|
finishReason: string;
|
|
300
302
|
}) => Promise<void> | void;
|
|
301
|
-
onError?: (services:
|
|
303
|
+
onError?: (services: SingletonServices, ctx: {
|
|
302
304
|
error: Error;
|
|
303
305
|
stepNumber: number;
|
|
304
306
|
messages: AgentMessage[];
|
|
@@ -389,7 +391,7 @@ export type CoreAgent<PikkuPermission = CorePikkuPermission<any, any>, PikkuMidd
|
|
|
389
391
|
* which OR together, a scope can only narrow access.
|
|
390
392
|
*
|
|
391
393
|
* Narrowed to the generated `ScopeId` union in a project's own
|
|
392
|
-
*
|
|
394
|
+
* `#pikku/scopes`, so an undeclared scope is a compile error.
|
|
393
395
|
*/
|
|
394
396
|
scopes?: Scope[];
|
|
395
397
|
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[];
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { pikkuState } from '../../pikku-state.js';
|
|
1
2
|
/** "from-plan" → "fromPlan"; the parser accepts either spelling. */
|
|
2
3
|
function toCamelCase(str) {
|
|
3
4
|
return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
|
@@ -57,6 +58,114 @@ function warnUnknownOption(typed, availableOptions, result) {
|
|
|
57
58
|
* one error per character.
|
|
58
59
|
*/
|
|
59
60
|
const MAX_SHORT_FLAG_CLUSTER = 64;
|
|
61
|
+
function resolveOptionType(optionDef) {
|
|
62
|
+
if (optionDef.type) {
|
|
63
|
+
return optionDef.type;
|
|
64
|
+
}
|
|
65
|
+
if (typeof optionDef.default === 'boolean') {
|
|
66
|
+
return 'boolean';
|
|
67
|
+
}
|
|
68
|
+
if (typeof optionDef.default === 'number') {
|
|
69
|
+
return 'number';
|
|
70
|
+
}
|
|
71
|
+
return 'string';
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* A command's options are keys of its function's input, so the input schema
|
|
75
|
+
* already records what each one is. Reading it here means a declaration never
|
|
76
|
+
* has to repeat — or contradict — the type the function is validated against.
|
|
77
|
+
* An explicit `type` still wins, and an option the schema says nothing about
|
|
78
|
+
* (a program-level option belonging to no function input) is left untouched.
|
|
79
|
+
*/
|
|
80
|
+
function applySchemaOptionTypes(options, commandMeta) {
|
|
81
|
+
const properties = commandInputProperties(commandMeta);
|
|
82
|
+
if (!properties) {
|
|
83
|
+
return options;
|
|
84
|
+
}
|
|
85
|
+
const typed = { ...options };
|
|
86
|
+
for (const [name, option] of Object.entries(typed)) {
|
|
87
|
+
if (option.type) {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
const schemaType = optionTypeFromSchema(properties[name]);
|
|
91
|
+
if (schemaType) {
|
|
92
|
+
typed[name] = { ...option, type: schemaType };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return typed;
|
|
96
|
+
}
|
|
97
|
+
function commandInputProperties(commandMeta) {
|
|
98
|
+
const funcMeta = pikkuState(null, 'function', 'meta')[commandMeta.pikkuFuncId];
|
|
99
|
+
const schemaName = funcMeta?.inputSchemaName;
|
|
100
|
+
if (!schemaName) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
const schema = pikkuState(funcMeta.packageName ?? null, 'misc', 'schemas').get(schemaName);
|
|
104
|
+
const properties = schema?.properties;
|
|
105
|
+
return properties && typeof properties === 'object' ? properties : null;
|
|
106
|
+
}
|
|
107
|
+
function optionTypeFromSchema(property) {
|
|
108
|
+
if (!property || typeof property !== 'object') {
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
// An optional field can arrive as a union with null, which is not a shape the
|
|
112
|
+
// parser can read a value into.
|
|
113
|
+
const declared = Array.isArray(property.type)
|
|
114
|
+
? property.type.filter((entry) => entry !== 'null')[0]
|
|
115
|
+
: property.type;
|
|
116
|
+
switch (declared) {
|
|
117
|
+
case 'array':
|
|
118
|
+
return 'string[]';
|
|
119
|
+
case 'number':
|
|
120
|
+
case 'integer':
|
|
121
|
+
return 'number';
|
|
122
|
+
case 'boolean':
|
|
123
|
+
return 'boolean';
|
|
124
|
+
case 'string':
|
|
125
|
+
return 'string';
|
|
126
|
+
default:
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const BOOLEAN_LITERALS = new Map([
|
|
131
|
+
['true', true],
|
|
132
|
+
['false', false],
|
|
133
|
+
['1', true],
|
|
134
|
+
['0', false],
|
|
135
|
+
['yes', true],
|
|
136
|
+
['no', false],
|
|
137
|
+
]);
|
|
138
|
+
/**
|
|
139
|
+
* A boolean option is a flag, but `--watch false` is how scripts and CI turn a
|
|
140
|
+
* default-on flag off, so an explicit literal directly after the flag is taken
|
|
141
|
+
* as its value rather than left behind as a positional.
|
|
142
|
+
*/
|
|
143
|
+
function readBooleanLiteral(raw) {
|
|
144
|
+
if (raw === undefined) {
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
return BOOLEAN_LITERALS.get(raw.toLowerCase());
|
|
148
|
+
}
|
|
149
|
+
function readOptionValue(raw, optionDef) {
|
|
150
|
+
if (resolveOptionType(optionDef) !== 'string[]') {
|
|
151
|
+
return parseOptionValue(raw, optionDef);
|
|
152
|
+
}
|
|
153
|
+
return raw
|
|
154
|
+
.split(',')
|
|
155
|
+
.map((item) => item.trim())
|
|
156
|
+
.filter((item) => item.length > 0)
|
|
157
|
+
.map((item) => parseOptionValue(item, optionDef));
|
|
158
|
+
}
|
|
159
|
+
/** A repeated array option accumulates rather than replacing. */
|
|
160
|
+
function assignOptionValue(optionArgs, key, value) {
|
|
161
|
+
const existing = optionArgs[key];
|
|
162
|
+
if (Array.isArray(existing) && Array.isArray(value)) {
|
|
163
|
+
optionArgs[key] = [...existing, ...value];
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
optionArgs[key] = value;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
60
169
|
export function parseCLIArguments(args, programName, allMeta) {
|
|
61
170
|
const result = {
|
|
62
171
|
program: programName,
|
|
@@ -131,7 +240,7 @@ export function parseCLIArguments(args, programName, allMeta) {
|
|
|
131
240
|
result.errors.push(`Missing subcommand: ${result.commandPath.join(' ')}`);
|
|
132
241
|
return result;
|
|
133
242
|
}
|
|
134
|
-
const availableOptions = collectAvailableOptions(meta, result.commandPath);
|
|
243
|
+
const availableOptions = applySchemaOptionTypes(collectAvailableOptions(meta, result.commandPath), commandMeta);
|
|
135
244
|
const positionalArgs = [];
|
|
136
245
|
const optionArgs = {};
|
|
137
246
|
while (currentIndex < args.length) {
|
|
@@ -142,8 +251,9 @@ export function parseCLIArguments(args, programName, allMeta) {
|
|
|
142
251
|
: undefined;
|
|
143
252
|
const equalIndex = arg.indexOf('=');
|
|
144
253
|
if (negatedKey &&
|
|
145
|
-
|
|
146
|
-
|
|
254
|
+
availableOptions[negatedKey] &&
|
|
255
|
+
resolveOptionType(availableOptions[negatedKey]) === 'boolean') {
|
|
256
|
+
// Requiring a boolean type keeps a literal `--no-something` option
|
|
147
257
|
// name parsing as itself rather than as a negation.
|
|
148
258
|
optionArgs[negatedKey] = false;
|
|
149
259
|
}
|
|
@@ -154,7 +264,12 @@ export function parseCLIArguments(args, programName, allMeta) {
|
|
|
154
264
|
warnUnknownOption(arg.slice(2, equalIndex), availableOptions, result);
|
|
155
265
|
}
|
|
156
266
|
const value = arg.slice(equalIndex + 1);
|
|
157
|
-
|
|
267
|
+
if (optionDef) {
|
|
268
|
+
assignOptionValue(optionArgs, key, readOptionValue(value, optionDef));
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
optionArgs[key] = parseOptionValue(value, optionDef);
|
|
272
|
+
}
|
|
158
273
|
}
|
|
159
274
|
else {
|
|
160
275
|
const key = toCamelCase(arg.slice(2));
|
|
@@ -162,21 +277,31 @@ export function parseCLIArguments(args, programName, allMeta) {
|
|
|
162
277
|
if (!optionDef) {
|
|
163
278
|
warnUnknownOption(arg.slice(2), availableOptions, result);
|
|
164
279
|
}
|
|
165
|
-
if (optionDef
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
!args[currentIndex].startsWith('-')) {
|
|
170
|
-
values.push(parseOptionValue(args[currentIndex], optionDef));
|
|
280
|
+
if (!optionDef) {
|
|
281
|
+
// With no spec there is nothing to consult, so the lookahead
|
|
282
|
+
// heuristic is all that is left.
|
|
283
|
+
if (currentIndex + 1 < args.length &&
|
|
284
|
+
!args[currentIndex + 1].startsWith('-')) {
|
|
171
285
|
currentIndex++;
|
|
286
|
+
optionArgs[key] = parseOptionValue(args[currentIndex], optionDef);
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
optionArgs[key] = true;
|
|
172
290
|
}
|
|
173
|
-
currentIndex--; // Back up one since we'll increment at loop end
|
|
174
|
-
optionArgs[key] = values;
|
|
175
291
|
}
|
|
176
|
-
else if (
|
|
177
|
-
|
|
292
|
+
else if (resolveOptionType(optionDef) === 'boolean') {
|
|
293
|
+
const literal = readBooleanLiteral(args[currentIndex + 1]);
|
|
294
|
+
if (literal === undefined) {
|
|
295
|
+
optionArgs[key] = true;
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
currentIndex++;
|
|
299
|
+
optionArgs[key] = literal;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
else if (currentIndex + 1 < args.length) {
|
|
178
303
|
currentIndex++;
|
|
179
|
-
optionArgs
|
|
304
|
+
assignOptionValue(optionArgs, key, readOptionValue(args[currentIndex], optionDef));
|
|
180
305
|
}
|
|
181
306
|
else {
|
|
182
307
|
optionArgs[key] = true;
|
|
@@ -193,12 +318,21 @@ export function parseCLIArguments(args, programName, allMeta) {
|
|
|
193
318
|
const shortFlag = arg[i];
|
|
194
319
|
const longOption = findLongOption(shortFlag, availableOptions);
|
|
195
320
|
if (longOption) {
|
|
321
|
+
const optionDef = availableOptions[longOption];
|
|
196
322
|
// Only the last flag in a cluster can take a value.
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
323
|
+
const isLast = i === arg.length - 1;
|
|
324
|
+
const literal = isLast && resolveOptionType(optionDef) === 'boolean'
|
|
325
|
+
? readBooleanLiteral(args[currentIndex + 1])
|
|
326
|
+
: undefined;
|
|
327
|
+
if (literal !== undefined) {
|
|
328
|
+
currentIndex++;
|
|
329
|
+
optionArgs[longOption] = literal;
|
|
330
|
+
}
|
|
331
|
+
else if (isLast &&
|
|
332
|
+
resolveOptionType(optionDef) !== 'boolean' &&
|
|
333
|
+
currentIndex + 1 < args.length) {
|
|
200
334
|
currentIndex++;
|
|
201
|
-
optionArgs
|
|
335
|
+
assignOptionValue(optionArgs, longOption, readOptionValue(args[currentIndex], optionDef));
|
|
202
336
|
}
|
|
203
337
|
else {
|
|
204
338
|
optionArgs[longOption] = true;
|
|
@@ -272,11 +406,11 @@ function parseOptionValue(value, optionDef) {
|
|
|
272
406
|
return parseFloat(value);
|
|
273
407
|
return value;
|
|
274
408
|
}
|
|
275
|
-
const
|
|
276
|
-
if (
|
|
277
|
-
return value
|
|
409
|
+
const optionType = resolveOptionType(optionDef);
|
|
410
|
+
if (optionType === 'boolean') {
|
|
411
|
+
return readBooleanLiteral(value) ?? false;
|
|
278
412
|
}
|
|
279
|
-
if (
|
|
413
|
+
if (optionType === 'number') {
|
|
280
414
|
return parseFloat(value);
|
|
281
415
|
}
|
|
282
416
|
if (optionDef.choices && !optionDef.choices.includes(value)) {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { CommonWireMeta,
|
|
1
|
+
import type { CommonWireMeta, CoreSingletonServices } from '../../types/core.types.js';
|
|
2
|
+
import type { CorePikkuMiddleware, CorePikkuMiddlewareGroup } from '../../middleware/middleware.types.js';
|
|
2
3
|
import type { CorePikkuFunctionConfig } from '../../function/functions.types.js';
|
|
3
4
|
import type { PikkuHTTPRequest } from '../http/http.types.js';
|
|
4
5
|
export interface GatewayAttachment {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { CoreHTTPFunctionWiring, RunHTTPWiringOptions, PikkuHTTP, PikkuHTTPRequest, PikkuHTTPResponse } from './http.types.js';
|
|
2
2
|
import type { CorePikkuFunction, CorePikkuFunctionSessionless, CorePikkuPermission } from '../../function/functions.types.js';
|
|
3
|
-
import type { CorePikkuMiddleware, CorePikkuMiddlewareGroup } from '../../
|
|
3
|
+
import type { CorePikkuMiddleware, CorePikkuMiddlewareGroup } from '../../middleware/middleware.types.js';
|
|
4
4
|
import { PikkuFetchHTTPResponse } from './pikku-fetch-http-response.js';
|
|
5
5
|
export declare const addHTTPMiddleware: <PikkuMiddleware extends CorePikkuMiddleware>(pattern: string, middleware: CorePikkuMiddlewareGroup, packageName?: string | null) => CorePikkuMiddlewareGroup;
|
|
6
6
|
export declare const wireHTTP: <In, Out, Route extends string, PikkuFunction extends CorePikkuFunction<In, Out> = CorePikkuFunction<In, Out>, PikkuFunctionSessionless extends CorePikkuFunctionSessionless<In, Out> = CorePikkuFunctionSessionless<In, Out>, PikkuPermissionGroup extends CorePikkuPermission<In> = CorePikkuPermission<In>, PikkuMiddleware extends CorePikkuMiddleware = CorePikkuMiddleware>(httpWiring: CoreHTTPFunctionWiring<In, Out, Route, PikkuFunction, PikkuFunctionSessionless, PikkuPermissionGroup, PikkuMiddleware>) => void;
|
|
@@ -42,7 +42,7 @@ export const wireHTTP = (httpWiring) => {
|
|
|
42
42
|
return;
|
|
43
43
|
}
|
|
44
44
|
if (httpWiring.func) {
|
|
45
|
-
addFunction(routeMeta.pikkuFuncId, httpWiring.func);
|
|
45
|
+
addFunction(routeMeta.pikkuFuncId, httpWiring.func, routeMeta.packageName ?? null);
|
|
46
46
|
}
|
|
47
47
|
const routes = pikkuState(null, 'http', 'routes');
|
|
48
48
|
if (!routes.has(httpWiring.method)) {
|