@pikku/core 0.12.139 → 0.12.142
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 +47 -0
- package/dist/errors/errors.d.ts +1 -1
- package/dist/errors/errors.js +1 -1
- package/dist/function/function-meta.types.d.ts +6 -6
- package/dist/function/functions.types.d.ts +2 -2
- package/dist/lifecycle.d.ts +6 -0
- package/dist/lifecycle.js +58 -0
- package/dist/services/audit-service.d.ts +4 -4
- package/dist/services/feature-flag-service.d.ts +3 -3
- package/dist/services/{http-personas.d.ts → http-virtual-users.d.ts} +25 -47
- package/dist/services/{http-personas.js → http-virtual-users.js} +29 -53
- package/dist/services/index.d.ts +2 -2
- package/dist/services/index.js +1 -1
- package/dist/services/meta-service.d.ts +6 -6
- package/dist/services/meta-service.js +8 -8
- package/dist/{wirings/workflow → services}/scenario-cookie-jar.d.ts +2 -0
- package/dist/{wirings/workflow → services}/scenario-cookie-jar.js +18 -14
- package/dist/services/scoped-secret-service.d.ts +1 -0
- package/dist/services/scoped-secret-service.js +3 -0
- package/dist/services/secret-service.d.ts +6 -0
- package/dist/services/system-role-guard.d.ts +1 -1
- package/dist/services/typed-secret-service.d.ts +1 -0
- package/dist/services/typed-secret-service.js +7 -0
- package/dist/services/virtual-user-sign-in.d.ts +52 -0
- package/dist/services/virtual-user-sign-in.js +80 -0
- package/dist/services/virtual-user-statement.d.ts +31 -0
- package/dist/services/virtual-user-statement.js +24 -0
- package/dist/services/{personas-service.d.ts → virtual-users-service.d.ts} +25 -23
- package/dist/services/{personas-service.js → virtual-users-service.js} +3 -3
- package/dist/testing/service-tests/secret-service-tests.js +9 -0
- package/dist/types/core.types.d.ts +11 -11
- package/dist/utils.d.ts +2 -5
- package/dist/utils.js +1 -38
- package/dist/wirings/cli/cli-runner.js +24 -9
- package/dist/wirings/http/http-runner.js +4 -0
- package/dist/wirings/http/http.types.d.ts +1 -0
- package/dist/wirings/http/pikku-fetch-http-response.d.ts +1 -0
- package/dist/wirings/http/pikku-fetch-http-response.js +12 -0
- package/dist/wirings/http/web-request.js +7 -0
- package/dist/wirings/role/define-system-role.d.ts +1 -1
- package/dist/wirings/role/define-system-role.js +1 -1
- package/dist/wirings/{actor-flow/actor-flow.types.d.ts → virtual-user/conversation/conversation.types.d.ts} +5 -5
- package/dist/wirings/virtual-user/conversation/index.d.ts +2 -0
- package/dist/wirings/virtual-user/conversation/run-conversation.d.ts +36 -0
- package/dist/wirings/{actor-flow → virtual-user/conversation}/run-conversation.js +30 -30
- package/dist/wirings/virtual-user/define-virtual-users.d.ts +32 -0
- package/dist/wirings/{persona/define-personas.js → virtual-user/define-virtual-users.js} +9 -9
- package/dist/wirings/virtual-user/index.d.ts +30 -7
- package/dist/wirings/virtual-user/index.js +23 -4
- package/dist/wirings/virtual-user/prepare-virtual-user-run.d.ts +8 -8
- package/dist/wirings/virtual-user/prepare-virtual-user-run.js +9 -9
- package/dist/wirings/virtual-user/run-virtual-user.d.ts +6 -6
- package/dist/wirings/virtual-user/run-virtual-user.js +10 -10
- package/dist/wirings/{persona/validate-personas.d.ts → virtual-user/validate-virtual-users.d.ts} +11 -11
- package/dist/wirings/{persona/validate-personas.js → virtual-user/validate-virtual-users.js} +24 -24
- package/dist/wirings/virtual-user/virtual-user-agents.d.ts +7 -7
- package/dist/wirings/virtual-user/virtual-user-agents.js +2 -2
- package/dist/wirings/{persona/persona-app-scopes.d.ts → virtual-user/virtual-user-app-scopes.d.ts} +10 -10
- package/dist/wirings/{persona/persona-app-scopes.js → virtual-user/virtual-user-app-scopes.js} +12 -12
- package/dist/wirings/virtual-user/virtual-user-catalogue.d.ts +3 -3
- package/dist/wirings/virtual-user/virtual-user-catalogue.js +2 -2
- package/dist/wirings/{persona/persona.types.d.ts → virtual-user/virtual-user-declaration.types.d.ts} +24 -24
- package/dist/wirings/virtual-user/virtual-user-derive.js +13 -7
- package/dist/wirings/virtual-user/virtual-user-dispositions.d.ts +1 -1
- package/dist/wirings/{persona/persona-email.d.ts → virtual-user/virtual-user-email.d.ts} +11 -11
- package/dist/wirings/{persona/persona-email.js → virtual-user/virtual-user-email.js} +19 -19
- package/dist/wirings/{persona/persona-environments.d.ts → virtual-user/virtual-user-environments.d.ts} +10 -10
- package/dist/wirings/{persona/persona-environments.js → virtual-user/virtual-user-environments.js} +21 -21
- package/dist/wirings/virtual-user/virtual-user-intents.d.ts +3 -3
- package/dist/wirings/virtual-user/virtual-user-intents.js +3 -3
- package/dist/wirings/{persona/persona-mailbox.d.ts → virtual-user/virtual-user-mailbox.d.ts} +4 -4
- package/dist/wirings/virtual-user/virtual-user-run-store.d.ts +4 -4
- package/dist/wirings/virtual-user/virtual-user-scaffold.d.ts +42 -61
- package/dist/wirings/virtual-user/virtual-user-scaffold.js +69 -117
- package/dist/wirings/virtual-user/virtual-user-schedule-store.d.ts +15 -15
- package/dist/wirings/virtual-user/virtual-user-schedule.d.ts +6 -6
- package/dist/wirings/virtual-user/virtual-user-schedule.js +11 -11
- package/dist/wirings/virtual-user/virtual-user-target.d.ts +6 -6
- package/dist/wirings/virtual-user/virtual-user-target.js +5 -5
- package/dist/wirings/virtual-user/virtual-user.types.d.ts +11 -11
- package/dist/wirings/virtual-user/virtual-user.types.js +1 -1
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +9 -9
- package/dist/wirings/workflow/pikku-scenario-service.d.ts +28 -28
- package/dist/wirings/workflow/pikku-scenario-service.js +77 -77
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +2 -2
- package/dist/wirings/workflow/pikku-workflow-service.js +4 -4
- package/dist/wirings/workflow/scenario-prose.d.ts +8 -8
- package/dist/wirings/workflow/scenario-prose.js +12 -8
- package/dist/wirings/workflow/scenario-run.types.d.ts +13 -13
- package/dist/wirings/workflow/scenario-step.types.d.ts +23 -23
- package/dist/wirings/workflow/workflow.types.d.ts +2 -2
- package/knowledge/decisions/index.md +0 -2
- package/knowledge/decisions/internals/a-credential-name-declared-twice-must-agree-on-schema-and-type.md +29 -0
- package/knowledge/decisions/internals/a-grant-can-name-a-scope-declared-without-its-addon.md +29 -0
- package/knowledge/decisions/internals/a-scheduled-task-writes-its-caller-session-before-it-runs.md +22 -0
- package/knowledge/decisions/internals/a-secret-set-in-memory-shadows-the-variable-of-the-same-name.md +28 -0
- package/knowledge/decisions/internals/a-virtual-user-acts-through-invokeraw-so-a-refusal-is-data.md +32 -0
- package/knowledge/decisions/internals/a-virtual-user-cadence-is-a-row-not-a-timer.md +12 -12
- package/knowledge/decisions/internals/a-virtual-user-converse-signs-in-before-its-first-turn.md +24 -0
- package/knowledge/decisions/internals/a-virtual-user-email-is-computed-with-the-run-id-as-a-sub-address.md +34 -0
- package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-but-it-needs-a-trigger.md +2 -2
- package/knowledge/decisions/internals/an-agent-is-offered-under-its-registry-key-and-only-within-the-virtual-users-scopes.md +27 -0
- package/knowledge/decisions/internals/an-oauth2-credential-implies-an-optional-app-secret.md +26 -0
- package/knowledge/decisions/internals/analytics-identity-resolvers-run-in-declared-order.md +22 -0
- package/knowledge/decisions/internals/feature-flag-declarations-refuse-an-empty-anyof-and-conflicting-scopes.md +22 -0
- package/knowledge/decisions/internals/feature-flags-fail-open-and-never-enforce-access.md +28 -0
- package/knowledge/decisions/internals/flag-sync-rewrites-only-the-declared-text.md +24 -0
- package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +3 -3
- package/knowledge/decisions/internals/index.md +46 -31
- package/knowledge/decisions/internals/one-project-shape-check-two-validators.md +10 -10
- package/knowledge/decisions/internals/role-names-cannot-contain-the-scope-separator.md +30 -0
- package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +23 -19
- package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +2 -2
- package/knowledge/decisions/internals/scenarios-live-in-files-named-for-them.md +12 -12
- package/knowledge/decisions/internals/the-core-scope-validator-refuses-separator-wildcard-and-empty-segments.md +22 -0
- package/knowledge/decisions/internals/the-pikku-user-id-resolves-in-a-fixed-order.md +24 -0
- package/knowledge/decisions/internals/{the-actor-prompt-says-json-because-of-json-object-mode.md → the-virtual-user-prompt-says-json-because-of-json-object-mode.md} +4 -4
- package/knowledge/decisions/internals/{the-persona-runtime-is-exported-from-the-persona-entry-point.md → the-virtual-user-runtime-is-exported-from-the-virtual-user-entry-point.md} +8 -8
- package/knowledge/decisions/internals/validate-checks-virtual-users-through-a-shared-module.md +43 -0
- package/knowledge/decisions/internals/{actor-flow-drives-the-target-through-a-transport-seam.md → virtual-user-conversation-drives-the-target-through-a-transport-seam.md} +6 -6
- package/knowledge/decisions/internals/virtual-user-conversation-verdicts-are-llm-self-evaluations.md +25 -0
- package/knowledge/decisions/internals/virtual-user-conversations-seed-a-hidden-kickoff-message.md +23 -0
- package/knowledge/decisions/internals/virtual-users-are-declared-in-one-definevirtualusers-call-per-codebase.md +30 -0
- package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +5 -5
- package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +2 -2
- package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +4 -4
- package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +1 -1
- package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +2 -2
- package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +1 -1
- package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +1 -1
- package/knowledge/decisions/security/a-bearer-token-checked-against-a-secret-reads-it-per-request.md +26 -0
- package/knowledge/decisions/security/a-call-without-a-session-raises-missing-session-not-forbidden.md +20 -0
- package/knowledge/decisions/security/a-caller-cookie-wins-over-the-jar-for-the-same-name.md +23 -0
- package/knowledge/decisions/security/a-channel-lifecycle-acts-as-the-socket-upgrade-session.md +16 -0
- package/knowledge/decisions/security/a-channel-requires-a-session-unless-it-says-auth-false.md +26 -0
- package/knowledge/decisions/security/a-credential-read-path-follows-its-declared-type-not-absence.md +32 -0
- package/knowledge/decisions/security/a-credential-type-is-a-literal-the-inspector-checks-at-declaration.md +27 -0
- package/knowledge/decisions/security/a-first-party-cookie-is-written-only-after-its-purposes-consent.md +33 -0
- package/knowledge/decisions/security/a-readonly-session-reaches-only-readonly-functions.md +25 -0
- package/knowledge/decisions/security/a-scaffold-flag-says-a-surface-exists-not-who-may-call-it.md +10 -5
- package/knowledge/decisions/security/a-scheduled-virtual-user-run-needs-no-admin-at-run-time.md +27 -0
- package/knowledge/decisions/security/a-scoped-credential-view-is-limited-to-declared-names.md +26 -0
- package/knowledge/decisions/security/a-scoped-secret-view-reads-only-declared-keys-and-never-writes.md +25 -0
- package/knowledge/decisions/security/a-secret-is-sent-only-to-the-hosts-it-declares.md +29 -0
- package/knowledge/decisions/security/a-step-can-name-an-identity-no-virtual-user-holds-through-per-call-headers.md +25 -0
- package/knowledge/decisions/security/a-stopped-run-by-id-skips-the-ownership-check.md +24 -0
- package/knowledge/decisions/security/a-vault-secret-redacts-on-serialization-and-throws-on-coercion.md +29 -0
- package/knowledge/decisions/security/a-virtual-user-catalogue-entry-is-filtered-by-scope-and-approval-is-denied-by-default.md +30 -0
- package/knowledge/decisions/security/a-virtual-user-environment-fails-closed.md +38 -0
- package/knowledge/decisions/security/a-virtual-user-never-runs-against-production.md +23 -0
- package/knowledge/decisions/security/a-virtual-user-reads-its-roles-from-the-apps-own-rpc-before-better-auth.md +27 -0
- package/knowledge/decisions/security/a-virtual-user-run-treats-an-unresolved-environment-as-production.md +41 -0
- package/knowledge/decisions/security/a-virtual-user-scopes-are-expanded-from-its-roles-once-at-run-preparation.md +25 -0
- package/knowledge/decisions/security/a-virtual-user-whose-roles-drift-from-the-declaration-refuses-to-run.md +32 -0
- package/knowledge/decisions/security/addon-screen-scopes-hide-and-do-not-enforce.md +20 -0
- package/knowledge/decisions/security/an-addon-header-can-only-narrow-the-session.md +26 -0
- package/knowledge/decisions/security/an-addon-instance-reads-only-the-secrets-and-credentials-it-is-named.md +33 -0
- package/knowledge/decisions/security/an-addon-may-reach-only-itself-and-the-addons-it-uses.md +16 -0
- package/knowledge/decisions/security/an-api-key-is-jwt-decoded-into-the-session.md +26 -0
- package/knowledge/decisions/security/an-external-virtual-user-caller-presents-one-signed-statement.md +38 -0
- package/knowledge/decisions/security/an-inbound-webhook-source-dispatches-only-verified-requests.md +31 -0
- package/knowledge/decisions/security/an-mcp-call-with-no-http-request-stays-anonymous.md +18 -0
- package/knowledge/decisions/security/an-omitted-user-id-addresses-the-platform-credential.md +32 -0
- package/knowledge/decisions/security/analytics-identity-is-stamped-from-the-session-not-the-event.md +24 -0
- package/knowledge/decisions/security/app-access-is-a-scope-tree-synthesised-from-virtual-users.md +26 -0
- package/knowledge/decisions/security/approval-policy-decides-who-answers-a-tool-call.md +27 -0
- package/knowledge/decisions/security/auth-false-on-a-session-function-warns-and-still-requires-one.md +25 -0
- package/knowledge/decisions/security/bearer-token-hashes-are-unpeppered-sha256.md +18 -0
- package/knowledge/decisions/security/consent-is-read-from-a-cookie-and-a-recognised-denial-counts-as-refusal.md +29 -0
- package/knowledge/decisions/security/cors-defaults-to-any-origin-and-refuses-the-wildcard-with-credentials.md +22 -0
- package/knowledge/decisions/security/credential-backends-share-one-conformance-suite-for-per-user-isolation.md +29 -0
- package/knowledge/decisions/security/each-stage-has-one-virtual-user-key-pair.md +27 -0
- package/knowledge/decisions/security/hmac-verification-fails-closed-on-empty-inputs.md +25 -0
- package/knowledge/decisions/security/index.md +88 -24
- package/knowledge/decisions/security/local-content-refuses-private-buckets-under-the-public-segment.md +21 -0
- package/knowledge/decisions/security/mail-is-allowlisted-before-a-virtual-user-run-sees-it.md +38 -0
- package/knowledge/decisions/security/mcp-resources-tools-and-prompts-take-sessionless-functions.md +18 -0
- package/knowledge/decisions/security/origin-locked-routes-match-the-origin-exactly.md +22 -0
- package/knowledge/decisions/security/oss-auth-works-without-pikku-studio-cloud.md +26 -0
- package/knowledge/decisions/security/outbound-webhooks-use-an-allowlist-when-configured.md +24 -0
- package/knowledge/decisions/security/pikku-carries-virtual-user-scopes-as-data-and-the-app-grants-them.md +35 -0
- package/knowledge/decisions/security/scoped-content-access-is-a-root-folder-with-longest-prefix-grants.md +31 -0
- package/knowledge/decisions/security/services-without-secrets-get-a-throwing-secrets-accessor.md +22 -0
- package/knowledge/decisions/security/shared-guards-refuse-to-mutate-or-shadow-a-system-role.md +34 -0
- package/knowledge/decisions/security/signed-uploads-are-verified-by-the-same-check-as-signed-reads.md +26 -0
- package/knowledge/decisions/security/system-role-scopes-must-be-declared-with-define-scope.md +24 -0
- package/knowledge/decisions/security/system-roles-are-additive-and-immutable.md +16 -0
- package/knowledge/decisions/security/the-channel-rpc-does-not-send-the-callers-session.md +21 -0
- package/knowledge/decisions/security/the-remote-jobs-inbox-fails-closed-without-a-secret.md +24 -0
- package/knowledge/decisions/security/the-remote-rpc-gate-fails-closed-and-binds-the-token-to-its-function.md +34 -0
- package/knowledge/decisions/security/the-workflow-status-stream-rechecks-ownership-on-every-poll.md +16 -0
- package/knowledge/decisions/security/two-credentials-on-one-key-must-share-a-read-mode.md +29 -0
- package/knowledge/decisions/security/verified-bearer-claims-are-pass-through-data-that-core-never-fills.md +23 -0
- package/knowledge/decisions/security/virtual-user-catalogue-excludes-the-machinery-that-runs-virtual-users.md +25 -0
- package/knowledge/decisions/security/{actor-flow-missing-approval-decisions-default-to-denied.md → virtual-user-conversation-missing-approval-decisions-default-to-denied.md} +7 -7
- package/knowledge/decisions/security/virtual-user-run-records-are-gated-behind-a-read-scope.md +18 -0
- package/knowledge/decisions/security/virtual-user-sign-in-does-not-exist-in-production.md +25 -0
- package/knowledge/decisions/security/virtual-user-sign-in-has-one-door.md +42 -0
- package/knowledge/decisions/security/{actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md → virtual-user-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md} +10 -8
- package/knowledge/decisions/security/virtual-user-sign-in-only-works-for-virtual-user-flagged-users.md +29 -0
- package/knowledge/decisions/security/workflow-helper-functions-are-sessionless-by-declaration.md +18 -0
- package/knowledge/decisions/security/{workflow-scenario-sessions-are-isolated-per-actor-and-per-scenario.md → workflow-scenario-sessions-are-isolated-per-virtual-user-and-per-scenario.md} +6 -6
- package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +5 -5
- package/knowledge/decisions/security/{workflow-actor-steps-always-use-the-real-transport.md → workflow-virtual-user-steps-always-use-the-real-transport.md} +11 -11
- package/knowledge/decisions/security/writing-a-virtual-user-schedule-is-gated-by-its-own-scope.md +18 -0
- package/knowledge/index.md +0 -2
- package/knowledge/questions/a-bearer-jwt-with-no-identity-becomes-a-session.md +24 -0
- package/knowledge/questions/dev-quick-login-as-impersonation.md +25 -0
- package/knowledge/questions/does-a-delayed-rpc-run-as-the-session-it-was-scheduled-with.md +26 -0
- package/knowledge/questions/does-a-user-id-with-a-colon-read-another-users-credentials.md +27 -0
- package/knowledge/questions/does-a-wirecli-command-need-a-session-by-default.md +26 -0
- package/knowledge/questions/does-an-adversarial-in-scope-success-count-as-a-finding.md +26 -0
- package/knowledge/questions/does-approve-step-need-the-run-owners-session-or-the-gates-approvers.md +34 -0
- package/knowledge/questions/does-cors-origin-true-reflect-any-origin-with-credentials.md +20 -0
- package/knowledge/questions/does-skip-user-session-do-anything-on-a-channel.md +24 -0
- package/knowledge/questions/does-the-store-session-match-the-other-two.md +19 -0
- package/knowledge/questions/index.md +25 -2
- package/knowledge/questions/is-the-agent-score-worker-reachable-without-a-session.md +21 -0
- package/knowledge/questions/live-scheduled-tests-may-write.md +19 -0
- package/knowledge/questions/provision-virtual-users-has-no-caller-in-this-repo.md +23 -0
- package/knowledge/questions/remote-secret-refuses-requests-without-a-remote-token-on-every-path.md +32 -0
- package/knowledge/questions/should-a-middleware-set-session-persist-to-the-store.md +25 -0
- package/knowledge/questions/should-a-scoped-secret-view-throw-from-has-secret-for-a-disallowed-key.md +23 -0
- package/knowledge/questions/should-a-wrong-bearer-token-be-anonymous-or-refused.md +35 -0
- package/knowledge/questions/should-an-empty-webhook-signing-secret-send-unsigned.md +23 -0
- package/knowledge/questions/should-http-virtual-user-sessions-reset-between-scenarios-in-one-run.md +27 -0
- package/knowledge/questions/should-the-cookie-jar-scope-cookies-to-the-api-origin.md +26 -0
- package/knowledge/questions/should-voice-input-fetch-audio-urls-without-a-host-allowlist.md +20 -0
- package/knowledge/questions/staging-impersonation-rules.md +27 -0
- package/knowledge/questions/virtual-user-keys-on-cloud-stages-are-pikku-studios-to-build.md +34 -0
- package/knowledge/questions/virtual-user-statement-replay-is-per-process.md +20 -0
- package/knowledge/questions/what-an-impersonated-session-carries.md +22 -0
- package/package.json +3 -3
- package/src/public-surface.json +43 -47
- package/dist/services/persona-actor-secret.d.ts +0 -38
- package/dist/services/persona-actor-secret.js +0 -39
- package/dist/services/persona-sign-in.d.ts +0 -117
- package/dist/services/persona-sign-in.js +0 -154
- package/dist/wirings/actor-flow/index.d.ts +0 -2
- package/dist/wirings/actor-flow/run-conversation.d.ts +0 -36
- package/dist/wirings/persona/define-personas.d.ts +0 -32
- package/dist/wirings/persona/index.d.ts +0 -23
- package/dist/wirings/persona/index.js +0 -19
- package/knowledge/decisions/internals/actor-flow-conversations-seed-a-hidden-kickoff-message.md +0 -23
- package/knowledge/decisions/internals/actor-flow-verdicts-are-llm-self-evaluations.md +0 -25
- package/knowledge/decisions/internals/validate-checks-personas-through-a-shared-module.md +0 -43
- package/knowledge/decisions/security/actor-sign-in-only-works-for-actor-flagged-users.md +0 -31
- package/knowledge/decisions/security/an-actor-credential-is-derived-per-persona.md +0 -42
- package/knowledge/decisions/security/pikku-carries-actor-scopes-as-data-and-the-app-grants-them.md +0 -26
- /package/dist/wirings/{actor-flow/actor-flow.types.js → virtual-user/conversation/conversation.types.js} +0 -0
- /package/dist/wirings/{actor-flow → virtual-user/conversation}/index.js +0 -0
- /package/dist/wirings/{persona/persona.types.js → virtual-user/virtual-user-declaration.types.js} +0 -0
- /package/dist/wirings/{persona/persona-mailbox.js → virtual-user/virtual-user-mailbox.js} +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type { ScenarioHttpResponse } from '../../services/
|
|
2
|
-
import type {
|
|
1
|
+
import type { ScenarioHttpResponse } from '../../services/virtual-users-service.js';
|
|
2
|
+
import type { ConversationVerdict } from './conversation/conversation.types.js';
|
|
3
3
|
/**
|
|
4
4
|
* How a virtual user behaves, mechanically. A disposition changes the loop, the
|
|
5
5
|
* input generation, the memory and the oracle — anything that only changes how
|
|
6
|
-
* the user *talks* is
|
|
6
|
+
* the user *talks* is virtual user prose (`ResolvedVirtualUser.personality`) and does
|
|
7
7
|
* not belong here.
|
|
8
8
|
*
|
|
9
9
|
* - `realistic` — schema-first, goal-directed, plausible values (default).
|
|
@@ -17,11 +17,11 @@ import type { ActorFlowVerdict } from '../actor-flow/actor-flow.types.js';
|
|
|
17
17
|
* `accountable` sits opposite `adversarial` on an *intent* axis — bad faith
|
|
18
18
|
* against good faith — where `careless` and `thorough` are a *care* axis. It is
|
|
19
19
|
* the one disposition whose actions carry consequences: no oracle, no rollback,
|
|
20
|
-
* and every call attributed to the
|
|
20
|
+
* and every call attributed to the virtual user in the audit log like anyone else's.
|
|
21
21
|
*/
|
|
22
22
|
export type VirtualUserDisposition = 'realistic' | 'careless' | 'newcomer' | 'stale' | 'auditor' | 'adversarial' | 'accountable';
|
|
23
23
|
/**
|
|
24
|
-
* The one disposition a production environment
|
|
24
|
+
* The one disposition a declaration may name for a production environment. Virtual users never run against production, so this only keeps the declaration check honest.
|
|
25
25
|
*
|
|
26
26
|
* Every other disposition exists to find out what the product does wrong, which
|
|
27
27
|
* is not a thing to do to real customers' data. Named here so the declaration
|
|
@@ -79,7 +79,7 @@ export interface ApiCatalogueEntry {
|
|
|
79
79
|
/**
|
|
80
80
|
* Scopes the session must hold to call this, all of them.
|
|
81
81
|
*
|
|
82
|
-
* Splits the catalogue in two: what a
|
|
82
|
+
* Splits the catalogue in two: what a virtual user's roles entitle it to reach,
|
|
83
83
|
* and what they do not. Scopes rather than permission-function names because
|
|
84
84
|
* a scope is declared and checkable, whereas a permission is arbitrary code
|
|
85
85
|
* whose verdict nobody can predict without running it.
|
|
@@ -105,8 +105,8 @@ export interface IntentSource {
|
|
|
105
105
|
/** Step prose, as a person would be told it. Never rpc names. */
|
|
106
106
|
steps?: readonly string[];
|
|
107
107
|
tags?: readonly string[];
|
|
108
|
-
/**
|
|
109
|
-
|
|
108
|
+
/** Virtual user ids this intent is available to. Empty means everyone. */
|
|
109
|
+
virtualUsers?: readonly string[];
|
|
110
110
|
}
|
|
111
111
|
/** Why the engine flagged something. */
|
|
112
112
|
export type VirtualUserFindingKind = 'server-error' | 'transport-error' | 'schema-violation' | 'unexpected-success' | 'custom';
|
|
@@ -122,14 +122,14 @@ export interface VirtualUserFinding {
|
|
|
122
122
|
}
|
|
123
123
|
/**
|
|
124
124
|
* The transport the virtual user acts through. HTTP in production (an
|
|
125
|
-
* `
|
|
125
|
+
* `HttpVirtualUser`), but the engine only sees this contract — which is what
|
|
126
126
|
* lets the whole loop be tested without a network.
|
|
127
127
|
*/
|
|
128
128
|
export interface VirtualUserTarget {
|
|
129
129
|
/** Invoke an RPC as this user, reporting the status as data rather than throwing. */
|
|
130
130
|
call(rpcName: string, args: unknown): Promise<ScenarioHttpResponse>;
|
|
131
|
-
/** Converse with an AI agent in
|
|
132
|
-
talkTo?(agent: string, task: string): Promise<
|
|
131
|
+
/** Converse with an AI agent in virtual user. Omitted by apps that have no agents. */
|
|
132
|
+
talkTo?(agent: string, task: string): Promise<ConversationVerdict>;
|
|
133
133
|
/** Send a fixture file. Omitted by apps with no upload surface. */
|
|
134
134
|
upload?(file: string): Promise<ScenarioHttpResponse>;
|
|
135
135
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The one disposition a production environment
|
|
2
|
+
* The one disposition a declaration may name for a production environment. Virtual users never run against production, so this only keeps the declaration check honest.
|
|
3
3
|
*
|
|
4
4
|
* Every other disposition exists to find out what the product does wrong, which
|
|
5
5
|
* is not a thing to do to real customers' data. Named here so the declaration
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import type { StandardSchemaV1 } from '@standard-schema/spec';
|
|
6
6
|
import type { SerializedError } from '../../../errors/serialized-error.js';
|
|
7
7
|
import type { WorkflowRun } from '../workflow.types.js';
|
|
8
|
-
import type {
|
|
8
|
+
import type { ScenarioVirtualUser } from '../../../services/virtual-users-service.js';
|
|
9
9
|
import type { ScenarioStepOptions, ScenarioStepPhase, ScenarioSurface } from '../scenario-step.types.js';
|
|
10
10
|
/**
|
|
11
11
|
* Workflow step options
|
|
@@ -24,12 +24,12 @@ export interface WorkflowStepOptions {
|
|
|
24
24
|
*/
|
|
25
25
|
compensate?: false;
|
|
26
26
|
/**
|
|
27
|
-
* Run this step as
|
|
28
|
-
*
|
|
27
|
+
* Run this step as a virtual user (scenarios). The RPC is sent through the
|
|
28
|
+
* virtual user's authenticated client over the REAL transport — never dispatched
|
|
29
29
|
* internally — so auth middleware and permissions are exercised end-to-end.
|
|
30
30
|
* The step is recorded durably like any RPC step.
|
|
31
31
|
*/
|
|
32
|
-
|
|
32
|
+
virtualUser?: ScenarioVirtualUser;
|
|
33
33
|
}
|
|
34
34
|
/**
|
|
35
35
|
* Options for workflow.expectEventually() — a durable polling step used by
|
|
@@ -240,8 +240,8 @@ export interface RpcStepMeta {
|
|
|
240
240
|
inputs?: Record<string, InputSource> | 'passthrough';
|
|
241
241
|
/** Step options */
|
|
242
242
|
options?: WorkflowStepOptions;
|
|
243
|
-
/** Scenario
|
|
244
|
-
|
|
243
|
+
/** Scenario virtual user name this step runs as ({ virtualUser: virtualUsers.x }) */
|
|
244
|
+
virtualUser?: string;
|
|
245
245
|
/** True for workflow.expectEventually polling steps */
|
|
246
246
|
expectEventually?: boolean;
|
|
247
247
|
}
|
|
@@ -267,8 +267,8 @@ export interface ScenarioStepMeta {
|
|
|
267
267
|
inputs?: Record<string, InputSource> | 'passthrough';
|
|
268
268
|
/** Step options */
|
|
269
269
|
options?: WorkflowStepOptions;
|
|
270
|
-
/** Scenario
|
|
271
|
-
|
|
270
|
+
/** Scenario virtual user name this step runs as ({ virtualUser: virtualUsers.x }) */
|
|
271
|
+
virtualUser?: string;
|
|
272
272
|
/** Mirrors the surfaces the step function declares a binding for */
|
|
273
273
|
surfaces?: ScenarioSurface[];
|
|
274
274
|
}
|
|
@@ -595,7 +595,7 @@ export interface PikkuScenarioWire<Out = unknown> extends PikkuWorkflowWire {
|
|
|
595
595
|
*/
|
|
596
596
|
context: ScenarioContext<Out>;
|
|
597
597
|
/**
|
|
598
|
-
* Durable polling step: invoke `rpcName` (as
|
|
598
|
+
* Durable polling step: invoke `rpcName` (as a virtual user when `options.virtualUser`
|
|
599
599
|
* is set) until `predicate` passes or `options.within` elapses.
|
|
600
600
|
*/
|
|
601
601
|
expectEventually: <TOutput = any, TInput = any>(stepName: string, rpcName: string, data: TInput, predicate: (output: TOutput) => boolean, options?: WorkflowExpectEventuallyOptions) => Promise<TOutput>;
|
|
@@ -2,7 +2,7 @@ import { PikkuError } from '../../errors/error-handler.js';
|
|
|
2
2
|
import { InMemoryWorkflowService } from '../../services/in-memory-workflow-service.js';
|
|
3
3
|
import type { RunLifecycleContext, WorkflowRunEngine, WorkflowRunExtension } from './workflow-run-engine.types.js';
|
|
4
4
|
import type { PikkuRawWire } from '../../types/core.types.js';
|
|
5
|
-
import type {
|
|
5
|
+
import type { ScenarioVirtualUsers } from '../../services/virtual-users-service.js';
|
|
6
6
|
import type { ScenarioStepVideoOffset } from './scenario-run.types.js';
|
|
7
7
|
import type { ScenarioBrowserProvider, ScenarioEnvironment, ScenarioSurface } from './scenario-step.types.js';
|
|
8
8
|
import type { PikkuWorkflowWire, WorkflowQueueOptions } from './workflow.types.js';
|
|
@@ -12,11 +12,11 @@ export type { ScenarioArtifact, ScenarioFailureDetail, ScenarioResult, ScenarioR
|
|
|
12
12
|
export { SCENARIO_SURFACES } from './scenario-step.types.js';
|
|
13
13
|
export { resolveScenarioSurfaces } from './scenario-surface.js';
|
|
14
14
|
export { pollUntil, type PollOptions } from './scenario-poll.js';
|
|
15
|
-
export { createCookieJar } from '
|
|
16
|
-
export type { ScenarioCookieJar } from '
|
|
15
|
+
export { createCookieJar } from '../../services/scenario-cookie-jar.js';
|
|
16
|
+
export type { ScenarioCookieJar } from '../../services/scenario-cookie-jar.js';
|
|
17
17
|
export { composeStepProse, renderStepTemplate } from './scenario-prose.js';
|
|
18
18
|
export { requireScenarioEnv } from './scenario-step-guards.js';
|
|
19
|
-
export type { ScenarioHttpResponse, ScenarioJsonRequest, } from '../../services/
|
|
19
|
+
export type { ScenarioHttpResponse, ScenarioJsonRequest, } from '../../services/virtual-users-service.js';
|
|
20
20
|
/**
|
|
21
21
|
* A workflow service with the scenario capability attached — the two lines
|
|
22
22
|
* `pikku scenario run` needs, in one call so no caller has to remember that the
|
|
@@ -44,7 +44,7 @@ export declare class ScenarioHookError extends PikkuError {
|
|
|
44
44
|
* Two witnesses of the same `then` disagreed.
|
|
45
45
|
*
|
|
46
46
|
* This is the failure the whole additive-witness design exists to produce: the
|
|
47
|
-
* system of record is right and the surface the
|
|
47
|
+
* system of record is right and the surface the virtual user was looking at is not, or
|
|
48
48
|
* the other way round. Both observations go in the message, because either one
|
|
49
49
|
* alone reads as a passing assertion.
|
|
50
50
|
*/
|
|
@@ -74,14 +74,14 @@ export declare class ScenarioBrowserUnavailable extends PikkuError {
|
|
|
74
74
|
constructor(stepFunc: string);
|
|
75
75
|
}
|
|
76
76
|
/**
|
|
77
|
-
* A step that is driven by a
|
|
77
|
+
* A step that is driven by a virtual user was dispatched without one.
|
|
78
78
|
*
|
|
79
79
|
* Raised before the body runs rather than partway through it: the step declared
|
|
80
|
-
* that it needs
|
|
81
|
-
* provisioned without a window to open, or by `
|
|
80
|
+
* that it needs a virtual user — by having a `browser` binding, which cannot be
|
|
81
|
+
* provisioned without a window to open, or by `virtualUser: true` — so a call site
|
|
82
82
|
* that omits one is a mistake at the call site.
|
|
83
83
|
*/
|
|
84
|
-
export declare class
|
|
84
|
+
export declare class ScenarioVirtualUserRequired extends PikkuError {
|
|
85
85
|
readonly stepFunc: string;
|
|
86
86
|
constructor(stepFunc: string);
|
|
87
87
|
}
|
|
@@ -122,7 +122,7 @@ export declare class ScenarioNoWitness extends PikkuError {
|
|
|
122
122
|
* An assertion ran, but not on the surface the run targets.
|
|
123
123
|
*
|
|
124
124
|
* The sibling of {@link ScenarioNoWitness}: that one checked nothing anywhere,
|
|
125
|
-
* this one checked the system of record while the prose claims the
|
|
125
|
+
* this one checked the system of record while the prose claims the virtual user saw it
|
|
126
126
|
* on the page. Ordinary runs count it as a coverage gap; a strict run refuses
|
|
127
127
|
* it, because a flow that cannot be observed end to end on the run surface is
|
|
128
128
|
* not a flow that surface can be documented from.
|
|
@@ -138,7 +138,7 @@ export declare class ScenarioUnwitnessedAssertion extends PikkuError {
|
|
|
138
138
|
* The scenario capability, layered onto a workflow service rather than being
|
|
139
139
|
* one.
|
|
140
140
|
*
|
|
141
|
-
* Every scenario affordance — steps,
|
|
141
|
+
* Every scenario affordance — steps, virtual users, lifecycle hooks, the browser
|
|
142
142
|
* provider, the assertion wire members — lives here rather than on
|
|
143
143
|
* `PikkuWorkflowService`, because a bundler drops an unused *module* but never
|
|
144
144
|
* an unused class member: anything declared on the workflow service ships in
|
|
@@ -160,7 +160,7 @@ export declare class ScenarioUnwitnessedAssertion extends PikkuError {
|
|
|
160
160
|
*/
|
|
161
161
|
export declare class PikkuScenarioService implements WorkflowRunExtension {
|
|
162
162
|
private readonly engine;
|
|
163
|
-
private
|
|
163
|
+
private runVirtualUsers;
|
|
164
164
|
private runContexts;
|
|
165
165
|
private runVideoOffsets;
|
|
166
166
|
private scenarioBrowserProvider?;
|
|
@@ -169,7 +169,7 @@ export declare class PikkuScenarioService implements WorkflowRunExtension {
|
|
|
169
169
|
private strictSurface;
|
|
170
170
|
constructor(engine: WorkflowRunEngine);
|
|
171
171
|
/**
|
|
172
|
-
* The surface every
|
|
172
|
+
* The surface every virtual user drives the system through for this run, set once by
|
|
173
173
|
* the runner from `--run`. `default` is the server-side path — the fast suite.
|
|
174
174
|
*
|
|
175
175
|
* `strict` removes both routes off that surface: an action may not fall back
|
|
@@ -196,7 +196,7 @@ export declare class PikkuScenarioService implements WorkflowRunExtension {
|
|
|
196
196
|
setScenarioEnvironment(env: ScenarioEnvironment | undefined): void;
|
|
197
197
|
getScenarioEnvironment(): ScenarioEnvironment | undefined;
|
|
198
198
|
/**
|
|
199
|
-
* Where each of a run's browser steps fell in its
|
|
199
|
+
* Where each of a run's browser steps fell in its virtual user's video, keyed by the
|
|
200
200
|
* durable step name, handed over and forgotten in one call.
|
|
201
201
|
*
|
|
202
202
|
* Taken rather than read because the runner joins these onto the step rows
|
|
@@ -204,18 +204,18 @@ export declare class PikkuScenarioService implements WorkflowRunExtension {
|
|
|
204
204
|
* clear them, and the only moment they are still wanted.
|
|
205
205
|
*/
|
|
206
206
|
takeStepVideoOffsets(runId: string): Map<string, ScenarioStepVideoOffset[]>;
|
|
207
|
-
/** Where a step starting now falls in this
|
|
207
|
+
/** Where a step starting now falls in this virtual user's recording, if anywhere. */
|
|
208
208
|
private videoOffsetFor;
|
|
209
209
|
/**
|
|
210
|
-
* Stamp where a step began inside one
|
|
210
|
+
* Stamp where a step began inside one virtual user's recording.
|
|
211
211
|
*
|
|
212
|
-
* First write per
|
|
212
|
+
* First write per virtual user wins: a `then` step runs once per witness, and the
|
|
213
213
|
* moment the reader wants is when the sentence started, not when its last
|
|
214
214
|
* witness got around to the browser.
|
|
215
215
|
*/
|
|
216
216
|
private recordVideoOffset;
|
|
217
217
|
attachRunContext(runId: string, workflowMeta: any, options?: {
|
|
218
|
-
|
|
218
|
+
virtualUsers?: ScenarioVirtualUsers;
|
|
219
219
|
}): Promise<void>;
|
|
220
220
|
detachRunContext(runId: string): void;
|
|
221
221
|
/**
|
|
@@ -249,20 +249,20 @@ export declare class PikkuScenarioService implements WorkflowRunExtension {
|
|
|
249
249
|
*
|
|
250
250
|
* A hook is not a pikku function: it has no id, no meta and no schema, so it
|
|
251
251
|
* cannot go through `runPikkuFunc` and the runner records nothing for it. It
|
|
252
|
-
* gets exactly what the scenario body gets — the same wire (so `
|
|
252
|
+
* gets exactly what the scenario body gets — the same wire (so `virtualUsers` is
|
|
253
253
|
* how it reaches the app), and singleton services composed with this
|
|
254
254
|
* invocation's wire services — and nothing else.
|
|
255
255
|
*/
|
|
256
256
|
private runScenarioHook;
|
|
257
257
|
/**
|
|
258
|
-
* Build HTTP scenario
|
|
259
|
-
*
|
|
258
|
+
* Build HTTP scenario virtual users for a run started without them; undefined when
|
|
259
|
+
* the app has no auth service or the API URL is missing.
|
|
260
260
|
*
|
|
261
|
-
* The
|
|
262
|
-
* for the AI
|
|
263
|
-
* signs
|
|
261
|
+
* The virtual user client is imported lazily so that even a runner bundle only pays
|
|
262
|
+
* for the AI virtual user conversation loop it pulls in when a scenario actually
|
|
263
|
+
* signs a virtual user in.
|
|
264
264
|
*/
|
|
265
|
-
|
|
265
|
+
resolveVirtualUsers(): Promise<ScenarioVirtualUsers | undefined>;
|
|
266
266
|
decorateWorkflowWire(wire: PikkuWorkflowWire, context: {
|
|
267
267
|
name: string;
|
|
268
268
|
runId: string;
|
|
@@ -278,8 +278,8 @@ export declare class PikkuScenarioService implements WorkflowRunExtension {
|
|
|
278
278
|
*/
|
|
279
279
|
private declaredSurfaces;
|
|
280
280
|
/**
|
|
281
|
-
* Whether a step is driven by a
|
|
282
|
-
* the definer from a `browser` binding or an explicit `
|
|
281
|
+
* Whether a step is driven by a virtual user, and so must be given one. Stamped by
|
|
282
|
+
* the definer from a `browser` binding or an explicit `virtualUser: true`.
|
|
283
283
|
*/
|
|
284
|
-
private
|
|
284
|
+
private requiresVirtualUser;
|
|
285
285
|
}
|